Doc Manager-API - functie GetExternalFeatureReferences3

Hallo

Ik ben nieuw in het gebruik van de API's van Document Manager.

Er is iets dat ik niet helemaal begrijp aan de methode GetExternalFeatureReferences3 (ISwDMDocument27).

Omgeving: een assembly met meerdere configuraties, in sommige configuraties zijn er componenten in de "verwijderde" staat.

Doel: via de Document Manager, voor elke configuratie, de lijst met componenten (eerste niveau) ophalen, zonder deze die zich in de status "verwijderd" bevinden.

Prestatie: Ik gebruik de functie GetExternalFeatureReferences3 op het ISwDMDocument27-object , nadat ik de zoekopties heb gemaakt.

        ' 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

 

Probleem: in de zoekopties, of ik NeedSuppress nu instel op Waar of Onwaar, vind ik in mijn lijst met externe verwijzingen alle componenten, of ze nu "verwijderd" zijn of niet.

Is er iets dat ik verkeerd heb begrepen over het gebruik van deze functie?

Moet ik liever de extractie van de xml uit het  hoofdbestand doorlopen? ( ISwDMDocument::GetXMLStream)

Ik heb je verlichting nodig...

 

Edit: Ik wilde de volledige code plaatsen, maar blijkbaar blokkeert de site het...

 

Naar mijn mening zoekt de Needsupress-functie naar verwijderde refs, niet naar verwijderde componenten.

Bekijk https://help.solidworks.com/2022/english/api/swdocmgrapi/SOLIDWORKS.Interop.swdocumentmgr~SOLIDWORKS.Interop.swdocumentmgr.ISwDMExternalReferenceOption~NeedSuppress.html

En meer in het bijzonder merkt de partoie op:

Ga als volgt te werk om erachter te komen of een verwijzing is onderdrukt:

  1. Roep ISwDMComponent6::P athName aan om het onderdeel in te stellen dat wordt geretourneerd door ISwDMDocument15::GetExternalFeatureReferences.
  2. Roep ISwDMComponent::IsSuppressed.

De onderdrukkingsstatussen van alle externe verwijzingen worden ook opgeslagen in het bovenliggende document. Als u deze informatie in XML-indeling wilt verkrijgen, roept u ISwDMDocument::GetXMLStream aan.

Voor mij met Call ISwDMComponents6 then Call ISwDSMComonent::ISSuppressed kun je het doen zonder het beheer via XML.

Als ik alles goed begrepen heb!

Ja, dat is wat ik zag in het document, maar ik begrijp niet echt het onderscheid tussen "verwijderde verwijzing" en "verwijderde component"...? (in ieder geval in een vergadering)

Ik zal zien wat ik kan doen met ISwDMComponent::ISSuppressed

Toen ik in SolidWorks.Interop.swdocumentmgr dook, zag ik dat er ook GetComponents en GetComponentVisibleByDisplayStateName functies waren op het ISwDMConfiguration17-object

Ik heb de indruk dat het beter overeenkomt met wat ik zoek, ik zal ook naar deze kant kijken.

 

Ik vind nog steeds dat het Document Manager-document niet geweldig is, vergeleken met het Solidworks API-document ...

Hallo

dus ik doorloop de getcomponents functie (op de config), dan controleer ik de status met ISwDMComponent::ISSuppressed.

(Ik had bij de getexternalreferences3-functie kunnen blijven en dezelfde IsSuppressed-controle kunnen uitvoeren, maar de getcomponents-functie vereiste uiteindelijk minder 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 deze functie ga ik door de items die zijn opgehaald met getcomponents om een lijst te maken van de gebruikte componenten (bestand + configuratie) met hun hoeveelheid.

Er kan schoner, maar het werkt:)

 

Ik ben nog steeds geïnteresseerd, als iemand mij kan uitleggen waarom de GetExternalFeatureReferences3 functie (ISwDMDocument27) niet filtert op verwijderde componenten wanneer je needsuppress instelt op false (het verschil tussen reference en componant?)

 

Bedankt

Hallo

Ik denk dat er een is die de functiebeheerboom controleert en de andere controleert de informatie die in het geheugen van het bestand is opgeslagen (de asms houden de links naar de verschillende bestanden die ze aanroepen in het geheugen). Vandaar het begrip componenten en verwijzingen.

Tenzij ik me vergis, stelt DocManager je in staat om aan bestanden te werken zonder ze te openen, vandaar waarschijnlijk dit gedrag in SW op een geopend bestand.