Как в своём коде используя AutoCAD .NET API переопределить команду ССЫЛРЕД (_REFEDIT)?
Как в своём коде используя AutoCAD .NET API переопределить команду ССЫЛРЕД (_REFEDIT)?
Вопрос: Мне нужно в своем коде переопределить команду _REFEDIT так, чтобы в некоторых случаях (например, имя чертежа содержало строку Test) вызывался мой код, а в некоторых стандартная команда _REFEDIT. Я проверил, что для команды ОТРЕЗОК (_LINE) работает такой код:
- // Add reference to Autodesk.AutoCAD.Interop
- // Add reference to Autodesk.AutoCAD.Interop.Common
- using Autodesk.AutoCAD.Interop;
- using Autodesk.AutoCAD.Interop.Common;
- [CommandMethod("LINE")]
- static public void LineMethod()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Editor ed = doc.Editor;
- if (doc.Name.Contains("Test"))
- ed.WriteMessage("My implementation of line");
- else
- {
- AcadApplication app = (AcadApplication)Application.AcadApplication;
- app.ActiveDocument.SendCommand("_.LINE ");
- ed.WriteMessage("My implementation of line");
- }
- }
- void IExtensionApplication.Initialize()
- {
- AcadApplication app = (AcadApplication)Application.AcadApplication;
- app.ActiveDocument.SendCommand("_.UNDEFINE _LINE ");
- }
Но для команды _REFEDIT аналогичный код не работает. Почему и как заставить его работать?
Ответ: Команда ССЫЛРЕД (_REFEDIT) содержится в файле AcRefEd.arx. Если dll-сборка с кодом заменяющей команды загружена до того, как загружен файл AcRefEd.arx, то при вызове команды _REFEDIT в первый раз выполнится заменённая команда и, запустив стандартную команду _REFEDIT, она заставит файл AcRefEd.arx загрузится. А это в свою очередь приведет к тому, что команда _REFEDIT будет переопределена, и в дальнейшем будет вызываться стандартная команда, а не наша. Что же делать?
Смотрим код. В нём есть несколько существенных моментов:
1) при загрузке нашей dll-сборки принудительно загружается AcRefEd.arx
2) имя группы команд для нашей команды должно быть ACAD_MAIN, а стандартную команду _REFEDIT мы вызываем через _ACAD_REFEDIT.REFEDIT
- using System;
- using Autodesk.AutoCAD.Runtime;
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.EditorInput;
- [assembly: ExtensionApplication(typeof(Rivilis.RefEditSubst))]
- [assembly: CommandClass(typeof(Rivilis.RefEditSubst))]
- namespace Rivilis
- {
- public class RefEditSubst : IExtensionApplication
- {
- void IExtensionApplication.Initialize()
- {
- // Загружаем принудительно arx-файл для команды _REFEDIT
- SystemObjects.DynamicLinker.LoadModule("AcRefEd.arx", false, false);
- }
- void IExtensionApplication.Terminate()
- {
- }
- //------------------------------------------------
- // Имя группы обязательно должно быть "ACAD_MAIN"
- //------------------------------------------------
- [CommandMethod("ACAD_MAIN", "RefEdit", CommandFlags.UsePickSet)]
- public void RefEdit()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Editor ed = doc.Editor;
- ed.WriteMessage("MyRefEdit..");
- if (doc.Name.Contains("Test"))
- {
- ed.WriteMessage("Наш код для _REFEDIT…");
- }
- else
- {
- doc.SendStringToExecute("_ACAD_REFEDIT.REFEDIT ", true, false, false);
- }
- }
- }
- }
Обсуждение: http://adn-cis.org/forum/index.php?topic=106.0
Автор перевода: Александр Ривилис
Опубликовано 22.06.2013
Отредактировано 22.06.2013 в 17:48:30