Mimic a hatch using DrawableOverrule

<?xml encoding=”UTF-8″>By Balaji Ramamoorthy

If you need an entity to appear hatched temporarily, drawable overrule can be used for this purpose. Drawing the hatch pattern from an WorldDraw / ViewportDraw can be simple or a little complex depending on the pattern that you want to use. To let the hatch pattern correctly fill the boundary, a clip boundary can be created in your overrule. This simplifies the overrule implementation as the pattern can be created to cover the entity while the clip boundary takes care of clipping it to the actual entity bounds.

Here are two screenshots before and after clipping

BeforeClipAfterClip

Here is a sample code to hatch a circle with the cross pattern using DrawableOverrule

 <span>public</span><span>  <span>class</span><span>  <span>HatchedCircleOverrule</span><span>  </span></span></span>
                 : DrawableOverrule
 <span>{</span>
     <span>public</span><span>  <span>override</span><span>  <span>bool</span><span>  IsApplicable(RXObject subject)</span></span></span>
     <span>{</span>
         Circle circle = subject <span>as</span><span>  Circle;</span>
 
         <span>if</span><span>  (circle.Database == <span>null</span><span> )</span></span>
             <span>return</span><span>  <span>false</span><span> ;</span></span>
 
         <span>return</span><span>  <span>true</span><span> ;</span></span>
     <span>}</span>
 
     <span>public</span><span>  <span>override</span><span>  <span>void</span><span>  ViewportDraw</span></span></span>
         (Drawable drawable, ViewportDraw vd)
     <span>{</span>
         <span>base</span><span> .ViewportDraw(drawable, vd);</span>
 
         Circle circle = (Circle)drawable;
         Point3d cenPt = circle.Center;
 
         ClipBoundary cb = <span>new</span><span>  ClipBoundary();</span>
         cb.DrawBoundary = <span>false</span><span> ;</span>
         FrontAndBackClipping clipping 
             = vd.Viewport.FrontAndBackClipping;
         cb.ClippingBack = clipping.ClipBack;
         cb.ClippingFront = clipping.ClipFront;
         cb.NormalVector = vd.Viewport.ViewDirection;
         cb.BackClipZ = clipping.Back;
         cb.FrontClipZ = clipping.Front;
 
         Point2dCollection clipPts 
             = <span>new</span><span>  Point2dCollection();</span>
 
         <span>double</span><span>  paramIncr = </span>
             (circle.EndParam - circle.StartParam) / 100;
         <span>double</span><span>  param = circle.StartParam;</span>
         Plane pln = <span>new</span><span>  Plane(cenPt, circle.Normal);</span>
         <span>for</span><span>  (<span>int</span><span>  cnt = 0; cnt < 100; cnt++)</span></span>
         <span>{</span>
             clipPts.Add(
             circle.GetPointAtParameter(param).Convert2d(pln));
             param += paramIncr;
         <span>}</span>
         clipPts.Add(
         circle.GetPointAtParameter(circle.EndParam).Convert2d(pln));
         cb.SetAptPoints(clipPts);
         vd.Geometry.PushClipBoundary(cb);
 
         vd.SubEntityTraits.TrueColor 
             = <span>new</span><span>  EntityColor(0, 255, 0);</span>
 
         Point3dCollection vertices 
             = <span>new</span><span>  Point3dCollection();</span>
 
         <span>int</span><span>  divs = 8;</span>
         <span>double</span><span>  delX = circle.Diameter / divs;</span>
         <span>double</span><span>  delY = circle.Diameter / divs;</span>
 
         <span>for</span><span>  (<span>int</span><span>  row = 0; row <= divs; row++)</span></span>
         <span>{</span>
             Point3d currPt = 
                 cenPt 
                 - Vector3d.XAxis * circle.Radius 
                 - Vector3d.YAxis * circle.Radius 
                 + Vector3d.YAxis * row * delY;
 
             <span>for</span><span>  (<span>int</span><span>  col = 0; col <= divs; col++)</span></span>
             <span>{</span>
                 vertices.Clear();
                 vertices.Add(
                     currPt + Vector3d.XAxis * delX * 0.25);
                 vertices.Add(
                     currPt - Vector3d.XAxis * delX * 0.25);
                 vd.Geometry.Polyline(
                     vertices, Vector3d.ZAxis, <span>new</span><span>  <span>IntPtr</span><span> (-1));</span></span>
 
                 vertices.Clear();
                 vertices.Add(
                     currPt + Vector3d.YAxis * delY * 0.25);
                 vertices.Add(
                     currPt - Vector3d.YAxis * delY * 0.25);
                 vd.Geometry.Polyline(
                     vertices, Vector3d.ZAxis, <span>new</span><span>  <span>IntPtr</span><span> (-1));</span></span>
 
                 currPt = currPt + Vector3d.XAxis * delX;
             <span>}</span>
         <span>}</span>
 
         vd.Geometry.PopClipBoundary();
     <span>}</span>
 
     <span>public</span><span>  <span>override</span><span>  <span>bool</span><span>  WorldDraw</span></span></span>
         (Drawable drawable, WorldDraw wd)
     <span>{</span>
         <span>base</span><span> .WorldDraw(drawable, wd);</span>
 
         <span>// call viewportdraw</span><span> </span>
         <span>return</span><span>  <span>false</span><span> ;</span></span>
     <span>}</span>
 <span>}</span>
 
 <span>public</span><span>  <span>class</span><span>  <span>Commands</span><span>  : IExtensionApplication</span></span></span>
 <span>{</span>
     <span>private</span><span>  <span>static</span><span>  <span>HatchedCircleOverrule</span><span>  _hco;</span></span></span>
 
     <span>void</span><span>  IExtensionApplication.Initialize() <span>{</span> <span>}</span></span>
 
     <span>void</span><span>  IExtensionApplication.Terminate()</span>
     <span>{</span>
         <span>if</span><span>  (_hco != <span>null</span><span> )</span></span>
         <span>{</span>
             Overrule.RemoveOverrule
                 (RXClass.GetClass(<span>typeof</span><span> (Circle)), _hco);</span>
             _hco.Dispose();
             _hco = <span>null</span><span> ;</span>
         <span>}</span>
     <span>}</span>
 
     [CommandMethod(<span>"StartOR"</span><span> )]</span>
     <span>public</span><span>  <span>void</span><span>  StartORMethod()</span></span>
     <span>{</span>
         Document doc 
             = <span>Application</span><span> .DocumentManager.MdiActiveDocument;</span>
         <span>if</span><span>  (_hco == <span>null</span><span> )</span></span>
         <span>{</span>
             _hco = <span>new</span><span>  <span>HatchedCircleOverrule</span><span> ();</span></span>
             _hco.SetCustomFilter();
             Overrule.AddOverrule
                 (RXClass.GetClass(<span>typeof</span><span> (Circle)), </span>
                 _hco, <span>true</span><span> );</span>
             Overrule.Overruling = <span>true</span><span> ;</span>
         <span>}</span>
         doc.Editor.WriteMessage(<span>"nOverruling started !"</span><span> );</span>
         doc.Editor.Regen();
     <span>}</span>
 
     [CommandMethod(<span>"StopOR"</span><span> )]</span>
     <span>public</span><span>  <span>void</span><span>  StopORMethod()</span></span>
     <span>{</span>
         Document doc 
             = <span>Application</span><span> .DocumentManager.MdiActiveDocument;</span>
 
         <span>if</span><span>  (_hco != <span>null</span><span> )</span></span>
         <span>{</span>
             Overrule.RemoveOverrule(
                 RXClass.GetClass(<span>typeof</span><span> (Circle)), _hco);</span>
             Overrule.Overruling = <span>false</span><span> ;</span>
             _hco.Dispose();
             _hco = <span>null</span><span> ;</span>
         <span>}</span>
         doc.Editor.WriteMessage(<span>"nOverruling stopped !"</span><span> );</span>
         doc.Editor.Regen();
     <span>}</span>
 <span>}</span>
 


Comments

2 responses to “Mimic a hatch using DrawableOverrule”

  1. baiqilinux Avatar
    baiqilinux

    what to do if i want wo clip the outside region?which i want to clip the partten within the circle and left the outside ones

  2. I adore your sensitivity. This episode, I suppose, has strengthened my grip on the awful situation we’ve found ourselves in, and I’m convinced that it won’t worry me enough anymore that I’ve gained some different insights on it.

Leave a Reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading