protected override Element CreateHostGeometry(HorizontalFinishingResult res) { try { /*CurveArray mainProfileWithDoors = res.MainProfile; * foreach (FamilyInstance door in new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Doors)) * { * if (FinishingData.IsElementCollideRoom(res.Room, door)) * { * Curve c = ModelCurveCreator.GetFamilyInstanceCutBaseLine(door); * XYZ ptSt = c.GetEndPoint(0); * XYZ ptEnd = c.GetEndPoint(1); * * mainProfileWithDoors.get_Item(0).Project * } * }*/ return(doc.Create.NewFloor(res.MainProfile, res.FinishingType as FloorType, res.Level, false)); } catch (Autodesk.Revit.Exceptions.ArgumentException e) { ModelCurveCreator mmc = new ModelCurveCreator(doc); mmc.MakeModelCurve(res.MainProfile); mmc.DrawGroup(res.MainProfile, "Незамкнутый контур помещения #" + res.Room.Number.ToString()); Debug.WriteLine(e.ToString()); TaskDialog td = new TaskDialog("Предупреждение"); td.MainIcon = TaskDialogIcon.TaskDialogIconWarning; td.MainInstruction = string.Format("Помещение {0} имеет незамкнутый внешний контур. создание отделки пола для него было пропущено", res.Room.Number); td.MainContent = "Проверьте контур помещения. Он автоматически сгенерирован, проверьте группы моделей"; td.Show(); return(null); } }
private List <ModelCurve> DrawInsulLine(MEPCurve e, double stepLength, double height, GraphicsStyle style) { Curve ductCurve = GeometryUtils.FindDuctCurve(e.ConnectorManager); XYZ pt1 = ductCurve.GetEndPoint(0); XYZ pt2 = ductCurve.GetEndPoint(1); // создаем плоскость, на которой будет рисоваться штриховка XYZ VOffset; XYZ ductVector = GeometryUtils.GetDuctDirection(e.ConnectorManager); // Вертикальная линии if (ductVector.IsAlmostEqualTo(XYZ.BasisZ) | ductVector.IsAlmostEqualTo(XYZ.BasisZ.Negate())) { // находим перпендикулярный вектор, нормализуем его и умножаем до нужной длины VOffset = (pt2 - pt1).CrossProduct(XYZ.BasisY).Normalize() * (height / 2); } else { VOffset = (pt2 - pt1).CrossProduct(XYZ.BasisZ).Normalize() * (height / 2); } XYZ UOffset = (pt2 - pt1).Normalize() * (stepLength / 2); int steps = (int)Math.Floor((pt2 - pt1).GetLength() / UOffset.GetLength()); List <XYZ> points = new List <XYZ>(); points.Add(pt1); for (int i = 0; i < steps; i++) { pt1 = pt1 + UOffset; XYZ VOffsetedPt = pt1 + VOffset; points.Add(VOffsetedPt); VOffset = VOffset.Negate(); } points.Add(pt2); ModelCurveCreator mcc = new ModelCurveCreator(doc); mcc.LineStyle = style; if (points.Count() > 2) { var array = mcc.MakeModelCurve(points, false); return(array); } else { return(null); } }