« zurück zur Hauptseite...

Blockeinfügen in AutoCAD mit VBA


Autor: "Norbert Schulze-Kahleyß" (2005-05-03 11:55:51)

Moin NG!

Wieso geht das denn nicht?

Dim bl As AcadBlockReference
Set bl = ThisDrawing.ModelSpace.InsertBlock(Array(0, 0, 0), "d:\treppe.dwg",
1#, 1#, 1#, 0)

Ich versuche, per VBA in eine geöffnete Zeichnung eine andere Datei als
Block einzuladen. Mit internen Blöcken geht es.

Schönen Gruß,

Norbert Schulze-Kahleyß

Autor: "Thorsten Meinecke" (2005-05-03 14:21:46)

"Norbert Schulze-Kahleyß" schrieb:
> Dim bl As AcadBlockReference
> Set bl = ThisDrawing.ModelSpace.InsertBlock(Array(0, 0, 0),
> "d:\treppe.dwg",
> 1#, 1#, 1#, 0)

Tja, du brauchst eine vorhandene Blockdefinition. Mit Pfad aus Datei laden
geht nur mit dem Befehl INSERT, z.B. wie dieser Codeschipsel zum
aktualisieren
von Blöcken aus einem Verzeichnis zeigt:

(FOREACH fil (VL-DIRECTORY-FILES dir "*.dwg" 1)
(SETQ cmd (LIST " -insert" (STRCAT (VL-FILENAME-BASE fil) "=" dir "/"
fil) "0,0" 1 1 0)
entl (ENTLAST)
)
(APPLY COMMAND cmd)
(IF (NOT (EQ entl (ENTLAST)))
(PROGN
(ENTDEL (ENTLAST))
;...
)
)
)


> Ich versuche, per VBA in eine geöffnete Zeichnung eine andere Datei als
> Block einzuladen. Mit internen Blöcken geht es.

In diesem Falle geht es auch, du musst "nur" vor dem Anlegen der
Blockreferenz
die Definition aus der anderen Zeichnung in die aktuelle übertragen. Wenn
beide geöffnet sind, kannst du über Blocks.Item die vorhandene
Blockdefinition
auslesen und in der anderen neu anlegen.

Gruß,
--Thorsten

Autor: "Thorsten Meinecke" (2005-05-03 14:21:46)


Autor: "Thorsten Meinecke" (2005-05-03 14:21:46)

"Norbert Schulze-Kahleyß" schrieb:
> Dim bl As AcadBlockReference
> Set bl = ThisDrawing.ModelSpace.InsertBlock(Array(0, 0, 0),
> "d:\treppe.dwg",
> 1#, 1#, 1#, 0)

Tja, du brauchst eine vorhandene Blockdefinition. Mit Pfad aus Datei laden
geht nur mit dem Befehl INSERT, z.B. wie dieser Codeschipsel zum
aktualisieren
von Blöcken aus einem Verzeichnis zeigt:

(FOREACH fil (VL-DIRECTORY-FILES dir "*.dwg" 1)
(SETQ cmd (LIST " -insert" (STRCAT (VL-FILENAME-BASE fil) "=" dir "/"
fil) "0,0" 1 1 0)
entl (ENTLAST)
)
(APPLY COMMAND cmd)
(IF (NOT (EQ entl (ENTLAST)))
(PROGN
(ENTDEL (ENTLAST))
;...
)
)
)


> Ich versuche, per VBA in eine geöffnete Zeichnung eine andere Datei als
> Block einzuladen. Mit internen Blöcken geht es.

In diesem Falle geht es auch, du musst "nur" vor dem Anlegen der
Blockreferenz
die Definition aus der anderen Zeichnung in die aktuelle übertragen. Wenn
beide geöffnet sind, kannst du über Blocks.Item die vorhandene
Blockdefinition
auslesen und in der anderen neu anlegen.

Gruß,
--Thorsten

Autor: "Norbert Schulze-Kahleyß" (2005-05-03 16:07:22)

Hallo Thorsten!

Danke, aber ich verstehe das nicht. Vielleicht kannst Du mir helfen, wenn
ich andersrum anfange:

Ich habe eine (leere) Zeichnung, in die ich automatisch mehrere externe
Blöcke mittels VBA in Form von Zeichnung1.dwg, Zeichnung2.dwg einfügen und
platzieren möchte. Bisher war ich der Meinung, "ModelSpace.InsertBlock" sei
das richtige Mittel, so siehts auch in den Beispielen aus, die ich so
gefunden habe. Ich bekomme aber immer einen Laufzeitfehler "Die Methode
InsertBlock für das Objekt IAcadModelSpace ist fehlgeschlagen.

Eine Idee?

Norbert

Autor: "Thorsten Meinecke" (2005-05-03 17:27:51)

"Norbert Schulze-Kahleyß" schrieb:
> Ich habe eine (leere) Zeichnung, in die ich automatisch mehrere externe
> Blöcke mittels VBA in Form von Zeichnung1.dwg, Zeichnung2.dwg einfügen und
> platzieren möchte. Bisher war ich der Meinung, "ModelSpace.InsertBlock"
> sei
> das richtige Mittel, so siehts auch in den Beispielen aus, die ich so
> gefunden habe. Ich bekomme aber immer einen Laufzeitfehler "Die Methode
> InsertBlock für das Objekt IAcadModelSpace ist fehlgeschlagen.

Richtig. InsertBlock ist die Methode, um eine Blockreferenz zu erstellen.
Diese Methode wird fehlschlagen, wenn es keine Blockdefinition unter dem
entsprechenden Namen gibt.

Um die Blockdefinitionen aus einer Datei anzulegen, bietet sich
SendCommand(" -INSERT" ...) an. Der andere angedeutete Weg sieht
erheblich umständlicher aus, er beginnt mit zwei geöffneten Dateien
(Quelle und Ziel) in etwa so

Dim doc As AcadDocument
Set doc = ThisDrawing.Application.Documents.Item("quelle.dwg")
Dim bl, newbl As AcadBlock
Set bl = doc.Blocks.Item("Blockname")
Set newbl = ThisDrawing.Blocks.Add(bl.Origin, bl.Name)

Danach müsste man für alle Objekte aus der Blockdefinition der
Quellzeichnung
eine passende Add-Methode im Zielblock aufrufen, was ich auch noch nie
gemacht
habe. Die Möglichkeit sollte aber theoretisch funktionieren.

Gruß,
--Thorsten

Autor: thm@krypta.org (Thorsten Meinecke) (2005-05-03 21:28:25)

Thorsten Meinecke schrieb:
>Danach müsste man für alle Objekte aus der Blockdefinition der
>Quellzeichnung
>eine passende Add-Methode im Zielblock aufrufen, was ich auch noch nie
>gemacht

Ich hasse Ausguck.

>habe. Die Möglichkeit sollte aber theoretisch funktionieren.

Tut sie auch praktisch, in gefürchteter Hybridtechnik (1 Teil
Visual Lisp, 1 Teil Autolisp).


(DEFUN my-Item (var obj str)
(NOT (VL-CATCH-ALL-ERROR-P
(SET var (VL-CATCH-ALL-APPLY vla-Item (LIST obj str)))
)
)
)
(DEFUN copybldef (blname dwgname / srcdoc bldef)
(AND
(my-Item srcdoc (vla-get-Documents (vlax-get-acad-object)) dwgname)
(my-Item bldef (vla-get-Blocks srcdoc) blname)
(ENTMAKE
(LIST (0 . "BLOCK")
(70 . 0)
(CONS 10
(vlax-safearray->list
(vlax-variant-value (vla-get-Origin bldef))
)
)
(CONS 2 blname)
(1 . "")
)
)
(PROGN
(VLAX-FOR obj bldef
(ENTMAKE (ENTGET (vlax-vla-object->ename obj)))
)
(ENTMAKE ((0 . "ENDBLK")))
)
)
)

Wird dann mit (copybldef "Test" "Zeichng3.dwg") oder ähnlich
aufgerufen und versagt jämmerlich, wenn abhängige Symbole
(Layer, Linientypen usw.) nicht in der Zielzeichnung vorhanden
sind. Attribute, anonyme Blöcke etc. kann man natürlich
auch vergessen.

Und wie du das unter Visual Basic hinkriegst, ist auch nicht
wirklich ein Problem. Denn du wirst das nicht wollen, sondern
(command " -INSERT" ...)

Gruß,
--Thorsten

Autor: thm@krypta.org (Thorsten Meinecke) (2005-05-03 21:34:28)

Ich führe Selbstgespräche. Sagtest du "(leere) Zeichnung"?

Schon mal über eine DWT-Vorlagendatei nachgedacht, in der
die Blockdefinitionen enthalten sind?

Gruß,
--Thorsten

Autor: "Norbert Schulze-Kahleyß" (2005-05-04 18:30:54)

Hallo Thorsten!

> Ich führe Selbstgespräche. Sagtest du "(leere) Zeichnung"?
Das möchten wir nicht. Erst mal danke für Deine Tipps. Ich bin wie Du
vermutet hast mit -Insert schneller zum Ziel gekommen. Ich feile jetzt
eigentlich nur noch an ein paar Details.

Damit Du auch weißt, für was Du die Tipparbeit machst, es geht darum: Jemand
hat AutoCAD und ein bestimmtes Treppenbauprogramm. Dann findet er in AutoCAD
ein neues Symbol, über welches er zu einer Dialogbox kommt, wo er Treppentyp
usw. wählt und dann die wichtigsten Parameter eingibt oder mit der Maus aus
der evtl. vorhandenen ACAD-Zeichnung abgreift. Dann startet automatisch das
Treppenbauprogramm und wenn er dort alles nach Wunsch hat, kommt er zurück
zu einer neuen Dialgbox in AutoCAD, wo er eine Auswahl an Treppenzeichnungen
hat, die er dann mit der Maus platzieren kann. Und da hatte ich das Problem.

Wie gesagt, es geht jetzt, ich muß nur noch alle Eventualitäten absichern.

Schönen Gruß,

Norbert