26/10/2016
Как выполнить Overrule для замкнутого сплайна так, чтобы он был заполнен своим цветом
Вопрос: Как выполнить Overrule для замкнутого сплайна (Spline) так, чтобы он был заполнен своим цветом?
Ответ: Простейший способ – это выполнить аппроксимацию сплайна и рисовать сплайн при помощи Geometry.Polygon указав в качестве параметра точки аппроксимации.
Ниже пример как это можно реализовать:
Код - C#: [Выделить]
- using Autodesk.AutoCAD.Runtime;
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.DatabaseServices;
- using Autodesk.AutoCAD.Geometry;
- using AcGi = Autodesk.AutoCAD.GraphicsInterface;
- [assembly: CommandClass(typeof(Rivilis.MyCommands))]
- namespace Rivilis
- {
- public class MyCommands
- {
- [CommandMethod("SplineOver")]
- public void CmdSimpleOverrule()
- {
- if (_overrule == null)
- {
- _overrule = new SplineOverrule();
- Overrule.AddOverrule(RXClass.GetClass(typeof(Spline)), _overrule, false);
- }
- else
- {
- Overrule.RemoveOverrule(RXClass.GetClass(typeof(Spline)), _overrule);
- _overrule = null;
- }
- Document doc = Application.DocumentManager.MdiActiveDocument;
- doc.Editor.Regen();
- }
- private static SplineOverrule _overrule = null;
- }
- public class SplineOverrule : AcGi.DrawableOverrule
- {
- const double Fuzz = 1e-4;
- public override bool WorldDraw(AcGi.Drawable drawable, AcGi.WorldDraw wd)
- {
- base.WorldDraw(drawable, wd);
- Spline spline = drawable as Spline;
- if (spline != null && spline.Closed)
- {
- using (NurbCurve3d curve3d = spline.GetGeCurve() as NurbCurve3d)
- {
- BoundBlock3d blk = curve3d.BoundBlock;
- double minChord = blk.GetMaximumPoint().DistanceTo(blk.GetMinimumPoint()) * Fuzz;
- PointOnCurve3d[] ptCurvs =
- curve3d.GetSamplePoints(curve3d.StartParameter, curve3d.EndParameter, minChord);
- using (Point3dCollection pts = new Point3dCollection())
- {
- foreach (PointOnCurve3d p in ptCurvs) pts.Add(p.GetPoint());
- wd.SubEntityTraits.FillType = AcGi.FillType.FillAlways;
- wd.SubEntityTraits.TrueColor = spline.Color.EntityColor;
- wd.Geometry.Polygon(pts);
- }
- }
- }
- return true;
- }
- }
- }
Так это выглядит на видео:
Автор: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=7410
Опубликовано 26.10.2016