Повтор последней вызванной команды (CommandFlags)

Автор Тема: Повтор последней вызванной команды (CommandFlags)  (Прочитано 4432 раз)

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

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

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

  • ADN Club
  • **
  • Сообщений: 70
  • Карма: 1
  • Skype: art_sapranovich
Доброго времени суток. Глобально задача стоит так: Создать на ленте кнопку, по нажатию которой, вставляется блок.
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", то и сама команда и ее повтор работает корректно. Подскажите пожалуйста, как же заставить повторяться команду вызываемую кнопкой?
Заранее спасибо всем неравнодушным!  :)

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Даже дочитывать не стал  ;D
Построение ленты в твоем случае должно не по команде вызываться, а при инициализации твоего плагина. <CommandMethod("CreateButton"... - лишнее

Добавлено:
Посмотри пример еще раз и внимательнее - http://habrahabr.ru/post/263373/
Вкладка на ленте строится при инициализации плагина (т.е. при загрузке dll). Создавать для этой процедуры свою команду - ИМХО - лишнее и ненужное действие, которое в твоем случае приводит к описанным проблемам

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

  • ADN Club
  • **
  • Сообщений: 70
  • Карма: 1
  • Skype: art_sapranovich
Даже дочитывать не стал 
Так там все самое интересное и есть в конце. Да, понятное дело что в итоге все будет в автозагрузке и при инициализации. Пока такие костыли исключительно в учебных целях.
Но основной вопрос в теме как раз этот:
как же заставить повторяться команду вызываемую кнопкой?
И как мне кажется, он не связан с типом создания ленты.. при инициализации или явным вызовом команды.

ps. Вот например, сделал бы сразу при инициализации и еще не скоро узнал про флаги, а так и автозагрузка будет и понимание для чего они нужны. :)

Отмечено как Решение art_rrc 04-11-2015, 13:28:18

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
как же заставить повторяться команду вызываемую кнопкой?
Между прочем в примере, на который я тебе дал ссылку и по которому ты и делал этот вопрос решен :)
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.             }

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Код - vb.net: [Выделить]

    ed.Command("B ")

Выдает ошибку.
Конечно выдаёт:
1) В этом контексте нельзя пользоваться Editor.Command() - это контекст приложения.
2) В любом случае в Editor.Command() передаётся срока без пробела, т.е. ed.Command("B").
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 70
  • Карма: 1
  • Skype: art_sapranovich
Здорово! Все работает, большое спасибо! Совсем позабыл про .SendStringToExecute, т.к. был неудачный опыт использования, поэтому и пытался прикрутить .Command. Причем все работает и без блокирования документа!