10/10/2013
Копирование тела из одного компонента в другой
Вопрос:Пример “Associative body copy API Sample” из Inventor API Help работает некорректно в случае создания не ассоциативной копии твердого тела, а именно, тело-копия неправильно позиционируется.
Ответ:
Действительно, проблема в том, что преобразование координат, связанное с компонентом в сборке, не учитывается во время копирования объекта SurfaceBodyProxy. Ниже приводится обновленная версия исходного примера, в которой эта проблема учтена.
Код - VB.NET: [Выделить]
- Sub AssociativeBodyCopy()
- ' ссылка на активную сборку
- Dim asmDoc As AssemblyDocument
- Set asmDoc = ThisApplication.ActiveDocument
- Dim asmDef As AssemblyComponentDefinition
- Set asmDef = asmDoc.ComponentDefinition
- ' Выделение тела для копирования. Получим прокси-объект,
- ' поскольку выделение выполняется в контексте сборки.
- Dim sourceBody As SurfaceBodyProxy
- Set sourceBody = ThisApplication.CommandManager.Pick( _
- kPartBodyFilter, _
- "Select a body to copy.")
- ' Выделение целевого компонента, в который будем копировать тело
- Dim targetOcc As ComponentOccurrence
- Set targetOcc = ThisApplication.CommandManager.Pick( _
- kAssemblyLeafOccurrenceFilter, _
- "Select an occurrence to copy the body into.")
- Dim targetDef As PartComponentDefinition
- Set targetDef = targetOcc.Definition
- ' создание определения непараметрического базового конструктивного
- ' элемента. Служит для настройки его свойств.
- Dim nonPrmFeatures As NonParametricBaseFeatures
- Set nonPrmFeatures = targetDef.Features.NonParametricBaseFeatures
- Dim featureDef As NonParametricBaseFeatureDefinition
- Set featureDef = nonPrmFeatures.CreateDefinition
- Dim transObjs As TransientObjects
- Set transObjs = ThisApplication.TransientObjects
- Dim col As ObjectCollection
- ' Запросим у юзера вариант копирования тела -
- ' ассоциативное или нет?
- Dim answer As VbMsgBoxResult
- vbCrLf & vbCrLf & _
- " Yes - Ассоциативная поверхность" & vbCrLf & _
- " No – Не ассоциативное твердое тело", vbYesNoCancel)
- If answer = vbYes Then
- ' Коллекция с геометрией, которую предстоит копировать.
- ' В данном случае, это одно выделенное тело SurfaceBody.
- Set col = transObjs.CreateObjectCollection
- col.Add sourceBody
- ' Создание ассоциативной копии модели. В этом случае
- ' Inventor поддерживает создание лишь поверхностного
- ' тела, но не солида.
- featureDef.BRepEntities = col
- featureDef.OutputType = kSurfaceOutputType
- featureDef.TargetOccurrence = targetOcc
- featureDef.IsAssociative = True
- Dim baseFeature As NonParametricBaseFeature
- Set baseFeature = nonPrmFeatures.AddByDefinition(featureDef)
- ElseIf answer = vbNo Then
- ' Выделенное тело является прокси-объектом тела в контексте сборки.
- ' Однако, Метод TransientBrep.Copy при создании копии тела
- ' игнорирует связанную с ним матрицу преобразования.
- ' Приведенный далее код сначала создает копию тела,
- ' а затем вводит поправку на его исходную ориентацию.
- Dim newBody As SurfaceBody
- Set newBody = ThisApplication.TransientBRep.Copy(sourceBody)
- Call ThisApplication.TransientBRep.Transform(newBody, _
- sourceBody.ContainingOccurrence.Transformation)
- ' Ориентирование тела newBody в системе координат
- ' целевого компонента targetOcc
- Dim trans As Matrix
- Set trans = targetOcc.Transformation
- trans.Invert
- Call ThisApplication.TransientBRep.Transform(newBody, trans)
- Set col = transObjs.CreateObjectCollection
- col.Add newBody
- ' Создание неассоциативной копии солида.
- featureDef.BRepEntities = col
- featureDef.OutputType = kSolidOutputType
- featureDef.TargetOccurrence = targetOcc
- featureDef.IsAssociative = False
- Set baseFeature = nonPrmFeatures.AddByDefinition(featureDef)
- End If
- End Sub
Обсуждение: http://adn-cis.org/forum/index.php?topic=242
Опубликовано 10.10.2013Отредактировано 10.10.2013 в 01:20:39