C#. Построение плоскости в сборке смещением относительно другой плоскости.

Автор Тема: C#. Построение плоскости в сборке смещением относительно другой плоскости.  (Прочитано 2370 раз)

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

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

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

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

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Метод WorkPlanes.AddByPlaneAndOffset не работает внутри сборки.
Ну если посмотреть в браузер при построении пользовательским инструментом, то легко заметить, что в сборке параллельная плоскость прикрепляется через наложение сборочных зависимостей.
Поэтому и нужно и идти таким же путем.
Сделайте в сборке параллелепипед и запустите макрос
Код - Visual Basic [Выбрать]
  1. Sub ff()
  2. Dim doc As AssemblyDocument
  3. Set doc = ThisApplication.ActiveDocument
  4. Dim WPlans As WorkPlanes: Set WorkPlans = doc.ComponentDefinition.WorkPlanes
  5.  
  6. Dim p As Point: Set p = ThisApplication.TransientGeometry.CreatePoint(0, 0, 0)
  7. Dim vec1 As UnitVector: Set vec1 = ThisApplication.TransientGeometry.CreateUnitVector(1, 0, 0)
  8. Dim vec2 As UnitVector: Set vec2 = ThisApplication.TransientGeometry.CreateUnitVector(0, 1, 0)
  9.  
  10.  
  11.    Dim oWorkPlane As WorkPlane
  12.    Set oWorkPlane = doc.ComponentDefinition.WorkPlanes. _
  13.                       AddFixed(p, vec1, vec2)
  14.  
  15.  
  16.     Dim oAsmCompDef As AssemblyComponentDefinition
  17.     Set oAsmCompDef = ThisApplication.ActiveDocument.ComponentDefinition
  18.  
  19.    
  20.     Dim oOcc1 As ComponentOccurrence
  21.     Set oOcc1 = oAsmCompDef.Occurrences.Item(1)
  22.  
  23.        
  24.     Dim oPartFace As Face
  25.     Set oPartFace = oOcc1.Definition.SurfaceBodies.Item(1).Faces(1)
  26.  
  27.     Dim oPartFaceProxy As FaceProxy
  28.     Call oOcc1.CreateGeometryProxy(oPartFace, oPartFaceProxy)
  29.  
  30.     ' Create the constraint using the work plane proxies.
  31.    Call oAsmCompDef.Constraints.AddMateConstraint(oWorkPlane, oPartFaceProxy, 2)
  32.    
  33. End Sub
  34.  
  35.  

Появится рабочая плоскость параллельная первой грани параллелепипеда и отстоящая на 20 мм от этой плоскости

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Спасибо, Михаил, за подсказку. Дело в том, что вероятно это не то, что мне требуется. Чтобы было понятно: я хоть мало-помалу уже давно копаюсь в API инвентора, прокси объекты никогда не использовал. Сейчас почитал о них усердно. Как я понял, прокси объекты являются как бы указателями на оригинальные объекты, плоскость сборки построенная на основе такого объекта зависима от положения вхождения. Ну то есть я сдвигаю деталь и сдвигается плоскость, завязанная на ее грань. А мне хотелось получить условно "независимую" плоскость в самой сборке. Ну то есть я ее хочу просто взять и создать ее где-то в пространстве. Коли строить плоскость в сборке на основе геометрии вхождения, куда проще использовать метод WorkPlanes.AddByPlaneAndOffset аналог которого я и искал. Ну да, появится лишняя плоскость в детали, ну в конце концов ей можно задать свойство "Construction" = true.
(Если вдруг кому код понадобится):
Код - C# [Выбрать]
  1.             Inventor.AssemblyDocument oDoc = (Inventor.AssemblyDocument)oApp.ActiveDocument;
  2.             Inventor.AssemblyComponentDefinition oCD = oDoc.ComponentDefinition;
  3.             Inventor.TransientGeometry oTG = oApp.TransientGeometry;
  4.  
  5.             Inventor.WorkPlane oWorkPlane = oCD.WorkPlanes.AddFixed(oTG.CreatePoint(1, 5, 3),
  6.                         oTG.CreateUnitVector(1, 0, 0), oTG.CreateUnitVector(4, 2, 7));
  7.  
  8.             Inventor.ComponentOccurrence oOcc = oCD.Occurrences[1];
  9.             Inventor.PartComponentDefinition oCD_part = (Inventor.PartComponentDefinition)oCD.Occurrences[1].Definition;
  10.  
  11.  
  12.             Inventor.WorkPlane oWorkPlane_part = oCD_part.WorkPlanes.AddByPlaneAndOffset(oCD.WorkPlanes[3], 123, true);
  13.  
  14.             object oPartFaceProxy;
  15.             oOcc.CreateGeometryProxy(oWorkPlane_part, out oPartFaceProxy);
  16.  
  17.             oCD.Constraints.AddMateConstraint(oWorkPlane, oPartFaceProxy, 0);

Я все в толк взять не могу, если в пользовательском интерфейсе есть возможность задавать плоскость путем смещения, каким образом эта информация хранится в модели, если средствами API такого повторить как бы нельзя?
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Я все в толк взять не могу, если в пользовательском интерфейсе есть возможность задавать плоскость путем смещения, каким образом эта информация хранится в модели, если средствами API такого повторить как бы нельзя?
Дак я и говорю вам в своем первом ответе что пользовательская команда создания плоскости в сборке со смещением это тоже самое что сделано в моём макросе, только завернуто в требуемый пользовательский интерфейс. Но внутри инвентора происходит тоже самое что и в моём макросе.

Отмечено как Решение R.I.Chernov 01-11-2019, 09:18:21

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

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

Код - C# [Выбрать]
  1.             Inventor.AssemblyDocument oDoc = (Inventor.AssemblyDocument)oApp.ActiveDocument;
  2.             Inventor.AssemblyComponentDefinition oCD = oDoc.ComponentDefinition;
  3.             Inventor.TransientGeometry oTG = oApp.TransientGeometry;
  4.  
  5.             Inventor.WorkPlane oWorkPlane = oCD.WorkPlanes.AddFixed(oTG.CreatePoint(0, 0, 0),
  6.                         oTG.CreateUnitVector(1, 0, 0), oTG.CreateUnitVector(0, 1, 0));
  7.  
  8.             // если в сборке не вставлены детали, то по умолчанию плоскость создается нулевого размера
  9.             oWorkPlane.SetSize(oTG.CreatePoint(10, 0, 0), oTG.CreatePoint(0, 10, 0));
  10.  
  11.             oCD.Constraints.AddMateConstraint(oCD.WorkPlanes[3], oWorkPlane, 2);

Спасибо, Михаил, за помощь. С вашего позволения я "решением" помечу свое сообщение, чтобы другим было проще искать.
В программировании я новичок...но ненадолго! ;)