LevelOfDetail создание связных уровней

Автор Тема: LevelOfDetail создание связных уровней  (Прочитано 15574 раз)

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

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

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Мне нужно в сборках и похсборках создать отдельной уровень детализации LevelOfDetail
Я рекурсивно вызываю следующий код:

Sub K()
    Set oLODReps = sDoc.ComponentDefinition.RepresentationsManager.LevelOfDetailRepresentations
    Dim oLODRep As LevelOfDetailRepresentation
    Set oLODRep = oLODReps.Add("K")
    sDoc.ComponentDefinition.RepresentationsManager.LevelOfDetailRepresentations.Item("K").Activate (True)
    sDoc.Save
    Call TraverseAsmLevel(sDoc.ComponentDefinition.Occurrences, 1, sDoc)
    sDoc.Save
End Sub
Private Sub TraverseAsmLevel(oOccurrences As ComponentOccurrences, Level As Integer, sDoc As AssemblyDocument)
    Dim oOcc As ComponentOccurrence
        For Each oOcc In oOccurrences
        If oOcc.DefinitionDocumentType = kAssemblyDocumentObject Then
            Dim oLODReps As LevelOfDetailRepresentations
            Dim osDoc As AssemblyDocument
            Set osDoc = oOcc.Definition.Document
            Set oLODReps = osDoc.ComponentDefinition.RepresentationsManager.LevelOfDetailRepresentations
            Dim oLODRep As LevelOfDetailRepresentation
            On Error Resume Next
            Set oLODRep = oLODReps.Add("K")
            oLODRep.Activate (True)
            Call oOcc.SetLevelOfDetailRepresentation("K", True)
            osDoc.Save
            Call TraverseAsmLevel(oOcc.SubOccurrences, Level + 1, osDoc)
        End If
    Next
    ThisApplication.SilentOperation = True
    sDoc.Save
End Sub
Но уменя получается, что уровень активируется только с самой верхней и в самой нижней сборке по дереву, а во всех сборках между ними уровень создается, но не фиксируется его активность. В чем промах?

Оффлайн Владимир Ананьев

  • ADN DevHelp
  • *
  • Сообщений: 148
  • Карма: 8
Re: LevelOfDetail создание связных уровней
« Ответ #1 : 18-10-2013, 22:20:11 »
А видишь ли какие-нибудь ошибки, если уберешь On Error Resume Next ?
(кроме индикации повторного создания того же LODа)

Попробуй разделить решение задачи на два этапа.
1.   Создание нужного LOD в каждой из подсборок + настройка этого уровня детализации (как опция) + обязательное сохранение всех документов подсборок. 
Рекурсивно перебирать компоненты не требуется.  У главной сборки есть свойство AllReferencedDocuments, которое возвращает список всех подчиненных документов.  Делаешь по ним цикл, фильтруя сборки, и создаешь в них требуемый LOD (+обязательный Save).  Не забудь сделать то же самое в главной сборке.  После окончания этапа 1 не только в главной, но и во всех дочерних подсборках гарантированно имеется нужный LOD.  Сколько вхождений имеет конкретная подсборка – роли уже не играет.

2.   Настройка в дереве главной сборки связей по конкретному уровню детализации.
  • Активируешь  свой уровень детализации «К» в главной сборке.
  • Перебирая рекурсивно компоненты дерева главной сборки, во всех найденных подсборках активируешь  свой уровень детализации «К».  Update + Save после изменений
  • + SaveAll через CommandManager.

Как-то так…

Замечал, что после активации другого LODа крайне полезно сразу же сделать update и обновить ссылки на свойства определения сборки (напр., заново получить ссылки на коллекцию компонентов Occurrences  – что-то там в определении сборки непростое происходит).


Альтернативный подход заключается в создании компонента-подсборки сразу в заданном уровне детализации AddWithOptions().  Но этим пользоваться не всегда удобно.

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

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: LevelOfDetail создание связных уровней
« Ответ #2 : 19-10-2013, 09:42:44 »
А видишь ли какие-нибудь ошибки, если уберешь On Error Resume Next ?
Нет никакой индикации - просто макрос перестает выполняться и завершается.

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

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: LevelOfDetail создание связных уровней
« Ответ #3 : 19-10-2013, 09:59:58 »
Попробуй разделить решение задачи на два этапа.1.   Создание нужного LOD в каждой из подсборок
С этим проблем нет - создание нужного уровня у меня идо этого получалось нормально.

Активируешь  свой уровень детализации «К» в главной сборке. Перебирая рекурсивно компоненты дерева главной сборки, во всех найденных подсборках активируешь  свой уровень детализации «К».  Update + Save после изменений
Не зависимо от того делаю я активацию в том же цикле или в отдельном получается следующее:


SaveAll нужно делать после каждой активации?

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

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: LevelOfDetail создание связных уровней
« Ответ #4 : 19-10-2013, 10:34:24 »
И использование SaveAll не помогает согранить активированную запись в середине дерева... Активируется только самая верхняя и самая нижняя в дереве... А промежуточные, получается, только "~1" ?

Оффлайн Владимир Ананьев

  • ADN DevHelp
  • *
  • Сообщений: 148
  • Карма: 8
Re: LevelOfDetail создание связных уровней
« Ответ #5 : 20-10-2013, 02:37:48 »
Итак, исходное состояние:
В главной сборке и во всех подсборках уже создан желаемый уровень детализации.   
Если его нет, значит он и не нужен.

Вот как может выглядеть вторая фаза настройки – собственно, связывание по LODам.
Я проверил на мелкой двухуровневой сборке на пару сотен уникальных деталей, вроде работает.

Sub Main()
  Call SaveAll
  Dim LoDName As String
  LoDName = "Ы"
 
  Dim oMainAssyDoc As AssemblyDocument
  Set oMainAssyDoc = ThisApplication.ActiveDocument
  Dim oMainAssyDef As AssemblyComponentDefinition
  Set oMainAssyDef = oMainAssyDoc.ComponentDefinition
 
  Dim oRepManager As RepresentationsManager
  Set oRepManager = oMainAssyDef.RepresentationsManager
  Dim oLODs As LevelOfDetailRepresentations
  Set oLODs = oRepManager.LevelOfDetailRepresentations

  Dim oLOD As LevelOfDetailRepresentation
  Set oLOD = oLODs.Item(LoDName)
 
  Call oLOD.Activate
  oMainAssyDoc.Save
 
  Call TraverseAsmLevel(oMainAssyDoc.ComponentDefinition.Occurrences, LoDName)
  Call SaveAll
End Sub 'Main

Private Sub TraverseAsmLevel( _
                oOccurrences As ComponentOccurrences, _
                LoDName As String)
  Dim oOcc As ComponentOccurrence
  For Each oOcc In oOccurrences
    If oOcc.DefinitionDocumentType = kAssemblyDocumentObject Then
      If Not (TypeOf oOcc.Definition Is VirtualComponentDefinition) Then
        On Error Resume Next
        Debug.Print "ставим LOD: " & oOcc.Name
        Call oOcc.SetLevelOfDetailRepresentation(LoDName)
        Err.Clear
        On Error GoTo 0
        Call TraverseAsmLevel(oOcc.Definition.Occurrences, LoDName)
      End If
    End If
  Next
End Sub  'TraverseAsmLevel

Private Sub SaveAll()
   Dim oControlDef As ControlDefinition
   Set oControlDef = ThisApplication.CommandManager _
        .ControlDefinitions.Item("AppSaveAllCmd")
   oControlDef.Execute
End Sub
Многие проверки опущены. Надо тестировать на стабильность в различных ситуациях, но, думаю, идея понятна.

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

  • ADN Club
  • ****
  • Сообщений: 265
  • Карма: 2
Re: LevelOfDetail создание связных уровней
« Ответ #6 : 21-10-2013, 13:32:01 »
Да, теперь полностью работает!
Спасибо!!!

Оффлайн Владимир Ананьев

  • ADN DevHelp
  • *
  • Сообщений: 148
  • Карма: 8
Re: LevelOfDetail создание связных уровней
« Ответ #7 : 21-10-2013, 14:39:20 »
Владислав,
если наткнешься на ситуацию, где эта схема настройки LODов не срабатывает, сохрани для меня максимально упрощенный пример, пожалуйста. (для вскрытия :) )
Спасибо.

Оффлайн Павел Тер-Микаэлян

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Re: LevelOfDetail создание связных уровней
« Ответ #8 : 19-09-2014, 16:48:16 »
Добрый день! Подскажите пожалуйста, как можно изменить уровень детализации подсборки. Читал здесь но не понял. Делаю так:

Private Sub Pomogite()

    Dim oApp As Inventor.Application
    Set oApp = ThisApplication
    Dim oDoc As Inventor.Document
    Set oDoc = oApp.ActiveDocument
    Dim oACompDef As AssemblyComponentDefinition
   
'использую LevelOfDetailRepresentation для основной сборки(работает)
    Set oACompDef = oDoc.ComponentDefinition
    oACompDef.RepresentationsManager.LevelOfDetailRepresentations.Item("Мой уров дет").Activate
   
'использую LevelOfDetailRepresentation для подсборок (не работает)
    Set oACompDef = oDoc.ComponentDefinition.Occurrences.ItemByName("Сборка").Definition
        oACompDef.RepresentationsManager.LevelOfDetailRepresentations.Item("Мой уров дет2").Activate
       
'использую SetLevelOfDetailRepresentation для деталей подсборки(не работает)
    Dim ooo As ComponentOccurrence
  For Each ooo In oACompDef.Occurrences
     On Error Resume Next
     Call ooo.SetLevelOfDetailRepresentation("Мой уров дет2", True)
    Next
 
End Sub

Оффлайн Павел Тер-Микаэлян

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Re: LevelOfDetail создание связных уровней
« Ответ #9 : 22-09-2014, 15:43:40 »
Понял как нужно было:
'установка уровней детализации
Private Sub Ustanovka_urov_det_123()

    Dim oDoc As Inventor.AssemblyDocument
    Set oDoc = ThisApplication.ActiveDocument
    Dim oACompDef As AssemblyComponentDefinition
    Set oACompDef = oDoc.ComponentDefinition
'установить уровни детализации подсборок
oACompDef.Occurrences.ItemByName("Сборка").SetLevelOfDetailRepresentation ("2")
oACompDef.Occurrences.ItemByName("Сборка").Definition.Occurrences.ItemByName("Газодод1").SetLevelOfDetailRepresentation ("777")

oDoc.Save
End Sub

Оффлайн Павел Тер-Микаэлян

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Re: LevelOfDetail создание связных уровней
« Ответ #10 : 18-12-2014, 16:40:10 »
Владислав,
если наткнешься на ситуацию, где эта схема настройки LODов не срабатывает, сохрани для меня максимально упрощенный пример, пожалуйста. (для вскрытия :) )
Спасибо.
Добрый день Владимир Николаевич, я понял что эта схема может не работать при такой процедуре сохранения ThisApplication.CommandManager.ControlDefinitions.Item("AppSaveAllCmd"). Если в сборку например вставлена библиотечная деталь, которая "не получена" из Vault, то есть на диске у этого файла атрибут "только чтение", то при сохранении каждый раз всплывает окно "сохранить как"... а если таких библиотечных деталей в сборке 1000, то и возможности нету вручную каждый раз их "сохранять как", и уж тем более нету возможности всех их получать из волта.... и как тогда сохранять все сборки после смены уровня детализации? :-[

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: LevelOfDetail создание связных уровней
« Ответ #11 : 18-12-2014, 17:33:38 »
Если проблема только в ReadOnly, то вообще-то можно программно поменять атрибут файлу. В чем сложность?
http://msdn.microsoft.com/ru-ru/library/system.io.file.setattributes%28v=vs.110%29.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Павел Тер-Микаэлян

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Re: LevelOfDetail создание связных уровней
« Ответ #12 : 18-12-2014, 17:58:19 »
Если проблема только в ReadOnly, то вообще-то можно программно поменять атрибут файлу. В чем сложность?
http://msdn.microsoft.com/ru-ru/library/system.io.file.setattributes%28v=vs.110%29.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1
Даже если поменять атрибут "только чтение", то все равно в операции "сохранить как" инвентор требует новое имя для библиотечного документа.

Оффлайн Владимир Ананьев

  • ADN DevHelp
  • *
  • Сообщений: 148
  • Карма: 8
Re: LevelOfDetail создание связных уровней
« Ответ #13 : 18-12-2014, 18:37:24 »
Можно проверить режим молчаливого согласия с ответами по умолчанию:
ThisApplication.SilentOperations = true/false

В конце концов, можно попробовать сделать "самодельный" вариант SaveAll, который не беспокоит файлы с атрибутом read only  (его наличие ведь можно проверить, так?).  Список всех документов - кандидатов на сохранение - живет в коллекции AllReferencedDocuments() документа главной сборки.

Оффлайн Павел Тер-Микаэлян

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Re: LevelOfDetail создание связных уровней
« Ответ #14 : 18-12-2014, 20:19:01 »
Можно проверить режим молчаливого согласия с ответами по умолчанию:
ThisApplication.SilentOperations = true/false

В конце концов, можно попробовать сделать "самодельный" вариант SaveAll, который не беспокоит файлы с атрибутом read only  (его наличие ведь можно проверить, так?).  Список всех документов - кандидатов на сохранение - живет в коллекции AllReferencedDocuments() документа главной сборки.

Я просто не могу понять, если я делаю oDoc.AllReferencedDocuments.Item(j).Save для всех необходимых документов, то всплывает диалог, в котором я должен вручную соглашаться с сохранением, а как сделать чтобы он не всплывал?