Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  unvollständig aufgelöste Blockreferenzen

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 Autodesk Produkte
Autor Thema:  unvollständig aufgelöste Blockreferenzen (1585 mal gelesen)
NeumeierGünther
Mitglied
Bauingenieur

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

Beiträge: 4
Registriert: 05.01.2011

erstellt am: 05. Jan. 2011 17: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

Hallo liebe VBA-Profis,

ein gutes neuen Jahr noch.

Als nur gelegentlicher Nutzer von VBA habe ich ein Problem, das sich vielleicht auf eine
einfache Frage reduzieren lässt:

Kann es sein, dass Blockreferenzen mit "Explode" nur unvollständig aufgelöst werden?

Ich habe in einem größeren Programm etwa folgenden Abschnitt:

Dim BlockCol As Collection
Dim Object As AcadObject
Dim AktBlock As AcadBlockReference
Dim i, ii, j As Integer
Dim Block As AcadBlock
Dim BlockRef As AcadBlockReference
Dim aobject As Variant

Anfang:

1 Set BlockCol = New Collection
  For Each Object In ThisDrawing.ModelSpace
    If TypeName(Object) = "IAcadBlockReference2" Then
            BlockCol.Add Object
    End If
2 Next

3 For Each aobject In BlockCol 'Alle (noch) vorhandenen Blöcke in der Zeichnung sollen durchsucht werden
      Set BlockRef = aobject
    Set Block = ThisDrawing.Blocks(BlockRef.Name)
    'Ab hier enthält "Block" die einzelnen Elemente des Blocks
5    For i = 0 To Block.Count - 1
        'Wenn das gefundene Objekt ein Block ist, so wird der äußere Block aufgelöst
7      If TypeName(Block.Item(i)) = "IAcadBlockReference2" Then
'*****Hier ist das Problem**********
            BlockRef.Explode
'***********************************
            GoTo Anfang
8        End If
6    Next i
4 Next

Zweck ist folgender:
Das Programm sammelt alle Blockreferenzen des Modells (1-2). Danach werden alle Elemente
(5-6) jedes Blocks (3-4) durchsucht.
Wenn das Programm geschachtelte Blockreferenzen findet, wird jeweils die äußerste aufgelöst(7-8).
Was passiert ist folgendes:
Der äußerste Block wird aufgelöst. Wenn ich die entstandenen Linien anklicke, wird als Objekttyp
"Linie" angezeigt ( -soweit wie ich es erwartet habe!). Wenn ich aber mit der Schnellauswahl nach
allen Blockreferenzen suche, werden auch die aufgelösten Linien mit ausgewählt, die früher zur
Blockreferenz gehört haben ( und nicht nur die noch vorhandenen inneren Blöcke!!!).

Normalerweise sollten in meinem Programm alle Blöcke bis auf den innersten aufgelöst werden.
Aufgelöst wird aber nur der äußerste. Ich vermute, dass das an dem Effekt liegt, den ich
beschrieben habe.

Kann mir da jemand weiterhelfen - das wäre sehr sehr freudlich!                 

------------------
GN

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


Ex-Mitglied

erstellt am: 05. Jan. 2011 18:51    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

herzlich willkommen bei CAD-de! 

Nur soweit mal ein Hinweis (Fragen kommen nachfolgend): Du weißt schon, dass im VBA die Methode '.Explode' nicht das gleiche ist wie der Befehl _EXPLODE? Der Unterschied ist: im VBA bleibt die BlockReference erhalten und muß getrennt gelöscht werden.

Wenn es das nicht war: mir ist nicht ganz klar, was Du eigentlich möchtest?
- Ist das Ziel jetzt nur die Verschachtelungen aufzuheben, aber die oberste BlockReference soll erhalten bleiben?
- oder soll alles durchgehend 'explodiert' werden so dass keine BlockReference mehr vorhanden ist?

- alfred -

------------------
www.hollaus.at

NeumeierGünther
Mitglied
Bauingenieur

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

Beiträge: 4
Registriert: 05.01.2011

erstellt am: 05. Jan. 2011 20:47    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


vonRevitBlockAufl2011.zip

 
Hallo Alfred,  

nein, das wußte ich natürlich nicht, dass .explode und _EXPLODE nicht das gleiche ist.
Und das war auch der Grund, wieso das, was ich machen wollte nicht funktioniert hat und
jetzt (nach zusätzlich .delete) funktioniert.

Vielen, vielen Dank für Deine schnelle Hilfe!

Ich hatte mein Problem schon etwas vereinfacht, weil ich Angst hatte, dass mich sonst gar
keiner versteht. Aber nach dem jetzt (wenigstens im Moment) alles so funktioniert, wie ich
es ursprünglich gedacht hatte hier nochmal die Beschreibung meines Programms:

Ich bekomme eine .dwg aus einem anderen Programm, bei dem nur die Strichstärken stimmen aber
die Farben passen nicht zu unserer Farb-/Strichstärkenzuordnung. Es gibt z. B. 3 Haupt-
Blockrefs (KG,EG,DG) mit etlichen Unter-Unter-Unter...Blockrefs. Ich will die Haupt-Blockrefs
erhalten, damit die Geschoße leicht einzeln anwählbar bleiben. Die Unter-Unter...Blockrefs
löse ich auf, weil es für den Farbentausch einfacher ist und weil ich sie nicht benötige.
Alle Elemente des Modells (auch in den Blockrefs) erhalten nun abhängig von ihrer Strichstärke
(neue) Farben. Zunächst ist dafür die Elementstrichstärke maßgebend, wo es eine solche nicht gibt die
Layer-Strichstärke.

Das Programm läuft ziemlich lange. Vielleicht hätte man es auch einfacher machen können,
aber als Hoppy-Programmierer bin ich immer froh, wenn ich es überhaupt irgendwie
hinkriege.

Das war übrigens meine erste Frage in diesem Forum und ich hatte nicht erwartet, so schnell
Antwort zu kriegen.

Nochmal ganz herzlichen Dank!

Günther                                                 

------------------
GN

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

Brischke
Ehrenmitglied V.I.P. h.c.
CAD on demand GmbH



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

Beiträge: 4171
Registriert: 17.05.2001

ACAD20XX, defun-tools

erstellt am: 07. Jan. 2011 08: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 NeumeierGünther 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von NeumeierGünther:
Das Programm läuft ziemlich lange. Vielleicht hätte man es auch einfacher machen können,
aber als Hoppy-Programmierer bin ich immer froh, wenn ich es überhaupt irgendwie
hinkriege.


...
Ja, da hast du wohl Recht,. Die Lösung für deine Aufgabe ist eigentlich einfach, wenn man sich den Aufbau einer Zeichnung bewusst wird.

Aufgabe: Du willst allen Elemente der Zeichnung eine Farbe in Abhängigkeit derer Strichstärke zuweisen.
Lösung: Du baust dir eine 2-stufige Foreach Schleife
--äußere Schleife läuft durch die Blocktabelle
---innere Schleife läuft durch die Elemente der Blockdefinitionen

foreach(BlockTableRecord in BlockTable)
{
--foreach(Entity in BlockTableRecord)
--{
----...hier kommt der Code hin, der in Abhängigkeit der Strichstärke die Farbe zuweist
--}
}

Hintergrund: Das Durchlaufen irgendwelcher Verschachtelungsebenen oder auch das Explodieren mit bilden der Auswahlsätze ist umständlich und überhaupt nicht erforderlich, wenn man die Blockdefinitionen ändert, da ja bekanntlich die Referenzen die Eigenschaften aus der Definition heranziehen.

Noch Fragen?

Grüße Holger

------------------
Holger Brischke
CAD on demand GmbH
Individuelle Lösungen von Heute auf Morgen.


defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!

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

NeumeierGünther
Mitglied
Bauingenieur

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

Beiträge: 4
Registriert: 05.01.2011

erstellt am: 07. Jan. 2011 09:32    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 den Tip!

Ich werde die Variante bei Gelegenheit ausprobieren!
Aufgelöst werden sie inneren Blockrefs aber so nicht - oder?

------------------
GN

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

Brischke
Ehrenmitglied V.I.P. h.c.
CAD on demand GmbH



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

Beiträge: 4171
Registriert: 17.05.2001

ACAD20XX, defun-tools

erstellt am: 07. Jan. 2011 11:24    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 NeumeierGünther 10 Unities + Antwort hilfreich

Stimmt - aufgelöst werden die Referenzen nicht. Ist das denn dann noch notwendig?

Grüße Holger

------------------
Holger Brischke
CAD on demand GmbH
Individuelle Lösungen von Heute auf Morgen.


defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!

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

NeumeierGünther
Mitglied
Bauingenieur

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

Beiträge: 4
Registriert: 05.01.2011

erstellt am: 07. Jan. 2011 14:43    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

... hast recht - muß eigentlich nicht sein. Kann man bei Bedarf dann individuell
von Hand machen.

Günther

------------------
GN

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)2023 CAD.de | Impressum | Datenschutz