做项目的时候有时要通过轴网定位与别人交流,常规操作是点选最近的两根轴网,看轴网的名称。可能我记性太差,一个地方总是要确认几次才放心。现在也有一些插件可以将轴圈显示在工作视图最外侧,但在轴网比较多且密集的时候看起来效果还是比较糟糕的。
于是通过二次开发做了一个快速识别轴网定位的功能,通过点选一个点,识别最近的两根方向不一样的轴网,弹窗显示并自动复制到剪贴板中。
现在主要针对的是直线型轴网,还有两个问题还没处理,一个是弧形轴网的识别,一个是多段轴网识别的修正,先挖下坑以后慢慢填了。-.-!
以下代码:
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;
}
微信公众号:xuebim
关注建筑行业BIM发展、研究建筑新技术,汇集建筑前沿信息!
← 微信扫一扫,关注我们+
评论前必须登录!
注册