DrawableOverrule. Возможно редактирование базовой геометрии объекта?

Автор Тема: DrawableOverrule. Возможно редактирование базовой геометрии объекта?  (Прочитано 10853 раз)

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

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

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Здравствуйте.
При использовании DrawableOverrule для изменения отображения объекта нужно переопределять метод WorldDraw. При этом, если нужно сохранить базовое отображение, где-то внутри метода нужно вызвать этот метод базового класса. Соответственно, если не нужно, то метод базового класса не вызывается.
Мне же нужно отредактировать базовое отображение объекта. По сути нужно вырезать из него ограниченный кусок графики. Больше всего похож на нужное метод PushClipBoundary для свойства Geometry объекта WorldDraw, который передается вторым аргументом в этот одноименный переопределяемый метод. Но он оставляет только ту геометрию, которая внутри заданной области, мне бы наоборот. Можно как-то это сделать?
Конечно, есть еще вариант с отрисовкой закрашенной белой области, которая будет выступать маской для ненужной геометрии. Но смотрится это некрасиво.

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

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

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Так нет возможности рисовать WIPEOUT в этом методе. Для добавления из графики доступны линии, дуги, полилинии, полигоны, текст и т.д. и т.п., но вайпаута там нет.
С цветом фона попробую поковырять...
Чуть позже попробую сделать и выложить рабочий тестовый пример для автокада, если не найду решения. У меня же код для Civil-объектов. Хочу немного исправить их отображение на нужное.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Так нет возможности рисовать WIPEOUT в этом методе.
Неа. Есть. В коде метода WorldDraw:
Код - C# [Выбрать]
  1. Wipeout wp = new Wipeout();
  2.  
  3. // Дальше инициализация wp, как здесь: http://through-the-interface.typepad.com/through_the_interface/2007/12/creating-an-aut.html
  4. // wp.SetFrom(...);
  5.  
  6. // Теперь рисуем основную графику
  7. // и после неё wipeout:
  8. wp.WorldDraw(wd);
Как-то так, хотя я никогда этого не делал.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Попробовал нарисовать WIPEOUT. Рисуется, но графику под собой не перекрывает. Пробовал задавать разные опции - не помогает. Или я что-то забыл?
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.DatabaseServices;
  2. using Autodesk.AutoCAD.Geometry;
  3.  
  4. using Autodesk.AutoCAD.GraphicsInterface;
  5. namespace BaseGeometryEdit
  6. {
  7.     class LineOverrule : DrawableOverrule
  8.     {
  9.         protected LineOverrule()
  10.         {
  11.         }
  12.  
  13.         protected static LineOverrule _instance;
  14.  
  15.         public static LineOverrule GetInstance(bool overruling)
  16.         {
  17.             Overruling = overruling;
  18.  
  19.             if (_instance == null)
  20.             {
  21.                 _instance = new LineOverrule();
  22.             }
  23.  
  24.             return _instance;
  25.         }
  26.  
  27.         public override bool WorldDraw(Drawable drawable, WorldDraw wd)
  28.         {
  29.            
  30.  
  31.             if (drawable is Line)
  32.             {
  33.                 Line line = drawable as Line;
  34.  
  35.                 Point3dCollection polyPts = new Point3dCollection();
  36.                 double boxHalf = line.Length / 8.0;                
  37.  
  38.                 Point2dCollection boundPts = new Point2dCollection();
  39.                 boundPts.Add(new Point2d(line.StartPoint.X - boxHalf, line.StartPoint.Y - boxHalf));
  40.                 boundPts.Add(new Point2d(line.StartPoint.X - boxHalf, line.StartPoint.Y + boxHalf));
  41.                 boundPts.Add(new Point2d(line.StartPoint.X + boxHalf, line.StartPoint.Y + boxHalf));
  42.                 boundPts.Add(new Point2d(line.StartPoint.X + boxHalf, line.StartPoint.Y - boxHalf));
  43.                 boundPts.Add(new Point2d(line.StartPoint.X - boxHalf, line.StartPoint.Y - boxHalf));
  44.  
  45.                 //ClipBoundary clipBound = new ClipBoundary();
  46.                 //clipBound.SetAptPoints(boundPts);
  47.  
  48.                 Wipeout wipeout = new Wipeout();
  49.                 wipeout.SetDatabaseDefaults(HostApplicationServices.WorkingDatabase);
  50.                 wipeout.SetFrom(boundPts, Vector3d.ZAxis);
  51.                 wipeout.SetClipBoundary(ClipBoundaryType.Rectangle, boundPts);
  52.                 wipeout.DisplayOptions = ImageDisplayOptions.Clip;
  53.                 wipeout.ImageTransparency = false;
  54.  
  55.  
  56.  
  57.                 wd.Geometry.Draw(wipeout);
  58.  
  59.                 //wd.Geometry.PushClipBoundary(clipBound);
  60.  
  61.                 //polyPts.Add(new Point3d(line.StartPoint.X - boxHalf, line.StartPoint.Y - boxHalf, line.StartPoint.Z));
  62.                 //polyPts.Add(new Point3d(line.StartPoint.X - boxHalf, line.StartPoint.Y + boxHalf, line.StartPoint.Z));
  63.                 //polyPts.Add(new Point3d(line.StartPoint.X + boxHalf, line.StartPoint.Y + boxHalf, line.StartPoint.Z));
  64.                 //polyPts.Add(new Point3d(line.StartPoint.X + boxHalf, line.StartPoint.Y - boxHalf, line.StartPoint.Z));
  65.                 //polyPts.Add(new Point3d(line.StartPoint.X - boxHalf, line.StartPoint.Y - boxHalf, line.StartPoint.Z));
  66.                 //wd.Geometry.Polygon(polyPts);
  67.                
  68.             }
  69.  
  70.             bool baseWd = base.WorldDraw(drawable, wd);
  71.  
  72.             return baseWd;
  73.         }
  74.     }
  75. }
  76.  

Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.Runtime;
  4.  
  5. namespace BaseGeometryEdit
  6. {
  7.     public class CmdClass
  8.     {
  9.         static bool LineOverruleIsOn = false;
  10.  
  11.         [CommandMethod("LineOverrulesOnOff")]
  12.         public static void RunDrawOverrule()
  13.         {      
  14.  
  15.             if (!LineOverruleIsOn)
  16.             {
  17.                 Overrule.AddOverrule(RXClass.GetClass(typeof(Line)), LineOverrule.GetInstance(true), true);
  18.                 Application.DocumentManager.MdiActiveDocument.Editor.Regen();
  19.             }
  20.             else
  21.             {
  22.                 Overrule.RemoveOverrule(RXClass.GetClass(typeof(Line)), LineOverrule.GetInstance(false));
  23.                 Application.DocumentManager.MdiActiveDocument.Editor.Regen();
  24.             }
  25.  
  26.             LineOverruleIsOn = !LineOverruleIsOn;
  27.  
  28.             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\nИзмененное отображение линий {0}!", LineOverruleIsOn ? "включено" : "отключено");
  29.         }        
  30.     }
  31. }
  32.  

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не проверял, но подозреваю что если поменять местами вызовы:
Код - C# [Выбрать]
  1. wd.Geometry.Draw(wipeout);
и
Код - C# [Выбрать]
  1. base.WorldDraw(drawable, wd);
то шансы увеличатся.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Это я тоже пробовал - не помогает.
Получается, что при помощи DrawableOverrule можно либо полностью переопределить изображение объекта, либо добавить свою графику к базовому изображению. Частичное использование базового изображения невозможно.
Так? Или может есть какие-то варианты?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я поэкспериментировал немного и пришел к тому же выводу, что:
Частичное использование базового изображения невозможно.
Точнее если даже закрашивать часть изображения цветом фона, то всё равно примитивы под ним не будут видны, что не соотвествует концепции частичного изображения.
Понятно, что для простейших случаев (Line, Arc, Circle...) можно не используя base.WorldDraw(drawable, wd) нарисовать "расчлененный" базовый примитив, но в более сложных случаях я не вижу такой возможности.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Что ж, отрицательный результат - тоже результат...
Спасибо!

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Загорулькин Дмитрий
Вопрос вообще-то достаточно  интересный и я не уверен, что на 100% прав. Может быть отправишь его в ADN DevHelp? Возможно что не всё так печально и я чего-то не учел.
Если хочешь - я его сам отправлю.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Если хочешь - я его сам отправлю.
Буду очень признателен! Т.к. для меня отправка запроса на английском языке - это, пока что, сплошная мука.
Сейчас еще раздумываю на тему полной перерисовки объекта, возможно мне это будет и на руку...

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Закрутился с делами и забыл отправить запрос в ADN DevHelp. Сегодня вспомнил и отправил.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Спасибо! А я пока работаю с версией полной перерисовки объекта и жду результата :)

Отмечено как Решение Дмитрий Загорулькин 08-10-2014, 14:44:36

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Увы Дмитрий. :( Ничего хорошего не предложили. WipeOut работает только если он в Database, а не создается в WorldDraw/ViewPortDraw...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Жаль, конечно... Но я особо не надеялся, что найдется способ :)
Спасибо!