Дорисовка изображения с помощью OpenGl в событиях IDocumentFrameNotify

Автор A.n.d.r.e.w, 19.04.25, 13:50:47

« назад - далее »

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

A.n.d.r.e.w

Привет форум.
В 2D рисую фантом своего макроэлемента. Когда таскаю
мышь по экрану "резиновый" фантом перерисовывается.
Стандартными методами из примеров SDK перерисовывается
очень медленно в больших чертежах. Понятно, при добавлении/удалении
примитивов происходит перестроение и обновление всего-всего вроде
ksRefreshActiveWindow. Пробовал рисовать с помощью opengl
в событиях фрейма BeginPaintGL/ClosePaintGL. Рисуется.
Но только при том же перестроении т.е. когда сдвинули или
зуммировали изображение. Когда изображение в окне Компас статично
и я просто вожу мышкой, при запущенном процесс указания точки,
то события BeginPaintGL/ClosePaintGL не происходят.
Если вызывать при каждом движении мыши ksRefreshActiveWindow,
то опять тормоза. При движении мышки происходят события BeginPaint/ClosePaint.
Но не понятно как дорисовывать изображение там.
Имеем IPaintObject -> HWND -> HDC но на этом контексте рисовать бесполезно,
В BeginPaint Компас накладывает поверх мною нарисованного каждый раз свое изображение.
В ClosePaint получается что я затираю то что нарисовал Компас.
Получить доступ к контексту opengl не знаю как.
у IPaintObject есть свойство GetDIBForOutput которое должно возвращать имя
объекта "проекции файла", как сказано в SDK как раз для этих целей.
Как-нибудь теоретически через FBO можно было бы там рисовать.
Но возвращает эта функция IPaintObject.GetDIBForOutput все время пустую строку (
Может есть у кого опыт, поделитесь пожалуйста. Как правильно дорисовывать изображение
в событиях IDocumentFrameNotify BeginPaint/ClosePaint ??

Student2025

Сам код бы не помешал бы..
opengl - сколько работал с программами через него - одни подлагивания..

Интересно почему Компас не использует DirectX в api ?

IID_ID3D11Device = comtypes.GUID("{db6f6ddb-ac77-4e88-8253-819df9bbf140}")
IID_IDXGISwapChain = comtypes.GUID("{310d36a0-d2e7-4c0a-aa04-6fabb5976e5c}")

A.n.d.r.e.w

Цитата: Student2025 от 19.04.25, 19:51:17Сам код бы не помешал бы..

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

1.Событие BeginPaint/ClosePaint происходит при перерисовке окна а также при
движении мыши в режиме процесса указания точки.

2.Событие BeginPaintGL/ClosePaintGL происходит только при перерисовке окна, т.е.
при перемещении или изменении масштаба изображения в окне.

3.Событие BeginPaintTmpObjects/ClosePaintTmpObjects происходит при перерисовке окна, а также при
движении мыши в режиме процесса указания точки.

При отключенном аппаратном ускорении
Параметры->Управление системой->Вариант отрисовки->Вариант отрисовки->Без апп. ускорения
2 и 3 не происходят, OpenGl тоже в этом режиме не используется (как мне думается, не проверял).
Вот тогда можно рисовать в контексте она напрямую с помощью GDI например.
Иначе компас рисует свое изображение во фреймбуфере gl попутно давая пользователю возможность
что-то дорисовать в событиях 2,3 и потом выкладывает готовое изображение в окно,
после чего происходит ClosePaint.
Короче для отрисовки фантома, который как бы и есть временный объект надо использовать
события BeginPaintTmpObjects/ClosePaintTmpObjects которые я почему-то изначально проигнорировал.
+ Благодарностей: 1

Student2025

Цитата: A.n.d.r.e.w от 21.04.25, 10:40:07У меня там всё, мягко сказать, непрозрачно)

Мы разберемся и для форума будет полезно много кода.

A.n.d.r.e.w

#4
Цитата: Student2025 от 21.04.25, 11:25:28Мы разберемся и для форума будет полезно много кода.

примерно так:

function DocumentFrameEvent.BeginPaintTmpObjects: WordBool; stdcall;
  begin
    if Assigned(FOnTempBeginDraw) then
    begin
      glPushMatrix;
      glLoadIdentity;
      with Matryx do
      begin
        glTranslatef(a14, a24, 0);
        glScalef(a11, a22, 1);
        FOnTempBeginDraw (a14, a24, 0, a11);
      end;
      glPopMatrix;
    end;
    Result := true;
  end;

подписка на перерисовку через присвоение FOnTempBeginDraw адреса функции перерисовки
в функцию перерисовки передаю смещение и поворот СК текущего вида а также масштаб (иногда бывает нужно)
матрицу получаю в событии BeginPaint таки

type
TransformMtr=record
  a11, a12, a13, a14, a21, a22, a23, a24: Double;
end;
.....
Matryx: TransformMtr;
.....

function DocumentFrameEvent.BeginPaint(const paintObj: IUnknown): WordBool;
  var pnt: IPaintObject;
  begin
    pnt:= paintObj as IPaintObject;
    with Matryx do pnt.GetTransformMatrix(a11, a12, a13, a14, a21, a22, a23, a24) ;
    Result := true;
  end;

в самой функции перерисовки просто рисую методами GL

    ...
    glBegin(GL_LINES);
    glVertex2d(x1, y1);
    glVertex2d(x2, y2);
    glEnd;
    ....


см. уточнения ниже
+ Благодарностей: 1

Student2025


A.n.d.r.e.w

Цитата: Student2025 от 21.04.25, 13:30:26Вы все выложите - пригодится.

у меня в проекте 30 модулей только собственных + ресурсы + ActiveX
не буду я все выкладывать )))

Вы если что-то поконкретнее, то спрашивайте.

p3452

Цитата: A.n.d.r.e.w от 21.04.25, 10:40:07Вот тогда можно рисовать в контексте напрямую с помощью GDI например.
"Рисовать" можно чем угодно и на чем угодно...
Но!
Будет ли Компас воспринимать "нарисованное" - своим, т.е. будет ли сохранять в файл и воспроизводить, при последующем открытии!?

Student2025

Цитата: A.n.d.r.e.w от 21.04.25, 13:38:46у меня в проекте 30 модулей только собственных + ресурсы + ActiveX
не буду я все выкладывать )))
Все  не надо только код и то не весь а только то что связано с API Компас.


Цитата: p3452 от 21.04.25, 14:29:41т.е. будет ли сохранять в файл и воспроизводить
Мне кажется или ответ очевиден?

UU

Цитата: p3452 от 21.04.25, 14:29:41"Рисовать" можно чем угодно и на чем угодно...
Но!
Будет ли Компас воспринимать "нарисованное" - своим, т.е. будет ли сохранять в файл и воспроизводить, при последующем открытии!?

Это нужно для отрисовки того, что Компас сам не может нарисовать, т.е. Ваши компоненты, как Вы их сохраните Компасу фиолетово, Вы их должны читать, сохранять и т.д.

Student2025

Цитата: UU от 21.04.25, 14:55:04Это нужно для отрисовки того, что Компас сам не может нарисовать, т.е. Ваши компоненты, как Вы их сохраните Компасу фиолетово, Вы их должны читать, сохранять и т.д.

Вот и говорю примерчик бы не помешал для закрепления информации.

UU

Цитата: Student2025 от 21.04.25, 15:00:16Вот и говорю примерчик бы не помешал для закрепления информации.
Вам часть дали, если не хватает - c:\Program Files\ASCON\KOMPAS-3D v23\SDK\Samples\Pascal\Delphi\Cube\.
+ Благодарностей: 1

Student2025

UU отлично, тогда вопрос оставшийся такой - как рисовать объекты через DirectX ?

Цитата: UU от 21.04.25, 14:55:04т.е. Ваши компоненты, как Вы их сохраните Компасу фиолетово
Не ну а как он тогда без низ воспроизведет нарисованное ? тут наверно решение в примере том.

Lemieux

Цитата: Student2025 от 21.04.25, 13:30:26Вы все выложите - пригодится.
Так идите в пример C++ Cube и смотрите.

Lemieux

Цитата: Student2025 от 21.04.25, 15:10:35UU отлично, тогда вопрос оставшийся такой - как рисовать объекты через DirectX ?
Открываете документацию на DirectX 11 и рисуете объекты.

Student2025

Цитата: Lemieux от 21.04.25, 15:13:59Открываете документацию на DirectX 11 и рисуете объекты.

Я же выше написал как работать с DirectX через Python. Уже есть какая то база, и пусть маленькая - остается ее интегрировать в Компас 3D "Народная солянка".
Вспомнил один диплом который делали 30 студентов и каждый не знал что он делает НО считает своим долгом оставить в ней частичку мудрости.


Lemieux

Цитата: Student2025 от 21.04.25, 15:37:02Я же выше написал как работать с DirectX через Python. Уже есть какая то база, и пусть маленькая - остается ее интегрировать в Компас 3D "Народная солянка".
Вспомнил один диплом который делали 30 студентов и каждый не знал что он делает НО считает своим долгом оставить в ней частичку мудрости.


Какой же бред.

Student2025

Цитата: Lemieux от 21.04.25, 15:39:28Какой же бред.
Видите как Вы со стороны выглядите когда пишете не в тему в чужих темах..
Вот и занимайтесь библиотекой автоматических приборов.

И кстати на днях запатентовал одну автоматику которая разгружает электросеть.  Написал пару производителям - не кто так и не заинтересовался почему то.
Устройство работает в режиме клиент - сервер балансируя нагрузки на фазах.

Lemieux

Цитата: Student2025 от 21.04.25, 15:51:15Вот и занимайтесь библиотекой автоматических приборов.
Я то занимаюсь, а ваш квартет только бегает по темам и флудит. Человек просит совета, ему начинают задавать тупые вопросы клянча код. Пока от Вас вообще никаких результатов работы не было, ни куска осмысленного кода.

IgorT

Цитата: Student2025 от 21.04.25, 15:51:15... балансируя нагрузки на фазах.
А можно спросить, как нагрузку на фазах балансируют?