EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

萧闫子 发表于 2014-1-9 12:36:51

Building Coder - 布尔操作和 InstanceVoidCutUtils



原文链接:Boolean Operations and InstanceVoidCutUtils
上周我提到我计划聊聊在族创建上下文中的布尔操作。在开始之前,让我们先对 Revit API 提供的布尔操作及其在项目文档中的使用有个大概了解。
过去,Revit API 没有针对项目文档提供太多布尔操作的支持。

而在族文档中,标准的布尔操作是通过函数 Document.CombineElements() 方法来实现的。不过这个函数只对有限的元素类型有效。

另外一个针对族文档的布尔操作方式是 Revit 2011 API 引入的 SolidSolidCutUtils 类。Revit SDK 为此提供了一个例子 SolidSolidCut SDK Sample。这个例子是针对
SolidSolidCut.rfa 族文件硬编码的。而且就像它的 ReadMe 文件中指出的,这个实体实体切割操作只在编辑一个 Conceptual Mass 族时有效。

如果你需要在项目文档中添加多个相似但是不同的元素,在 Revit 2011 中只能为每一种元素创建对应的族,然后将这些族实例添加到项目中。显然这会导致项目文档的负担过重。

Revit 2012 API 引入了两个新类 BooleanOperationUtils 和 InstanceVoidCutUtils,允许开发人员实现布尔操作。Revit 2012 API 还增强了 SolidSolidCutUtils 类,使得它的
工作范围从族文档延伸到项目文档了。

今天我们先来看看 InstanceVoidCutUtils 类的使用。

提问
哪儿能找到 InstanceVoidCutUtils 类的文档和例子?

回答
正如 Revit API 帮助文档中指出的,InstanceVoidCutUtils 类允许程序在族实例上使用没有附着的 void 来切割元素。

- BooleanOperationUtils:
该类会创建非元素的几何对象。程序可以使用 AnalysisVisualizationFramework 在新建几何对象的表面绘制颜色。但是这个几何对象无法创建为元素,也不能被保存到模型中。SDK 例程 GeometryCreation_BooleanOperation (GeometryAPI 子目录下) 展示了该类的用法,并且为其提供了一个封装类。

- InstanceVoidCutUtils
与 BooleanOperationUtils 不同,该类会产生一个 void 元素。由于生成的 void 元素对用户而言是完全可编辑的,所以应该尽量少的使用。比方说用方块切割梁的底部时,使用该类 之后这些方块能够被拾取,所以是不适合的。InstanceVoidCutUtils 适用于微调的工作,比方说如果一个构件族在创建时没有包括洞,那么可以利用 InstanceVoidCutUtils 钻洞,之后洞就成为族的一部分了。

- SolidSolidCutUtils
该类的文档叙述有问题。它可以同时工作在 Revit 2012 的族和项目文档中,无论是手动还是程序方式。不过该类只针对某些类型的元素有效,者就需要通过实验来检测了。

做了这么多铺垫工作,终于可以回答如何应用 InstanceVoidCutUtils 类的问题了。就像大多数 Revit 二次开发实践一样,首先我建议采用手动方式完成,然后再研究如何程序实现。

首先我们需要创建一个族来封装用于切割的“非附着 void”。Families Guide是一个很好的指南。你可以从
    Loadable Families Overview
      -> Creating Loadable Families
            -> Creating a Loadable Family
                -> Creating Family Geometry
                  -> Creating Solid (3D) Geometry
                        -> Cut Geometry
中找到操作步骤。

手工方式完成了,让我们来研究如何程序实现。

这里是例程sample void cutter family cutter.zip。它的主要逻辑由以下的伪代码表示:

view plaincopy



[*]Element element;
[*]FamilySymbol fs;
[*]
[*]// . . .

[*]
[*]PlanarFace planarFace = facesToAttach as PlanarFace;
[*]
[*]// . . .

[*]
[*]XYZ xyzOrigin = planarFace.Origin;
[*]
[*]FamilyInstance cuttingInstance = _doc.Create.NewFamilyInstance( facesToAttach, xyzOrigin, vecY, fs );
[*]
[*]Parameter parAngle3 = cuttingInstance.get_Parameter( "A3" );
[*]
[*]Utils.ParameterSet( parAngle3, angles );
[*]
[*]InstanceVoidCutUtils.AddInstanceVoidCut(_doc, element, cuttingInstance );


如我之前所说,请不要对大量的族实例使用这段代码,少量的使用性能还不错。

这里还有一段类似的在墙体上创建凹槽的伪代码:

view plaincopy



[*]FamilySymbol polyRecessFamily;
[*]Wall wall;
[*]
[*]// . . .

[*]
[*]FamilyInstance recessElement = _doc.Create.NewFamilyInstance( face, pos, XYZ.Zero, polyRecessFamily );
[*]
[*]recessElement.SetParameter( "Countersinking", UnitConversion.ToFeet( recess.CounterSinking ) );
[*]
[*]if( InstanceVoidCutUtils.CanBeCutWithVoid( wall ) )
[*]{
[*]    InstanceVoidCutUtils.AddInstanceVoidCut( _doc, wall, recessElement );
[*]}


需要注意的是:必须确保 void 切割族的族参数 Cut with Void When Loaded 被设置为有效。
http://thebuildingcoder.typepad.com/.a/6a00e553e16897883301543320f612970c-800wi

否则 void 就不是一个“非附着 void”,执行以上代码会导致异常:
    "The element is not a family instance with an unattached void that can cut. Parameter name: cuttingInstance".
我相信上述内容可以让你开始使用 InstanceVoidCutUtils 类了。

今后我们会讨论另一个相关功能:利用 Document.CombineElements 方法,在程序创建的窗族中使用突伸轮廓创建窗框
转自:摘花换酒
http://blog.csdn.net/flower4wine/article/details/7278714

妮可 发表于 2014-2-20 14:46:17

顶起来…………

页: [1]
查看完整版本: Building Coder - 布尔操作和 InstanceVoidCutUtils