Снова SendStringToExecute или Command С# ACAD2018 + AS2018

Автор Тема: Снова SendStringToExecute или Command С# ACAD2018 + AS2018  (Прочитано 9390 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 1
Требуется запустить команду Advance Steel. Ранее я такое проделывал с простыми командами и всё работало, но сейчас команда с параметром.
Команда с параметром работает методом SendStringToExecute, но работает асинхронно, а мне очень нужно чтоб она работала синхронно.
Методом Command не получается использовать команду с параметром, но при этом вызов простых команд работает синхронно.
1 вариант
Код - C# [Выбрать]
  1. [CommandMethodAttribute("TEST_GROUP", "GRPBYROLE", "ГРПОФУНКЦ", CommandFlags.Modal | CommandFlags.UsePickSet | CommandFlags.Redraw | CommandFlags.Session)]
  2.         public void STL()
  3.         {
  4. ...
  5. Editor toConsole = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  6. toConsole.Command("._AstM11CommAddToGroup Column ");//так не работает, параметр Column не подхватывается ни с кавычками ни с пробелами, никак. После выполнения кода команда не появляется в ком строке
  7. ...
  8.  

2 вариант
Код - C# [Выбрать]
  1. [CommandMethodAttribute("TEST_GROUP", "GRPBYROLE", "ГРПОФУНКЦ", CommandFlags.Modal | CommandFlags.UsePickSet | CommandFlags.Redraw | CommandFlags.Session)]
  2. ...
  3. var toConsole = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  4. toConsole.SendStringToExecute("._AstM11CommAddToGroup Column ", false, false, true); //так работает, но асинхронно, а т.к. у меня цикл, такой вариант не канает
  5. ...
  6.  
заранее извиняюсь если ошибка глупая, борюсь уже 3-ий день.
« Последнее редактирование: 22-06-2018, 10:54:30 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Brayan
Приветствую на форуме!
В первую очередь прочитай у меня в подписи как следует форматировать код на форуме.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
В первом варианте должно быть как-то так:
Код - C# [Выбрать]
  1. toConsole.Command("._AstM11CommAddToGroup" "Column");
Но так может работать только если:
1. ._AstM11CommAddToGroup - это полноценная команда, а не lisp-команда.
2. Если у этой команды больше нет запросов. Если есть дополнительные запросы, то нужно их сразу вычислить и передать в .Command
И убери CommandFlags.Session
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 1

Код - C# [Выбрать]
  1. toConsole.Command("._AstM11CommAddToGroup" "Column");
так синтаксическая ошибка

Код - C# [Выбрать]
  1. toConsole.Command("._AstM11CommAddToGroup \"Column\" ");
так команда не выполняется

Код - C# [Выбрать]
  1. Editor toConsole = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
может тут что-то поменять? или invoke может нужен?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
так синтаксическая ошибка
Черт. Вот так:
Код - C# [Выбрать]
  1. toConsole.Command("._AstM11CommAddToGroup", "Column");
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 1
Увы не канает. Срабатывает только SendStringToExecute первую итерацию, потом не поспевает за кодом. Если через invoke удастся победить, отпишусь

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Увы не канает.
Что происходит? И убрал ли ты CommandFlags.Session - с ним .Command работать не должно в принципе.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Предлагаю попробовать еще один вариант. Ты разделяешь свою команду на несколько штук и производишь вызов каждой из них через .SendStringToExecute - в этом случае выполнение будет почти синхронным. Во всяком случае последовательным.
Код - C# [Выбрать]
  1. toConsole.SendStringToExecute("_StartCommand1 ", false, false, true); // <- команда до вызова _AstM11CommAddToGroup
  2. toConsole.SendStringToExecute("._AstM11CommAddToGroup Column ", false, false, true);
  3. toConsole.SendStringToExecute("_StartCommand2 ", false, false, true); // <- команда после вызова _AstM11CommAddToGroup
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 1
Заработало вот так:

Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.Interop;
  2. //C:\Program Files\Autodesk\AutoCAD 2018\Autodesk.AutoCAD.Interop.dll
  3. //C:\Program Files\Autodesk\AutoCAD 2018\Autodesk.AutoCAD.Interop.Common.dll
  4.  
  5.  
  6. [CommandMethodAttribute("TEST_GROUP", "GRPBYROLE", "ГРПОФУНКЦ", CommandFlags.Modal | CommandFlags.UsePickSet | CommandFlags.Redraw | CommandFlags.Session)]
  7. ...
  8. AcadApplication app = (AcadApplication)Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication;
  9. ...
  10. string key =...;
  11. app.ActiveDocument.SendCommand("._Command " + key + " ");

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Заработало вот так:
Это что такое: "._Command " ???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 1
Command - любая команда, key - ее параметр

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Command - любая команда, key - ее параметр
Понятно. Ну если работает - хорошо. В ряде случаев .SendCommand работает синхронно, в ряде случаев асинхронно. Так что тут как повезёт.
P.S.: Хотел бы внести точность в терминологию. У команд AutoCAD нет параметров. Есть так называемые опции.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 1
В ряде случаев .SendCommand работает синхронно, в ряде случаев асинхронно.
А можно по подробнее от чего это зависит? А то у мня в 19 версии снова проблема.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
В ряде случаев .SendCommand работает синхронно, в ряде случаев асинхронно.
А можно по подробнее от чего это зависит? А то у мня в 19 версии снова проблема.
Какая проблема?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 1
Мне нужно вызвать команду с опцией. Я решил эту проблему для 18 версии так.  И этот способ хорошо работает. Работает синхронно.
Код - C# [Выбрать]
  1. [CommandMethodAttribute("TEST_GROUP", "GRPBYROLE", "ГРПОФУНКЦ", CommandFlags.Modal | CommandFlags.UsePickSet | CommandFlags.Redraw | CommandFlags.Session)]
  2.         public void GroupsByRole()
  3.         {
  4.             DocumentManager.LockCurrentDocument();
  5.             Autodesk.AdvanceSteel.CADAccess.Transaction AStransaction = Autodesk.AdvanceSteel.CADAccess.TransactionManager.StartTransaction();
  6.             AcadApplication app = Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication as AcadApplication;
  7.             ...
  8.             foreach (string role in roleList)//перебираем список названий групп
  9.             {
  10.             ...
  11.             Autodesk.AutoCAD.Internal.Utils.SelectObjects(ACADIDobjs);//выбор объектов
  12.             app.ActiveDocument.SendCommand("._AstM11CommAddToGroup " + "\"" + role + "\"" + " ");//вызов команды добавления в группу(в 19 версии System.NullReferenceException)
  13.             }
  14.             ...
  15.             AStransaction.Commit();
  16.             DocumentManager.UnlockCurrentDocument();
  17.         }
  18.  
Но в 19 версии в строчке с вызовом команды выдает System.NullReferenceException
В прошлый раз я экспериментировал с функциями SendStringToExecute и Command, но для команды с опцией эти эксперименты оказались безуспешными.
Добавил:
Еще заметил во время отладки, что app = null, видимо дело в этом.
И так тоже не работает
Код - C# [Выбрать]
  1. AcadApplication app = (AcadApplication)Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication;
System.InvalidCastException: "Невозможно привести COM-объект типа "System.__ComObject" к интерфейсному типу "Autodesk.AutoCAD.Interop.AcadApplication".