Hallo
Ich bin neu in der Verwendung der Document Manager-APIs.
Es gibt etwas, das ich an der GetExternalFeatureReferences3 (ISwDMDocument27)-Methode nicht ganz verstehe.
Umgebung: eine Baugruppe mit mehreren Konfigurationen, in einigen Konfigurationen befinden sich Komponenten im Status "gelöscht".
Ziel: Rufen Sie über den Dokumentenmanager für jede Konfiguration die Liste der Komponenten (erste Ebene) ab, ohne diejenigen, die sich im Status "gelöscht" befinden.
Errungenschaft: Ich verwende die Funktion GetExternalFeatureReferences3 für das ISwDMDocument27-Objekt , nachdem ich die Suchoptionen erstellt habe.
' Get external references
dmExtRefOption = dmDocMgr.GetExternalReferenceOptionObject2
dmExtRefOption.Configuration = vCfgName
dmExtRefOption.NeedSuppress = False
dmSearchOpt = dmDocMgr.GetSearchOptionObject()
dmSearchOpt.SearchFilters = (SwDmSearchFilters.SwDmSearchExternalReference + SwDmSearchFilters.SwDmSearchForPart)
dmExtRefOption.SearchOption = dmSearchOpt
' Gets the paths and filenames of the external references,
' whether the external references are broken, and the names of their
' referenced configurations
numExtRefs = dmDoc.GetExternalFeatureReferences3(dmExtRefOption)
extRefs = dmExtRefOption.ExternalReferences
Problem: Unabhängig davon, ob ich NeedSuppress auf True oder False setze, finde ich in den Suchoptionen alle Komponenten, unabhängig davon, ob sie in "gelöscht" sind oder nicht.
Gibt es etwas, das ich bei der Verwendung dieser Funktion falsch verstanden habe?
Sollte ich lieber die Extraktion des XML-Codes aus der Head-Datei durchführen? ( ISwDMDocument::GetXMLStream)
Ich brauche deine Erleuchtung...
Bearbeiten: Ich wollte den kompletten Code einfügen, aber anscheinend blockiert die Site ihn ...
Meiner Meinung nach sucht die Needsupress-Funktion nach gelöschten Refs, nicht nach gelöschten Komponenten.
Siehe https://help.solidworks.com/2022/english/api/swdocmgrapi/SOLIDWORKS.Interop.swdocumentmgr~SOLIDWORKS.Interop.swdocumentmgr.ISwDMExternalReferenceOption~NeedSuppress.html
Und insbesondere die Bemerkungen der Partei:
Ja, das habe ich im Dokument gesehen, aber ich verstehe den Unterschied zwischen "gelöschter Referenz" und "gelöschter Komponente" nicht wirklich...? (zumindest in einer Baugruppe)
Ich werde sehen, was ich mit ISwDMComponent::ISSuppressed machen kann
Als ich mich mit SolidWorks.Interop.swdocumentmgr befasste, sah ich, dass es auch die Funktionen GetComponents und GetComponentVisibleByDisplayStateName für das ISwDMConfiguration17-Objekt gab
Ich habe den Eindruck, dass es besser dem entspricht, was ich suche, ich werde mir auch diese Seite ansehen.
Ich finde immer noch, dass das Document Manager-Dokument im Vergleich zum Solidworks API-Dokument nicht großartig ist...
Hallo
Also gehe ich durch die getcomponents-Funktion (in der Konfiguration), dann überprüfe ich den Status mit ISwDMComponent::ISSuppressed.
(Ich hätte bei der getexternalreferences3-Funktion bleiben und die gleiche IsSuppressed-Prüfung durchführen können, aber die getcomponents-Funktion erforderte am Ende weniger Code.
Sub Recup_listeComposants()
'reinitialisation de la liste des composants'
ReDim ListeComposants(0)
'drapeaux'
Dim FlagDebut As Boolean
FlagDebut = True
Dim FlagCorrespondance As Boolean
FlagCorrespondance = False
'parcours config'
Dim vComponents As Object
vComponents = swCfg.GetComponents
If Not (IsNothing(vComponents)) Then
Dim swDmComponent As SwDMComponent11
For i = 0 To UBound(vComponents)
swDmComponent = vComponents(i)
'verif composant non supprimé'
If Not swDmComponent.IsSuppressed Then
'ajout à la liste des composants'
'verif si première entrée'
If FlagDebut Then
EntreeListeComposantsNouveau(0) = swDmComponent.PathName
EntreeListeComposantsNouveau(1) = swDmComponent.ConfigurationName
EntreeListeComposantsNouveau(2) = 1
ListeComposants(0) = EntreeListeComposantsNouveau
FlagDebut = False
Else
'verif si entree deja existante (ajout flag)'
For Each EntreeListeComposants In ListeComposants
If (EntreeListeComposants(0) = swDmComponent.PathName And EntreeListeComposants(1) = swDmComponent.ConfigurationName) Then
EntreeListeComposants(2) = EntreeListeComposants(2) + 1
FlagCorrespondance = True
Exit For
Else
FlagCorrespondance = False
End If
Next
'si pas de correspondance, ajout entree'
If Not FlagCorrespondance Then
ReDim Preserve ListeComposants(UBound(ListeComposants) + 1)
ListeComposants(UBound(ListeComposants)) = {swDmComponent.PathName, swDmComponent.ConfigurationName, 1}
End If
End If
End If
Next 'component'
End If
End Sub
In dieser Funktion gehe ich die mit getcomponents abgerufenen Einträge durch, um eine Liste der verwendeten Komponenten (Datei + Konfiguration) mit ihrer Anzahl zu erstellen.
Es gibt vielleicht sauberer, aber es funktioniert:)
Ich bin immer noch interessiert, ob mir jemand erklären kann, warum die GetExternalFeatureReferences3-Funktion (ISwDMDocument27) nicht nach gelöschten Komponenten filtert, wenn Sie needsuppress auf false setzen (der Unterschied zwischen Referenz und Komponente?)
Vielen Dank
Hallo
Ich denke, es gibt einen, der den Feature-Manager-Baum überprüft, und den anderen, der die im Speicher der Datei gespeicherten Informationen überprüft (die asms behalten die Links zu den verschiedenen Dateien, die sie aufrufen, im Speicher). Daher der Begriff der Komponenten und Referenzen.
Wenn ich mich nicht irre, können Sie mit DocManager an Dateien arbeiten, ohne sie zu öffnen, daher wahrscheinlich dieses Verhalten in SW bei einer geöffneten Datei.