Revit二次开发_显示最近的轴网交点

    做项目的时候有时要通过轴网定位与别人交流,常规操作是点选最近的两根轴网,看轴网的名称。可能我记性太差,一个地方总是要确认几次才放心。现在也有一些插件可以将轴圈显示在工作视图最外侧,但在轴网比较多且密集的时候看起来效果还是比较糟糕的。

    于是通过二次开发做了一个快速识别轴网定位的功能,通过点选一个点,识别最近的两根方向不一样的轴网,弹窗显示并自动复制到剪贴板中。

    现在主要针对的是直线型轴网,还有两个问题还没处理,一个是弧形轴网的识别,一个是多段轴网识别的修正,先挖下坑以后慢慢填了。-.-!

以下代码:

        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;
        }

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值