Hallo Gerhard,
grundsätzlich ist es richtig, was mein Kollege cadffm schreibt.
Ich fand das aber als gutes Beispiel, die Unterschiede zur .Net-API mal aufzuzeigen, bzw. zu zeigen, wie man beides gut miteinander verbinden kann.
In .Net hat man die Möglichkeit, die Blockreferenzen einer Blockdefinition direkt abzufragen. Ebenso hat man die Möglichkeit, die von einer dyn. Blockdefinition abgeleiteten anonymen Blockdefinitionen (die entstehen, wenn man an einer Blockreferenz eine dynamische Eigenschaft ändert) abzufragen. Von diesen kann man dann wiederum die Blockreferenzen abfragen.
Das habe ich mit folgenden .Net-Code erledigt (ich denke verstehendes Lesen wird unter Beachtung der oben beschriebenen Vorgehensweise möglich sein):
Code:
public static ObjectIdCollection RunTool(String _Name)
{
ObjectIdCollection _refIds = new ObjectIdCollection();
_myInit();
using (Transaction _tr = _db.TransactionManager.StartTransaction())
{
BlockTable _bt = (BlockTable)_tr.GetObject(_db.BlockTableId, OpenMode.ForRead);
ObjectId _btrId = _bt[_Name];
_bt.Close();
BlockTableRecord _btr = (BlockTableRecord)_tr.GetObject(_btrId, OpenMode.ForRead);
_refIds = _btr.GetBlockReferenceIds(true, true);
ObjectIdCollection _BtrRefIds = _btr.GetAnonymousBlockIds();
_btr.Close();
foreach (ObjectId _btrRefId in _BtrRefIds)
{
BlockTableRecord _nBtr = (BlockTableRecord)_tr.GetObject(_btrRefId, OpenMode.ForRead);
foreach (ObjectId _brId in _nBtr.GetBlockReferenceIds(true, true))
_refIds.Add(_brId);
_nBtr.Close();
}
}
return _refIds;
}
Nun habe ich .Net-seitig eine zusätzliche Lisp-Funktion definiert, die als Parameter den Namen des Blocks erwartet.
Diese zusätzliche Funktion findest du in der anbei befindlichen DLL-Datei, die du mit dem Befehl: Netload zunächst laden musst.
Danach hilft dann vielleicht dieser Lisp-Code weiter, mit dem ich für jede in der Zeichnung definierte Blockdefinition die Referenzen abfrage.
Code:
(defun getAllBlockReferencies(/ Names)
(vlax-for Item (vla-get-Blocks(vla-get-ActiveDocument (vlax-get-acad-object)))
(setq Names (cons (vlax-get-Property Item 'Name) Names))
)
(mapcar '(lambda (Name)
(cons Name (cod-getblockreferencies Name))
)
Names
)
)
Ist die .Net-DLL geladen, wird das zusätzliche Lisp-Command
cod-getblockreferencies in der VLIDE wie eine ganz normale Lisp-Funktion angezeigt (im Standard blau).
Kannst es ja mal testen, besonders im Vergleich zu Lisp, hinsichtlich der Bearbeitungsgeschwindigkeit.
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