Revit api 创建族并加载到当前项目

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 using Autodesk.Revit.UI;
  7 using Autodesk.Revit.DB;
  8 using Autodesk.Revit.Attributes;
  9 using Autodesk.Revit.ApplicationServices;
 10 
 11 
 12 namespace CreateFamily
 13 {
 14     [Transaction(TransactionMode.Manual)]
 15     public class Class1:IExternalCommand
 16     {
 17         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
 18         {
 19             string rftPath = @"C:\ProgramData\Autodesk\RVT 2016\Family Templates\Chinese\公制柱.rft";
 20             UIApplication uiapp = commandData.Application;
 21             Application app = uiapp.Application;
 22             UIDocument uidoc = commandData.Application.ActiveUIDocument;
 23             Document doc = uidoc.Document;
 24 
 25 
 26             //创建族文件
 27             Document faDoc = app.NewFamilyDocument(rftPath);
 28 
 29             Transaction trans = new Transaction(faDoc, "Create Family");
 30             trans.Start();
 31             FamilyManager manager = faDoc.FamilyManager;
 32             //添加材质参数
 33             FamilyParameter mfp = manager.AddParameter("材质", BuiltInParameterGroup.PG_MATERIALS, ParameterType.Material, false);
 34 
 35             //创建拉伸
 36             CurveArrArray arry = GetCurves();
 37             SketchPlane skplane = GetSketchPlane(faDoc);
 38             Extrusion extrusion = faDoc.FamilyCreate.NewExtrusion(true, arry, skplane, 4000 / 304.8);
 39             faDoc.Regenerate();
 40 
 41             //创建约束
 42             Reference topFaceRef = null;
 43             Options opt = new Options();
 44             opt.ComputeReferences = true;
 45             opt.DetailLevel = ViewDetailLevel.Fine;
 46             GeometryElement gelm = extrusion.get_Geometry(opt);
 47             foreach (GeometryObject gobj in gelm)
 48             {
 49                 if (gobj is Solid)
 50                 {
 51                     Solid s = gobj as Solid;
 52                     foreach (Face face in s.Faces)
 53                     {
 54                         if (face.ComputeNormal(new UV()).IsAlmostEqualTo(new XYZ(0, 0, 1)))
 55                         {
 56                             topFaceRef = face.Reference;
 57                         }
 58                     }
 59                  }
 60             }
 61             View v = GetView(faDoc);
 62             Reference r =GetTopLevel(faDoc);
 63             Dimension d = faDoc.FamilyCreate.NewAlignment(v, r, topFaceRef);
 64             d.IsLocked = true;
 65             faDoc.Regenerate();
 66 
 67             //关联材质参数
 68             Parameter p = extrusion.get_Parameter(BuiltInParameter.MATERIAL_ID_PARAM);
 69             manager.AssociateElementParameterToFamilyParameter(p, mfp);
 70 
 71 
 72             trans.Commit();
 73 
 74             Family fa = faDoc.LoadFamily(doc);
 75             faDoc.Close(false);
 76             trans = new Transaction(doc, "CreateColumn");
 77             trans.Start();
 78             fa.Name = "我的柱";
 79             trans.Commit();
 80             return Result.Succeeded;
 81         }
 82 
 83         private CurveArrArray GetCurves()
 84         {
 85             double len = 300 / 304.8;
 86 
 87             XYZ p1 = new XYZ(-len, -len, 0);
 88             XYZ p2 = new XYZ(len, -len, 0);
 89             XYZ p3 = new XYZ(len, len, 0);
 90             XYZ p4 = new XYZ(-len, len, 0);
 91 
 92             Line l1 = Line.CreateBound(p1, p2);
 93             Line l2 = Line.CreateBound(p2, p3);
 94             Line l3 = Line.CreateBound(p3, p4);
 95             Line l4 = Line.CreateBound(p4, p1);
 96             CurveArrArray ary = new CurveArrArray();
 97             CurveArray arry = new CurveArray();
 98             arry.Append(l1);
 99             arry.Append(l2);
100             arry.Append(l3);
101             arry.Append(l4);
102             ary.Append(arry);
103             return ary;
104         }
105 
106         private SketchPlane GetSketchPlane(Document doc)
107         {
108             FilteredElementCollector temc = new FilteredElementCollector(doc);
109             temc.OfClass(typeof(SketchPlane));
110             SketchPlane sketchPlane = temc.First(m => m.Name == "低于参照标高") as SketchPlane;
111             return sketchPlane;
112         }
113 
114         private View GetView(Document doc)
115         {
116             FilteredElementCollector viewFilter = new FilteredElementCollector(doc);
117             viewFilter.OfClass(typeof(View));
118             View v = viewFilter.First(m => m.Name == "") as View;
119             return v;
120         }
121 
122         private Reference GetTopLevel(Document doc)
123         {
124             FilteredElementCollector temc = new FilteredElementCollector(doc);
125             temc.OfClass(typeof(Level));
126             Level lvl = temc.First(m => m.Name == "高于参照标高") as Level;
127             return new Reference(lvl);
128         }
129     }
130 }

 

posted on 2018-01-07 20:52  小夏coding  阅读(1897)  评论(0编辑  收藏  举报

导航