[摘要] 做项目的时候有时要通过轴网定位与别人交流,常规操作是点选最近的两根轴网,看轴网的名称。可能我记性太差,一个地方总是要确认几
做项目的时候有时要通过轴网定位与别人交流,常规操作是点选最近的两根轴网,看轴网的名称。可能我记性太差,一个地方总是要确认几次才放心。现在也有一些插件可以将轴圈显示在工作视图最外侧,但在轴网比较多且密集的时候看起来效果还是比较糟糕的。
于是通过二次开发做了一个快速识别轴网定位的功能,通过点选一个点,识别最近的两根方向不一样的轴网,弹窗显示并自动复制到剪贴板中。
现在主要针对的是直线型轴网,还有两个问题还没处理,一个是弧形轴网的识别,一个是多段轴网识别的修正,先挖下坑以后慢慢填了。-.-!
以下代码:
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { UIDocument uidoc = commandData.Application.ActiveUIDocument; Document doc = uidoc.Document; //选择点 XYZ sel_point = uidoc.Selection.PickPoint(Autodesk.Revit.UI.Selection.ObjectSnapTypes.None); //获取所有轴网 FilteredElementCollector filteredElementCollector = new FilteredElementCollector(doc); filteredElementCollector.OfClass(typeof(Grid)); //处理多段轴网及弧形轴网 //to do... //过滤出所有直线轴网 List<Grid> lineGrid = new List<Grid>(); foreach (Grid g in filteredElementCollector) { if ((g.Curve as Line) != null) lineGrid.Add(g); } //变量; Grid grid_n1 = null; Grid grid_n2 = null; double dis1 = double.MaxValue; double dis2 = double.MaxValue; //遍历轴网,计算出离选择点最近的一条轴网 foreach (Grid g in lineGrid) { if (g.Curve.Distance(sel_point) < dis1) { grid_n1 = g; dis1 = g.Curve.Distance(sel_point); } } //遍历轴网,计算出离选择点最近的第二条轴网 foreach(Grid g in lineGrid) { if (!(g.Curve as Line).Direction.IsAlmostEqualTo((grid_n1.Curve as Line).Direction) && g.Curve.Distance(sel_point) < dis2) { grid_n2 = g; dis2 = g.Curve.Distance(sel_point); } } //显示时将数字结尾的轴网号排在前面 string name1 = grid_n1.Name; string name2 = grid_n2.Name; if (!char.IsNumber(name1.Last())) { string name = name1; name1 = name2; name2 = name; } string inputStr = name1 +"轴 交"+ name2 +"轴"; //显示 TaskDialog.Show("goodwish", inputStr); //复制到剪贴板 System.Windows.Forms.Clipboard.SetText(inputStr); return Result.Succeeded; }