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

ADN Club => Inventor API => Тема начата: Elfilagas от 13-11-2018, 09:25:36

Название: Перенос геометрии из сборки в деталь
Отправлено: Elfilagas от 13-11-2018, 09:25:36
Добрый день,
Пытаюсь перенести геометрию из сборки в деталь, но все точки смещаются на равное расстояние при переносе, как понимаю нужно при переносе использовать TransformBy, но какую матрицу использовать при таком переносе?
В качестве примера:
Код - vb.net [Выбрать]
  1. For Each wPoint As WorkPoint In assDocDef.WorkPoints
  2.       If InStr(wPoint.Name, "Точка сварки") > 0 Then
  3.              Dim trPoint As Inventor.Point = InvApp.TransientGeometry.CreatePoint(wPoint.Point.X, wPoint.Point.Y, wPoint.Point.Z)
  4.              trPoint.TransformBy(???)
  5.              Dim partWP As WorkPoint = oPartCompDef.WorkPoints.AddFixed(trPoint)
  6.       End If
  7. Next
Название: Re: Перенос геометрии из сборки в деталь
Отправлено: mikazakov от 14-11-2018, 07:28:10
Ну вообщем вам нужно вспоминать векторную алгебру :), здесь получается векторная разность между радиус-вектором точки в сборке и радиус-вектором системы координат детали.
 
Создайте в сборке одну деталь и одну рабочую точку в самой сборке,
в объектеinsidePoint из макроса будут координаты этой точки относительно.

Код - Visual Basic [Выбрать]
  1. Sub DemotePoint()
  2. Dim asDoc As AssemblyDocument: Set asDoc = ThisApplication.ActiveDocument
  3.  
  4. Dim wp As WorkPoint: Set wp = asDoc.ComponentDefinition.WorkPoints(2)
  5. Dim pointVec As Vector: Set pointVec = ThisApplication.TransientGeometry.CreateVector(wp.Point.X, wp.Point.Y, wp.Point.Z)
  6.  
  7. Dim occur As ComponentOccurrence: Set occur = asDoc.ComponentDefinition.Occurrences(1)
  8. Dim relVec As Vector: Set relVec = ThisApplication.TransientGeometry.CreateVector(occur.Transformation.Translation.X, occur.Transformation.Translation.Y, occur.Transformation.Translation.Z)
  9.  
  10. Dim subVec As Vector: Set subVec = ThisApplication.TransientGeometry.CreateVector(pointVec.X - relVec.X, pointVec.Y - relVec.Y, pointVec.Z - relVec.Z)
  11.  
  12. Dim insidePoint As Point: Set insidePoint = ThisApplication.TransientGeometry.CreatePoint
  13. Call insidePoint.TranslateBy(subVec)
  14.  
  15. End Sub
  16.  
  17.  
Название: Re: Перенос геометрии из сборки в деталь
Отправлено: mikazakov от 14-11-2018, 07:33:19
Да и в объекте PlanarSketch есть функция
SketchToModelSpace
может пригодится
Название: Re: Перенос геометрии из сборки в деталь
Отправлено: Elfilagas от 14-11-2018, 10:29:13
Большое спасибо, с переносом все оказалось немного сложнее чем я думал. )
Название: Re: Перенос геометрии из сборки в деталь
Отправлено: Elfilagas от 14-11-2018, 10:57:25
А есть ли обратная функция? Т.е. проекции 3D точки на эскиз. Или нужно как то определять ориентацию плоскости эскиза и переносить по координатам?
Название: Re: Перенос геометрии из сборки в деталь
Отправлено: mikazakov от 14-11-2018, 11:03:41
вроде как есть
PlanarSketch.ModelToSketchSpace
Название: Re: Перенос геометрии из сборки в деталь
Отправлено: Elfilagas от 14-11-2018, 11:36:37
Вот видел же эту функцию, но почему то не проверил что она делает. Уже нашел нормаль к плоскости эскиза и пытался проецировать по этому вектору точку. А по описанию эта функция все это как раз и делает в одну строку. ) Еще раз спасибо.
Название: Re: Перенос геометрии из сборки в деталь
Отправлено: Elfilagas от 16-11-2018, 11:00:06
Столкнулся с проблемой. Если деталь ориентирована в другой плоскости, то точки на деталь переносятся относительно ориентации сборки. Пример во вложении, если переносить точки разметки как из общей сборки, так и из подсборки на деталь, они проецируются не туда.
Название: Re: Перенос геометрии из сборки в деталь
Отправлено: mikazakov от 17-11-2018, 08:48:08
А каким способом то точки "переносятся"?
Название: Re: Перенос геометрии из сборки в деталь
Отправлено: Elfilagas от 19-11-2018, 08:46:54
Вот так переношу:
Код - vb.net [Выбрать]
  1. Dim assDoc As AssemblyDocument = InvApp.ActiveDocument
  2. Dim assDocDef As AssemblyComponentDefinition = assDoc.ComponentDefinition
  3. Dim oFace As FaceProxy = InvApp.CommandManager.Pick(SelectionFilterEnum.kPartFaceFilter, "Выберите плоскость для нанесения разметки")
  4. Dim oPartOcc As ComponentOccurrence = oFace.ContainingOccurrence
  5. Dim oPartCompDef As PartComponentDefinition = oPartOcc.Definition
  6. For Each wPoint As WorkPoint In assDocDef.WorkPoints
  7.       If InStr(wPoint.Name, "Точка разметки") > 0 Then
  8.             Dim vecPoint As Vector = InvApp.TransientGeometry.CreateVector(wPoint.Point.X, wPoint.Point.Y, wPoint.Point.Z)
  9.             Dim vecRel As Vector = InvApp.TransientGeometry.CreateVector(oPartOcc.Transformation.Translation.X, oPartOcc.Transformation.Translation.Y, oPartOcc.Transformation.Translation.Z)
  10.             Dim vecSub As Vector = InvApp.TransientGeometry.CreateVector(vecPoint.X - vecRel.X, vecPoint.Y - vecRel.Y, vecPoint.Z - vecRel.Z)
  11.             Dim partPoint As Inventor.Point = InvApp.TransientGeometry.CreatePoint
  12.             partPoint.TranslateBy(vecSub)
  13.             oPartCompDef.WorkPoints.AddFixed(partPoint)
  14.       End If
  15. Next
Проблема при переносе на "Part11".
Название: Re: Перенос геометрии из сборки в деталь
Отправлено: mikazakov от 19-11-2018, 21:18:50
Ну вообщем посмотрел.
Могу сказать следующее, этот алгоритм вычитания векторов, я предложил как пример для одной детали в сборке.
Это не универсальный алгоритм и понятное дело, что начала систем координат всех вложенных подсборок могут быть сдвинуты относительно верхней сборки. Поэтому и получается чушь. Все это нужно учитывать "пробегая" по сборочным вложенностям от верхней открытой сборки до детали.
Это конечно не просто.
Как доступ к техподдержке починят, я спрошу у них может есть более короткий путь.
Название: Re: Перенос геометрии из сборки в деталь
Отправлено: Elfilagas от 20-11-2018, 08:25:54
Спасибо, дайте знать если что то ответят.
Название: Re: Перенос геометрии из сборки в деталь
Отправлено: Elfilagas от 21-11-2018, 09:37:40
Получилось перенести через обратную матрицу детали:
Код - vb.net [Выбрать]
  1. Dim assDoc As AssemblyDocument = InvApp.ActiveDocument
  2. Dim assDocDef As AssemblyComponentDefinition = assDoc.ComponentDefinition
  3. Dim oFace As FaceProxy = InvApp.CommandManager.Pick(SelectionFilterEnum.kPartFaceFilter, "Выберите деталь для переноса")
  4. Dim oPartOcc As ComponentOccurrence = oFace.ContainingOccurrence
  5. Dim oPartCompDef As PartComponentDefinition = oPartOcc.Definition
  6. Dim subMat As Matrix = oPartOcc.Transformation
  7. subMat.Invert()
  8. For Each wPoint As WorkPoint In assDocDef.WorkPoints
  9.         Dim partPoint As Inventor.Point = InvApp.TransientGeometry.CreatePoint(wPoint.Point.X, wPoint.Point.Y, wPoint.Point.Z)
  10.         partPoint.TransformBy(subMat)
  11.         oPartCompDef.WorkPoints.AddFixed(partPoint)
  12. Next
Вроде работает для любых случаев ориентирования сборки и детали.
Название: Re: Перенос геометрии из сборки в деталь
Отправлено: Александр Ривилис от 21-11-2018, 12:48:26
Вроде работает для любых случаев ориентирования сборки и детали.
И в случае любой вложенности?
Название: Re: Перенос геометрии из сборки в деталь
Отправлено: Elfilagas от 21-11-2018, 14:14:13
Проверил до четвертого уровня, меняя ориентирование в каждой последующей подсборке, переносилось нормально. Большей вложенности у нас не встречается. Попробую отправить на использование так.
Название: Re: Перенос геометрии из сборки в деталь
Отправлено: Александр Ривилис от 21-11-2018, 14:46:35
Ну тогда с любой вложенностью будет все в порядке. В противном случае это будет багом.