Doc Manager API — funkcja GetExternalFeatureReferences3

Witam

Nie mam doświadczenia w korzystaniu z interfejsów API Menedżera dokumentów.

Jest coś, czego nie do końca rozumiem w metodzie GetExternalFeatureReferences3 (ISwDMDocument27).

Środowisko: zestaw z wieloma konfiguracjami, w niektórych konfiguracjach znajdują się komponenty w stanie "usunięte".

Cel: za pomocą Menedżera dokumentów, dla każdej konfiguracji, pobierz listę komponentów (pierwszy poziom), bez tych, które są w stanie "usuniętym".

Osiągnięcie: Używam funkcji GetExternalFeatureReferences3 na obiekcie ISwDMDocument27 , po utworzeniu opcji wyszukiwania.

        ' 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: w opcjach wyszukiwania, niezależnie od tego, czy ustawię NeedSuppress na True czy False, znajduję na mojej liście odniesień zewnętrznych wszystkie komponenty, niezależnie od tego, czy są w "usunięte", czy nie.

Czy jest coś, czego nie zrozumiałem podczas korzystania z tej funkcji?

Czy powinienem raczej przejść przez ekstrakcję xml z  pliku głównego? ( ISwDMDocument::GetXMLStream)

Potrzebuję twojego oświecenia...

 

Edit: Chciałem umieścić cały kod, ale najwyraźniej strona go blokuje...

 

Moim zdaniem funkcja Needsupress szuka usuniętych referencji, a nie usuniętych komponentów.

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

A w szczególności uwagi dotyczące partii:

Aby dowiedzieć się, czy odwołanie jest pominięte:

  1. Wywołaj ISwDMComponent6::P athName , aby ustawić komponent zwracany przez ISwDMDocument15::GetExternalFeatureReferences.
  2. Wywołaj metodę ISwDMComponent::IsSuppressed.

Stany pominięcia wszystkich odniesień zewnętrznych są również przechowywane w dokumencie nadrzędnym. Aby uzyskać te informacje w formacie XML, wywołaj metodę ISwDMDocument::GetXMLStream.

Dla mnie z Call ISwDMComponents6, a następnie Call ISwDSMComonent::ISSuppressed możesz obejść się bez zarządzania za pomocą XML.

Gdybym wszystko dobrze zrozumiał!

Tak, to jest to, co widziałem w dokumencie, ale tak naprawdę nie rozumiem rozróżnienia między "usuniętym odniesieniem" a "usuniętym komponentem"...? (przynajmniej w montażu)

Zobaczę, co mogę zrobić z ISwDMComponent::ISSuppressed

Zagłębiając się w SolidWorks.Interop.swdocumentmgr, zauważyłem, że w obiekcie ISwDMConfiguration17 znajdują się również funkcje GetComponents i GetComponentVisibleByDisplayStateName

Mam wrażenie, że lepiej odpowiada temu czego szukam, przyjrzę się też tej stronie.

 

Nadal uważam, że dokument Document Manager nie jest świetny w porównaniu z dokumentem Solidworks API...

Witam

więc przechodzę przez funkcję getcomponents (w konfiguracji), a następnie sprawdzam stan za pomocą ISwDMComponent::ISSuppressed.

(Mogłem pozostać przy funkcji getexternalreferences3 i wykonać to samo sprawdzanie IsSuppressed, ale funkcja getcomponents wymagała mniej kodu.

    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

W tej funkcji przeglądam wpisy pobrane za pomocą getcomponents, aby sporządzić listę użytych komponentów (plik + konfiguracja) wraz z ich ilością.

Może i jest czyściej, ale działa :)

 

Nadal jestem zainteresowany, czy ktoś może mi wyjaśnić, dlaczego funkcja GetExternalFeatureReferences3 (ISwDMDocument27) nie filtruje usuniętych komponentów po ustawieniu needsuppress na false (różnica między odniesieniem a kompozytem?)

 

Dziękuję

Witam

Wydaje mi się, że jest jeden, który sprawdza drzewo menedżera funkcji, a drugi sprawdza informacje przechowywane w pamięci pliku (asms przechowują w pamięci linki do różnych plików, które wywołują). Stąd pojęcie komponentów i odniesień.

O ile się nie mylę, DocManager pozwala na pracę na plikach bez ich otwierania, stąd prawdopodobnie takie zachowanie w SW na otwartym pliku.