DrawOverrule & PatternScale

Автор Тема: DrawOverrule & PatternScale  (Прочитано 4990 раз)

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

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
DrawOverrule & PatternScale
« : 12-07-2018, 03:35:47 »
Всем привет!

Во время переопределения объектов я рисую штриховку. В качестве примера можно взять заливу штриховкой замкнутых полилиний. Проблема заключается в том, что свойство PatternScale не изменяется - я устанавливаю нужное значение, например, 10, а при переопределении объекта штриховка всегда рисуется с масштабом 1. Причем при взрыве этого объекта (TransformOverrule) штриховка отображается с масштабом 1, хотя в свойствах то значение, которое нужно. Если в свойствах подтвердить значение масштаба, то штриховка перерисуется как надо. Это так работает DrawOverrule?

Пример кода:
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Autodesk.AutoCAD.Runtime;
  7. using Autodesk.AutoCAD.EditorInput;
  8. using App = Autodesk.AutoCAD.ApplicationServices;
  9. using Gi = Autodesk.AutoCAD.GraphicsInterface;
  10. using Autodesk.AutoCAD.DatabaseServices;
  11. using Autodesk.AutoCAD.Colors;
  12. using Autodesk.AutoCAD.Geometry;
  13.  
  14. namespace test01
  15. {
  16.     public class Class1
  17.     {
  18.         [CommandMethod("Test_hatch")]
  19.         public static void Test_hatch()
  20.         {
  21.             ObjectOverrule.AddOverrule(RXClass.GetClass(typeof(Polyline)), TestHatchDrawOverruleClass.Instance, true);
  22.         }
  23.     }
  24.  
  25.     public class TestHatchDrawOverruleClass : Gi.DrawableOverrule
  26.     {
  27.         public static TestHatchDrawOverruleClass Instance = new TestHatchDrawOverruleClass();
  28.  
  29.         public TestHatchDrawOverruleClass() { }
  30.  
  31.         public override bool WorldDraw(Gi.Drawable _d, Gi.WorldDraw _wd)
  32.         {
  33.             if (_d is Polyline pline)
  34.             {
  35.                 if (pline.Closed)
  36.                 {
  37.                     Point2dCollection pnts = new Point2dCollection();
  38.                     DoubleCollection dbls = new DoubleCollection();
  39.  
  40.                     for (int i = 0; i < pline.NumberOfVertices; i++)
  41.                     {
  42.                         pnts.Add(pline.GetPoint2dAt(i));
  43.                         dbls.Add(pline.GetBulgeAt(i));
  44.                     }
  45.  
  46.                     pnts.Add(pline.GetPoint2dAt(0));
  47.                     dbls.Add(pline.GetBulgeAt(0));
  48.  
  49.                     Hatch h = new Hatch();
  50.                     h.SetHatchPattern(HatchPatternType.PreDefined, "ANSI31");
  51.                     h.ColorIndex = 7;
  52.                     h.PatternAngle = 0;
  53.                     h.PatternScale = 10;
  54.                     h.AppendLoop(HatchLoopTypes.Default, pnts, dbls);
  55.  
  56.                     h.WorldDraw(_wd);
  57.                 }
  58.             }
  59.  
  60.             return base.WorldDraw(_d, _wd);
  61.         }
  62.     }
  63. }
  64.  

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Re: DrawOverrule & PatternScale
« Ответ #1 : 12-07-2018, 08:51:51 »
Может h.EvaluateHatch() добавить.

Отмечено как Решение Алексей Терно 12-07-2018, 19:59:14

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: DrawOverrule & PatternScale
« Ответ #2 : 12-07-2018, 09:03:51 »
Алексей Терно,
1. Не вижу h.EvaluateHatch(), как подсказывает Вильдар
2. Порядок вызова свойств/методов Hatch неверный. h.SetHatchPattern должно быть после h.PatternAngle и h.PatternScale (или нужен повторный вызов h.SetHatchPattern)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: DrawOverrule & PatternScale
« Ответ #3 : 12-07-2018, 18:59:09 »
Хм...
EvaluateHatch я действительно забыл, хотя всегда его использовал, но ключевое тут повторный вызов SetHatchPattern. Без вызова этой процедуры невозможно задать PatternAngle и PatternScale:


По крайней мере в данном случае, необходим повторный вызов SetHatchPattern.

Всем спасибо, все работает! :)