Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  SolidWorks
  Problem Solidworks Makro. Unterdrückte Bauteile löschen.

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS
  
3DEXPERIENCE Conference 2024 | München, eine Veranstaltung am 16.10.2024
Autor Thema:  Problem Solidworks Makro. Unterdrückte Bauteile löschen. (288 / mal gelesen)
Gentek
Mitglied


Sehen Sie sich das Profil von Gentek an!   Senden Sie eine Private Message an Gentek  Schreiben Sie einen Gästebucheintrag für Gentek

Beiträge: 5
Registriert: 18.03.2024

erstellt am: 13. Sep. 2024 10:53    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo zusammen,

ich habe ein Problem mit meinem Makro. Dieses Makro soll alle Bauteile die in einer Baugruppe vorhanden sind überprüfen ob diese unterdrückt sind oder nicht.
Diese sollen wenn Sie unterdrückt sind in ein anderes Array geschrieben werden. Mit diesem Array möchte ich alle Bauteile zusammen löschen.
Ich habe schon ein ähnliches Makro. Dort überprüfe und lösche ich alle Bauteile einzeln. Das funktioniert, auch dauert nur sehr lange.
Als ich dann über den Befehl Multiselect gestolpert bin und gemerkt habe damit kann ich viel schneller löschen wollte ich das Makro umschreiben

Ich vermute das Problem ist dass, das Objekt nicht von dem einen in den anderen Array geschrieben wird.


Option Explicit
    Dim swApp As SldWorks.SldWorks                  'Variable für Applikation deklarieren              (global)
    Dim swModel As SldWorks.ModelDoc2              'Variable für Model deklarieren                    (global)
    Dim swDocType As Integer                        'Variable für Dateityp deklarieren                  (global)
    Dim swModelExt As SldWorks.ModelDocExtension    'Variable für Modelerweiterung deklarieren          (global)
    Dim swAssembly As AssemblyDoc                  'Variable für die geöffnete Baugruppe deklarieren  (global)
    Dim allComponents As Variant                    'Alle Komponenten der geöffneten Baugruppe          (global)
    Dim allDeleteComponents() As Variant            'Alle zu löschenden Komponenten                    (global)
    Dim intI As Long                                'Anzahl der zu löschenden Komponenten              (global)
   


'--------------------------------------------------------------------------------------------------------------------------------------------------------
'Unterdrückte Bauteile aus Baugruppe löschen
'--------------------------------------------------------------------------------------------------------------------------------------------------------
Sub main()

    'Baugruppenabfrage
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swModelExt = swModel.Extension

    'Prüfen ob ein aktives Solidworksmodel vorhanden ist
    If swModel Is Nothing Then
        'Wenn kein aktives Model vorhanden ist dann Makro Ende
        swApp.SendMsgToUser "Kein Dokument geladen!"
        End
    End If

    'Typ des aktiven Solidworksmodel zuweisen
    swDocType = swModel.GetType

    'Prüfen ob das Aktive Solidworksmodel ein Assambly ist
    If swDocType <> swDocASSEMBLY Then
        'Wenn kein Assambly dann Makro Ende
        swApp.SendMsgToUser "Dieses Makro funktioniert nur in einem Assambly"
        End
    End If
       
    LoadComponents

   
End Sub

Sub LoadComponents()
     
    'Baugruppe deklarieren und zuweisen aus Model
    Set swAssembly = swModel
   
    'Alle Bauteile aus Baugruppe auslesen
    allComponents = swAssembly.GetComponents(True) 'true = toplevel / false = childcomponents

    'Alle Bauteile aus Baugruppe zählen
    Dim componentCount As Long
    componentCount = swAssembly.GetComponentCount(True) 'true = toplevel / false = childcomponents
   
    ReDim allDeleteComponents(componentCount - 1)
    Dim boolstatus As Boolean
 

        'Anzahl zu behaltender Bauteile
        intI = 0

        'Anzahl Durchlaufener schleifen
        Dim intJ As Long
        intJ = 0

        'Variable für bauteile in Baugruppe deklarieren
        Dim component As Variant
        For Each component In allComponents

            'Variable für sld Components festgelegt und auslesen
            Dim swComponent2 As SldWorks.component2
            Set swComponent2 = component

            'Unterdrückungsstatus auslesen
            Dim SuppressionState As Integer
            SuppressionState = swComponent2.GetSuppression2

            'Bauteil anzahl die gelöscht werden soll wird ermittelt
            If SuppressionState = swComponentSuppressed Then

                Set allDeleteComponents(intI) = allComponents(intJ)
                'Debug.Print allDeleteComponents(intI)
                Debug.Print SuppressionState & "  " & swComponent2.name
                               
                intI = intI + 1
               
            End If
            Debug.Print SuppressionState & "  " & swComponent2.name

            intJ = intJ + 1
           
        Next

        If intI = 0 Then
        MsgBox "Keine unterdrückten Komponenten vorhanden." & vbNewLine & vbNewLine & "Makro wird beendet!"
        End
        End If
       
        Debug.Print "____"
       
        ReDim allDeleteComponents(intI)

        Dim längearr
        längearr = UBound(allDeleteComponents)
        Debug.Print "____"
        Debug.Print componentCount
        Debug.Print längearr
        Debug.Print intI
        Debug.Print intJ
       
        boolstatus = swModelExt.MultiSelect2(allDeleteComponents, False, Nothing)
        swModel.EditDelete
'        boolstatus = swModelExt.MultiSelect2(allComponents, False, Nothing)

End Sub

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

bk.sc
Ehrenmitglied V.I.P. h.c.
Konstrukteur Sondermaschinenbau



Sehen Sie sich das Profil von bk.sc an!   Senden Sie eine Private Message an bk.sc  Schreiben Sie einen Gästebucheintrag für bk.sc

Beiträge: 2796
Registriert: 18.07.2012

-Solid Works 2019 SP5
-Pro Engineer WF 3

erstellt am: 13. Sep. 2024 11:54    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Gentek 10 Unities + Antwort hilfreich


supkompdelbg2.avi.txt

 
Hallo,

ist der Befehl "Nicht verwendete Feature löschen" aus dem Featurebaum-Kontextmenü hierfür nicht ausreichend? Siehe hierzu das Video (.txt löschen) im Anhang.

In deinem Macro verursacht das

Code:
ReDim allDeleteComponents(intI)

das reseten des Array somit auch das entfernen aller enthalten Objekte, wenn du die vorhandenen Objekte behalten möchtest fehlt das "Zauberwort" Preserve nach dem ReDim (=> ReDim Preserve allDeleteComponents(intI-1)) das keine vorhandenen Objekte gelöscht werden.
Des weiterem juckt sich MultiSelect2 auch nicht was in dem Arry drin ist, ich glaube die Aufgabe hinter MultiSelect2 ist eine andere. 


Gruß
Bernd

------------------
--- Man muß nicht alles wissen, man muß nur wissen wo es steht ---

Staatlich anerkannte Deutschniete  

[Diese Nachricht wurde von bk.sc am 13. Sep. 2024 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Gentek
Mitglied


Sehen Sie sich das Profil von Gentek an!   Senden Sie eine Private Message an Gentek  Schreiben Sie einen Gästebucheintrag für Gentek

Beiträge: 5
Registriert: 18.03.2024

erstellt am: 13. Sep. 2024 13:05    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo, ja das Feature würde auch reichen. Ich möchte nur auch gerne wieder ins Programmieren mehr reinkommen und finde den Fehler einfach nicht.
Ich hab noch ein paar Ideen für Makros bei denen mir es weiterhelfen würde wenn ich den Programmschnipsel am laufen habe.


Das Preserve ist schonmal gut zu wissen. Trotz alle dem scheint in dem Array allDeleteComponents erst nichts anzukommnen.

Das Multiselect funktioniert hier für meinen Fall. Wenn ich den Array allComponents in da einsetzte wird auch entsprechend alles was sich in dem Array befindet.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

bk.sc
Ehrenmitglied V.I.P. h.c.
Konstrukteur Sondermaschinenbau



Sehen Sie sich das Profil von bk.sc an!   Senden Sie eine Private Message an bk.sc  Schreiben Sie einen Gästebucheintrag für bk.sc

Beiträge: 2796
Registriert: 18.07.2012

-Solid Works 2019 SP5
-Pro Engineer WF 3

erstellt am: 13. Sep. 2024 15:08    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Gentek 10 Unities + Antwort hilfreich

Hallo,

die Objecte sind danach schon noch im Arry, nur kann Multiselct2 mit dieser "Art" Objecte wohl nichts anfangen. Ich könnte mir vorstellen das es einfach daran liegt das es sich um Komponenten handelt und wie bereitsgeschrieben die Methode für völlig andere Aufgaben gedacht ist.

Verwende einfach eine Selection bzw. den SelectionsManager in der Schleife.
Ich würdedas z.B. so machen:

Code:
Option Explicit
    Dim swApp As SldWorks.SldWorks                  'Variable für Applikation deklarieren              (global)
    Dim swModel As ModelDoc2              'Variable für Model deklarieren                    (global)
    Dim swDocType As Integer                        'Variable für Dateityp deklarieren                  (global)
    Dim swModelExt As ModelDocExtension    'Variable für Modelerweiterung deklarieren          (global)
    Dim swAssembly As AssemblyDoc                  'Variable für die geöffnete Baugruppe deklarieren  (global)
    Dim allComponents As Variant                    'Alle Komponenten der geöffneten Baugruppe          (global)
    Dim swComponent2 As Component2
    Dim suppresedCompCount As Integer
    Dim boolstatus As Boolean
    Dim longstatus As Long
    Dim i As Integer, j As Integer
   
'--------------------------------------------------------------------------------------------------------------------------------------------------------
'Unterdrückte Bauteile aus Baugruppe löschen
'--------------------------------------------------------------------------------------------------------------------------------------------------------
Sub main()

    'Baugruppenabfrage
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swModelExt = swModel.Extension

    'Prüfen ob ein aktives Solidworksmodel vorhanden ist
    If swModel Is Nothing Then
        'Wenn kein aktives Model vorhanden ist dann Makro Ende
        swApp.SendMsgToUser "Kein Dokument geladen!"
        End
    End If

    'Typ des aktiven Solidworksmodel zuweisen
    swDocType = swModel.GetType

    'Prüfen ob das Aktive Solidworksmodel ein Assambly ist
    If swDocType <> swDocASSEMBLY Then
        'Wenn kein Assambly dann Makro Ende
        swApp.SendMsgToUser "Dieses Makro funktioniert nur in einem Assambly"
        End
    End If
   
    Set swAssembly = swModel
 
    'Alle Bauteile aus Baugruppe auslesen
    allComponents = swAssembly.GetComponents(True) 'true = toplevel / false = childcomponents
   
    swModel.ClearSelection2 (True)
    suppresedCompCount = 0

        For i = 0 To UBound(allComponents)

            Set swComponent2 = allComponents(i)

            If swComponent2.IsSuppressed Then
               
                swComponent2.Select2 True, 1
                suppresedCompCount = suppresedCompCount + 1
             
            End If
         
        Next i

        If suppresedCompCount = 0 Then
            Debug.Print "Nichts zum löschen da"
        Else
            swModel.EditDelete
        End If
       
End Sub


Gruß
Bernd

------------------
--- Man muß nicht alles wissen, man muß nur wissen wo es steht ---

Staatlich anerkannte Deutschniete 

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Christian_W
Ehrenmitglied V.I.P. h.c.
Konstrukteur (Dipl-Ing)


Sehen Sie sich das Profil von Christian_W an!   Senden Sie eine Private Message an Christian_W  Schreiben Sie einen Gästebucheintrag für Christian_W

Beiträge: 3260
Registriert: 04.04.2001

CSWP 12/2015<P>SWX2021sp5 Win10/11
(SWX2016, SWX2012)
proAlpha6.2e00/calinkV9
(Tactonworks)
(Medusa7, NesCAD2010,
solidEdge19)

erstellt am: 16. Sep. 2024 14:57    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Gentek 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von Gentek:
... Trotz alle dem scheint in dem Array allDeleteComponents erst nichts anzukommnen.

Hallo,

du benutzt ja ein 2. Mal das redim.
erst mit voller Anzahl, befüllst es selektiv und dann ein 2. redim zum Abschneiden der nicht befüllten elemente.
Beim 2. fehlt das preserve, da wird es wieder leer.

Sonst setzt mal einen Stop-punkt davor und nimm das Array in die Überwachung.
oder einen Ausdruck wie allDeleteComponents(0).getsuppression2 oder so ähnlich.
dann müsste die Änderung schon sichtbar werden.

Gruß, Christian

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Gentek
Mitglied


Sehen Sie sich das Profil von Gentek an!   Senden Sie eine Private Message an Gentek  Schreiben Sie einen Gästebucheintrag für Gentek

Beiträge: 5
Registriert: 18.03.2024

erstellt am: 24. Sep. 2024 07:44    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Vielen Dank für die Hilfe. Das macht das ganze deutlich schneller. Hätte eigentlich drauf kommen müssen das erst alles auswählen und dann löschen schneller ist .
Ich werde den Schnipsel in mein restliches Programm übernehmen. Da ich meine schnellen Klicker hier kenne brauch ich definitiv eine Fortschrittsanzeige .

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Christian_W
Ehrenmitglied V.I.P. h.c.
Konstrukteur (Dipl-Ing)


Sehen Sie sich das Profil von Christian_W an!   Senden Sie eine Private Message an Christian_W  Schreiben Sie einen Gästebucheintrag für Christian_W

Beiträge: 3260
Registriert: 04.04.2001

CSWP 12/2015<P>SWX2021sp5 Win10/11
(SWX2016, SWX2012)
proAlpha6.2e00/calinkV9
(Tactonworks)
(Medusa7, NesCAD2010,
solidEdge19)

erstellt am: 25. Sep. 2024 10:17    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Gentek 10 Unities + Antwort hilfreich

Aber achtung, wenn du mehrere Konfigurationen hast.

Das Makro löscht dir alle Komponentent, die in der aktiven Konfiguration unterdrückt sind.
Der Befehl "nicht verwendete Komponenten löschen" löscht nur die, die in keiner Konfiguration verwendet sind.

Könnte einen Unterschied machen 

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2024 CAD.de | Impressum | Datenschutz