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 :
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
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.