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

ADN Club => Inventor API => Тема начата: filat от 18-10-2013, 16:03:16

Название: LevelOfDetail создание связных уровней
Отправлено: filat от 18-10-2013, 16:03:16
Мне нужно в сборках и похсборках создать отдельной уровень детализации 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
Но уменя получается, что уровень активируется только с самой верхней и в самой нижней сборке по дереву, а во всех сборках между ними уровень создается, но не фиксируется его активность. В чем промах?
Название: Re: LevelOfDetail создание связных уровней
Отправлено: Владимир Ананьев от 18-10-2013, 22:20:11
А видишь ли какие-нибудь ошибки, если уберешь On Error Resume Next ?
(кроме индикации повторного создания того же LODа)

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

2.   Настройка в дереве главной сборки связей по конкретному уровню детализации.

Как-то так…

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


Альтернативный подход заключается в создании компонента-подсборки сразу в заданном уровне детализации AddWithOptions().  Но этим пользоваться не всегда удобно.
Название: Re: LevelOfDetail создание связных уровней
Отправлено: filat от 19-10-2013, 09:42:44
А видишь ли какие-нибудь ошибки, если уберешь On Error Resume Next ?
Нет никакой индикации - просто макрос перестает выполняться и завершается.
Название: Re: LevelOfDetail создание связных уровней
Отправлено: filat от 19-10-2013, 09:59:58
Попробуй разделить решение задачи на два этапа.1.   Создание нужного LOD в каждой из подсборок
С этим проблем нет - создание нужного уровня у меня идо этого получалось нормально.

Активируешь  свой уровень детализации «К» в главной сборке. Перебирая рекурсивно компоненты дерева главной сборки, во всех найденных подсборках активируешь  свой уровень детализации «К».  Update + Save после изменений
Не зависимо от того делаю я активацию в том же цикле или в отдельном получается следующее:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Ff3.s.qip.ru%2FadNBVn7S.jpg&hash=c5f29e9225ff4d80a9e72880e0d7bd31) (http://shot.qip.ru/008HiH-3adNBVn7S/)

SaveAll нужно делать после каждой активации?
Название: Re: LevelOfDetail создание связных уровней
Отправлено: filat от 19-10-2013, 10:34:24
И использование SaveAll не помогает согранить активированную запись в середине дерева... Активируется только самая верхняя и самая нижняя в дереве... А промежуточные, получается, только "~1" ?
Название: Re: LevelOfDetail создание связных уровней
Отправлено: Владимир Ананьев от 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
Многие проверки опущены. Надо тестировать на стабильность в различных ситуациях, но, думаю, идея понятна.
Название: Re: LevelOfDetail создание связных уровней
Отправлено: filat от 21-10-2013, 13:32:01
Да, теперь полностью работает!
Спасибо!!!
Название: Re: LevelOfDetail создание связных уровней
Отправлено: Владимир Ананьев от 21-10-2013, 14:39:20
Владислав,
если наткнешься на ситуацию, где эта схема настройки LODов не срабатывает, сохрани для меня максимально упрощенный пример, пожалуйста. (для вскрытия :) )
Спасибо.
Название: Re: LevelOfDetail создание связных уровней
Отправлено: Павел Тер-Микаэлян от 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
Название: Re: LevelOfDetail создание связных уровней
Отправлено: Павел Тер-Микаэлян от 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
Название: Re: LevelOfDetail создание связных уровней
Отправлено: Павел Тер-Микаэлян от 18-12-2014, 16:40:10
Владислав,
если наткнешься на ситуацию, где эта схема настройки LODов не срабатывает, сохрани для меня максимально упрощенный пример, пожалуйста. (для вскрытия :) )
Спасибо.
Добрый день Владимир Николаевич, я понял что эта схема может не работать при такой процедуре сохранения ThisApplication.CommandManager.ControlDefinitions.Item("AppSaveAllCmd"). Если в сборку например вставлена библиотечная деталь, которая "не получена" из Vault, то есть на диске у этого файла атрибут "только чтение", то при сохранении каждый раз всплывает окно "сохранить как"... а если таких библиотечных деталей в сборке 1000, то и возможности нету вручную каждый раз их "сохранять как", и уж тем более нету возможности всех их получать из волта.... и как тогда сохранять все сборки после смены уровня детализации? :-[
Название: Re: LevelOfDetail создание связных уровней
Отправлено: Александр Ривилис от 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
Название: Re: LevelOfDetail создание связных уровней
Отправлено: Павел Тер-Микаэлян от 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
Даже если поменять атрибут "только чтение", то все равно в операции "сохранить как" инвентор требует новое имя для библиотечного документа.
Название: Re: LevelOfDetail создание связных уровней
Отправлено: Владимир Ананьев от 18-12-2014, 18:37:24
Можно проверить режим молчаливого согласия с ответами по умолчанию:
ThisApplication.SilentOperations = true/false

В конце концов, можно попробовать сделать "самодельный" вариант SaveAll, который не беспокоит файлы с атрибутом read only  (его наличие ведь можно проверить, так?).  Список всех документов - кандидатов на сохранение - живет в коллекции AllReferencedDocuments() документа главной сборки.
Название: Re: LevelOfDetail создание связных уровней
Отправлено: Павел Тер-Микаэлян от 18-12-2014, 20:19:01
Можно проверить режим молчаливого согласия с ответами по умолчанию:
ThisApplication.SilentOperations = true/false

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

Я просто не могу понять, если я делаю oDoc.AllReferencedDocuments.Item(j).Save для всех необходимых документов, то всплывает диалог, в котором я должен вручную соглашаться с сохранением, а как сделать чтобы он не всплывал?
Название: Re: LevelOfDetail создание связных уровней
Отправлено: Владимир Ананьев от 18-12-2014, 20:23:31
ThisApplication.SilentOperations = true/false
подавляет лишние вопросы, подстаявляя в диалоги ответ по умолчанию. 
Это не помогает?
Название: Re: LevelOfDetail создание связных уровней
Отправлено: Павел Тер-Микаэлян от 19-12-2014, 14:20:23
ThisApplication.SilentOperations = true/false
Это я пробовал, но не работает, если писать ThisApplication.SilentOperations = true, то выдает ошибку "object doesn't support this property or method", а если писать ThisApplication.SilentOperations = true/false, то пишет "Division by zero"
Название: Re: LevelOfDetail создание связных уровней
Отправлено: Александр Ривилис от 19-12-2014, 14:49:37
а если писать ThisApplication.SilentOperations = true/false
Вообще-то Владимир имел в виду альтернативу (или true или false) :) А правда (true) на ложь (false) не делится. 
Название: Re: LevelOfDetail создание связных уровней
Отправлено: Владимир Ананьев от 19-12-2014, 14:57:02
Цитировать
если писать ThisApplication.SilentOperations = true, то выдает ошибку "object doesn't support this property or method"

В имени свойства закралась лишняя буковка 's'  :(

Объект Inventor.Application поддерживает своство SilentOperation.  Вот выдержка из Inventor API Help:

Application.SilentOperation Property
Parent Object: Application
Description
Gets/sets the Boolean flag that controls whether an operation will proceed without prompting (if that gets required...e.g.: error message dismissal). If Autodesk Inventor is running visible, this property is FALSE by default.
...

Там же есть пример кода.
Название: Re: LevelOfDetail создание связных уровней
Отправлено: Павел Тер-Микаэлян от 19-12-2014, 16:06:01
Цитировать
если писать ThisApplication.SilentOperations = true, то выдает ошибку "object doesn't support this property or method"

В имени свойства закралась лишняя буковка 's'  :(

Объект Inventor.Application поддерживает своство SilentOperation.  Вот выдержка из Inventor API Help:

Application.SilentOperation Property
Parent Object: Application
Description
Gets/sets the Boolean flag that controls whether an operation will proceed without prompting (if that gets required...e.g.: error message dismissal). If Autodesk Inventor is running visible, this property is FALSE by default.
...

Там же есть пример кода.
ааа)) ясно)) спасибо))) я просто с вашего первого сообщения копировал))) заработало))