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