//吊杆族实例化 private void createHangerRod(ModelLine modelLine, FamilySymbol familySymbol, ExternalCommandData commandData) { Document revitDoc = commandData.Application.ActiveUIDocument.Document; //取得文档 Application revitApp = commandData.Application.Application; //取得应用程序 UIDocument uiDoc = commandData.Application.ActiveUIDocument; //取得当前活动文档 //依据线创建一个包含这条线的面 XYZ p1 = modelLine.GeometryCurve.GetEndPoint(0); XYZ p2 = modelLine.GeometryCurve.GetEndPoint(1); XYZ LineVec = new XYZ(p1.X - p2.X, p1.Y - p2.Y, p1.Z - p2.Z); XYZ vectemp = new XYZ(1, 1, 1); XYZ normal = LineVec.CrossProduct(vectemp); Plane plane = Plane.CreateByNormalAndOrigin(normal, p1); SketchPlane sketchPlane = SketchPlane.Create(uiDoc.Document, plane); Reference reference = sketchPlane.GetPlaneReference(); //Line line = modelLine.GeometryCurve as Line; Line line = Line.CreateBound(p1, p2); FamilyInstance familyInstance = revitDoc.Create.NewFamilyInstance(reference, line, familySymbol); }
public void Execute(UIApplication uiapp) { try { UIDocument uidoc = uiapp.ActiveUIDocument; Document doc = uidoc.Document; using (Transaction tx = new Transaction(doc)) { tx.Start("EE06_PlaceFamily"); FamilySymbol myFamilySymbol_Platform = myMethod_CheckExistanceOfFamily(doc, myString_Family_Platform, myString_Type_Platform); if (myFamilySymbol_Platform == null) { return; } FamilySymbol myFamilySymbol_Chair = null; if (myBool_AlsoPlaceAChair) { myFamilySymbol_Chair = myMethod_CheckExistanceOfFamily(doc, myString_Family_Chair, myString_Type_Chair); if (myFamilySymbol_Chair == null) { return; } } Level myLevel = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Levels).WhereElementIsNotElementType().First() as Level; Reference pickedRef = null; XYZ myXYZ = null; try { SketchPlane sp = SketchPlane.Create(doc, myLevel.GetPlaneReference()); doc.ActiveView.SketchPlane = sp; // doc.ActiveView.ShowActiveWorkPlane(); //clearing existing command SetForegroundWindow(uidoc.Application.MainWindowHandle); myXYZ = uiapp.ActiveUIDocument.Selection.PickPoint(); pickedRef = sp.GetPlaneReference(); //pickedRef = uiapp.ActiveUIDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.PointOnElement, "Please select a Face"); } #region catch and finally catch (Exception ex) { } finally { } #endregion if (pickedRef == null) { return; } FamilyInstance myFamilyInstance_New = doc.Create.NewFamilyInstance(XYZ.Zero, myFamilySymbol_Platform, Autodesk.Revit.DB.Structure.StructuralType.NonStructural); doc.Regenerate(); IList <ElementId> placePointIds_1338 = AdaptiveComponentInstanceUtils.GetInstancePointElementRefIds(myFamilyInstance_New); ReferencePoint myReferencePoint_Centre = doc.GetElement(placePointIds_1338.First()) as ReferencePoint; //UV point_in_3d_UV = pickedRef.UVPoint; UV point_in_3d_UV = new UV(myXYZ.X, myXYZ.Y); PointOnPlane myPointOnPlane = uidoc.Application.Application.Create.NewPointOnPlane(doc.ActiveView.SketchPlane.GetPlaneReference(), point_in_3d_UV, UV.BasisU, 0.0); myReferencePoint_Centre.SetPointElementReference(myPointOnPlane); doc.Regenerate(); myReferencePoint_Centre.get_Parameter(BuiltInParameter.POINT_ELEMENT_DRIVEN).Set(0); ElementTransformUtils.MoveElement(doc, myReferencePoint_Centre.Id, myReferencePoint_Centre.GetCoordinateSystem().OfPoint(new XYZ(0, 0, 0.1)) - myReferencePoint_Centre.Position); if (myFamilySymbol_Chair != null) { GeometryElement myGeomeryElement = myFamilyInstance_New.get_Geometry(new Options() { ComputeReferences = true }); GeometryInstance myGeometryInstance = myGeomeryElement.First() as GeometryInstance; GeometryElement myGeomeryElementSymbol = myGeometryInstance.GetSymbolGeometry(); GeometryObject myGeometryObject = myGeomeryElementSymbol.Where(x => (x as Solid) != null).First(); PlanarFace myPlanarFace = ((Solid)myGeometryObject).Faces.get_Item(0) as PlanarFace; doc.Create.NewFamilyInstance(myPlanarFace, myReferencePoint_Centre.Position, myReferencePoint_Centre.GetCoordinateSystem().OfVector(new XYZ(1, 0, 0)), myFamilySymbol_Chair); } tx.Commit(); uidoc.Selection.SetElementIds(new List <ElementId>() { myReferencePoint_Centre.Id }); myWindow1.mySelectMethod(myIntUPDown); myIntUPDown.Value = myFamilyInstance_New.Id.IntegerValue; } myWindow1.setSlider(myWindow1.myIntUpDown_Middle2, myWindow1.mySlider_Rotate_BasisZ, false); myWindow1.setSlider(myWindow1.myIntUpDown_Middle2, myWindow1.mySlider_Rotate_BasisX, false); myWindow1.setSlider(myWindow1.myIntUpDown_Middle2, myWindow1.mySlider_Rotate_BasisY, true); } #region catch and finally catch (Exception ex) { _952_PRLoogleClassLibrary.DatabaseMethods.writeDebug("EE06_PlaceFamily" + Environment.NewLine + ex.Message + Environment.NewLine + ex.InnerException, true); } finally { } #endregion }
Result IExternalCommand.Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { Document revitDoc = commandData.Application.ActiveUIDocument.Document; //取得文档 Application revitApp = commandData.Application.Application; //取得应用程序 UIDocument uiDoc = commandData.Application.ActiveUIDocument; //取得当前活动文档 Window1 window1 = new Window1(); Color colorOrigin = new Color(0, 0, 0); FamilyInstance familyInstance = null; //窗口输入参数模块 if (window1.ShowDialog() == true) { //窗口打开并停留,只有点击按键之后,窗口关闭并返回true } //按键会改变window的属性,通过对属性的循环判断来实现对按键的监测 while (!window1.Done) { //选择横梁 if (window1.Selected) { Selection sel = uiDoc.Selection; Reference ref1 = sel.PickObject(ObjectType.Element, "选择一个横梁"); Element elem = revitDoc.GetElement(ref1); familyInstance = elem as FamilyInstance; using (Transaction tran = new Transaction(uiDoc.Document)) { tran.Start("创建吊杆模型线"); //改变选中实例轮廓颜色 colorOrigin = changeProfileColor(familyInstance, commandData); //创建吊杆所要用到的模型线 List <ModelLine> modelLines = createHangerROdModelLines(familyInstance, commandData); //注意此处模型线底部高度是随意设置的,到时候要进行修改 FamilySymbol familySymbol; //载入吊杆族 string file = @"C:\Users\zyx\Desktop\2RevitArcBridge\hangerRod\hangerRod\source\hangerRod.rfa"; familySymbol = loadFaimly(file, commandData); familySymbol.Activate(); ////创建族实例 //createHangerRod(modelLine, familySymbol, commandData); 创建基于线的族实例失效,但是已经定义好工作平面,此步可以通过手动实现 //创建并激活形成一个工作平面 XYZ p1 = modelLines[0].GeometryCurve.Evaluate(0, true); XYZ p2 = modelLines[0].GeometryCurve.Evaluate(1, true); XYZ p3 = modelLines[1].GeometryCurve.Evaluate(0, true); XYZ p4 = modelLines[1].GeometryCurve.Evaluate(1, true); XYZ vec1 = p1.Subtract(p4); XYZ vec2 = p2.Subtract(p3); XYZ normal = vec1.CrossProduct(vec2); Plane plane = Plane.CreateByNormalAndOrigin(normal, p1); SketchPlane sketchPlane = SketchPlane.Create(uiDoc.Document, plane); uiDoc.Document.ActiveView.SketchPlane = sketchPlane; uiDoc.Document.ActiveView.ShowActiveWorkPlane(); Reference reference = sketchPlane.GetPlaneReference(); tran.Commit(); } window1.Selected = false; } if (window1.ShowDialog() == true) { //窗口打开并停留,只有点击按键之后,窗口关闭并返回true } } //恢复轮廓线颜色 using (Transaction tran = new Transaction(uiDoc.Document)) { tran.Start("恢复轮廓线的颜色"); //恢复实例轮廓颜色 recoverProfileColor(familyInstance, colorOrigin, commandData); tran.Commit(); } return(Result.Succeeded); }