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

ADN Club => AutoCAD .NET API => Тема начата: JustMe от 13-05-2015, 13:55:00

Название: Обрезка объектов в соответствии с кромками других объектов
Отправлено: JustMe от 13-05-2015, 13:55:00
Добрый день.

Подскажите пожалуйста как выполнить обрезку объектов внутри выделенных замкнутых полилиний.
Не могу понять как задать облать внутри полилинии для команды _trim

Команду посылаю через acDoc.SendStringToExecute("_Trim ", false, false, true);
Название: Re: Обрезка объектов в соответствии с кромками других объектов
Отправлено: Алексей Кулик от 13-05-2015, 14:33:52
Если касаться именно команд, то у _.trim есть забавная опция: _fence. Хотя я бы подумывал о получении точек пересечения и нормальном разбитии объектов. Или есть второй вариант - использовать _clip и соответствующие словари (правда, работает это только для блоков и ссылок).
Название: Re: Обрезка объектов в соответствии с кромками других объектов
Отправлено: JustMe от 13-05-2015, 14:53:24
Если говорить об опции _fence, как мне потом задать координаты точек.

Пытаюсь сделать таким образом, но ничего не выходит

Код - C# [Выбрать]
  1. acDoc.SendStringToExecute("_Trim _fence ", points[0], points[2]," "false, false, true);

Подскажите как правильно. Точки не должны выбираться пользователем.

п.с.
Код - C# [Выбрать]
  1. var points = new List<Point3d>();
  2.  for (int i = 0; i < acEnt.NumberOfVertices; i++)
  3.     {
  4.        points.Add(acEnt.GetPoint3dAt(i));
  5.     }
  6.  
Название: Re: Обрезка объектов в соответствии с кромками других объектов
Отправлено: JustMe от 13-05-2015, 17:06:21
Попытался сделать через (command), повторив команду _.trim c пользовательским вводом

Код - C# [Выбрать]
  1. public void Test()
  2.         {
  3.             Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  4.             PromptEntityOptions prOpt =
  5.               new PromptEntityOptions("\nУкажите объект: ");
  6.             PromptEntityResult rs = ed.GetEntity(prOpt);
  7.             if (rs.Status != PromptStatus.OK) return;
  8.             PromptPointOptions p1Opt =
  9.               new PromptPointOptions("\nУкажите первую точку");
  10.             PromptPointResult rs1 = ed.GetPoint(p1Opt);
  11.             if (rs1.Status != PromptStatus.OK) return;
  12.             PromptPointOptions p2Opt =
  13.               new PromptPointOptions("\nУкажите вторую точку");
  14.             PromptPointResult rs2 = ed.GetPoint(p2Opt);
  15.             if (rs2.Status != PromptStatus.OK) return;
  16.             ed.Command("._trim ", "_fence ",rs.ObjectId, rs1.Value, rs2.Value, "");
  17.         }

но после запуска команды в Autocad выдает ошибку, что команда _trim неизвестна, помогите пожалуйста разобраться
Название: Re: Обрезка объектов в соответствии с кромками других объектов
Отправлено: Алексей Кулик от 13-05-2015, 17:43:12
Я практически не пишу на .NET, но все же позволю себе вопрос: это Command не срабатывает или SendStringToExecute?
Откровенно говоря, я затрудняюсь описать весь алгоритм, который будет гарантированно возвращать корректный результат. А позориться с сырым решением не хочу.
Название: Re: Обрезка объектов в соответствии с кромками других объектов
Отправлено: JustMe от 13-05-2015, 17:51:15
SendStringToExecute формат записи в принципе не верный...откровенно говоря не нашел куда там можно вставить координаты точек.

А вот command взял по примеру
http://adn-cis.org/forum/index.php?topic=1816.15, последний пост
Где Александр Ревилис показывал как осуществить команду _.MOVE
Название: Re: Обрезка объектов в соответствии с кромками других объектов
Отправлено: Александр Ривилис от 13-05-2015, 18:50:30
А вот command взял по примеру
http://adn-cis.org/forum/index.php?topic=1816.15, последний пост
Где Александр Ривилис показывал как осуществить команду _.MOVE
Какая версия AutoCAD?
P.S.: В ed.Command() не нужно дополнительного пробела после имени команды и опции команды. Т.е. не "._trim ", а "_.trim" и не "_fence ", а "_fence".
Название: Re: Обрезка объектов в соответствии с кромками других объектов
Отправлено: JustMe от 13-05-2015, 19:30:50
Александр Ривилис , Прошу прощения, это все от невнимательности.

AutoCAD 2010
Название: Re: Обрезка объектов в соответствии с кромками других объектов
Отправлено: JustMe от 13-05-2015, 19:44:25
Да, действительно, убрав пробелы команда _.trim заработала, но вот координаты точек для линии _fence не воспринимаются.

Цитировать
командная строка Autocad:
Команда: testmove
Укажите объект:
Укажите первую точку:
Укажите вторую точку: ._trim
Текущие установки: Проекция=ПСК, Кромки=Без продолжения
Выберите режущие кромки ...
Выберите объекты или <выбрать все>: _fence
Укажите первую точку линии выбора:
Неверный ответ.
Укажите первую точку линии выбора:

А вообще в  ed.Command() я бы хотел передавать конкретные координаты для линии выбора.
Название: Re: Обрезка объектов в соответствии с кромками других объектов
Отправлено: Александр Ривилис от 13-05-2015, 20:15:31
Я предлагаю категорически отказаться от запуска команды _TRIM. Причину могу объяснить:
1) Устойчиво код с запуском команды _TRIM работать не будет.
2) Точки указания должны быть видны на экране
3) Вместо ObjectId объектов нужно передавать список содержащий точку указания и ads_name
4) Вполне возможно, что в AutoCAD 2010 Point3d не преобразовывается автоматом в ads_point, который и нужно передавать в ed.Command
5) Еще чего-нибудь я забыл.

Так что напиши свой аналог команды _TRIM для своего конкретного случая обрезки внутри замкнутой полилинии.

Название: Re: Обрезка объектов в соответствии с кромками других объектов
Отправлено: JustMe от 13-05-2015, 20:17:32
Понял, спасибо, буду разбираться. Кстати искомый результат достигается, когда изменил порядок в ed.Command

ed.Command("_trim","_SI",rs.ObjectId,"_fence",rs1.Value,rs2.Value,"");