<?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
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>



Leave a Reply