Измерение углов между рабочими осями

Автор Тема: Измерение углов между рабочими осями  (Прочитано 1574 раз)

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

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Доброго времени суток, уважаемые форумчане. Помогите пожалуйста разобрать с данной темой.

Мне необходимо померить угол между осью "X" сборки и осью "X" детали, произвольно в нее вставленной.
Пытаясь понять, как это делать, написал такой вот код:
Код - C# [Выбрать]
  1. private void AngleDimension (object sender, EventArgs e)
  2. {
  3.     Inventor.AssemblyDocument oDoc = (Inventor.AssemblyDocument) oApp.ActiveDocument;
  4.     Inventor.AssemblyComponentDefinition oCD = oDoc.ComponentDefinition;
  5.     Inventor.ComponentOccurrences oOcc = oCD.Occurrences;
  6.  
  7.     Inventor.UnitVector vectorAxisX = oCD.WorkAxes[1].Line.Direction;
  8.     Inventor.UnitVector vectorAxisY = oCD.WorkAxes[2].Line.Direction;
  9.     Inventor.UnitVector vectorAxisZ = oCD.WorkAxes[3].Line.Direction;
  10.  
  11.     Debug.WriteLine($"vectorAxisX -> ({vectorAxisX.X},{vectorAxisX.Y},{vectorAxisX.Z})");
  12.     Debug.WriteLine($"vectorAxisY -> ({vectorAxisY.X},{vectorAxisY.Y},{vectorAxisY.Z})");
  13.     Debug.WriteLine($"vectorAxisZ -> ({vectorAxisZ.X},{vectorAxisZ.Y},{vectorAxisZ.Z})");
  14.  
  15.     Debug.WriteLine(vectorAxisX.AngleTo(vectorAxisX) / Math.PI * 180);
  16.     Debug.WriteLine(vectorAxisY.AngleTo(vectorAxisX) / Math.PI * 180);
  17.     Debug.WriteLine(vectorAxisZ.AngleTo(vectorAxisX) / Math.PI * 180);
  18.  
  19.     // вывод
  20.     // vectorAxisX-> (1, 0, 0)
  21.     // vectorAxisY-> (0, 1, 1)
  22.     // vectorAxisZ-> (0, 0, 0)
  23.     // 0
  24.     // 90
  25.     // 90
  26.  
  27.     Inventor.PartDocument oDocPart = (Inventor.PartDocument) oOcc[1].Definition.Document;
  28.     Inventor.PartComponentDefinition oCDPart = oDocPart.ComponentDefinition;
  29.  
  30.     Inventor.UnitVector vectorPartAxisX = oCDPart.WorkAxes[1].Line.Direction;
  31.     Inventor.UnitVector vectorPartAxisY = oCDPart.WorkAxes[2].Line.Direction;
  32.     Inventor.UnitVector vectorPartAxisZ = oCDPart.WorkAxes[3].Line.Direction;
  33.  
  34.     Debug.WriteLine($"vectorPartAxisX -> ({vectorPartAxisX.X},{vectorPartAxisX.Y},{vectorPartAxisX.Z})");
  35.     Debug.WriteLine($"vectorPartAxisY -> ({vectorPartAxisY.X},{vectorPartAxisY.Y},{vectorPartAxisY.Z})");
  36.     Debug.WriteLine($"vectorPartAxisZ -> ({vectorPartAxisZ.X},{vectorPartAxisZ.Y},{vectorPartAxisZ.Z})");
  37.  
  38.     Debug.WriteLine(vectorAxisX.AngleTo(vectorPartAxisX) / Math.PI * 180);
  39.     Debug.WriteLine(vectorAxisY.AngleTo(vectorPartAxisY) / Math.PI * 180);
  40.     Debug.WriteLine(vectorAxisZ.AngleTo(vectorPartAxisZ) / Math.PI * 180);
  41.  
  42.     // вывод
  43.     // vectorPartAxisX-> (1, 0, 0)
  44.     // vectorPartAxisY-> (0, 1, 0)
  45.     // vectorPartAxisZ-> (0, 0, 1)
  46.     // 0
  47.     // 0
  48.     // 0
  49.  
  50. }

Как видно из примера, юнит векторы осей детали похоже определяются в пространстве детали, в связи с чем результат измерения углов неверен. Может быть кто-то знает,как правильно померить величины? Буду благодарен любой идее.
В программировании я новичок...но ненадолго! ;)

Отмечено как Решение R.I.Chernov 22-02-2021, 16:44:41

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Как уже сто раз бывало, после написания вопроса на этот форум, в голову через пять минут приходит ответ! Магия! )))
Для решения задачи надо использовать прокси рабочих осей детали:

Код - C# [Выбрать]
  1. private void AngleDimension ()
  2. {
  3.     Inventor.AssemblyDocument oDoc = (Inventor.AssemblyDocument) oApp.ActiveDocument;
  4.     Inventor.AssemblyComponentDefinition oCD = oDoc.ComponentDefinition;
  5.     Inventor.ComponentOccurrences oOcc = oCD.Occurrences;
  6.  
  7.     Inventor.UnitVector vectorAxisX = oCD.WorkAxes[1].Line.Direction;
  8.     Inventor.UnitVector vectorAxisY = oCD.WorkAxes[2].Line.Direction;
  9.     Inventor.UnitVector vectorAxisZ = oCD.WorkAxes[3].Line.Direction;
  10.  
  11.     Debug.WriteLine($"vectorAxisX -> ({vectorAxisX.X},{vectorAxisX.Y},{vectorAxisX.Z})");
  12.     Debug.WriteLine($"vectorAxisY -> ({vectorAxisY.X},{vectorAxisY.Y},{vectorAxisY.Z})");
  13.     Debug.WriteLine($"vectorAxisZ -> ({vectorAxisZ.X},{vectorAxisZ.Y},{vectorAxisZ.Z})");
  14.  
  15.     Debug.WriteLine(vectorAxisX.AngleTo(vectorAxisX) / Math.PI * 180);
  16.     Debug.WriteLine(vectorAxisY.AngleTo(vectorAxisX) / Math.PI * 180);
  17.     Debug.WriteLine(vectorAxisZ.AngleTo(vectorAxisX) / Math.PI * 180);
  18.  
  19.     // вывод
  20.     // vectorAxisX-> (1, 0, 0)
  21.     // vectorAxisY-> (0, 1, 1)
  22.     // vectorAxisZ-> (0, 0, 0)
  23.     // 0
  24.     // 90
  25.     // 90
  26.  
  27.     Inventor.PartDocument oDocPart = (Inventor.PartDocument) oOcc[1].Definition.Document;
  28.     Inventor.PartComponentDefinition oCDPart = oDocPart.ComponentDefinition;
  29.  
  30.  
  31.     object objectProxyX;
  32.     object objectProxyY;
  33.     object objectProxyZ;
  34.     oOcc[1].CreateGeometryProxy(oCDPart.WorkAxes[1], out objectProxyX);
  35.     oOcc[1].CreateGeometryProxy(oCDPart.WorkAxes[2], out objectProxyY);
  36.     oOcc[1].CreateGeometryProxy(oCDPart.WorkAxes[3], out objectProxyZ);
  37.     Inventor.WorkAxisProxy waProxyX = (Inventor.WorkAxisProxy) objectProxyX;
  38.     Inventor.WorkAxisProxy waProxyY = (Inventor.WorkAxisProxy) objectProxyY;
  39.     Inventor.WorkAxisProxy waProxyZ = (Inventor.WorkAxisProxy) objectProxyZ;
  40.  
  41.  
  42.     Inventor.UnitVector vectorPartAxisX = waProxyX.Line.Direction;
  43.     Inventor.UnitVector vectorPartAxisY = waProxyY.Line.Direction;
  44.     Inventor.UnitVector vectorPartAxisZ = waProxyZ.Line.Direction;
  45.  
  46.  
  47.     Debug.WriteLine($"vectorPartAxisX -> ({vectorPartAxisX.X},{vectorPartAxisX.Y},{vectorPartAxisX.Z})");
  48.     Debug.WriteLine($"vectorPartAxisY -> ({vectorPartAxisY.X},{vectorPartAxisY.Y},{vectorPartAxisY.Z})");
  49.     Debug.WriteLine($"vectorPartAxisZ -> ({vectorPartAxisZ.X},{vectorPartAxisZ.Y},{vectorPartAxisZ.Z})");
  50.  
  51.     Debug.WriteLine(vectorAxisX.AngleTo(vectorPartAxisX) / Math.PI * 180);
  52.     Debug.WriteLine(vectorAxisY.AngleTo(vectorPartAxisY) / Math.PI * 180);
  53.     Debug.WriteLine(vectorAxisZ.AngleTo(vectorPartAxisZ) / Math.PI * 180);
  54.  
  55.     // вывод
  56.     // vectorPartAxisX-> (0, 404627124949114, -0, 427431037410317, -0, 808442699276674)
  57.     // vectorPartAxisY-> (0, 749683078886145, 0, 66130241463931, 0, 0255811966883751)
  58.     // vectorPartAxisZ-> (0, 523690911690478, -0, 616426657965536, 0, 588018710894676)
  59.     // 66,1322370155468
  60.     // 48,6007218681886
  61.     // 53,9834643828388
  62. }
В программировании я новичок...но ненадолго! ;)

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Удалил это ссобщение )
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Ну еще есть Application.MeasureTools

Оффлайн R.I.ChernovАвтор темы

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Ну еще есть Application.MeasureTools
Спасибо, Михаил. Попробовал: без прокси метод вызвал ошибку, но в целом им удобнее пользоваться наверно, так как юнит векторы не нужны.
В программировании я новичок...но ненадолго! ;)