Координаты ComponentOccurrence(SurfaceBodies)

Автор Тема: Координаты ComponentOccurrence(SurfaceBodies)  (Прочитано 4561 раз)

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

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

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
Здравствуйте! Возникла такая задача. Необходимо получать координаты триангулированных SurfaceBodies из ComponentOccurrence, но в их собственных локальных системах координат. Также отдельно необходимо получать матрицы их трансформаций в мировые координаты.
Спасибо за ответы.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Координаты ComponentOccurrence(SurfaceBodies)
« Ответ #1 : 26-09-2020, 18:13:48 »
Необходимо получать координаты триангулированных SurfaceBodies

Это координаты вершин? Если "Да" то нужно смотреть у ComponentOccurrence.SurfaceBodies :
Если в ComponentOccurrence.SurfaceBodies пусто то нужно создать прокси объекты через ComponentOccurrence.CreateGeometryProxy
и тогда искать далее:

SurfaceBodyProxy.Vertices
там будет коллекция с прокси объектами
VertexProxy
и там координаты и точек в самой сборке и этих точек внутри детали
 VertexProxy.Point
и
VertexProxy.NativeObject.Point

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

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
Re: Координаты ComponentOccurrence(SurfaceBodies)
« Ответ #2 : 26-09-2020, 22:54:45 »
Интересуют грани, их вершины и нормали. Я использую  System.Collections.IEnumerator faceEn = surfaceBody.Faces.GetEnumerator();
Далее
Код - C# [Выбрать]
  1.             while (faceEn.MoveNext())
  2.             {
  3.                 Face face = faceEn.Current as Face;
  4.                 int VertexCount; int FaceCount; //Количество вершин и треугольников
  5.                 double[] Verticies = new double[1]; double[] Normals = new double[1]; //Массивы вершин и нормалей
  6.                 int[] Indicies = new int[1]; //Массив индексов                    
  7.                 int NumOfTols;
  8.                 double[] Tols = new double[1];
  9.  
  10.                 //Разбиваем грань на треугольники                    
  11.                 //face.CalculateFacets(1.0, out VertexCount, out FaceCount, out Verticies, out Normals, out Indicies);
  12.                 face.GetExistingFacetTolerances(out NumOfTols, out Tols);
  13.                 face.GetExistingFacets(Tols[NumOfTols - 1], out VertexCount, out FaceCount, out Verticies, out Normals, out Indicies);
  14.             }
Вот только не совсем понятно, какие координаты возвращаются...
« Последнее редактирование: 26-09-2020, 23:27:36 от Vladislav »

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Координаты ComponentOccurrence(SurfaceBodies)
« Ответ #3 : 27-09-2020, 13:50:53 »
Я использую  System.Collections.IEnumerator faceEn = surfaceBody.Faces.GetEnumerator();
Дак surfaceBody в данном случае содержит тип surfaceBodyProxy?

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

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
Re: Координаты ComponentOccurrence(SurfaceBodies)
« Ответ #4 : 28-09-2020, 23:04:16 »
Насколько я понял, в некоторых случаях да, SurfaceBody является SurfaceBodyProxy.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Координаты ComponentOccurrence(SurfaceBodies)
« Ответ #5 : 29-09-2020, 18:36:46 »
SurfaceBody является SurfaceBodyProxy
Ну дак все и получается как я писал выше в SurfaceBodyProxy есть  VertexProxy.Point, там координаты вершины детали относительно системы координат данной сборки
а в VertexProxy.NativeObject.Point координаты вершины относительно начала координат самой детали

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Координаты ComponentOccurrence(SurfaceBodies)
« Ответ #6 : 30-09-2020, 05:15:45 »
Vladislav,
Ну что, помогло?

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

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
Re: Координаты ComponentOccurrence(SurfaceBodies)
« Ответ #7 : 10-11-2020, 22:49:37 »
Да, помогло. Спасибо.
Но теперь новая задача, связанная с этой)
Как мне сохранить SAT-представление данного ComponentOccurrence
именно в этих(локальных) координатах?
Сейчас делаю так:
Код - C# [Выбрать]
  1.                     Occ.Visible = true;
  2.                     //Перемещаем деталь в ноль
  3.                     Matrix occTransform = Occ.Transformation;
  4.                     Matrix occInvertedTransform = Occ.Transformation;
  5.                     occInvertedTransform.Invert();
  6.                     Matrix tmpMat = Occ.Transformation;
  7.                     tmpMat.PostMultiplyBy(occInvertedTransform);
  8.                     Occ.SetTransformWithoutConstraints(tmpMat);
  9.                    
  10.                     //Сохраняем SAT
  11.                     CreateSATFile(doc, InventorApplication.FileOptions.UndoPath + "temp\\", m_SATIndex.ToString() + ".SAT");
  12.                     //Возвращаем деталь на место
  13.                     Occ.SetTransformWithoutConstraints(occTransform);
Но результат не соответствует ожидаемому для некоторых элементов модели, в частности для болтов и гаек.
Спасибо.

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Координаты ComponentOccurrence(SurfaceBodies)
« Ответ #8 : 11-11-2020, 04:48:40 »
Если использовался SurfaceBodyProxy то можно посмотреть базовый SurfaceBody, там скорее всего будет все в локальный координатах
SurfaceBodyProxy.NativeObject

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

  • ADN OPEN
  • ***
  • Сообщений: 210
  • Карма: 0
Re: Координаты ComponentOccurrence(SurfaceBodies)
« Ответ #9 : 11-11-2020, 12:43:15 »
Но для сохранения Sat я использую ComponentOccurrence или ComponentOccurrenceProxy. Получается мне нужно взять его NativeObject и как-то поместить в документ и затем сохранять sat?
Запутался(

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Координаты ComponentOccurrence(SurfaceBodies)
« Ответ #10 : 13-11-2020, 16:59:24 »
А по ссылке на документ детали в SAT не работает?
Код - Visual Basic [Выбрать]
  1. Sub ImportSATFunc()
  2.   Dim assdoc As AssemblyDocument: Set assdoc = ThisApplication.ActiveDocument
  3.   Dim occur As ComponentOccurrence: Set occur = assdoc.ComponentDefinition.Occurrences(1)
  4.  Dim doc As PartDocument: Set doc = occur.Definition.Document
  5.  
  6. 'doc в SAT?
  7.  
  8. End Sub
  9.