| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Event bei Umschalten der Ansicht (3167 mal gelesen)
|
Boortsneggor Mitglied Ingenieur
Beiträge: 49 Registriert: 27.12.2011 Win7 Prof, Visual Studio 2010/2012, ObjectARX 2008/2012/2013, ACAD 2008/2012/2013
|
erstellt am: 18. Apr. 2014 16:08 <-- editieren / zitieren --> Unities abgeben:
Guten Tag, ich habe mir neben der klassischen Toolbar parallel noch eine Methode zum Erstellen und Einfügen einer Ribbonbar geschrieben. Jetzt suche ich nach einer Möglichkeit, zu erkennen, ob der Anwender zur klassischen Ansicht und umgedreht wechselt. Ich würde gern bei der klassischen Ansicht die Toolbar und sonst die Ribbonbar laden lassen. Nebenbei, kann es sein, dass Autodesk bei AutoCad 2015 das Umstellen auf die klassische Ansicht gar nicht mehr möglich ist? Vielen Dank und ein schönes Osterfest!
------------------ Robert Menger Menger Engineering GmbH Entwicklung Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 18. Apr. 2014 18:01 <-- editieren / zitieren --> Unities abgeben: Nur für Boortsneggor
Ob der Anwender "klassisch" oder einen selbstbenannten Arbeitsbereich hat, auf das würde ich mich nicht einlassen. Für Dich ist ja nur wichtig, ob die Multifunktionsleiste aktiviert oder deaktiviert ist. Entsprechend würde ich die Systemvariable "RIBBONSTATE" überwachen und gegebenenfalls auf die Änderung dieser reagieren. Zitat: kann es sein, dass Autodesk bei AutoCad 2015 das Umstellen auf die klassische Ansicht gar nicht mehr möglich ist?
Es ist tatsächlich so, dass kein Arbeitsbereich mehr vordefiniert ist, der "AutoCAD klassisch" benannt ist. Es gibt aber sehr wohl noch die "alten" Werkzeugkästen und man kann sich einen klassischen Arbeitsbereich damit rel. einfach erstellen, auch mit 2015. ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Boortsneggor Mitglied Ingenieur
Beiträge: 49 Registriert: 27.12.2011 Win7 Prof, Visual Studio 2010/2012, ObjectARX 2008/2012/2013, ACAD 2008/2012/2013
|
erstellt am: 25. Apr. 2014 17:18 <-- editieren / zitieren --> Unities abgeben:
Hallo vielen Dank, dass mit der Systemvariable "RIBBONSTATE" scheint schon mal zu funktionieren. Ich lade meine GUI-Elemente mit dem Event "SystemVariableChanged" bzw. "SystemVariableChanging". Leider funktioniert das Laden nicht ganz zuverlässig, wenn ich beispielsweise von "AutoCad klassisch" auf "Zeichnung und Beschriftung" umschalte, wird die SystemVariable scheinbar sehr schnell, mehrmals hintereinander geändert. Ich suche nun eine Möglichkeit, vor allem die Ribbonbar zuverlässig in Abhängigkeit der Systemvariable zu laden? Ich habe in einem anderen Thread gelesen, dass man für das Laden einer Ribbonbar in der Initialize-Methode einen Reactor verwenden soll. Wie ist das genau gemeint, müsste ich das vielleicht mit einbauen? Grüße Robert ------------------ Robert Menger Menger Engineering GmbH Entwicklung Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 26. Apr. 2014 10:32 <-- editieren / zitieren --> Unities abgeben: Nur für Boortsneggor
Zitat: [...]wird die SystemVariable scheinbar sehr schnell, mehrmals hintereinander geändert
Die Vorgehensweise in solchen/ähnlichen Fällen wäre von mir: - ich habe einen stetigen Eventhandler, der die Änderung der Systemvariable überwacht. - wird dieser "angesprungen", dann erzeuge ich einen temporären Eventhandler, der auf Editor.EnteringQuiescentState reagiert (natürlich habe ich ein Flag parallel dazu, das mir sagt, ob dieser neue Eventhandler schon aktiviert ist) - und wenn AutoCAD dann 100mal die Sysvar geschaltet hat, wartet mein Prozess dann darauf, dass AutoCAD mit all seinen eigenen Aktionen fertig ist ... und jetzt wird EnteringQuiescentState angesprungen, wo jetzt die weiteren Aktionen (in Deinem Fall Menü umbauen) durchgeführt wird. In dieser Sub wird auch gleich der Eventhandler zu Editor.EnteringQuiescentState wieder zurückgenommen. ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Boortsneggor Mitglied Ingenieur
Beiträge: 49 Registriert: 27.12.2011 Win7 Prof, Visual Studio 2010/2012, ObjectARX 2008/2012/2013, ACAD 2008/2012/2013
|
erstellt am: 27. Apr. 2014 12:57 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für die Antwort. Gleiches ist mir nach dem Verfassen des letzten Beitrages auch in den Sinn gekommen . Nur hatte ich es mit dem Event CommandEnds gemacht. EnteringQuiescentState ist an dieser Stelle wohl besser geeignet. Das Laden des jeweiligen Menus nach Umschalten der Ansicht funktioniert jetzt einwandfrei. Jetzt habe ich nur noch das Problem, dass meine Ribbonbar am Anfang des Programmes nicht geladen wird. Ich hatte versucht den EnteringQuiescentState-EventHandler einfach in der Initialize-Funktion zu registrieren. Leider ohne Erfolg. Ich vermute ein ähnliches Problem. Wahrscheinlich wird versucht das Ribbon-Menu zu laden, bevor AutoCad die Menuleiste geladen hat. Mit dem CommandEnds-Event und Abfragen des "RIBBON"-Commands klappt es auch nicht. Hast du hierfür noch eine Idee? Vielen Dank für deine Hilfe und ein schönen Restsonntag noch! Grüße Robert ------------------ Robert Menger Menger Engineering GmbH Entwicklung Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 27. Apr. 2014 15:47 <-- editieren / zitieren --> Unities abgeben: Nur für Boortsneggor
Zitat: Hast du hierfür noch eine Idee?
Jetzt müsste ich mehr von dem sehen, was Du machst und vor allem, wie sich AutoCAD verhält, wenn es nicht funktioniert. Insbesondere das EnteringQuiescentState hätte ich mir schon auch funktionierend erwartet, auch wenn es in der Initialize-Implementation gestartet wird. Ganz dummer Gedanke: lass in der Initialize ein SendCommand oder ähnliches aus, das dann den Rest der Funktion erfüllt. Da SendCommand asynchron startet, sollte das eigentlich auch erst am Ende der gesamten AutoCAD Initialisierung aktiv werden dürfen. Und dass der Weg nicht schön ist, weiß ich, aber es ist jetzt halt mal ein Workaround mit hohem Wahrscheinlichkeitsanteil an Funktionstüchtigkeit. ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Karlovac Mitglied
Beiträge: 54 Registriert: 12.09.2013 AutoCAD Mechanical 2012-2015 Windows 7 Enterprise X64 Visual Studio 2010/2013 Intel Xeon W3680 Nvidia Quadro 2000 16 GB RAM
|
erstellt am: 28. Apr. 2014 08:56 <-- editieren / zitieren --> Unities abgeben: Nur für Boortsneggor
Hallo, vielleicht deckt folgendes deine Wünsche ab: Code:
// aus der myPlugin.cs void IExtensionApplication.Initialize() { if (Autodesk.AutoCAD.Ribbon.RibbonServices.RibbonPaletteSet != null) { Autodesk.AutoCAD.Ribbon.RibbonServices.RibbonPaletteSet.Loaded += new EventHandler(workspaceLoadedEventHandler); } else { Autodesk.AutoCAD.Ribbon.RibbonServices.RibbonPaletteSetCreated += new EventHandler(ribbonPaletteSetCreated); } } private void ribbonPaletteSetCreated(object Sender, EventArgs e) { Autodesk.AutoCAD.Ribbon.RibbonServices.RibbonPaletteSet.Loaded += new EventHandler(workspaceLoadedEventHandler); } private void workspaceLoadedEventHandler(object Sender, EventArgs e) { System.Windows.Forms.MessageBox.Show("RibbonPaletteSet changed. Active workspace = " + (string)Application.GetSystemVariable("WSCURRENT")); }
Das RibbonPaletteSet.Loaded Event springt jedes mal an wenn sich das Interface ändert: - andere Workspace ausgewählt - Änderung im CUI-Menu - Menuload/Unload - falls im Startup: wenn das Interface das erste Mal hochfährt RibbonServices.RibbonPaletteSetCreated Event deshalb, weil falls man die *.dll über z.B. acad.lsp ladet dann ist Autodesk.AutoCAD.Ribbon.RibbonServices.RibbonPaletteSet noch auf null. Dann wird das "loaded" Event eben erst hinzugefügt wenn das RibbonPaletteSet erstellt wird .... Gruß Karlovac Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Boortsneggor Mitglied Ingenieur
Beiträge: 49 Registriert: 27.12.2011 Win7 Prof, Visual Studio 2010/2012, ObjectARX 2008/2012/2013, ACAD 2008/2012/2013
|
erstellt am: 07. Mai. 2014 16:34 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe es jetzt noch ein wenig anders lösen können, hier mal meine Lösung: Code:
//methode which is called by loading the dll but before opening a document!!! public void Initialize() { //event which is fired by changing any system variable acadApp.SystemVariableChanging += new Autodesk.AutoCAD.ApplicationServices.SystemVariableChangingEventHandler(SysVariableChanging); if (Autodesk.Windows.ComponentManager.Ribbon == null) { //if the ribbonbar of acad isn´t ready, register the event handler to wait until it is Autodesk.Windows.ComponentManager.ItemInitialized += new EventHandler<RibbonItemEventArgs>(ItemInitialized); }else{ //load the gui depending on the ribbonState of acad LoadMenu(); } } //event which was fired if an item of componentmanager was ready public void ItemInitialized(object sender, RibbonItemEventArgs args) { if (Autodesk.Windows.ComponentManager.Ribbon != null) { //load the gui depending on the ribbonState of acad LoadMenu(); //unregister the event handler Autodesk.Windows.ComponentManager.ItemInitialized -= new EventHandler<RibbonItemEventArgs>(ItemInitialized); } } //methode which would be called by changing any system variable public void SysVariableChanging(object senderObj, Autodesk.AutoCAD.ApplicationServices.SystemVariableChangingEventArgs sysVarChEvtArgs) { //if the variable ribbonstate is changed if (sysVarChEvtArgs.Name == "RIBBONSTATE") { //start the event for waiting til the application is ready _doc.Editor.EnteringQuiescentState += new EventHandler(EnteringQuiesencentState); } } public void EnteringQuiesencentState(object senderObj, EventArgs args) { //unregister the event _doc.Editor.EnteringQuiescentState -= new EventHandler(EnteringQuiesencentState); //load the gui depending on the ribbonState of acad LoadMenu(); } //methode which would be called by unloading the interface public void Terminate() { acadApp.SystemVariableChanging -= new Autodesk.AutoCAD.ApplicationServices.SystemVariableChangingEventHandler(SysVariableChanging); }
Es war zwar etwas haarig mit den verschachtelten Events, aber jetzt funktioniert alles wunderprächtig! Vielen Dank nochmal für eure Hilfe! Grüße Robert ------------------ Robert Menger Menger Engineering GmbH Entwicklung Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|