Замена ссылки для вида на чертеже

Автор Тема: Замена ссылки для вида на чертеже  (Прочитано 10186 раз)

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

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 263
  • Карма: 2
Я хотел сделать замену ссылки на файл модели для выделенного вида на чертеже. Использовал стандартную команду:
Код - vb.net [Выбрать]
  1. Dim sView As DrawingView
  2. sView.ReferencedDocumentDescriptor.ReferencedFileDescriptor.ReplaceReference(OName)
Но если в чертеже несколько отдельных базовых видов, ссылающихся на это модель, выполняется замена для всех видов в чертеже. Можноли сделать замену ссылки только для одного, выделенного вида?

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Замена ссылки для вида на чертеже
« Ответ #1 : 24-06-2015, 07:47:18 »
filat,
Наверное, это потому что, все виды ссылаются на ссылается на один и тот же экземпляр sView.ReferencedDocumentDescriptor.ReferencedFileDescriptor
Проверить можно через фреймворковскую функцию Object.Equals

https://msdn.microsoft.com/ru-ru/library/bsc2ak47(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1

Ты кстати проверь как пользовательский интерфейс по замене ссылок работает.
А вообще что за чертежи у тебя там такие с кучей базовых видов, и с одной и той же ссылкой  на модель.

Оффлайн filatАвтор темы

  • ADN Club
  • ****
  • Сообщений: 263
  • Карма: 2
Re: Замена ссылки для вида на чертеже
« Ответ #2 : 24-06-2015, 10:17:46 »
Наверное, это потому что, все виды ссылаются на ссылается на один и тот же экземпляр
Разумеется ссылаются на один и тотже. Идея в том, что в череже нужно показать несколько видов разных узлов, но очень похожих, хотел один вид с готовым оформлением скопировать изаменить ссылку только для скопированного вида...

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Замена ссылки для вида на чертеже
« Ответ #3 : 06-09-2016, 17:38:36 »
Но если в чертеже несколько отдельных базовых видов, ссылающихся на это модель, выполняется замена для всех видов в чертеже. Можноли сделать замену ссылки только для одного, выделенного вида?
Я не пробовал это делать программно, но когда приходилось делать такую операцию вручную - выкручивался так: создавал пустой чертеж копировал на него вид, меня ссылку на модель, копировал обновленный вид и переносил его на оригинальный чертеж. В пользовательском интерфейсе это делается просто ctrl+C, ctrl+V, можно ли так сделать программно - понятия не имею.
В программировании я новичок...но ненадолго! ;)

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Замена ссылки для вида на чертеже
« Ответ #4 : 08-09-2016, 15:49:12 »
можно ли так сделать программно - понятия не имею

Выяснилось что можно, вот код, который выполняет данную задачу:
Код - Visual Basic [Выбрать]
  1. Private Sub test_dwg_11()
  2.     Dim oDoc_dwg As DrawingDocument
  3.     Set oDoc_dwg = ThisApplication.ActiveDocument
  4.     Dim oSheet As Sheet
  5.     Set oSheet = oDoc_dwg.ActiveSheet
  6.     Dim oView As DrawingView
  7.     Set oView = oSheet.DrawingViews(3)
  8.    
  9.     Dim Templ_Path As String
  10.     Templ_Path = ThisApplication.DesignProjectManager.ActiveDesignProject.TemplatesPath + "Обычный.idw"
  11.     Dim oDoc_dwg_new As DrawingDocument
  12.     Set oDoc_dwg_new = ThisApplication.Documents.Add(kDrawingDocumentObject, Templ_Path)
  13.     Dim oView_new As DrawingView
  14.     Set oView_new = oView.CopyTo(oDoc_dwg_new.Sheets(1))    
  15.      
  16.     Dim oDoc As AssemblyDocument
  17.     Set oDoc = oView.ReferencedDocumentDescriptor.ReferencedDocument
  18.     Dim Folder_name As String: Dim FullFileName_new As String
  19.     Dim s1 As String: Dim s2 As String
  20.     s1 = oDoc.FullFileName
  21.     s2 = oDoc.DisplayName
  22.     Folder_name = Replace(s1, s2, "")
  23.     FullFileName_new = Folder_name + "Asm_chng.iam"
  24.    
  25.     oView_new.ReferencedDocumentDescriptor.ReferencedFileDescriptor.ReplaceReference (FullFileName_new)
  26.     oDoc_dwg_new.Update
  27.    
  28.     oView.Delete
  29.     Set oView = oView_new.CopyTo(oSheet)
  30.     oDoc_dwg_new.Close (True)
  31.     oDoc_dwg.Update
  32. End Sub

П.С. Чтобы было понятно, поясню, на чертеже два базовых вида с одной сборки. Создаю новый лист. Копирую вид, чью ссылку надо поменять, на вновь созданный чертеж. Меняю ссылку на другую сборку. Сборка для замена ссылки лежит в той же папке, что и оригинальная, и называется "Asm_chng.iam". Удаляю оригинальный вид, копирую со второго чертежа на первый вид, с измененной ссылкой.
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Замена ссылки для вида на чертеже
« Ответ #5 : 08-09-2016, 16:26:46 »
Великий комбинатор!

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Замена ссылки для вида на чертеже
« Ответ #6 : 08-09-2016, 16:33:14 »
Великий комбинатор!
Ну я так всю жизнь вручную делал. Просто вручную это делается за 10 секунд )) А что делать, если у двух видов на чертеже ссылка на одну модель - то она как бы одна на двоих и не разделяется по видам. Поэтому меняется сразу для двух видов. Вот и приходится хитрить.
В программировании я новичок...но ненадолго! ;)

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Замена ссылки для вида на чертеже
« Ответ #7 : 08-09-2016, 16:35:53 »
Более интересный вопрос, как и ссылку поменять, и сделать так, чтобы новый вид остался тем же (по индексу) в коллекции видов. Чтобы индексы остальных видов не "поплыли".
В программировании я новичок...но ненадолго! ;)

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Замена ссылки для вида на чертеже
« Ответ #8 : 08-09-2016, 16:38:28 »
Имею ввиду, что было бы круто старый вид как бы не удалять, а заменять в коллекции.
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Замена ссылки для вида на чертеже
« Ответ #9 : 09-09-2016, 06:34:39 »
Чтобы индексы остальных видов не "поплыли".
А что что страшного если они поплывут?

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Замена ссылки для вида на чертеже
« Ответ #10 : 09-09-2016, 13:56:12 »
А что что страшного если они поплывут?
Если стоит цель только создание чертежа, тогда ничего. А если цель создать программу, которая может создавать чертежи и корректировать их, в случае изменения модели. То привязка к видам для корректировки, на мой взгляд, будет осуществлять по статическим индексам. То есть если индексы плывут, то и программа перестаёт работать. П.с. Хотя я ещё не пробовал, быть может перебор коллекции с проверкой имён видов позволит отказаться от индексов.
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Замена ссылки для вида на чертеже
« Ответ #11 : 09-09-2016, 16:27:03 »
То привязка к видам для корректировки, на мой взгляд, будет осуществлять по статическим индексам.
Вообще для поиска лучше юзать атрибуты: DrawingView.AttributeSets
туда можно записывать любые текстовые данные, в данном случае пометки подсчета видов.

Причем, поиск атрибутов в документе легко производится через Document.AttributeManager

Вообще многие объекты в АПИ инвентора содержат атрибуты AttributeSets

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Замена ссылки для вида на чертеже
« Ответ #12 : 09-09-2016, 16:44:40 »
Вообще для поиска лучше юзать атрибуты: DrawingView.AttributeSets
Михаил, не могли бы пояснить, как они работают, ну и для чего ими люди пользуются? Я в справке ничего толком не нашел.
В программировании я новичок...но ненадолго! ;)

Оффлайн mikazakov

  • ADN
  • *
  • Сообщений: 751
  • Карма: 195
  • Skype: mikazakov@mail.ru
Re: Замена ссылки для вида на чертеже
« Ответ #13 : 10-09-2016, 06:46:50 »
Михаил, не могли бы пояснить, как они работают, ну и для чего ими люди пользуются? Я в справке ничего толком не нашел.
В справке есть статья-> Inventor API User's Manual::Custom Data::Working with Attributes
Кроме текстовых значений, могут быть другие типы данных. В общем случае атрибуты могут быть:
kBooleanType
kByteArrayType
kDoubleType
kIntegerType
kStringType

Хранить в них можно все что угодно, любую дополнительную информацию, например, на конкретной грани модели можно дописать в какой конкретно её краской красить. А конкретно, в чертежных видах можно хранить собственную нумерацию видов для привязок и сортировок. Это лучше, чем вносить сортировочную информацию в наименование видов, потому как пользователь может менять имена по своему усмотрению, что приведет к ошибкам выполнения AddIn'a.

Иерархически атрибуты похожи на свойства документа AttributeSets похож на PropertySets


Как я уже говорил, искать существующие атрибуты в документе предлагается через  Document.AttributeManager

Оффлайн R.I.Chernov

  • ADN Club
  • *****
  • Сообщений: 565
  • Карма: 18
Re: Замена ссылки для вида на чертеже
« Ответ #14 : 13-09-2016, 16:00:29 »
Спасибо.
В справке есть статья-> Inventor API User's Manual::Custom Data::Working with Attributes
Я прочел эту статью. Правильно ли я понял, что свойство "AttributeSet.Transient Property" отвечает за то, будет ли атрибут удален вместе с закрытием документа? То есть атрибуты можно использовать как временное хранилище данных, а можно и как постоянное?

В справке (в самом конце) есть пометка:
"Autodesk Inventor builds a cache of object-to-AttributeSet links as these links are referenced. This cache greatly reduces access time for subsequent references. You can force Autodesk Inventor to build the entire cache, for all objects, by calling the FindObjects method with no arguments. Then perform your query. Note though that continued modeling operations will destroy the cache."

Не могли бы помочь понять смысл последнего предложения. Что значит "продолжительные операции моделирования могут уничтожить кэш"?
В программировании я новичок...но ненадолго! ;)