Ошибка при выполнении Editor.Command()

Автор Тема: Ошибка при выполнении Editor.Command()  (Прочитано 7084 раз)

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

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

  • ADN OPEN
  • Сообщений: 22
  • Карма: 2
Пытаюсь запустить команду через Editor.Command(), вылетает ошибка и автокад закрывается.
Если запускать через
Код - C# [Выбрать]
  1. doc.SendStringToExecute(button.CommandParameter + " ", true, false, true);
, то все работает.
Автокад 2021 Русский.
В чем может быть проблема?:

Код - C# [Выбрать]
  1. using System;
  2. using System.Windows.Media.Imaging;
  3. using System.Reflection;
  4. using Autodesk.Windows;
  5. using Autodesk.AutoCAD.Runtime;
  6. using Autodesk.AutoCAD.ApplicationServices;
  7. using acApp = Autodesk.AutoCAD.ApplicationServices.Application;
  8. using Autodesk.AutoCAD.EditorInput;
  9.  
  10. namespace AcadUtils
  11. {
  12.     partial class Main
  13.     {
  14.         BitmapImage getBitmap(string fileName)
  15.         {
  16.             BitmapImage bmp = new BitmapImage();
  17.             // BitmapImage.UriSource must be in a BeginInit/EndInit block.              
  18.             bmp.BeginInit();
  19.             bmp.UriSource = new Uri(string.Format("pack://application:,,,/{0};component/{1}",
  20.               Assembly.GetExecutingAssembly().GetName().Name,
  21.               fileName));
  22.             bmp.EndInit();
  23.  
  24.             return bmp;
  25.         }
  26.  
  27.  
  28.        
  29.         /// <summary>
  30.         /// Построение вкладки
  31.         /// </summary>
  32.         [CommandMethod("AcadUtils_CreateRibbon")]
  33.        public void BuildRibbonTab()
  34.         {
  35.             // Если лента еще не загружена
  36.             if (!isLoaded())
  37.             {
  38.                 // Строим вкладку
  39.                 AddRibbon();
  40.                 // Подключаем обработчик событий изменения системных переменных
  41.                 acApp.SystemVariableChanged += new SystemVariableChangedEventHandler(acadApp_SystemVariableChanged);
  42.             }
  43.         }
  44.        
  45.        
  46.         /// <summary>
  47.         /// Проверка "загруженности" ленты
  48.         /// </summary>
  49.         /// <returns></returns>
  50.          bool isLoaded()
  51.         {
  52.             bool _loaded = false;
  53.             RibbonControl ribCntrl = Autodesk.Windows.ComponentManager.Ribbon;
  54.             // Делаем итерацию по вкладкам ленты
  55.             foreach (RibbonTab tab in ribCntrl.Tabs)
  56.             {
  57.                 // И если у вкладки совпадает идентификатор и заголовок, то значит вкладка загружена
  58.                 if (tab.Id.Equals("ACADUTILS_RIBBON_TAB_ID") & tab.Title.Equals("Утилиты Autocad"))
  59.                 { _loaded = true; break; }
  60.                 else _loaded = false;
  61.             }
  62.             return _loaded;
  63.         }
  64.  
  65.  
  66.  
  67.          /// <summary>
  68.          /// Удаление своей вкладки с ленты
  69.          /// </summary>
  70.         [CommandMethod("AcadUtils_RemoveRibbon")]
  71.        public void RemoveRibbonTab()
  72.         {
  73.             try
  74.             {
  75.                 RibbonControl ribCntrl = Autodesk.Windows.ComponentManager.Ribbon;
  76.                 // Делаем итерацию по вкладкам ленты
  77.                 foreach (RibbonTab tab in ribCntrl.Tabs)
  78.                 {
  79.                     if (tab.Id.Equals("ACADUTILS_RIBBON_TAB_ID") & tab.Title.Equals("Утилиты Autocad"))
  80.                     {
  81.                         // И если у вкладки совпадает идентификатор и заголовок, то удаляем эту вкладку
  82.                         ribCntrl.Tabs.Remove(tab);
  83.                         // Отключаем обработчик событий
  84.                         acApp.SystemVariableChanged -= new SystemVariableChangedEventHandler(acadApp_SystemVariableChanged);
  85.                         // Останавливаем итерацию
  86.                         break;
  87.                     }
  88.                 }
  89.             }
  90.             catch (Autodesk.AutoCAD.Runtime.Exception ex)
  91.             {
  92.                 Autodesk.AutoCAD.ApplicationServices.Application.
  93.                   DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.Message);
  94.             }
  95.         }
  96.  
  97.  
  98.  
  99.          /// <summary>
  100.          /// Обработка события изменения системной переменной.
  101.          /// Будем следить за системной переменной WSCURRENT (текущее рабочее пространство),
  102.          /// чтобы наша вкладка не "терялась" при изменение рабочего пространства
  103.          /// </summary>
  104.          /// <param name="sender"></param>
  105.          /// <param name="e"></param>
  106.         void acadApp_SystemVariableChanged(object sender, SystemVariableChangedEventArgs e)
  107.         {
  108.             if (e.Name.Equals("WSCURRENT")) BuildRibbonTab();
  109.         }
  110.  
  111.        
  112.         public void AddRibbon()
  113.         {
  114.             Autodesk.Windows.RibbonControl ribbonControl = Autodesk.Windows.ComponentManager.Ribbon;
  115.  
  116.             // Создаем Ribbon tab
  117.             RibbonTab Tab = new RibbonTab();
  118.             Tab.Title = "Утилиты Autocad";
  119.             Tab.Id = "ACADUTILS_RIBBON_TAB_ID";
  120.  
  121.             ribbonControl.Tabs.Add(Tab);
  122.  
  123.             // Создаем Ribbon panel
  124.             Autodesk.Windows.RibbonPanelSource srcPanel = new RibbonPanelSource();
  125.             srcPanel.Title = "Форматирование текста";
  126.  
  127.             RibbonPanel Panel = new RibbonPanel();
  128.             Panel.Source = srcPanel;
  129.             Tab.Panels.Add(Panel);
  130.  
  131.             // Создаем кнопки
  132.             Autodesk.Windows.RibbonButton button1 = new RibbonButton();
  133.             button1.Text = "Замена текстовых стилей";
  134.             button1.Id = "cmdButton1";
  135.             button1.Size = RibbonItemSize.Large;
  136.             button1.ShowText = true;
  137.             button1.ShowImage = true;
  138.             button1.LargeImage = getBitmap("TextStReset_large.png");
  139.             button1.Image = getBitmap("TextStReset_small.png");
  140.             button1.CommandParameter = "AcadUtils_TextStyleChangeText";
  141.             button1.CommandHandler = new MyCmdHandler();
  142.  
  143.             Autodesk.Windows.RibbonButton button2 = new RibbonButton();
  144.             button2.Text = "Сброс форматирования Мтекст";
  145.             button2.Id = "cmdButton2";
  146.             button2.Size = RibbonItemSize.Large;
  147.             button2.ShowText = true;
  148.             button2.ShowImage = true;
  149.             button2.LargeImage = getBitmap("MTextReset_large.png");
  150.             button2.Image = getBitmap("MTextReset_small.png");
  151.             button2.CommandParameter = "AcadUtils_MTextClear";
  152.             button2.CommandHandler = new MyCmdHandler();
  153.  
  154.             Autodesk.Windows.RibbonButton button3 = new RibbonButton();
  155.             button3.Text = "Сложение";
  156.             button3.Id = "cmdButton3";
  157.             button3.Size = RibbonItemSize.Standard;
  158.             button3.ShowText = true;
  159.             button3.ShowImage = true;
  160.             button3.LargeImage = getBitmap("TextSumm_large.png");
  161.             button3.Image = getBitmap("TextSumm_small.png");
  162.             button3.CommandParameter = "AcadUtils_TextSumm";
  163.             button3.CommandHandler = new MyCmdHandler();
  164.  
  165.             Autodesk.Windows.RibbonButton button4 = new RibbonButton();
  166.             button4.Text = "Умножение";
  167.             button4.Id = "cmdButton4";
  168.             button4.Size = RibbonItemSize.Standard;
  169.             button4.ShowText = true;
  170.             button4.ShowImage = true;
  171.             button4.LargeImage = getBitmap("TextMult_large.png");
  172.             button4.Image = getBitmap("TextMult_small.png");
  173.             button4.CommandParameter = "AcadUtils_TextMult";
  174.             button4.CommandHandler = new MyCmdHandler();
  175.  
  176.             // Создаем Split button
  177.             RibbonSplitButton ribSplitButton = new RibbonSplitButton();
  178.             ribSplitButton.Text = "RibbonSplitButton"; //Required not to crash AutoCAD when using cmd locator
  179.             ribSplitButton.ShowText = true;
  180.  
  181.             ribSplitButton.Items.Add(button1);
  182.             ribSplitButton.Items.Add(button2);
  183.  
  184.             ////Создаем RowPanel
  185.             RibbonRowPanel ribRowPanel = new RibbonRowPanel();
  186.             ribRowPanel.Items.Add(button3);
  187.             ribRowPanel.Items.Add(button4);
  188.            
  189.             RibbonRowBreak ribbonRowBreak = new RibbonRowBreak();
  190.             ribRowPanel.Items.Add(ribbonRowBreak);
  191.  
  192.             ribRowPanel.Items.Add(ribSplitButton);
  193.  
  194.  
  195.             //srcPanel.Items.Add(ribSplitButton);
  196.             //srcPanel.Items.Add(new RibbonSeparator());
  197.             //srcPanel.Items.Add(button3);
  198.             //srcPanel.Items.Add(button4);
  199.             srcPanel.Items.Add(ribRowPanel);
  200.  
  201.  
  202.             //Tab.IsActive = true;
  203.         }
  204.  
  205.         public class MyCmdHandler : System.Windows.Input.ICommand
  206.         {
  207.             public bool CanExecute(object parameter)
  208.             {
  209.                 return true;
  210.             }
  211.  
  212.             public event EventHandler CanExecuteChanged;
  213.  
  214.             public void Execute(object parameter)
  215.             {
  216.                 Document doc = acApp.DocumentManager.MdiActiveDocument;
  217.                 Editor editor = doc.Editor;
  218.  
  219.                 if (parameter is RibbonButton)
  220.                 {
  221.                     RibbonButton button = parameter as RibbonButton;
  222.  
  223.                     if (button.Id != null) //&& button.Id.Equals("cmdButton1")
  224.                     {
  225.                         //Кроме того, на AutoCAD 2015(и новее) вы можете использовать Editor.Command или Editor.CommandAsync, что намного лучше.
  226.                         //doc.SendStringToExecute(button.CommandParameter + " ", true, false, true);
  227.                         editor.Command(button.CommandParameter);
  228.                     }
  229.  
  230.                 }
  231.             }
  232.         }
  233.  
  234.     }
  235. }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при выполнении Editor.Command()
« Ответ #1 : 08-12-2020, 18:13:16 »
Пытаюсь запустить команду через Editor.Command(), вылетает ошибка и автокад закрывается.
И правильно делает. В этом контексте Editor.Command работать не должна. Можешь еще попробовать Editor.CommandAsync
Но чем тебя не устраивает SendStringToExecute?
И не заметил у тебя в коде функций обработчиков команд для button.CommandParameter
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737

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

  • ADN OPEN
  • Сообщений: 22
  • Карма: 2
Re: Ошибка при выполнении Editor.Command()
« Ответ #3 : 09-12-2020, 10:42:10 »
Но чем тебя не устраивает SendStringToExecute?
Если честно, не понял как сбросить предыдущую команду типа - ^C^C. Думал что Editor.Command()  сбрасывает.

И не заметил у тебя в коде функций обработчиков команд для button.CommandParameter
Вот пример метода обработчика, но там вроде ничего особенного:

Код - C# [Выбрать]
  1. /// <summary>
  2.     /// Меняет все шрифты на один шрифт во всех текстовых стилях.
  3.     /// </summary>
  4.     [CommandMethod("AcadUtils_TextStyleChangeText", CommandFlags.UsePickSet | CommandFlags.Redraw)]
  5.         public static void TextStyleChangeText()
  6.         {
  7.             //https://adn-cis.org/forum/index.php?topic=7669.0
  8.             //Database database = HostApplicationServices.WorkingDatabase;
  9.             Autodesk.AutoCAD.ApplicationServices.Document acDoc = Application.DocumentManager.MdiActiveDocument;
  10.             Editor editor = acDoc.Editor;// Application.DocumentManager.MdiActiveDocument.Editor;
  11.             Database database = acDoc.Database;
  12.             using (Transaction transaction = database.TransactionManager.StartTransaction())
  13.             {
  14.                 editor.WriteMessage("\nЗамена всех шрифтов на один во всех текстовых стилях.\n");
  15.  
  16.                 PromptStringOptions promptStringOptions = new PromptStringOptions("Введите название шрифта(например: ISOCPEUR ):");
  17.                 PromptResult promptResult = editor.GetString(promptStringOptions);
  18.                 string fontName = "ISOCPEUR";
  19.  
  20.                 if (!promptResult.StringResult.Equals(""))
  21.                 {
  22.                    fontName = promptResult.StringResult;
  23.                 }
  24.  
  25.                 SymbolTable symTable = (SymbolTable)transaction.GetObject(database.TextStyleTableId, OpenMode.ForRead);
  26.                 foreach (ObjectId id in symTable)
  27.                 {
  28.                     TextStyleTableRecord symbol = (TextStyleTableRecord)transaction.GetObject(id, OpenMode.ForWrite);
  29.  
  30.                     try
  31.                     {
  32.                         //TODO: Access to the symbol
  33.                         symbol.Font = new FontDescriptor(fontName, false, false, 0, 0); //symbol.FileName = "ISOCPEUR.ttf";
  34.                         symbol.ObliquingAngle = 0;
  35.                         editor.WriteMessage(string.Format("\nName: {0} - {1}", symbol.Name, symbol.FileName));
  36.                     }
  37.                     catch(Autodesk.AutoCAD.Runtime.Exception e) {
  38.                         editor.WriteMessage("Ошибка:{0}", e.Message);
  39.                     }
  40.  
  41.                 }
  42.  
  43.                 //Screen refresh
  44.                 //acDoc.TransactionManager.EnableGraphicsFlush(true);
  45.                 //acDoc.TransactionManager.QueueForGraphicsFlush();
  46.                 //Autodesk.AutoCAD.Internal.Utils.FlushGraphics();
  47.  
  48.                 transaction.Commit();
  49.             }
  50.         }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Ошибка при выполнении Editor.Command()
« Ответ #4 : 09-12-2020, 11:26:28 »
Если честно, не понял как сбросить предыдущую команду типа - ^C^C. Думал что Editor.Command()  сбрасывает.
Во-первых, Editor.Command() не сбрасывает. Во-вторых, есть куча примеров использования.
Код - C# [Выбрать]
  1. doc.SendStringToExecute("\x03\x03" + cmdName + " ", true, false, true);
В-третьих, сброс предыдущей команды приведёт к очистке набора предварительного выбора. Не уверен, что это то, что тебе нужно, судя по флагам команды обработчика твоей команды.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 22
  • Карма: 2
Re: Ошибка при выполнении Editor.Command()
« Ответ #5 : 13-12-2020, 01:31:48 »
Вот тут посмотрите: https://adn-cis.org/forum/index.php?topic=7339.msg22458#msg22458
Спасибо!
Александр Ривилис,
Александр, спасибо. Не судите строго. Я не профессиональный программист, пытаюсь автоматизировать свой труд и труд коллег.
Попробую на следующей неделе что вы написали в посте, спасибо.