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

ADN Club => AutoCAD .NET API => Тема начата: art_rrc от 04-11-2015, 12:18:29

Название: Повтор последней вызванной команды (CommandFlags)
Отправлено: art_rrc от 04-11-2015, 12:18:29
Доброго времени суток. Глобально задача стоит так: Создать на ленте кнопку, по нажатию которой, вставляется блок.
1я проблема с которой столкнулся:
Если сразу после создания вкладки на ленте нажать правую кнопку мыши (повтор последней команды), то добавляется еще 1 вкладка. Пока решил так (с помощью  CommandFlags):
Код - vb.net [Выбрать]
  1. <CommandMethod("CreateButton", CommandFlags.NoHistory Or CommandFlags.NoUndoMarker)> _
  2.         Public Sub artCreateButton()
Но из такого решения вытекает вторая проблема. При использовании этих флагов, в командной строке автокада не подсвечивается автозаполнение при вводе первых символов команды (грубо говоря IntelliSense автокада на команду "CreateButton" перестает работать). Хотя если все таки ввести команду целиком, то все работает как надо. Это конечно неудобно. Можно сделать вначале проверку на наличие такой панели и если она есть то ничего не создавать, но может есть более элегантное решение?
Далее... Вызываю по нажатию кнопки процедуру вот таким образом:
Код - vb.net [Выбрать]
  1.         Public Sub Execute(parameter As Object) Implements ICommand.Execute
  2.             Dim doc As Document = Application.DocumentManager.MdiActiveDocument
  3.             Using locdoc As DocumentLock = doc.LockDocument
  4.                 Dim arc As New artRibbonClass
  5.                 arc.InsertBoltsWithJig()
  6.             End Using
  7.         End Sub
В результате мне нужно, чтоб при нажатии правой кнопки мыши (повтор последней команды) опять вызывался .InsertBoltsWithJig(), но добиться этого никак не получается. Объявлен он так:
Код - vb.net [Выбрать]
  1.         <CommandMethod("B")> _
  2.         Public Sub InsertBoltsWithJig()
Перепробовал кучу разных флагов как для Execute, так и для InsertBoltsWithJig, ничего не получилось. Пробовал вызывать из Execute через editor:
Код - vb.net [Выбрать]
  1. ed.Command("B ")
Выдает ошибку. Хотя если вручную написать в ком. строке "B", то и сама команда и ее повтор работает корректно. Подскажите пожалуйста, как же заставить повторяться команду вызываемую кнопкой?
Заранее спасибо всем неравнодушным!  :)
Название: Re: Повтор последней вызванной команды (CommandFlags)
Отправлено: Александр Пекшев aka Modis от 04-11-2015, 12:21:50
Даже дочитывать не стал  ;D
Построение ленты в твоем случае должно не по команде вызываться, а при инициализации твоего плагина. <CommandMethod("CreateButton"... - лишнее

Добавлено:
Посмотри пример еще раз и внимательнее - http://habrahabr.ru/post/263373/
Вкладка на ленте строится при инициализации плагина (т.е. при загрузке dll). Создавать для этой процедуры свою команду - ИМХО - лишнее и ненужное действие, которое в твоем случае приводит к описанным проблемам
Название: Re: Повтор последней вызванной команды (CommandFlags)
Отправлено: art_rrc от 04-11-2015, 13:01:03
Даже дочитывать не стал 
Так там все самое интересное и есть в конце. Да, понятное дело что в итоге все будет в автозагрузке и при инициализации. Пока такие костыли исключительно в учебных целях.
Но основной вопрос в теме как раз этот:
как же заставить повторяться команду вызываемую кнопкой?
И как мне кажется, он не связан с типом создания ленты.. при инициализации или явным вызовом команды.

ps. Вот например, сделал бы сразу при инициализации и еще не скоро узнал про флаги, а так и автозагрузка будет и понимание для чего они нужны. :)
Название: Re: Повтор последней вызванной команды (CommandFlags)
Отправлено: Александр Пекшев aka Modis от 04-11-2015, 13:07:41
как же заставить повторяться команду вызываемую кнопкой?
Между прочем в примере, на который я тебе дал ссылку и по которому ты и делал этот вопрос решен :)
1. Для RibbonButton в свойстве CommandParameter прописываешь свою команду (в твоем случае "В")
2. В методе Execute делаешь вызов своей команды через SendStringToExecute. Для C# (заметь - снова не VB.net) это выглядит так:
Код - C# [Выбрать]
  1. public void Execute(object parameter)
  2.             {
  3.                 Document doc = acadApp.DocumentManager.MdiActiveDocument;
  4.                 if (parameter is RibbonButton)
  5.                 {
  6.                     // Просто берем команду, записанную в CommandParameter кнопки
  7.                     // и выпоняем её используя функцию SendStringToExecute
  8.                     RibbonButton button = parameter as RibbonButton;
  9.                     acadApp.DocumentManager.MdiActiveDocument.SendStringToExecute(
  10.                         button.CommandParameter + " ", true, false, true);
  11.                 }
  12.             }
Название: Re: Повтор последней вызванной команды (CommandFlags)
Отправлено: Александр Ривилис от 04-11-2015, 13:27:03
Код - vb.net: [Выделить]

    ed.Command("B ")

Выдает ошибку.
Конечно выдаёт:
1) В этом контексте нельзя пользоваться Editor.Command() - это контекст приложения.
2) В любом случае в Editor.Command() передаётся срока без пробела, т.е. ed.Command("B").
Название: Re: Повтор последней вызванной команды (CommandFlags)
Отправлено: art_rrc от 04-11-2015, 13:27:48
Здорово! Все работает, большое спасибо! Совсем позабыл про .SendStringToExecute, т.к. был неудачный опыт использования, поэтому и пытался прикрутить .Command. Причем все работает и без блокирования документа!