Doc Manager API - fonction GetExternalFeatureReferences3

Bonjour,

Je débute dans l'utilisation des API Document Manager.

Il y a un truc que je ne comprends pas bien dans la méthode GetExternalFeatureReferences3 (ISwDMDocument27).

environnement: un assemblage avec plusieurs configs, dans certaines configs il y a des composants à l'état "supprimé".

objectif: via le document manager, pour chaque config, récupérer la liste des composants (premier niveau), sans ceux qui sont à l'état "supprimé".

réalisation: j'utilise la fonction GetExternalFeatureReferences3 sur l'objet ISwDMDocument27 , après avoir créé les options de recherche.

        ' 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

 

problème: dans les options de recherche, que je mette NeedSuppress à True ou à False, je retrouve dans ma liste de références externes tous les composants, qu'ils soient en "supprimé" ou non.

Est-ce qu'il y a un truc que j'ai mal compris sur l'utilisation de cette fonction ?

Est-ce que je devrais plutôt passer par l'extraction du xml du  fichier de tête ? ( ISwDMDocument::GetXMLStream)

J'ai besoin de vos lumières...

 

Edit: je voulais mettre le code complet, mais apparemment le site le bloque...

 

A mon avis la fonction Needsupress cherche les ref suprimé pas les composants supprimés.

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

Et plus particulièrement la partoie remarque :

To find out if a reference is suppressed:

  1. Call ISwDMComponent6::PathName to set the component returned by ISwDMDocument15::GetExternalFeatureReferences.
  2. Call ISwDMComponent::IsSuppressed.

The suppression states of all of the external references are also stored in the parent document. To obtain this information in XML format, call ISwDMDocument::GetXMLStream.

Pour moi avec Call ISwDMComponents6 puis Call ISwDSMComonent::ISSuppressed tu peux te passer de la gestion via XML.

Si j'ai tout bien compris!

Oui c'est bien ce que j'avais vu dans la doc, mais je ne comprends pas bien la distinction entre "reference supprimée" et "composant supprimé"... ? (en tout cas dans un assemblage)

Je vais voir ce que je peux faire avec ISwDMComponent::ISSuppressed

En fouillant dans SolidWorks.Interop.swdocumentmgr, j'ai vu qu'il y avait également les fonctions GetComponents et GetComponentVisibleByDisplayStateName sur l'objet ISwDMConfiguration17

J'ai l'impression que ça correspond mieux à ce que je recherche, je vais aussi regarder de ce coté là.

 

Je trouve quand même que la doc du Document Manager est pas terrible, comparée à la doc des API Solidworks...

Bonjour,

du coup je passe par la fonction getcomponents (sur la config), puis je vérifie l'état avec ISwDMComponent::ISSuppressed.

(j'aurais pu rester avec la fonction getexternalreferences3, et faire la même verif IsSuppressed, mais la fonction getcomponents me demandait moins de code au final.

    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

Dans cette fonction je parcours les entrées récupérées avec getcomponents pour me refaire une liste des composants utilisés (fichier + config) avec leur quantité.

Il y a peut-être plus propre, mais ça fonctionne :)

 

Je reste interessé, si quelqu'un peut m'expliquer pourquoi la fonction GetExternalFeatureReferences3 (ISwDMDocument27) ne filtre pas les composants supprimés quand on met needsuppress à false (la difference entre reference et componant ?)

 

Merci

Bonjour,

Je pense qu'il y en a un qui vérifie l'arborescence du feature manager et l'autre vérifie les informations stockés en mémoire du fichier (les asm conservent en mémoire les liens vers les différents fichiers qu'ils appellent). D'où la notion de composants et de références.

Sauf erreur de ma part DocManager permet de travailler sur les fichiers sans les ouvrir d'où probablement ce comportement dans SW sur un fichier ouvert.