Building Coder(Revit 二次开发) - 族元素可见性

本文介绍如何在Revit族文档中通过编程控制元素的可见性,包括使用参数访问方法get_Parameter()来获取Visible属性,并利用FamilyElementVisibility类设置元素在不同视图和细节层的可见性。

Building Coder 链接:http://thebuildingcoder.typepad.com/blog/2010/07/family-element-visibility.html

Revit 二次开发论坛链接:http://revit.5d6d.com/viewthread.php?tid=1295&extra=


有人提到一个如何在族文档中设置元素可见性的问题。


问题:
我需要为一个 Family Feature(例如:extrusion)的可见性属性分派一个Yes/No参数。目的是隐藏特定类型的 extrusion。Revit 用户界面中我可以通过如下方式手动实现:
1. 选定 Feature;
2. 在属性视图中切换 Visibility 的 ON/OFF状态。
但是我如何通过编程方式实现这一点呢?

回答:
为了测试,我利用 Metric Generic Model 模板新建了一个族,其中只有一个 extrusion 元素。在 extrusion 元素的属性视图中,我在 Graphics 组下找到了你提到的 Visible
属性。它的值是一个核选框。

当我使用 RevitLookup 工具分析这个 extrusion 对象时,我发现 Visible 属性是以元素参数的形式存在的。它对应的内置参数是 IS_VISIBLE_PARAM。
    Add-Ins > Revit Lookup > Snoop Current Selection > Extrusion > Parameters > Visible
你可以通过对 extrusion 元素调用标准的参数访问方法 get_Parameter() 来获取它。

实际上我在之前 DWG and DWF family creation 的讨论中就曾利用 Visible 属性来控制 Family Feature 的显示/隐藏。那时我使用一个自定义的族参数来映射相关
Family Feature 的可见性。这样我的族在被实例化之后,我就可以通过控制这个自定义的族参数来控制相关族部件的可见性了。

如果你想对 Family Feature 的可见性有更深入地控制,还可以利用 FamilyElementVisibility 类。Revit API 帮助文档中包含了对该类的描述和一些例程。简单地说就是该类
还可以帮助你设置相关的 Family Feature 在哪些细节层和视图中会被显示。
public void CreateAndSetVisibility(Autodesk.Revit.DB.Document familyDocument, SketchPlane sketchPlane)
{
    // create a new ModelCurve in the family document
    XYZ p0 = new XYZ(1, 1, 0);
    XYZ p1 = new XYZ(5, 1, 0);
    Line line1 = familyDocument.Application.Create.NewLineBound(p0, p1);

    ModelCurve modelCurve1 = familyDocument.FamilyCreate.NewModelCurve(line1, sketchPlane);

    // create a new ModelText along ModelCurve line
    ModelText text = familyDocument.FamilyCreate.NewModelText("Hello World", null, sketchPlane, p0, HorizontalAlign.Center, 0.1);

    // set visibility for text
    FamilyElementVisibility textVisibility = new FamilyElementVisibility(FamilyElementVisibilityType.Model);
    textVisibility.IsShownInTopBottom = false;
    text.SetVisibility(textVisibility);

    // set visibility for line
    FamilyElementVisibility curveVisibility = new FamilyElementVisibility(FamilyElementVisibilityType.Model);
    curveVisibility.IsShownInCoarse = false;
    modelCurve1.SetVisibility(curveVisibility);
}


译者注:FamilyElementVisibility 类提供一组属性用于控制元素在指定细节层或者视图中是否被显示。这些属性如下:

IsShownInCoarse:是否在“粗糙”细节层中显示(只限项目文档);
IsShownInMedium:是否在“中度”细节层中显示(只限项目文档);
IsShownInFine:是否在“精细”细节层中显示(只限项目文档);

IsShownInFrontBack:是否在“前/后”视图中显示(只限项目文档);
IsShownInLeftRight 是否在“左/右”视图中显示(只限项目文档);
IsShownInTopBottom:是否在“顶/底”视图中显示(只限项目文档);

IsShownInPlanRCPCut:当在 Plan/RCP 中被剪切时是否显示(如果其类别允许的话);
IsShownOnlyWhenCut:是否只在其被剪切时显示;

VisibilityType:FamilyElementVisibilityType 枚举值
- Model:只在3D视图中显示;
- ViewSpecific:只在创建视图中显示,一般用于细节组件、注释以及针对视图的导入
Revit二次开发中,Jeremy Tammik 提供的项目模板是许多开发者的首选工具。这些模板不仅简化了开发流程,还提供了最佳实践和标准结构,使开发者能够更高效地创建Revit插件。 Jeremy Tammik 是Autodesk的开发专家,长期致力于推动Revit API的使用和发展。他提供的项目模板通常包括用于创建外部命令、外部应用、事件处理程序等的标准类结构,并集成了必要的引用和配置文件,以减少开发者在项目初始化阶段的工作量。 ### 项目模板的主要特性 - **标准类结构**:模板通常包含`IExternalCommand`或`IExternalApplication`的实现类,开发者可以直接在这些类中编写核心逻辑。 - **调试支持**:集成调试器启动设置,允许开发者在Visual Studio中直接启动Revit并附加调试器,提高调试效率。 - **资源管理**:模板通常包含图标、资源文件以及本地化支持的示例代码。 - **日志记录**:部分模板集成了日志记录功能,便于调试和错误追踪。 - **兼容性支持**:针对不同版本的Revit(如2020至2024),模板通常提供多个分支,以确保与不同API版本的兼容性[^1]。 ### 如何获取 Jeremy 的项目模板 Jeremy Tammik 的项目模板可以在其官方GitHub仓库中找到。访问地址为: [The Building Coder GitHub Repository](https://github.com/jeremytammik/the_building_coder_samples) 在该仓库中,模板通常以`C:\...\The Building Coder Samples\`的形式组织,开发者可以下载整个项目并从中提取所需的模板部分。 此外,部分开发者社区和论坛也提供了基于Jeremy模板的改进版本,例如: - GitHub上的衍生项目 - Revit API论坛(如Revit API中文论坛) - Autodesk官方论坛中的相关讨论帖 ### 使用指南 1. **克隆仓库**:使用Git将整个仓库克隆到本地,或直接下载ZIP文件。 2. **提取模板**:找到`Source`目录下的项目结构,通常包含多个示例和模板。 3. **创建新项目**:复制模板文件夹,重命名项目,并在Visual Studio中打开进行开发。 4. **配置属性**:确保`post-build`事件中的路径与本地Revit安装路径一致,以便调试器可以正确启动Revit。 5. **编写逻辑**:在`Execute`方法中实现业务逻辑,并利用模板中已有的辅助类(如`App`和`Cmd`)进行注册和调用[^1]。 ### 示例代码 以下是一个简单的外部命令模板示例: ```csharp using System; using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.UI; [Transaction(TransactionMode.Manual)] public class MyExternalCommand : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { // 获取当前文档 Document doc = commandData.Application.ActiveUIDocument.Document; // 显示一个信息框 TaskDialog.Show("Revit二次开发", "Hello, Revit API!"); return Result.Succeeded; } } ``` ### 常见问题 - **如何调试插件?**:在Visual Studio中设置启动程序为Revit.exe,并确保DLL输出路径正确。调试时Revit会自动加载插件。 - **如何处理版本差异?**:模板通常会标注支持的Revit版本,开发者应根据目标版本选择合适的模板分支。 - **如何部署插件?**:生成的DLL文件可以通过`.addin`配置文件注册到Revit中,通常位于`%APPDATA%\Autodesk\Revit\Addins\`目录下。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值