Zoeken naar referentie voor macro-onderdelen

Hallo

 

Ik heb een korte vraag over VBA Sldw macro's.

In een assembly wil ik zoeken naar een "X" component in de boom en als die aanwezig is, dan pas ik mijn assembly aan.

 

Het onderdeel kan zich op het eerste niveau of in een subassemblage bevinden.

 

Ik zou beginnen met deze code , de http://help.solidworks.com/2016/english/api/sldworksapi/get_dependencies_for_open_and_unopened_documents_example_vb.htm waarmee je de externe referenties kunt vinden en je past deze aan zodat ze een waarschuwing geven als het genoemde onderdeel in de lijst aanwezig is

Dus als ik het goed begrijp, geeft


het een expliciete optie
Sub hoofd()
    Dim swApp als SldWorks.SldWorks
    Dim swModel als SldWorks.ModelDoc2
    dim vDepend als variant
    Dim bRet als Booleaanse
    dim i zo lang
    Stel swApp = Application.SldWorks
    in Stel swModel = swApp in.ActiveDoc
    vDepend = swApp. GetDocumentDependencies2("PartSearch-1", True, True, False)

    If IsEmpty(vDepend) dan
        Debug.Print "    Geen afhankelijkheden."
        Exit Sub
    else
        boolstatus = "wat ik wil doen met mijn Assembly
    End If
    Voor i = 0 TB (UBound(vDepend) - 1) / 2
        Debug.Print "    " + vDepend(2 * i) + " --> " + vDepend(2 * i + 1)
    Volgende i
Einde Sub

Wat is het doel van de bRet? Ik stel me voor dat de laatste drie regels (For i ...) naar beneden gaan in de verschillende niveaus van de boom.

In ieder geval bedankt voor je antwoord

Bijvoorbeeld, ja, het belangrijkste zit op het niveau van het gebied

    Voor i = 0 TB (UBound(vDepend) - 1) / 2
    Als vDepend(2 * i) = "bladas" Dan MsgBox "bladas aanwezig in montage"
    volgende i

Of u kunt schuiven zoals er een knop op de naam van de kamer

Optie Expliciete
Sub hoofd()
    (') Naam van het ongeopende document
    Const sDefaultName As String = "c:\program files\solidworks corp\solidworks\samples\tutorial\advdrawings\98food processor.sldasm"
    Dim swApp als SldWorks.SldWorks
    Dim swModel als SldWorks.ModelDoc2
    Dim sDocName als tekenreeks
    Dim vDepend als variant
    Dim bRet als Booleaanse
    Zon i Zo lang
    Stel swApp = Toepassing.SldWorks in
    Stel swModel = swApp.ActiveDoc in
    Zo niet, dan is swModel niets
        sDocName = swModel.GetPathName
    Anders
        sDocName = sDefaultName
    Einde als
    vDepend = swApp.GetDocumentDependencies2(sDocName, True, True, False)
    'Foutopsporing.Print sDocName
    Als IsEmpty(vDepend) dan
        Sub afsluiten
    Einde als
    Voor i = 0 TB (UBound(vDepend) - 1) / 2
    Als vDepend(2 * i) = "bladas" Dan MsgBox "bladas aanwezig in montage"
    volgende i
Einde Sub

In vereenvoudigde versie en met ondersteuning voor verschillende gezochte onderdelen

Optie Expliciete
Sub hoofd()
    Dim swApp als SldWorks.SldWorks
    Dim swModel als SldWorks.ModelDoc2
    Dim vDepend als variant
    Dim bRet als Booleaanse
    Zon i Zo lang
    Stel swApp = Toepassing.SldWorks in
    Stel swModel = swApp.ActiveDoc in
    Als swModel niets is, sluit dan Sub af
    vDepend = swApp.GetDocumentDependencies2(swModel.GetPathName, Waar, Waar, Onwaar)
    Als IsEmpty(vDepend) dan Sub afsluiten
    Dim Ref als variant
    Voor i = 0 TB (UBound(vDepend) - 1) / 2
        Voor elke Ref In Array ("aandrijfas", "aandrijfaspen")
            Als vDepend(2 * i) = Ref, dan is MsgBox Ref & " aanwezig in de assembly."
        Volgende Ref
    volgende i
Einde Sub

De te wijzigen regel is als volgt 

Voor elke Ref In Array ("aandrijfas", "aandrijfaspen")

of aandrijfas en aandrijfas pin klinken de namen van de gezochte onderdelen, je kunt er zoveel plaatsen als je wilt, zolang je de exrituur herhaalt ("X", "Y", "Z", "enz.")

2 likes

Perfect, het is me gelukt om te doen wat ik wilde, ik heb de functie gegeneraliseerd op basis van wat ik wil doen:

 

Dim swApp als object

Deel dimmen als object
Dim boolstatus als Booleaanse
Dim longstatus As Long, longwarnings As Long

Sub hoofd()

Stel swApp = Toepassing.SldWorks in

Deel instellen = swApp.ActiveDoc
        Als GetCompInAss("Part2") = waar dan

                             Als het document vervolgens het volgende presenteert:
        boolstatus = Part.Extension.SelectByID2("Part2-1@Assembly", "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
        Deel.EditDelete   'Verwijderen
    Einde als
Einde Sub


Functie GetCompInAss (DocCible als variant)
    Dim vDepend als variant
    Dim bRet als Booleaanse
    Zon i Zo lang
    Dim swModel als SldWorks.ModelDoc2
   
    Stel swModel = swApp.ActiveDoc in
   
    vDepend = swApp.GetDocumentDependencies2(swModel.GetPathName, Waar, Waar, Onwaar)
    Als IsEmpty (vDepend) dan Exit Functie
       
     Voor i = 0 TB (UBound(vDepend) - 1) / 2
        Als vDepend(2 * i) = DocTarget Dan
            GetCompInAss = Waar
        Einde als
    Debug.Print "    " + vDepend(2 * i) + " --> " + vDepend(2 * i + 1)
    volgende i
    
Functie beëindigen

 

Laatste vragen, waar is de bRet voor?  Ik ben genoodzaakt om het document in de functie kan niet worden vermeden dit soort redundantie ?

Als je een andere onderwerping om de code te vereenvoudigen, ben ik geïnteresseerd.

 

In ieder geval bedankt voor je hulp.

bRet is nutteloos in de macro

Die kan als volgt worden vereenvoudigd

Dim swApp als object
Deel dimmen als object
Dim boolstatus als Booleaanse
Dim longstatus As Long, longwarnings As Long

Sub hoofd()
    Stel swApp = Toepassing.SldWorks in
    Deel instellen = swApp.ActiveDoc
    Als GetCompInAss("Part2") = waar dan
        Als het document vervolgens het volgende presenteert:
        boolstatus = Part.Extension.SelectByID2("Part2-1@Assemblage", "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
        Deel.EditDelete   'Verwijderen
    Einde als
Einde Sub

Functie GetCompInAss (DocCible als variant) als Booleaanse
    Dim vDepend als variant
    Zon i Zo lang
    Dim swModel als SldWorks.ModelDoc2
    Stel swModel = swApp.ActiveDoc in
    vDepend = swApp.GetDocumentDependencies2(swModel.GetPathName, Waar, Waar, Onwaar)
    Als IsEmpty (vDepend) dan Exit Functie
    Voor i = 0 TB (UBound(vDepend) - 1) / 2
        Als vDepend(2 * i) = DocCible, dan is GetCompInAss = True
    volgende i
Functie beëindigen

hallo MaD,

Ik heb  je macro terug, die werkt prima.

Ik wil de gevonden component verbergen => hoe doe ik dat?

Bedankt

Probeer het volgende:

Part.EditDelete   'Delete - Te vervangen door de onderstaande
Part.HideComponent2() ' Verberg de component