Edytowanie właściwości z programu Excel dla SolidWorks za pomocą interfejsu API Menedżer dokumentów

Witam;
Chciałbym zmodyfikować właściwości moich projektów Solidworks za pomocą Excela, w tym celu pomyślałem o użyciu API Solidworks " Menedżer dokumentów ".
Dostosowałem więc istniejący kod, aby móc z niego korzystać, ale niestety mam błąd w funkcji biblioteki " Menedżer dokumentów SolidWorks ", dla którego nie mogę znaleźć rozwiązania.

" Składnik ActiveX nie może utworzyć obiektu "

Stanowisko, o którym mowa:

Set swDmDoc = swDmApp.GetDocument(path, docType, readOnly, openDocErr)

Z SwDmDoc = Nic

oto kod (PS: kod wymaga osobistego klucza licencyjnego, którego nie mogę ci pokazać)

Const SW_DM_KEY As String = "Clé perso"

Sub main()
End Sub

Function ConnectToDm() As SwDocumentMgr.SwDMApplication

    Dim swDmClassFactory As SwDocumentMgr.swDmClassFactory
    Dim swDmApp As SwDocumentMgr.SwDMApplication
    
    Set swDmClassFactory = CreateObject("SwDocumentMgr.SwDMClassFactory")
        
    If Not swDmClassFactory Is Nothing Then
        Set swDmApp = swDmClassFactory.GetApplication(SW_DM_KEY)
        Set ConnectToDm = swDmApp
    Else
        Err.Raise vbError, "", "Document Manager SDK is not installed"
    End If
    
End Function

Function OpenDocument(swDmApp As SwDocumentMgr.SwDMApplication, path As String, readOnly As Boolean) As SwDocumentMgr.SwDMDocument10
    
    Dim ext As String
    ext = LCase(Right(path, Len(path) - InStrRev(path, ".")))
    
    Dim docType As SwDmDocumentType
    
    Select Case ext
        Case "sldlfp"
            docType = swDmDocumentPart
        Case "sldprt"
            docType = swDmDocumentPart
        Case "sldasm"
            docType = swDmDocumentAssembly
        Case "slddrw"
            docType = swDmDocumentDrawing
        Case Else
            Err.Raise vbError, "", "Unsupported file type: " & ext
    End Select
    
    Dim swDmDoc As SwDocumentMgr.SwDMDocument10
    Dim openDocErr As SwDmDocumentOpenError
    Set swDmDoc = swDmApp.GetDocument(path, docType, readOnly, openDocErr)
    
    If swDmDoc Is Nothing Then
        Err.Raise vbError, "", "Failed to open document: '" & path & "'. Error Code: " & openDocErr
    End If
    
    Set OpenDocument = swDmDoc
    
End Function

Public Function GETSWPRP(fileName As String, prpNames As Variant, Optional confName As String = "") As Variant
    
    Dim swDmApp As SwDocumentMgr.SwDMApplication
    Dim swDmDoc As SwDocumentMgr.SwDMDocument10
    
try_:
    On Error GoTo catch_
    
    Dim vNames As Variant
            
    If TypeName(prpNames) = "Range" Then
        vNames = RangeToArray(prpNames)
    Else
        vNames = Array(CStr(prpNames))
    End If
    
    Set swDmApp = ConnectToDm()
    Set swDmDoc = OpenDocument(swDmApp, fileName, True)
    
    Dim res() As String
    Dim i As Integer
    ReDim res(UBound(vNames))
    
    Dim prpType As SwDmCustomInfoType
    
    If confName = "" Then
        For i = 0 To UBound(vNames)
            res(i) = swDmDoc.GetCustomProperty(CStr(vNames(i)), prpType)
        Next
    Else
        Dim swDmConf As SwDocumentMgr.SwDMConfiguration10
        Set swDmConf = swDmDoc.ConfigurationManager.GetConfigurationByName(confName)
        If Not swDmConf Is Nothing Then
            For i = 0 To UBound(vNames)
                res(i) = swDmConf.GetCustomProperty(CStr(vNames(i)), prpType)
            Next
        Else
            Err.Raise vbError, "", "Failed to get configuration '" & confName & "' from '" & fileName & "'"
        End If
    End If
    
    GETSWPRP = res
    
    GoTo finally_
    
catch_:
    Debug.Print Err.Description
    Err.Raise Err.Number, Err.Source, Err.Description
finally_:
    If Not swDmDoc Is Nothing Then
        swDmDoc.CloseDoc
    End If

End Function

Public Function SETSWPRP(fileName As String, prpNames As Variant, prpVals As Variant, Optional confName As String = "")
    
    Dim swDmApp As SwDocumentMgr.SwDMApplication
    Dim swDmDoc As SwDocumentMgr.SwDMDocument10
    
try_:
    On Error GoTo catch_
    
    If TypeName(prpNames) <> TypeName(prpVals) Then
        Err.Raise vbError, "", "Property name and value must be of the same type, e.g. either range or cell"
    End If
    
    Dim vNames As Variant
    Dim vVals As Variant
        
    If TypeName(prpNames) = "Range" Then
        
        vNames = RangeToArray(prpNames)
        
        vVals = RangeToArray(prpVals)
        
        If UBound(vNames) <> UBound(vVals) Then
            Err.Raise vbError, "", "Number of cells in the name and value are not equal"
        End If
    Else
        vNames = Array(CStr(prpNames))
        vVals = Array(CStr(prpVals))
    End If
    
    Set swDmApp = ConnectToDm()
    Set swDmDoc = OpenDocument(swDmApp, fileName, False)
    
    Dim i As Integer
    
    If confName = "" Then
        For i = 0 To UBound(vNames)
            swDmDoc.AddCustomProperty CStr(vNames(i)), swDmCustomInfoText, CStr(vVals(i))
            swDmDoc.SetCustomProperty CStr(vNames(i)), CStr(vVals(i))
        Next
    Else
        Dim swDmConf As SwDocumentMgr.SwDMConfiguration10
        Set swDmConf = swDmDoc.ConfigurationManager.GetConfigurationByName(confName)
        
        If Not swDmConf Is Nothing Then
            For i = 0 To UBound(vNames)
                swDmConf.AddCustomProperty CStr(vNames(i)), swDmCustomInfoText, CStr(vVals(i))
                swDmConf.SetCustomProperty CStr(vNames(i)), CStr(vVals(i))
            Next
        Else
            Err.Raise vbError, "", "Failed to get configuration '" & confName & "' from '" & fileName & "'"
        End If
    End If
    
    swDmDoc.Save
    
    SETSWPRP = "OK"
    
    GoTo finally_
    
catch_:
    Debug.Print Err.Description
    Err.Raise Err.Number, Err.Source, Err.Description
finally_:
    If Not swDmDoc Is Nothing Then
        swDmDoc.CloseDoc
    End If
    
End Function

Private Function RangeToArray(vRange As Variant) As Variant
    
    If TypeName(vRange) = "Range" Then
        Dim excelRange As Range
        Set excelRange = vRange
        
        Dim i As Integer
        
        Dim valsArr() As String
        ReDim valsArr(excelRange.Cells.Count - 1)
        
        i = 0
        
        For Each cell In excelRange.Cells
            valsArr(i) = cell.Value
            i = i + 1
        Next
        
        RangeToArray = valsArr
        
    Else
        Err.Raise vbError, "", "Value is not a Range"
    End If
    
End Function

Kod podstawowy:

Z góry dziękuję

Witam
Ponieważ są to funkcje, należy je wywołać w procedurze Main, w przeciwnym razie może być tylko pusta wartość zmiennej SwDmDoc. W przeciwnym razie musisz również zarządzać stanem Tylko do odczytu, w przeciwnym razie nie będzie można zmienić właściwości.

Witam;
Zgadzam się z @Cyril_f i dodam jeszcze, aby sprawdzić, czy załadujesz odniesienie:
Biblioteka typów SwDocumentMgr 2022
(2022 = bieżąca wersja Solidworks)

Pozdrowienia.

2 polubienia

Witajcie Cyril.f i Maclane,

Dziękuję za Twoją opinię, trudno mi zrozumieć, co masz na myśli mówiąc " zadzwoń do nich w głównej procedurze".
Próbowałem je wywołać, wykonując: Wywołanie + nazwa mojej funkcji lub po prostu wpisując nazwę mojej funkcji (Przykład: OpenDocument) i pojawia się błąd:

Czy może mi Pan podać przykład swojego wyjaśnienia?

Z góry dziękuję

Witam
Musisz wywołać funkcję opendocument z oczekiwanymi argumentami, albo jeśli się nie mylę, linię tego typu:

OpenDocument(connecttodm(),FilePath,true)

Musisz połączyć się z licencją, aby korzystać z interfejsu API, ścieżki do pliku docelowego i ustawić wartość true lub false, aby plik był tylko do odczytu, czy nie.

Dziękuję za pomoc, ale to nadal nie działa, moja funkcja " OpenDocument " jest już wywoływana w mojej funkcji GETSWPRP i jeśli wywołam ją w rozdaniu, nic to nie zmienia.

Ścieżka, docty, readonly oraz oppenDocErr są dobrze poinformowane, ale nadal pojawia się błąd " Składnik ActiveX nie może utworzyć obiektu "

Zauważyłem, że może to wynikać z kompatybilności między moim Excelem a Solidworks (32 bity i 64 bity).
Myślisz, że mogę kontynuować ten projekt VBA czy to nie zależy ode mnie tylko od systemu

Pozdrowienia

Czy możesz umieścić swój kompletny kod, który mogę przetestować? (oczywiście bez klucza)

Mile widziany byłby również zrzut ekranu załadowanych bibliotek;
Podejrzewam brak:
Obiekty danych Microsoft ActiveX ... Biblioteka
i
Zestaw rekordów obiektów danych Microsoft ActiveX ... Biblioteka

Możliwe, że jest to również spowodowane błędem podczas kopiowania klucza Menedżera dokumentów.
VB nie akceptuje więcej niż 1023 znaków w wierszu.
(Podział musi mieć postać "tekst, następnie spacja , następnie podkreślenie, następnie podziały wierszy, a następnie reszta tekstu...).

Pozdrowienia.

3 polubienia

Witajcie @Cyril_f i @Maclane,
Dziękuję za odpowiedź
Mój kod:

Const SW_DM_KEY As String = "<>"


Sub main()
'Call OpenDocument(ConnectToDm(), fileName, True)

End Sub

Function ConnectToDm() As SwDocumentMgr.SwDMApplication

    Dim swDmClassFactory As SwDocumentMgr.swDmClassFactory
    Dim swDmApp As SwDocumentMgr.SwDMApplication
    
    Set swDmClassFactory = CreateObject("SwDocumentMgr.SwDMClassFactory")
        
    If Not swDmClassFactory Is Nothing Then
        Set swDmApp = swDmClassFactory.GetApplication(SW_DM_KEY)
        Set ConnectToDm = swDmApp
    Else
        Err.Raise vbError, "", "Document Manager SDK is not installed"
    End If
    
End Function

Function OpenDocument(swDmApp As SwDocumentMgr.SwDMApplication, path As String, readOnly As Boolean) As SwDocumentMgr.SwDMDocument10
    
    Dim ext As String
    ext = LCase(Right(path, Len(path) - InStrRev(path, ".")))
    
    Dim docType As SwDmDocumentType
    
    Select Case ext
        Case "sldlfp"
            docType = swDmDocumentPart
        Case "sldprt"
            docType = swDmDocumentPart
        Case "sldasm"
            docType = swDmDocumentAssembly
        Case "slddrw"
            docType = swDmDocumentDrawing
        Case Else
            Err.Raise vbError, "", "Unsupported file type: " & ext
    End Select
    
    Dim swDmDoc As SwDocumentMgr.SwDMDocument10
    Dim openDocErr As SwDmDocumentOpenError
    Set swDmDoc = swDmApp.GetDocument(path, docType, readOnly, openDocErr)
    
    If swDmDoc Is Nothing Then
        Err.Raise vbError, "", "Failed to open document: '" & path & "'. Error Code: " & openDocErr
    End If
    
    Set OpenDocument = swDmDoc
    
End Function

Public Function GETSWPRP(fileName As String, prpNames As Variant, Optional confName As String = "") As Variant
    
    Dim swDmApp As SwDocumentMgr.SwDMApplication
    Dim swDmDoc As SwDocumentMgr.SwDMDocument10
    
try_:
    On Error GoTo catch_
    
    Dim vNames As Variant
            
    If TypeName(prpNames) = "Range" Then
        vNames = RangeToArray(prpNames)
    Else
        vNames = Array(CStr(prpNames))
    End If
    
    Set swDmApp = ConnectToDm()
    Set swDmDoc = OpenDocument(swDmApp, fileName, True)
    
    Dim res() As String
    Dim i As Integer
    ReDim res(UBound(vNames))
    
    Dim prpType As SwDmCustomInfoType
    
    If confName = "" Then
        For i = 0 To UBound(vNames)
            res(i) = swDmDoc.GetCustomProperty(CStr(vNames(i)), prpType)
        Next
    Else
        Dim swDmConf As SwDocumentMgr.SwDMConfiguration10
        Set swDmConf = swDmDoc.ConfigurationManager.GetConfigurationByName(confName)
        If Not swDmConf Is Nothing Then
            For i = 0 To UBound(vNames)
                res(i) = swDmConf.GetCustomProperty(CStr(vNames(i)), prpType)
            Next
        Else
            Err.Raise vbError, "", "Failed to get configuration '" & confName & "' from '" & fileName & "'"
        End If
    End If
    
    GETSWPRP = res
    
    GoTo finally_
    
catch_:
    Debug.Print Err.Description
    Err.Raise Err.Number, Err.Source, Err.Description
finally_:
    If Not swDmDoc Is Nothing Then
        swDmDoc.CloseDoc
    End If

End Function

Public Function SETSWPRP(fileName As String, prpNames As Variant, prpVals As Variant, Optional confName As String = "")
    
    Dim swDmApp As SwDocumentMgr.SwDMApplication
    Dim swDmDoc As SwDocumentMgr.SwDMDocument10
    
try_:
    On Error GoTo catch_
    
    If TypeName(prpNames) <> TypeName(prpVals) Then
        Err.Raise vbError, "", "Property name and value must be of the same type, e.g. either range or cell"
    End If
    
    Dim vNames As Variant
    Dim vVals As Variant
        
    If TypeName(prpNames) = "Range" Then
        
        vNames = RangeToArray(prpNames)
        
        vVals = RangeToArray(prpVals)
        
        If UBound(vNames) <> UBound(vVals) Then
            Err.Raise vbError, "", "Number of cells in the name and value are not equal"
        End If
    Else
        vNames = Array(CStr(prpNames))
        vVals = Array(CStr(prpVals))
    End If
    
    Set swDmApp = ConnectToDm()
    Set swDmDoc = OpenDocument(swDmApp, fileName, False)
    
    Dim i As Integer
    
    If confName = "" Then
        For i = 0 To UBound(vNames)
            swDmDoc.AddCustomProperty CStr(vNames(i)), swDmCustomInfoText, CStr(vVals(i))
            swDmDoc.SetCustomProperty CStr(vNames(i)), CStr(vVals(i))
        Next
    Else
        Dim swDmConf As SwDocumentMgr.SwDMConfiguration10
        Set swDmConf = swDmDoc.ConfigurationManager.GetConfigurationByName(confName)
        
        If Not swDmConf Is Nothing Then
            For i = 0 To UBound(vNames)
                swDmConf.AddCustomProperty CStr(vNames(i)), swDmCustomInfoText, CStr(vVals(i))
                swDmConf.SetCustomProperty CStr(vNames(i)), CStr(vVals(i))
            Next
        Else
            Err.Raise vbError, "", "Failed to get configuration '" & confName & "' from '" & fileName & "'"
        End If
    End If
    
    swDmDoc.Save
    
    SETSWPRP = "OK"
    
    GoTo finally_
    
catch_:
    Debug.Print Err.Description
    Err.Raise Err.Number, Err.Source, Err.Description
finally_:
    If Not swDmDoc Is Nothing Then
        swDmDoc.CloseDoc
    End If
    
End Function

Private Function RangeToArray(vRange As Variant) As Variant
    
    If TypeName(vRange) = "Range" Then
        Dim excelRange As Range
        Set excelRange = vRange
        
        Dim i As Integer
        
        Dim valsArr() As String
        ReDim valsArr(excelRange.Cells.Count - 1)
        
        i = 0
        
        For Each cell In excelRange.Cells
            valsArr(i) = cell.Value
            i = i + 1
        Next
        
        RangeToArray = valsArr
        
    Else
        Err.Raise vbError, "", "Value is not a Range"
    End If
    
End Function



Mój klucz jest w tej formie:

"Nom: swdocmgr_general-0000," & _
"swdocmgr_previews-0000," & _
"swdocmgr_dimxpert-0000," & _
"swdocmgr_geometry-0000," & _
"swdocmgr_xml-0000," & _
"swdocmgr_tessellation-0000"

Brakuje 2 bibliotek, ale to nie rozwiązuje problemu:
image

Pozdrowienia.

Witam

Dzisiaj mnie nie ma, jutro zobaczę, czy będę dostępny, jeśli nikt wcześniej tam nie był

1 polubienie

Witam
Wydaje mi się, że "Biblioteka obiektów Microsoft Excel 15.0" odpowiada wersji 2013 programu Excel, która, jeśli tak jest w istocie, nie jest kompatybilna z Solidworks 2021, który wydaje się, że posiadasz.
Pozdrowienia

3 polubienia

Witam;
Wspomniany błąd jest zakomentowany (ActiveX...) tutaj.

Pozdrowienia.

3 polubienia

Witam
Nie przeczytałem więc podstawowego artykułu w całości. Skłaniam się więc ku niezgodności pakietu Office. Prawdopodobnie suplementy, które nie istnieją w 2013 roku.

2 polubienia

Witam
Wracam po tym, jak chciałem przetestować po mojej stronie menedżera dokumentów, więc myślę, że twój problem jest związany z twoim kluczem.
Zapomniałem umieścić początek klucza, który odpowiada nazwie mojej firmy i miałem ten aktywny błąd x.
Prawdopodobnie to samo dla Ciebie, musisz wziąć cały klucz przesłany przez SW, który jest zwykle zakodowany w następujący sposób: NazwaFirmy :swdocmgr_general-00000-{31 razy}

Witam

Mam podobny projekt zmiany właściwości oprogramowania z EXCELA.
Ponieważ wszyscy faceci w mojej firmie muszą być w stanie korzystać z tego samego szablonu Excela:

  • Czy możemy zrobić to samo bez wchodzenia w SW?
  • Jeśli nie, jeśli użyję mojego klucza, czy będzie on działał na innych stacjach roboczych/współpracownikach?

Z góry dziękuję.

JnO

Witam;

Powiedziałbym, że wszystko zależy od zakresu właściwości, które mają być modyfikowane...
Technicznie możliwe jest przejście przez Excel + Macro VBA, ale użycie wspólnego szablonu wydaje mi się "ciekawe" w kontekście modyfikacji.
(Patrz samouczek: Korzystanie z programu Microsoft Excel z interfejsem API SolidWorks - SOLIDWORKS API, PDM API, Onshape FeatureScript, Onshape API Training and Services)
(w języku angielskim)

W przypadku kluczy Menedżera dokumentów:
Jeden klucz na stację roboczą (który musi być aktualizowany przy każdej aktualizacji wersji Solidworks)

Skłaniałbym Cię bardziej do narzędzi takich jak "Integracja" (Visiativ) czy "Cad+" ( xarial.com) czy #TASK (Centralna Innowacja), ponieważ nawet jeśli musisz pluć w sedno, ogólny wzrost produktywności jest w większości przypadków znaczny.

Pozdrowienia.

3 polubienia

Mam rzeczywiście dość specyficzną potrzebę. Pracujemy razem, ale przy różnych projektach.
Stworzyłem narzędzie do eksportu BOM-ów z SW w pliku Excel, który otwiera się automatycznie i zawiera makra do reorganizacji BOM dla zakupów.
Często napotykamy błędy właściwości podczas ponownego czytania plików Excela i za każdym razem trzeba ponownie otworzyć 3D, aby zmodyfikować niektóre właściwości i zaktualizować 3D, dlatego chciałbym zmodyfikować właściwości bezpośrednio z tego pliku Excel.

Z tego, co rozumiem, aby uniknąć konieczności otwierania oprogramowania, jestem zmuszony używać kluczy Document Manager, a potrzebujesz jednego na użytkownika. Tak więc mój plik Excela będzie musiał narysować klucz dla każdego użytkownika w określonym folderze.

Dziękuję za te informacje i życzę miłego weekendu!

1 polubienie

Witam
Nie. Wystarczy jeden klucz. Chodzi o Twoją aplikację.
Jest to jeden z głównych zainteresowań tego API. Umożliwia dostęp do właściwości dokumentów programowych na stacjach roboczych bez oprogramowania, a tym samym bez licencji.
Opracowałem narzędzie do raportowania charakterystyk elementów oprogramowania w naszym ERP w formie dodatku Excel. Bez problemu wdraża się go na kilku stacjach roboczych w firmie.
Musisz tylko zaplanować aktualizację API i licencji za każdym razem, gdy oprogramowanie jest zmieniane.
Miłego dnia.

2 polubienia

Czy potwierdzasz @remrem ?
Ponieważ zdecydowałem się NIE zaczynać pracy z Menedżerem dokumentów po odpowiedzi naszego sprzedawcy Solidworks, który twierdził coś przeciwnego!
(z drugiej strony, to oni zainstalowali stację @Zozo_mp (on zrozumie) :crazy_face: (uwaga: nie znalazłem Buźki, który strzela sobie w głowę)... więc teraz mam wątpliwości.)

Pozdrowienia.

Tak.
Czy otrzymałeś swój klucz?
Czy możesz zrobić test na komputerze bez oprogramowania?
Nie mam łatwego dostępu do komputera bez oprogramowania.