Verwenden des Dokumentenmanagers

Hallo

Ich beginne, den Dokumentenmanager zu verwenden, um meine SOLIDWORKS-Eigenschaften in meiner Excel-Datei abzurufen.
Ich habe im Moment mit 2 Problemen zu kämpfen.
Ich möchte einige Eigenschaften in wörtlicher Schreibweise haben, die sich von dem Namen der Eigenschaft unterscheiden
Beispiel hier, ich möchte einen Wert in kg oder g haben, dasselbe gilt für Eigenschaften wie " Dateiname " usw
image

Und ich hätte auch gerne ein Dropdown-Menü, ohne meine Formel zu überschreiben
Beispiel: Ich könnte einen Revisionsindex mit einem Dropdown-Menü aktualisieren. Ich weiß, dass es mit dem Befehl substitute möglich ist, die Werte zu kopieren und einzufügen, um sie zu aktualisieren, aber das war's.
image

Wenn jemand Vorschläge hat, bin ich dafür.

Sie müssen den geschätzten Wert der Immobilie zurückfordern, nicht den Wert der Immobilie

2 „Gefällt mir“

Hallo

Vielen Dank für Ihre Antwort, haben Sie bitte weitere Details, wie Sie vorgehen sollen?

Vielen Dank.

Posten Sie Ihren Code (natürlich ohne den Schlüssel) oder den betreffenden Teil des Codes.
Persönlich kenne ich den Dokumentenmanager nicht, aber der ausgewertete Wert oder Wertfehler ist in der SW-API derselbe. Abhängig von Ihrem Code beraten wir Sie.

'**********************
"Urheberrecht(C) 2022 Xarial Pty Limited
'Referenz: Excel-Makro zur Verwaltung von benutzerdefinierten Eigenschaften in SOLIDWORKS Dateien
'Lizenz: Lizenz
'**********************

const SW_DM_KEY als Zeichenfolge = "SCHLÜSSEL"

Sub main()
Ende Sub

Funktion ConnectToDm() als 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

Ende-Funktion

Funktion OpenDocument(swDmApp As SwDocumentMgr.SwDMApplication, Pfad 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

Ende-Funktion

Öffentliche Funktion GETSWPRP(fileName As String, prpNames As Variant, Optional confName As String = "") As Variant

Dim swDmApp As SwDocumentMgr.SwDMApplication
Dim swDmDoc As SwDocumentMgr.SwDMDocument10

versuchen_:
Bei Fehler Gehe zu 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_

Ringen_:
Debug.Print Err.Description
Err.Raise Err.Number, Err.Source, Err.Description
endlich_:
Wenn nicht, ist swDmDoc nichts, dann
swDmDoc.CloseDoc
Ende, wenn

Ende-Funktion

Öffentliche Funktion SETSWPRP(Dateiname als Zeichenfolge, prpNames als Variante, prpVals als Variante, optional confName als Zeichenkette = "")

Dim swDmApp As SwDocumentMgr.SwDMApplication
Dim swDmDoc As SwDocumentMgr.SwDMDocument10

versuchen_:
Bei Fehler Gehe zu 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_

Ringen_:
Debug.Print Err.Description
Err.Raise Err.Number, Err.Source, Err.Description
endlich_:
Wenn nicht, ist swDmDoc nichts, dann
swDmDoc.CloseDoc
Ende, wenn

Ende-Funktion

Private Funktion RangeToArray(vRange als Variante) als Variante

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

Ende-Funktion

Tut mir leid, ich weiß nicht viel über den Dokumentenmanager und kann die Antwort nicht finden. Auf der anderen Seite denkt er, dass das Thema gelöst ist, da Sie mich als die beste Antwort gewählt haben, so dass es wenig Chancen gibt, eine andere Antwort auf dieses Thema zu erhalten.

1 „Gefällt mir“

Hallo
Ich benutze diesen Dokumentmanager nicht, aber ich habe möglicherweise eine Spur, also nach dem Erstellen dieser Masseneigenschaft, dem Rekonstruieren und Speichern des Teils,

Wenn es immer noch nicht funktioniert, gibt es diesen Hinweis in Ihrer Referenz


Mit den verwendeten Funktionen vielleicht nicht möglich!
Mit (GetMassProperties Method (ISwDMConfiguration)) ist es möglich

Die Funktion, die problematisch ist, ist GETSWPRP und insbesondere, wenn ich mich nicht irre:
swDmConf.GetCustomProperty
Sehen Sie, um es zu ersetzen durch:
GetAllCustomPropertyNamesAndValues-Methode (ISwDMConfiguration4)
Sehen Sie hier die Funktionen:
https://help.solidworks.com/2021/english/api/swdocmgrapi/SolidWorks.Interop.swdocumentmgr~SolidWorks.Interop.swdocumentmgr.ISwDMConfiguration4~GetAllCustomPropertyNamesAndValues.html
oder auf der Erfassung, wo ich das Teil für den ausgewerteten Wert hervorgehoben habe: