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?
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.
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
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.
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
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.
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 .....
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.