Сообщество программистов Autodesk в СНГ
ADN Club => Inventor API => Тема начата: 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Но уменя получается, что уровень активируется только с самой верхней и в самой нижней сборке по дереву, а во всех сборках между ними уровень создается, но не фиксируется его активность. В чем промах?
-
А видишь ли какие-нибудь ошибки, если уберешь On Error Resume Next ?
(кроме индикации повторного создания того же LODа)
Попробуй разделить решение задачи на два этапа.
1. Создание нужного LOD в каждой из подсборок + настройка этого уровня детализации (как опция) + обязательное сохранение всех документов подсборок.
Рекурсивно перебирать компоненты не требуется. У главной сборки есть свойство AllReferencedDocuments, которое возвращает список всех подчиненных документов. Делаешь по ним цикл, фильтруя сборки, и создаешь в них требуемый LOD (+обязательный Save). Не забудь сделать то же самое в главной сборке. После окончания этапа 1 не только в главной, но и во всех дочерних подсборках гарантированно имеется нужный LOD. Сколько вхождений имеет конкретная подсборка – роли уже не играет.
2. Настройка в дереве главной сборки связей по конкретному уровню детализации.
- Активируешь свой уровень детализации «К» в главной сборке.
- Перебирая рекурсивно компоненты дерева главной сборки, во всех найденных подсборках активируешь свой уровень детализации «К». Update + Save после изменений
- + SaveAll через CommandManager.
Как-то так…
Замечал, что после активации другого LODа крайне полезно сразу же сделать update и обновить ссылки на свойства определения сборки (напр., заново получить ссылки на коллекцию компонентов Occurrences – что-то там в определении сборки непростое происходит).
Альтернативный подход заключается в создании компонента-подсборки сразу в заданном уровне детализации AddWithOptions(). Но этим пользоваться не всегда удобно.
-
А видишь ли какие-нибудь ошибки, если уберешь On Error Resume Next ?
Нет никакой индикации - просто макрос перестает выполняться и завершается.
-
Попробуй разделить решение задачи на два этапа.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 нужно делать после каждой активации?
-
И использование SaveAll не помогает согранить активированную запись в середине дерева... Активируется только самая верхняя и самая нижняя в дереве... А промежуточные, получается, только "~1" ?
-
Итак, исходное состояние:
В главной сборке и во всех подсборках уже создан желаемый уровень детализации.
Если его нет, значит он и не нужен.
Вот как может выглядеть вторая фаза настройки – собственно, связывание по 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Многие проверки опущены. Надо тестировать на стабильность в различных ситуациях, но, думаю, идея понятна.
-
Да, теперь полностью работает!
Спасибо!!!
-
Владислав,
если наткнешься на ситуацию, где эта схема настройки LODов не срабатывает, сохрани для меня максимально упрощенный пример, пожалуйста. (для вскрытия :) )
Спасибо.
-
Добрый день! Подскажите пожалуйста, как можно изменить уровень детализации подсборки. Читал здесь но не понял. Делаю так:
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
-
Понял как нужно было:
'установка уровней детализации
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
-
Владислав,
если наткнешься на ситуацию, где эта схема настройки LODов не срабатывает, сохрани для меня максимально упрощенный пример, пожалуйста. (для вскрытия :) )
Спасибо.
Добрый день Владимир Николаевич, я понял что эта схема может не работать при такой процедуре сохранения ThisApplication.CommandManager.ControlDefinitions.Item("AppSaveAllCmd"). Если в сборку например вставлена библиотечная деталь, которая "не получена" из Vault, то есть на диске у этого файла атрибут "только чтение", то при сохранении каждый раз всплывает окно "сохранить как"... а если таких библиотечных деталей в сборке 1000, то и возможности нету вручную каждый раз их "сохранять как", и уж тем более нету возможности всех их получать из волта.... и как тогда сохранять все сборки после смены уровня детализации? :-[
-
Если проблема только в 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
-
Если проблема только в 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
Даже если поменять атрибут "только чтение", то все равно в операции "сохранить как" инвентор требует новое имя для библиотечного документа.
-
Можно проверить режим молчаливого согласия с ответами по умолчанию:
ThisApplication.SilentOperations = true/false
В конце концов, можно попробовать сделать "самодельный" вариант SaveAll, который не беспокоит файлы с атрибутом read only (его наличие ведь можно проверить, так?). Список всех документов - кандидатов на сохранение - живет в коллекции AllReferencedDocuments() документа главной сборки.
-
Можно проверить режим молчаливого согласия с ответами по умолчанию:
ThisApplication.SilentOperations = true/false
В конце концов, можно попробовать сделать "самодельный" вариант SaveAll, который не беспокоит файлы с атрибутом read only (его наличие ведь можно проверить, так?). Список всех документов - кандидатов на сохранение - живет в коллекции AllReferencedDocuments() документа главной сборки.
Я просто не могу понять, если я делаю oDoc.AllReferencedDocuments.Item(j).Save для всех необходимых документов, то всплывает диалог, в котором я должен вручную соглашаться с сохранением, а как сделать чтобы он не всплывал?
-
ThisApplication.SilentOperations = true/false
подавляет лишние вопросы, подстаявляя в диалоги ответ по умолчанию.
Это не помогает?
-
ThisApplication.SilentOperations = true/false
Это я пробовал, но не работает, если писать ThisApplication.SilentOperations = true, то выдает ошибку "object doesn't support this property or method", а если писать ThisApplication.SilentOperations = true/false, то пишет "Division by zero"
-
а если писать ThisApplication.SilentOperations = true/false
Вообще-то Владимир имел в виду альтернативу (или true или false) :) А правда (true) на ложь (false) не делится.
-
если писать 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.
...
Там же есть пример кода.
-
если писать 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.
...
Там же есть пример кода.
ааа)) ясно)) спасибо))) я просто с вашего первого сообщения копировал))) заработало))