Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Benutzereingabe sperren

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:  Benutzereingabe sperren (1364 mal gelesen)
Meldin
Mitglied



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

Beiträge: 381
Registriert: 15.07.2011

erstellt am: 07. Mrz. 2018 20:07    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,
zur Übung mit C# habe ich mir ein kleines tool gebastelt was soweit auch funktioniert. Es soll gleiche Attribute finden und markieren die dann mit einem Tastendruck "L" gelöscht werden können. Der erste Durchlauf funktioniert wunderbar. Nur wenn ich die markierten Blöcke mit "L" lösche bleibt das L beim 2ten Durchlauf in der Befehlszeile stehen und verhindert so die neue Auswahl. Um das L weg zubekommen bleibt mir nur die rechte Maustaste oder Enter drücken. Wie kann ich das umgehen?
Code:
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using System.Collections.Generic;

// This line is not mandatory, but improves loading performances
[assembly: CommandClass(typeof(AutoCAD_CSharp_plug_in9.MyCommands))]

namespace AutoCAD_CSharp_plug_in9
{
    public class MyCommands
    {
        public int AbbruchTasteESC_Get_Set { get; private set; }
        public int Taste_L_Get_Set { get; private set; }


        [CommandMethod("q1", CommandFlags.UsePickSet | CommandFlags.Redraw | CommandFlags.Modal)]
        public void Tester2()
        {
            Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;
            Transaction tr = db.TransactionManager.StartTransaction();
            // Systemvariablen
            int PICKADDVar = System.Convert.ToInt32(Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("PICKADD"));
            int PICKAutoVar = System.Convert.ToInt32(Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("PICKAUTO"));
            int OSMODEVar = System.Convert.ToInt32(Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("OSMODE"));
            // Setze neue Systemvariablen
            Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("PICKADD", 0);
            Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("PICKAUTO", 0);


            ed.SetImpliedSelection(new ObjectId[0]); //Aktive Auswahl löschen

            Autodesk.AutoCAD.ApplicationServices.Application.PreTranslateMessage += OnPreTranslateMessage;
            while (true)
            {
                if (AbbruchTasteESC_Get_Set == 27)
                {
                    AbbruchTasteESC_Get_Set = 0;
                    break;
                }

                else
                {
                    PromptNestedEntityResult Auswahl = ed.GetNestedEntity("\nAttribut wählen!");
                    if (Auswahl.ObjectId.ObjectClass.DxfName == "ATTRIB")
                    {
                        AttributeReference AttributWerteAuswahl = (AttributeReference)tr.GetObject(Auswahl.ObjectId, OpenMode.ForRead);
                        string AttributSuchString = AttributWerteAuswahl.TextString;
                        TypedValue[] Filter = { new TypedValue(0, "INSERT"), new TypedValue(410, Autodesk.AutoCAD.ApplicationServices.Application.GetSystemVariable("CTAB").ToString()), new TypedValue(66, 1) };
                        PromptSelectionResult BlöckeMitAttributen = ed.SelectAll(new SelectionFilter(Filter));
                        List<ObjectId> Blocksammlung = new List<ObjectId>();
                        if (BlöckeMitAttributen.Status != PromptStatus.OK)
                        { return; }
                        else
                        {
                            foreach (ObjectId BlockID in BlöckeMitAttributen.Value.GetObjectIds())
                            {
                                BlockReference BlockRefID = (BlockReference)tr.GetObject(BlockID, OpenMode.ForRead);
                                foreach (ObjectId AttributeId in BlockRefID.AttributeCollection)
                                {
                                    AttributeReference AttributWerte = (AttributeReference)tr.GetObject(AttributeId, OpenMode.ForRead);
                                    if (AttributWerte.TextString == AttributSuchString)
                                    {
                                        Blocksammlung.Add(BlockID);
                                    }
                                }

                            }
                            ed.SetImpliedSelection(Blocksammlung.ToArray());
                        }
                    }
                    else
                    {
                        Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("Falsches Objekt gewählt !");
                        AbbruchTasteESC_Get_Set = 0;
                        break;
                    }

                } //While
            }

            Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("PICKADD", PICKADDVar);
            Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("PICKAUTO", PICKAutoVar);
            Autodesk.AutoCAD.ApplicationServices.Application.SetSystemVariable("OSMODE", OSMODEVar);

        }

        private void OnPreTranslateMessage(object sender, PreTranslateMessageEventArgs e)
        {
            if (e.Message.message == 258 && e.Message.wParam.ToInt32() == 108)// 258 für Tastatur 108 Taste "L"
            {
                Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
                PromptSelectionResult selectionRes = ed.SelectImplied();
                if (selectionRes.Status != PromptStatus.OK)
                    return;
                Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
                doc.LockDocument();// <----- Wichtig zum Löschen !!!
                Transaction tr = doc.Database.TransactionManager.StartTransaction();
                foreach (ObjectId teil in selectionRes.Value.GetObjectIds())
                {
                    Entity asdsad = (Entity)tr.GetObject(teil, OpenMode.ForWrite);
                    asdsad.Erase();
                }
                tr.Commit();
                ed.Regen();
                Taste_L_Get_Set = e.Message.wParam.ToInt32();
            }
            else
            {
                if (e.Message.message == 258 && e.Message.wParam.ToInt32() == 27)// 258 für Tastatur 27 Taste "ESC"
                {
                    AbbruchTasteESC_Get_Set = e.Message.wParam.ToInt32();
                    Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
                    //ed.WriteMessage("\n");
                    Autodesk.AutoCAD.ApplicationServices.Application.PreTranslateMessage -= OnPreTranslateMessage;

                }
            }
        }

    }
}


 

------------------
Gruß Wolfgang

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: 07. Mrz. 2018 20:50    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 Meldin 10 Unities + Antwort hilfreich

Hallo Wolfgang,

Hinweis: wenn du die Namespaces in den usings angibst, dann musst du die Objekte im Code nicht mehr voll qualifizieren - das würde den Code um einiges lesbarer machen.

Was du da vorhast, soll ja anscheinend innerhalb eines Befehls ablaufen (du löschst bei ESC-Eingabe das Evenet) .. warum dann der Umweg über das PreTranslateMessage-Event?
Du kannst doch die Objektwahl genauso mit Keywords (in deinem Fall L-Löschen) versehen und gehst damit deinem Problem aus dem Weg. Wenn du diese Schleife erst bei ESC beenden möchtest, dann kannst du das mit dem Promptresult ebenfalls in Erfahrung bringen, ob die Eingabe gecancelt wurde.

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

Meldin
Mitglied



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

Beiträge: 381
Registriert: 15.07.2011

erstellt am: 07. Mrz. 2018 22:24    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,
Zitat:
Original erstellt von Brischke:
.. warum dann der Umweg über das PreTranslateMessage-Event
Ich wollte die Bedienung ein wenig vereinfachen. Da das tool sehr oft benötigt wird wollte ich mir das hin und her zwischen der Taste L und Enter sparen. Denn so wie ich das verstanden habe, muss ich bei einem Keyword auch hin und her drücken. Oder gibt es da noch eine andere Möglichkeit.


------------------
Gruß Wolfgang

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: 08. Mrz. 2018 05:22    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 Meldin 10 Unities + Antwort hilfreich

... nun, wenn die Elemente ohnehin markiert sind, kann man [entf] drücken .. das funktioniert immer.
Die Keywords lassen sich ja inzwischen in der Befehlszeile direkt anklicken. Insofern sehe ich da einen Vorteil in der Anwendung, da der Anwender ohnehin mit der Maus ein Attribut zu wählen hat - ein Wechsel zwischen Tastatur und Maus ist also nicht notwendig.
Ich sehe das zudem so: Der Bedienung von AutoCAD liegt ein gewisses Konzept zugrunde. Das kennen die Anwender. Wenn deine Applikation dann von diesem gewohnten Bedienkonzept abweicht, dann kann es sehr leicht dazu führen, dass nach der Eingabe des [L] gewohnheitsmäßig [Enter] gedrückt wird. Ich würde da in dem gewohnten Bedienkonzept bleiben.
Das PreTranslateMessageEvent fängt die Eingaben ab, das wäre mir ohnehin zu heikel, dieses dann für die Ausführung von Löschaktionen zu verwenden. Beispiel: wenn ein Anwender nun eine Linie zeichnen möchten und den Befehl in der Befehlszeile eintippt, dann sind auf einmal die Elemente gelöscht.

Hilft dir alles nicht weiter .. anscheinend, und wohl auch so gedacht, fängt das PreTranslateMessage-Event die aktuelle Eingabe ab, ohne die Eingabe zu löschen .. was aus meiner Sicht auch Sinn macht, weshalb ich zusammenfassen würde, dass dies nicht der Weg ist, dein Vorhaben zu realisieren.

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

Meldin
Mitglied



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

Beiträge: 381
Registriert: 15.07.2011

erstellt am: 12. Mrz. 2018 16:07    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,
ja du hast recht daher habe ich mein Vorhaben nochmal überdacht und bin "denke ich"  zu einem guten Ergebnis gekommen. Ich möchte aber noch zu deinem Beitrag erwähnen das alles was ich so in AutoCad an Code klöppel nur für mich ist und ich keine Programme, Tools erstelle wie z.B. du daher bin ich der einzige Benutzer und mit solchen Tools möchte ich mir das Leben ein wenig leichter machen. Und von LISP zu c# ist für mich ein ziemlicher Brocken daher hätte ich mich über einen hilfreicheren Hinweis wohl etwas mehr gefreut. Wohl aber die Hinweise der Keywords und Fehleingaben habe ich mir aber zu Herzen genommen und bin denke ich vorab zu einem Guten Ergebnis gekommen. Gerne würde ich mich auch wieder über Kritik und Verbesserung freuen. ""in C weiss ich nämlich manchmal nicht wo ich die Sachen anpacken muss um ein anständiges Ergebnis zu kommen! ""
Code:
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using System.Collections.Generic;
using System.Windows.Forms;
using AcApp = Autodesk.AutoCAD.ApplicationServices.Application;

// This line is not mandatory, but improves loading performances
[assembly: CommandClass(typeof(AutoCAD_CSharp_plug_in12.MyCommands))]

namespace AutoCAD_CSharp_plug_in12
{
    public class MyCommands
    {
        public class MyMessageFilter : IMessageFilter
        {
            public const int WM_KEYDOWN = 256;
            public bool PreFilterMessage(ref Message m)
            {

                if (m.Msg == WM_KEYDOWN) // WM_KEYDOWN
                {
                    Document doc = AcApp.DocumentManager.MdiActiveDocument;
                    if ((int)m.WParam == 76) //  "L" = 76
                    {

                        doc.SendStringToExecute("L" + "\x0d", true, false, true); // "L" + ENTER
                        return true;
                    }
                    else
                    {
                        if ((int)m.WParam == 27) //  "ESC" = 27
                        {
                            doc.SendStringToExecute("\x03", true, false, true);//Escape
                            return true;
                        }
                        else
                        {
                            doc.SendStringToExecute("\x08", true, false, true);//Zeichen löschen
                            return true;
                        }
                    }
                }
                return false;
            }
        }


        [CommandMethod("q1", CommandFlags.UsePickSet | CommandFlags.Redraw | CommandFlags.Modal)]
        public void q1()
        {

            Document doc = AcApp.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            Database db = doc.Database;

            // Setze neue Systemvariablen
            int PICKADDVar = System.Convert.ToInt32(AcApp.GetSystemVariable("PICKADD"));
            int PICKAUTOVar = System.Convert.ToInt32(AcApp.GetSystemVariable("PICKAUTO"));
            int CMDECHOVar = System.Convert.ToInt32(AcApp.GetSystemVariable("CMDECHO"));
            // int OSMODEVar = System.Convert.ToInt32(Application.GetSystemVariable("OSMODE"));
            int DBLCLKEDITVar = System.Convert.ToInt32(AcApp.GetSystemVariable("DBLCLKEDIT"));

            // Setze neue Systemvariablen
            AcApp.SetSystemVariable("PICKADD", 0);
            AcApp.SetSystemVariable("PICKAUTO", 0);
            AcApp.SetSystemVariable("CMDECHO", 0);
            AcApp.SetSystemVariable("DBLCLKEDIT", 0);
            PromptNestedEntityResult Auswahl = null;
            bool EignerAbbruch = false;


            MyMessageFilter MessageFilter = new MyMessageFilter();
            System.Windows.Forms.Application.AddMessageFilter(MessageFilter);

            ed.SetImpliedSelection(new ObjectId[0]); //Aktive Auswahl löschen

            PromptNestedEntityOptions pneo = new PromptNestedEntityOptions("\nWähle ein Attribut oder Auswahl : ");
            pneo.Keywords.Add("Löschen");

            while (true)
            {
                Auswahl = ed.GetNestedEntity(pneo);
                if (Auswahl.Status == PromptStatus.Keyword && Auswahl.StringResult == "Löschen")
                {
                    PromptSelectionResult selectionRes = ed.SelectImplied();
                    if (selectionRes.Status == PromptStatus.OK)
                    {
                        doc.LockDocument();// <----- Wichtig zum Löschen !!!
                        using (Transaction acTrans = doc.TransactionManager.StartTransaction())
                        {
                            foreach (ObjectId teil in selectionRes.Value.GetObjectIds())
                            {
                                Entity asdsad = (Entity)acTrans.GetObject(teil, OpenMode.ForWrite);
                                asdsad.Erase();
                            }
                            acTrans.Commit();
                        }
                        ed.Regen();
                        doc.SendStringToExecute("\x03", true, false, true);//Escape
                        EignerAbbruch = true;
                    }
                }
                if (Auswahl.Status == PromptStatus.OK && Auswahl.ObjectId.ObjectClass.DxfName == "ATTRIB")
                {
                    using (Transaction acTrans = doc.TransactionManager.StartTransaction())
                    {
                        AttributeReference acBlkTbl;
                        acBlkTbl = acTrans.GetObject(Auswahl.ObjectId, OpenMode.ForRead) as AttributeReference;
                        string AttributSuchString = acBlkTbl.TextString;
                        TypedValue[] ObjektFilter = { new TypedValue(0, "INSERT"), new TypedValue(410, AcApp.GetSystemVariable("CTAB").ToString()), new TypedValue(66, 1) };
                        PromptSelectionResult BlöckeMitAttributen = ed.SelectAll(new SelectionFilter(ObjektFilter));
                        List<ObjectId> Blocksammlung = new List<ObjectId>();
                        if (BlöckeMitAttributen.Status == PromptStatus.OK)
                        {
                            foreach (ObjectId BlockID in BlöckeMitAttributen.Value.GetObjectIds())
                            {
                                BlockReference BlockRefID = (BlockReference)acTrans.GetObject(BlockID, OpenMode.ForRead);
                                foreach (ObjectId AttributeId in BlockRefID.AttributeCollection)
                                {
                                    AttributeReference AttributWerte = (AttributeReference)acTrans.GetObject(AttributeId, OpenMode.ForRead);
                                    if (AttributWerte.TextString == AttributSuchString)
                                    {
                                        Blocksammlung.Add(BlockID);
                                    }
                                }

                            }
                            ed.SetImpliedSelection(Blocksammlung.ToArray());
                        }
                    }
                    doc.SendStringToExecute("\x03", true, false, true);//Escape
                    EignerAbbruch = true;
                }
                //                                                                                        //
                if (Auswahl.Status == PromptStatus.Cancel | | Auswahl.Status == PromptStatus.Error)
                {
                    if (EignerAbbruch == true)
                    {
                        EignerAbbruch = false;
                        Auswahl = null;
                    }
                    else
                    {
                        System.Windows.Forms.Application.RemoveMessageFilter(MessageFilter);
                        AcApp.SetSystemVariable("PICKADD", PICKADDVar);
                        AcApp.SetSystemVariable("PICKAUTO", PICKAUTOVar);
                        AcApp.SetSystemVariable("CMDECHO", CMDECHOVar);
                        AcApp.SetSystemVariable("DBLCLKEDIT", DBLCLKEDITVar);
                        break;
                    }
                }
            }
        }
    }
}


------------------
Gruß Wolfgang

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