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

ADN Club => AutoCAD .NET API => Тема начата: Brayan от 22-06-2018, 10:36:38

Название: Снова SendStringToExecute или Command С# ACAD2018 + AS2018
Отправлено: Brayan от 22-06-2018, 10:36:38
Требуется запустить команду 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-ий день.
Название: Re: Снова SendStringToExecute или Command С# ACAD2018 + AS2018
Отправлено: Александр Ривилис от 22-06-2018, 10:55:41
Brayan
Приветствую на форуме!
В первую очередь прочитай у меня в подписи как следует форматировать код на форуме.
Название: Re: Снова SendStringToExecute или Command С# ACAD2018 + AS2018
Отправлено: Александр Ривилис от 22-06-2018, 10:59:44
В первом варианте должно быть как-то так:
Код - C# [Выбрать]
  1. toConsole.Command("._AstM11CommAddToGroup" "Column");
Но так может работать только если:
1. ._AstM11CommAddToGroup - это полноценная команда, а не lisp-команда.
2. Если у этой команды больше нет запросов. Если есть дополнительные запросы, то нужно их сразу вычислить и передать в .Command
И убери CommandFlags.Session
Название: Re: Снова SendStringToExecute или Command С# ACAD2018 + AS2018
Отправлено: Brayan от 22-06-2018, 11:28:41

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

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

Код - C# [Выбрать]
  1. Editor toConsole = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
может тут что-то поменять? или invoke может нужен?
Название: Re: Снова SendStringToExecute или Command С# ACAD2018 + AS2018
Отправлено: Александр Ривилис от 22-06-2018, 11:46:09
так синтаксическая ошибка
Черт. Вот так:
Код - C# [Выбрать]
  1. toConsole.Command("._AstM11CommAddToGroup", "Column");
Название: Re: Снова SendStringToExecute или Command С# ACAD2018 + AS2018
Отправлено: Brayan от 22-06-2018, 12:18:03
Увы не канает. Срабатывает только SendStringToExecute первую итерацию, потом не поспевает за кодом. Если через invoke удастся победить, отпишусь
Название: Re: Снова SendStringToExecute или Command С# ACAD2018 + AS2018
Отправлено: Александр Ривилис от 22-06-2018, 12:19:10
Увы не канает.
Что происходит? И убрал ли ты CommandFlags.Session - с ним .Command работать не должно в принципе.
Название: Re: Снова SendStringToExecute или Command С# ACAD2018 + AS2018
Отправлено: Александр Ривилис от 22-06-2018, 12:40:13
Предлагаю попробовать еще один вариант. Ты разделяешь свою команду на несколько штук и производишь вызов каждой из них через .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
Название: Re: Снова SendStringToExecute или Command С# ACAD2018 + AS2018
Отправлено: Brayan от 22-06-2018, 14:54:02
Заработало вот так:

Код - 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 + " ");
Название: Re: Снова SendStringToExecute или Command С# ACAD2018 + AS2018
Отправлено: Александр Ривилис от 22-06-2018, 15:37:42
Заработало вот так:
Это что такое: "._Command " ???
Название: Re: Снова SendStringToExecute или Command С# ACAD2018 + AS2018
Отправлено: Brayan от 22-06-2018, 15:50:43
Command - любая команда, key - ее параметр
Название: Re: Снова SendStringToExecute или Command С# ACAD2018 + AS2018
Отправлено: Александр Ривилис от 22-06-2018, 15:52:48
Command - любая команда, key - ее параметр
Понятно. Ну если работает - хорошо. В ряде случаев .SendCommand работает синхронно, в ряде случаев асинхронно. Так что тут как повезёт.
P.S.: Хотел бы внести точность в терминологию. У команд AutoCAD нет параметров. Есть так называемые опции.
Название: Re: Снова SendStringToExecute или Command С# ACAD2018 + AS2018
Отправлено: Brayan от 26-02-2019, 10:22:46
В ряде случаев .SendCommand работает синхронно, в ряде случаев асинхронно.
А можно по подробнее от чего это зависит? А то у мня в 19 версии снова проблема.
Название: Re: Снова SendStringToExecute или Command С# ACAD2018 + AS2018
Отправлено: Александр Ривилис от 26-02-2019, 10:30:29
В ряде случаев .SendCommand работает синхронно, в ряде случаев асинхронно.
А можно по подробнее от чего это зависит? А то у мня в 19 версии снова проблема.
Какая проблема?
Название: Re: Снова SendStringToExecute или Command С# ACAD2018 + AS2018
Отправлено: Brayan от 26-02-2019, 10:47:05
Мне нужно вызвать команду с опцией. Я решил эту проблему для 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".
Название: Re: Снова SendStringToExecute или Command С# ACAD2018 + AS2018
Отправлено: Александр Ривилис от 26-02-2019, 11:38:01
Добавил:
Еще заметил во время отладки, что app = null, видимо дело в этом.
Именно. Тут возможны два варианта:
1. Ненормально установился AutoCAD
2. Используется не та версия или разрядность Autodesk.AutoCAD.Interop.dll и/или Autodesk.AutoCAD.Interop.Common.dll
Их следует брать из ObjectARX SDK 2019 из каталогов inc-x64 или inc-win32 в зависимости от разрядности приложения.
Название: Re: Снова SendStringToExecute или Command С# ACAD2018 + AS2018
Отправлено: Brayan от 26-02-2019, 14:13:19
Спасибо, помогло. DLL не из той версии была. Поправил в ссылках и всё заработало.
Название: Re: Снова SendStringToExecute или Command С# ACAD2018 + AS2018
Отправлено: Александр Ривилис от 26-02-2019, 14:36:30
Спасибо, помогло. DLL не из той версии была. Поправил в ссылках и всё заработало.
А так вообще не нужна ссылка на dll и не зависит от версии и разрядности:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.Runtime;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3.  
  4. [assembly: CommandClass(typeof(Rivilis.SendCommand))]
  5.  
  6. namespace Rivilis
  7. {
  8.   public class SendCommand
  9.   {
  10.     [CommandMethod("SendCommand")]
  11.     public void SendCommandHelper()
  12.     {
  13.       dynamic app = Application.AcadApplication;
  14.       dynamic adoc = app.ActiveDocument;
  15.       adoc.SendCommand("_Zoom _All\n");
  16.     }
  17.   }
  18. }
Название: Re: Снова SendStringToExecute или Command С# ACAD2018 + AS2018
Отправлено: Алексей Кулик от 26-02-2019, 22:01:24
Просто для интереса (возможно, в порядке оффтопа) - подобный вызов (имею в виду использование .SendCommand) - оставляет "следы" в ком.строке или срабатывает втихаря?
Название: Re: Снова SendStringToExecute или Command С# ACAD2018 + AS2018
Отправлено: Александр Ривилис от 26-02-2019, 22:02:37
Просто для интереса (возможно, в порядке оффтопа) - подобный вызов (имею в виду использование .SendCommand) - оставляет "следы" в ком.строке или срабатывает втихаря?
Оставляет.
Название: Re: Снова SendStringToExecute или Command С# ACAD2018 + AS2018
Отправлено: Алексей Кулик от 26-02-2019, 22:05:14
Ага, принял :) Спасибо! :)