Аналог команды _boundary.

Автор Тема: Аналог команды _boundary.  (Прочитано 419 раз)

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

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

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Аналог команды _boundary.
« : 01-06-2018, 13:12:38 »
Добрый день!
В AutoCad 2016 есть команда  _boundary. Есть ли методы в objectarx 2016, которые реализуют аналогичное создание контура при имеющемся наборе объектов и указании внутренней точки. Я хочу написать свой метод на с++, который бы позволял строить замкнутые контуры, но при этом не показывая никаких диалоговых окон как команда _boundary.

Оффлайн Николай Горлов

  • ADN
  • *
  • Сообщений: 199
  • Карма: 26
Re: Аналог команды _boundary.
« Ответ #1 : 01-06-2018, 14:57:57 »
для С# есть, для С++ увы ничего нет. но кто мешает тихонько запустить через acedCommand автокадовскую команду, передав ей все требуемые параметры?
например так:
Код - C++ [Выбрать]
  1. //-> отключаем вывод в окне левых акадовских строк              
  2.                 struct resbuf cmdechoVar;
  3.                 cmdechoVar.restype = RTSHORT;
  4.                 cmdechoVar.resval.rint = 0;
  5.                 acedSetVar(_T("cmdecho"), &cmdechoVar);
  6. //<-
  7.  
  8.                 ads_name mas; //если работаем по варианту 2, то пора бы заполнить mas данными и не забыть почиститься в конце функции
  9.                 AcGePoint3d p;
  10.                 AcGePoint3dArray points;
  11.                 ads_name plBoundary, plBoundaryPreviousStep;
  12.                 if ( acdbEntLast(plBoundaryPreviousStep) != RTNORM )
  13.                 {
  14.                         acutPrintf(_T("\nЧертеж пустой"));
  15.                         return;
  16.                 }
  17.                 AcDbObjectId id;
  18.                 AcDbEntity * pEnt;
  19.                 while(acedGetPoint(0,_T("\nВнутренняя точка: "),asDblArray(p)) == RTNORM)
  20.                 {
  21.                         points.append(p);
  22.                 }
  23.                 if(points.length() > 0)
  24.                 {
  25.                         for(int i= 0;i<points.length();i++)
  26.                         {
  27.                                 /*
  28.                                         предпочтительней второй вариант, т.к. первый постоянно выбирает видимые объекты экрана,
  29.                                         и если точек больше одной, то:
  30.                                                 - создаваемые контура будут включаться в последующие наборы, что может привести к неправильной работе команды
  31.                                                 - постоянный выбор всех видимых объектов тормозит комп.
  32.                                         так что если надо включить все видимые объекты, то лучше их сразу собрать в mas и потом просто подствалять в команду.
  33.                                 */
  34.                                 acedCommandS(
  35.                                         RTSTR, _T("_.-boundary"),
  36.                                         RTSTR, _T("_a"), // дополнительные данные
  37.                                         RTSTR, _T("_o"), // тип объекта для контура
  38.                                         RTSTR, _T("_p"), // создаваемый контур будет полилинией
  39.                                         RTSTR, _T("_i"), // нужно ли искать островки
  40.                                         RTSTR, _T("_y"), // нужно, либо _T("_n") - не нужно
  41.                                         RTSTR, _T("_b"), // объекты которые будут участвовать в формировании контуров
  42.                                         /*или 1*/RTSTR, _T("_e"), // это будут все видимые на экране объекты, либо вместо этого варианта выбрать /*2*/
  43.                                         /*или 2
  44.                                         RTSTR, _T("_n"), // новый набор
  45.                                         RTPICKS, mas, // указываем ads_name объектов, которые будут участвовать в команде
  46.                                         RTSTR, _T(""),// подтверждение
  47.                                         */
  48.                                         RTSTR,_T(""), // возвращаемся к указанию точки
  49.                                         RTPOINT, asDblArray(points.at(i)), // наша точка, указанная пользователем
  50.                                         RTSTR,_T(""), // подтверждаем ввод точки
  51.                                         RTNONE // конец команды
  52.                                         );
  53.  
  54.                                 acdbEntLast(plBoundary);
  55.                                 if (plBoundaryPreviousStep[0] == plBoundary[0] && plBoundaryPreviousStep[1] == plBoundary[1])
  56.                                 {
  57.                                         acutPrintf(_T("  %d-я точка поганая\n"),i+1);
  58.                                         continue;
  59.                                 }
  60.                                 // перекинули последний добавленный в акад объект
  61.                                 plBoundaryPreviousStep[0] = plBoundary[0];
  62.                                 plBoundaryPreviousStep[1] = plBoundary[1];
  63.  
  64.                                 ::acdbGetObjectId(id,plBoundary);
  65.                                 if(acdbOpenObject(pEnt,id,AcDb::kForWrite) == Acad::eOk)
  66.                                 {
  67.                                         pEnt->setColorIndex(i+1);
  68.                                         pEnt->downgradeOpen();
  69.                                         pEnt->draw();
  70.                                         pEnt->close();
  71.                                 }
  72.                         }
  73.                 }
  74.  
  75. //-> возвращаем все в зад :)
  76.                 cmdechoVar.resval.rint = 1;
  77.                 acedSetVar(_T("cmdecho"), &cmdechoVar);
  78. //<-

по коду, пользователь клацает точки пока не устанет, потом создаются контура. варианта создания 2:
первый - используя все видимые объекты чертежа
второй - предварительно сформировав массив объектов, которые будут участвовать в формировании контуров (в коде сам массив пустой, так что надо бы дописать пару строчек для формирования массива и в конце строчка для его удаления :) )

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

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Re: Аналог команды _boundary.
« Ответ #2 : 01-06-2018, 15:33:17 »
Николай Горлов, благодарю! Похоже это то что нужно.

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

  • Administrator
  • *****
  • Сообщений: 8417
  • Карма: 1020
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Аналог команды _boundary.
« Ответ #3 : 01-06-2018, 16:42:22 »
для С# есть, для С++ увы ничего нет.
Кто сказал, что нет для C++? А это что:
Код - C++ [Выбрать]
  1. Acad::ErrorStatus acedTraceBoundary(
  2.     const AcGePoint3d& seedPoint,
  3.     bool detectIslands,
  4.     AcDbVoidPtrArray& resultingBoundarySet
  5. );
И она есть как минимум с AutoCAD 2011. В AutoCAD .NET она появилась на версию позже.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Debalance

  • ADN Club
  • ****
  • Сообщений: 316
  • Карма: 7
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Аналог команды _boundary.
« Ответ #4 : 02-06-2018, 12:37:56 »
Кто сказал, что нет для C++? А это что:
В описании к acedTraceBoundary сказано:
Цитировать
To succeed, the entities that form the boundary to be found must be entirely visible on screen in the AutoCAD editor.
В то время как автор топика говорит об "имеющемся наборе объектов". Т.е., как я понимаю, набор должен быть входным параметром функции....

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

  • Administrator
  • *****
  • Сообщений: 8417
  • Карма: 1020
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Аналог команды _boundary.
« Ответ #5 : 02-06-2018, 12:54:46 »
Debalance,
Я уточнял ответ Николая Горлова. Он имел в виду, что в .NET есть метод Editor.TraceBoundary, но забыл, что это просто обертка для acedTraceBoundary. Да, в команде _BOUNDARY больше возможностей, чем в  acedTraceBoundary, но в любом случае переданный набор примитивов должен быть полностью видим на экране.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Debalance

  • ADN Club
  • ****
  • Сообщений: 316
  • Карма: 7
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Аналог команды _boundary.
« Ответ #6 : 02-06-2018, 13:01:46 »
... но в любом случае переданный набор примитивов должен быть полностью видим на экране.
Поясните: если объекты попали в набор, но частично не "влезли" на экран, то будет ли построен контур в этом случае?

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

  • Administrator
  • *****
  • Сообщений: 8417
  • Карма: 1020
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Аналог команды _boundary.
« Ответ #7 : 02-06-2018, 13:31:08 »
Поясните: если объекты попали в набор, но частично не "влезли" на экран, то будет ли построен контур в этом случае?
В моих экспериментах контур не создавался. Но я проверял много лет назад. В любом случае поведение в таком случае недокументировано и результаты могут быть непредсказуемыми.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Debalance

  • ADN Club
  • ****
  • Сообщений: 316
  • Карма: 7
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Аналог команды _boundary.
« Ответ #8 : 02-06-2018, 13:45:56 »
В моих экспериментах контур не создавался.
Т.е., резюмируя сказанное Вами, получается задача в обобщенном случае (точка + набор), средствами ObjectARX не имеет решения. Обязательное условие - полная видимость объектов...

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

  • Administrator
  • *****
  • Сообщений: 8417
  • Карма: 1020
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Аналог команды _boundary.
« Ответ #9 : 02-06-2018, 14:05:05 »
Т.е., резюмируя сказанное Вами, получается задача в обобщенном случае (точка + набор), средствами ObjectARX не имеет решения. Обязательное условие - полная видимость объектов...
Если речь идёт о команде _BOUNDARY или функции acedTraceBoundary, то ответ - да. Но написать свою трассировку, используя средства ObjectARX и независящую от видимости примитивов на экране, вполне возможно. Я так понимаю, что ты именно это и сделал. Насколько я помню и в Map 3d есть аналогичная возможность.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Debalance

  • ADN Club
  • ****
  • Сообщений: 316
  • Карма: 7
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Аналог команды _boundary.
« Ответ #10 : 02-06-2018, 14:17:44 »
Я так понимаю, что ты именно это и сделал.
Да, конечно  ::).

Просто на вопрос автор топика:
Есть ли методы в objectarx 2016, которые реализуют аналогичное создание контура при имеющемся наборе объектов и указании внутренней точки?
Отвечать (судя по всему) надо так: Для решения задачи в обобщённом случае - нет.

Оффлайн АлексЮстасу

  • ADN Club
  • **
  • Сообщений: 86
  • Карма: 0
Re: Аналог команды _boundary.
« Ответ #11 : 03-06-2018, 22:58:39 »
Off-Topic: показать
Для человека, который своими силами решил, и качественно решил эту задачу, выступаете крайне скромно.  :D
я не программист, а технолог. пытаюсь быть постановщиком задач.