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

原创 2012年03月27日 17:55:26

转载请复制以下信息:

 

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

作者:  叶雄进

出处: 我爱Revit-应用与二次开发专栏

2012.3.27


 

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上我已经测试过)。解决方案是复制现有的图框,然后修改复制后的新图框的类型。

 

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

 

         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();

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

 

希望有帮助!:)

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【Effective Java】Ch2_创建销毁对象:Item3_通过私有构造函数或枚举类型来强化Singleton属性

所谓Singleton,是指仅能被实例化一次的类。Singleton通常代表本质上唯一的系统组件,例如窗口管理器或文件系统。让一个类成为Singleton就无法为Singleton替换模拟实现,除非它...

一个简单的NT驱动之创建设备对象函数(CreateDevice)

/**************************************************************** * 函数名称:CreateDrivce * 功能描述:初始化设备...

条款三十一:让函数根据一个以上的对象类型来决定如何虚化

条款三十一:让函数根据一个以上的对象类型来决定如何虚化  假设我们决定写一个视频游戏软件,场景中涉及到太空飞船,太空站,小行星等。在空间中可能发生下面四种碰撞结果: 太空飞船以低速碰撞太空站,则安全泊...

item31让函数根据一个以上的对象类型来决定如何虚化

#include /* >如果宇宙飞船以低速与太空站碰撞,宇宙飞船会泊进太空站(程序没有涉及) 否则宇宙飞船和太空站受到的损害与其速度成正比 >如果宇宙飞船与宇宙飞船碰撞,或是...

一个函数锁住相同类型的多个对象造成的死锁

一个类型中有个互斥量变量,一个函数锁住这个类型的多个对象,由于编码不注意加锁顺序在多线程环境下造成了死锁。 #include #include #include #include using n...

J2SE基础夯实系列之List中的数据如何根据对象的某一个或多个字段排序引出Comparable和comparator的使用

引入题目:List中的数据如何根据对象的某一个或多个字段排序?   第一节  对于引入题目的探讨 首先把引入题目表述的清楚一些,在一个List中存储的是一些对象实例,而对象实例包含多...

javaScript中使用 sort方法根据数组中对象的某一个属性值进行排序

javaScript中使用 sort方法根据数组中对象的某一个属性值进行排序
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)