• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Программирование пространственных кривых.

Автор Flexo, 22.03.12, 19:49:19

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

chelkar

Цитата: Flexo от 05.04.12, 13:02:13
По поводу, записи макросов - у меня, по крайней мере, записывает прямоугольники как 4 отрезка, что не конструктивно.
Это зависит от того где записываем макрос. Если в Чертеже (cdw) то запишется именно ksRectangle.
В 3D-документах КОМПАС сам разбивает прямоугольники на отрезки, при вводе. Поэтому запишится 4-ре отрезка. Тоже самое будет и для многоугольников.
Цитата: Flexo от 05.04.12, 13:02:13
Кроме того, не всегда он(компас-макро) может построить, то, что записал. Например, операция "плоскость перепендикулярно ребру и через точку" записывается, но не "воспроизводится". (Правда, зависит от того как именно строилась, буквально по тому как кликаешь).
Такое бывает, но только в 3D.
Насколько я понимаю суть проблемы в следующем.
При записи, указанный кликом объект ищется по точке. В тексте часто встричается функция  - iCollection.SelectByPoint(0.0, 0.0, -25.0).
Если под эту точку попадет что-то неподходящее, то "плоскость перепендикулярно ребру и через точку" не построится.
Я стараюсь, после записи заменить эту функцию на собственную логику выбора объектов.

Еще есть ограничения на записываемые в макрос объекты. Список объектов есть в справке.

Flexo

Снова, здравствуйте! Как раз по поводу selectbypoint. :o: Подкажите, есть ли более примитивный аналог, чтобы выделить эскиз? Может что-то вроде прямого обращения к объекту скетч, если его как-нибудь индивидуально назвать во время создания.
Конкретная ситуация. Создал прямоугольник, пишу кинематическую операцию.
iPart = iDocument3D.GetPart(LDefin3D.pTop_Part)
iSketch = iPart.NewEntity(LDefin3D.o3d_sketch)
iDefinition = iSketch.GetDefinition()
iCollection = iPart.EntityCollection(LDefin3D.o3d_planePerpendicular)
iCollection.SelectByPoint(x1[0], x2[0], x3[0])
iPlane = iCollection.GetByIndex(0)
iDefinition.SetPlane(iPlane)
iSketch.Create()

iDocument2D = iDefinition.BeginEdit()

iDocument2D.ksPoint(OM[0], OM[1], 0)
iObjParam = KAPI.ksRectangleParam(iKompasObject.GetParamStruct(LDefin2D.ko_RectangleParam))
iObjParam.Init()
iObjParam.x = OM[0]-a/2
iObjParam.y = OM[1]-b/2
iObjParam.ang = 0.0
iObjParam.height = b
iObjParam.width = a
iObjParam.style = 1
iDocument2D.ksRectangle(iObjParam)
iDefinition.EndEdit()




iPart = iDocument3D.GetPart(LDefin3D.pTop_Part)
obj = iPart.NewEntity(LDefin3D.o3d_bossEvolution)
iDefinition = obj.GetDefinition()
iDefinition.sketchShiftType = 1
iCollection = iPart.EntityCollection(LDefin3D.o3d_edge)
iCollection.SelectByPoint(100.17302850910, -1.58818266105, 11.89444244396)
iEdge = iCollection.GetByIndex(0)
iEdgeDefinition = iEdge.GetDefinition()
iSketch = iEdgeDefinition.GetOwnerEntity()
iDefinition.SetSketch(iSketch)
iArray = iDefinition.PathPartArray()
iCollection = iPart.EntityCollection(LDefin3D.o3d_edge)
iCollection.SelectByPoint(x1[0], x2[0], x3[0])
iCurve = iCollection.GetByIndex(0)
iArray.Add(iCurve)

iThinParam = iDefinition.ThinParam()
iThinParam.thin = False
iThinParam.normalThickness = 1.0
iThinParam.reverseThickness = 1.0
iThinParam.thinType = LDefin3D.dtNormal

obj.name = " Кинематическая операция:1"
iColorParam = obj.ColorParam()
iColorParam.ambient = 0.5
iColorParam.color = 9474192
iColorParam.diffuse = 0.6
iColorParam.emission = 0.5
iColorParam.shininess = 0.8
iColorParam.specularity = 0.8
iColorParam.transparency = 1.0

obj.Create()

chelkar

Конечно можно.

Например так.
Создаем эскиз Section

Section= iPart.NewEntity(LDefin3D.o3d_sketch)
iDefinition = Section.GetDefinition()
iCollection = iPart.EntityCollection(LDefin3D.o3d_planePerpendicular)
iCollection.SelectByPoint(x1[0], x2[0], x3[0])
iPlane = iCollection.GetByIndex(0)
iDefinition.SetPlane(iPlane)
Section.Create()

В кинематике достатоxно будет сказать - iDefinition.SetSketch(Section)

И так можно именовать любые объекты.
Нужно только помнить, что жить они будут только в одном сеансе работы КОМПАСа.
Если закрыть и открыть снова - то Section не будет существовать.
Но для построения этого достаточно.

Flexo

15.05.12, 21:16:56 #23 Последнее редактирование: 15.05.12, 21:30:13 от Flexo
Что-то не соображу как именно описать его здесь. Если правильно понимаю, первая половинка отвечает за протаскиваемый эскиз. Куда приткнуть и что из описания нужно убрать? Я попробовал как-то так, но видимо не попал. :o:

iPart = iDocument3D.GetPart(LDefin3D.pTop_Part)
obj = iPart.NewEntity(LDefin3D.o3d_bossEvolution)
iDefinition = obj.GetDefinition()
iDefinition.sketchShiftType = 1    iDefinition.SetSketch(Section)
iCollection = iPart.EntityCollection(LDefin3D.o3d_edge)
#iCollection.SelectByPoint(100.17302850910, -1.58818266105, 11.89444244396)
iEdge = iCollection.GetByIndex(0)
iEdgeDefinition = iEdge.GetDefinition()






вот так заработало:
iPart = iDocument3D.GetPart(LDefin3D.pTop_Part)
obj = iPart.NewEntity(LDefin3D.o3d_bossEvolution)
iDefinition = obj.GetDefinition()
iDefinition.sketchShiftType = 1
iDefinition.SetSketch(Section)
iCollection = iPart.EntityCollection(LDefin3D.o3d_edge)

#iCollection.SelectByPoint(100.17302850910, -1.58818266105, 11.89444244396)

iEdge = iCollection.GetByIndex(0)
iEdgeDefinition = iEdge.GetDefinition()
iSketch = iEdgeDefinition.GetOwnerEntity()
iDefinition.SetSketch(iSketch)
iArray = iDefinition.PathPartArray()
iCollection = iPart.EntityCollection(LDefin3D.o3d_edge)
iCollection.SelectByPoint(x1[0], x2[0], x3[0])
iCurve = iCollection.GetByIndex(0)
iArray.Add(iCurve)

Но, пишет "ошибка определения эскиза", ещё какая-то лишняя строчка есть?


chelkar

Так заработало или ошибка ?  :)
Положите весь макрос сюда, если не жалко, с комментариями по тексту что хотите получить.
Посмотрю.

Flexo

"ошибка определения эскиза" всплывает после того как все строится. :~

Эта строчка лишняя iDefinition.SetSketch(iSketch), тем более, что iSketch является ребром.
Вы уже определили эскиз, данной строкой iDefinition.SetSketch(Section).

chelkar

Про ошибку уже написали выше.
В целом, макрос можно подсократить.
Закомментарил "лишнее". Пояснения вставил с комментарием "# --- текст"

Flexo

Спасибо, огромное!!!  Сейчас буду смотреть и разбираться. :o:

Flexo

Здравствуйте, выкладываю результат. Деталь с комбинированным сечением. На сверхгениальный проект не тянет, но было очень интересно! Спасибо всем, кто участвовал!
Компас очень долго(около минуты) думает над второй кинематической операцией по неизвестным мне причинам, но строит.

chelkar

Попрообовал, работает.
Поздравляю с первым успехом!

Почему медленно делается последняя операция? А потому что проходит объединение результатов. А кинематика довольно сложная операция.
Быстро можно сделать через новое тело.
Добавьте в последнюю операцию, перед заданием цвета, вот такие строчки
---
ChooseBodies = iDefinition.ChooseBodies ()
ChooseBodies.ChooseBodiesType = 0 # новое тело
---
и все полетит  :o:

Ханиган

Ребят, как запустить ваши вышеперечисленные скрипты??? Объясните пожалуйста!

Создаёте пустую 3D модель, подключаете библиотеку Компас-Макро и далее см. рис.