Имитация штриховки при помощи DrawableOverrule
Если вам нужно временно заштриховать примитив – для этой цели можно воспользоваться DrawableOverrule. Рисование шаблона штриховки в WorldDraw / ViewportDraw может быть как простым, так и сложным в зависимости от того, какой шаблон штриховки используется. Чтобы корректно заштриховать границу штриховки при помощи шаблона штриховки можно воспользоваться подрезкой по контуру, создаваемой в Overrule. Это упрощает реализацию Overrule, так как отсечка шаблона штриховки за пределами объекта обеспечивается подрезкой по заданным границам объекта.
Вот два скриншота до и после подрезки:
Вот пример кода штриховки окружности при помощи шаблона перекрестной штриховки с помощью DrawableOverrule
- public class HatchedCircleOverrule
- : DrawableOverrule
- {
- public override bool IsApplicable(RXObject subject)
- {
- Circle circle = subject as Circle;
- if (circle.Database == null )
- return false ;
- return true ;
- }
- public override void ViewportDraw
- (Drawable drawable, ViewportDraw vd)
- {
- base .ViewportDraw(drawable, vd);
- Circle circle = (Circle)drawable;
- Point3d cenPt = circle.Center;
- ClipBoundary cb = new ClipBoundary();
- cb.DrawBoundary = false ;
- 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
- = new Point2dCollection();
- double paramIncr =
- (circle.EndParam - circle.StartParam) / 100;
- double param = circle.StartParam;
- Plane pln = new Plane(cenPt, circle.Normal);
- for (int cnt = 0; cnt < 100; cnt++)
- {
- clipPts.Add(
- circle.GetPointAtParameter(param).Convert2d(pln));
- param += paramIncr;
- }
- clipPts.Add(
- circle.GetPointAtParameter(circle.EndParam).Convert2d(pln));
- cb.SetAptPoints(clipPts);
- vd.Geometry.PushClipBoundary(cb);
- vd.SubEntityTraits.TrueColor
- = new EntityColor(0, 255, 0);
- Point3dCollection vertices
- = new Point3dCollection();
- int divs = 8;
- double delX = circle.Diameter / divs;
- double delY = circle.Diameter / divs;
- for (int row = 0; row <= divs; row++)
- {
- Point3d currPt =
- cenPt
- - Vector3d.XAxis * circle.Radius
- - Vector3d.YAxis * circle.Radius
- + Vector3d.YAxis * row * delY;
- for (int col = 0; col <= divs; col++)
- {
- vertices.Clear();
- vertices.Add(
- currPt + Vector3d.XAxis * delX * 0.25);
- vertices.Add(
- currPt - Vector3d.XAxis * delX * 0.25);
- vd.Geometry.Polyline(
- vertices, Vector3d.ZAxis, new IntPtr (-1));
- vertices.Clear();
- vertices.Add(
- currPt + Vector3d.YAxis * delY * 0.25);
- vertices.Add(
- currPt - Vector3d.YAxis * delY * 0.25);
- vd.Geometry.Polyline(
- vertices, Vector3d.ZAxis, new IntPtr (-1));
- currPt = currPt + Vector3d.XAxis * delX;
- }
- }
- vd.Geometry.PopClipBoundary();
- }
- public override bool WorldDraw
- (Drawable drawable, WorldDraw wd)
- {
- base .WorldDraw(drawable, wd);
- // Вызываем viewportdraw
- return false ;
- }
- }
- public class Commands : IExtensionApplication
- {
- private static HatchedCircleOverrule _hco;
- void IExtensionApplication.Initialize() { }
- void IExtensionApplication.Terminate()
- {
- if (_hco != null )
- {
- Overrule.RemoveOverrule
- (RXClass.GetClass(typeof (Circle)), _hco);
- _hco.Dispose();
- _hco = null ;
- }
- }
- [CommandMethod("StartOR" )]
- public void StartORMethod()
- {
- Document doc
- = Application .DocumentManager.MdiActiveDocument;
- if (_hco == null )
- {
- _hco = new HatchedCircleOverrule ();
- _hco.SetCustomFilter();
- Overrule.AddOverrule
- (RXClass.GetClass(typeof (Circle)),
- _hco, true );
- Overrule.Overruling = true ;
- }
- doc.Editor.WriteMessage("\nНачало Overruling!" );
- doc.Editor.Regen();
- }
- [CommandMethod("StopOR" )]
- public void StopORMethod()
- {
- Document doc
- = Application .DocumentManager.MdiActiveDocument;
- if (_hco != null )
- {
- Overrule.RemoveOverrule(
- RXClass.GetClass(typeof (Circle)), _hco);
- Overrule.Overruling = false ;
- _hco.Dispose();
- _hco = null ;
- }
- doc.Editor.WriteMessage("\nКонец Overruling!" );
- doc.Editor.Regen();
- }
- }
Источник: https://adndevblog.typepad.com/autocad/2015/07/mimic-a-hatch-using-drawableoverrule.html
Опубликовано 13.09.2021