Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  SolidWorks
  Alle Blöcke in Zeichnung auflösen und danach löschen - Makro-Problem

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
  
AMB 2024
Autor Thema:  Alle Blöcke in Zeichnung auflösen und danach löschen - Makro-Problem (1163 / mal gelesen)
CAD-Maler
Mitglied
Konstrukteur / CAD-Admin / Mädchen für alles


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

Beiträge: 720
Registriert: 17.01.2007

SWX 2019 SP5
AutoCAD 2019
Win 10 pro 64 bit
Intel(R) Xeon(R) CPU E5-1650 v4 @ 3.60GHz
64GB RAM
Nvidia Quadro M5000
SWx EPDM

erstellt am: 14. Apr. 2016 09:48    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 WBF!

Ich habe mir ein Makro geschrieben, was alle Blöcke in einer Zeichnung (auch im Blattformat) erst auflöst und danach die Reste noch entfernt.

Code:

Option Explicit

Sub ExplodeAllBlocks()

Dim swApp As Object
Dim DrawingDoc As Object
Dim i, j, k, l As Long
Dim BlattformatName, BlockName As String
Dim SketchMgr As SldWorks.SketchManager
Dim swBlockDef As SldWorks.SketchBlockDefinition
Dim vBlockDef As Variant
Dim vBlockInst As Variant
Dim AnzahlBl, Blockanzahl As Long
Dim SheetName As String
Dim Sheet As Object
Dim retval, Features As Variant
Dim Feature, swFeat As SldWorks.Feature
Dim boolstatus As Boolean

   
    Set swApp = Application.SldWorks
    Set DrawingDoc = swApp.ActiveDoc
    Set Feature = DrawingDoc.FirstFeature
   
    AnzahlBl = DrawingDoc.GetSheetCount
    Set Sheet = DrawingDoc.GetCurrentSheet

    SheetName = Sheet.GetName

    'Auf erstes Blatt springen
    For l = 1 To AnzahlBl - 1
        DrawingDoc.SheetPrevious
        Set Sheet = DrawingDoc.GetCurrentSheet
        If (SheetName = Sheet.GetName) Then
            Exit For
        End If
        SheetName = Sheet.GetName
    Next l
   
    'Alle Blöcke auflösen, die direkt auf dem Blatt liegen
    For l = 1 To AnzahlBl

        Set Sheet = DrawingDoc.GetCurrentSheet
       
        'Nebenbei Blätter umbenennen
        SheetName = "Blatt" & l
        Sheet.SetName (SheetName)
           
       
        DrawingDoc.EditSketch
        DrawingDoc.ClearSelection2 True
       
        Set SketchMgr = DrawingDoc.SketchManager
       
        vBlockDef = SketchMgr.GetSketchBlockDefinitions
                       
            ' Exit if no blocks
            If IsEmpty(vBlockDef) Then
                Exit Sub
            End If
       
        If Not IsEmpty(vBlockDef) Then
   
            For i = 0 To UBound(vBlockDef)
           
                Set swBlockDef = vBlockDef(i)
                   
                vBlockInst = swBlockDef.GetInstances
                       
                If Not IsEmpty(vBlockInst) Then
               
                    For j = 0 To UBound(vBlockInst)
                   
                        SketchMgr.ExplodeSketchBlockInstance vBlockInst(j)
                                           
                    Next j
                       
                End If
                           
            Next i
       
        End If
       
        If AnzahlBl > l Then
            DrawingDoc.SheetNext
        End If
       
    Next l
   
    DrawingDoc.ActivateSheet ("Blatt1")
   
    'Alle Blöcke auflösen, die im Blattformat liegen
    Do While Not Feature Is Nothing
       
        If Feature.GetTypeName() = "DrSheet" Then

            BlattformatName = Feature.Name

            boolstatus = DrawingDoc.Extension.SelectByID2(BlattformatName, "SHEET", 0, 0, 0, False, 0, Nothing, 0)

            DrawingDoc.EditTemplate
            DrawingDoc.EditSketch
            DrawingDoc.ClearSelection2 True

            Set SketchMgr = DrawingDoc.SketchManager

            vBlockDef = SketchMgr.GetSketchBlockDefinitions

                ' Exit if no blocks
                    If IsEmpty(vBlockDef) Then
                    Exit Sub
                    End If

            If Not IsEmpty(vBlockDef) Then

                For i = 0 To UBound(vBlockDef)

                    Set swBlockDef = vBlockDef(i)

                    vBlockInst = swBlockDef.GetInstances

                    If Not IsEmpty(vBlockInst) Then

                        For j = 0 To UBound(vBlockInst)

                            SketchMgr.ExplodeSketchBlockInstance vBlockInst(j)

                        Next j
                    End If
                Next i

            End If

          DrawingDoc.ClearSelection2 True
          DrawingDoc.EditSheet
          DrawingDoc.SheetNext

        End If

    Set Feature = Feature.GetNextFeature
    Loop

    'Alle Blöcke löschen
   
    Set swFeat = swBlockDef.GetFeature

    Do While Not swFeat Is Nothing
   
        If swFeat.GetTypeName() = "SketchBlockDef" Then

            retval = swFeat.Select2(False, -1)
   
            retval = DrawingDoc.DeleteSelection(False)
   
        End If
       
        DrawingDoc.ClearSelection2 True
   
        Set swFeat = swFeat.GetNextFeature
       
    Loop

End Sub


Das kann man sicherlich auch komfortabler und/oder hübscher lösen, aber es tut erstmal, was es soll. (Verbesserungsvorschläge sind gern gesehen  )

Fast zumindest.

Die Blöcke werden alle aufgelöst. Bei der letzten Schleife allerdings wird immer nur die erste Blockdef. gelöscht. Die Zeile

Code:

Set swFeat = swFeat.GetNextFeature

liefert mir immer "nothing" zurück und damit bricht die Schleife ab.

Hier fehlt mir der zündende Gedanke, wie ich mir die jeweils nächste Blockdef. greifen kann. Über den Blöcke-Ordner (BlockFolder) bekomme ich sie auch nicht gefasst, im Gegensatz zu den Feature-Ordnern kann ich mir die enthaltenen Elemente nicht ausgeben lassen.

Hat irgendjemand den korrekten Befehl/Code/Hinweis für das Problem?

Gruß und Dank, Jens

------------------
CSWA, CSWP =)

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

StefanBerlitz
Guter-Geist-Moderator
IT Admin (CAx)



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

Beiträge: 8756
Registriert: 02.03.2000

SunZu sagt:
Analysiere die Vorteile, die
du aus meinem Ratschlag ziehst.
Dann gliedere deine Kräfte
entsprechend und mache dir
außergewöhnliche Taktiken zunutze.

erstellt am: 14. Apr. 2016 10:33    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 CAD-Maler 10 Unities + Antwort hilfreich

Hallo Jens,

ich kenne leider auch nur einen Weg von hinten durch die Brust ins Auge. Um an die Blockdefinitionen zu kommen gehst du ja wie oben gezeigt über den Sketchmanager, und von den Blockdefinitionen kommst du an deren Feature. Vom Feature bekommst du den Namen und über den Namen kannst du es selektieren und löschen   

Wenn ich dich richtig verstanden habe möchtest du nach dem Explodieren noch die restlichen Blockdefinitionen wegräumen. Also Quick&Dirty Makro könnte das so aussehen:

Code:
' **************************************************************************
' * Beispiel: alle Blockdefinitionen (und damit auch alle Blockinstanzen
' * auf allen Blättern) aus der aktuellen Zeichnung löschen
' *
' * Stefan Berlitz
' * 14.04.2016
' **************************************************************************

Sub main()

    Dim swApp               As Object
    Dim DrawingDoc          As Object
    Dim swFeat              As Object
    Dim SketchMgr           As Object
    Dim myBlockDefs         As Variant
    Dim myBlockDef          As Variant
    Dim retval              As Variant
   
    ' an SolidWorks anhängen
    Set swApp = Application.SldWorks
    ' aktuelles Dokument sollte die Zeichnung sein
    Set DrawingDoc = swApp.ActiveDoc
   
    ' über den SketchManager gelangen wir zu den Blockdefinitionen
    Set SketchMgr = DrawingDoc.SketchManager
    ' Blockdefinitionen auslesen
    myBlockDefs = SketchMgr.GetSketchBlockDefinitions
   
    ' und alle Blockdefinitionen abklappern
    For Each myBlockDef In myBlockDefs
        ' das jeweilige passende Feature zu der Blockdefinition suchen
        Set swFeat = myBlockDef.GetFeature
       
        Debug.Print swFeat.Name
       
        ' dieses Feature über seinen Namen selektieren
        retval = swFeat.Select2(False, -1)
        ' und weg damit :)
        retval = DrawingDoc.DeleteSelection(False)
   
    Next

End Sub



Achtung für jemanden, der vorher die Blöcke nicht explodiert hat: auf diese Weise werden die Blockdefinitionen gelöscht, dadurch werden direkt alle Instanzen mit weggekegelt 

Ciao,
Stefan

------------------
Inoffizielle deutsche SolidWorks Hilfeseite    http://solidworks.cad.de

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: 3189
Registriert: 04.04.2001

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

erstellt am: 14. Apr. 2016 10:38    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 CAD-Maler 10 Unities + Antwort hilfreich

Zitat:
Code:

    'Alle Blöcke löschen
    Set swFeat = swBlockDef.GetFeature
    Do While Not swFeat Is Nothing
        If swFeat.GetTypeName() = "SketchBlockDef" Then
            retval = swFeat.Select2(False, -1)
            retval = DrawingDoc.DeleteSelection(False)
        End If
        DrawingDoc.ClearSelection2 True
        Set swFeat = swFeat.GetNextFeature       
    Loop



Hallo,

verstehe ich es richtig?
- du selektierst einen Block
- löscht ihn
- machst clear selection
- möchtest mit getnext weiterspringen (von selection ausgehend?)

die ist dann gründlich leer, oder?

Gruß, Christian

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

CAD-Maler
Mitglied
Konstrukteur / CAD-Admin / Mädchen für alles


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

Beiträge: 720
Registriert: 17.01.2007

SWX 2019 SP5
AutoCAD 2019
Win 10 pro 64 bit
Intel(R) Xeon(R) CPU E5-1650 v4 @ 3.60GHz
64GB RAM
Nvidia Quadro M5000
SWx EPDM

erstellt am: 14. Apr. 2016 10:52    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

Ich wusste, auf euch ist Verlaß! 

Der Code von Stefan funzt super! Ich habe einfach meine "Lösch-Schleife" durch ihn ersetzt, jetzt werden erst alle Blöcke aufgelöst und dann die Blockdefinitionen gelöscht. Perfekt! (Wer den kompletten Code braucht: Bitte selbst zusammenkopieren.  )


Zitat:
Original erstellt von Christian_W:
die ist dann gründlich leer, oder?

Das ClearSelection ist tatsächlich noch ein Überbleibsel vom Kopieren. Ganz übersehen...  Das kann sowieso da weg. Ich selektiere ja in dem Sinne nichts.
Auch ohne das ClearSelection liefert mir das GetNextFeature keinen Wert zurück, grad so als ob das erste Feature (das grad vorher gelöscht wurde) überhaupt das letzte im Featurebaum wäre. Ich könnte mir ja noch irgendwie erklären, wenn das Makro dann die anderen Features (Beschriftungsordner etc.) durchgeht, wie es ja auch bei den Blockauflösen-Schleifen passiert, aber so... 

Vielen Dank jedenfalls!

Jens

------------------
CSWA, CSWP =)

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

StefanBerlitz
Guter-Geist-Moderator
IT Admin (CAx)



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

Beiträge: 8756
Registriert: 02.03.2000

SunZu sagt:
Analysiere die Vorteile, die
du aus meinem Ratschlag ziehst.
Dann gliedere deine Kräfte
entsprechend und mache dir
außergewöhnliche Taktiken zunutze.

erstellt am: 14. Apr. 2016 11:02    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 CAD-Maler 10 Unities + Antwort hilfreich

Hallo Jens,

freut mich zu hören, dass es so klappt 

Was Christian wohl damit meint: du sägst dir mit dem Löschen ja selbst das Feature weg, welches du dann anschließend mit swFeat.GetNextFeature benutzen wolltest. Das funktioniert vermutlich nur mit einem Nekromantie-Addin 

Ciao,
Stefan

------------------
Inoffizielle deutsche SolidWorks Hilfeseite    http://solidworks.cad.de

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: 3189
Registriert: 04.04.2001

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

erstellt am: 14. Apr. 2016 12:52    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 CAD-Maler 10 Unities + Antwort hilfreich

Zitat:
... Das funktioniert vermutlich nur mit einem Nekromantie-Addin  

jau  nimmst du da eigentlich lieber das von SWX oder von Microsoft?

Gruß, Christian

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: 3189
Registriert: 04.04.2001

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

erstellt am: 14. Apr. 2016 15:00    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 CAD-Maler 10 Unities + Antwort hilfreich

Zitat:
Code:

...
    'Alle Blöcke auflösen, die im Blattformat liegen
...


...

Hallo Jens,

noch eine Anmerkung, bei uns sind auf dem Blattformat Blöcke mit Texten, die über Block-Attribute gefüttert werden. Damit gelangen dann Zeichnungsnummern und alle anderen Einträge ins Schriftfeld.
Frage mich gerade, was mit solchen Einträgen beim Sprengen der Blöcke passiert ...

Gruß, Christian

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