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

26/10/2016

Как выполнить Overrule для замкнутого сплайна так, чтобы он был заполнен своим цветом

Вопрос: Как выполнить Overrule для замкнутого сплайна (Spline) так, чтобы он был заполнен своим цветом?

Ответ: Простейший способ – это выполнить аппроксимацию сплайна и рисовать сплайн при помощи Geometry.Polygon указав в качестве параметра точки аппроксимации.

Ниже пример как это можно реализовать:

Код - C#: [Выделить]
  1. using Autodesk.AutoCAD.Runtime;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.DatabaseServices;
  4. using Autodesk.AutoCAD.Geometry;
  5. using AcGi = Autodesk.AutoCAD.GraphicsInterface;
  6.  
  7. [assembly: CommandClass(typeof(Rivilis.MyCommands))]
  8.  
  9. namespace Rivilis
  10. {
  11.   public class MyCommands
  12.   {
  13.     [CommandMethod("SplineOver")]
  14.     public void CmdSimpleOverrule()
  15.     {
  16.       if (_overrule == null)
  17.       {
  18.         _overrule = new SplineOverrule();
  19.         Overrule.AddOverrule(RXClass.GetClass(typeof(Spline)), _overrule, false);
  20.       }
  21.       else
  22.       {
  23.         Overrule.RemoveOverrule(RXClass.GetClass(typeof(Spline)), _overrule);
  24.         _overrule = null;
  25.       }
  26.       Document doc = Application.DocumentManager.MdiActiveDocument;
  27.       doc.Editor.Regen();
  28.     }
  29.     private static SplineOverrule _overrule = null;
  30.   }
  31.   public class SplineOverrule : AcGi.DrawableOverrule
  32.   {
  33.     const double Fuzz = 1e-4;
  34.     public override bool WorldDraw(AcGi.Drawable drawable, AcGi.WorldDraw wd)
  35.     {
  36.       base.WorldDraw(drawable, wd);
  37.       Spline spline = drawable as Spline;
  38.       if (spline != null && spline.Closed)
  39.       {
  40.         using (NurbCurve3d curve3d = spline.GetGeCurve() as NurbCurve3d)
  41.         {
  42.           BoundBlock3d blk = curve3d.BoundBlock;
  43.           double minChord = blk.GetMaximumPoint().DistanceTo(blk.GetMinimumPoint()) * Fuzz;
  44.           PointOnCurve3d[] ptCurvs =
  45.             curve3d.GetSamplePoints(curve3d.StartParameter, curve3d.EndParameter, minChord);
  46.           using (Point3dCollection pts = new Point3dCollection())
  47.           {
  48.             foreach (PointOnCurve3d p in ptCurvs) pts.Add(p.GetPoint());
  49.             wd.SubEntityTraits.FillType = AcGi.FillType.FillAlways;
  50.             wd.SubEntityTraits.TrueColor = spline.Color.EntityColor;
  51.             wd.Geometry.Polygon(pts);
  52.           }
  53.         }
  54.       }
  55.       return true;
  56.     }
  57.   }
  58. }

Так это выглядит на видео:

Автор: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=7410

Опубликовано 26.10.2016