Doc Manager API – GetExternalFeatureReferences3-Funktion

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:

So finden Sie heraus, ob eine Referenz unterdrückt wird:

  1. Rufen Sie ISwDMComponent6::P athName auf, um die Komponente festzulegen, die von ISwDMDocument15::GetExternalFeatureReferences zurückgegeben wird.
  2. Rufen Sie ISwDMComponent::IsSuppressed auf .

Die Unterdrückungszustände aller externen Verweise werden auch im übergeordneten Dokument gespeichert. Um diese Informationen im XML-Format zu erhalten, rufen Sie ISwDMDocument::GetXMLStream auf.

Für mich kann man mit Call ISwDMComponents6 dann Call ISwDSMComonent::ISSuppressed auf die Verwaltung via XML verzichten.

Wenn ich alles richtig verstanden habe!

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
    • Da

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.