Suche nach Makro-Teilereferenzen

Hallo

 

Ich habe eine kurze Frage zu VBA Sldw-Makros.

In einer Baugruppe möchte ich nach einer "X"-Komponente im Baum suchen, und wenn sie vorhanden ist, ändere ich meine Baugruppe.

 

Die Komponente kann sich auf der ersten Ebene oder in einer Unterbaugruppe befinden.

 

Ich würde mit diesem Code die http://help.solidworks.com/2016/english/api/sldworksapi/get_dependencies_for_open_and_unopened_documents_example_vb.htm beginnen, die es Ihnen ermöglicht, die externen Referenzen zu finden, und Sie passen sie so an, dass sie eine Warnung ausgeben, wenn der besagte Teil in der Liste vorhanden ist

Wenn ich es richtig verstanden habe, wird


es eine explizite Option geben
Sub main()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim vDependent As Variant
    Dim bRet As Boolean
    Dim i As Long
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc (Englisch)
    vDepend = swApp. GetDocumentDependencies2("PartSearch-1", True, True, False)

    If IsEmpty(vDepend) Then
        Debug.Print "    Keine Abhängigkeiten."
        Exit Sub
    else
        boolstatus = "was ich mit meiner Assembly
    End machen möchte If
    Für i = 0 TB (UBound(vDepend) - 1) / 2
        Debug.Print "    " + vDepend(2 * i) + " --> " + vDepend(2 * i + 1)
    Next i
Ende Sub

Was ist der Zweck des bRet? Ich stelle mir vor, dass die letzten drei Zeilen (For i ...) in die verschiedenen Ebenen des Baumes hinabgehen sollen.

Auf jeden Fall vielen Dank für Ihre Antwort

Zum Beispiel, ja, das Wichtige ist auf der Ebene des Bereichs

    Für i = 0 TB (UBound(vDepend) - 1) / 2
    If vDepend(2 * i) = "Messerwelle" Dann MsgBox "Klingenwelle in der Montage vorhanden"
    Weiter i

Oder Sie schieben wie dort ein Steuerelement auf den Namen des Raumes

Option Explizit
Sub main()
    ' Name des ungeöffneten Dokuments
    Const sDefaultName As String = "c:\Programme\solidworks corp\solidworks\samples\tutorial\advdrawings\98food processor.sldasm"
    Dim swApp als SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim sDocName als Zeichenfolge
    Dim vDepend als Variante
    Dim bRet als boolescher Wert
    Sonne i So lang
    Legen Sie swApp = Application.SldWorks fest
    Festlegen von swModel = swApp.ActiveDoc
    Wenn nicht, ist swModel nichts, dann
        sDocName = swModel.GetPathName
    Oder
        sDocName = sStandardname
    Ende, wenn
    vDepend = swApp.GetDocumentDependencies2(sDocName, Wahr, Wahr, Falsch)
    'Debug.Print sDocName
    Wenn IsEmpty(vDepend) dann
        Sub beenden
    Ende, wenn
    Für i = 0 TB (UBound(vDepend) - 1) / 2
    If vDepend(2 * i) = "Messerwelle" Dann MsgBox "Klingenwelle in der Montage vorhanden"
    Weiter i
Ende Sub

In vereinfachter Version und mit Unterstützung für mehrere Teile gesucht

Option Explizit
Sub main()
    Dim swApp als SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim vDepend als Variante
    Dim bRet als boolescher Wert
    Sonne i So lang
    Legen Sie swApp = Application.SldWorks fest
    Festlegen von swModel = swApp.ActiveDoc
    Wenn swModel nichts ist, dann sub beenden
    vDepend = swApp.GetDocumentDependencies2(swModel.GetPathName, Wahr, Wahr, Falsch)
    Wenn IsEmpty(vDepend), dann Sub beenden
    Dim: Ref As Variant
    Für i = 0 TB (UBound(vDepend) - 1) / 2
        Für jedes Ref-In-Array ("Antriebswelle", "Antriebswellenstift")
            If vDepend(2 * i) = Ref Then MsgBox Ref & " ist in der Assembly vorhanden."
        Nächste Ref
    Weiter i
Ende Sub

Die zu ändernde Zeile lautet wie folgt 

Für jedes Ref-In-Array ("Antriebswelle", "Antriebswellenstift")

oder Antriebswelle und Gelenkwellenstift klingen die Namen der gesuchten Teile, Sie können so viele einfügen, wie Sie möchten, solange Sie die Ausrede wiederholen ("X", "Y", "Z", "etc")

2 „Gefällt mir“

Perfekt, ich habe es geschafft zu tun, was ich wollte, ich habe die Funktion entsprechend dem verallgemeinert, was ich tun möchte:

 

Dimmen swApp als Objekt

Teil als Objekt dimmen
Dim boolstatus als boolescher Wert
Dim longstatus As Long, longwarnings As Long

Sub main()

Legen Sie swApp = Application.SldWorks fest

Set Part = swApp.ActiveDoc
        Wenn GetCompInAss("Teil2") = wahr, dann

                             Wenn das Dokument dann Folgendes enthält:
        boolstatus = Part.Extension.SelectByID2("Part2-1@Assembly", "KOMPONENTE", 0, 0, 0, Falsch, 0, Nichts, 0)
        Part.EditDelete   'Löschen
    Ende, wenn
Ende Sub


Funktion GetCompInAss(DocCible als Variante)
    Dim vDepend als Variante
    Dim bRet als boolescher Wert
    Sonne i So lang
    Dim swModel As SldWorks.ModelDoc2
   
    Festlegen von swModel = swApp.ActiveDoc
   
    vDepend = swApp.GetDocumentDependencies2(swModel.GetPathName, Wahr, Wahr, Falsch)
    Wenn IsEmpty(vDepend), dann Funktion beenden
       
     Für i = 0 TB (UBound(vDepend) - 1) / 2
        Wenn vDepend(2 * i) = DocTarget, dann
            GetCompInAss = Wahr
        Ende, wenn
    Debug.Print "    " + vDepend(2 * i) + " --> " + vDepend(2 * i + 1)
    Weiter i
    
Ende-Funktion

 

Letzte Fragen, wozu dient das bRet?  Ich bin gezwungen, das Dokument in der Funktion neu zu verweisen. Diese Art von Redundanz lässt sich nicht vermeiden?

Wenn Sie eine andere Möglichkeit haben, den Code zu vereinfachen, bin ich interessiert.

 

Auf jeden Fall vielen Dank für Ihre Hilfe.

bRet ist im Makro unbrauchbar

Diese kann wie folgt vereinfacht werden

Dimmen swApp als Objekt
Teil als Objekt dimmen
Dim boolstatus als boolescher Wert
Dim longstatus As Long, longwarnings As Long

Sub main()
    Legen Sie swApp = Application.SldWorks fest
    Set Part = swApp.ActiveDoc
    Wenn GetCompInAss("Teil2") = wahr, dann
        Wenn das Dokument dann Folgendes enthält:
        boolstatus = Part.Extension.SelectByID2("Part2-1@Assemblage", "KOMPONENTE", 0, 0, 0, Falsch, 0, Nichts, 0)
        Part.EditDelete   'Löschen
    Ende, wenn
Ende Sub

Funktion GetCompInAss(DocCible als Variante) als boolescher Wert
    Dim vDepend als Variante
    Sonne i So lang
    Dim swModel As SldWorks.ModelDoc2
    Festlegen von swModel = swApp.ActiveDoc
    vDepend = swApp.GetDocumentDependencies2(swModel.GetPathName, Wahr, Wahr, Falsch)
    Wenn IsEmpty(vDepend), dann Funktion beenden
    Für i = 0 TB (UBound(vDepend) - 1) / 2
        Wenn vDepend(2 * i) = DocCible, dann GetCompInAss = true
    Weiter i
Ende-Funktion

Hallo MaD,

Ich habe Ihr Makro zurückbekommen , das gut funktioniert.

Ich möchte die gefundene Komponente ausblenden = > wie mache ich das?

Vielen Dank

Versuchen Sie Folgendes:

Part.EditDelete   'Löschen - Ersetzen durch das folgende
Part.HideComponent2() ' Ausblenden der Komponente