Визуальная идентификация объектов с определенными расширенными данными

Автор Тема: Визуальная идентификация объектов с определенными расширенными данными  (Прочитано 11709 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Всем привет!
Мой плагин позволяет в автокадовский примитив добавить определенные расширенные данные (далее - РД), однако при работе нет никакой идентификации, позволяющей узнать о наличии РД в примитиве. Есть конечно функция, которая позволяет их считать, но это уже другое.
А еще в автокаде есть такая штука, как параметризация и у нее есть возможность скрыть/показать запараметризированные примитивы. Думаю, нет смысла объяснять о чем я - все и так понятно:



Собственно, вопросы:
1. Есть ли в Net API возможность создавать нечто подобное для своих нужд? Чтобы рядом с примитивом, имеющим мои РД, отображался какой-нибудь символ
2. Если на п.1 ответ "да", то второй вопрос - насколько это будет "нагружать" автокад?

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Могу предположить, что это можно сделать с помощью DrawableOverrule

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 806
  • Карма: 166
    • Мои плагины к Автокаду
А может проще не значок показывать, а просто Entity.Highlight() ? И никаких накладных расходов

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Могу предположить, что это можно сделать с помощью DrawableOverrule
Собственно говоря ты прав. Насколько это будет нагружать AutoCAD ты сможешь проверить только экспериментально.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Александр Пекшев aka Modis 31-08-2017, 09:48:54

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
В общем - идея с Drawable Overrule подходит, но столкнулся с некоторыми проблемами:
1. Хочу дополнительную графику рисовать по принципу точек - в процентах от размера экрана. Вроде где-то видел, как это значение получить, но не могу найти. Буду признателен за подсказку
2. В методе WorldDraw не создаются примитивы. Вот мой пробник с поясняющим комментарием:
Код - C# [Выбрать]
  1. public override bool WorldDraw(Drawable drawable, WorldDraw wd)
  2. {
  3.     var ent = drawable as Entity;
  4.     if (ent != null)
  5.         if (ent.IsModPlusProduct())
  6.         {
  7.             var scale = 1;
  8.             var plane = ent.GetPlane();
  9.  
  10.             Matrix3d ucs = AcApp.DocumentManager.MdiActiveDocument.Editor.CurrentUserCoordinateSystem;
  11.             var extents = ent.GeometricExtents;
  12.             //var pt = extents.MaxPoint;
  13.             var pt = extents.MaxPoint.TransformBy(ucs.Inverse());
  14.             Point3dCollection points = new Point3dCollection();
  15.             points.Add(new Point3d(pt.X + 30 * scale, pt.Y + 30 * scale, plane.PointOnPlane.Z));
  16.             points.Add(new Point3d(pt.X + 30 * scale, pt.Y + 40 * scale, plane.PointOnPlane.Z));
  17.             points.Add(new Point3d(pt.X + 40 * scale, pt.Y + 40 * scale, plane.PointOnPlane.Z));
  18.             points.Add(new Point3d(pt.X + 40 * scale, pt.Y + 60 * scale, plane.PointOnPlane.Z));
  19.             points.Add(new Point3d(pt.X + 30 * scale, pt.Y + 60 * scale, plane.PointOnPlane.Z));
  20.             points.Add(new Point3d(pt.X + 30 * scale, pt.Y + 70 * scale, plane.PointOnPlane.Z));
  21.             points.Add(new Point3d(pt.X + 60 * scale, pt.Y + 70 * scale, plane.PointOnPlane.Z));
  22.             points.Add(new Point3d(pt.X + 60 * scale, pt.Y + 60 * scale, plane.PointOnPlane.Z));
  23.             points.Add(new Point3d(pt.X + 50 * scale, pt.Y + 60 * scale, plane.PointOnPlane.Z));
  24.             points.Add(new Point3d(pt.X + 50 * scale, pt.Y + 40 * scale, plane.PointOnPlane.Z));
  25.             points.Add(new Point3d(pt.X + 60 * scale, pt.Y + 40 * scale, plane.PointOnPlane.Z));
  26.             points.Add(new Point3d(pt.X + 60 * scale, pt.Y + 30 * scale, plane.PointOnPlane.Z));
  27.             points.Add(new Point3d(pt.X + 30 * scale, pt.Y + 30 * scale, plane.PointOnPlane.Z));
  28.  
  29.             Autodesk.AutoCAD.DatabaseServices.Polyline polyline =
  30.                 new Autodesk.AutoCAD.DatabaseServices.Polyline();
  31.             for (int i = 0; i < points.Count; i++)
  32.             {
  33.                 polyline.AddVertexAt(i, points[i].Convert2d(plane), 0.0, 0.0, 0.0);
  34.             }
  35.             polyline.ColorIndex = 150;
  36.             wd.Geometry.Draw(polyline); // Так не работает - вылетает автокад с фатальной ошибкой
  37.             wd.Geometry.Polyline(points, plane.Normal, IntPtr.Zero); // Так работает, но этого мало
  38.         }
  39.     return base.WorldDraw(drawable, wd);
  40. }
Я в комментарии написал, что этого мало и вот почему: вопрос - можно ли отрисовать как-то закрашенную фигуру? Например, при создании Grip'ов можно нарисовать любую фигуру и закрасить ее нужным цветом. А тут получается только наипростейшая фигура, у которой я не могу поменять ни цвет, ни толщину, не могу создать заливку.
Все примеры, которые я нахожу, совсем на другие темы (

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
С заданием цвета разобрался. Делается так:
Код - C# [Выбрать]
  1. short backupColor = wd.SubEntityTraits.Color;
  2. wd.SubEntityTraits.Color = 150;
  3. wd.Geometry.Polyline(points, plane.Normal, IntPtr.Zero);
  4. wd.SubEntityTraits.Color = backupColor;
Остальные вопросы пока не решены

UPD==========================
Как сделать залитый полигон тоже разобрался. Не так уж все и страшно оказалось))
Код - C# [Выбрать]
  1. short backupColor = wd.SubEntityTraits.Color;
  2. wd.SubEntityTraits.FillType = FillType.FillAlways;
  3. wd.SubEntityTraits.Color = 150;
  4. wd.Geometry.Polygon(points);
  5. wd.SubEntityTraits.FillType = FillType.FillNever;
  6. wd.SubEntityTraits.Color = backupColor;

Остался вопрос - размер в процентах от экрана

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Остался вопрос - размер в процентах от экрана
Высота видового экрана в единицах чертежа:
Код - C# [Выбрать]
  1. double height = (double)Application.GetSystemVariable("VIEWSIZE");
Высота и ширина видового экрана в пикселях:
Код - C# [Выбрать]
  1. Point2d screensize = (Point2d)Application.GetSystemVariable("SCREENSIZE");
Думаю этой информации тебе будет достаточно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Александр Ривилис, спасибо! Освежили память)

Но у меня остался один вопрос из разряда теоретики - вариант как на скрине в топике (для параметризации) сделан явно без использования Drawable Overrule, так как там окошко с кнопкой и контекстным меню. Может это какие-то особые механизмы, к которым нет доступа в API
И еще вопрос - в Civil реализовано отображение предупреждений (треугольник с восклицательным знаком) - вот это ближе к Drawable Overrule по поведению. Но такой значок я лично не представляю как можно нарисовать. Это как реализовано?



Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Но такой значок я лично не представляю как можно нарисовать. Это как реализовано?

Скорее всего это просто символ шрифта, как пример посмотри Segoe UI Symbol там под номером U+26A0 похожий значок


Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Владимир Шу, кхм... Хорошее предположение и вполне логичное. Спасибо. Погляжу символы - может и мне подходящий найдется

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
вариант как на скрине в топике (для параметризации) сделан явно без использования Drawable Overrule, так как там окошко с кнопкой и контекстным меню.
Ну это и сделано не с помощью AutoCAD .NET API, а с помощью ObjectARX. Хотя возможно при помощи GripsOverrule это можно сделать. Надо ли только такие сложности?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Скорее всего это просто символ шрифта, как пример посмотри Segoe UI Symbol там под номером U+26A0 похожий значок
Возможно, хотя я бы был осторожнее со шрифтами, которых может просто не быть на PC.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Segoe  это семейство системных шрифтов и в винде с висты...

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Надо ли только такие сложности?
Нет конечно) Просто хотелось понять как они это реализовали
Единственное, что мне не нравится в варианте с Drawable Overrule - то, что если я буду размер "значка" делать в зависимости от размера экрана (в процентах), то он будет перерисовываться после вызова Regen. Я конечно не пробовал, но по опыту работы в Civil почти на 100% уверен, что это так

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Единственное, что мне не нравится в варианте с Drawable Overrule - то, что если я буду размер "значка" делать в зависимости от размера экрана (в процентах), то он будет перерисовываться после вызова Regen.
Ты имеешь в виду, что он будет перерисовывать только после вызова Regen? Чтобы этого избежать придётся потрудится и обрабатывать все изменения размера экрана  (высоты экрана в единицах чертежа), а это несколько различных событий, и выполнять обновление своих примитивов, т.е. делать самостоятельно их регенерацию.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение