Тема: Как программно осуществить штриховку в объекте AcDbEntity ?
Создан обьект от AcDbEntity. Как осуществить штриховку
в этом обьекте прямоугольных областей.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → Как программно осуществить штриховку в объекте AcDbEntity ?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Создан обьект от AcDbEntity. Как осуществить штриховку
в этом обьекте прямоугольных областей.
> CheVik
1) Что такое "обьект от AcDbEntity"?
2) Что такое "штриховка
в этом обьекте прямоугольных областей"?
Каков вопрос - таков и ответ...
Мой класс унаследован от AcDbEntity.
Как осуществить штриховку в этом классе.
> CheVik
Как минимум необходимо, чтобы был переопределен метод explode() и он возвращал стандартные примитивы AutoCAD, которые могут быть заштрихованы (например: AcDbPolyline, AcDbCircle, AcDbArc и т.д.)
explode() это то, что после разбивки, нужно чтобы был допустим заштрихованный прямоугольник и до разбивки
Наконец-то понял чего ты добиваешься.
Добавь в класс член:
AcDbHatch *m_hatch;
В конструкторе его инициализируй, когда нужно его модифицируй (например, в методе transformBy(...)). Не забудь сохранять/востанавливать его в методах dwgOutFields и dwgInFields и вызвать в методах worldDraw/viewportDraw класса m_hatch->worldDraw(...) и m_hatch->viewportDraw(...).
Да это сработало, только инициализация идет не в конструкторе, а в методе worldDraw:
m_hatch = new AcDbHatch();
m_hatch->setNormal(normal);
m_hatch->setElevation(0.0);
..............
m_hatch->appendLoop(.....);
m_hatch->worldDraw(mode);
delete m_hatch;
> CheVik
Делать инициализацию в worldDraw() я бы не советовал. Причина в том, что если контур достаточно сложный, или штриховка достаточно плотная, то операция штриховки может занимать приличное время и это будет плохо сказываться на производительности, а может вообще перестать работать.
А если модификация, тогда m_catch->appendLoop() нужно будет делать в transformBy(), moveGripPointsAt(), перед этим изменяя координаты контура шриховки. В чем разница? А если делать инициализацию в конструкторе то перед m_hatch->appendLoop() должны быть определены координаты контура, а они определяются в моей функции SetPoint(), которая вызывается из worldDraw(). Или я чего то не понимаю.
А если модификация, тогда m_catch->appendLoop() нужно будет делать в transformBy(), moveGripPointsAt(), перед этим изменяя координаты контура шриховки.
Зачем? Напустишь на него transformBy() и все. Впрочем если у тебя все работает и так, то лучше не трогай...
P.S.: Так как ты не хранишь m_hatch и его "время жизни" - время работы метода worldDraw(), то в worldDraw() можешь его создавать в стеке, т.е.
//........... AcDbHatch m_hatch; m_hatch.setNormal(normal); m_hatch.setElevation(0.0); //.............. m_hatch.appendLoop(.....); m_hatch.worldDraw(mode); //............
> Александр Ривилис
Большое спасибо тебе Александр!!!
А я так делал:
acdbEntLast(izd); CButton *checkbox; checkbox= (CButton*)GetDlgItem(IDC_SHTRIH); if(checkbox->GetCheck()) acedCommand(RTSTR, "_.hatch", RTSTR, "line", RTSTR, "4", RTSTR, "45", RTENAME, izd, RTSTR, "", RTNONE);
> supremum
Использование acedCommand в ObjectARX вообще, а при открытом диалоге в частности, не может приветствоваться.
> supremum
А главное ты не понял, что речь идет о custom entity внутри которого использовать acedCommand вообще нельзя.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → Как программно осуществить штриховку в объекте AcDbEntity ?
Форум работает на PunBB, при поддержке Informer Technologies, Inc