Revit 二次开发 特殊族实例参照获取

Reference 是Revit对象的引用 也是二次开发必须了解和熟练掌握的技能之一,对象引用包括 图元基础引用 可以根据此引用 实现图元转化 参数信息过滤和设置,此外对于标注来说更重要的是 Face-面引用 Curve-线引用 Point-点引用。

那么根据Revit版本的不同对象的引用获取 也会有所不同 需要查找API做相应的匹配

其实我们可以获得族实例的参照引用也就是族样板里的那两条中心参照线如下图

 那么怎么获得呢?大家应该知道 其实图元引用是可以转化为字符串的  reference.ConvertToStableRepresentation(doc) 在使用是可以转化回来Reference.ParseFromStableRepresentation(doc, string),那么和我们说的问题有什么关系呢,答案是肯定的 有!根据Autodesk的指引 ,我们分别获得实例的本身引用和实例的几何面或边的引用 转化为字符串后看看有什么不同:如下

实例本身引用

a77b1edc-61fc-4855-8179-b72c50bdd617-00072e8b

实例几何面引用

a77b1edc-61fc-4855-8179-b72c50bdd617-00072e8b:0:INSTANCE:a77b1edc-61fc-4855-8179-b72c50bdd617-00072cc7:9:SURFACE

我们可以看到 几何内部的引用 信息要比实例本身多的多,而且利用“:”号分隔,都是什么意思呢

第一段,很显然和实例本身的引用相同 也就是族实例的UniqueId 

第二段,应该是 实例的集合索引 这里应该会保持为零 因为只有一个实例被选中 索引为零

第三段,表明这个引用是Instance内部的 也就是来自于实例的几何图形的引用

第四段,就是最重要的一段 它标示得到的引用是族内部的那个参照 如 前,后, 左, 右,上,下 等共有九个

第五段,指的是引用是几何图形的面或边或点的引用

所以我们只要改变第四段的索引值就可以获得相对应的是参照引用了 就可以标注尺寸了

这里不详细叙述了 把是参照的9个选项设为枚举类型:

  public enum SpecialReferenceType

       {

           Left = 0,

           CenterLR = 1,

           Right = 2,

           Front = 3,

           CenterFB = 4,

           Back = 5,

           Bottom = 6,

          CenterElevation = 7,

           Top = 8

       }

   public Reference createreference(Document doc, FamilyInstance instanece, SpecialReferenceType ReferenceType)
        {
            int index = (int)ReferenceType;
            Reference indexReference = null;
            Options geomOptions = new Options();
            geomOptions.ComputeReferences = true;
            geomOptions.DetailLevel = ViewDetailLevel.Medium;
            geomOptions.IncludeNonVisibleObjects = true;
            string name = instanece.Name;
            GeometryElement geoElement = instanece.get_Geometry(geomOptions);
            foreach (var obj in geoElement)
            {
                if (obj is GeometryInstance)
                {
                    GeometryInstance geoInstance = obj as GeometryInstance;
                    String sampleStableRef = null;
                    if (geoInstance != null)
                    {
                        GeometryElement geoSymbol = geoInstance.GetSymbolGeometry();
                        if (geoSymbol != null)
                        {
                            foreach (GeometryObject geomObj in geoSymbol)
                            {
                                if (geomObj is Solid)
                                {
                                    Solid solid = geomObj as Solid;
                                    if (solid.Faces.Size > 0)
                                    {
                                        Face face = solid.Faces.get_Item(0);
                                        sampleStableRef = face.Reference.ConvertToStableRepresentation(doc);
                                        break;
                                    }
                                }
                            }
                        }
                        if (sampleStableRef != null)
                        {
                            String[] refTokens = sampleStableRef.Split(new char[] { ':' });
                            String customStableRef = refTokens[0] + ":" + refTokens[1] + ":" + refTokens[2] + ":" + refTokens[3] + ":" + index.ToString();
                            indexReference = Reference.ParseFromStableRepresentation(doc, customStableRef);
                        }
                        break;
                    }
                }
            }
            return indexReference;
        }

通过传入不同面的枚举类型值就可以获取到对应的参照面

然后主程序只需要调用就行了

 dbHelp.createreference(doc, shy, DBHelper.SpecialReferenceType.Bottom)

原文地址:Revit二次开发之 有点时间 分析一下Reference_雨花拾_新浪博客 (sina.com.cn)

### Revit 二次开发集成 Deepseek 在Revit二次开发中,为了实现更复杂的功能需求,可以考虑引入第三方库来增强功能。对于想要利用Deepseek进行开发的情况,开发者不仅需要掌握C#或VB.NET编程语言以及熟悉Revit API[^1],还需要理解如何将外部库与Revit插件项目相结合。 #### 准备工作 确保已经安装Visual Studio,并配置好用于Revit二次开发的环境。此外,还需下载并设置Deepseek SDK或其他形式提供的API接口文档和示例程序以便后续调用。 #### 创建新项目 启动Visual Studio创建一个新的类库(Class Library (.NET Framework))项目作为Revit加载项的基础框架,在解决方案资源管理器(Solution Explorer)里右键点击References->Manage NuGet Packages...通过NuGet包管理工具获取必要的依赖项,比如Autodesk.Revit.SDK等官方支持文件;同时也应寻找适合版本的Deepseek客户端库加入到当前工程之中。 #### 编写代码逻辑 下面是一个简单的例子展示怎样初始化连接至Deepseek服务端口: ```csharp using Autodesk.Revit.UI; using System; public class MyExternalCommand : IExternalCommand { public Result Execute( ExternalCommandData commandData, ref string message, ElementSet elements) { try { // 初始化Deepseek Client实例 var deepSeekClient = new Deepseek.Client(); // 进行一些操作... TaskDialog.Show("提示", "成功连接到了Deepseek!"); return Result.Succeeded; } catch (Exception e) { message = e.Message; return Result.Failed; } } } ``` 请注意上述`new Deepseek.Client()`部分仅为示意性质的实际应用当中可能涉及更多参数设定或是异步方法调用来完成特定任务。具体细节需参照所使用的Deepseek API指南来进行调整优化。 #### 测试验证 编译完成后生成DLL文件放置于指定路径下让Revit能够自动识别加载该外挂模块。运行Revit打开任意模型尝试触发自定义命令看能否正常弹窗显示消息框表示已成功接入Deepseek平台。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南柯思一梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值