Интересный пример с пользовательскими объектами для изучения

Автор Тема: Интересный пример с пользовательскими объектами для изучения  (Прочитано 38750 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Я имею ввиду, что блок может содержать несколько объектов, если готовые примеры аналогичного блоку кода?
Я хочу применять для себя графические объекты с неизвестным заранее количеством (похожие на блоки но с большими возможностями, например которые можно растягивать секущей рамко), пока у меня не получается. Мне не все понятно: например надо делать массив с указателями или массивы с объектами? Подойдут ли в качестве массивов контейнеры std? Непонятно почему в этом примере если выделять штриховку, то выделяется полилиния, от куда автокад знает, что штриховка вложена в полилинию?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я имею ввиду, что блок может содержать несколько объектов, если готовые примеры аналогичного блоку кода?
У меня таких примеров кода нет. Но ты сам из примера, который выложил, уже давно мог сделать нужный тебе пример.
Непонятно почему в этом примере если выделять штриховку, то выделяется полилиния, от куда автокад знает, что штриховка вложена в полилинию?
Еще раз повторяю. В этом примере нет отдельной полилинии и отдельной штриховки. Есть единый и неделимый объект "полилиния+штриховка".
Мне не все понятно: например надо делать массив с указателями или массивы с объектами?
Массив с указателями. Обычно для этой цели используется AcGeVoidPointerArray или AcArray<AcDbEntity *>. Впрочем можно использовать и std-контейнеры.
похожие на блоки но с большими возможностями, например которые можно растягивать секущей рамко
Для этой цели ты должен как минимум реализовать метод getStretchPoints

« Последнее редактирование: 04-11-2014, 11:56:10 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Переписал вышележащий код, заменил член MyHatch на контейнер map c указателями на объекты. Для простоты пока включил в контейнер всего 1 объект (тот же MyHatch). Теперь штриховка почему то не отображается.

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Архив в решением 26МБ почему-то послать не получается.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Архив в решением 26МБ почему-то послать не получается.
И не получится. Ограничение в 8Мб. Перечитай то, что я написал здесь: http://adn-cis.org/forum/index.php?topic=987.msg4386#msg4386 и выкинь весь мусор из архива.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Почистил, отправляю.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Теперь штриховка почему то не отображается.
А как ей отображаться, если в исходном варианте в методе AuPolyline::subWorldDraw был код:
Код - C++ [Выбрать]
  1.         // Hatch
  2.         m_Hatch.fWorldDraw(mode);
  3.  
А теперь ты его выкинул полностью и соответственно никакая штриховка не рисуется.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Спасибо огромное!
Искал ошибки в других местах.

дописал в конце subWorldDraw()

Код - C++ [Выбрать]
  1.    objArray::iterator it;
  2.    for(it=m_Array.begin();it!=m_Array.end();it++)
  3.    {
  4.  
  5.       const TCHAR* str = (*it).second->isA()->name();
  6.       std::wstring ws(str);
  7.       bool k=(ws==(std::wstring(_T("MyHatch"))) );
  8.       if(ws==(std::wstring(_T("MyHatch"))) )
  9.       {
  10.          MyHatch* pH=dynamic_cast<MyHatch*>((*it).second);
  11.          if(pH)
  12.          {
  13.             pH->assertReadEnabled();
  14.             pH->subWorldDraw(mode);
  15.          }
  16.       }
  17.       else acutPrintf(_T("неизвестный тип данных\n"));
  18.    }

       перед

Код - C++ [Выбрать]
  1. //------ Returning Adesk::kFalse here will force viewportDraw() call
  2.    return (Adesk::kTrue) ;
теперь работает также.
Исправленное решение прикрепляю.
« Последнее редактирование: 04-11-2014, 15:16:30 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вообще-то всю эту хитрую проверку можно заменить на:
Код - C++ [Выбрать]
  1. MyHatch* pH =  MyHatch::cast((*it).second));
  2. if (pH)
  3. {
  4.   pH->SetupMe(this);
  5. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Спасибо, пригодится.

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Переделал немного код. Теперь переписал subTransformBy. Теперь объект перемещается, копируется, отражается, масштабируется вместе со штриховкой.
Но остались проблемы которые я не могу решить:
1) Файл с объектом не возможно правильно сохранить. Возможно тут надо как то переписать функцию SaveAs.
2) Не работают команды UNDO и REDO для штриховки, для полилинии они работают.

Подскажите пож. что нужно сделать. В сети похожих примеров я не нашел.

Оффлайн Николай Полещук

  • ADN
  • *
  • Сообщений: 33
  • Карма: 9
В качестве определенной помощи могу рекомендовать главу 3 моей книги "Программирование для AutoCAD 2013-2015". Глава посвящена пользовательским объектам (план главы: http://poleshchuk.spb.ru/cad/2014/book34-3.htm ).
В ней разбираются основные методы, которые надо переписать, в т.ч. dwgOutFields, dxfOutFields.

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Но функция dwgOutFields у меня вроде исправно работает например при перемещении объекта.

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

  • ADN OPEN
  • **
  • Сообщений: 87
  • Карма: 0
Хорошо, что вы написали эту книгу, обязательно куплю если найду.

Оффлайн Николай Полещук

  • ADN
  • *
  • Сообщений: 33
  • Карма: 9
Надо переписать все четыре метода (Out - In). Без них мало что работает.
Купить книгу просто: http://dmkpress.com/catalog/computer/cad/autocad/978-5-97060-066-5/