#Revit二次开发# 创建能够循环执行的窗口功能(二)

https://blog.csdn.net/qq_29143307/article/details/116235371?spm=1001.2014.3001.5501

接上一篇,再循环选择的功能窗口中增加自定义的过滤设置:

首先,需要实现revit的过滤接口:ISelectionFilter,实现接口内的成员函数

在自己实现的AllowElement和AllowReference可以根据需要实现丰富的过滤条件。

但根据业务需求可能往往过滤要求各不相同,所以我选择使用委托处理,在委托中根据业务实现过滤

我的SelectionFilter类:

/// <summary>
    /// 自定义过滤构件的操作
    /// </summary>
    class SelectionFilter : ISelectionFilter
    {
        /// <summary>
        /// Element 委托处理
        /// </summary>
        public Func<Element, bool> eleFilterDelegate { set; get; }

        /// <summary>
        /// Reference 委托处理
        /// </summary>
        public Func<Reference, XYZ, bool> referenceFilterDelegate { set; get; }
        /// <summary>
        /// 默认构造
        /// </summary>
        public SelectionFilter()
        {
            eleFilterDelegate = null;
            referenceFilterDelegate = null;
        }

        /// <summary>
        /// 实现过滤构件接口
        /// </summary>
        /// <param name="elem"></param>
        /// <returns></returns>
        public bool AllowElement(Element elem)
        {
            if (eleFilterDelegate != null)
            {
                return eleFilterDelegate(elem);
            }
            return false;
        }
        /// <summary>
        /// 实现过滤接口。是否是允许的Reference
        /// </summary>
        /// <param name="reference"></param>
        /// <param name="position"></param>
        /// <returns></returns>
        public bool AllowReference(Reference reference, XYZ position)
        {
            if (referenceFilterDelegate != null)
            {
                return referenceFilterDelegate(reference, position);
            }
            return false;
        }
    }

如果只需要基础墙,那么委托中就可以这么写:

 
public static bool IsNeedWall(Element ele)
        {
            try
            {
                var wall = ele as Wall;
                if (wall == null)
                {
                    return false;
                }
                var kind = wall.WallType.Kind;
                return kind == WallKind.Basic;
            }
            catch
            {
            }
            return false;
        }


//使用

 var filter = new SelectionFilter();
                filter.eleFilterDelegate = (ele) =>
                {
                    return IsNeedWall(ele);
                };

                while (true)
                {
                    try
                    {
                         var walls = Selection.PickElementsByRectangle(filter, "请选择墙体!").ToList();
                        dlg.selectData.Add(walls);
                        dlg.SetTip();
                    }
                    catch (Exception ex)
                    {
                        break;
                    }
                }

效果:

其他过滤效果可以根据自己的需要去实现。

下一篇介绍设置功能窗口在revit窗口的角点位置出现。

欢迎加入我的QQ群,一起探讨Revit二次开发技术!

QQ群:631436766

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值