找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1227|回复: 0

[分享] PointCollector2 and Better Window Pick

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2015-3-16 16:30:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
选择时增加一个覆盖区域的透明色块
http://spiderinnet1.typepad.com/ ... er-window-pick.html

  1. #region Namespaces

  2. using System;
  3. using Application = Autodesk.AutoCAD.ApplicationServices.Core .Application ;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.EditorInput;
  6. using Autodesk.AutoCAD.Geometry;
  7. using Autodesk.AutoCAD.GraphicsInterface;

  8. #endregion

  9. namespace AcadNetAddinWizard_Namespace
  10. {
  11.     public class PointCollector2 : IDisposable
  12.     {
  13.         public enum Shape
  14.         {
  15.             Window,
  16.             Fence,
  17.             Polygon,
  18.             RegularPolygon,
  19.             Circle,
  20.             Box,
  21.         }

  22.         private readonly Shape _mShape;

  23.         private Hatch _mTempHatch;
  24.         private readonly short _mHatchColorIndex = 119;
  25.         private  byte mHatchTransparency = 50;
  26.         private readonly TransientDrawingMode _mHatchDrawMode;

  27.         private Autodesk.AutoCAD.DatabaseServices.Polyline _mTempPline;
  28.         private short mBoundaryColorIndex = 7;
  29.         private readonly TransientDrawingMode _mBoundaryDrawMode;

  30.         private Point3d _m1StPoint;

  31.         public Point3dCollection CollectedPoints {  get; private set; }
  32.         public PromptStatus SelectionStatus { get; private set; }

  33.         public PointCollector2(Shape shape, bool isCrossing)
  34.         {
  35.             _mShape = shape;

  36.             _mTempPline = new Autodesk.AutoCAD.DatabaseServices.Polyline();
  37.             _mTempPline.SetDatabaseDefaults();
  38.             _mTempPline.ColorIndex = mBoundaryColorIndex;

  39.             _mTempHatch = new Hatch();
  40.             _mTempHatch.SetDatabaseDefaults();
  41.             _mTempHatch.ColorIndex = _mHatchColorIndex;
  42.             _mTempHatch.SetHatchPattern(HatchPatternType.PreDefined, "SOLID");
  43.             _mTempHatch.Transparency = new Autodesk.AutoCAD.Colors.Transparency(mHatchTransparency);

  44.             _mHatchDrawMode = TransientDrawingMode.Main;
  45.             if (isCrossing)
  46.             {
  47.                 _mHatchColorIndex = 119;
  48.                 _mBoundaryDrawMode = TransientDrawingMode.Highlight;
  49.             }
  50.             else
  51.             {
  52.                 _mHatchColorIndex = 172;
  53.                 _mBoundaryDrawMode = TransientDrawingMode.DirectTopmost;
  54.             }
  55.             
  56.             CollectedPoints = new Point3dCollection();
  57.             SelectionStatus = PromptStatus.OK;
  58.         }

  59.         private void Editor_PointMonitor(object sender, PointMonitorEventArgs e)
  60.         {
  61.             Cleanup();

  62.             _mTempPline = new Autodesk.AutoCAD.DatabaseServices.Polyline();
  63.             _mTempPline.SetDatabaseDefaults();
  64.             _mTempPline.ColorIndex = mBoundaryColorIndex;

  65.             _mTempHatch = new Hatch();
  66.             _mTempHatch.SetDatabaseDefaults();
  67.             _mTempHatch.ColorIndex = _mHatchColorIndex;
  68.             _mTempHatch.SetHatchPattern(HatchPatternType.PreDefined, "SOLID");
  69.             _mTempHatch.Transparency = new Autodesk.AutoCAD.Colors.Transparency(mHatchTransparency);

  70.             Point3d compPt = e.Context.ComputedPoint.TransformBy(Application.DocumentManager.MdiActiveDocument.Editor.CurrentUserCoordinateSystem.Inverse());

  71.             if (_mShape == Shape.Window)
  72.             {
  73.                 BuildupWindowVertices(_m1StPoint, compPt);
  74.             }

  75.             _mTempPline.TransformBy(Application.DocumentManager.MdiActiveDocument.Editor.CurrentUserCoordinateSystem);
  76.             _mTempHatch.Normal = _mTempPline.Normal;

  77.             HatchLoop loop = new HatchLoop(HatchLoopTypes.Default);
  78.             for (int i = 0; i < _mTempPline.NumberOfVertices; i++)
  79.             {
  80.                 loop.Curves.Add(_mTempPline.GetLineSegment2dAt(i));
  81.             }
  82.             _mTempHatch.AppendLoop(loop);
  83.             _mTempHatch.EvaluateHatch(true);

  84.             TransientManager.CurrentTransientManager.AddTransient(_mTempPline, _mBoundaryDrawMode, 0, new IntegerCollection());
  85.             TransientManager.CurrentTransientManager.AddTransient(_mTempHatch, _mHatchDrawMode, 0, new IntegerCollection());
  86.         }

  87.         public Point3dCollection Collect()
  88.         {
  89.             if (_mShape == Shape.Window)
  90.             {
  91.                 CollectWindowPoints();
  92.             }

  93.             return CollectedPoints;
  94.         }

  95.         private void CollectWindowPoints()
  96.         {
  97.             PromptPointResult prPntRes1 = Application.DocumentManager.MdiActiveDocument.Editor.GetPoint("\nSpecify first corner");
  98.             if (prPntRes1.Status != PromptStatus.OK)
  99.             {
  100.                 SelectionStatus = prPntRes1.Status;
  101.                 return;
  102.             }

  103.             _m1StPoint = prPntRes1.Value;
  104.             CollectedPoints.Add(_m1StPoint);
  105.             BuildupWindowVertices(_m1StPoint, _m1StPoint);

  106.             Application.DocumentManager.MdiActiveDocument.Editor.PointMonitor += Editor_PointMonitor;

  107.             PromptPointResult prPntRes2 = Application.DocumentManager.MdiActiveDocument.Editor.GetPoint("\nSpecify opposite corner");
  108.             if (prPntRes2.Status != PromptStatus.OK)
  109.             {
  110.                 SelectionStatus = prPntRes2.Status;
  111.                 Application.DocumentManager.MdiActiveDocument.Editor.PointMonitor -= Editor_PointMonitor;
  112.                 return;
  113.             }

  114.             CollectedPoints.Add(prPntRes2.Value);

  115.             Application.DocumentManager.MdiActiveDocument.Editor.PointMonitor -= Editor_PointMonitor;
  116.         }

  117.         private void BuildupWindowVertices(Point3d corner1, Point3d corner2)
  118.         {
  119.             _mTempPline.Closed = true;
  120.             _mTempPline.AddVertexAt(_mTempPline.NumberOfVertices, new Point2d(corner1.X, corner1.Y), 0, 1, 1);
  121.             _mTempPline.AddVertexAt(_mTempPline.NumberOfVertices, new Point2d(corner2.X, corner1.Y), 0, 1, 1);
  122.             _mTempPline.AddVertexAt(_mTempPline.NumberOfVertices, new Point2d(corner2.X, corner2.Y), 0, 1, 1);
  123.             _mTempPline.AddVertexAt(_mTempPline.NumberOfVertices, new Point2d(corner1.X, corner2.Y), 0, 1, 1);
  124.         }

  125.         public void Dispose()
  126.         {
  127.             Application.DocumentManager.MdiActiveDocument.Editor.PointMonitor -= Editor_PointMonitor;

  128.             Cleanup();
  129.             CollectedPoints.Dispose();
  130.         }

  131.         private void Cleanup()
  132.         {
  133.             if (_mTempPline != null && !_mTempPline.IsDisposed)
  134.             {
  135.                 TransientManager.CurrentTransientManager.EraseTransient(_mTempPline, new IntegerCollection());
  136.                 _mTempPline.Dispose();
  137.                 _mTempPline = null;
  138.             }

  139.             if (_mTempHatch != null && !_mTempHatch.IsDisposed)
  140.             {
  141.                 TransientManager.CurrentTransientManager.EraseTransient(_mTempHatch, new IntegerCollection());
  142.                 _mTempHatch.Dispose();
  143.                 _mTempHatch = null;
  144.             }
  145.         }

  146.     }
  147. }

测试代码

  1.         [CommandMethod("SelectWindow2", CommandFlags.Modal | CommandFlags.Redraw)]
  2.         public static void SelectWindow2_Method()
  3.         {
  4.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  5.             try
  6.             {
  7.                 using (var pc = new PointCollector2(PointCollector2.Shape.Window, false))
  8.                 {
  9.                     Point3dCollection points = pc.Collect();
  10.                     if (pc.SelectionStatus == PromptStatus.OK)
  11.                     {
  12.                         PromptSelectionResult prSelRes = ed.SelectWindow(points[0], points[1]);
  13.                         if (prSelRes.Status == PromptStatus.OK)
  14.                         {
  15.                             using (SelectionSet ss = prSelRes.Value)
  16.                             {
  17.                                 if (ss != null && ss.Count > 0)
  18.                                 {
  19.                                     ed.SetImpliedSelection(ss.GetObjectIds().ToArray());
  20.                                 }
  21.                             }
  22.                         }
  23.                     }
  24.                 }
  25.             }
  26.             catch (System.Exception ex)
  27.             {
  28.                 ed.WriteMessage(Environment.NewLine + ex.ToString());
  29.             }
  30.         }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-18 23:05 , Processed in 0.380085 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表