Тема: Реакция на двойной щелчок или замена команды
Пробовал это сделать по своему, не совсем получилось, думал я чего-то не понимаю. Взял пример - то же самое...
Задача - заменить стандартный диалог редактирования атрибутов определённых блоков, т.е. мне нужен не столько двойной щелчок, сколько замена EATTEDIT, но и там и там проблема одна...
В общем всё работает на любых объектах, кроме динамических блоков.
Т.е. когда где-то в DocumentManager_DocumentLockModeChanged() или в Application_BeginDoubleClick() мы пытаемся получить выбранный (PICKFIRST) объект получаем ошибку:
Application.DocumentManager.MdiActiveDocument.Editor.SelectImplied().Status == PromptStatus.Error
Причём оно как-то иногда срабатывает, например, после DBLCLKEDIT = 0, DBLCLKEDIT = 1 (передёргиваем туда сюда), но тоже не всегда и, теперь даже и так не могу воспроизвести.
Кто-нибудь сталкивался? Что не так?
P.S. AutoCAD 2015, 2014, 2013, ...; VS 2013 C#; Win7x64
P.P.S. Ну и мой код тогда уж:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using f = System.Windows.Forms; using Autodesk.AutoCAD.ApplicationServices; using System.IO; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.DatabaseServices; using System.Reflection; using Autodesk.AutoCAD.Geometry; namespace DoubleClickHandler { public class Class1 { [CommandMethod("AR77TEST")] public void test() { Application.DocumentManager.DocumentLockModeWillChange += DocumentManager_DocumentLockModeWillChange; Application.DocumentManager.DocumentLockModeChanged += DocumentManager_DocumentLockModeChanged; Application.DocumentManager.CurrentDocument.CommandEnded += CurrentDocument_CommandEnded; Application.DocumentManager.CurrentDocument.CommandWillStart += CurrentDocument_CommandWillStart; Application.DocumentManager.CurrentDocument.CommandCancelled += CurrentDocument_CommandCancelled; Application.DocumentManager.CurrentDocument.Database.ObjectErased += Database_ObjectErased; Application.DocumentManager.CurrentDocument.Editor.PromptingForCorner += Editor_PromptingForCorner; Application.BeginDoubleClick += Application_BeginDoubleClick; Application.DocumentManager.CurrentDocument.Editor.PromptedForCorner += Editor_PromptedForCorner; Application.DocumentManager.DocumentLockModeChangeVetoed += DocumentManager_DocumentLockModeChangeVetoed; } void DocumentManager_DocumentLockModeChangeVetoed(object sender, DocumentLockModeChangeVetoedEventArgs e) { log(MethodBase.GetCurrentMethod().Name + "\r\n"); log("\t" + e.GlobalCommandName + "\r\n"); if (e.GlobalCommandName.ToUpper().Equals("EATTEDIT")) { Editor ed = Application.DocumentManager.CurrentDocument.Editor; var res = ed.SelectImplied(); log("\tSelectImplied status is " + res.Status.ToString() + "\r\n"); //==Error } } void Database_ObjectErased(object sender, ObjectErasedEventArgs e) { log(MethodBase.GetCurrentMethod().Name + "\r\n"); } void CurrentDocument_CommandCancelled(object sender, CommandEventArgs e) { log(MethodBase.GetCurrentMethod().Name + "\r\n"); log("\t" + e.GlobalCommandName + "\r\n"); } void CurrentDocument_CommandWillStart(object sender, CommandEventArgs e) { log(MethodBase.GetCurrentMethod().Name + "\r\n"); log("\t" + e.GlobalCommandName + "\r\n"); } void CurrentDocument_CommandEnded(object sender, CommandEventArgs e) { log(MethodBase.GetCurrentMethod().Name + "\r\n"); log("\t" + e.GlobalCommandName + "\r\n"); } void DocumentManager_DocumentLockModeChanged(object sender, DocumentLockModeChangedEventArgs e) { log(MethodBase.GetCurrentMethod().Name + "\r\n"); log("\tGlobalCommandName = " + e.GlobalCommandName + "\r\n"); log("\tCurrentMode = " + e.CurrentMode.ToString() + "\r\n"); log("\tMyCurrentMode = " + e.MyCurrentMode.ToString() + "\r\n"); log("\tMyPreviousMode = " + e.MyPreviousMode.ToString() + "\r\n"); if (e.GlobalCommandName.ToUpper().Equals("EATTEDIT")) { Editor ed = Application.DocumentManager.CurrentDocument.Editor; var res = ed.SelectImplied(); log("\tSelectImplied status is " + res.Status.ToString() + "\r\n"); if (res.Status == PromptStatus.OK) { log("\tSelected count is " + res.Value.Count.ToString() + "\r\n"); if (res.Value.Count == 1) { log("\tDxfName = " + res.Value.GetObjectIds()[0].ObjectClass.DxfName + "\r\n"); log("\tVeto\r\n"); e.Veto(); f.MessageBox.Show("Настройки"); } } } } void DocumentManager_DocumentLockModeWillChange(object sender, DocumentLockModeWillChangeEventArgs e) { log(MethodBase.GetCurrentMethod().Name + "\r\n"); log("\tGlobalCommandName = " + e.GlobalCommandName + "\r\n"); log("\tCurrentMode = " + e.CurrentMode.ToString() + "\r\n"); log("\tMyCurrentMode = " + e.MyCurrentMode.ToString() + "\r\n"); log("\tMyNewMode = " + e.MyNewMode.ToString() + "\r\n"); } void Editor_PromptedForCorner(object sender, PromptPointResultEventArgs e) { log(MethodBase.GetCurrentMethod().Name + "\r\n"); flag = false; } bool flag_ = false; //Если выбран объект, но двойной щелчок на пустом месте bool flag { get { return flag_; } set { flag_ = flag; log(MethodBase.GetCurrentMethod().Name + "\r\n"); log("\tflag = " + flag_.ToString() + "\r\n"); } } void Editor_PromptingForCorner(object sender, PromptPointOptionsEventArgs e) { log(MethodBase.GetCurrentMethod().Name + "\r\n"); flag = true; } //bool flag2_ = false; //Двойной щелчок был на нашем объекте и мы отменили стандартную команду //bool flag2 //{ // get { return flag2_; } // set // { // flag2_ = value; // log(MethodBase.GetCurrentMethod().Name + "\r\n"); // log("\tflag2 = " + flag2_.ToString() + "\r\n"); // } //} void Application_BeginDoubleClick(object sender, BeginDoubleClickEventArgs e) { log(MethodBase.GetCurrentMethod().Name + "\r\n"); if (flag) return; Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; PromptSelectionResult res = ed.SelectImplied(); //res = ed.GetSelection(); log("\tSelection status is " + res.Status.ToString() + "\r\n"); if (res.Status == PromptStatus.OK) { ObjectId[] ids = res.Value.GetObjectIds(); log("\tSelected count is " + ids.Length.ToString() + "\r\n"); log("\tDxfName = " + ids[0].ObjectClass.DxfName + "\r\n"); if (ids.Length == 1 && ids[0].ObjectClass.DxfName.ToUpper().Equals("INSERT")) { //flag2 = true; f.MessageBox.Show("Настройки"); } } } void log(string entry) { File.AppendAllText(@"c:\temp\test.log", entry); } } }