public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { UIApplication uiapp = commandData.Application; UIDocument uidoc = commandData.Application.ActiveUIDocument; Document doc = uidoc.Document; Selection sel = uidoc.Selection; View acview = uidoc.ActiveView; UIView acuiview = uidoc.ActiveUiview(); Transaction ts = new Transaction(doc, "******"); try { ts.Start(); //点选指定执行的元素, 本次按只能选择柱考虑 Reference pickedEleReference = sel.PickObject(ObjectType.Element, "选择个柱吧"); //通过引用取到选中的元素 Element element = doc.GetElement(pickedEleReference); FamilyInstance column = doc.GetElement(pickedEleReference) as FamilyInstance; string info = "提示如下:"; info += "\n\t" + "1 族类别ELEM_CATEGORY_PARAM_MT" + element.get_Parameter(BuiltInParameter.ELEM_CATEGORY_PARAM_MT).AsValueString(); TaskDialog.Show("提示", info); if (null != column) { Plane plane = Plane.CreateByNormalAndOrigin(XYZ.BasisX, XYZ.Zero); if (ElementTransformUtils.CanMirrorElement(doc, column.Id)) { ElementTransformUtils.MirrorElement(doc, column.Id, plane); } TaskDialog.Show("提示", "成功"); } else { TaskDialog.Show("提示", "失败"); } ts.Commit(); } catch (Exception) { if (ts.GetStatus() == TransactionStatus.Started) { ts.RollBack(); } } return(Result.Succeeded); }
public void MirrorWall(Document doc, Wall wall) { Reference reference = HostObjectUtils.GetSideFaces(wall, ShellLayerType.Exterior).First(); //get one of the wall's major side faces Face face = wall.GetGeometryObjectFromReference(reference) as Face; UV bboxMin = face.GetBoundingBox().Min; //create a plane based on the side face with an offset of 10 in the X & Y directions Plane plane = Plane.CreateByNormalAndOrigin(face.ComputeNormal(bboxMin), face.Evaluate(bboxMin).Add(new XYZ(10, 10, 0))); ElementTransformUtils.MirrorElement(doc, wall.Id, plane); }
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { UIDocument uidoc = commandData.Application.ActiveUIDocument; Document doc = uidoc.Document; Transaction t1 = new Transaction(doc, "创建"); t1.Start(); Wall wall = Wall.Create(doc, Line.CreateBound(new XYZ(), new XYZ(0, 10, 0)), Level.Create(doc, 0).Id, false); t1.Commit(); TaskDialog.Show("Tip", "结构墙已创建"); Transaction t2 = new Transaction(doc, "复制"); t2.Start(); ElementTransformUtils.CopyElement(doc, wall.Id, new XYZ(30, 30, 30)); t2.Commit(); TaskDialog.Show("Tip", "结构墙已复制"); Transaction t3 = new Transaction(doc, "移动"); t3.Start(); ElementTransformUtils.MoveElement(doc, wall.Id, new XYZ(10, 20, 10)); t3.Commit(); TaskDialog.Show("Tip", "移动"); Transaction t4 = new Transaction(doc, "镜像"); t4.Start(); Plane p1 = new Plane(new XYZ(0, -1, 0), XYZ.Zero); ElementTransformUtils.MirrorElement(doc, wall.Id, p1); t4.Commit(); TaskDialog.Show("tip", "结构墙已镜像"); return(Result.Succeeded); }
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { UIDocument uiDoc = commandData.Application.ActiveUIDocument; Document doc = uiDoc.Document; Transaction t1 = new Transaction(doc, "T1"); t1.Start(); Wall wall = Wall.Create(doc, Line.CreateBound(new XYZ(), new XYZ(0, 10, 0)), Level.Create(doc, 0).Id, false);//注意这里需要返回Id,而不是LevelId t1.Commit(); TaskDialog.Show("T1", wall.Id.ToString()); Transaction t2 = new Transaction(doc, "copy"); t2.Start(); ElementTransformUtils.CopyElement(doc, wall.Id, new XYZ(10, 0, 0)); t2.Commit(); TaskDialog.Show("T2", "Copy Successed!"); Transaction t3 = new Transaction(doc, "Move"); t3.Start(); ElementTransformUtils.MoveElement(doc, wall.Id, new XYZ(10, 20, 0)); t3.Commit(); TaskDialog.Show("T3", "移动完成"); Transaction t4 = new Transaction(doc, "Mirror"); t4.Start(); if (ElementTransformUtils.CanMirrorElement(doc, wall.Id)) { Plane pl = Plane.CreateByNormalAndOrigin(new XYZ(0, -1, 0), XYZ.Zero); ElementTransformUtils.MirrorElement(doc, wall.Id, pl); } t4.Commit(); TaskDialog.Show("T4", "Mirror !"); return(Result.Succeeded); }
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { //Hello World //TaskDialog.Show("VL title", "VL says Hello Revit"); var uiApp = commandData.Application; var app = commandData.Application.Application; var uiDoc = commandData.Application.ActiveUIDocument; var doc = commandData.Application.ActiveUIDocument.Document; #region 放置类型为"0762*2032 mm"的门 //首先通过类型过滤出 类型为门的族类型,找到名称相同的 string doorTypeName = "0762*2032 mm"; FamilySymbol doorType = null; var filter = new LogicalAndFilter( new ElementCategoryFilter(BuiltInCategory.OST_Doors), new ElementClassFilter(typeof(FamilySymbol)) ); var collector = new FilteredElementCollector(doc).WherePasses(filter); bool symbolFound = collector.FirstOrDefault(c => c.Name == doorTypeName) != null; //如果没有则通过文件加载族 if (symbolFound) { doorType = collector.FirstOrDefault(c => c.Name == doorTypeName) as FamilySymbol; } else { string file = @"familyFilePath"; Family family; if (doc.LoadFamily(file, out family)) { var validType = family.GetValidTypes().FirstOrDefault(c => { var symbol = (doc.GetElement(c) as FamilySymbol); if (symbol != null && symbol.Name == doorTypeName) { return(true); } return(false); }); if (validType != null) { doorType = doc.GetElement(validType) as FamilySymbol; symbolFound = true; } } } //使用族类型创建门 线性的门是有着LocationCurve的且LocationCurve.Curve为Line的元素 Wall wall = null; if (doorType != null) { Element element = new FilteredElementCollector(doc) .WherePasses(new ElementClassFilter(typeof(Wall))) .FirstOrDefault(c => { var locationCurve = c.Location as LocationCurve; if (locationCurve != null) { var line = locationCurve.Curve as Line; if (line != null) { return(true); } return(false); } return(false); }); if (element != null) { wall = element as Wall; } } //在墙的中心创建一个门 if (wall != null) { var line = (wall.Location as LocationCurve).Curve as Line; var wallLevel = doc.GetElement(wall.LevelId) as Level; XYZ midPoint = (line.GetEndPoint(0) + line.GetEndPoint(1)) / 2; var structureType = Autodesk.Revit.DB.Structure.StructuralType.NonStructural; FamilyInstance door = doc.Create.NewFamilyInstance(midPoint, doorType, wall, wallLevel, structureType); } #endregion #region 制墙类型 var wallElementId = 1111; wall = doc.GetElement(new ElementId(wallElementId)) as Wall; if (wall != null) { var wallType = wall.WallType; ElementType duplicatedType = wallType.Duplicate(wall.Name + "duplicated"); } #endregion #region 元素移动 VLTransactionHelper.DelegateTransaction(doc, "创建一根柱子", () => { //Revit文档的创建句柄 Autodesk.Revit.Creation.Document creator = doc.Create; XYZ origin = new XYZ(0, 0, 0); Level level = doc.GetElement(new ElementId(12122)) as Level; FamilySymbol columnType = doc.GetElement(new ElementId(12123)) as FamilySymbol; var structureType = Autodesk.Revit.DB.Structure.StructuralType.Column; FamilyInstance column = creator.NewFamilyInstance(origin, columnType, level, structureType); XYZ newPlace = new XYZ(10, 20, 30); ElementTransformUtils.MoveElement(doc, column.Id, newPlace); return(true); }); #endregion #region ElementTransformUtils //ElementTransformUtils.CopyElement(); //ElementTransformUtils.CopyElements(); //ElementTransformUtils.MirrorElement(); //ElementTransformUtils.MirrorElements(); //ElementTransformUtils.MoveElement(); //ElementTransformUtils.MoveElements(); //ElementTransformUtils.RotateElement(); //ElementTransformUtils.RotateElements(); #endregion #region 元素旋转 VLTransactionHelper.DelegateTransaction(doc, "ElementTransformUtils旋转方法", () => { LocationCurve wallLine = wall.Location as LocationCurve; XYZ p1 = wallLine.Curve.GetEndPoint(0); XYZ p2 = new XYZ(p1.X, p1.Y, 30); Line axis = Line.CreateBound(p1, p2); ElementTransformUtils.RotateElement(doc, wall.Id, axis, Math.PI / 3);//逆时针60° return(true); }); VLTransactionHelper.DelegateTransaction(doc, "LocationCurve,LocationPoint,自带的旋转方法", () => { LocationCurve locationCurve = wall.Location as LocationCurve;//线性坐标自带线 if (locationCurve != null) { Curve curve = locationCurve.Curve; var start = curve.GetEndPoint(0); Line axis = Line.CreateBound(start, start.Add(new XYZ(0, 0, 10))); locationCurve.Rotate(axis, Math.PI);//PI=180° } LocationPoint locationPoint = wall.Location as LocationPoint; if (locationPoint != null) { var start = locationPoint.Point; Line axis = Line.CreateBound(start, start.Add(new XYZ(0, 0, 10))); locationPoint.Rotate(axis, Math.PI); } return(true); }); #endregion #region 元素镜像 VLTransactionHelper.DelegateTransaction(doc, "元素镜像", () => { Plane plane = new Plane(XYZ.BasisX, XYZ.Zero); if (ElementTransformUtils.CanMirrorElement(doc, wall.Id)) { ElementTransformUtils.MirrorElement(doc, wall.Id, plane); } return(true); }); #endregion #region 元素删除 //var deleteElements = Document.Delete(@ElementIds); #endregion #region 元素组合 VLTransactionHelper.DelegateTransaction(doc, "元素组合", () => { List <ElementId> elementIds = new List <ElementId>() { new ElementId(1000), new ElementId(1001), new ElementId(1002), }; Group group = doc.Create.NewGroup(elementIds); return(true); }); #endregion #region 元素编辑 VLTransactionHelper.DelegateTransaction(doc, "创建参照平面", () => { XYZ bubbleEnd = new XYZ(0, 5, 5); XYZ freeEnd = new XYZ(5, 5, 5); XYZ cutVector = XYZ.BasisY; View view = doc.ActiveView; ReferencePlane referencePlane = doc.FamilyCreate.NewReferencePlane(bubbleEnd, freeEnd, cutVector, view); referencePlane.Name = "MyReferencePlane"; return(true); }); VLTransactionHelper.DelegateTransaction(doc, "创建参照线,由模型线-转>参照线", () => { ModelCurve modelCurve = doc.GetElement(new ElementId(1000)) as ModelCurve;//ModelCurve模型线 modelCurve.ChangeToReferenceLine(); //modelCurve.IsReferenceLine; return(true); }); VLTransactionHelper.DelegateTransaction(doc, "通过标高创建草图平面,然后在草图平面创建模型线", () => { Level level = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Levels).FirstOrDefault() as Level; Line line = Line.CreateBound(XYZ.Zero, new XYZ(10, 10, 0)); SketchPlane sketchPlane = SketchPlane.Create(doc, level.Id); ModelCurve modelLine = doc.FamilyCreate.NewModelCurve(line, sketchPlane); return(true); }); VLTransactionHelper.DelegateTransaction(doc, "使用拉身体获取相应的草图平面", () => { Extrusion extrusion = doc.GetElement(new ElementId(11212)) as Extrusion; SketchPlane sketchPlane = extrusion.Sketch.SketchPlane; CurveArrArray sketchProfile = extrusion.Sketch.Profile; return(true); }); #endregion #region 族 string tagName = "梁平法_集中标_左对齐"; FamilySymbol tagSymbol = null; //查找族类型 var symbols = new FilteredElementCollector(doc) .WherePasses(new ElementClassFilter(typeof(FamilySymbol))) .WherePasses(new ElementCategoryFilter(BuiltInCategory.OST_StructuralFramingTags)); var targetSymbol = symbols.FirstOrDefault(c => c.Name == tagName); if (targetSymbol != null) { tagSymbol = targetSymbol as FamilySymbol; } //空时加载族类型 if (tagSymbol == null) { var symbolFile = @"E:\WorkingSpace\Tasks\0526标注\梁平法_集中标_左对齐.rfa"; Family family; if (doc.LoadFamily(symbolFile, out family)) { foreach (ElementId typeId in family.GetValidTypes()) { var validType = doc.GetElement(typeId) as FamilySymbol; if (validType != null && validType.Name == tagName) { tagSymbol = validType; break; } } } else { TaskDialogShow("加载族文件失败"); } } //如果上述两者获取到了对应的族 if (tagSymbol != null) { //doc.Create.NewFamilyInstance(, tagSymbol); } #endregion #region 建筑建模 VLTransactionHelper.DelegateTransaction(doc, "修改标高的基面", () => { var levelId = 111; Level level = doc.GetElement(new ElementId(levelId)) as Level; LevelType levelType = doc.GetElement(level.GetTypeId()) as LevelType; return(true); }); #endregion return(Result.Succeeded); }
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { UIDocument uidoc = commandData.Application.ActiveUIDocument; Autodesk.Revit.DB.Document doc = uidoc.Document; Transaction trans = new Transaction(doc); trans.Start("交易開始"); //訂定土體範圍 List <XYZ> topxyz = new List <XYZ>(); XYZ t1 = new XYZ(-200, -200, 0); XYZ t2 = new XYZ(200, -200, 0); XYZ t3 = new XYZ(200, 200, 0); XYZ t4 = new XYZ(-200, 200, 0); topxyz.Add(t1 * 1000 / 304.8); topxyz.Add(t2 * 1000 / 304.8); topxyz.Add(t3 * 1000 / 304.8); topxyz.Add(t4 * 1000 / 304.8); TopographySurface.Create(doc, topxyz); //開挖深度所需參數 FilteredElementCollector collector = new FilteredElementCollector(doc); collector.OfClass(typeof(BuildingPadType)); BuildingPadType bdtp = collector.FirstElement() as BuildingPadType; csv_read csv = new csv_read(); csv.Main(); //開挖各階之深度輸入 List <double> height = new List <double>(); foreach (var data in csv.excaLevel) { height.Add(data.Item2 * -1); } //建立開挖階數 Level[] levlist = new Level[height.Count()]; for (int i = 0; i != height.Count(); i++) { levlist[i] = Level.Create(doc, height[i] * 1000 / 304.8); levlist[i].Name = "開挖階數" + (i + 1).ToString(); } double wallLength = csv.Wall_length; Level DW_level = Level.Create(doc, wallLength * -1 * 1000 / 304.8); //建立回築樓層 Level[] re_levlist = new Level[csv.back.Count()]; for (int i = 0; i != csv.back.Count(); i++) { re_levlist[i] = Level.Create(doc, (csv.back[i].Item2 * -1 + csv.back[i].Item3 / (2)) * 1000 / 304.8); re_levlist[i].Name = (csv.back[i].Item1).ToString(); } Level[] all_level_list = new Level[levlist.Count() + re_levlist.Count()]; all_level_list = levlist.Concat(re_levlist).ToArray(); //訂定開挖範圍 IList <CurveLoop> profileloops = new List <CurveLoop>(); IList <Curve> wall_profileloops = new List <Curve>(); //須回到原點 XYZ[] points = new XYZ[csv.excaRange.Count()]; for (int i = 0; i != csv.excaRange.Count(); i++) { points[i] = new XYZ(csv.excaRange[i].Item1, csv.excaRange[i].Item2, 0) * 1000 / 304.8; } CurveLoop profileloop = new CurveLoop(); for (int i = 0; i < points.Count() - 1; i++) { Line line = Line.CreateBound(points[i], points[i + 1]); wall_profileloops.Add(line); profileloop.Append(line); } profileloops.Add(profileloop); Level levdeep = null; //建立開挖深度 ICollection <Level> level_familyinstance = new FilteredElementCollector(doc).OfClass(typeof(Level)).Cast <Level>().ToList(); foreach (Level lev in level_familyinstance) { if (lev.Name == levlist[levlist.Count() - 1].Name) { BuildingPad b = BuildingPad.Create(doc, bdtp.Id, lev.Id, profileloops); levdeep = lev; } } //建立連續壁 IList <Curve> inner_wall_curves = new List <Curve>(); double wall_W = csv.Wall_width * 1000; //連續壁厚度 List <Wall> inner_wall = new List <Wall>(); ICollection <WallType> walltype_familyinstance = new FilteredElementCollector(doc).OfClass(typeof(WallType)).Cast <WallType>().ToList(); foreach (WallType walltype in walltype_familyinstance) { if (walltype.Name == "連續壁") { for (int i = 0; i < points.Count <XYZ>() - 1; i++) { Curve c = wall_profileloops[i].CreateOffset(wall_W / 2 / 304.8, new XYZ(0, 0, -1)); //偏移連續壁厚度1/2的距離,做為建置參考線 Wall w = Wall.Create(doc, c, walltype.Id, DW_level.Id, wallLength * 1000 / 304.8, 0, false, false); w.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS).Set("連續壁"); inner_wall.Add(w); } } } trans.Commit(); //取得連續壁內座標點 XYZ[] innerwall_points = new XYZ[points.Count <XYZ>()]; XYZ[] for_check_innerwall_points = new XYZ[points.Count <XYZ>()]; //計算支撐中間樁之擺放界線 for (int i = 0; i < (inner_wall.Count <Wall>()); i++) { //inner XYZ wall_curve_point = (inner_wall[i].Location as LocationCurve).Curve.Tessellate()[0]; wall_curve_point = new XYZ(wall_curve_point.X, wall_curve_point.Y, 0); innerwall_points[i] = points[i] - (points[i] - wall_curve_point) * 2; for_check_innerwall_points[i] = points[i] - (points[i] - wall_curve_point) * 1.4; //計算支撐中間樁之擺放界線 } innerwall_points[points.Count <XYZ>() - 1] = innerwall_points[0]; for_check_innerwall_points[points.Count <XYZ>() - 1] = for_check_innerwall_points[0]; //取得側牆profile IList <CurveLoop> bdtpCurve = new List <CurveLoop>(); IList <Curve> side_wall_profileloops = new List <Curve>(); CurveLoop bdtploop = new CurveLoop(); for (int i = 0; i < innerwall_points.Count() - 1; i++) { Line line = Line.CreateBound(innerwall_points[i], innerwall_points[i + 1]); side_wall_profileloops.Add(line); bdtploop.Append(line); } //trans.commit(); trans.Start("inner_buildingpad"); // /* bdtpCurve.Add(bdtploop); //建立開挖深度 ICollection <Level> level_family = new FilteredElementCollector(doc).OfClass(typeof(Level)).Cast <Level>().ToList(); foreach (Level lev in level_family) { if (lev.Name == levlist[levlist.Count() - 1].Name) { BuildingPad b = BuildingPad.Create(doc, bdtp.Id, lev.Id, bdtpCurve); //b.get_Parameter(BuiltInParameter.) //b.LookupParameter("厚度").SetValueString("1"); levdeep = lev; } } // */ trans.Commit(); trans.Start("side_wall"); //建立側牆 List <Wall> side_wall = new List <Wall>(); foreach (WallType walltype in walltype_familyinstance) { if (walltype.Name == "側牆") { for (int i = 0; i < csv.sidewall.Count; i++) { double floor_width = csv.back[i].Item3 * 1000 / 304.8; //set the width to a new value double floor_deep = -csv.back[i].Item2 * 1000 / 304.8; double floor_bottom = (floor_deep + floor_width / 2); //側牆底部高程點(考慮厚度做offset後-往上半個厚度) double floor_top = (csv.back[i + 1].Item2 + csv.back[i + 1].Item3 / 2) * 1000 / 304.8; //側牆頂部高程點(考慮厚度做offset後-往下半個厚度) for (int j = 0; j < points.Count <XYZ>() - 1; j++) { Curve side_c = side_wall_profileloops[j].CreateOffset((csv.sidewall[i].Item2 * 1000 / 2) / 304.8, new XYZ(0, 0, -1)); //此步驟為偏移擋土牆厚度1/2距離,作為建置參考線 Wall side_w = Wall.Create(doc, side_c, walltype.Id, re_levlist[i].Id, (floor_bottom * (-1) - floor_top), 0, false, false); side_w.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS).Set(csv.sidewall[i].Item1 + "側牆"); side_wall.Add(side_w); } } } } trans.Commit(); //取得側牆牆點座標 CurveArray profileloops_array = new CurveArray(); XYZ[] sidewall_points = new XYZ[points.Count <XYZ>()]; for (int i = 0; i < (inner_wall.Count <Wall>()); i++) { //side XYZ side_wall_curve_point = (side_wall[i].Location as LocationCurve).Curve.Tessellate()[0]; side_wall_curve_point = new XYZ(side_wall_curve_point.X, side_wall_curve_point.Y, 0); sidewall_points[i] = innerwall_points[i] - (innerwall_points[i] - side_wall_curve_point) * 2; } sidewall_points[points.Count <XYZ>() - 1] = sidewall_points[0]; //建立底板範圍 for (int i = 0; i < points.Count() - 1; i++) { Line line = Line.CreateBound(innerwall_points[i], innerwall_points[i + 1]); profileloops_array.Append(line); } trans.Start("建立底板"); //建立底板類型及實作元件 ICollection <FloorType> family = new FilteredElementCollector(doc).OfClass(typeof(FloorType)).Cast <FloorType>().ToList(); FloorType floor_type = family.Where(x => x.Name == "通用 300mm").First(); int base_control = 0; foreach (Tuple <string, double, double, double> base_tuple in csv.back) { FloorType newFamSym = null; try { newFamSym = floor_type.Duplicate(base_tuple.Item1) as FloorType; } catch { newFamSym = family.Where(x => x.Name == base_tuple.Item1).First(); } double floor_width = base_tuple.Item3 * 1000 / 304.8; //set the width to a new value double floor_deep = base_tuple.Item2 * -1 * 1000 / 304.8; double floor_offset = (floor_deep + floor_width / 2) * 304.8; newFamSym.GetCompoundStructure().GetLayers()[0].Width = floor_width; CompoundStructure ly = newFamSym.GetCompoundStructure(); ly.SetLayerWidth(0, floor_width); newFamSym.SetCompoundStructure(ly); Floor floor = doc.Create.NewFloor(profileloops_array, newFamSym as FloorType, re_levlist[base_control], false); floor.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS).Set(base_tuple.Item1); floor.get_Parameter(BuiltInParameter.FLOOR_HEIGHTABOVELEVEL_PARAM).SetValueString("0"); base_control += 1; } trans.Commit(); //取得所有XY數值 List <double> Xs = new List <double>(); List <double> Ys = new List <double>(); double[] slope = new double[inner_wall.Count <Wall>()]; double[] bias = new double[inner_wall.Count <Wall>()]; for (int i = 0; i < (innerwall_points.Count <XYZ>()); i++) { Xs.Add(innerwall_points[i].X); Ys.Add(innerwall_points[i].Y); if (i < slope.Count()) { if (innerwall_points[i + 1].X - innerwall_points[i].X == 0) { slope[i] = 20172018; bias[i] = innerwall_points[i + 1].X; } else { slope[i] = (innerwall_points[i + 1].Y - innerwall_points[i].Y) / (innerwall_points[i + 1].X - innerwall_points[i].X); if (slope[i] == 0 || Math.Abs(slope[i]) < 0.0000001) { bias[i] = innerwall_points[i + 1].Y; } else { bias[i] = innerwall_points[i + 1].Y - slope[i] * innerwall_points[i + 1].X; } } } } Transaction trans_2 = new Transaction(doc); trans_2.Start("交易開始"); //開始建立中間樁 double columns_dis = csv.centralCol[0].Item1 * 1000 / 304.8; //中間樁間距 ICollection <FamilySymbol> columns_familyinstance = new FilteredElementCollector(doc).OfClass(typeof(FamilySymbol)).Cast <FamilySymbol>().ToList(); foreach (FamilySymbol column_type in columns_familyinstance) { if (column_type.Name == "中間樁") { for (int j = 0; j < (Math.Abs(Ys.Max() - Ys.Min()) / columns_dis - 1); j++) { for (int i = 0; i < (Math.Abs(Xs.Max() - Xs.Min()) / columns_dis - 1); j++) { XYZ column_location = new XYZ(Xs.Min() + (i + 1) * columns_dis, Ys.Min() + (j + 1) * columns_dis, 0); if (IsInPolygon(column_location, innerwall_points) == true) { //TaskDialog.Show("asd", "asd"); FamilyInstance column_instance = doc.Create.NewFamilyInstance(column_location, column_type, levdeep, Autodesk.Revit.DB.Structure.StructuralType.Column); column_instance.get_Parameter(BuiltInParameter.FAMILY_TOP_LEVEL_OFFSET_PARAM).SetValueString("0"); //中間樁長度 column_instance.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS).Set("中間樁"); } } } } } //迴圈起始點 for (int lev = 0; lev != csv.supLevel.Count(); lev++) { //建立圍囹 //開始建立圍囹 ICollection <FamilySymbol> beam_familyinstance = new FilteredElementCollector(doc).OfClass(typeof(FamilySymbol)).Cast <FamilySymbol>().ToList(); foreach (FamilySymbol beam_type in beam_familyinstance) { if (beam_type.Name == "H100x100") { double beam_H = double.Parse(beam_type.LookupParameter("H").AsValueString()); double beam_B = double.Parse(beam_type.LookupParameter("B").AsValueString()); for (int i = 0; i < innerwall_points.Count <XYZ>() - 1; i++) { Curve c = null; if (i == points.Count <XYZ>()) { try { int.Parse(csv.supLevel[lev].Item1.ToString()); c = Line.CreateBound(innerwall_points[i], innerwall_points[0]).CreateOffset((beam_H) / 304.8, new XYZ(0, 0, -1)); } catch { c = Line.CreateBound(sidewall_points[i], sidewall_points[0]).CreateOffset((beam_H) / 304.8, new XYZ(0, 0, -1)); } } else { try { int.Parse(csv.supLevel[lev].Item1.ToString()); c = Line.CreateBound(innerwall_points[i], innerwall_points[i + 1]).CreateOffset((beam_H) / 304.8, new XYZ(0, 0, -1)); } catch { c = Line.CreateBound(sidewall_points[i], sidewall_points[i + 1]).CreateOffset((beam_H) / 304.8, new XYZ(0, 0, -1)); } } FamilyInstance beam = doc.Create.NewFamilyInstance(c, beam_type, levlist[0], Autodesk.Revit.DB.Structure.StructuralType.Beam); beam.LookupParameter("斷面旋轉").SetValueString("90"); StructuralFramingUtils.DisallowJoinAtEnd(beam, 0); StructuralFramingUtils.DisallowJoinAtEnd(beam, 1); beam.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS).Set((csv.supLevel[lev].Item1).ToString() + "-圍囹"); //判斷圍囹之垂直深度,斜率零為負,反之為正 if ((i % 2 == 0)) { beam.get_Parameter(BuiltInParameter.Y_OFFSET_VALUE).SetValueString((csv.supLevel[lev].Item2 * 1000 - beam_B / 2).ToString()); //2000為支撐階數深度,表1中 } else { beam.get_Parameter(BuiltInParameter.Y_OFFSET_VALUE).SetValueString((csv.supLevel[lev].Item2 * 1000 + beam_B / 2).ToString()); } } } } //開始建立支撐 //建立支撐 XYZ frame_startpoint = null; XYZ frame_endpoint = null; ICollection <FamilySymbol> frame_familyinstance = new FilteredElementCollector(doc).OfClass(typeof(FamilySymbol)).Cast <FamilySymbol>().ToList(); foreach (FamilySymbol frame_type in frame_familyinstance) { if (frame_type.Name == "H100x100") { double frame_H = double.Parse(frame_type.LookupParameter("H").AsValueString()); //X向支撐 for (int j = 0; j < Math.Abs(Ys.Max() - Ys.Min()) / columns_dis - 1; j++) { for (int i = 0; i < Math.Abs(Xs.Max() - Xs.Min()) / columns_dis - 1; i++) { XYZ frame_location = new XYZ(Xs.Min() + (i + 1) * columns_dis, Ys.Min() + (j + 1) * columns_dis, 0); frame_startpoint = intersection(frame_location, for_check_innerwall_points, slope, bias, true)[0]; if (IsInPolygon(frame_location, innerwall_points) == true) { try { frame_endpoint = intersection(frame_location, for_check_innerwall_points, slope, bias, true)[1]; Line line = Line.CreateBound(frame_startpoint, frame_endpoint); FamilyInstance frame_instance = doc.Create.NewFamilyInstance(line, frame_type, levdeep, Autodesk.Revit.DB.Structure.StructuralType.Beam); frame_instance.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS).Set((csv.supLevel[lev].Item1).ToString() + "-支撐"); //處理偏移與延伸問題 frame_instance.get_Parameter(BuiltInParameter.Z_OFFSET_VALUE).SetValueString((csv.supLevel[lev].Item2 * -1000).ToString()); frame_instance.get_Parameter(BuiltInParameter.Y_OFFSET_VALUE).SetValueString((-frame_H).ToString()); try { int.Parse(csv.supLevel[lev].Item1.ToString()); frame_instance.get_Parameter(BuiltInParameter.START_EXTENSION).SetValueString((-frame_H).ToString()); frame_instance.get_Parameter(BuiltInParameter.END_EXTENSION).SetValueString((-frame_H).ToString()); } catch { frame_instance.get_Parameter(BuiltInParameter.START_EXTENSION).SetValueString((-frame_H - csv.sidewall[0].Item2 * 1000).ToString()); frame_instance.get_Parameter(BuiltInParameter.END_EXTENSION).SetValueString((-frame_H - csv.sidewall[0].Item2 * 1000).ToString()); } //取消接合 StructuralFramingUtils.DisallowJoinAtEnd(frame_instance, 0); StructuralFramingUtils.DisallowJoinAtEnd(frame_instance, 1); //若為雙向支撐,則鏡射支撐 if (csv.supLevel[lev].Item3 == 2) { ElementTransformUtils.MirrorElement(doc, frame_instance.Id, Plane.CreateByNormalAndOrigin(XYZ.BasisY, frame_startpoint)); } break; } catch { } } } } //Y向支撐 for (int i = 0; i < (Math.Abs(Xs.Max() - Xs.Min()) / columns_dis - 1); i++) { for (int j = 0; j < (Math.Abs(Ys.Max() - Ys.Min()) / columns_dis - 1); j++) { XYZ frame_location = new XYZ(Xs.Min() + (i + 1) * columns_dis, Ys.Min() + (1 + j) * columns_dis, 0); frame_startpoint = intersection(frame_location, for_check_innerwall_points, slope, bias, false)[0]; if (IsInPolygon(frame_location, innerwall_points) == true) { try { frame_endpoint = intersection(frame_location, for_check_innerwall_points, slope, bias, false)[1]; Line line = Line.CreateBound(frame_startpoint, frame_endpoint); FamilyInstance frame_instance = doc.Create.NewFamilyInstance(line, frame_type, levdeep, Autodesk.Revit.DB.Structure.StructuralType.Beam); frame_instance.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS).Set((csv.supLevel[lev].Item1).ToString() + "-支撐"); //處理偏移與延伸問題 frame_instance.get_Parameter(BuiltInParameter.Z_OFFSET_VALUE).SetValueString((csv.supLevel[lev].Item2 * -1000 + frame_H).ToString());//2000為支撐階數深度,表1中 frame_instance.get_Parameter(BuiltInParameter.Y_OFFSET_VALUE).SetValueString((-frame_H).ToString()); try { int.Parse(csv.supLevel[lev].Item1.ToString()); frame_instance.get_Parameter(BuiltInParameter.START_EXTENSION).SetValueString((-frame_H).ToString()); frame_instance.get_Parameter(BuiltInParameter.END_EXTENSION).SetValueString((-frame_H).ToString()); } catch { frame_instance.get_Parameter(BuiltInParameter.START_EXTENSION).SetValueString((-frame_H - csv.sidewall[0].Item2 * 1000).ToString()); frame_instance.get_Parameter(BuiltInParameter.END_EXTENSION).SetValueString((-frame_H - csv.sidewall[0].Item2 * 1000).ToString()); } //取消接合 StructuralFramingUtils.DisallowJoinAtEnd(frame_instance, 0); StructuralFramingUtils.DisallowJoinAtEnd(frame_instance, 1); //若為雙向支撐,則鏡射支撐 if (csv.supLevel[lev].Item3 == 2) { ElementTransformUtils.MirrorElement(doc, frame_instance.Id, Plane.CreateByNormalAndOrigin(XYZ.BasisX, frame_startpoint)); } break; } catch { } } } } } } //建立斜撐 ICollection <FamilySymbol> slopframe_symbol = new FilteredElementCollector(doc).OfClass(typeof(FamilySymbol)).Cast <FamilySymbol>().ToList(); foreach (FamilySymbol slopframe_type in slopframe_symbol) { if (slopframe_type.Name == "斜撐") { //X向斜撐 for (int j = 0; j < (Math.Abs(Ys.Max() - Ys.Min()) / columns_dis - 1); j++) { for (int i = 0; i < (Math.Abs(Xs.Max() - Xs.Min()) / columns_dis - 1); i++) { XYZ frame_location = new XYZ(Xs.Min() + (i + 1) * columns_dis, Ys.Min() + (j + 1) * columns_dis, 0); frame_startpoint = intersection(frame_location, for_check_innerwall_points, slope, bias, true)[0]; if (IsInPolygon(frame_location, innerwall_points) == true) { frame_endpoint = intersection(frame_location, for_check_innerwall_points, slope, bias, true)[1]; FamilyInstance slopframe_1 = doc.Create.NewFamilyInstance(frame_startpoint, slopframe_type, all_level_list[lev], Autodesk.Revit.DB.Structure.StructuralType.Beam); FamilyInstance slopframe_2 = doc.Create.NewFamilyInstance(frame_endpoint, slopframe_type, all_level_list[lev], Autodesk.Revit.DB.Structure.StructuralType.Beam); slopframe_1.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS).Set((csv.supLevel[lev].Item1).ToString() + "-斜撐"); slopframe_2.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS).Set((csv.supLevel[lev].Item1).ToString() + "-斜撐"); slopframe_1.get_Parameter(BuiltInParameter.INSTANCE_FREE_HOST_OFFSET_PARAM).Set(Math.Abs(all_level_list[lev].Elevation - csv.supLevel[lev].Item2 * -1000 / 304.8 + slopframe_1.LookupParameter("支撐厚度").AsDouble() / 2)); slopframe_2.get_Parameter(BuiltInParameter.INSTANCE_FREE_HOST_OFFSET_PARAM).Set(Math.Abs(all_level_list[lev].Elevation - csv.supLevel[lev].Item2 * -1000 / 304.8 + slopframe_1.LookupParameter("支撐厚度").AsDouble() / 2)); int o; if (int.TryParse(csv.supLevel[lev].Item1, out o) == false)//305為圍囹寬度,應該要查表而非指定。 { slopframe_1.LookupParameter("圍囹寬度").SetValueString((305 + csv.sidewall[0].Item2 * 1000).ToString()); slopframe_2.LookupParameter("圍囹寬度").SetValueString((305 + csv.sidewall[0].Item2 * 1000).ToString()); } else { slopframe_1.LookupParameter("圍囹寬度").SetValueString((305).ToString()); slopframe_2.LookupParameter("圍囹寬度").SetValueString((305).ToString()); } //旋轉斜撐元件 Line rotate_line_s = Line.CreateBound(frame_startpoint, frame_startpoint + new XYZ(0, 0, 1)); Line rotate_line_e = Line.CreateBound(frame_endpoint, frame_endpoint + new XYZ(0, 0, 1)); slopframe_1.Location.Rotate(rotate_line_s, 1.5 * Math.PI); slopframe_2.Location.Rotate(rotate_line_e, 0.5 * Math.PI); //鏡射斜撐元件 if (csv.supLevel[lev].Item3 == 2)//雙排 { ElementTransformUtils.MirrorElement(doc, slopframe_1.Id, Plane.CreateByNormalAndOrigin(XYZ.BasisY, frame_startpoint)); ElementTransformUtils.MirrorElement(doc, slopframe_2.Id, Plane.CreateByNormalAndOrigin(XYZ.BasisY, frame_endpoint)); } else//單排 { ElementTransformUtils.MirrorElement(doc, slopframe_1.Id, Plane.CreateByNormalAndOrigin(XYZ.BasisY, frame_startpoint.Add(new XYZ(0, -(slopframe_1.LookupParameter("支撐厚度").AsDouble() / 2 + slopframe_1.LookupParameter("中間樁直徑").AsDouble() / 2), 0)))); ElementTransformUtils.MirrorElement(doc, slopframe_2.Id, Plane.CreateByNormalAndOrigin(XYZ.BasisY, frame_endpoint)); slopframe_2.Location.Move((new XYZ(0, -(slopframe_1.LookupParameter("支撐厚度").AsDouble() + slopframe_1.LookupParameter("中間樁直徑").AsDouble()), 0))); } break; } } } //Y向斜撐 for (int i = 0; i < (Math.Abs(Xs.Max() - Xs.Min()) / columns_dis - 1); i++) { for (int j = 0; j < (Math.Abs(Ys.Max() - Ys.Min()) / columns_dis - 1); j++) { XYZ frame_location = new XYZ(Xs.Min() + (i + 1) * columns_dis, Ys.Min() + (1 + j) * columns_dis, 0); frame_startpoint = intersection(frame_location, for_check_innerwall_points, slope, bias, false)[0]; if (IsInPolygon(frame_location, innerwall_points) == true) { frame_endpoint = intersection(frame_location, for_check_innerwall_points, slope, bias, false)[1]; FamilyInstance slopframe_1 = doc.Create.NewFamilyInstance(frame_startpoint, slopframe_type, all_level_list[lev], Autodesk.Revit.DB.Structure.StructuralType.Beam); FamilyInstance slopframe_2 = doc.Create.NewFamilyInstance(frame_endpoint, slopframe_type, all_level_list[lev], Autodesk.Revit.DB.Structure.StructuralType.Beam); slopframe_1.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS).Set((csv.supLevel[lev].Item1).ToString() + "-斜撐"); slopframe_2.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS).Set((csv.supLevel[lev].Item1).ToString() + "-斜撐"); slopframe_1.get_Parameter(BuiltInParameter.INSTANCE_FREE_HOST_OFFSET_PARAM).Set(Math.Abs(all_level_list[lev].Elevation - csv.supLevel[lev].Item2 * -1000 / 304.8 - slopframe_1.LookupParameter("支撐厚度").AsDouble() / 2)); slopframe_2.get_Parameter(BuiltInParameter.INSTANCE_FREE_HOST_OFFSET_PARAM).Set(Math.Abs(all_level_list[lev].Elevation - csv.supLevel[lev].Item2 * -1000 / 304.8 - slopframe_2.LookupParameter("支撐厚度").AsDouble() / 2)); int o; if (int.TryParse(csv.supLevel[lev].Item1, out o) == false)//305為圍囹寬度,應該要查表而非指定。 { slopframe_1.LookupParameter("圍囹寬度").SetValueString((305 + csv.sidewall[0].Item2 * 1000).ToString()); slopframe_2.LookupParameter("圍囹寬度").SetValueString((305 + csv.sidewall[0].Item2 * 1000).ToString()); } else { slopframe_1.LookupParameter("圍囹寬度").SetValueString((305).ToString()); slopframe_2.LookupParameter("圍囹寬度").SetValueString((305).ToString()); } //旋轉斜撐元件 Line rotate_line = Line.CreateBound(frame_endpoint, frame_endpoint + new XYZ(0, 0, 1)); slopframe_2.Location.Rotate(rotate_line, Math.PI); //鏡射斜撐元件 if (csv.supLevel[lev].Item3 == 2)//雙排 { ElementTransformUtils.MirrorElement(doc, slopframe_1.Id, Plane.CreateByNormalAndOrigin(XYZ.BasisX, frame_startpoint)); ElementTransformUtils.MirrorElement(doc, slopframe_2.Id, Plane.CreateByNormalAndOrigin(XYZ.BasisX, frame_endpoint)); } else//單排 { ElementTransformUtils.MirrorElement(doc, slopframe_1.Id, Plane.CreateByNormalAndOrigin(XYZ.BasisX, frame_startpoint.Add(new XYZ(slopframe_1.LookupParameter("支撐厚度").AsDouble() / 2 + slopframe_1.LookupParameter("中間樁直徑").AsDouble() / 2, 0, 0)))); ElementTransformUtils.MirrorElement(doc, slopframe_2.Id, Plane.CreateByNormalAndOrigin(XYZ.BasisX, frame_endpoint)); slopframe_2.Location.Move((new XYZ((slopframe_1.LookupParameter("支撐厚度").AsDouble() + slopframe_1.LookupParameter("中間樁直徑").AsDouble()), 0, 0))); } break; } } } } } } trans_2.Commit(); return(Result.Succeeded); }