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

      

  • 相关阅读:
    m113
    无题
    m102 SE赛
    m101 真*sb($huge 全场最瞎$)
    m100 的坑
    m99 然而并没有想出来标题!
    m98 lsc rp-- 赛
    csps2019AFO祭
    csps考前的一些总结(然而可能并没有用)
    低错总结
  • 原文地址:https://www.cnblogs.com/laoxia/p/7750526.html
Copyright © 2020-2023  润新知