您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 综合/其它 > Revit二次开发参数读取
Revit二次开发小结VINCENT3订阅号“类”是C#编程的核心概念,类包含构造器、属性、方法;“类”是创建“对象”的模板,“对象”包含了“类”的一系列功能;Revit二次开发中,不论是图元还是处理图元的方法,一律都封装在类中,各种类又分别放置在不同命名空间下;他们最终以函数库dll文件存在,通过接口我们可以使用他们;“对象”通过“类”构造,“类”也可以作为参数传递我们会使用到“对象”,所以“对象”其实也是一种特殊的参数:泛型的参数;前言TransactionMode.Manual是指,事务更新模式为手动,现在版本只支持手动,所以修改模型的命令需要加一段Transaction代码,显式说明更新模型;类的接口IExternalCommand;Execute函数,相当于程序的main函数,是代码运行的入口;程序入口对象向下转型Wallmywall=elementasWall;FamilyInstancemywindow=elementasFamilyInstance;FamilySymbolsymbol=elementasFamilySymbol;WallTypetype=elementasWallType;对象的向下转型:Element可以转换成可载入族实例、系统族实例、可载入族类型、系统族类型//Element转换为墙类型//Element转换为可载入族实例//Element转换为可载入族类型//Element转换为Wall类的实例疑问:对象的转型在哪些情况下进行,转型的目的是什么?获得图元的途径使用Document类的方法Document.GetElement()配合图元收集器和过滤器,获得图元集合Document类的方法Documen.GetElement一共有三个重载方法,返回值是单个的Element对象Document.GetElement(stringuniqueId);参数是uniqueIdDocument.GetElement(ElementIdid);参数是ElementIdDocument.GetElement(Reference);参数是Reference获得图元之Documen.GetElement()Document.GetElement(ElementIdid);参数是ElementId首先我们需要构造一个对象ElementId,然后作为参数传递给Document.GetElement方法ElementIdwallid=newElementId(170719);Elementelem2_wall=Doc.GetElement(wallid);获得图元之Documen.GetElement()ElementId参数的构造方法有三个重载:(1)intid数字(2)BuiltInCategory(3)BuiltInParameter获得图元之Documen.GetElement()其中ElementId,是这样进行构造的。Selectionchoices=newUIDocument(Doc).Selection;Referencerefer1=choices.PickObject(ObjectType.Element,选择一个构件图元);Elementelem=Doc.GetElement(refer1);获得图元之Documen.GetElement()Document.GetElement(Reference);参数是Reference;这个方法需要配合界面选择交互操作,代码部分需要Selection做配合;过滤图元,对于构件来讲,主要是过滤出实例图元、类型元素,两者互不包含,但是有相同的参数。过滤工具:FilteredElementCollector类(收集器)ElementClassFilter类(类过滤器)ElementCategoryFilter类(类别过滤器)LogicalAndFilter类(逻辑过滤器)以及收集器应用过滤器的方法.WherePasses()获得图元之使用过滤器过滤内容:过滤属于可载入族的实例图元过滤属于可载入族的类型图元过滤属于系统族的实例图元过滤属于系统族的类型图元过滤方法:收集器应用过滤器,使用WhereaPass();过滤器之间的连接,使之变成逻辑过滤器;有的过滤器其实不用新建,收集器可以直接调用其快捷方法;收集器之间也可以取并集、交集等等UnionWith()、IntersectWith();如果需要得到实例,那么需要指定类别、指定为实例图元;如果需要得到类型,那么需要指定类别、指定为类型图元;获得图元之使用过滤器获得图元之使用过滤器FilteredElementCollectorcollector1=newFilteredElementCollector(Doc);ElementClassFilterclassFilter1=newElementClassFilter((typeof(FamilyInstance)));ElementCategoryFiltercategoryFilter1=newElementCategoryFilter(BuiltInCategory.OST_StructuralColumns);LogicalAndFilterlogicalAndFilter1=newLogicalAndFilter(classFilter1,categoryFilter1);collector1.WherePasses(logicalAndFilter1);IListElementelements1=collector1.ToElements();过滤可载入族实例以结构柱为例获得图元之使用过滤器FilteredElementCollectorcollector2=newFilteredElementCollector(Doc);ElementClassFilterclassFilter2=newElementClassFilter((typeof(FamilySymbol)));ElementCategoryFiltercategoryFilter2=newElementCategoryFilter(BuiltInCategory.OST_StructuralColumns);LogicalAndFilterlogicalAndFilter2=newLogicalAndFilter(classFilter2,categoryFilter2);collector2.WherePasses(logicalAndFilter2);IListElementelements2=collector2.ToElements();过滤可载入族类型以结构柱为例获得图元之使用过滤器过滤系统族实例以墙为例FilteredElementCollectorcollector3=newFilteredElementCollector(Doc);ElementClassFilterclassFilter3=newElementClassFilter((typeof(HostObject)));ElementCategoryFiltercategoryFilter3=newElementCategoryFilter(BuiltInCategory.OST_Walls);LogicalAndFilterlogicalAndFilter3=newLogicalAndFilter(classFilter3,categoryFilter3);collector3WherePasses(logicalAndFilter3);IListElementelements3=collector3.ToElements();演示一次快捷方法:快捷方法就是有的过滤器可以不必构造,收集器里面有相应的方法,然后填入参数即可。collector.OfClass((typeof(HostObject))).OfCategory(BuiltInCategory.OST_Walls);获得图元之使用过滤器过滤系统族类型以墙为例FilteredElementCollectorcollector4=newFilteredElementCollector(Doc);ElementClassFilterclassFilter4=newElementClassFilter((typeof(WallType)));ElementCategoryFiltercategoryFilter4=newElementCategoryFilter(BuiltInCategory.OST_Walls);LogicalAndFilterlogicalAndFilter4=newLogicalAndFilter(classFilter4,categoryFilter4);collector4.WherePasses(logicalAndFilter4);IListElementelements4=collector4.ToElements();注意:此方法过滤出的墙类型只包括基本墙和幕墙,是无法过滤出叠层墙的。获得图元之使用过滤器使用小结:未完待续手动事务更新模式using(Transactiontrans=newTransaction(Doc)){trans.Start(提示说明语句);//代码主体trans.Commit();}代码块:以及:首先,使用Transaction更新代码块;然后,使用Document.Delete()方法,接收参数是单个ElementId或者ElementId的集合;IListElementmyElements1=null;//这是需要删除的元素集合ICollectionAutodesk.Revit.DB.ElementIdidcollection=newListElementId();foreach(Autodesk.Revit.DB.ElementeleminmyElements1){idcollection.Add(elem.Id);//往集合中添加元素的id}Doc.Delete(idcollection);图元删除读写参数图元Element的参数保存在其属性参数集合Parameters里面,可以遍历这个集合得到参数,或者使用其方法get_Parameter()直接获取指定参数;参数对象是由Parameter类构造的,Parameter类包含了各种参数类型转换的方法等等;我们使用Parameter来接收Element的参数;系统族、载入族实例中的实例参数;系统族、载入族的类型元素包含的参数;系统族、载入族实例中的类型参数;读写参数实例图元其实包含了类型参数的,这个是不是也可以读写,以及具体是怎么实现的呢参数的builtinparameterdefinetionGUID咋解释啊??参数读写内容:读取可载入族的实例图元参数以梁为例,读取梁的长度读写参数stringinfo1=“;foreach(Elementeleminelements1){Parameterpara1=null;para1=elem.get_Parameter(BuiltInParameter.INSTANCE_LENGTH_PARAM);doublelength1=para1.AsDouble();info1+=\t\n+length1.ToString()+foot英尺;}MessageBox.Show(info1);//elements1是梁实例图元集合//读取梁的长度修改可载入族的实例图元参数以梁为例,修改一端Z轴偏移值由于涉及到模型改动,所以需要Transaction代码读写参数Elementmyelem=collector1.FirstElement();Parameterpara2=myelem.
本文标题:Revit二次开发参数读取
链接地址:https://www.777doc.com/doc-2043716 .html