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

萧闫子 发表于 2014-1-15 14:12:22

如果某一个对象没有提供创建函数,或创建函数无法达到期望的效果,如果创建新的这...





Revit 已经提供了许多函数来创建新可以保存在文档中的元素,在Autodesk.Revit.Creation.Document 这个类的方法中找到他们。顺便说一句Revit现在正在倾向改变创建新对象的方法所在的类,现在正向把创建函数从Autodesk.Revit.Creation.Document类移动到相关的对象所属类中。比如创建钢筋类型,现在可以用RebarShape.Create() 函数来创建。

好,上面说了点扩充知识。

虽然已经有了大量的创建对象函数New***,但是仍然有些对象的创建没有提供API的支持,比如创建FilledRegion对象,在Revit2012以及之前的版本中没有提供创建方法。 比如想在一个图纸视图中再创建一个图框,也没有API支持。

下面我们来谈谈如果编程创建这些缺少创建函数的对象。

在Revit 2012 中,提供了一个非常有用的ElementTransformUtils类,可以用来复制,移动,旋转,镜像对象。 我认为最有用的莫过于ElementTransformUtils.CopyElement() 函数。这个函数可以复制所有的Revit的对象,无论看得见的还是看不见的类型对象。可以通过拷贝一个已有对象来创建一个新的对象。所以如果有些没有API的New***函数,你可以考虑使用CopyElement() 函数来复制一个新对象,然后再修改新对象的属性实现创建新对象的目的。



下面以一个例子来说明这个解决方案。比如像在图纸目录中添加一个新的图框,图框实际上是一个FamilyInstance,第一眼我们考虑用NewFamilyInstance来创建,但是问题是创建后的对象在图纸视图中不可见(在Revit2012上我已经测试过)。解决方案是复制现有的图框,然后修改复制后的新图框的类型。



请看下面的代码段演示这个解决方案:



view plaincopy
Transaction trans = new Transaction(doc);
   trans.Start("ad");
   Autodesk.Revit.UI.Selection.Selection sel = app.ActiveUIDocument.Selection;
   Reference ref1 = sel.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element, "Please pick the title block to copy");
   FamilyInstance inst = doc.GetElement(ref1) as FamilyInstance;
   ICollection<ElementId> newInsta = ElementTransformUtils.CopyElement(doc,inst.Id,new XYZ(10,10,0));
   // change its type
   ICollection<ElementId> types = inst.GetValidTypes();
   ElementId idNew;
   FamilyInstance newInstance = null;
   foreach (ElementId id in newInsta)
   {
       Element elem = doc.get_Element(id);
       if (elem is FamilyInstance)
       {
         idNew = id;
         newInstance = doc.get_Element(idNew) as FamilyInstance;
         break;
       }
   }
   ElementId typeId;
   FamilySymbol symbol = null;
   foreach (ElementId id2 in types)
   {
       typeId = id2;
       symbol = doc.get_Element(typeId) as FamilySymbol;
       break;
   }
   newInstance.Symbol = symbol;


   trans.Commit();
当然这个方法的前提是必须有一个对象在文档中,如果想凭空创建,没有办法。

转载请复制以下信息:



原文链接: http://blog.csdn.net/joexiongjin/article/details/7399889

作者:叶雄进




AK47 发表于 2014-2-13 09:45:22

感谢楼主分享   不错的资料

泰安oim 发表于 2014-2-14 10:15:03

路过!!!
帮顶……

卡巴kala 发表于 2014-2-15 14:30:59

顶!!!!!!!!!!

中华! 发表于 2014-2-15 14:36:43

顶起来…………

国产008 发表于 2014-2-15 14:36:59

顶!!!!!!!!!!!!!!!!!!!!!!!!!

龙龙..! 发表于 2014-2-18 12:05:03

顶......
楼下跟上.....

chen_0003 发表于 2014-2-19 14:55:01

顶起来…………

教父 发表于 2014-2-20 14:05:46

顶!!!!!!!!!!
页: [1]
查看完整版本: 如果某一个对象没有提供创建函数,或创建函数无法达到期望的效果,如果创建新的这...