Как заменить стабилизированное имя вхождения на оригинальное.

Автор Тема: Как заменить стабилизированное имя вхождения на оригинальное.  (Прочитано 7394 раз)

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

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

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

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 752
  • Карма: 195
  • Skype: mikazakov@mail.ru
Наверное это оно:
ComponentOccurrence.Name

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

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
ComponentOccurrence.Name
Спасибо, Михаил! Но, либо я не понял вашего ответа, либо вы моего вопроса. С помощью ComponentOccurrence.Name я могу переименовать вхождение, но имя все равно останется "стабилизированным", т.е. не будет связи между именем в дереве конструирования и фактическим именем файла детали/сборки. Мне нужно найти, как вернуть "оригинальное" имя, то есть чтобы оно не считалось "переписанным". Что означает, что при изменении имя файла детали/сборки, менялось бы и его имя в дереве конструирования.
В программировании я новичок...но ненадолго! ;)

Оффлайн Алексей Романов

  • ADN Club
  • **
  • Сообщений: 87
  • Карма: 20
Попробуй так:
ComponentOccurrence.Definition.Document.DisplayNameOverridden = False

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

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
ComponentOccurrence.Definition.Document.DisplayNameOverridden = False
Спасибо, Алексей, но что-то у меня это не работает. Быть может подскажете, где я ошибся?
Код - Visual Basic [Выбрать]
  1. Sub TestSub()
  2.     Dim oDoc As Inventor.AssemblyDocument
  3.     Set oDoc = ThisApplication.ActiveDocument
  4.     Dim oOccs As ComponentOccurrences
  5.     Set oOccs = oDoc.ComponentDefinition.Occurrences
  6.     Dim oDoc_2 As Inventor.PartDocument
  7.     Set oDoc_2 = oOccs(1).Definition.Document
  8.     oDoc_2.DisplayNameOverridden = False
  9.     oDoc.Update
  10. End Sub
В программировании я новичок...но ненадолго! ;)

Оффлайн Алексей Романов

  • ADN Club
  • **
  • Сообщений: 87
  • Карма: 20
Я тут поправлю свой коммент, сегодня чуть по разбирался...
Тут два момента, могут быть изменены пользователем как oDoc_2.DisplayName, так и ComponentOccurrence.Name, приходиться отлавливать оба случая, примерно так:
Код - Visual Basic [Выбрать]
  1. Sub TestSub()
  2.     Dim oDoc As AssemblyDocument
  3.     Set oDoc = ThisApplication.ActiveDocument
  4.     Dim oOcc As ComponentOccurrence
  5.     Set oOcc = oDoc.ComponentDefinition.Occurrences(2)
  6.     Dim oDoc_2 As Document
  7.     Set oDoc_2 = oOcc.Definition.Document
  8.     If oDoc_2.DisplayNameOverridden = True Then oDoc_2.DisplayNameOverridden = False
  9.     If InStr(oOcc.name, ":") > 0 Then
  10.         Dim nm As String
  11.         nm = Left(oOcc.name, InStr(oOcc.name, ":") - 1)
  12.         If oDoc_2.DisplayName <> nm Then
  13.             oOcc.name = oDoc_2.DisplayName & Right(oOcc.name, Len(oOcc.name) - InStr(oOcc.name, ":") + 1)
  14.         End If
  15.     Else
  16.         If oDoc_2.DisplayName <> oOcc.name Then oOcc.name = oDoc_2.DisplayName
  17.     End If
  18.     oDoc.Update
  19. End Sub
  20.  
« Последнее редактирование: 14-11-2016, 15:23:59 от Алексей Романов »

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

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Спасибо, Алексей! Извиняюсь, что пропал,был очень занят. Я попробовал, то что вы предлагаете, но это не то, что я искал.
Код - Visual Basic [Выбрать]
  1. If oDoc_2.DisplayName <> oOcc.name Then oOcc.name = oDoc_2.DisplayName
В вашем коде идет считывание свойства DisplayName (проверив, что свойство не было переписано), и присваивание его значения  имени вхождения. Но по факту оригинальной ссылки на имя документа не создается. Поясню, что я имею ввиду: при вставки любой детали в сборку,изначально имя вхождения ссылается на имя документа, если "Деталь 1.ipt" в сборке командой "замена" поменять на "Деталь 2.ipt", то имя в дереве конструирования также поменяется. После исправления вашим кодом и последующей заменой детали, имя в дереве конструирования останется неизменным.
П.С. Я уже начинаю сомневаться, что то, что я ищу вообще можно сделать :( Просто разработчики Inventor API мне всегда казались очень смышлеными ребятами, в связи с чем я априори полагал, что если что-то мне нужно, значит они это заранее предусмотрели (я имею ввиду из базовых команд, а не какие-нибудь генераторы рам и iCopy).
В программировании я новичок...но ненадолго! ;)

Оффлайн Алексей Романов

  • ADN Club
  • **
  • Сообщений: 87
  • Карма: 20
если "Деталь 1.ipt" в сборке командой "замена" поменять на "Деталь 2.ipt", то имя в дереве конструирования также поменяется.
Это только если пользователь не менял это имя в дереве сборки.)
А если после замены детали еще раз запустить макрос? Макрос не трогает имя в сборке, если оно оригинальное...

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

  • ADN Club
  • *****
  • Сообщений: 568
  • Карма: 18
Это только если пользователь не менял это имя в дереве сборки.)
В этом то и суть задачи: Пользователь трогал, а я должен вернуть как было! )) Не знаю только как.

П.С.
А если после замены детали еще раз запустить макрос?
Да, если каждый раз запускать, он будет переименовывать, но это не является нужным решением по определенным причинам. Ищу чтобы работало, как я описал выше.
В программировании я новичок...но ненадолго! ;)

Оффлайн Алексей Романов

  • ADN Club
  • **
  • Сообщений: 87
  • Карма: 20
Пользователь трогал, а я должен вернуть как было! ))
Для этого я и привел пример кода, после замены детали нужно запустить макрос...
У документа есть свойство DisplayNameOverridden, у ComponentOccurrence.Name его нет, отсюда все твои проблемы...

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

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

В любом случае спасибо за участие!
В программировании я новичок...но ненадолго! ;)