ADN Open CIS
Сообщество программистов Autodesk в СНГ

22/06/2013

Как в своём коде используя AutoCAD .NET API переопределить команду ССЫЛРЕД (_REFEDIT)?

Как в своём коде используя AutoCAD .NET API переопределить команду ССЫЛРЕД (_REFEDIT)?

 

Вопрос: Мне нужно в своем коде переопределить команду _REFEDIT так, чтобы в некоторых случаях (например, имя чертежа содержало строку Test) вызывался мой код, а в некоторых стандартная команда _REFEDIT. Я проверил, что для команды ОТРЕЗОК (_LINE) работает такой код:

 

Код - C#: [Выделить]
  1. // Add reference to Autodesk.AutoCAD.Interop
  2. // Add reference to Autodesk.AutoCAD.Interop.Common
  3. using Autodesk.AutoCAD.Interop;
  4. using Autodesk.AutoCAD.Interop.Common;
  5.  
  6. [CommandMethod("LINE")]
  7. static public void LineMethod()
  8. {
  9.     Document doc = Application.DocumentManager.MdiActiveDocument;
  10.     Editor ed = doc.Editor;
  11.     if (doc.Name.Contains("Test"))
  12.         ed.WriteMessage("My implementation of line");
  13.     else
  14.     {
  15.         AcadApplication app = (AcadApplication)Application.AcadApplication;
  16.         app.ActiveDocument.SendCommand("_.LINE ");
  17.         ed.WriteMessage("My implementation of line");
  18.     }
  19. }
  20.    
  21. void IExtensionApplication.Initialize()
  22. {
  23.     AcadApplication app = (AcadApplication)Application.AcadApplication;
  24.     app.ActiveDocument.SendCommand("_.UNDEFINE _LINE ");
  25. }

 

Но для команды _REFEDIT аналогичный код не работает. Почему и как заставить его работать?

 

Ответ: Команда ССЫЛРЕД (_REFEDIT) содержится в файле AcRefEd.arx. Если dll-сборка с кодом заменяющей команды загружена до того, как загружен файл AcRefEd.arx, то при вызове команды _REFEDIT в первый раз выполнится заменённая команда и, запустив стандартную команду _REFEDIT, она заставит файл AcRefEd.arx загрузится. А это в свою очередь приведет к тому, что команда _REFEDIT будет переопределена, и в дальнейшем будет вызываться стандартная команда, а не наша. Что же делать?

Смотрим код. В нём есть несколько существенных моментов:

1)        при загрузке нашей dll-сборки принудительно загружается AcRefEd.arx

2)        имя группы команд для нашей команды должно быть ACAD_MAIN, а стандартную команду _REFEDIT мы вызываем через _ACAD_REFEDIT.REFEDIT

 

Код - C#: [Выделить]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.EditorInput;
  5.  
  6. [assembly: ExtensionApplication(typeof(Rivilis.RefEditSubst))]
  7. [assembly: CommandClass(typeof(Rivilis.RefEditSubst))]
  8.  
  9. namespace Rivilis
  10. {
  11.     public class RefEditSubst : IExtensionApplication
  12.     {
  13.         void IExtensionApplication.Initialize()
  14.         {
  15.             // Загружаем принудительно arx-файл для команды _REFEDIT
  16.             SystemObjects.DynamicLinker.LoadModule("AcRefEd.arx", false, false);
  17.         }
  18.         void IExtensionApplication.Terminate()
  19.         {
  20.         }
  21.         //------------------------------------------------
  22.         //     Имя группы обязательно должно быть "ACAD_MAIN"
  23.         //------------------------------------------------
  24.         [CommandMethod("ACAD_MAIN", "RefEdit", CommandFlags.UsePickSet)]
  25.         public void RefEdit()
  26.         {
  27.             Document doc = Application.DocumentManager.MdiActiveDocument;
  28.             Editor ed = doc.Editor;
  29.             ed.WriteMessage("MyRefEdit..");
  30.             if (doc.Name.Contains("Test"))
  31.             {
  32.                 ed.WriteMessage("Наш код для _REFEDIT…");
  33.             }
  34.             else
  35.             {
  36.                 doc.SendStringToExecute("_ACAD_REFEDIT.REFEDIT ", true, false, false);
  37.             }
  38.         }
  39.  
  40.     }
  41. }

 

Обсуждение: http://adn-cis.org/forum/index.php?topic=106.0

Автор: Александр Ривилис
Автор перевода: Александр Ривилис
Опубликовано 22.06.2013
Отредактировано 22.06.2013 в 17:48:30