Страница 1 из 2

Контейнер визуальных объектов

СообщениеДобавлено: 03.01.2014 16:08:18
Sharfik
В статье "Контейнер визуальных объектов" автор рассказывал как сделать свой редактор графики векторной. Ну или что то на подобие. До момента прочтения статьи, у меня в голове не вязались некоторые аспекты, как реализовать отрисовку и перемещение примитивов по плоскости, когда те уже нарисованы. Исходники статьи работают на Lazarus, с некоторыми доработками. Однако подход к формированию примитивов и способ создания новых мне немного не подходили, и пришлось сделать себе класс где все с нуля.
Развивать как редактор свой класс нет задачи, поэтому выкладываю основу его, кому данная тема интересна, то будет с чем покопаться. Не хочу чтобы у меня исходники пылью покрылись.

Яндекс.Диск:
https://yadi.sk/d/ZdRCdsgmdIbRoA
GitHub:
github.com тут первая реализация

Дополнено 06.2020:
Добавил пример экспорта в DXF (POINT, LINE, CIRCLE, POLYLINE, INSERT, TEXT). Самостоятельно DXF R12 и с подгрузкой шаблона версии выше.

Пример использования на скриншоте

Re: Контейнер визуальных объектов

СообщениеДобавлено: 02.03.2014 02:31:44
zub
В выложенном проекте нехватает модуля u_geometry_functions (присутствует его PPU но нет исходника), если это так и задумано то обладатели компилятора версиё отличной от вашей ничего не посмотрят, ppu разных версий с компилятором не совместимы

Re: Контейнер визуальных объектов

СообщениеДобавлено: 02.03.2014 03:37:30
Sharfik
zub писал(а):В выложенном проекте нехватает модуля u_geometry_functions (присутствует его PPU но нет исходника), если это так и задумано то обладатели компилятора версиё отличной от вашей ничего не посмотрят, ppu разных версий с компилятором не совместимы

Наполеон тоже забыл, что в России может быть холодно :D Спасибо, исправил.

Re: Контейнер визуальных объектов

СообщениеДобавлено: 02.03.2014 10:12:56
zub
Теперь вроде заработало. но как посмотреть чтото я не понял(( примитивы создаются гдето вне области просмотра и не редактируются?

Добавлено спустя 14 минут 27 секунд:
в составе zcad`а есть аналогичные примеры - simplecad и advcad

Re: Контейнер визуальных объектов

СообщениеДобавлено: 02.03.2014 16:49:29
Sharfik
zub писал(а):Теперь вроде заработало. но как посмотреть что то я не понял(( примитивы создаются где то вне области просмотра и не редактируются?

Нет, идея была как раз, чтобы все редактировалось. Мне, если закончу базу, нужен будет редактор, для создания модели связей электрощитов.
Есть БД объектов-список объектов, есть поле отображения, есть часть их связывающая. Каждому эл-ту объекта передается набор функций при помощи которых он рисует себя сам, на поле, путем преобразования безразмерных единиц в пиксели.

Re: Контейнер визуальных объектов

СообщениеДобавлено: 02.03.2014 17:31:48
zub
>>Мне, если закончу базу, нужен будет редактор, для создания модели связей электрощитов.
Я зкад для этого и использую - разводка кабелей от щитов к датчикам и между щитами, последнее время немного для схем

Добавлено спустя 6 часов 37 минут 18 секунд:
>>Нет, идея была как раз, чтобы все редактировалось
Научился редактировать, ну уж очень не интуитивно

Re: Контейнер визуальных объектов

СообщениеДобавлено: 26.04.2016 04:40:35
zub
С другого топика:
Sharfik писал(а):Для тебя думаю мало что интересного. Тебя управление смущало, что не так четко как в zcad работает. А мне главное от класса того нужно, чтобы геометрию основную показывала, функция блоков была и не сильно много зависимостей было. Фишки добавил(рамка режима редактора, затухающие сообщения), а остальное внутри менял под нужды плагинов. Чтобы связывать сторонние классы с графикой. Не больше.

Ничего меня не смущало, полилиния добавляется в фиксированые координаты - на сдвинутом экране не сразу догадаешся что происходит. Да с виду всё по старому, разве что "подсказки" бросаются в глаза.

Прошлый раз не обратил внимания, а может еще небыло - присутствует зачаток олешного биндинга к автокаду. Оно работоспособно в лазаре? у меня чтото ничего не вышло - валится при попытке доступа к AutoCAD.ActiveDocument.Blocks

Re: Контейнер визуальных объектов

СообщениеДобавлено: 27.04.2016 00:30:34
Sharfik
zub писал(а):Прошлый раз не обратил внимания, а может еще небыло - присутствует зачаток олешного биндинга к автокаду. Оно работоспособно в лазаре? у меня чтото ничего не вышло - валится при попытке доступа к AutoCAD.ActiveDocument.Blocks

Demo программы, это демо программы всегда что то только для демонстрации. Тут мой косяк, мало описания.
Laz+AutoCAD все работает, если использовать только типы OleVariant, WideString, Double.
Если надо могу скинуть как я это делал.

Re: Контейнер визуальных объектов

СообщениеДобавлено: 27.04.2016 01:30:50
zub
хм. если скомпилить assi_graph в 3.0 - работает, в транке не работает - вылетает.
>>Если надо могу скинуть как я это делал.
Я думал тебе предложить приделать такой функционал к зкаду))

Re: Контейнер визуальных объектов

СообщениеДобавлено: 27.04.2016 01:42:30
Sharfik
zub писал(а):хм. если скомпилить assi_graph в 3.0 - работает, в транке не работает - вылетает.

чего то не понял, где не работает
zub писал(а):>>Если надо могу скинуть как я это делал.
Я думал тебе предложить приделать такой функционал к зкаду))

а смысл его туда приделывать? zcad имеет идеальный формат обмена dxf.

Re: Контейнер визуальных объектов

СообщениеДобавлено: 27.04.2016 01:58:25
zub
>>чего то не понял, где не работает
Связь лазаря с автокадом по оле. 3.0 связывается, транк валится

>>а смысл его туда приделывать? zcad имеет идеальный формат обмена dxf.
Меня пару раз просили о подобном. Но главное - свежий взгляд и критика

Re: Контейнер визуальных объектов

СообщениеДобавлено: 27.04.2016 02:51:29
Sharfik
zub писал(а):Меня пару раз просили о подобном.

Туда или оттуда?
Acad по Ole будет работать только с не LT версией, и только с последней открытой копией. Я не знаю как стучаться в разные экземпляры. Это минус большой.
Но, любой acad когда делает копирование каких то эл-тов чертежа создает в temp папке файл dwg. И в буфере обмена хранится ссылка в каком то формате. У меня была мысль, что можно формировать dxf файл и точно так же через буфер обмена подсовывать данные в acad в обход ole. Что быстрее кстати будет. Но не вникал, что за данные висят в буфере обмена, кроме пути.

Re: Контейнер визуальных объектов

СообщениеДобавлено: 27.04.2016 02:58:00
zub
Вставка через клипбоард работает zcad->acad обратно нет, т.к. я не нашел пути заставить автокад использовать для этой операции dxf или хотя бы dwg2000 который более-менее реально распарсить. а вот dxf c путем к нему в клипбоарде автокад прекрасно читает, чем я и воспользовался
Импорт нужен из автокада в зкад

Re: Контейнер визуальных объектов

СообщениеДобавлено: 03.05.2016 00:23:19
Sharfik
Sharfik писал(а):Я думал тебе предложить приделать такой функционал к зкаду))

Если читается dxf, лучше просить пользователя сохранять в нем для переноса данных. По моему. Потому что у меня мозгов не хватит сделать чтобы переносилось все.
Штриховки, арки, сплайны.. не разбирался как они вообще работают. Блоки и простые элементы линий могу считать. Правда в конечном счете уткнусь в незнание твоей уже платформы) Нужно тогда делать промежуточный какой то массив с данными прочитанными.

Re: Контейнер визуальных объектов

СообщениеДобавлено: 03.05.2016 18:27:18
zub
Потому что у меня мозгов не хватит сделать чтобы переносилось все.
Штриховки, арки, сплайны.. не разбирался как они вообще работают. Блоки и простые элементы линий могу считать

Импорт естественно только поддерживаемых примитивов. На сегодняшний день это POINT, LINE, CIRCLE, POLYLINE, LWPOLYLINE, ARC, ELLIPSE, INSERT, TEXT, MTEXT, 3DFACE, SOLID, SPLINE
По идее ничего сложного, создаешь примитив, настраиваешь свойства, добавляешь в чертеж
Я сейчас какраз выделяю некое API по взаимодействию с зкадом
https://svn.shamangrad.ru/zcad/trunk/ca ... cutils.pas
и с движком
https://svn.shamangrad.ru/zcad/trunk/ca ... eutils.pas

Правда в конечном счете уткнусь в незнание твоей уже платформы)

в общем сложного по идее ничего нет, например создание линии выглядит както так
Код: Выделить всё
function DrawLine_com(operands:TCommandOperands):TCommandResult;
var
    pline:PGDBObjLine;
    p1,p2:gdbvertex;
begin
    if commandmanager.get3dpoint('Specify first point:',p1) then                //просим у пользователя первую точку
    if commandmanager.get3dpoint('Specify first second:',p2) then               //просим у пользователя вторую точку
    begin
      pline := AllocEnt(GDBLineID);                                             //выделяем память
      pline^.init(nil,nil,0,p1,p2);                                             //инициализируем

      zcSetEntPropFromCurrentDrawingProp(pline);                                  //присваиваем текущие слой, вес и т.п
      zcAddEntToCurrentDrawingWithUndo(pline);                                    //добавляем в чертеж
    end;
    result:=cmd_ok;
end;