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

ADN Club => Inventor API => Тема начата: slavnov07 от 17-02-2021, 11:58:58

Название: C# вставка в Assembly из ContentCenter
Отправлено: slavnov07 от 17-02-2021, 11:58:58
Всем привет! :)

за мой "говнокод" прошу строго не судить)

Если вдруг кому понадобится вставка (в данном случае мне надо было выгрузить всю библиотеку) вот код:

Код - C# [Выбрать]
  1. string ChilDNodes_1 = "Крепежные изделия";
  2.             string ChilDNodes_2 = "Болты  Винты";
  3.             string ChilDNodes_3 = "С шестигранной головкой";
  4.             string ChilDNodes_4 = "Болт ГОСТ 7798";
  5.             string NameColumn = "DESIGNATION";

тут есть отличие от vb.net, в том что у vb.net идет:
 
Код - vb.net [Выбрать]
  1. oContentNode = oContentCenter.TreeViewTopNode.ChildNodes.Item["Имя узла"]

у c# идет:
Код - C# [Выбрать]
  1. oContentNode = oContentCenter.TreeViewTopNode.ChildNodes["Имя узла"]
  в общем некоторое время я сидел и недоумевал как же так, в одном языке есть .Item в другом его нет...

//функция принимает ссылку на открытый inventor, открытую сборку, имена узлов и имя столбца в библиотеке(designation)
Код - C# [Выбрать]
  1. private void PasteInInventor(Inventor.Application InvApp, Inventor.AssemblyDocument OpenAssemblyDoc, string ChilDNodes_1, string ChilDNodes_2, string ChilDNodes_3, string ChilDNodes_4, string NameColumn)
  2.         {
  3.                  
  4.             Inventor.ContentCenter oContentCenter = InvApp.ContentCenter; //получаем ссылку на ContentCenter
  5.             Inventor.ContentTreeViewNode oContentNode = default;
  6.  
  7.             oContentNode = oContentCenter.TreeViewTopNode.ChildNodes[ChilDNodes_1].ChildNodes[ChilDNodes_2].ChildNodes[ChilDNodes_3];
  8.  
  9.             long AllPoint, NowPoint;    //этими переменными реализован счётчик количества строк в библиотеке
  10.             NowPoint = 0;
  11.  
  12.             foreach (Inventor.ContentFamily oFamily in oContentNode.Families)//тут бегаем по семействам в папке/подпапке узла
  13.             {
  14.                 AllPoint = oFamily.TableRows.Count;
  15.                 if (oFamily.DisplayName == ChilDNodes_4)
  16.                 {
  17.                     foreach (Inventor.ContentTableRow ContTableRow in oFamily.TableRows)//тут бегаем по строкам таблицы
  18.                     {
  19.                         NowPoint += 1;
  20.                         var ContTableRow_Designation = ContTableRow.GetCellValue(NameColumn);
  21.                         Inventor.MemberManagerErrorsEnum failureCM = default;
  22.                         string MessageProbl = "You_have_a_Problem";
  23.                         var CreateMem = oFamily.CreateMember(ContTableRow, out failureCM, out MessageProbl);
  24.                         Inventor.TransientGeometry transientGeometry = InvApp.TransientGeometry;
  25.                         var OpenDoc = OpenAssemblyDoc.ComponentDefinition.Occurrences.Add(CreateMem, transientGeometry.CreateMatrix());//создание вхождения
  26.                         string txt = $"{NowPoint} из {AllPoint}";
  27.                         EventArgs E = new EventArgs();
  28.                         label1_Click(txt, E);//тут просто выводится счётчик
  29.                     }
  30.                 }
  31.             }
  32.  
  33.         }


если необходимо расшарить какие узлы есть в другом узле:

Код - C# [Выбрать]
  1. private void GetNodes (Inventor.Application InvApp, Inventor.AssemblyDocument OpenAssemblyDoc, string ChilDNodes_1, string ChilDNodes_2, string ChilDNodes_3, string ChilDNodes_4, string NameColumn)
  2.         {
  3.             Inventor.ContentCenter oContentCenter = InvApp.ContentCenter; //получаем ссылку на ContentCenter
  4.             Inventor.ContentTreeViewNode oContentNode = default;
  5.  
  6.             oContentNode = oContentCenter.TreeViewTopNode.ChildNodes[ChilDNodes_1];//тут в зависимости от вложенности можно добавить ChilDNodes_2 и тд.
  7.  
  8.             long AllPoint, NowPoint;
  9.             NowPoint = 0;          
  10.             EventArgs E1 = new EventArgs();
  11.             string txt = $"{oContentNode.FullTreeViewPath} количество семейств {oContentNode.ChildNodes.Count}";
  12.            
  13.  
  14.             foreach (Inventor.ContentTreeViewNode item in oContentNode.ChildNodes)
  15.             {
  16.                 txt = (string)item.DisplayName;//выводим имя узла
  17.                 ChildNodes_Click(txt, E1);
  18.             }
  19.  
  20.         }



Название: Re: C# вставка в Assembly из ContentCenter
Отправлено: R.I.Chernov от 17-02-2021, 21:17:28
//функция принимает ссылку на открытый inventor, открытую сборку, имена узлов и имя столбца в библиотеке(designation)
Ссылку на приложение можно получить из ссылки на сборку. Так можно избавиться от одного лишнего параметра в методе:
Код - C# [Выбрать]
  1. Inventor.Application oApp = (Inventor.Application) oDoc.ComponentDefinition.Application;
Название: Re: C# вставка в Assembly из ContentCenter
Отправлено: mikazakov от 18-02-2021, 05:25:33
в общем некоторое время я сидел и недоумевал как же так, в одном языке есть .Item в другом его нет...
Ну это не единственное различие. Работа с событиями синтаксически различается в C# и VB.NET. На VB.NET работы с указателями нет, хотя к счастью указатели в NET языках при работе через не особо нужны.
Название: Re: C# вставка в Assembly из ContentCenter
Отправлено: slavnov07 от 18-02-2021, 12:46:45
Ссылку на приложение можно получить из ссылки на сборку
у меня там сначала проверка идет открыт ли inventor если нет то открывает его, это не addin, просто стороннее приложение
Название: Re: C# вставка в Assembly из ContentCenter
Отправлено: R.I.Chernov от 18-02-2021, 21:21:42
у меня там сначала проверка идет открыт ли inventor
Я советую вам вынести проверку из данного метода в отдельный.