Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Дмитрий Загорулькин от 29-04-2014, 18:05:01

Название: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: Дмитрий Загорулькин от 29-04-2014, 18:05:01
Здравствуйте.
При использовании DrawableOverrule для изменения отображения объекта нужно переопределять метод WorldDraw. При этом, если нужно сохранить базовое отображение, где-то внутри метода нужно вызвать этот метод базового класса. Соответственно, если не нужно, то метод базового класса не вызывается.
Мне же нужно отредактировать базовое отображение объекта. По сути нужно вырезать из него ограниченный кусок графики. Больше всего похож на нужное метод PushClipBoundary для свойства Geometry объекта WorldDraw, который передается вторым аргументом в этот одноименный переопределяемый метод. Но он оставляет только ту геометрию, которая внутри заданной области, мне бы наоборот. Можно как-то это сделать?
Конечно, есть еще вариант с отрисовкой закрашенной белой области, которая будет выступать маской для ненужной геометрии. Но смотрится это некрасиво.
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: Александр Ривилис от 29-04-2014, 18:08:19
А обычный WIPEOUT не подойдет? Ну а если уж рисовать закрашенную область, то цветом фона, а не просто белым цветом.
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: Дмитрий Загорулькин от 29-04-2014, 18:25:28
Так нет возможности рисовать WIPEOUT в этом методе. Для добавления из графики доступны линии, дуги, полилинии, полигоны, текст и т.д. и т.п., но вайпаута там нет.
С цветом фона попробую поковырять...
Чуть позже попробую сделать и выложить рабочий тестовый пример для автокада, если не найду решения. У меня же код для Civil-объектов. Хочу немного исправить их отображение на нужное.
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: Александр Ривилис от 29-04-2014, 18:41:01
Так нет возможности рисовать 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);
Как-то так, хотя я никогда этого не делал.
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: Дмитрий Загорулькин от 29-04-2014, 19:32:04
Попробовал нарисовать 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.  
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: Александр Ривилис от 30-04-2014, 00:59:01
Не проверял, но подозреваю что если поменять местами вызовы:
Код - C# [Выбрать]
  1. wd.Geometry.Draw(wipeout);
и
Код - C# [Выбрать]
  1. base.WorldDraw(drawable, wd);
то шансы увеличатся.
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: Дмитрий Загорулькин от 30-04-2014, 10:55:52
Это я тоже пробовал - не помогает.
Получается, что при помощи DrawableOverrule можно либо полностью переопределить изображение объекта, либо добавить свою графику к базовому изображению. Частичное использование базового изображения невозможно.
Так? Или может есть какие-то варианты?
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: Александр Ривилис от 30-04-2014, 12:58:52
Я поэкспериментировал немного и пришел к тому же выводу, что:
Частичное использование базового изображения невозможно.
Точнее если даже закрашивать часть изображения цветом фона, то всё равно примитивы под ним не будут видны, что не соотвествует концепции частичного изображения.
Понятно, что для простейших случаев (Line, Arc, Circle...) можно не используя base.WorldDraw(drawable, wd) нарисовать "расчлененный" базовый примитив, но в более сложных случаях я не вижу такой возможности.
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: Дмитрий Загорулькин от 30-04-2014, 13:07:40
Что ж, отрицательный результат - тоже результат...
Спасибо!
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: Александр Ривилис от 30-04-2014, 13:10:10
Загорулькин Дмитрий
Вопрос вообще-то достаточно  интересный и я не уверен, что на 100% прав. Может быть отправишь его в ADN DevHelp? Возможно что не всё так печально и я чего-то не учел.
Если хочешь - я его сам отправлю.
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: Дмитрий Загорулькин от 30-04-2014, 13:18:39
Если хочешь - я его сам отправлю.
Буду очень признателен! Т.к. для меня отправка запроса на английском языке - это, пока что, сплошная мука.
Сейчас еще раздумываю на тему полной перерисовки объекта, возможно мне это будет и на руку...
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: Александр Ривилис от 16-05-2014, 16:27:03
Закрутился с делами и забыл отправить запрос в ADN DevHelp. Сегодня вспомнил и отправил.
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: Дмитрий Загорулькин от 16-05-2014, 16:51:15
Спасибо! А я пока работаю с версией полной перерисовки объекта и жду результата :)
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: Александр Ривилис от 20-05-2014, 17:34:45
Увы Дмитрий. :( Ничего хорошего не предложили. WipeOut работает только если он в Database, а не создается в WorldDraw/ViewPortDraw...
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: Дмитрий Загорулькин от 20-05-2014, 17:50:48
Жаль, конечно... Но я особо не надеялся, что найдется способ :)
Спасибо!
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: bender от 14-08-2019, 17:54:09
Подниму тему. Я правильно понимаю, что всё вышенаписанное относится и к MText-ам? Т. е. MText, созданный в WorldDraw/ViewPortDraw, не будет перекрывать изображение? За прошедшие 5 лет ничего не поменялось?

UPD. Добрался до компа, проверил. Нормально перекрывает изображение. Только надо объект на передний план перетащить.
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: Александр Ривилис от 14-08-2019, 22:03:55
UPD. Добрался до компа, проверил. Нормально перекрывает изображение. Только надо объект на передний план перетащить.
Перетаскивание на передний план означает, что объект находится в базе данных. А MText созданный в WorldDraw/ViewPortDraw не содержится в базе (иначе это самостоятельный примитив). Так что не очень понятно, что у тебя получилось.
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: bender от 14-08-2019, 22:06:38
Перетаскивание на передний план означает, что объект находится в базе данных. А MText созданный в WorldDraw/ViewPortDraw не содержится в базе (иначе это самостоятельный примитив). Так что не очень понятно, что у тебя получилось.
Есть блок, к нему "пририсовываем" mtext, и вот этот mtext перекрывает изображение, если блок переместить на передний план. Как то вот так.
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: Дмитрий Загорулькин от 14-08-2019, 22:31:33
Непонятно, что подразумевается под словом "изображение". Это отдельный объект чертежа или имеется в виду базовое изображение (отображение) блока?
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: bender от 14-08-2019, 22:34:54
Непонятно, что подразумевается под словом "изображение". Это отдельный объект чертежа или имеется в виду базовое изображение (отображение) блока?

Все примитивы чертежа "под" текстом. Т. е. как у обычного mtext-а.

Кстати. ЯТД если вместо wipeout использовать MPolygon, то и в базовом изображении можно что-то поскрывать.
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: Дмитрий Загорулькин от 15-08-2019, 11:05:28
Я всё равно не понимаю ситуации. Но могу обратить внимание на две вещи:
1. У MText есть своя собственная маскировка. Если надо скрыть область под текстом, то можно её включить. В DrawableOverrule этот приём работает.
2. Если надо поместить текст поверх всех других объектов, то его надо "рисовать" в коде метода WorldDraw (или ViewportDraw) самым последним - после базовой отрисовки и всех других добавляемых объектов.
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: bender от 15-08-2019, 11:47:07
У MText есть своя собственная маскировка
Что значит "своя собственная"? Какой-то примитив АКАДа, не wipeout? Ну может быть и так. Хотя я считал, что там как раз обычная маскировка. Т. е. MText + Wipeout
В DrawableOverrule этот приём работает
Вот для меня это было совсем не очевидно. Но таки да, работает.
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: Дмитрий Загорулькин от 15-08-2019, 11:51:01
Что значит "своя собственная"? Какой-то примитив АКАДа, не wipeout?
Код - C# [Выбрать]
  1. if (useTextMask)
  2. {
  3.     mText.BackgroundFill = true;
  4.     mText.BackgroundScaleFactor = 1.1;
  5.     mText.UseBackgroundColor = true;
  6. }
  7. else
  8. {
  9.     mText.BackgroundFill = false;
  10. }
  11.  
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: bender от 15-08-2019, 11:56:32
Да я не про то. Это-то понятно, как и чего включать.

Вот когда мы у мультитекста маскировку включаем, Вы считаете, что там "что то такое своё" рисуется. Может быть и так.
Название: Re: DrawableOverrule. Возможно редактирование базовой геометрии объекта?
Отправлено: Дмитрий Загорулькин от 15-08-2019, 13:28:07
На уровне .NET API маскировка MText не является отдельным от MText объектом. И когда я писал, что MText имеет свою маскировку, я имел в виду именно это. А как там это устроено глубже - это, пожалуй, знают только разработчики AutoCAD. Мы можем только гадать.