Как правильно указать объект при работе с командной строкой?

Автор Тема: Как правильно указать объект при работе с командной строкой?  (Прочитано 14412 раз)

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

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

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

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 0
Возможно ли, что обработчик натыкается на несоответствие POLYGON_id типу и открывает диалог для ручного выбора? Maptrip запрашивает id объекта?

Код - C# [Выбрать]
  1. doc.Editor.Command("_.maptrim", "_S", POLYGON_id, "_Y", "Слой", "_N", "_I", "_N", "_N", "_I");
« Последнее редактирование: 02-02-2015, 18:00:58 от flaojke »

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

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

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 0
Самое интересное, что именно по этому вопросу я и обратился сюда, пытаясь узнать, чем должен быть объект  :-\

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

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

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

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Итак я проверил следующий код:
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Linq.Expressions;
  6. using System.Reflection;
  7. using Autodesk.AutoCAD.Runtime;
  8. using Autodesk.AutoCAD.ApplicationServices;
  9. using Autodesk.AutoCAD.DatabaseServices;
  10. using Autodesk.AutoCAD.Geometry;
  11. using Autodesk.AutoCAD.EditorInput;
  12.  
  13. namespace AutoCAD_CSharp_plug_in1
  14. {
  15.   public class MyCommands
  16.   {
  17.     [CommandMethod("TestMove", CommandFlags.Modal)]
  18.     public void Test()
  19.     {
  20.       Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  21.       PromptEntityOptions prOpt =
  22.         new PromptEntityOptions("\nУкажите объект для перемещения: ");
  23.       PromptEntityResult rs = ed.GetEntity(prOpt);
  24.       if (rs.Status != PromptStatus.OK) return;
  25.       PromptPointOptions p1Opt =
  26.         new PromptPointOptions("\nУкажите первую точку перемещения: ");
  27.       PromptPointResult rs1 = ed.GetPoint(p1Opt);
  28.       if (rs1.Status != PromptStatus.OK) return;
  29.       PromptPointOptions p2Opt =
  30.         new PromptPointOptions("\nУкажите вторую точку перемещения: ");
  31.       PromptPointResult rs2 = ed.GetPoint(p2Opt);
  32.       if (rs2.Status != PromptStatus.OK) return;
  33.       ed.Command("_.MOVE", "_SI", rs.ObjectId, rs1.Value, rs2.Value, "");
  34.     }
  35.   }
  36. }
  37.  
  38. namespace Autodesk.AutoCAD.EditorInput
  39. {
  40.   public static class EditorInputExtensionMethods
  41.   {
  42.     public static PromptStatus Command(this Editor editor, params object[] args)
  43.     {
  44.       if (editor == null)
  45.         throw new ArgumentNullException("editor");
  46.       return runCommand(editor, args);
  47.     }
  48.  
  49.     static Func<Editor, object[], PromptStatus> runCommand = GenerateRunCommand();
  50.  
  51.     static Func<Editor, object[], PromptStatus> GenerateRunCommand()
  52.     {
  53.       MethodInfo method = typeof(Editor).GetMethod("RunCommand",
  54.          BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
  55.       var instance = Expression.Parameter(typeof(Editor));
  56.       var args = Expression.Parameter(typeof(object[]));
  57.       return Expression.Lambda<Func<Editor, object[], PromptStatus>>(
  58.          Expression.Call(instance, method, args), instance, args)
  59.             .Compile();
  60.     }
  61.   }
  62. }
  63.  
Код работает - готовит данные для команды _MOVE, а затем её запускает. Проверял в AutoCAD 2012 x64
Вывод 1: ObjectId можно передавать вместо ads_name в Editor.Command
Вывод 2: Или ты передаёшь не ObjectId или этой команде (а с нею я не проверял - ставить специально Civil 3D 2012 мне не хочется) нужно передавать параметры каким-то другим образом.

P.S: А попробуй-ка заменить в своём коде "_S" на "_SI" - я честно говоря не знаю, что требует MAPTRIM в качестве первого параметра, но подозреваю, что ему нужен набор примитивов, а не один примитив и только за счет "_SIngle" ты передаешь один примитив. Если ты передаёшь "_S" то возникает неоднозначность: "_SIngle" или  "_SUbobject" и появляется такое диалоговое окошко (ты кстати не разу не привёл какое окошко у тебя):
« Последнее редактирование: 02-02-2015, 20:28:13 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн German

  • ADN Club
  • **
  • Сообщений: 84
  • Карма: 13
Это крайне странно, т.к. doc.Editor.Command - это полный эквивалент (command).

Сомневаюсь я что-то в эквивалентности.

На лиспе (command "_maptrim" ...) стартует как надо.
А Editor.Command всегда выкидывает модальное окно простого _maptrim и все остальные параметры "идут лесом".

Работает только, как и у топикстартера, через SendStringToExecute(command "_maptrim" ...).

Это подтверждается статьей http://adndevblog.typepad.com/infrastructure/2014/03/using-maptrim-in-net-application.html

Вот тут все сообщения командной строки:
// Способ вырезания по контуру (Запрос/Выбрать/опреДелить)
// Выберите объект:
// Фильтровать объекты для вырезания по слоям? (Да/Нет)
// Имена слоев для вырезания (? - список)
// Выбирать объекты для вырезания вручную? (Да/Нет)
// Метод вырезания (Внутри/Снаружи)
// Пропускать топологические объекты?
// Оставлять объектные данные? (Да/Нет)
// Способ обработки объектов, которые не удается вырезать (Удалять/Твставки/Игнорировать)
// Объекты вне контура, не лежащие на замороженных или блокированных слоях, будут обрезаны или удалены.  Продолжать? (Да/Нет)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Это подтверждается статьей http://adndevblog.typepad.com/infrastructure/2014/03/using-maptrim-in-net-application.html
Эта статья подтверждала бы если бы в ней было четко указано, что Editor.Command использовать нельзя. А она указывает альтернативный вариант.
В какой версии Civil 3D ты проверяешь код?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн German

  • ADN Club
  • **
  • Сообщений: 84
  • Карма: 13
В какой версии Civil 3D ты проверяешь код?

Civil 3d 2014 x64 Rus. SP2.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Потестировал немного в Civil3D 2015 и 2016. В 2015 команда отказалась вообще запускаться (даже вручную из командной строки). В 2016 - появляется диалоговое окно и при Editor.Command, и при Editor.CommandAsync. Только с (command-s) нет диалогового окна.
« Последнее редактирование: 05-06-2015, 18:04:20 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Александр Ривилис 28-11-2016, 15:27:38

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Еще потестировал и понял, что у меня начинается склероз. Про CMDDIA я напрочь забыл:

Код - C# [Выбрать]
  1. [CommandMethod("TMT1", CommandFlags.Modal)]
  2. public static void TMT1()
  3. {
  4.   Document doc = Application.DocumentManager.MdiActiveDocument;
  5.   Editor ed;
  6.   if (doc != null)
  7.   {
  8.     ed = doc.Editor;
  9.     PromptEntityResult rs = ed.GetEntity("\nВыберите замкнутый контур: ");
  10.     if (rs.Status != PromptStatus.OK)
  11.       return;
  12.     var oldDia = Application.GetSystemVariable("CMDDIA");
  13.     Application.SetSystemVariable("CMDDIA", 0);
  14.     ed.Command("_.MAPTRIM",
  15.       /* Выбрать */ "В",
  16.       /* Объект */ rs.ObjectId,
  17.       /* Нет */ "Н",
  18.       /* Нет */ "Н",
  19.       /* Внутри */ "В",
  20.       /* Нет */ "Н",
  21.       /* Нет */ "Н",
  22.       /* Игнорировать */ "И",
  23.       /* Да */ "Д"
  24.     );
  25.     Application.SetSystemVariable("CMDDIA", oldDia);
  26.   }
  27. }



Цитировать
Команда: TMT1
Выберите замкнутый контур: _.MAPTRIM
Способ вырезания по контуру (Запрос/Выбрать/опреДелить):В
Выберите объект:
Фильтровать объекты для вырезания по слоям? (Да/Нет) <Н>: Н
Выбирать объекты для вырезания вручную? (Да/Нет) <Д>: Н
Метод вырезания (Внутри/Снаружи) <В>:В
Пропускать топологические объекты? (Да/Нет) <Д>: Н
Оставлять объектные данные? (Да/Нет) <Д>: Н
Способ обработки объектов, которые не удается вырезать (Удалять/Твставки/Игнорировать) <И>:И
Вырезаются объекты внутри контура...
Обрабатывается 4 объектов(а), подождите...
готово
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение