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

13/09/2021

Имитация штриховки при помощи DrawableOverrule

Если вам нужно временно заштриховать примитив – для этой цели можно воспользоваться DrawableOverrule. Рисование шаблона штриховки в WorldDraw / ViewportDraw может быть как простым, так и сложным в зависимости от того, какой шаблон штриховки используется. Чтобы корректно заштриховать границу штриховки при помощи шаблона штриховки можно воспользоваться подрезкой по контуру, создаваемой в Overrule. Это упрощает реализацию Overrule, так как отсечка шаблона штриховки за пределами объекта обеспечивается подрезкой по заданным границам объекта.

Вот два скриншота до и после подрезки:

 

 

Вот пример кода штриховки окружности при помощи шаблона перекрестной штриховки с помощью DrawableOverrule

Код - C#: [Выделить]
  1. public  class  HatchedCircleOverrule 
  2.                  : DrawableOverrule
  3.  {
  4.      public  override  bool  IsApplicable(RXObject subject)
  5.      {
  6.          Circle circle = subject as  Circle;
  7.  
  8.          if  (circle.Database == null )
  9.              return  false ;
  10.  
  11.          return  true ;
  12.      }
  13.  
  14.      public  override  void  ViewportDraw
  15.          (Drawable drawable, ViewportDraw vd)
  16.      {
  17.          base .ViewportDraw(drawable, vd);
  18.  
  19.          Circle circle = (Circle)drawable;
  20.          Point3d cenPt = circle.Center;
  21.  
  22.          ClipBoundary cb = new  ClipBoundary();
  23.          cb.DrawBoundary = false ;
  24.          FrontAndBackClipping clipping
  25.              = vd.Viewport.FrontAndBackClipping;
  26.          cb.ClippingBack = clipping.ClipBack;
  27.          cb.ClippingFront = clipping.ClipFront;
  28.          cb.NormalVector = vd.Viewport.ViewDirection;
  29.          cb.BackClipZ = clipping.Back;
  30.          cb.FrontClipZ = clipping.Front;
  31.  
  32.          Point2dCollection clipPts
  33.              = new  Point2dCollection();
  34.  
  35.          double  paramIncr =
  36.              (circle.EndParam - circle.StartParam) / 100;
  37.          double  param = circle.StartParam;
  38.          Plane pln = new  Plane(cenPt, circle.Normal);
  39.          for  (int  cnt = 0; cnt < 100; cnt++)
  40.          {
  41.              clipPts.Add(
  42.              circle.GetPointAtParameter(param).Convert2d(pln));
  43.              param += paramIncr;
  44.          }
  45.          clipPts.Add(
  46.          circle.GetPointAtParameter(circle.EndParam).Convert2d(pln));
  47.          cb.SetAptPoints(clipPts);
  48.          vd.Geometry.PushClipBoundary(cb);
  49.  
  50.          vd.SubEntityTraits.TrueColor
  51.              = new  EntityColor(0, 255, 0);
  52.  
  53.          Point3dCollection vertices
  54.              = new  Point3dCollection();
  55.  
  56.          int  divs = 8;
  57.          double  delX = circle.Diameter / divs;
  58.          double  delY = circle.Diameter / divs;
  59.  
  60.          for  (int  row = 0; row <= divs; row++)
  61.          {
  62.              Point3d currPt =
  63.                  cenPt
  64.                  - Vector3d.XAxis * circle.Radius
  65.                  - Vector3d.YAxis * circle.Radius
  66.                  + Vector3d.YAxis * row * delY;
  67.  
  68.              for  (int  col = 0; col <= divs; col++)
  69.              {
  70.                  vertices.Clear();
  71.                  vertices.Add(
  72.                      currPt + Vector3d.XAxis * delX * 0.25);
  73.                  vertices.Add(
  74.                      currPt - Vector3d.XAxis * delX * 0.25);
  75.                  vd.Geometry.Polyline(
  76.                      vertices, Vector3d.ZAxis, new  IntPtr (-1));
  77.  
  78.                  vertices.Clear();
  79.                  vertices.Add(
  80.                      currPt + Vector3d.YAxis * delY * 0.25);
  81.                  vertices.Add(
  82.                      currPt - Vector3d.YAxis * delY * 0.25);
  83.                  vd.Geometry.Polyline(
  84.                      vertices, Vector3d.ZAxis, new  IntPtr (-1));
  85.  
  86.                  currPt = currPt + Vector3d.XAxis * delX;
  87.              }
  88.          }
  89.  
  90.          vd.Geometry.PopClipBoundary();
  91.      }
  92.  
  93.      public  override  bool  WorldDraw
  94.          (Drawable drawable, WorldDraw wd)
  95.      {
  96.          base .WorldDraw(drawable, wd);
  97.  
  98.          // Вызываем viewportdraw
  99.          return  false ;
  100.      }
  101.  }
  102.  
  103.  public  class  Commands  : IExtensionApplication
  104.  {
  105.      private  static  HatchedCircleOverrule  _hco;
  106.  
  107.      void  IExtensionApplication.Initialize() { }
  108.  
  109.      void  IExtensionApplication.Terminate()
  110.      {
  111.          if  (_hco != null )
  112.          {
  113.              Overrule.RemoveOverrule
  114.                  (RXClass.GetClass(typeof (Circle)), _hco);
  115.              _hco.Dispose();
  116.              _hco = null ;
  117.          }
  118.      }
  119.  
  120.      [CommandMethod("StartOR" )]
  121.      public  void  StartORMethod()
  122.      {
  123.          Document doc
  124.              = Application .DocumentManager.MdiActiveDocument;
  125.          if  (_hco == null )
  126.          {
  127.              _hco = new  HatchedCircleOverrule ();
  128.              _hco.SetCustomFilter();
  129.              Overrule.AddOverrule
  130.                  (RXClass.GetClass(typeof (Circle)),
  131.                  _hco, true );
  132.              Overrule.Overruling = true ;
  133.          }
  134.          doc.Editor.WriteMessage("\nНачало Overruling!" );
  135.          doc.Editor.Regen();
  136.      }
  137.  
  138.      [CommandMethod("StopOR" )]
  139.      public  void  StopORMethod()
  140.      {
  141.          Document doc
  142.              = Application .DocumentManager.MdiActiveDocument;
  143.  
  144.          if  (_hco != null )
  145.          {
  146.              Overrule.RemoveOverrule(
  147.                  RXClass.GetClass(typeof (Circle)), _hco);
  148.              Overrule.Overruling = false ;
  149.              _hco.Dispose();
  150.              _hco = null ;
  151.          }
  152.          doc.Editor.WriteMessage("\nКонец Overruling!" );
  153.          doc.Editor.Regen();
  154.      }
  155.  }
  156.  

 

Источник: https://adndevblog.typepad.com/autocad/2015/07/mimic-a-hatch-using-drawableoverrule.html

 

Автор перевода: Александр Ривилис
Опубликовано 13.09.2021