| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Letzter platzierter Block (622 mal gelesen)
|
Silvan01 Mitglied
Beiträge: 128 Registriert: 28.04.2009 AutoCAD Civil 2009 AutoCAD Civil 2010 Visual Studio 2008
|
erstellt am: 10. Aug. 2009 17:58 <-- editieren / zitieren --> Unities abgeben:
Hallo Zusammen, ich bin mal wieder auf ein Problem gestoßen. In VBA hatte ich eine Blockreferenz der ich den zuletzt hinzugekommenen Block zugewiesen habe: Set Blockref = ThisDrawing.ActiveLayout.Block.Item(ThisDrawing.ActiveLayout.Block.Count - 1) In VB.Net habe ich bis jetzt noch keine Möglichkeit gefunden. Hat jemand einen Tipp für mich? Grüße Silvan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 10. Aug. 2009 18:20 <-- editieren / zitieren -->
Hi, wie kommt denn diese Notwendigkeit zustande? Mit Enumerator des Modellbereichs müsste man durchscannen, ist nicht so praktikabel, wenn es große Dateien sind, also finde ich jetzt nur den Weg über COM, von dem ich annehme, dass er am schnellsten ist. Code: Dim tAcadDoc As ApplicationServices.Document = ApplicationServices.Application.DocumentManager.MdiActiveDocument Dim tTrAct As Transaction = Nothing Dim tBtr As BlockTable = Nothing Dim tModSp As BlockTableRecord = NothingTry tTrAct = tAcadDoc.TransactionManager.StartTransaction tBtr = CType(tTrAct.GetObject(tAcadDoc.Database.BlockTableId, OpenMode.ForRead, True, True), BlockTable) tModSp = CType(tTrAct.GetObject(tBtr(DatabaseServices.BlockTableRecord.ModelSpace), OpenMode.ForWrite, True, True), BlockTableRecord) Dim tModSpCOM As Interop.Common.AcadBlock = CType(tModSp.AcadObject, Interop.Common.AcadBlock) Dim tLastEntCOM As Interop.Common.AcadEntity = CType(tModSpCOM.Item(tModSpCOM.Count - 1), Interop.Common.AcadEntity) Dim tLastEnt As DatabaseServices.DBObject = tTrAct.GetObject(DatabaseServices.DBObject.FromAcadObject(tLastEntCOM), OpenMode.ForRead, True, True)
Vorsicht, hier ist keinerlei Fehlerprüfung eingebaut, also z.B. wenn das letzte Element schon wieder gelöscht wurde, oder der Modellbereich gar keine Elemente drin hat, es sich im eine Blockreferenz mit nachträglich gesetzten Attributen handelt .... Zurück zum Workflow: Wieso machst Du das? Wenn es Dich interessiert, welche Elemente von Deiner Applikation angelegt worden sind, dann setz einen Event auf ObjectAdded und speichere Dir die ObjectID's. Wenn es Dich interessiert, was der Anwender zuletzt erstellt hat, dann mach ein SelectionSet mit '_L' für '_last'. Trotzdem finde ich es spannend, nicht mit wenigen Befehlen (ohne durchscannen) zum letzten Element zu kommen. - alfred - ------------------ www.hollaus.at |
Silvan01 Mitglied
Beiträge: 128 Registriert: 28.04.2009 AutoCAD Civil 2009 AutoCAD Civil 2010 Visual Studio 2008
|
erstellt am: 11. Aug. 2009 08:59 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, die Erklärung ist eig. ziemlich einfach. Ich platziere einen Block grafisch mit einer Lisp (Hab den Block am Mauszeiger hängen) wie hier beschrieben. Nach der Platzierung möchte ich testen, ob der Block innerhalb eines Umrkeises ist. Grüße Silvan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 11. Aug. 2009 09:23 <-- editieren / zitieren -->
Hi, dann initialisiere einen EventHandler, der 'ObjectAdded' überwacht, bevor Du das Lisp startest; gleichzeitig einen EventHandler für CommandEnded. Kommt zweiter Event, kannst Du die ObjectID's (die Du mit ..ObjectAdded gesammelt hast) durchgehen und daraufhin prüfen. Wobei alles leichter würde, wenn Du den Block gleich mit dotNET plazierst? Aber es wird wohl Gründe geben, wieso wohl in Deinem Fall nicht. - alfred - ------------------ www.hollaus.at |
CADmium Ehrenmitglied V.I.P. h.c. Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 ACAD 2004DX Mechanical PP
|
erstellt am: 11. Aug. 2009 09:30 <-- editieren / zitieren --> Unities abgeben: Nur für Silvan01
wenn du eh schon Lisp nutzt, dann nimm doch die dort implementierte Funktion entlast und hole dir dann die OBJID ect. oder mach die Platzierung und die Auswertung komplett in Lisp. Was machtr das eigentlich für Sinn ein Projekt in verschiedenen Programmiersprachen zu realisieren ? Oder mach die Auswetrtsachen ect, in .NET und stell mit netload usw. die Funktion in Lisp zur Vefügung. ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Silvan01 Mitglied
Beiträge: 128 Registriert: 28.04.2009 AutoCAD Civil 2009 AutoCAD Civil 2010 Visual Studio 2008
|
erstellt am: 11. Aug. 2009 09:53 <-- editieren / zitieren --> Unities abgeben:
Hallo Zusammen, @Cadmium ja da hast du schon Recht. Ich hab ursprünglich in VBA programmiert. Hab dort aber keine Lösung zu dem Grafischen Platzieren eines Blockes gefunden. Die Lisp Lösung erschien mir die einfachste und war bisher auch sehr zufrieden damit. Jetzt programmiere ich dieses Projekt allerdings von VBA auf VB.Net um. Ich wollte das einfach kurz und schnell in VB.Net in mein Projekt einbinden, hat allerdings nicht so geklappt daher dieser Topic. Ich hab leider auch nicht so das Know-How da ich Anfänger bin . Falls jemand eine Lösung hat oder eine Idee zu dem grafischen Platzieren in VB.Net wäre ich natürlich sehr interessiert daran. Grüße und Danke für eure Hilfe Silvan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 11. Aug. 2009 09:57 <-- editieren / zitieren -->
Hi Silvan, Zitat: Falls jemand eine Lösung hat oder eine Idee zu dem grafischen Platzieren in VB.Net wäre ich natürlich sehr interessiert daran.
...such mal nach 'JIG' in der Dokumentation, damit kannst Du alles mögliche machen, was Cursor-Bewegungen folgt (oder von den Bewegungen abhängt). Und im allerschlimmsten Fall den Block vom Programm aus auf 0,0 einsetzten und dann Command '_move' starten (Startpunkt 0,0, Endpunkt offenlassen für User), dann hast Du diesen auch am Cursor hängen zum (erneuten) plazieren. - alfred - ------------------ www.hollaus.at |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|