1. 程式人生 > >Revit API 加載族並生成實例圖元

Revit API 加載族並生成實例圖元

next mes 但是 and 當前 結構 dialog ransac tid

在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 加載族並生成實例圖元