Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  übertrage Abfragemethode in eine Windowsform

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:  übertrage Abfragemethode in eine Windowsform (1001 mal gelesen)
cadplayer
Ehrenmitglied
CADniker


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

Beiträge: 1832
Registriert: 28.04.2009

erstellt am: 27. Mrz. 2014 07: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!

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.


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

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 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 cadplayer 10 Unities + Antwort hilfreich

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


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

Beiträge: 1832
Registriert: 28.04.2009

erstellt am: 27. Mrz. 2014 11:09    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

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




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

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools

erstellt am: 27. Mrz. 2014 13:04    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 cadplayer 10 Unities + Antwort hilfreich

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


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

Beiträge: 1832
Registriert: 28.04.2009

erstellt am: 27. Mrz. 2014 13:23    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 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


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

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

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




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

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools

erstellt am: 31. Mrz. 2014 08:10    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 cadplayer 10 Unities + Antwort hilfreich

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


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

Beiträge: 1832
Registriert: 28.04.2009

erstellt am: 09. Apr. 2014 09:16    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

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




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

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools

erstellt am: 09. Apr. 2014 16:51    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 cadplayer 10 Unities + Antwort hilfreich

... Schreibarbeit? <STRG>+<R> +<E>
dazu den Cursor in den lokalen Variablennamen setzen.

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

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