Как запустить Editor.Command() c PaletteSet?

Автор Тема: Как запустить Editor.Command() c PaletteSet?  (Прочитано 8641 раз)

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

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

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

  • ADN Club
  • **
  • Сообщений: 84
  • Карма: 13
Добрый день!

Прошу прощения, что не привожу код построения paletteSet, потому как там каша.
Но в общем там WPF UserControl, добавленный методом paletteSet.AddVisual();

Запуск из обработчика кнопки выглядит сейчас так
Код - C# [Выбрать]
  1. private void Button_Click(object sender, RoutedEventArgs e)
  2. {
  3.     MapTrim.TMT();
  4. }

немного исправленного кода отсюда http://adn-cis.org/forum/index.php?topic=1816.msg9816#msg9816
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4.  
  5. public static class MapTrim
  6. {
  7.     public static void TMT()
  8.     {
  9.         Document doc = Application.DocumentManager.MdiActiveDocument;
  10.         Editor ed;
  11.         if (doc != null)
  12.         {
  13.             using (var locker = doc.LockDocument())
  14.             {
  15.                 ed = doc.Editor;
  16.                 PromptEntityResult rs = ed.GetEntity("\nВыберите замкнутый контур: ");
  17.                 if (rs.Status != PromptStatus.OK)
  18.                     return;
  19.                 _Run(ed, rs.ObjectId);
  20.             }
  21.         }
  22.     }
  23.  
  24.     private static void _Run(Editor ed, ObjectId selectedId)
  25.     {
  26.         var oldDia = Application.GetSystemVariable("CMDDIA");
  27.         Application.SetSystemVariable("CMDDIA", 0);
  28.         var status = ed.Command("_.MAPTRIM",
  29.             /* Выбрать */ "В",
  30.             /* Объект */ selectedId,
  31.             /* Нет */ "Н",
  32.             /* Нет */ "Н",
  33.             /* Внутри */ "В",
  34.             /* Нет */ "Н",
  35.             /* Нет */ "Н",
  36.             /* Игнорировать */ "И",
  37.             /* Да */ "Д"
  38.         );
  39.         ed.WriteMessage(status.ToString());//status = PromptStatus.Error
  40.         Application.SetSystemVariable("CMDDIA", oldDia);
  41.     }
  42. }

В строке 39 видно проблему.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Как запустить Editor.Command() c PaletteSet?
« Ответ #1 : 19-06-2015, 15:55:44 »
Ну, во-первых, есть такая штука, как локализация: http://autolisp.ru/2010/03/04/localization/ Поэтому я бы переделал вызов команды - это раз.
Во-вторых, команды "_.maptrim" в AutoCAD нет. В вертикалках типа Civil / Map3D, возможно, она и есть - но тогда тема не в том разделе.
В-третьих, передавать в команду ObjectId бесполезно: необходимо передавать примитив.
И, наконец, проверь последовательность команды. Я далеко не уверен, что после указания примитива не потребуется подтверждать правильность и окончательность выбора.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • ADN Club
  • **
  • Сообщений: 84
  • Карма: 13
Re: Как запустить Editor.Command() c PaletteSet?
« Ответ #2 : 19-06-2015, 16:12:57 »
Ну, во-первых, есть такая штука, как локализация: http://autolisp.ru/2010/03/04/localization/ Поэтому я бы переделал вызов команды - это раз.
Во-вторых, команды "_.maptrim" в AutoCAD нет. В вертикалках типа Civil / Map3D, возможно, она и есть - но тогда тема не в том разделе.
В-третьих, передавать в команду ObjectId бесполезно: необходимо передавать примитив.
И, наконец, проверь последовательность команды. Я далеко не уверен, что после указания примитива не потребуется подтверждать правильность и окончательность выбора.
Алексей, вы по указанной ссылке не переходили? В этой теме почти тот же самый код, и ... другого всеми уважаемого гуру.  :) Я специально его не менял в плане локализации.

Не обращайте внимание на "_.maptrim", тут вопрос общий про контексты документа и приложения.
Я надеюсь, что можно запустить без "командных методов". Но даже с командными у меня конкретно с "_.maptrim" не получается.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Как запустить Editor.Command() c PaletteSet?
« Ответ #3 : 19-06-2015, 16:26:14 »
Я про опции команды: вместо "В" наверняка получится нечто типа "_s" ))
И потом, берем на вооружение нечто типа http://adndevblog.typepad.com/autocad/2012/09/using-object-id-in-sendcommand-method.html или http://www.theswamp.org/index.php?topic=44500.0 получаем в результате код наподобие (пишу вообще из-под Linux, так что код надо будет проверить):
"(handent " + selectedId.Handle.ToString() + ")"
И в строку передавать уже полученное значение
Т.е. необходимо будет использовать "псевдокод" с обращением к lisp.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Как запустить Editor.Command() c PaletteSet?
« Ответ #4 : 19-06-2015, 16:29:11 »
И я практически уверен, что у Александра просто нет Civil - точно так же, как и у меня ))
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Отмечено как Решение German 19-06-2015, 17:38:53

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как запустить Editor.Command() c PaletteSet?
« Ответ #5 : 19-06-2015, 16:34:09 »
немного исправленного кода отсюда http://adn-cis.org/forum/index.php?topic=1816.msg9816#msg9816
В контексте приложения (Application) нельзя использовать Editor.Command, но можно использовать Document.SendStringToExecute("_TMT1\n", false, false, false);
Итого:
1) Объявляешь код _Run так:
Код - C# [Выбрать]
  1. static ObjectId selectedId; // Это важно, т.к. команде явно передать значение ты не можешь
  2. [CommandMethod("TMT1", CommandFlags.Modal |  CommandFlags.NoHistory)]
  3. public static void _Run()
  4. {
  5.     Document doc = Application.DocumentManager.MdiActiveDocument;
  6.     Editor ed = null;
  7.     if (doc == null) return;
  8.     var oldDia = Application.GetSystemVariable("CMDDIA");
  9.     Application.SetSystemVariable("CMDDIA", 0);
  10.  
  11.     var status = ed.Command("_.MAPTRIM",
  12.         /* Выбрать */ "В",
  13.         /* Объект */ selectedId,
  14.         /* Нет */ "Н",
  15.         /* Нет */ "Н",
  16.         /* Внутри */ "В",
  17.         /* Нет */ "Н",
  18.         /* Нет */ "Н",
  19.         /* Игнорировать */ "И",
  20.         /* Да */ "Д"
  21.     );
  22.     ed.WriteMessage(status.ToString());//status = PromptStatus.Error
  23.     Application.SetSystemVariable("CMDDIA", oldDia);
  24. }
2) Перед запуском Application.DocumentManager.MdiActiveDocument.SendStringToExecute заполняешь  selectedId нужным значением.

Пробуй.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как запустить Editor.Command() c PaletteSet?
« Ответ #6 : 19-06-2015, 16:35:23 »
И я практически уверен, что у Александра просто нет Civil - точно так же, как и у меня ))
Есть Лёша. Иначе как бы я это проверил, да еще и картинки получил:
http://adn-cis.org/forum/index.php?topic=1816.msg9816#msg9816
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Как запустить Editor.Command() c PaletteSet?
« Ответ #7 : 19-06-2015, 16:48:10 »
Умолк )
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • ADN Club
  • **
  • Сообщений: 84
  • Карма: 13
Re: Как запустить Editor.Command() c PaletteSet?
« Ответ #8 : 19-06-2015, 16:48:26 »
Вот нашел http://www.caduser.ru/forum/index.php?PAGE_NAME=message&FID=24&TID=47032&MID=281247#message281247. Может быть полезно.
Цитировать
Приложение не может переключится в "контекст документа" (обратное возможно, т.е. можно из "контекста документа" выполнить некий код в "контексте приложения" используя acDocManager->executeInApplicationContext()), но оно может запустить команду, которая будет выполнятся в контексте документа.
Значит все-таки команда нужна.

В контексте приложения (Application) нельзя использовать Editor.Command, но можно использовать Document.SendStringToExecute("_TMT1\n", false, false, false);
Опять этот SendStringToExecute()  :-\
Не хотелось совсем, потому как много кода еще после "обрезки". А это вереница таких команд может получиться и каждой нужно передавать параметры, как быть?

Буду пробовать. Пока не получалось, но возможно где-то моя ошибка.

Но еще маленький, надеюсь не нарушу "один вопрос - одна тема":
[CommandMethod("TMT1", CommandFlags.Modal |  CommandFlags.NoHistory)]
Выбрав какой-то контур и набрав случайно, специально, теоретически команду "TMT1" пользователь удивится?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как запустить Editor.Command() c PaletteSet?
« Ответ #9 : 19-06-2015, 17:15:48 »
Выбрав какой-то контур и набрав случайно, специально, теоретически команду "TMT1" пользователь удивится?
Ну я же написал как в теории. Но:
1) Ты можешь проверять в команде TMT1 значение selectedId и если ObjectId.isNull(selectedId) == true - сразу завершать команду.
2) Перед выходом из TMT1 устанавливать selectedId в null.
В этом случае никакого удивления у пользователя не будет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как запустить Editor.Command() c PaletteSet?
« Ответ #10 : 19-06-2015, 17:18:44 »
А это вереница таких команд может получиться и каждой нужно передавать параметры, как быть?
Как быть? Не пользоваться запуском команд, а переписать их самому. Не запускать команды из Palette, т.к. там код выполняется в контексте приложения. Думаешь есть еще какое-то решение? ;)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 84
  • Карма: 13
Re: Как запустить Editor.Command() c PaletteSet?
« Ответ #11 : 19-06-2015, 17:38:12 »
Ну я же написал как в теории. Но:
1) Ты можешь проверять в команде TMT1 значение selectedId и если ObjectId.isNull(selectedId) == true - сразу завершать команду.
2) Перед выходом из TMT1 устанавливать selectedId в null.
В этом случае никакого удивления у пользователя не будет.

Александр Ривилис, спасибо большое за развернутый ответ!

Уже лучше, Автокад падает, когда в командной строке
Код - Auto/Visual Lisp [Выбрать]
  1. "Д"
Т.е. команда запускается, с параметрами надо разобраться, наверно. Хотя вручную, как не изголяйся, не рушится Автокад...

Не пользоваться запуском команд, а переписать их самому.
Это мне жизни не хватит.  :-\


Не запускать команды из Palette, т.к. там код выполняется в контексте приложения.
Думал, думал. Пока так придумал.  :D
Off-Topic: показать
Хотя в Civil стандартная схема, в большинстве случаев такая:
Из палитры вызывается обычная команда, которая чаще всего открывает модальное окно. Там сбор всяких условий и запуск по "ОК". И это окно, как правило, "неподавляемое".
Буду пробовать так.