Тема: Пользовательские объекты AutoCAD

Доброго времени суток.
Очень нужно сделать собственные объекты в автокаде. Если кто нибудь сможет помочь ОЧЕНЬ жду сообщений.

Теперь в чем собственно состоит задание, например мне необходимо сделать новый объект который будет называться "CadMaster", допустим это будет окружность. Также необходимо добавить ему пользовательское свойство например "Price". Как то так...


P.S. Про динамические блоки, блоки с атрибутами, поля и т.д. и т.п. прошу не писать, это не решает проблемы.

Re: Пользовательские объекты AutoCAD

А теперь поподробнее зачем это нужно.

Re: Пользовательские объекты AutoCAD

Александр Ривилис пишет:

А теперь поподробнее зачем это нужно.

Нужно для того чтобы сделать мою работу...

Я разобрался как создать пользовательский объект, НО! Для этого приходится отрисовывать его программно используя С++, это не вариант в случае например трехмерных объектов. Может есть какой-то другой способ?

Re: Пользовательские объекты AutoCAD

Похоже ты не понимаешь, что такое пользовательский объект в смысле AutoCAD (custom entity) и как он создается. И причем здесь трехмерные объекты?

Re: Пользовательские объекты AutoCAD

Александр Ривилис пишет:

Похоже ты не понимаешь, что такое пользовательский объект в смысле AutoCAD (custom entity) и как он создается. И причем здесь трехмерные объекты?

Полностью согласен со своей не компетентностью в этом вопросе.

Именно поэтому зашел на этот форум. И прошу вас объяснить (если вас это канешно не затруднит) мне как создавать пользовательский объекты AutoCad.

Re: Пользовательские объекты AutoCAD

Kirus пишет:

И прошу вас объяснить (если вас это канешно не затруднит) мне как создавать пользовательский объекты AutoCad.

Для того чтобы создавать пользовательские объекты необходимо:
1) Знать хорошо C++
2) Знать хорошо AutoCAD
3) Знать очень хорошо ObjectARX (создание пользовательских объектов пожалуй самая сложная часть ObjectARX)
4) Знать как должен вести себя этот объект (реакция на команды AutoCAD)
5) Ну а дальше читать раздел документации Deriving a Custom ObjectARX Class, которая есть в составе ObjectARX SDK (ObjectARX Developer's Guide), изучать примеры и программировать, программировать, программировать...

Re: Пользовательские объекты AutoCAD

Ясно.
Теперь ответьте мне на один вопрос.
Можно ли создать собственный объект не отрисовывая его  графику программно,  а например указать изображение которое было создано ранее.

Например:
1.Я нарисовал руками круг (Как это сделать я знаю)
2.С помощью С++, создал новый объект назвал его "Cad" (Как это сделать я знаю)
3.Каким то образом дал понять объекту "Cad" что при виде например сверху он будет выглядеть как ранее нарисованный мой круг.(Как это сделать я не знаю)

(изменено: Юрий Устинов, 26 марта 2009г. 10:46:57)

Re: Пользовательские объекты AutoCAD

Kirus пишет:

Ясно.
Теперь ответьте мне на один вопрос.
Можно ли создать собственный объект не отрисовывая его  графику программно,  а например указать изображение которое было создано ранее.
Например:
1.Я нарисовал руками круг (Как это сделать я знаю)
2.С помощью С++, создал новый объект назвал его "Cad" (Как это сделать я знаю)
3.Каким то образом дал понять объекту "Cad" что при виде например сверху он будет выглядеть как ранее нарисованный мой круг.(Как это сделать я не знаю)

По-моему, достаточно доступно ответили.
По поводу пунктов:
1. "Нарисовать" это понятие растяжимое. Можно создать порт вывода OpenGL, можно в видепамятьпо адресу 0A0000h писать. А можно и на окне AutoCada при помощи BitBlt() :D.
За отрисовку объекта отвечает worldDraw(). Об этом можно прочитать в официальном мануале, который Вам, кстати, посоветовали в 5 пункте.
2. Создать объект можно, но надо, чтобы он ещё имел правильный класс, который создают при помощи разных визардов, а не пишут вручную.
3. Можно в каком-нибудь hex-редакторе написать программу в машкодах :) Вы будете гением просто, если успеете это за жизнь сделать.
А можно обратить внимание на советы и почитать доки от производителя. Там в
ObjectARX Developer's Guide (для 2008)->Entities->Entity Ownership есть изображение структуры хранения AcDbEntities. Посмотрите и многое станет ясно.

У меня тоже проблема при создании своего объекта. Я создал солюшн с двумя проектами: ARX и DBX.
DBX содержит класс, который наследуется от AcDbEntity. Вроде всё нормально, но приходится в Arx приложении дефайнить файлы DBX-приложения, а при линковке выводится сообщение об ошибке:

1>------ Build started: Project: Simple_ARX_Project1, Configuration: Debug Win32 ------
1>Compiling...
1>acrxEntryPoint.cpp
1>Linking...
1>acrxEntryPoint.obj : error LNK2001: unresolved external symbol "public: __thiscall ZLOI_CABLE::ZLOI_CABLE(void)" (??0ZLOI_CABLE@@QAE@XZ)
1>C:\Documents and Settings\Ustinov_UM\Мои документы\Visual Studio 2005\Projects\Simple_ARX_Project1\Win32\Debug/ZLOISimple_ARX_Project1.arx : fatal error LNK1120: 1 unresolved externals
1>Build log was saved at "file://c:\Documents and Settings\Ustinov_UM\Мои документы\Visual Studio 2005\Projects\Simple_ARX_Project1\Simple_ARX_Project1\Win32\Debug\BuildLog.htm"
1>Simple_ARX_Project1 - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ==========

Не подскажете где копнуть?
З.Ы.
Да вот причина ошибки:

static void CSimple_ARX_Project1_MakeSomething(void)
    {
        MessageBoxA(0,"Сделаем ВСЕХ!!!!","Я ЗДЕСЬ БОГ!!!!!",64);
        ZLOI_CABLE *ZC= new ZLOI_CABLE();
        //ZLOI_Cable *ZC = new ZLOI_Cable();
        //AcDbBlockTableRecordPointer pMS (ACDB_MODEL_SPACE, acdbHostApplicationServices()->workingDatabase(), AcDb::kForWrite) ;
        //pMS->appendAcDbEntity(ZC);
        
        //ZC->close();
    }
} ;

//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CSimple_ARX_Project1App)

ACED_ARXCOMMAND_ENTRY_AUTO(CSimple_ARX_Project1App, CSimple_ARX_Project1, _MakeSomething, MakeSomething, ACRX_CMD_MODAL, NULL)

Re: Пользовательские объекты AutoCAD

Я наверное очень туплю, так что извиняюсь за это
но ответа на вопрос я опять не получил.

Допустим я делаю объект Square:
dwgIn, dwgOut, бла-бла-бла
Доходим до функции worldDraw
Пишем в ней отрисовку квадрата: рисуем четыре линии.
Все зыко.

Но квадрат это очень простой объект, а мне понадобилось создать хитро-вычурную-параллелепипедную-окружность (что это такое, знаю только я)

Нарисовать ее линиями и прочими доступными примитивами можно, но этот займет всю мою жизнь.
А вот нарисовать ее руками в автокаде - это я сделаю за 2 минуты.

И вот мне хотелось бы знать, возможен ли например такой финт ушами:
я рисую эту самую хитрую штуку, сохраняю ее(в каком-нибудь виде), а в функции worldDraw вместо километров кода отрисовки всяких линий, точек и проч. я пишу что-то типа
myBurbulator->Load(<имя_сохраненного_рисунка>);
myBurbulator->Draw();

И в результате у меня будет рисоваться объект, изображение которого я определил ранее, но поддерживающий все мои доп. пропертис, функции и проч.

ЭТО МОЖНО СДЕЛАТЬ?
ИЛИ ЭТО УТОПИЯ? ИЛИ ЭТО НЕВЕРНЫЙ ПОДХОД?

Re: Пользовательские объекты AutoCAD

Юрий Устинов пишет:

Вроде всё нормально, но приходится в Arx приложении дефайнить файлы DBX-приложения, а при линковке выводится сообщение об ошибке:

Не подключил при компоновке arx-файла lib-файл из dbx-проекта.

Re: Пользовательские объекты AutoCAD

Kirus пишет:

Я наверное очень туплю, так что извиняюсь за это
но ответа на вопрос я опять не получил.
Допустим я делаю объект Square:
dwgIn, dwgOut, бла-бла-бла
Доходим до функции worldDraw
Пишем в ней отрисовку квадрата: рисуем четыре линии.
Все зыко.
Но квадрат это очень простой объект, а мне понадобилось создать хитро-вычурную-параллелепипедную-окружность (что это такое, знаю только я)
Нарисовать ее линиями и прочими доступными примитивами можно, но этот займет всю мою жизнь.
А вот нарисовать ее руками в автокаде - это я сделаю за 2 минуты.
И вот мне хотелось бы знать, возможен ли например такой финт ушами:
я рисую эту самую хитрую штуку, сохраняю ее(в каком-нибудь виде), а в функции worldDraw вместо километров кода отрисовки всяких линий, точек и проч. я пишу что-то типа
myBurbulator->Load(<имя_сохраненного_рисунка>);
myBurbulator->Draw();
И в результате у меня будет рисоваться объект, изображение которого я определил ранее, но поддерживающий все мои доп. пропертис, функции и проч.
ЭТО МОЖНО СДЕЛАТЬ?
ИЛИ ЭТО УТОПИЯ? ИЛИ ЭТО НЕВЕРНЫЙ ПОДХОД?

Думаю тут только правильная постановка задачи сможет что-то решить. Выводить растровое изображение в векторном редакторе это конечно странно.

Re: Пользовательские объекты AutoCAD

Kirus пишет:

...
И вот мне хотелось бы знать, возможен ли например такой финт ушами:
я рисую эту самую хитрую штуку, сохраняю ее(в каком-нибудь виде), а в функции worldDraw вместо километров кода отрисовки всяких линий, точек и проч. я пишу что-то типа
myBurbulator->Load(<имя_сохраненного_рисунка>);
myBurbulator->Draw();


И в результате у меня будет рисоваться объект, изображение которого я определил ранее, но поддерживающий все мои доп. пропертис, функции и проч.

ЭТО МОЖНО СДЕЛАТЬ?

ИЛИ ЭТО УТОПИЯ? ИЛИ ЭТО НЕВЕРНЫЙ ПОДХОД?

Наконец-то я увидел вопрос. А то все вокруг да около. В конструкторе своего объекта грузи чертеж как блок, а в worldDraw рисуй его. Не пробовал, но теоретически должно работать.

(изменено: Kirus, 26 марта 2009г. 11:38:08)

Re: Пользовательские объекты AutoCAD

Юрий Устинов пишет:

Думаю тут только правильная постановка задачи сможет что-то решить. Выводить растровое изображение в векторном редакторе это конечно странно.

Какой растр!!! какой вектор!!!
ЛЮДИ!!!

1.Будет создан файл в котором будет нарисован этот злополучный квадрат.
2.В функции worldDraw я не буду описывать изображение этого объекта програмно, а только покажу ему путь где лежит изображение этого объекта.

Мне нужен именно этот способ создания кастомер объектов.

Способ када изображение объекта описывается в программе я уже освоил, этот способ меня не устраивает.

Re: Пользовательские объекты AutoCAD

Kirus пишет:

В конструкторе своего объекта грузи чертеж как блок, а в worldDraw рисуй его.

Немного не ясно, если можно поподробнее.

Что значит "в worldDraw рисуй его" ?

Re: Пользовательские объекты AutoCAD

Kirus пишет:

Какой растр!!! какой вектор!!!
ЛЮДИ!!!
1.Будет создан файл в котором будет нарисован этот злополучный квадрат.
2.В функции worldDraw я не буду описывать изображение этого объекта програмно, а только покажу ему путь где лежит изображение этого объекта.
Мне нужен именно этот способ создания кастомер объектов.
Способ када изображение объекта описывается в программе я уже освоил, этот способ меня не устраивает.

Извиняюсь, видимо мой уровень слишком низкий.

Re: Пользовательские объекты AutoCAD

Kirus пишет:

2.В функции worldDraw я не буду описывать изображение этого объекта програмно, а только покажу ему путь где лежит изображение этого объекта.

Не годится. В worldDraw нельзя грузить другой dwg-файл, т.к. эта callback-функция,
которая вызывается слишком часто. Только в конструкторе.

(изменено: Александр Ривилис, 26 марта 2009г. 12:21:15)

Re: Пользовательские объекты AutoCAD

Kirus пишет:

Что значит "в worldDraw рисуй его" ?

Создаешь в конструкторе AcDbBlockReference, ссылающийся на нужный блок и вызываешь его метод worldDraw() в своем методе worldDraw().
Теоретически можно сделать иначе. Расписываю по шагам.
1) Рисуешь свой dwg-файл. Для простоты все в пространстве модели.
2) В конструкторе своего примитива открываешь этот dwg-файл, проходишься итератором по всему пространству модели, и создаешь массив указателей на клоны примитивов. Этот массив должен хранится все время жизни твоего примитива.
3) В методе worldDraw() своего примитива в цикле для всех элементов из массива вызываешь их методы worldDraw().
Это очень все упрощенно, т.к. я не знаю что позволительно делать с твоим примитивом. Возникнут вопросы что делать при клонировании твоего примитива, сохранении и т.д... Но это уже тебе придется копать самому.

Re: Пользовательские объекты AutoCAD

Ясно.
Спасибо большое.
Буду разбираться.

Re: Пользовательские объекты AutoCAD

Не подключил при компоновке arx-файла lib-файл из dbx-проекта.

Спасибо всё компилируется и работает. И правда, неправильно настроил зависимости проектов.