Пример #1
0
        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);
            }
        }
Пример #2
0
        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);
            }
        }