Как получить ссылку на папку, в которой находится вхождение?

Автор Тема: Как получить ссылку на папку, в которой находится вхождение?  (Прочитано 2878 раз)

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

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

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

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

Оффлайн mikazakov

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

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Вообще ничего не понятно
Здравствуйте, Михаил. У меня есть сборка, внутри которой есть деталь с именем "Деталь". Я могу найти ссылку на эту деталь через коллекцию вхождений. Также в сборке есть папка с именем 01, внутри нее папка с именем 02... внутри второй папка 03... и т.д. Пользователь специально, или случайно переместил "Деталь" в одну из папок, и я не знаю в какую. Мне же нужно, чтобы деталь находилась ни в одной из папок. То есть чтобы родительским узлом для нее был "TopNode" данной сборки.
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

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

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Хоть скриншот бы

Я не думал, что он может чем-то помочь. Вот, пожалуйста.



То есть вот как мне узнать, что деталь лежит именно в папке 03, а не в 02 или 04. Как мне перенести ее в корень, чтобы было вот так вот, как на следующем скриншоте


В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
То есть вот как мне узнать, что деталь лежит именно в папке 03, а не в 02 или 04. Как мне перенести ее в корень, чтобы было вот так вот, как на следующем скриншоте
Ну узнать где находится деталь только рекурсией. А перемещать через BrowserPane.Reorder

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Не знаю тонкостей ваших там,
но может если известен документ то найти его в браузере можно как в примере из хэлпа
Navigation between browser and data:

Код - Visual Basic [Выбрать]
  1. Sub DataModelToBrowser()
  2.     ' Create a new part document, using the default part template.
  3.    Dim oPartDoc As PartDocument
  4.     Set oPartDoc = ThisApplication.Documents.Add(kPartDocumentObject)
  5.  
  6.     ' Set a reference to the component definition.
  7.    Dim oCompDef As PartComponentDefinition
  8.     Set oCompDef = oPartDoc.ComponentDefinition
  9.    
  10.     ' Create a new workplane parallel to the XY plane.
  11.    Dim oWorkPlane As WorkPlane
  12.     Set oWorkPlane = oCompDef.WorkPlanes.AddByPlaneAndOffset(oCompDef.WorkPlanes.Item(3), 1)
  13.    
  14.     ' Get the browser node definition associated with the work plane.
  15.    Dim oNativeBrowserNodeDef As NativeBrowserNodeDefinition
  16.     Set oNativeBrowserNodeDef = oPartDoc.BrowserPanes.GetNativeBrowserNodeDefinition(oWorkPlane)
  17.    
  18.     ' Get the top browser node of the model pane.
  19.    Dim oTopBrowserNode As BrowserNode
  20.     Set oTopBrowserNode = oPartDoc.BrowserPanes.ActivePane.TopNode
  21.    
  22.     ' Get the work plane browser node.
  23.    ' This assumes that only one node references the browser node definition.
  24.    ' An example of multiple nodes referencing a single definition is a shared
  25.    ' sketch. The browser may have multiple nodes that represent the same shared
  26.    ' sketch, but all of them reference the same definition.
  27.    Dim oWorkPlaneNode As BrowserNode
  28.     Set oWorkPlaneNode = oTopBrowserNode.AllReferencedNodes(oNativeBrowserNodeDef).Item(1)
  29.    
  30.     ' Get the browser node definition from the browser node.
  31.    Set oNativeBrowserNodeDef = Nothing
  32.     Set oNativeBrowserNodeDef = oWorkPlaneNode.BrowserNodeDefinition
  33.    
  34.     ' Get the work plane from the browser node definition.
  35.    Set oWorkPlane = Nothing
  36.     Set oWorkPlane = oNativeBrowserNodeDef.NativeObject
  37.    
  38.     ' Select the work plane to make sure we have the right object.
  39.    oPartDoc.SelectSet.Select oWorkPlane
  40. End Sub
  41.  

Отмечено как Решение R.I.Chernov 08-04-2020, 18:56:36

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
А перемещать через BrowserPane.Reorder
Спасибо, Михаил! Это то, что было нужно.

Ну узнать где находится деталь только рекурсией.
Этого уже не требуется. Я думал, что для того, чтобы совершить перемещение, надо найти, в какой папке находится вхождение и удалить из нее.

Итоговый код получился такой вот

Код - C# [Выбрать]
  1.             Inventor.BrowserPane oPane = oDoc.BrowserPanes["AmBrowserArrangement"];
  2.             Inventor.ComponentOccurrence tmp_Occ = oOccS.ItemByName["Деталь"];
  3.             Inventor.BrowserNode bn_of_occ = oPane.GetBrowserNodeFromObject(tmp_Occ);
  4.             Inventor.BrowserNode bn_we_need = oPane.TopNode.BrowserNodes[oPane.TopNode.BrowserNodes.Count];
  5.             oPane.Reorder(bn_we_need, false, bn_of_occ);
  6.             oDoc.Update();

, где oDoc ссылка на главную сборку.

Но у меня отстался один важный нерешенный вопрос, касательно применения метода BrowserPane.Reorder, его я опишу ниже.
В программировании я новичок...но ненадолго! ;)

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

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Но у меня отстался один важный нерешенный вопрос, касательно применения метода BrowserPane.Reorder, его я опишу ниже.

В сборке при создании всего шесть узлов BrowserNodes. По идее, нужная мне позиция для перемещения находится после шестого узла:


В качестве первого аргумента метода BrowserPane.Reorder я пытался использовать
Код - C# [Выбрать]
  1. Inventor.BrowserNode bn_we_need = oPane.TopNode.BrowserNodes[6]

И не могу понять, почему, когда деталь лежит в папке метод выдает ошибку


А когда деталь находится после папок, то она корректно перемещается на верхнюю строку дерева конструирования инвентора

В программировании я новичок...но ненадолго! ;)