Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Letzter platzierter Block

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:  Letzter platzierter Block (622 mal gelesen)
Silvan01
Mitglied



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

Beiträge: 128
Registriert: 28.04.2009

AutoCAD Civil 2009
AutoCAD Civil 2010
Visual Studio 2008

erstellt am: 10. Aug. 2009 17:58    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 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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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 = Nothing

Try
  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



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

Beiträge: 128
Registriert: 28.04.2009

AutoCAD Civil 2009
AutoCAD Civil 2010
Visual Studio 2008

erstellt am: 11. Aug. 2009 08:59    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 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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



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

Beiträge: 13508
Registriert: 30.11.2003

ACAD 2004DX Mechanical PP

erstellt am: 11. Aug. 2009 09:30    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 Silvan01 10 Unities + Antwort hilfreich

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



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

Beiträge: 128
Registriert: 28.04.2009

AutoCAD Civil 2009
AutoCAD Civil 2010
Visual Studio 2008

erstellt am: 11. Aug. 2009 09:53    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 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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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 >>)

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