Beispiel #1
0
        public void Init(ExternalCommandData commandData)
        {
            doc = commandData.Application.ActiveUIDocument.Document;

            using (Transaction tr = new Transaction(doc, "Загрузка семейства"))
            {
                tr.Start();
                openingFamilySymbol = FamilyInstanceUtils.FindOpeningFamily(doc, openingFamilyName, TerrSettings.OpeningsFolder, "Проем");
                if (openingFamilySymbol == null)
                {
                    throw new ArgumentException("Ошибка загрузки семейства");
                }
                tr.Commit();
            }

            ExistingOpenings = new FilteredElementCollector(doc)
                               .OfClass(typeof(FamilyInstance))
                               .Cast <FamilyInstance>()
                               .Where(x => x.Symbol.Id == openingFamilySymbol.Id)
                               .ToArray();
        }
Beispiel #2
0
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            uidoc = commandData.Application.ActiveUIDocument;
            doc   = uidoc.Document;
            string horFamilyName = "ТеррНИИ_УГО_3D_Теплоизоляция зигзаг";
            string verFamilyName = "ТеррНИИ_УГО_3D_Теплоизоляция зигзаг_Вертикальный";
            string familyFolder  = @"L:\REVIT\Семейства\ТеррНИИ\Условники\3D";
            string familyType    = "-";

            // получаем объекты для штриховки и задаем параметры
            var elems = GetElements();

            if (elems == null)
            {
                return(Result.Cancelled);
            }
            using (Transaction tr = new Transaction(doc))
            {
                tr.Start("Загрузка семейства");
                FamilySymbol horZigzagSymbol = FamilyInstanceUtils.FindOpeningFamily(doc, horFamilyName, familyFolder, familyType);
                FamilySymbol verZigzagSymbol = FamilyInstanceUtils.FindOpeningFamily(doc, verFamilyName, familyFolder, familyType);
                tr.Commit();

                tr.Start("Добавление общих параметров");
                var systemParamName = "ТеррНИИ_Наименование системы";
                var idParamName     = "ТеррНИИ_Идентификатор";
                // добавляем общие параметры, в который будем копировать марку и систему

                SharedParameterUtils.AddSharedParameter(doc, systemParamName,
                                                        new BuiltInCategory[] { BuiltInCategory.OST_GenericModel },
                                                        BuiltInParameterGroup.PG_TEXT);
                SharedParameterUtils.AddSharedParameter(doc, idParamName,
                                                        new BuiltInCategory[] { BuiltInCategory.OST_GenericModel },
                                                        BuiltInParameterGroup.PG_ADSK_MODEL_PROPERTIES);

                tr.Commit();

                tr.Start("Рисование штриховок");
                // проверяем какие штриховки уже есть в проекте и удаляем если есть обновляемые
                List <ElementId>      toDelete = new List <ElementId>();
                List <string>         elemsIds = elems.Select(x => x.Id.IntegerValue.ToString()).ToList();
                List <FamilyInstance> fills    = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance))
                                                 .Cast <FamilyInstance>().Where(x => x.Symbol.FamilyName == horFamilyName || x.Symbol.FamilyName == verFamilyName).ToList();
                foreach (FamilyInstance i in fills)
                {
                    var param = i.LookupParameter(idParamName);
                    if (param != null && elemsIds.Contains(param.AsString()))
                    {
                        toDelete.Add(i.Id);
                    }
                }
                doc.Delete(toDelete);

                foreach (MEPCurve e in elems)
                {
                    Curve ductCurve = (e.Location as LocationCurve).Curve;
                    Level level     = e.ReferenceLevel;

                    var dir = GeometryUtils.GetDuctOrientation(e.ConnectorManager);

                    XYZ pt1         = ductCurve.GetEndPoint(0);
                    XYZ pt2         = ductCurve.GetEndPoint(1);
                    XYZ project_pt1 = new XYZ(pt1.X, pt1.Y, level.Elevation);
                    XYZ project_pt2 = new XYZ(pt2.X, pt2.Y, level.Elevation);

                    FamilyInstance fi = null;
                    try
                    {
                        if (dir == GeometryUtils.DuctOrientation.Horizontal)
                        {
                            Line line = Line.CreateBound(project_pt1, project_pt2);
                            fi = doc.Create.NewFamilyInstance(line, horZigzagSymbol, level, Autodesk.Revit.DB.Structure.StructuralType.NonStructural);
                            fi.get_Parameter(BuiltInParameter.INSTANCE_FREE_HOST_OFFSET_PARAM).Set(e.LevelOffset);
                        }
                        else if (dir == GeometryUtils.DuctOrientation.StraightVertical)
                        {
                            fi = doc.Create.NewFamilyInstance(project_pt1, verZigzagSymbol, level, Autodesk.Revit.DB.Structure.StructuralType.NonStructural);
                            fi.LookupParameter("Длина").Set(
                                pt1.DistanceTo(pt2)
                                );
                            var offset = e.LookupParameter("Нижняя отметка").AsDouble();
                            fi.get_Parameter(BuiltInParameter.INSTANCE_FREE_HOST_OFFSET_PARAM).Set(offset);
                        }
                        else
                        {
                            continue;
                        }
                    }
                    catch (Autodesk.Revit.Exceptions.ArgumentsInconsistentException)
                    {
                        continue;
                    }

                    // Вычисляем марку
                    string insul_type      = e.get_Parameter(BuiltInParameter.RBS_REFERENCE_INSULATION_TYPE).AsString();
                    string insul_thickness = e.get_Parameter(BuiltInParameter.RBS_REFERENCE_INSULATION_THICKNESS).AsValueString();

                    // вычисляем наименование системы
                    var    p = e.LookupParameter(systemParamName);
                    string element_system = p != null?p.AsString() : "";

                    // вычисляем смещение
                    Parameter ductWidth    = e.get_Parameter(BuiltInParameter.RBS_CURVE_WIDTH_PARAM);
                    Parameter ductHeight   = e.get_Parameter(BuiltInParameter.RBS_CURVE_HEIGHT_PARAM);
                    Parameter ductDiameter = e.get_Parameter(BuiltInParameter.RBS_CURVE_DIAMETER_PARAM);
                    Parameter pipeDiameter = e.get_Parameter(BuiltInParameter.RBS_PIPE_DIAMETER_PARAM);

                    double fillOffset = 0;
                    if (ductDiameter != null)
                    {
                        fillOffset = ductDiameter.AsDouble() / 2;
                    }
                    else if (pipeDiameter != null)
                    {
                        fillOffset = pipeDiameter.AsDouble() / 2;
                    }
                    else
                    {
                        fillOffset = ductWidth.AsDouble() > ductHeight.AsDouble() ? ductHeight.AsDouble() / 2 : ductWidth.AsDouble() / 2;
                    }

                    // Назначаем параметры
                    fi.LookupParameter("Марка").Set(insul_type + " " + insul_thickness);
                    fi.LookupParameter(systemParamName).Set(element_system);
                    //fi.LookupParameter("Смещение по Z").Set(fillOffset);
                    fi.LookupParameter(idParamName).Set(e.Id.IntegerValue.ToString());
                }
                tr.Commit();
            }
            return(Result.Succeeded);
        }