Сохранение всех деталей в сборке как STEP с пользовательскими свойствами. Как решить ошибку времени выполнения 91? - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь написать макрос с VBA в Solidworks, который будет go через все подсборки и сохранять каждую деталь как STEP-файл, имя которого определяется пользовательским свойством. У меня нет большого опыта программирования, так как я инженер-механик, но я стараюсь время от времени автоматизировать некоторые процессы. Большую часть этого кода я получил от других, и я попытался настроить его в своей ситуации. Хотя я понимаю большинство происходящих событий.

Проблема, с которой я сталкиваюсь, заключается в том, что я получаю

91 ошибку времени выполнения

Когда Я go для отладки Solidworks говорит мне, что проблема в линии name = swPart.GetTitle. Сначала он сказал «имя = ничего». Я попытался найти проблему, и когда я добавил Set swApp = Application.SldWorks в сабвуфер, я все еще получил ошибку, но теперь имя всегда что-то.

Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Dim swConf As SldWorks.Configuration
Dim swRootComp As SldWorks.Component2
Dim retVal As Boolean
Dim errors As Long, warnings As Long
Dim revision As String
Dim vaultPath As String
Dim name As String
Dim longstatus As Long, longwarnings As Long

Sub main()

Set swApp = Application.SldWorks
Set swAssy = swApp.ActiveDoc
Set swConf = swAssy.GetActiveConfiguration
Set swRootComp = swConf.GetRootComponent3(True)

vaultPath = "C:\Users\Engineering\Desktop\test\" 'set folder for vault (change this later)

TraverseComponent swRootComp, 1, vaultPath

End Sub

Sub TraverseComponent(swComp As SldWorks.Component2, nLevel As Long, vaultPath As String)
    Dim vChilds As Variant, vChild As Variant
    Dim swChildComp As SldWorks.Component2
    Dim MyString As String
    Dim swCustPropMgr As SldWorks.CustomPropertyManager
    Set swApp = Application.SldWorks
    vChilds = swComp.GetChildren
    For Each vChild In vChilds
        Set swChildComp = vChild
        Dim FileName As String
        FileName = swChildComp.GetPathName
        FileName = Left(FileName, InStr(FileName, ".") - 1)
        FileName = Right(FileName, Len(FileName) - InStrRev(FileName, "\"))
        Debug.Print "Part Name    : " & FileName
        MyString = FileName
        Dim ActiveConfig As String
        ActiveConfig = swChildComp.ReferencedConfiguration
        Debug.Print "Configuration: " & ActiveConfig
        FileName = swChildComp.GetPathName
        If UCase(Right(FileName, 6)) = "SLDPRT" Then
            'MsgBox ("part found")
            Dim swPart As SldWorks.ModelDoc2
            Set swPart = swApp.OpenDoc6(swChildComp.GetPathName, 1, 0, "", longstatus, longwarnings)
            'Dim name As String 'I tried adding this but it made no difference
            name = swPart.GetTitle 'get the title of the active document
            'chop the extension off if present
            If Right(name, 7) = ".SLDPRT" Or Right(name, 7) = ".SLDasm" Then
                name = Left(name, Len(name) - 7)
            End If
            Set swCustPropMgr = swPart.Extension.CustomPropertyManager("") 'get properties
            revision = swCustPropMgr.Get("Revision") 'get revision
            retVal = swApp.SetUserPreferenceIntegerValue(swUserPreferenceIntegerValue_e.swStepAP, 214) 'change the step file options
            'save with revision if present
            If revision = "" Or revision = Null Then
            retVal = swPart.Extension.SaveAs(vaultPath & name & ".step", swSaveAsVersion_e.swSaveAsCurrentVersion, swSaveAsOptions_e.swSaveAsOptions_Silent, Nothing, errors, warnings)
            Else
            retVal = swPart.Extension.SaveAs(vaultPath & name & " - Rev " & revision & ".step", swSaveAsVersion_e.swSaveAsCurrentVersion, swSaveAsOptions_e.swSaveAsOptions_Silent, Nothing, errors, warnings)
            End If
            swApp.CloseDoc swPart.GetTitle
        End If
        Debug.Print
        TraverseComponent swChildComp, nLevel + 1, vaultPath
    Next

End Sub

1 Ответ

4 голосов
/ 31 января 2020

Подавленный компонент - не единственная причина, по которой вы можете получить «ничто» после вызова OpenDo c. Это происходит, например, если компонент загружен облегченно или в противном случае загружен не полностью. Тогда вы также не сможете получить данные ModelDo c (PartDo c) объекта-компонента.

Чтобы полностью предотвратить это, вы можете выполнить следующие строки, только если переменная swPart не является ничем.

If (Not swPart Is Nothing) Then 
    name = swPart.GetTitle 'get the title of the active document
    ...
End If

Кроме того, я могу сказать, что вам не обязательно использовать OpenDoc / CloseDo c, поскольку компонент уже загружен в память при загрузке сборки. Поэтому достаточно вызвать GetModelDoc2 дочернего компонента. Но, в конце концов, он ведет себя так же и ничего не возвращает, если компонент загружен не полностью.

set swPart = swChildcomp.GetModelDoc2()
...