double-line&arc

Автор Тема: double-line&arc  (Прочитано 17358 раз)

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

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
double-line&arc
« : 27-01-2015, 12:15:13 »
Добрый день,
Возникла необходиность избавится от старого lisp'a, который позволяет создавать "стены",
т.е. двойную линию с возможностю добавлять арки.

Первая мысль была исползовать AcDbMline , но выяснилось что етот объект арки не поддерживает.
Вторая мысль была исползовать AcDbPolyline и getOffsetCurves, наверное самое логичное, но столкнулся с такой проблемой.
  1. если нарисовать всю полилинию через acedCommand, то всё хорошо, но "сдвоиность"не видна до окончания команды.
  2. если рисовать в ручную, собирая точки через acedGetPoint, то не понял как арки прилепить, ну точнее как сделать чтобы при создании арки ету дугу видно было realtime?

Может для арки через acedCommand "_.арц" запускать и потом вытаскивать нужную инфу(bulge и endPoint) и лепить к полинии?

Куда на Ваш взгляд стоит двигаться?

Отмечено как Решение begiz 27-01-2015, 15:50:21

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

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: double-line&arc
« Ответ #1 : 27-01-2015, 13:15:02 »
я бы двигался в сторону custom объектов, если линия должна выделяться сразу сдвоенная (офсет делать в subworlddraw). ну и в диспетчере свойств при написанном враппере сразу станет понятно, что это не просто полилиния. и свойства у неё особенные. ну или как минимум, джиг, если это будут две линии, не зависимые друг от друга (там в принципе тоже не сложно), а вообще, понадобится и то и другое )))

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Re: double-line&arc
« Ответ #2 : 27-01-2015, 13:20:58 »
Спасибо за ответ.
CustomObjects отпадают за ненадобностью.
Конечный результат вообше будет разбит на линии и арки,
т.е. никакого доп функционала на данном этапе не планируется.

Единственное требование чтобы отрисовывалось сдвоенно realtime, ну или почти realtime, после окончания формирования сегмента(прямого или арки).

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

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: double-line&arc
« Ответ #3 : 27-01-2015, 13:29:15 »
качество конечно не получилось нормальное сделать, но смысл думаю понятен. у меня это custom объект + джиг.
я так понял нужно нечто подобное?

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Re: double-line&arc
« Ответ #4 : 27-01-2015, 13:35:41 »
Классно, как бы то что нужно :)
А как собственно арка создается/реализация?

На картинке видно что арка реагирует на положение курсора при выборе 3 точки.
Там AcDbArc создается или AcDbPolyline как то обрабатывается?

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

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: double-line&arc
« Ответ #5 : 27-01-2015, 14:21:35 »
там математика в чистом виде. создается свой объект от acdbpolyline, в котором в worlddraw прописано делать оффсеты в две стороны от базовой линии. и есть джиг, работающий с acdbpolyline, внутри которого на чистой математике идут расчеты скруглений, в зависимости от того, что хочет пользователь и положения мышки. короче говоря, рисуется простая полилиния с дуговыми сегментами. за это отвечает джиг. но, т.к. в джигу передали не полилинию а custom объект, то непосредственное РИСОВАНИЕ происходит внутри этого самого custom объекта.
а дуга идет либо по хорде, либо через три точки. опять же в зависимости от того, что наклацал пользователь. короче, пытался имитировать оригинальную команду по рисованию полилинии, выкинув все ненужное

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: double-line&arc
« Ответ #6 : 27-01-2015, 15:42:36 »
Думаю, что самый оптимальный для тебя способ - это тот, который предложил Николай Горлов, с небольшим дополнением. Custom Entity в твоём случае должен быть временный, его не следует регистрировать и добавлять в чертеж. По этому же принципу сделано у меня в DynDraw: http://www.maestrogroup.com.ua/support/dyndraw.zip
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Re: double-line&arc
« Ответ #7 : 27-01-2015, 15:50:04 »
Спасибо,
нашел вот такую ссылку, как раз про "временные" customObjects и Jig.
Бум пробовать.

http://adndevblog.typepad.com/autocad/2013/01/jig-more-than-one-entity-with-acedjig-class-in-objectarx.html

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: double-line&arc
« Ответ #8 : 27-01-2015, 15:57:28 »
нашел вот такую ссылку, как раз про "временные" customObjects и Jig.
Бум пробовать.

http://adndevblog.typepad.com/autocad/2013/01/jig-more-than-one-entity-with-acedjig-class-in-objectarx.html
Редактировать сообщение
Это не совсем (или "совсем не") то, о чем я говорил. В данном случае этот custom entity - контейнер для нескольких обычных примитивов AutoCAD. Но если ты хочешь возится одновременно с двумя AcDbPolyline - то пожалуйста. Николай предлагал совсем другую схему, а я её фактически дополнил тем, что при завершении JIG этот Custom Entity не вставляется в чертеж, а разбивается на AcDbPolyline (или если нужно то на AcDbLine и AcDbArc), а уже они добавляются в чертеж.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Re: double-line&arc
« Ответ #9 : 27-01-2015, 21:27:27 »
Понял.
Попытался сделать как предлагалось.
Опыта с CustomEntities ноль.

Wizardom сделал CustomEntity и Jig.

Код - C++ [Выбрать]
  1. CMultiPline * pLine = new CMultiPline();
  2. CPolyLig * pLig = new CPolyLig();
  3.  
  4. pLig->startJig(pLine);
  5.  
  6. delete pLig;
  7. delete pLine;
  8.  

в Jig подал мой объект, subWorldDraw вылетает.
Код - C++ [Выбрать]
  1.  
  2. Adesk::Boolean CMultiPline::subWorldDraw (AcGiWorldDraw *mode) {
  3.         assertReadEnabled () ;
  4.  
  5.         if(numVerts()>1)
  6.         {
  7.                 AcDbVoidPtrArray pozNeg;
  8.  
  9.                 getOffsetCurves(0.5,pozNeg);
  10.                 getOffsetCurves(-0.5,pozNeg);
  11.  
  12.                 for(int i = 0; i < pozNeg.length(); i++)
  13.                 {
  14.                         AcDbPolyline * pLine = (AcDbPolyline*)pozNeg[i];
  15.                         pLine->worldDraw(mode);
  16.                         delete pLine;
  17.                 }
  18.  
  19.                 return Adesk::kTrue;
  20.         }
  21.        
  22.         return (AcDbPolyline::subWorldDraw (mode)) ;
  23. }
  24.  
  25.  

Точнее вылетает после, не может освободить чтото.
retval = HeapFree(_crtheap, 0, pBlock); // free.c(110)

Autocad 2013 x64 ENG

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: double-line&arc
« Ответ #10 : 27-01-2015, 22:09:51 »
Wizardom сделал CustomEntity и Jig.
CustomEntity сделай наследником или от AcDbCurve или от AcDbEntity, но не от AcDbPolyline
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: double-line&arc
« Ответ #11 : 27-01-2015, 22:14:06 »
Не создавай AcDbPolyline внутри subWorldDraw. Если уж хочешь их использовать, то они должны быть созданы в других методах (например в конструкторе). В этом же методе ты должен только делать для них pLine->worldDraw(mode);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Re: double-line&arc
« Ответ #12 : 28-01-2015, 11:52:27 »
CustomEntity сделай наследником или от AcDbCurve или от AcDbEntity, но не от AcDbPolyline
хм, тогда и в джиг то нужно передавать AcDbEntity. Не знаю, лично для меня не удобно это :)

Не создавай AcDbPolyline внутри subWorldDraw. Если уж хочешь их использовать, то они должны быть созданы в других методах (например в конструкторе). В этом же методе ты должен только делать для них pLine->worldDraw(mode);
и опять же всё можно, если осторожно :):):). и да, работа идет с объектом, записанным в БД, т.к. часть родных функций objectarx мягко говоря работает нестабильно если объекта еще нет в бд. не говорю, что это происходит именно в этом случае. просто привык уже перестраховываться :). при желании, начальную запись в бд легко отстегнуть.

вот, что у меня получилось собрать на коленках по данной задачке. извиняйте, но проект было лепить отдельный лениво, всё запихнул в текстовик с пояснениями и разбивкой по файлам, так что проблем возникнуть не должно при перетаскивании к себе.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: double-line&arc
« Ответ #13 : 28-01-2015, 13:55:44 »
хм, тогда и в джиг то нужно передавать AcDbEntity
Ну и что? В чем проблема?
и да, работа идет с объектом, записанным в БД
Совершенно зря.
Хуже другое. Вот это:
Код - C++ [Выбрать]
  1. ACRX_DECLARE_MEMBERS(AcDbDoublePline) ;
и это:
Код - C++ [Выбрать]
  1. #ifdef ACADROPEDBX_MODULE
  2. ACDB_REGISTER_OBJECT_ENTRY_AUTO(AcDbDoublePline)
  3. #endif
приводит к появлению прокси-объектов в чертеже после сохранения. Не забывай, что вопроса о настоящем Custom Entity не стоит - он нужен лишь как временная удобная графика в JIG.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: double-line&arc
« Ответ #14 : 28-01-2015, 14:00:06 »
Ну и еще небольшое замечание по коду. Вместо acedTrans лучше воспользоваться acdbUcs2Wcs - не нужны все подготовительные процедуры.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение