Exemplo n.º 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();
        }
Exemplo n.º 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);
        }
Exemplo n.º 3
0
        protected void UpdatePluntGeometry(List <FamilyInstance> allPlunts)
        {
            // logging
            ElementProcessingLog lostParameterLog = LoggingMachine.NewLog("Обновление геометрии радиаторов", allPlunts, "В семействе отсутствуют необходимые параметры");
            ElementProcessingLog highWattLog      = LoggingMachine.NewLog("Обновление геометрии радиаторов", allPlunts, "Ни один из вариантов не подходит под такую нагрузку");
            ElementProcessingLog invalidTableLog  = LoggingMachine.NewLog(
                "Обновление геометрии радиаторов", allPlunts, "В таблица выбора отсутствуют подходящие значения", "Проверьте соответствии таблицы выбора и настроек плагина");

            foreach (FamilyInstance plunt in allPlunts)
            {
                Space space = GetSpaceOfPlant(plunt);
                if (space == null)
                {
                    continue;
                }
                int    count         = allPlunts.Where(x => x.LookupParameter("ТеррНИИ_Номер помещения").AsString() == space.get_Parameter(BuiltInParameter.ROOM_NUMBER).AsString()).Count();
                double requiredValue = space.get_Parameter(BuiltInParameter.ROOM_DESIGN_HEATING_LOAD_PARAM).AsDouble() / count;
                plunt.LookupParameter(spacePowerParameterName).Set(requiredValue); // для проверки найденных типораразмеров
                requiredValue = UnitUtils.ConvertFromInternalUnits(requiredValue, DisplayUnitType.DUT_WATTS);

                FamilySizeTableManager sizeMng = FamilySizeTableManager.GetFamilySizeTableManager(doc, plunt.Symbol.Family.Id);
                Parameter tableNameParam       = plunt.Symbol.LookupParameter("Таблица выбора");
                Parameter TzParam      = plunt.LookupParameter("ТеррНИИ_Температура подачи");
                Parameter TpParam      = plunt.LookupParameter("ТеррНИИ_Температура обратки");
                Parameter TiParam      = plunt.LookupParameter("ADSK_Температура в помещении");
                Parameter hParam       = plunt.LookupParameter("ADSK_Размер_Высота");
                Parameter lParam       = plunt.LookupParameter("ADSK_Размер_Длина");
                Parameter radTypeParam = plunt.LookupParameter("ТеррНИИ_Тип радиатора");

                if (hParam == null || lParam == null || radTypeParam == null || TzParam == null ||
                    TpParam == null || TiParam == null || sizeMng == null || tableNameParam == null)
                {
                    lostParameterLog.FailedElementIds.Push(plunt.Id.ToString());
                    continue;
                }

                double          Tz        = UnitUtils.ConvertFromInternalUnits(TzParam.AsDouble(), DisplayUnitType.DUT_CELSIUS);
                double          Tp        = UnitUtils.ConvertFromInternalUnits(TpParam.AsDouble(), DisplayUnitType.DUT_CELSIUS);
                double          Ti        = UnitUtils.ConvertFromInternalUnits(TiParam.AsDouble(), DisplayUnitType.DUT_CELSIUS);
                FamilySizeTable sizeTable = sizeMng.GetSizeTable(plunt.Symbol.LookupParameter("Таблица выбора").AsString());

                string sN, sQn, sTzn, sTpn, sTin;
                double N, Qn, Tzn, Tpn, Tin, powerValue;
                bool   wattFinded = false;
                bool   rowFinded  = false;

                Parameter keepHeightParam = plunt.LookupParameter("Не изменять высоту");
                Parameter keepLengthParam = plunt.LookupParameter("Не изменять длину");
                Parameter keepTypeParam   = plunt.LookupParameter("Не изменять тип");
                var       iteratedHeights = keepHeightParam != null && keepHeightParam.AsInteger() == 1
                    ?
                                            new List <int>()
                {
                    Convert.ToInt32(UnitUtils.ConvertFromInternalUnits(hParam.AsDouble(), DisplayUnitType.DUT_MILLIMETERS))
                }
                    :
                TerrSettings.RadiatorHeights;
                var iteratedLengths = keepLengthParam != null && keepLengthParam.AsInteger() == 1
                    ?
                                      new List <int>()
                {
                    Convert.ToInt32(UnitUtils.ConvertFromInternalUnits(lParam.AsDouble(), DisplayUnitType.DUT_MILLIMETERS))
                }
                    :
                TerrSettings.RadiatorLengths;
                var iteratedTypes = keepTypeParam != null && keepTypeParam.AsInteger() == 1
                    ?
                                    new List <int>()
                {
                    radTypeParam.AsInteger()
                }
                    :
                TerrSettings.RadiatorTypes;

                for (int t = 0; t < iteratedTypes.Count() && !wattFinded; t++)
                {
                    int type = iteratedTypes[t];
                    for (int h = 0; h < iteratedHeights.Count() && !wattFinded; h++)
                    {
                        int height = iteratedHeights[h];
                        sN   = FamilyInstanceUtils.SizeLookup(sizeTable, "N", new string[] { type.ToString(), height.ToString() });
                        sQn  = FamilyInstanceUtils.SizeLookup(sizeTable, "Qn", new string[] { type.ToString(), height.ToString() });
                        sTzn = FamilyInstanceUtils.SizeLookup(sizeTable, "Tz", new string[] { type.ToString(), height.ToString() });
                        sTpn = FamilyInstanceUtils.SizeLookup(sizeTable, "Tp", new string[] { type.ToString(), height.ToString() });
                        sTin = FamilyInstanceUtils.SizeLookup(sizeTable, "Ti", new string[] { type.ToString(), height.ToString() });
                        if (sN == null || sQn == null || sTzn == null || sTpn == null || sTin == null)
                        {
                            continue;
                        }
                        rowFinded = true;

                        N   = double.Parse(sN, System.Globalization.CultureInfo.InvariantCulture);
                        Qn  = double.Parse(sQn, System.Globalization.CultureInfo.InvariantCulture);
                        Tzn = double.Parse(sTzn, System.Globalization.CultureInfo.InvariantCulture);
                        Tpn = double.Parse(sTpn, System.Globalization.CultureInfo.InvariantCulture);
                        Tin = double.Parse(sTin, System.Globalization.CultureInfo.InvariantCulture);

                        for (int l = 0; l < iteratedLengths.Count() && !wattFinded; l++)
                        {
                            int length = iteratedLengths[l];
                            powerValue = (length / 1000.0) * Qn * Math.Pow(
                                (
                                    (Tz - Tp)
                                    /
                                    Math.Log((Tz - Ti) / (Tp - Ti))
                                ) / (
                                    (Tzn - Tpn)
                                    /
                                    Math.Log((Tzn - Tin) / (Tpn - Tin))
                                    ),
                                N
                                );

                            if (powerValue >= requiredValue)
                            {
                                lParam.Set(UnitUtils.ConvertToInternalUnits(length, DisplayUnitType.DUT_MILLIMETERS));
                                hParam.Set(UnitUtils.ConvertToInternalUnits(height, DisplayUnitType.DUT_MILLIMETERS));
                                radTypeParam.Set(type);
                                wattFinded = true;
                            }
                        }
                    }
                }
                if (!rowFinded)
                {
                    invalidTableLog.FailedElementIds.Push(plunt.Id.ToString());
                }
                else if (!wattFinded)
                {
                    highWattLog.FailedElementIds.Push(plunt.Id.ToString());
                }
            }
        }