Revit二次开发 - 算量模块 - 几何接口

Revit接口

GeometryCreationUtilities

BooleanOperationsUtils

StructuralFramingUtils

JoinGeometryUtils

二维平面开源库

https://sourceforge.net/projects/polyclipping/

平面多边形的布尔运算,非常强大,建议下载备份到本地,因为可能这样...

 


 

问题1:项目中梁柱基本都发生了剪切的关系,如果需要获取构件原始的Solid,可能就需要先打断这些关系再取,我说的可能不是很清楚,但是如果你在正在做这方面的事情时,应该会遇到这些问题并且肯定需要解决这些问题。

        /// <summary>
        /// 断开元素的剪切和连接关系
        /// </summary>
        /// <param name="element"></param>
        void Dissolve(Element element)
        {
            var document = element.Document;

            var category = ElementCategroyTypeUtils.GetCategoryType(element);

            if (category == ElementCategroyType.eBeam)
            {
                StructuralFramingUtils.DisallowJoinAtEnd(element as FamilyInstance, 0);
                StructuralFramingUtils.DisallowJoinAtEnd(element as FamilyInstance, 1);
            }

            foreach (var id in JoinGeometryUtils.GetJoinedElements(document, element))
            {
                var secondElement = document.GetElement(id);

                category = ElementCategroyTypeUtils.GetCategoryType(secondElement);

                if (category == ElementCategroyType.eBeam)
                {
                    StructuralFramingUtils.DisallowJoinAtEnd(secondElement as FamilyInstance, 0);
                    StructuralFramingUtils.DisallowJoinAtEnd(secondElement as FamilyInstance, 1);
                }

                if (JoinGeometryUtils.AreElementsJoined(document, element, secondElement))
                    JoinGeometryUtils.UnjoinGeometry(document, element, document.GetElement(id));
            }

            _document.Regenerate();
        }

使用方式需要用到事务和子事务

Solid GetOriginalSolid(Element element)
        {
            var category = ElementCategroyTypeUtils.GetCategoryType(element);
            if (
                category == ElementCategroyType.eBeam ||
                category == ElementCategroyType.eColumn)
            {
                var ins = element as FamilyInstance;

                GeometryElement geometry = null;

                using (var subTrans = new SubTransaction(_document))
                {
                    subTrans.Start();

                    Dissolve(element);

                    geometry = ins.GetOriginalGeometry(_opt);
                    var transform = ins.GetTotalTransform();
                    geometry = geometry.GetTransformed(transform);

                    foreach (var item in geometry)
                        if (item is Solid)
                        {
                            var solid = item as Solid;
                            if (solid.Faces.Size > 0)
                                return solid;
                        }
                }
            }

            throw new Exception("获取Solid失败!!!");
        }

上次代码是用来测试梁柱的,而且也没考虑多个Solid的情况,不过它能说明问题,仅供参考。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值