Перенос геометрии из сборки в деталь

Автор Тема: Перенос геометрии из сборки в деталь  (Прочитано 4526 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн ElfilagasАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
Добрый день,
Пытаюсь перенести геометрию из сборки в деталь, но все точки смещаются на равное расстояние при переносе, как понимаю нужно при переносе использовать 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

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Ну вообщем вам нужно вспоминать векторную алгебру :), здесь получается векторная разность между радиус-вектором точки в сборке и радиус-вектором системы координат детали.
 
Создайте в сборке одну деталь и одну рабочую точку в самой сборке,
в объекте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.  

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Да и в объекте PlanarSketch есть функция
SketchToModelSpace
может пригодится

Оффлайн ElfilagasАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
Большое спасибо, с переносом все оказалось немного сложнее чем я думал. )

Оффлайн ElfilagasАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
А есть ли обратная функция? Т.е. проекции 3D точки на эскиз. Или нужно как то определять ориентацию плоскости эскиза и переносить по координатам?

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
вроде как есть
PlanarSketch.ModelToSketchSpace

Оффлайн ElfilagasАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
Вот видел же эту функцию, но почему то не проверил что она делает. Уже нашел нормаль к плоскости эскиза и пытался проецировать по этому вектору точку. А по описанию эта функция все это как раз и делает в одну строку. ) Еще раз спасибо.

Оффлайн ElfilagasАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
Столкнулся с проблемой. Если деталь ориентирована в другой плоскости, то точки на деталь переносятся относительно ориентации сборки. Пример во вложении, если переносить точки разметки как из общей сборки, так и из подсборки на деталь, они проецируются не туда.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
А каким способом то точки "переносятся"?

Оффлайн ElfilagasАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
Вот так переношу:
Код - 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".

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Ну вообщем посмотрел.
Могу сказать следующее, этот алгоритм вычитания векторов, я предложил как пример для одной детали в сборке.
Это не универсальный алгоритм и понятное дело, что начала систем координат всех вложенных подсборок могут быть сдвинуты относительно верхней сборки. Поэтому и получается чушь. Все это нужно учитывать "пробегая" по сборочным вложенностям от верхней открытой сборки до детали.
Это конечно не просто.
Как доступ к техподдержке починят, я спрошу у них может есть более короткий путь.

Оффлайн ElfilagasАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
Спасибо, дайте знать если что то ответят.

Отмечено как Решение Elfilagas 22-11-2018, 11:12:41

Оффлайн ElfilagasАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
Получилось перенести через обратную матрицу детали:
Код - 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
Вроде работает для любых случаев ориентирования сборки и детали.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Вроде работает для любых случаев ориентирования сборки и детали.
И в случае любой вложенности?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ElfilagasАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
Проверил до четвертого уровня, меняя ориентирование в каждой последующей подсборке, переносилось нормально. Большей вложенности у нас не встречается. Попробую отправить на использование так.
« Последнее редактирование: 21-11-2018, 14:48:12 от Elfilagas »