ADN Open CIS
Сообщество программистов Autodesk в СНГ

10/10/2013

Копирование тела из одного компонента в другой

Вопрос:
Пример “Associative body copy API Sample” из Inventor API Help работает некорректно в случае создания не ассоциативной копии твердого тела, а именно, тело-копия неправильно позиционируется.

Ответ:
Действительно, проблема в том, что преобразование координат, связанное с компонентом в сборке, не учитывается во время копирования объекта SurfaceBodyProxy.  Ниже приводится обновленная версия исходного примера, в которой эта проблема учтена.

Код - VB.NET: [Выделить]
  1. Sub AssociativeBodyCopy() 
  2.  
  3.     ' ссылка на активную сборку 
  4.     Dim asmDoc As AssemblyDocument 
  5.     Set asmDoc = ThisApplication.ActiveDocument 
  6.     Dim asmDef As AssemblyComponentDefinition 
  7.     Set asmDef = asmDoc.ComponentDefinition 
  8.  
  9.     ' Выделение тела для копирования.  Получим прокси-объект,
  10.    ' поскольку выделение выполняется в контексте сборки.
  11.     Dim sourceBody As SurfaceBodyProxy 
  12.     Set sourceBody = ThisApplication.CommandManager.Pick(
  13.                                 kPartBodyFilter, _ 
  14.                                 "Select a body to copy.") 
  15.     
  16.     ' Выделение целевого компонента, в который будем копировать тело
  17.     Dim targetOcc As ComponentOccurrence 
  18.     Set targetOcc = ThisApplication.CommandManager.Pick( _  
  19.                     kAssemblyLeafOccurrenceFilter, _  
  20.                     "Select an occurrence to copy the body into.") 
  21.     Dim targetDef As PartComponentDefinition 
  22.     Set targetDef = targetOcc.Definition 
  23.    
  24.     ' создание определения непараметрического базового конструктивного
  25.    ' элемента. Служит для настройки его свойств.
  26.     Dim nonPrmFeatures As NonParametricBaseFeatures 
  27.     Set nonPrmFeatures = targetDef.Features.NonParametricBaseFeatures 
  28.     Dim featureDef As NonParametricBaseFeatureDefinition 
  29.     Set featureDef = nonPrmFeatures.CreateDefinition  
  30.     Dim transObjs As TransientObjects  
  31.     Set transObjs = ThisApplication.TransientObjects  
  32.     Dim col As ObjectCollection 
  33.  
  34.  
  35.    ' Запросим у юзера вариант копирования тела - 
  36.    ' ассоциативное или нет? 
  37.     Dim answer As VbMsgBoxResult 
  38.     answer = MsgBox("Укажите вариант копирования тела." &
  39.                     vbCrLf & vbCrLf &
  40.                     "   Yes - Ассоциативная поверхность" & vbCrLf &
  41.                     "   No – Не ассоциативное твердое тело", vbYesNoCancel)
  42.    
  43.     If answer = vbYes Then 
  44.         ' Коллекция с геометрией, которую предстоит копировать.
  45.         ' В данном случае, это одно выделенное тело SurfaceBody.
  46.         Set col = transObjs.CreateObjectCollection 
  47.         col.Add sourceBody 
  48.         
  49.         ' Создание ассоциативной копии модели.  В этом случае
  50.         ' Inventor поддерживает создание лишь поверхностного
  51.         ' тела, но не солида.
  52.         featureDef.BRepEntities = col 
  53.         featureDef.OutputType = kSurfaceOutputType 
  54.         featureDef.TargetOccurrence = targetOcc 
  55.         featureDef.IsAssociative = True 
  56.     
  57.         Dim baseFeature As NonParametricBaseFeature 
  58.         Set baseFeature = nonPrmFeatures.AddByDefinition(featureDef) 
  59.  
  60.     ElseIf answer = vbNo Then 
  61.  
  62.         ' Выделенное тело является прокси-объектом тела в контексте сборки.
  63.         ' Однако, Метод TransientBrep.Copy при создании копии тела
  64.         ' игнорирует связанную с ним матрицу преобразования. 
  65.         ' Приведенный далее код сначала создает копию тела,
  66.         ' а затем вводит поправку на его исходную ориентацию.
  67.         Dim newBody As SurfaceBody 
  68.         Set newBody = ThisApplication.TransientBRep.Copy(sourceBody) 
  69.         Call ThisApplication.TransientBRep.Transform(newBody, _ 
  70.              sourceBody.ContainingOccurrence.Transformation) 
  71.         
  72.         ' Ориентирование тела newBody в системе координат
  73.         ' целевого компонента targetOcc
  74.         Dim trans As Matrix 
  75.         Set trans = targetOcc.Transformation 
  76.         trans.Invert 
  77.         Call ThisApplication.TransientBRep.Transform(newBody, trans)  
  78.          
  79.         Set col = transObjs.CreateObjectCollection 
  80.         col.Add newBody 
  81.         
  82.         ' Создание неассоциативной копии солида.
  83.         featureDef.BRepEntities = col  
  84.         featureDef.OutputType = kSolidOutputType 
  85.         featureDef.TargetOccurrence = targetOcc 
  86.         featureDef.IsAssociative = False 
  87.     
  88.         Set baseFeature = nonPrmFeatures.AddByDefinition(featureDef) 
  89.     End If 
  90.  
  91. End Sub

 

Источник: http://adndevblog.typepad.com/manufacturing/2013/09/copying-a-body-from-one-part-into-another-part.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=242

Опубликовано 10.10.2013
Отредактировано 10.10.2013 в 01:20:39