| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: übertrage Abfragemethode in eine Windowsform (1001 mal gelesen)
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 27. Mrz. 2014 07:59 <-- editieren / zitieren --> Unities abgeben:
Hallo! Als Newbie habe ich die Aufgabe die Abfragemethode "GetBlock" und daraus resultierende Variable string höhe in ein Textlabel anzuzeigen. Die Methode sieht wie folgt aus: Code: class GetBlockEntity { [CommandMethod("interpol", "_interpol", CommandFlags.Modal)] public void frmShow() { Document doc = Application.DocumentManager.MdiActiveDocument; Form1 frm = new Form1(); Application.ShowModelessDialog(Application.MainWindow.Handle, frm); } //[CommandMethod("interpol")] public void GetBlock() { Document doc = AcAp.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; PromptEntityOptions peo = new PromptEntityOptions("\nSelect a block: "); peo.SetRejectMessage("Not a block."); peo.AddAllowedClass(typeof(BlockReference), true); PromptEntityResult per = ed.GetEntity(peo); if (per.Status != PromptStatus.OK) return; using (Transaction tr = db.TransactionManager.StartTransaction()) { //show type of databasObject DBObject dbObj = tr.GetObject(per.ObjectId, OpenMode.ForRead); ed.WriteMessage("\r\nEntity selected was a " + dbObj.GetRXClass().Name); // Open the block reference BlockReference br = (BlockReference)tr.GetObject(per.ObjectId, OpenMode.ForRead); ed.WriteMessage("\n\nBlock: {0}", br.Name); // Iterate the attribute collection foreach (ObjectId attId in br.AttributeCollection) { // Open the attribute reference AttributeReference att = (AttributeReference)tr.GetObject(attId, OpenMode.ForRead); string höhe = att.TextString; ed.WriteMessage("\n\t{0} = {1} ", att.Tag, att.TextString); } } } }
In der Windowsform habe ich einen Button installiert, der mir die Methode"GetBlock" aufruft. Ich erzeuge also eigens ein Objekt, allerdings kann ich nicht die Variable string höhe finden. Soweit bin ich gekommen mit der Form bzw. button1_Click merhode
Code: private void button1_Click(object sender, EventArgs e) { Close(); GetBlockEntity obj = new GetBlockEntity(); obj.GetBlock(); label1.Text = höhe; obj.frmShow(); }
Was muss ich tun oder ist meine Denkweise falsch?! ------------------ Gruss Dirk http://cadplayerlounge.blogspot.se Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Ehrenmitglied Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign MapGuide autodesk Topobase 2-2014 VS6, VS.net 2010
|
erstellt am: 27. Mrz. 2014 09:53 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo Dirk, deine Methode "public void GetBlock()" gibt ja auch keinen Wert zurück. In VB würde es so gehen:
Code: public function GetBlock () as string ... Return Höhe ... end function
Und die Übergabe wäre dann
Code: label1.Text=obj.Getblock()
Wilfried Stelberg ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 27. Mrz. 2014 11:09 <-- editieren / zitieren --> Unities abgeben:
Danke für deinen Vorschlag. Nach debuggen erhalte ich in meiner genannten Getblock methode für die Variable "höhe" den entsprechenden Wert. Diese Variable wird erzeugt aus dem Objekt "att"(AttributRerence) Mein Problem ist, wie kann jetzt diesen Wert in mein "label1" übertragen. Sobald nämlich, die Getblock methode ausgeführt wurde erlischt das "att"Objekt und die variable "höhe" steht wieder auf null Es gibt zwei Möglichkeiten, evtl. die Rückgabe so wie du sagst in die getBlock methode einzubauen: da stehe ich vor der weisen Wand oder wiederum eine Methode, die nur die Höhe abfragt (scheint mir nur etwas umständlich) und funktioniert auch nicht
Code: public string Getheigth() { GetBlockEntity obj = new GetBlockEntity(); obj.GetBlock(); obj.frmShow(); return höhe; }
------------------ Gruss Dirk http://cadplayerlounge.blogspot.se Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 27. Mrz. 2014 13:04 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo Dirk, ich denke, das sind Basics, die nicht so leicht via Foren zu vermitteln sind. Ich würde die Frms-klasse um notwendige public Eigenschaften erweitern und diese dann setzen. Man kann aber auch eine eigene Klasse bauen, die die Eigenschaften beinhaltet und innerhalb derer das Form aufgerufen und auch die Blockauswahl erfolgt. Dein Problem ist eine sinnvolle, objektorientiette Struktur deines Codes aufzubauen. Weißt du wie man eigene Klassen. inkl. Constructoren, Properties und Methods, definiert? Weißt du, welche Möglichkeiten/Arten von Methodenparametern verwandt/definiert werden können?(Stichwort: out / ref). Wenn dir diese Dinge klar dind (was im Moment anscheinend nicht der Fall ist, dann kann man dir auch kurz und sinnvoll helfen. Es ist gerade in der objektorientieten Programmierung so, dass man nur sehr schwer einfach drauflos proggen kann. 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 |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 27. Mrz. 2014 13:23 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger! Das ist mir klar, dass es hier noch an Basics bei mir mangelt. Eigene Klassen mit Methoden belegen und erstellen sowie Konstruktoren für das Erzeugen von Objekte ist mir soweit geläufig. Wo sich mein Kernproblem sehe. Ich erzeuge ein Objekt der Klasse "GetBlockEntity", in der gibt es eine Methode "GetBlock()", die mir einen Block auswählt und bisher nur Blocknamen und Attributwert im Textfenster ausgibt. Soweit ganz schön. Ich möchte aber das Rad weiterspinnen indem ich einmal den AttrWert in der Windowsform anzeigen lasse. Da ist mein Problem, wie Windowsform und Autocad miteinander kommunizieren. Danke für jede Hilfe! ------------------ Gruss Dirk http://cadplayerlounge.blogspot.se Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 27. Mrz. 2014 15:54 <-- editieren / zitieren --> Unities abgeben:
Wissen zu erweitern, durch probieren ist mühseelig. Zumal man eigentlich kein richtiges Verständnis von der Sache bekommt. Es gibt sicherlich eine Unmenge an Beispielen C# codes. Zu meinem Fall ist mir nix passendes vorhanden (oder nicht gefunden). Deshalb war auch meine Bitte mir mal ein Beispiel zu geben. Drauf los kloppen ist nicht meine Absicht - aber praxisnah etwas auszutüffteln, dagegen gibt es doch keine Einwände ?! Konkret! mein getBlock-methode läuft durch die button_click-methode jetzt
Code: private void button1_Click(object sender, EventArgs e) { GetBlockEntity.GetBlock(label1); }
Was mich hier allerdings stört, die Bedienung läuft nicht so toll.
Code: private void button1_Click(object sender, EventArgs e) { Close(); GetBlockEntity.GetBlock(label1); }
schon besser, die Windowsfrom wird geschlossen - um sie aber im neuen Zustand (aktualisierten label1) zu öffnen fehlt mir noch das Verständnis. Mein Vorschlag wäre in die frmShow-methode noch einen Parameter für das Label einzufügen, ist das möglich Code: public void frmShow() { Document doc = AcAp.DocumentManager.MdiActiveDocument; Form1 frm = new Form1(); AcAp.ShowModelessDialog(AcAp.MainWindow.Handle, frm); }
Schlussendlich will ich bei der Windowsform immer gleich -button1_click (wform blendet aus) -anklicken eines Blockattributes (wform zeigt das aktualisiert label1 an) das label1 aktualisieren lassen Code: private void button1_Click(object sender, EventArgs e) { GetBlockEntity.GetBlock(label1); GetBlockEntity obj = new GetBlockEntity(); obj.frmShow(); }
------------------ Gruss Dirk http://cadplayerlounge.blogspot.se Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 31. Mrz. 2014 08:10 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo Dirk, folgend mal ein Ansatz, wie du die Klassen strukturieren könntest. Natürlich kannst und musst du die Klasse mBlockEntity um alle weiteren notwendigen Eigenschaften erweitern - das kannst du ja frei entscheiden und erweitern. Du kannst auch Methoden basteln, die die Werte aus dem Dialog wieder zurück in die Blockreferenz schreibt usw .... Code: internal class mBlockEntity { private String _hoehe; public String Hoehe { get { return _hoehe; } set { _hoehe = value; } } public mBlockEntity() { Document doc = AcAp.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; PromptEntityOptions peo = new PromptEntityOptions("\nSelect a block: "); peo.SetRejectMessage("Not a block."); peo.AddAllowedClass(typeof(BlockReference), true); PromptEntityResult per = ed.GetEntity(peo); if (per.Status != PromptStatus.OK) return; using (Transaction tr = db.TransactionManager.StartTransaction()) { //show type of databasObject DBObject dbObj = tr.GetObject(per.ObjectId, OpenMode.ForRead); ed.WriteMessage("\r\nEntity selected was a " + dbObj.GetRXClass().Name); // Open the block reference BlockReference br = (BlockReference)tr.GetObject(per.ObjectId, OpenMode.ForRead); ed.WriteMessage("\n\nBlock: {0}", br.Name); // Iterate the attribute collection foreach (ObjectId attId in br.AttributeCollection) { // Open the attribute reference AttributeReference att = (AttributeReference)tr.GetObject(attId, OpenMode.ForRead); _hoehe = att.TextString; ed.WriteMessage("\n\t{0} = {1} ", att.Tag, att.TextString); } }
} } public partial class Form1 : Form { public String LblText { get { return label1.Text; } set { label1.Text = value; } } public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { this.Hide(); mBlockEntity _meinBlock = new mBlockEntity(); _lblText = _meinBlock.Hoehe; this.Show(); } }
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 |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 09. Apr. 2014 09:16 <-- editieren / zitieren --> Unities abgeben:
Danke Holger! Sorry bin erst jetzt dazugekommen, deine Umsetzung anzuschauen. Läuft einwandfrei problemlos. Woran ich noch ein wenig feilen musste, wobei mir auch da die Erfahrung fehlt: Muss man generell mit der Propertymethode arbeiten, um Wertetypen von einer Klasse in die andere zu überführen? Code: public String LblText1 { get { return label1.Text; } set { label1.Text = value; } }
Finde ich ziehmlich viel Schreibarbeit, wenn ich für x-button jeweilig labels zugeordnet habe, muss ich für jeden Werte eine gesonderte label-Property-methode aufführen. ------------------ Gruss Dirk http://cadplayerlounge.blogspot.se Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 09. Apr. 2014 16:51 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|