• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

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

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

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

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

IgorT

Цитата: Lemieux от 22.04.25, 15:12:14Как Вы эти 225 пикселей выбираете?
Привязка к пикселям монитора идея оригинальная.
Но она же будет зависеть от текущего разрешения монитора. Не? Хорошо это или где?

Lemieux

Цитата: IgorT от 22.04.25, 15:14:36Привязка к пикселям монитора идея оригинальная.
Но она же будет зависеть от текущего разрешения монитора. Не? Хорошо это или где?
Вот и мне интересно.

IgorT

У меня такое впечатление, что К21 выбирает только видимые на мониторе объекты для привязки.
Это то, что наблюдал сегодня в немаленьком чертеже. Может в К23 что-то изменили?

A.n.d.r.e.w

#63
Цитата: IgorT от 22.04.25, 15:14:36Привязка к пикселям монитора идея оригинальная.
Но она же будет зависеть от текущего разрешения монитора. Не? Хорошо это или где?
вроде ответил уже.
я привязываюсь не к пикселям монитора (пиксельной карты) )))
с пиксельной карты я получаю цвет (читай референс) объекта/ов которые находятся под курсором.
а дальше дело математики, получаю сами объекты по их референсу и потом уже
привязываюсь к конкретным математическим значениям координат.
или вычисляю координаты например пересечения объектов МАТЕМАТИЧЕСКИ.
Что я так не понятно объясняю?  :`(

IgorT

Не. Я просто не пойму, текущее разрешение в пикселях будет влиять на качество выбора примитива?

A.n.d.r.e.w

#65
Цитата: IgorT от 22.04.25, 15:33:44Не. Я просто не пойму, текущее разрешение в пикселях будет влиять на качество выбора примитива?

НЕТ!


например у меня есть массив виртуальных объектов которые я рисую opengl-ем в окне Компас
и хочу тыкая мышкой их как-то выделять и например запускать процесс редактирования параметров с панелью свойств итд
для этого я создаю фреймбуфер, выделяю память равную количеству пикселей окна компас * 4 и отрисовываю
эти же объекты виртуальные там но не тем цветом которым в окне компас а цветом равным индексу объекта в массиве
в котором хранятся их геометрические параметры.
тыкая мышкой в экран, сканирую небольшую область вокруг курсора и если нахожу пиксель с цветом 6, то понимаю что
в ловушку попал мой виртуальный объект с индексом 6. лезу в массив извлекаю параметры 6го объекта и перерисовываю
егов окне Компас цветом селектирования. Объект выделен. Дублькликнул - запускаю процесс редактирования объекта №6

Привязку в Компасе таким способом не сделать. Если бы был какой-нибудь API функционал подсовывания координат для
привязки тогда да.

Таким образом привязки я реализовывал в другом своем собственном приложении.
Например нужно сделать привязки типа "выравнивания" к концам отрезков. Я беру и на еще одной пиксельной карте
рисую линии проходящие через вершины отрезков через весь экран. Вертикальные и горизонтальные.
Цвет каждой линии назначаю так, младшие 20 бит это индекс объекта в массиве старшие 4 это тип привязки.
Каждая линия для каждой точки будет иметь свой цвет. Например для отрезка таких линий 4, т.е. индекс будет один
а тип привязки будут разные. 
Получаю пиксель из ловушки, вычитываю младшие 20 бит получаю например 6 - значит я хочу привязаться к отрезку номер 6.
а к чему конкретно? получаю старшие 4 бита - ага тип привязки - горизонтальная к точке 2. Вуаля.
Лезу в массив объектов, получаю отрезок №6, получаю у него Y2 -это ордината, а абсцисса текущая курсора (пересчитанная
из координат окна в СК чертежа).
Вот она точка привязки.
Если это просто привязка к вершине отрезка, то таким же образом рисую в карте привязок
точку цветом равным индекс отрезка (7) + тип привязки (точка отрезка №2). Захватила ловушка эту точку, понимаю что привязка
к т2 отрезка №7, получаю отрезок №7, получаю X2, Y2. Привязываюсь.

для GDI можно использовать TBitmap

Lemieux

Цитата: A.n.d.r.e.w от 22.04.25, 14:20:47я перебираю пиксели которые попадают в "ловушку курсора" это где-то 15х15 пикс.
По цвету пикселя я определяю объект который попал в ловушку,
потом получаю сам объект и его точные параметры.. координаты вершин отрезка например.
Точность нормальная )
Цитата: A.n.d.r.e.w от 22.04.25, 15:24:23вроде ответил уже.
я привязываюсь не к пикселям монитора (пиксельной карты) )))
с пиксельной карты я получаю цвет (читай референс) объекта/ов которые находятся под курсором.
а дальше дело математики, получаю сами объекты по их референсу и потом уже
привязываюсь к конкретным математическим значениям координат.
или вычисляю координаты например пересечения объектов МАТЕМАТИЧЕСКИ.
Что я так не понятно объясняю?  :`(
Судя по Вашим ответам. То сначала 225 перебирается фрагментный буффер, для разрешения 1920х1080 это 2073600 пикселей, чтобы получить нужные пиксели, потом эта информация уходит в оперативку и считается ЦП, так же в цикле. В этом цикле Вы перебираете точки объекта. Я не хочу сказать, что Вы делаете неправильно, я говорю о том, что циклы везде. А вот момент оптимизации это уже другой вопрос. И КОМПАС может лагать из-за того, что в момент работы перетаскивания контрольных точек происходят множественные аллоцирования, а это очень затратный процесс.

A.n.d.r.e.w

Цитата: Lemieux от 22.04.25, 15:56:06Судя по Вашим ответам. То сначала 225 перебирается фрагментный буффер, для разрешения 1920х1080 это 2073600 пикселей, чтобы получить нужные пиксели, потом эта информация уходит в оперативку и считается ЦП, так же в цикле. В этом цикле Вы перебираете точки объекта. Я не хочу сказать, что Вы делаете неправильно, я говорю о том, что циклы везде. А вот момент оптимизации это уже другой вопрос. И КОМПАС может лагать из-за того, что в момент работы перетаскивания контрольных точек происходят множественные аллоцирования, а это очень затратный процесс.

не так. читайте внимательней.
все что я перебираю это 255 пикселей вокруг курсора.
дальше переборы никакие не требуются.

Lemieux

Цитата: A.n.d.r.e.w от 22.04.25, 16:02:05все что я перебираю это 255 пикселей вокруг курсора.
Ну да, а 255 пикселей магическим образом выбираются  :beer:


Сейчас, ради прикола, запилил синтетический тест фильтрации точек в 3d.

            int pointCount = 1700000;
            Point3d[] points = new Point3d[pointCount];
            Random random = new Random();
            int digitCount = 2;
            for (int i = 0; i < pointCount; i++)
                points[i] = new Point3d(Math.Round(random.NextDouble(), digitCount), Math.Round(random.NextDouble(), digitCount), Math.Round(random.NextDouble(), digitCount));
            List<List<Point3d>> frames = new List<List<Point3d>>();
            for (int i = 0; i < 59; i++)
            {
                List<Point3d> findPoints = new List<Point3d>();
                double frameValueX = Math.Round(random.NextDouble(), digitCount);
                double frameValueY = Math.Round(random.NextDouble(), digitCount);
                double frameValueZ = Math.Round(random.NextDouble(), digitCount);
                foreach (Point3d point in points)
                    if (point.X == frameValueX && point.Y == frameValueY && point.Z == frameValueZ)
                        findPoints.Add(point);
                frames.Add(findPoints);
            }

При 1.7кк точек выдаёт 60 к/с. И это C#, и без оптимизаций.

A.n.d.r.e.w

Цитата: Lemieux от 22.04.25, 16:34:09Ну да, а 255 пикселей магическим образом выбираются  :beer:

glReadPixels          //opengl
TBitmap.Canvas.Pixels  //GDI

или я не понимаю в чем загвоздка?

Lemieux

Цитата: A.n.d.r.e.w от 22.04.25, 16:48:02glReadPixels          //opengl
TBitmap.Canvas.Pixels  //GDI

или я не понимаю в чем загвоздка?
Так Вы дёргаете графическое API, а там так же в цикле перебирается, как я выше писал.

Если Вам интересно посмотрите реализацию Hello triangle в DirectX1-11/OpenGL и в DirectX12/Vulkan.

Кстати, то что у Вас нормальная производительность на GDI как раз говорит о том, что Ваша задача не такая и ресурсоёмкая по ЦП.

И ищё один интересный вопрос. Зачем в КОМПАС GDI и OpenGL?

Student2025

#71
Цитата: Lemieux от 22.04.25, 17:45:35И ищё один интересный вопрос. Зачем в КОМПАС GDI и OpenGL?

Потому что все развивается и не всегда понятно что за технология выстрелит - а вдруг windows переосмыслит работу GDI и выведет на другой уровень ?
Вопрос так и не услышал ответа почему нет поддержки DirectX ? или она есть ? я еще даже до того примерчика не дошел..   :o

Если смотреть на аналоговые разработки - они идут прям чуть ли не во все стороны - не понимаю откуда столько сил берут..



Lemieux

Цитата: Student2025 от 22.04.25, 22:09:28а вдруг windows переосмыслит работу GDI и выведет на другой уровень
В то время как ведущие вендоры признают свои ошибки, выбрав неверный путь, и переписывают свои приложения, АСКОН ждёт "а вдруг". Либо ишак сдохнет, либо падишах помрёт.


Цитата: Student2025 от 22.04.25, 22:09:28Вопрос так и не услышал ответа почему нет поддержки DirectX ?
Лучше спросить у разработчиков КОМПАС. Лично я пришёл к выводу, что из-за некомпетентности, лени и боязни вышестоящего руководства. Вангую, что изначально, КОМПАС разрабатывался на GDI, когда решили перейти на 3D, то был только OpenGL. Через несколько лет выходит DirectX и что делает АСКОН? - Забивает болт, как обычно.

Цитата: Student2025 от 22.04.25, 22:09:28Если смотреть на аналоговые разработки - они идут прям чуть ли не во все стороны - не понимаю откуда столько сил берут
Дело не в силах, а в желании. Как я выше советовал автору посмотреть примеры Hello triangle для DirectX и OpenGL.

A.n.d.r.e.w

Цитата: Lemieux от 22.04.25, 17:45:35Так Вы дёргаете графическое API, а там так же в цикле перебирается, как я выше писал.

Если вы имеете ввиду перерисовку карты, то да.
В том же цикле в котором я перерисовываю свои объекты в основном окне
которое видит пользователь я перерисовываю и карту.
Но карта перерисовывается не так часто как нужно находить объекты на экране.
Например она перерисуется когда изменилась экспозиция чертежа, добавился/удалился объект.
В этот момент пользователь нажимает-отпускает какие-то кнопки и не заметит этих микросекунд.
А вот когда он потом запускает процесс указания точки и просто водит мышкой по экрану
события MouseMove происходят ооочень часто и при каждом надо определять привязку.
Вы в каждом MouseMove перебираете все объекты и своим солвером который по десять условий на
каждую точку должен обработать все проверяете, так?

Цитата: Lemieux от 22.04.25, 17:45:35И ищё один интересный вопрос. Зачем в КОМПАС GDI и OpenGL?

Так ведь когда изобрели Компас, тогда бумагу и карандаш же не отменили?!
Как я понимаю, OpenGL использует мощности видеокарты, в то время как GDI только процессор.
А DirectX это, на мой взгляд, стрельба по воробьям из пушки. Адекватность какая-то должна ж присутствовать.

Lemieux

Цитата: A.n.d.r.e.w от 23.04.25, 08:55:12Вы в каждом MouseMove перебираете все объекты и своим солвером который по десять условий на
каждую точку должен обработать все проверяете, так?
Да, так и надо делать, это если упрощённо. Но потом ещё будут оптимизации.

То, что Вы описали в своём решении с помощью пикселей, это подходит для Вашей задачи. Что-то мне подсказывает, что при изменении зуммирования камеры будет изменяться точность, потому что данные берутся из растеризатора. Опять же, Вы писали про массив виртуальных объектов, которые, как я понял, Вы создаёте во время вхождения в процесс таскания точки. А это значит, что уже будет происходить аллоцирование памяти. Вот сколько? - Тут не известно. Всё зависит от того как используются данные.


Цитата: A.n.d.r.e.w от 23.04.25, 08:55:12А DirectX это, на мой взгляд, стрельба по воробьям из пушки. Адекватность какая-то должна ж присутствовать.
Почему DirectX стрельба по воробьям, а OpenGL нет?

A.n.d.r.e.w

Короче, кому нужно будет, тот вникнет поглубже и поймет изложенный мной принцип.
Хотя, и не для этой цели я начинал тему.
Всем спасибо!

Student2025

Цитата: Lemieux от 23.04.25, 08:11:06В то время как ведущие вендоры признают свои ошибки, выбрав неверный путь, и переписывают свои приложения, АСКОН ждёт "а вдруг". Либо ишак сдохнет, либо падишах помрёт.

Вспомните когда карты AMD покупали нарасхват! Они держали рынок, а Nvidia считала убытки.. Создали технологию - CUDA помню это время и все! теперь у них монополия.


Цитата: Lemieux от 23.04.25, 08:11:06Дело не в силах, а в желании.
Самое странное что некоторые проекты с гитхаба они живут только на донатах и наверно тут больше энтузиазм. На голодный желудок кодить - не камильфо  :o

A.n.d.r.e.w

#77
Цитата: UU от 22.04.25, 14:16:58Вести он может, как угодно, но графика - есть графика, я через GDI рисую.



Подскажите, вы как иконки для кнопок спецтулбара делаете?
Я имею ввиду фон. Как-то делаете прозрачный?
Или для разных тем разные иконки?


Разобрался. Нужно ico подсовывать, а я bmp совал )

UU


A.n.d.r.e.w

Цитата: UU от 25.04.25, 11:20:57Иконки, все - Bmp.

а фон у этих bmp как прозрачный делаете?
или он не прозрачный а цветом кнопки?