/// <summary>
        /// 创建面层
        /// </summary>
        /// <param name="doc">当前项目对象</param>
        /// <param name="floorType">楼板面层类型</param>
        /// <param name="roomBoundaryList">房间边界线List</param>
        /// <returns></returns>
        private bool CreateSurface(Document doc, FloorType floorType, List <CurveArray> roomBoundaryList, List <Element> roomsList)
        {
            double thick = floorType.get_Parameter(BuiltInParameter.FLOOR_ATTR_DEFAULT_THICKNESS_PARAM).AsDouble();

            using (Transaction trans = new Transaction(doc, "生成楼板面层"))
            {
                trans.Start();
                for (int i = 0; i < roomBoundaryList.Count; i++)
                {
                    Floor floor = doc.Create.NewFloor(roomBoundaryList[i], floorType, doc.GetElement(roomsList[i].Id) as Level, false);
                    floor.get_Parameter(BuiltInParameter.FLOOR_HEIGHTABOVELEVEL_PARAM).Set(thick);
                    floor.get_Parameter(BuiltInParameter.ALL_MODEL_MARK).Set(roomsList[i].get_Parameter(BuiltInParameter.ROOM_NUMBER).AsString());
                    roomsList[i].get_Parameter(BuiltInParameter.ROOM_FINISH_FLOOR).Set(floor.Name);
                }
                trans.Commit();
            }
            return(true);
        }
Beispiel #2
0
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            string paramNameGroupConstr = "INGD_Группа конструкции";
            string floorNumberParamName = "INGD_Номер этажа";
            int    floorTextPosition    = 0;

            Module.assembly = System.Reflection.Assembly.GetExecutingAssembly().Location;
            Print(Module.assembly, KPLN_Loader.Preferences.MessageType.Regular);
            string markParamName   = "INGD_Марка";
            string widthParamName  = "INGD_Ширина";
            string lengthParamName = "INGD_Длина";
            string heigthParamName = "INGD_Высота";

            Dictionary <string, string> marksBase = new Dictionary <string, string>();

            string txtFile = SettingsUtils.CheckOrCreateSettings();

            Print(txtFile, KPLN_Loader.Preferences.MessageType.Regular);
            if (!System.IO.File.Exists(txtFile))
            {
                message = "Не найден файл " + txtFile;
                return(Result.Failed);
            }

            string[] data = System.IO.File.ReadAllLines(txtFile);
            foreach (string s in data)
            {
                string[] line = s.Split(';');
                marksBase.Add(line[0], line[1]);
            }

            Document doc = commandData.Application.ActiveUIDocument.Document;

            List <Element> allElems = new List <Element>();

            List <Wall> walls = new FilteredElementCollector(doc)
                                .OfClass(typeof(Wall))
                                .Cast <Wall>()
                                .ToList();

            List <Floor> floors = new FilteredElementCollector(doc)
                                  .OfClass(typeof(Floor))
                                  .Cast <Floor>()
                                  .ToList();

            allElems.AddRange(walls);
            allElems.AddRange(floors);
            allElems.AddRange(new FilteredElementCollector(doc).OfClass(typeof(Autodesk.Revit.DB.Architecture.Stairs)));
            allElems.AddRange(new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).OfCategory(BuiltInCategory.OST_StructuralColumns));
            allElems.AddRange(new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).OfCategory(BuiltInCategory.OST_StructuralFraming));
            allElems.AddRange(new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).OfCategory(BuiltInCategory.OST_StructuralFoundation));
            allElems.AddRange(new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).OfCategory(BuiltInCategory.OST_Floors));
            allElems.AddRange(new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).OfCategory(BuiltInCategory.OST_Walls));

            List <FamilyInstance> genericModels = new FilteredElementCollector(doc)
                                                  .OfClass(typeof(FamilyInstance))
                                                  .OfCategory(BuiltInCategory.OST_GenericModel)
                                                  .Cast <FamilyInstance>()
                                                  .Where(i => !i.Symbol.FamilyName.StartsWith("22"))
                                                  .ToList();

            allElems.AddRange(genericModels);

            List <FamilyInstance> windows = new FilteredElementCollector(doc)
                                            .OfClass(typeof(FamilyInstance))
                                            .Cast <FamilyInstance>()
                                            .Where(i => i.Symbol.FamilyName.StartsWith("23"))
                                            .ToList();

            allElems.AddRange(windows);

            List <RoofBase> roofs = new FilteredElementCollector(doc)
                                    .OfClass(typeof(RoofBase))
                                    .Cast <RoofBase>()
                                    .ToList();

            int count = 0;

            using (Transaction t = new Transaction(doc))
            {
                t.Start("INGD Параметризация");

                foreach (Element elem in allElems)
                {
                    Parameter markParam = elem.get_Parameter(BuiltInParameter.ALL_MODEL_MARK);
                    if (markParam == null)
                    {
                        continue;
                    }
                    if (markParam.HasValue)
                    {
                        string mark = markParam.AsString();

                        Parameter ingdMarkParam = elem.LookupParameter(markParamName);

                        if (ingdMarkParam != null)
                        {
                            ingdMarkParam.Set(mark);
                        }

                        string[] splitmark = mark.Split('-');
                        if (splitmark.Length > 1)
                        {
                            string markPrefix = splitmark[0];
                            if (!marksBase.ContainsKey(markPrefix))
                            {
                                message = "Недопустимый префикс марки " + markPrefix + " у элемента id " + elem.Id.IntegerValue.ToString();
                                return(Result.Failed);
                            }
                            string    group      = marksBase[markPrefix];
                            Parameter groupParam = elem.LookupParameter(paramNameGroupConstr);
                            if (groupParam != null)
                            {
                                groupParam.Set(group);
                            }
                        }
                    }

                    //заполняю номер этажа
                    Level baseLevel = LevelUtils.GetLevelOfElement(elem, doc);
                    if (baseLevel != null)
                    {
                        string    floorNumber = LevelUtils.GetFloorNumberByLevel(baseLevel, floorTextPosition, ' ');
                        Parameter ingdFloor   = elem.LookupParameter(floorNumberParamName);
                        if (ingdFloor == null)
                        {
                            continue;
                        }
                        ingdFloor.Set(floorNumber);
                    }

                    count++;
                }

                foreach (RoofBase roof in roofs)
                {
                    string    group      = "Бетонная подготовка";
                    Parameter groupParam = roof.LookupParameter(paramNameGroupConstr);
                    if (groupParam != null)
                    {
                        groupParam.Set(group);
                    }
                }

                foreach (Wall w in walls)
                {
                    Level     baseLevel   = doc.GetElement(w.LevelId) as Level;
                    string    floorNumber = LevelUtils.GetFloorNumberByLevel(baseLevel, floorTextPosition, ' ');
                    Parameter ingdFloor   = w.LookupParameter(floorNumberParamName);
                    if (ingdFloor == null)
                    {
                        continue;
                    }
                    ingdFloor.Set(floorNumber);

                    double    width     = w.Width;
                    Parameter ingdWidth = w.LookupParameter(widthParamName);
                    if (ingdWidth == null)
                    {
                        continue;
                    }
                    ingdWidth.Set(width);

                    double    length     = w.get_Parameter(BuiltInParameter.CURVE_ELEM_LENGTH).AsDouble();
                    Parameter ingdLength = w.LookupParameter(lengthParamName);
                    if (ingdLength == null)
                    {
                        continue;
                    }
                    ingdLength.Set(length);

                    List <Solid> solids     = GeometryUtils.GetSolidsFromElement(w);
                    XYZ[]        maxminZ    = GeometryUtils.GetMaxMinHeightPoints(solids);
                    double       heigth     = maxminZ[0].Z - maxminZ[1].Z;
                    Parameter    ingdHeigth = w.LookupParameter(heigthParamName);
                    if (ingdHeigth == null)
                    {
                        continue;
                    }
                    ingdHeigth.Set(heigth);
                }

                foreach (Floor f in floors)
                {
                    Level     baseLevel   = doc.GetElement(f.LevelId) as Level;
                    string    floorNumber = LevelUtils.GetFloorNumberByLevel(baseLevel, floorTextPosition, ' ');
                    Parameter ingdFloor   = f.LookupParameter(floorNumberParamName);
                    if (ingdFloor == null)
                    {
                        continue;
                    }
                    ingdFloor.Set(floorNumber);

                    FloorType ft = f.FloorType;

                    double    heigth     = ft.get_Parameter(BuiltInParameter.FLOOR_ATTR_DEFAULT_THICKNESS_PARAM).AsDouble();
                    Parameter ingdHeigth = f.LookupParameter(heigthParamName);
                    if (ingdHeigth == null)
                    {
                        continue;
                    }
                    ingdHeigth.Set(heigth);
                }

                t.Commit();
            }

            TaskDialog.Show("Отчет", "Обработано элементов: " + count.ToString());
            return(Result.Succeeded);
        }