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;
        }
    }

  

转载于:https://www.cnblogs.com/laoxia/p/7750526.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值