CADsite forum

AutoCAD => VBA => Topic gestart door: Sven op ma 09 03 2009, 15:58:55

Titel: blocks exploderen
Bericht door: Sven op ma 09 03 2009, 15:58:55
Hey,
Wij krijgen hier door een omzetting vanuit een ander programma steeds tekeningen waarbij er een block gemaakt is van een andere block. nu is dit op te lossen door ze allemaal 1x te exploderen. We zouden dit echter door een vba willen laten gebeuren.

Mijn probleem: Hoe selecteer ik alle blocken in 1 keer (dmv VBA) en laat ze 1 maal exploderen. Ik vermoed dat

for each block ... hier niet gebruikt zal kunnen worden want dan blijft hij toch exploderen tot er geen blocks meer zijn?

Kan iemand mij op weg zetten?
Titel: Re: blocks exploderen
Bericht door: EddyBeerke op di 10 03 2009, 11:09:13
Je kunt  het "for each block" wél gebruiken als je iets dergelijks doet als:
X=thisdrawing.blocks
Let op want de "Modelspace", "Layouts" (Paperspace) en de "Xref's" zijn óók blocks.
Titel: Re: blocks exploderen
Bericht door: sschevers op vr 17 04 2009, 08:38:19
Blocken kun je niet exploderen Dit zijn namelijk de definties van blockreferences ( datgene je ziet in je tekening).
Maak een selectieset aan met blockreferences
check of je selectie set niet leeg is
ga met een for each door je selectieset en explodeer de block references.


Option Explicit

Public Sub ExplodeBlockrefs()
   Dim sset As AcadSelectionSet
   Dim gpCode(0) As Integer
   Dim dataValue() As Variant
   Dim groupCode As Variant
   Dim dataCode As Variant
   Dim blkRef As AcadBlockReference
   Dim i As Integer

   'aanmaken van selection set
   On Error Resume Next
   Set sset = ThisDrawing.SelectionSets.Add("ss")
   On Error GoTo 0
   Set sset = ThisDrawing.SelectionSets("ss")

   'selectionset leegmaken
   sset.Clear

   ReDim gpCode(0)
   ReDim dataValue(0)

   gpCode(0) = 0: dataValue(0) = "insert"

   groupCode = gpCode
   dataCode = dataValue

   ' alle blocken in je tekening selecteren
   sset.Select acSelectionSetAll, , , groupCode, dataCode
   
   If sset.Count > 0 Then
      For i = 0 To sset.Count - 1
         ' block ref uit selectie set halen
         Set blkRef = sset.Item(i)
         
         blkRef.Explode
         
         
      Next
   End If
   ThisDrawing.SelectionSets("ss").Delete
   Set sset = Nothing
End Sub



stephan
Titel: Re: blocks exploderen
Bericht door: HofCAD op vr 17 04 2009, 11:00:36
Beste Stephan,

Krijg je geen Compile Error: Array already dimensioned?
Moet Dim gpCode(0) As Integer niet Dim gpCode() As Integer zijn.
Krijg je ook als je een blockreferentie explodeerd, dat je een kopie van de blockreferentie explodeerd
en dat de originele blockreferentie  blijft bestaan.

Met vriendelijke groet, HofCAD CSI.
Titel: Re: blocks exploderen
Bericht door: sschevers op vr 17 04 2009, 11:17:13
Citaat van: HofCAD op vr 17 04 2009, 11:00:36
Beste Stephan,

Krijg je geen Compile Error: Array already dimensioned?
Moet Dim gpCode(0) As Integer niet Dim gpCode() As Integer zijn.
Krijg je ook als je een blockreferentie explodeerd, dat je een kopie van de blockreferentie explodeerd
en dat de originele blockreferentie  blijft bestaan.

Met vriendelijke groet, HofCAD CSI.

Beste hofCad

Over de declaratie heb je helemaal gelijk. Iets te snel copy-paste en daarna niet getest  :oops:.

Autocad kent Blocks en Blockreferences (dit zijn de blocken die een tekenaar in zijn tekening invoegt). Blocks staan in je blocktable en staan niet in je tekening. Blockrefences zijn de afgeleiden van Blocks. Oftewel de blocken die fysiek in je tekening plaatst en ziet. Als je een Blockrefence explodeerd dan explodeer je alleen het block in je tekening. Het block in de blocktable wordt niet aangetast.

Mijn routine explodeerd alle blockreferences in je tekening. Wil je dit niet dan moet je select statement aanpassen. Zie de help van VBA welke opties er voor het select statement zijn.

stephan
Titel: Re: blocks exploderen
Bericht door: HofCAD op vr 17 04 2009, 11:38:35
Beste Stephan,

Je schrijft o.a. 'Mijn routine explodeerd alle blockreferences in je tekening.',
maar dat is volgens mij niet waar.
Als ik namelijk het resultaat controleer, dan zie ik de elementen van een
geexplodeerde blockreferentie maar ook nog steeds de oude
blockreferentie(te controleren met de handle).
Omdat hij dus een kopie van de blockreferentie heeft geexplodeerd, moet je de
originele blockreferenties achter nog verwijderen.
Dus het eind van je code moet inplaats van
End If
ThisDrawing.SelectionSets("ss").Delete
Set sset = Nothing
End Sub

dit volgens mij zijn:
End If
sset.Erase
ThisDrawing.SelectionSets("ss").Delete
Set sset = Nothing
End Sub


Met vriendelijke groet, HofCAD CSI.
Titel: Re: blocks exploderen
Bericht door: sschevers op vr 17 04 2009, 13:42:02
Citaat van: HofCAD op vr 17 04 2009, 11:38:35
Beste Stephan,

Je schrijft o.a. 'Mijn routine explodeerd alle blockreferences in je tekening.',
maar dat is volgens mij niet waar.
Als ik namelijk het resultaat controleer, dan zie ik de elementen van een
geexplodeerde blockreferentie maar ook nog steeds de oude
blockreferentie(te controleren met de handle).
Omdat hij dus een kopie van de blockreferentie heeft geexplodeerd, moet je de
originele blockreferenties achter nog verwijderen.
Dus het eind van je code moet inplaats van
End If
ThisDrawing.SelectionSets("ss").Delete
Set sset = Nothing
End Sub

dit volgens mij zijn:
End If
sset.Erase
ThisDrawing.SelectionSets("ss").Delete
Set sset = Nothing
End Sub


Met vriendelijke groet, HofCAD CSI.

En wederom heb je gelijk. ik heb aangenomen dat de referenties werden opgeruimd. Ik zou beter moeten weten. testen testen en nog een testen. zucht .....
Titel: Re: blocks exploderen
Bericht door: HofCAD op vr 17 04 2009, 15:35:54
Beste Sven en Stephan,

Een alternatief is het programma ExplodeBlockrefs2 dat in Expblk.bas staat.
Als je de geneste block's ook wil exploderen, kan je het programma ExplodeBlockrefs3
(dat ook in Expblk.bas staat) gebruiken.

Met vriendelijke groet, HofCAD CSI.

PS Ook een juiste versie van het  programma ExplodeBlockrefs van Stephan
staat in Expblk.bas.