Revit API 加载族并生成实例图元

Posted beggar_1982

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Revit API 加载族并生成实例图元相关的知识,希望对你有一定的参考价值。

在Revit API中加载族可以使用Doc.LoadFamily方法,传入要加载的族文件路径名,但是这种方式有一种缺点,就是如果族文件在当前工程中没有加载的话则返回成功,如果已经加载过,则返回失败,也就是拿不到FamilySymbol实例,而根据族生成实例图元又需要这个FamilySymbol。网上看到有些帖子说可以传入IFamilyLoadOptions实例就可以,但是笔者多次尝试,该方法均没有成功,始终返回失败,无奈放弃这种方法,改为在当前工程中查找该族是否加载过,如果加载则直接返回FamilySymbol实例,否则加载族文件,下面贴出代码。

该代码在Revit 2016 + VS2013下调试通过:

public class CreateFamilyInstance : IExternalCommand
    {
        private class FamilyLoadOptions : IFamilyLoadOptions
        {
            public bool OnFamilyFound(bool familyInUse, out bool overwriteParameterValues)
            {
                overwriteParameterValues = true;  
                return true;
            }

            public bool OnSharedFamilyFound(Family sharedFamily, bool familyInUse, out FamilySource source, out bool overwriteParameterValues)
            {
                source = FamilySource.Family;
                overwriteParameterValues = true; 
                return true;
            }
        }

        private FamilySymbol FindFamilySymbol(Document rvtDoc, string familyName, string symbolName)
        {
            FilteredElementCollector collector = new FilteredElementCollector(rvtDoc);
            FilteredElementIterator itr = collector.OfClass(typeof(Family)).GetElementIterator();
            itr.Reset();
            while (itr.MoveNext())
            {
                Autodesk.Revit.DB.Element elem = (Autodesk.Revit.DB.Element)itr.Current;
                if (elem.GetType() == typeof(Autodesk.Revit.DB.Family))
                {
                    if (elem.Name == familyName)
                    {
                        Autodesk.Revit.DB.Family family = (Autodesk.Revit.DB.Family)elem;
                        foreach (Autodesk.Revit.DB.ElementId symbolId in family.GetFamilySymbolIds())
                        {
                            Autodesk.Revit.DB.FamilySymbol symbol = (Autodesk.Revit.DB.FamilySymbol)rvtDoc.GetElement(symbolId);
                            if (symbol.Name == symbolName)
                            {
                                return symbol;
                            }
                        }
                    }
                }
            }
            return null;
        }

        public Autodesk.Revit.UI.Result Execute(ExternalCommandData cmdData,
            ref string message, Autodesk.Revit.DB.ElementSet elements)
        {
            UIApplication app = cmdData.Application;
            Document doc = app.ActiveUIDocument.Document;
            Transaction trans = new Transaction(doc, "ExComm");
            trans.Start();
            Family fs = null;
            FamilySymbol symbol = null;
            doc.LoadFamily(@"C:\\ProgramData\\Autodesk\\RVT 2016\\Libraries\\China\\结构\\柱\\混凝土\\混凝土柱-T形.rfa",
                new FamilyLoadOptions(), out fs);
            if (fs != null)
            {
                foreach (ElementId symbolId in fs.GetFamilySymbolIds())
                {
                    Element elem = doc.GetElement(symbolId);
                    if (null != elem)
                    {
                        symbol = elem as FamilySymbol;
                        if (null != symbol)
                        {
                            TaskDialog.Show("Info", symbol.Name);
                            TaskDialog.Show("Info", symbol.FamilyName);

                            break;
                        }
                    }
                }
            }
            else
            {
                symbol = FindFamilySymbol(doc, "混凝土柱-T形", "标准");
                if (null != symbol)
                {
                    TaskDialog.Show("Info", symbol.Name);
                    TaskDialog.Show("Info", symbol.FamilyName);
                }                
            }            
            

            if (null != symbol)
            {
                if (!symbol.IsActive)
                    symbol.Activate();
                XYZ point = new XYZ(10, 10, 10);
                //创建族实例
                FamilyInstance fi = doc.Create.NewFamilyInstance(point, symbol,
                    Autodesk.Revit.DB.Structure.StructuralType.Column);
            }
            else
            {
                TaskDialog.Show("erorr", "FamilySymbol为空");
            }
            trans.Commit();

            return Autodesk.Revit.UI.Result.Succeeded;
        }
    }

  

以上是关于Revit API 加载族并生成实例图元的主要内容,如果未能解决你的问题,请参考以下文章

为 Revit 模型 (C4R) 发布和生成房间图元

revit中门构件属于啥图元

BIM入门实战Revit 图元分类有哪三种?Revit图元分类图文详解

BIM入门实战Revit 图元分类有哪三种?Revit图元分类图文详解

BIM入门实战Revit视图中图元看不见的原因总结

Revit 二次开发 图元过滤