Удаление команды из стандартного списка команд.

Автор Тема: Удаление команды из стандартного списка команд.  (Прочитано 6608 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Добрый день!

Необходимо отлючить некоторые функции в ACAD. С отключением меню и ленты все понятно, но остаются командная строка, в которой пользователь может набрать нужную команду.
Есть ли возможность, например, убрать команду LINE?
Я думал использовать _UNDFINE, посылая через SendStringToExecute, но в командной строке прописываются все команды которые я отключаю.
Код - C# [Выбрать]
  1. doc.SendStringToExecute("_UNDEFINE LINE", false, false, false);
И результат:
Цитировать
Command: _UNDEFINE
Command to undefine: LINE
Можно ли выполнить в скрытом от пользователя режиме?
Но опять же это работает в режиме одной сессии, при новом запуске надо заново все делать, но если можно скрыть, то в целом пойдет.
Veto() мне не подходит.
Есть ли другие варианты, которые я упустил?

Спаисбо


Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Скорее всего нужно смотреть в сторону обработчика событий AcApp.DocumentManager.MdiActiveDocument.CommandWillStart

Но вот запрещать программно команды автокада - это прям правила плохого тона. Я бы вашу программу за километр обходил

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
К сожалению, CommandWillStart - это обработка уже, выполняемой команды и с помощью ее можно заблокировать команду Veto(). Это не подходит. Команда не должна прям в списке появляться.
это прям правила плохого тонаПочему же? Просто есть такая необходимость со стороны заказчика, который хочет из автокада сделать нечто другое/свое, чтобы основной функционал/назначение было недоступно.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Почему же? Просто есть такая необходимость со стороны заказчика, который хочет из автокада сделать нечто другое/свое, чтобы основной функционал/назначение было недоступно.
Что значит сделать своё? Это как из Мерседеса сделать Москвич? Такие вещи на нашем форуме не обсуждаются. Единственно что можно сделать легально - это переопределить команды, чтобы они выполняли другие действия (например, ничего не делали). Но запуск через точку (т.е. .LINE) переопределить всё-равно нельзя.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Цитировать
Что значит сделать своё? Это как из Мерседеса сделать Москвич?
Не так координально, конечно, просто убрать или заменить, некоторые команды.
Цитировать
Единственно что можно сделать легально - это переопределить команды, чтобы они выполняли другие действия (например, ничего не делали).
Мне как раз и нужно легально, то что не легально - мне не нужно.
А можно сделать переопределение в режиме не видимом для пользователя?


Отмечено как Решение shss 14-11-2016, 19:00:37

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Ну как-то так для команды LINE (ОТРЕЗОК):
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using Autodesk.AutoCAD.Internal;
  8.  
  9. [assembly: ExtensionApplication(typeof(RedefCommand.MyPlugin))]
  10.  
  11. namespace RedefCommand
  12. {
  13.   public class MyPlugin : IExtensionApplication
  14.   {
  15.     void IExtensionApplication.Initialize()
  16.     {
  17.       Utils.RemoveCommand("ACAD_MAIN", "LINE");
  18.       Utils.RemoveCommand("ACAD_MAIN", "ОТРЕЗОК");
  19.     }
  20.  
  21.     void IExtensionApplication.Terminate()
  22.     {
  23.     }
  24.   }
  25. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Более универсальный код, не зависящий от локализации AutoCAD будет выглядеть приблизительно так:
Код - C# [Выбрать]
  1. using System;
  2. using System.Runtime.InteropServices;
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.ApplicationServices;
  5. using Autodesk.AutoCAD.Internal;
  6.  
  7. [assembly: ExtensionApplication(typeof(UndefCommand.MyPlugin))]
  8.  
  9. namespace UndefCommand
  10. {
  11.   public class MyPlugin : IExtensionApplication
  12.   {
  13.     string[] cmd_undef_main_list = new string[] {
  14.         "LINE",
  15.         "PLINE",
  16.         "ARC",
  17.         "SPLINE"
  18.     };
  19.  
  20.     void IExtensionApplication.Initialize()
  21.     {
  22.       foreach (string cmd in cmd_undef_main_list) {
  23.         if (Utils.IsCommandDefined(cmd))
  24.         {
  25.           string cmdLocal = GetCName("_" + cmd);
  26.           Utils.RemoveCommand("ACAD_MAIN", cmdLocal);        
  27.           if (cmdLocal != cmd) Utils.RemoveCommand("ACAD_MAIN", cmd);
  28.         }
  29.       }
  30.     }
  31.  
  32.     void IExtensionApplication.Terminate()
  33.     {
  34.     }
  35.     #region PInvoke
  36.  
  37.     [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode,
  38.       EntryPoint = "?acedGetCName@@YAHPB_WPAPA_W@Z")]
  39.     private extern static Int32 acedGetCName32R18(string Name, out IntPtr otherName);
  40.     [DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode,
  41.       EntryPoint = "?acedGetCName@@YAHPEB_WPEAPEA_W@Z")]
  42.     private extern static Int32 acedGetCName64R18(string Name, out IntPtr otherName);
  43.     [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode,
  44.       EntryPoint = "?acedGetCName@@YAHPB_WPAPA_W@Z")]
  45.     private extern static Int32 acedGetCName32R19(string Name, out IntPtr otherName);
  46.     [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode,
  47.       EntryPoint = "?acedGetCName@@YAHPEB_WPEAPEA_W@Z")]
  48.     private extern static Int32 acedGetCName64R19(string Name, out IntPtr otherName);
  49.     private static string GetCName(string Name)
  50.     {
  51.       IntPtr ptr = IntPtr.Zero;
  52.       if (Application.Version.Major > 18)
  53.       {
  54.         if (IntPtr.Size == 4) acedGetCName32R19(Name, out ptr);
  55.                   else        acedGetCName64R19(Name, out ptr);
  56.       }
  57.       else
  58.       {
  59.         if (IntPtr.Size == 4) acedGetCName32R18(Name, out ptr);
  60.                 else          acedGetCName64R18(Name, out ptr);
  61.       }
  62.       return Marshal.PtrToStringUni(ptr);
  63.     }
  64.     #endregion
  65.   }
  66. }

Но есть одна проблема, связанная с тем, что этот код будет работать только для команд из ядра AutoCAD. Если команда из arx/dll/и.т. и соответствующее приложение еще не загружено, то команда не будет отменена. Соответственно для того, чтобы код работал нужно сначала загрузить приложения, а уже затем отменять команду. Ну и еще смотреть за тем в какой группе команда. Например, команда ЛЕНТА (Ribbon) находится в группе Ribbon, а не ACAD_MAIN. В какой группе находится команда можно узнать если запустить команду _ARX с опцией _Command если приложение, отвечающее за эту команду уже загружено.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение