此篇文章仅是自己的开发经验分享,不具备官方参考价值,如有不足,欢迎批评指正

开发目的:

创建一个带箭头的文字注释 字体为新宋体,大小2.5mm,宽度系数0.7,箭头为30度实心箭头 like this 

分析开发目标:

1、分析在Revit里面创建目标文字注释的步骤

第一步,Revit的菜单目录,“注释”——>“文字”,创建好以后发现,Revit创建文字注释默认没有箭头

第二步,选中文字注释,菜单栏出现如图右上角的图标,选择想要创建的样式和方向(可以试一下四个的效果,分别是左直线,右直线,左弧线,右弧线,这张图里面弧线是灰色的,若要使其正常,在上图左侧的属性栏里面勾选上“弧引线”即可)。由此步骤可以得知,在Revit二次开发的过程当中,引线也是可以选择是否创建,选择创建的方向(左还是右),选择创建样式(直线还是弧线),还可以改变位置,如图引线有两个点,查阅资料可得,这两点分别是Leader.Elbow(弯头点),和Leader.End(端点,即箭头上的那个点)

2、分析创建好了的文字注释的属性

第一步:选中创建好的文字注释,“编辑属性”

第二步:分析属性(一般要求会修改颜色,文字字体,宽度系数),我的开发目标还要修改引线箭头

开发:

我们可以查到创建文字注释在新版本中做了修改,以前是用文档对象进行创建,图片截自

https://blog.csdn.net/weixin_40626630/article/details/84108269

新版本:现在是用TextNote对象进行创建

那么我们回顾一下开发目的(创建一个带箭头的文字注释,字体为新宋体,大小2.5mm,宽度系数0.7,箭头为30度实心箭头)

代码如下:

using Autodesk.Revit.Attributes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;namespace CreateTextNode
{[Regeneration(RegenerationOption.Manual)][Transaction(TransactionMode.Manual)]public class CreateTextNode : IExternalCommand{public Result Execute(ExternalCommandData cmdData,ref string msg,ElementSet elems){UIApplication uiapp = cmdData.Application;UIDocument uidoc = uiapp.ActiveUIDocument;Document doc = uidoc.Document;View view = doc.ActiveView;//若此视图没有工作平面则新建工作平面(比如二次开发在剖面是需要新建工作平面的)if (view.SketchPlane == null){Transaction ts1 = new Transaction(doc, "新建工作平面");ts1.Start();Plane plane = Plane.CreateByNormalAndOrigin(doc.ActiveView.ViewDirection, doc.ActiveView.Origin);SketchPlane sp = SketchPlane.Create(doc, plane);doc.ActiveView.SketchPlane = sp;view = doc.ActiveView;ts1.Commit();}Selection S1 = uidoc.Selection;XYZ textNodeLocationPt = null;try{textNodeLocationPt = S1.PickPoint("请选择文字注释创建位置");}catch (Autodesk.Revit.Exceptions.OperationCanceledException){}if (textNodeLocationPt != null){//创建文字注释OptionTextNoteOptions options = new TextNoteOptions();options.HorizontalAlignment = HorizontalTextAlignment.Left; //文字水平对齐方式options.TypeId = doc.GetDefaultElementTypeId(ElementTypeGroup.TextNoteType);options.VerticalAlignment = VerticalTextAlignment.Top;//文字垂直对齐方式double dWidth = 0.07;//文字宽度//箭头端点XYZ leaderEnd = new XYZ(textNodeLocationPt.X -1500/304.8, textNodeLocationPt.Y+1500/304.8, textNodeLocationPt.Z);using (Transaction tran = new Transaction(doc, "Create  Textnote")){tran.Start();//创建文字注释TextNote note = TextNote.Create(doc, doc.ActiveView.Id, textNodeLocationPt, dWidth, "净高控制线", options);note.AddLeader(TextNoteLeaderTypes.TNLT_STRAIGHT_L); //引线方向,一共四种,左直,右直,左弧,右弧note.LeaderLeftAttachment = LeaderAtachement.TopLine;//引线的位置,top代表引线位置在第一行文本的位置IList<Leader> leaderList = note.GetLeaders();foreach (Leader leader in leaderList){leader.End = leaderEnd;//给箭头端点设置值XYZ pointElbow = new XYZ(leaderEnd.X, leader.Anchor.Y, leaderEnd.Z);leader.Elbow = pointElbow;//给箭头弯头点设置值}//创建文字注释的族类型,族类型名称“宋体_2.5mm”,首先判断当前族类型是不是,不是就判断有没有该族类型,有就用,没有就创建了再用if (note.TextNoteType.Name != "宋体_2.5mm"){Parameter familyType = (note as Element).get_Parameter(BuiltInParameter.ELEM_FAMILY_AND_TYPE_PARAM);if (familyType != null && familyType.StorageType == StorageType.ElementId && familyType.AsElementId().IntegerValue >= 0){Element elem_2 = doc.GetElement(familyType.AsElementId());TextNoteType type = elem_2 as TextNoteType;if (type != null){ElementId elementId = null;bool symbolExist = false;FilteredElementCollector collectorSymbol = new FilteredElementCollector(doc);IList<Element> textSymbols = collectorSymbol.OfClass(typeof(TextNoteType)).ToElements();foreach (var item in collectorSymbol){if (item.Name == "宋体_2.5mm"){symbolExist = true;elementId = item.Id;}}if (symbolExist){(note as TextNote).ChangeTypeId(elementId);//依据ID改变族类型}else{TextNoteType duplicatedtextType = null;duplicatedtextType = type.Duplicate("宋体_2.5mm") as TextNoteType;string textNode = duplicatedtextType.LookupParameter("文字大小").AsString() + duplicatedtextType.LookupParameter("文字大小").AsValueString();string dut_gerneral = duplicatedtextType.LookupParameter("宽度系数").AsString() + duplicatedtextType.LookupParameter("宽度系数").AsValueString();string text_Form = duplicatedtextType.LookupParameter("文字字体").AsString() + duplicatedtextType.LookupParameter("文字字体").AsValueString();string text_Elbow = duplicatedtextType.LookupParameter("引线箭头").AsString() + duplicatedtextType.LookupParameter("引线箭头").AsValueString();if (textNode != null && textNode != "2.5mm"){duplicatedtextType.LookupParameter("文字大小").SetValueString("2.5mm");}if (dut_gerneral != null && dut_gerneral != 0.7.ToString()){duplicatedtextType.LookupParameter("宽度系数").Set(0.70);}if (text_Form != null && text_Form != "新宋体"){duplicatedtextType.LookupParameter("文字字体").Set("新宋体");}if (text_Elbow != null && text_Elbow != "楼梯碰头_30度实心箭头"){//创建族类型——楼梯碰头_30度实心箭头Element arrowType = doc.GetElement(duplicatedtextType.LookupParameter("引线箭头").AsElementId());arrowType.LookupParameter("箭头样式").Set(8);arrowType.Name = "楼梯碰头_30度实心箭头";arrowType.LookupParameter("箭头宽度角").Set(0.523598775598298);arrowType.LookupParameter("填充记号").Set(1);arrowType.LookupParameter("记号尺寸").Set(0.00984251968503937);}note.TextNoteType = duplicatedtextType;}}}}//设置显示颜色(也可修改文字注释颜色的属性)Color color = new Color((byte)255, (byte)128, (byte)128);OverrideGraphicSettings ogs = new OverrideGraphicSettings();ogs.SetProjectionLineColor(color);//投影表面线的颜色view.SetElementOverrides(note.Id, ogs);tran.Commit();}}return Result.Succeeded;}}
}

最后的效果,文字注释的族类型名称为“宋体_2.5mm”,引线箭头族类型是“楼梯碰头_30度实心箭头”,字体是新宋体,大小是2.5mm,宽度系数0.7

开发总结:

1、本Demo的例子的几个知识点,① 创建TextNote ②创建文字注释的族类型  ③ 创建箭头族类型

2、整个逻辑过程,①用户选择一个点,作为文字注释的位置 ② 箭头端点坐标为用户选择点的x向左偏1500,y向上偏1500。箭头弯头坐标是端点的x,引线锚点(引线与文本框的接触点)的y,端点的z ③创建一个默认文字注释 ④ 如果创建的文字注释用的族类型不叫"宋体_2.5mm",则就找是否有这个族类型,有就直接用,没有就创建一个再用 ⑤创建该族类型的过程是,复制当前使用的族类型,再改相应属性的值,文字字体,字体大小,宽度系数可以直接改,引线箭头的值是箭头这个系统族下的族类型,所以再创建一个“楼梯碰头_30度实心箭头”

【Revit 二次开发 】创建带箭头的文字注释(字体设置+引线箭头设置)相关推荐

  1. Revit二次开发-创建IURibbon中使用相对地址

    目录 前言 一.创建DLL文件 二.按钮类编写(UIRibbon) 1.程序集的引用 2.代码编写 3.完整代码 三.dll文件和addin文件的使用 四.最终效果 前言   我们在进行二次开发的时候 ...

  2. [Revit二次开发] 创建一个柱的族

    完整项目代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  3. #Revit二次开发# 创建剖面视图

    设置box的min和max只是设置box的范围大小.其中min和max的xyz方向的大小实际指的基于剖面视图坐标系.Box的原点和min,max可以确定位置关系:box的原点决定创建的剖面视图的原点. ...

  4. revit二次开发-创建族

    通过文件路径载入族 并点击任意一点创建实例 代码如下: using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk ...

  5. [Revit二次开发] 创建剖面并将视图切换至剖面

    前言 在Revit建模过程及后期出图的时候都有需要用到剖面,然而每次我们都通过手动去创建剖面再去对剖面视图进行调整就会显得很麻烦,工作量也是相当的大. 如果我们通过使用RevitAPI只需要简单的代码 ...

  6. Revit二次开发“创建组遍历组Group”

    group 就是吧一些有关系的对象放在一个组里面 [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manu ...

  7. revit二次开发 创建图纸图框,视图放到图框中心点位置

    创建图纸 /// <summary>/// 创建图纸/// </summary>private void CreateViewSheet2(){FilteredElementC ...

  8. revit二次开发 创建管道三通,管道四通。两根管、三根管、四根管

    创建单跟水管 /// <summary>/// 创建水管Pipe/// </summary>/// <returns></returns>public ...

  9. revit二次开发创建桥架、线管

    创建桥架.线管 创建桥架 通过过滤器获取桥架类型 选择点 得到活跃视图标高 创建桥架 修改宽.高 完整代码 创建线管 获取线管类型 获取标高 获取点 创建 修改直径 完整代码 创建桥架 /// < ...

  10. Revit二次开发-创建楼板钢筋

    Transaction transaction = new Transaction(document);transaction.Start("创建楼板钢筋");BoundingBo ...

最新文章

  1. VC++ 模拟quot;CLICK事件quot;关闭指定窗体
  2. 可以与空间耦合的神经网络分子微扰模型BeO
  3. 深度学习100例-生成对抗网络(DCGAN)手写数字生成 | 第19天
  4. Django日志模块logging的配置详解
  5. element 如何自定义svg图标_【第2018期】小图标,大学问
  6. opensuse安装搜狗输入法
  7. 三星香港 android8.0,三星On7官方港版安卓8.0固件rom线刷包:TGY-G6100ZHU3CSG1
  8. 音频文件编辑 android,音频剪辑编辑APP
  9. 公式图片识别转换工具
  10. Maven异常:0.0.1-SNAPSHOT: Could not find artifact
  11. i++和++i为毛会不一样
  12. mysql5.7 1698 28000,MYSQL教程MySql Error 1698(28000)问题的解决方法
  13. 在html中加上时钟,Html5绘制时钟
  14. 单例设计模式(拉勾教育大数据学习笔记)
  15. 算法分析与设计实验报告三——动态规划算法
  16. 华为5年自动化测试工程详细解说:unittest单元测试框架
  17. 卡尔曼滤波—Singer算法
  18. 高薪就业面试题系列 人事篇三
  19. 推荐一款带分销的小程序商城?
  20. 计算机考试电脑阅卷,你写的字可能给电脑阅卷带来了很大困难,电脑:这试卷看不下去...

热门文章

  1. java开发256g固态硬盘_请推荐一下256g的固态硬盘?
  2. 程序寄存器与指令寄存器
  3. Android_多媒体
  4. 腾讯(来自百度百科)
  5. ASK调制信号仿真程序
  6. 模拟信号转PWM输出隔离转换器 输出驱动能力可达 5A
  7. 动画交互应用——神秘力量
  8. 数字化转型,转谁的型?
  9. 小龙坎雅思培训笔记,三步学习方法
  10. 关于EasyPoi导出Excel公式Cell不计算的问题