Example #1
0
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            // Стандарт
            doc = commandData.Application.ActiveUIDocument.Document;
            if (!CheckDefaultSharedParameters())
            {
                return(Result.Failed);
            }
            LoggingMachine.Reset();

            List <FamilyInstance> allPlunts = GetPlunts();

            if (allPlunts.Count < 1)
            {
                TaskDialog.Show("Ошибка", "Не найден ни один радиатор");
                return(Result.Failed);
            }
            using (Transaction tr = new Transaction(doc, "Обновление радиаторов"))
            {
                tr.Start();
                SetSpaces(allPlunts);
                tr.Commit();
                tr.Start();
                UpdatePluntData(allPlunts);
                tr.Commit();
                tr.Start();
                UpdatePluntGeometry(allPlunts);
                tr.Commit();
            }

            LoggingMachine.Show();

            return(Result.Succeeded);
        }
Example #2
0
 public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
 {
     Init(commandData);
     using (Transaction tr = new Transaction(doc, "Создание отверстий"))
     {
         UI.IntersectionsForm form = new UI.IntersectionsForm(this);
         if (form.DialogResult == System.Windows.Forms.DialogResult.OK)
         {
             tr.Start();
             var intersections = form.Intersections.Cast <Intersection>().ToList();
             if (form.DoMerge)
             {
                 intersections = Intersection.AutoMerging(intersections, form.MergeTolerance);
             }
             PlaceOpeningFamilies(intersections);
             tr.Commit();
             LoggingMachine.Show();
             return(Result.Succeeded);
         }
         else
         {
             return(Result.Cancelled);
         }
     }
 }
Example #3
0
 static public void Show(bool showEmpty = false)
 {
     foreach (var error in Stack)
     {
         if (!showEmpty && error.FailedElementIds.Count() == 0)
         {
             continue;
         }
         string     allErrorIds = String.Join(", ", error.FailedElementIds);
         TaskDialog dialog      = new TaskDialog("Результат");
         if (error.AllElementIds != null)
         {
             dialog.MainInstruction = String.Format("Операция: {0}\nТип ошибки: {1}\nНеудачно: {2} из {3}",
                                                    error.Operation, error.ErrorType, error.FailedElementIds.Count(), error.AllElementIds.Count());
         }
         else
         {
             dialog.MainInstruction = String.Format("Операция: {0}\nТип ошибки: {1}\nНеудачно: {2}",
                                                    error.Operation, error.ErrorType, error.FailedElementIds.Count());
         }
         dialog.MainContent = "Перечень id элементов:\n"
                              + allErrorIds;
         dialog.FooterText = error.Tip;
         dialog.AddCommandLink(TaskDialogCommandLinkId.CommandLink1, "Скопировать ID элементов в буфер обмена");
         TaskDialogResult result = dialog.Show();
         if (result == TaskDialogResult.CommandLink1)
         {
             System.Windows.Forms.Clipboard.SetText(allErrorIds);
             TaskDialog.Show("Результат", "Данные успешно скопированы в буфер обмена");
         }
     }
     LoggingMachine.Reset();
 }
Example #4
0
        private void UpdatePluntData(List <FamilyInstance> allPlunts)
        {
            ElementProcessingLog paramLog = LoggingMachine.NewLog(
                "Обновление данных радиаторов", allPlunts, "Не удалось обновить значение параметров", "Проверьте семейство на их наличие");
            ElementProcessingLog tempLog = LoggingMachine.NewLog(
                "Обновление данных радиаторов", allPlunts, "Не удалось определить температуру в системе приточки или обратки", "Проверьте, правильно ли подключен радиатор");

            foreach (FamilyInstance plunt in allPlunts)
            {
                // находим параметры для переопределения
                Parameter pluntTi = plunt.LookupParameter("ADSK_Температура в помещении");
                Parameter pluntTp = plunt.LookupParameter("ТеррНИИ_Температура обратки");
                Parameter pluntTz = plunt.LookupParameter("ТеррНИИ_Температура подачи");

                // Температуру помещения определяем из свойств пространства
                Space  space   = GetSpaceOfPlant(plunt);
                double spaceTi = space != null?space.LookupParameter(spaceTemperatureParameterName).AsDouble() : 0;

                // Температуру подачи и обратки определяем из свойств подключенных систем
                ConnectorManager connMng = plunt.MEPModel.ConnectorManager;
                if (connMng == null)
                {
                    tempLog.FailedElementIds.Push(plunt.Id.ToString());
                    continue;
                }
                Connector connTz = connMng.Connectors.Cast <Connector>().Where(x => x.Domain == Domain.DomainPiping && x.PipeSystemType == PipeSystemType.SupplyHydronic && x.MEPSystem != null).FirstOrDefault();
                Connector connTp = connMng.Connectors.Cast <Connector>().Where(x => x.Domain == Domain.DomainPiping && x.PipeSystemType == PipeSystemType.ReturnHydronic && x.MEPSystem != null).FirstOrDefault();

                // Назначаем температуру
                if (pluntTi != null && pluntTp != null && pluntTz != null && connTp != null && connTz != null)
                {
                    double systemTz = ((PipingSystemType)doc.GetElement(connTz.MEPSystem.GetTypeId())).FluidTemperature;
                    double systemTp = ((PipingSystemType)doc.GetElement(connTp.MEPSystem.GetTypeId())).FluidTemperature;
                    pluntTi.Set(spaceTi);
                    pluntTz.Set(systemTz);
                    pluntTp.Set(systemTp);
                }
                else
                {
                    paramLog.FailedElementIds.Push(plunt.Id.ToString());
                }
            }
        }
Example #5
0
        protected void SetSpaces(List <FamilyInstance> allPlunts)
        {
            var log = LoggingMachine.NewLog("Назначение пространств", allPlunts, "Оборудование не находится в пространстве");

            UI.ProgressBar pBar = new UI.ProgressBar("Назначение пространств", allPlunts.Count);
            // Назначаем номера помещений диффузорам
            foreach (FamilyInstance el in allPlunts)
            {
                Parameter p     = el.LookupParameter(spaceNumberParameterName);
                Space     space = GetSpaceOfPlant(el);
                if (space != null)
                {
                    string roomNumber = space.LookupParameter("Номер").AsString();
                    p.Set(roomNumber);
                }
                else
                {
                    p.Set("<Помещение не найдено!>");
                    log.FailedElementIds.Push(el.Id.ToString());
                }
                pBar.StepUp();
            }
        }
Example #6
0
        protected void PlaceOpeningFamilies(IEnumerable <Intersection> intersections)
        {
            var  log_param  = LoggingMachine.NewLog("Добавление отверстий", intersections.Select(x => x.Id), "Ошибка параметров размеров");
            var  log_id     = LoggingMachine.NewLog("Добавление отверстий", intersections.Select(x => x.Id), "Ошибка параметров id");
            var  log_level  = LoggingMachine.NewLog("Добавление отверстий", intersections.Select(x => x.Id), "Ошибка параметров уровня");
            var  log_cut    = LoggingMachine.NewLog("Добавление отверстий", intersections.Select(x => x.Id), "Ошибка вырезания");
            bool unpinFlag  = false;
            bool unpinAsked = false;

            foreach (Intersection i in intersections)
            {
                Element holeElement;
                if (IsExisted(i))
                {
                    holeElement = ExistingOpenings.Where(x => x.LookupParameter("ТеррНИИ_Идентификатор").AsString() == i.Id.ToString()).First();
                    LocationPoint loc = holeElement.Location as LocationPoint;
                    XYZ           vec = new XYZ(i.InsertionPoint.X,
                                                i.InsertionPoint.Y,
                                                i.Level.ProjectElevation) - loc.Point;

                    if (!unpinAsked)
                    {
                        TaskDialog td = new TaskDialog("Обнаружены закрепленные");
                        td.MainInstruction = "В отчете найдены отверстия, которые уже существуют в проекте и которые закреплены";
                        td.AddCommandLink(TaskDialogCommandLinkId.CommandLink1, "Открепить и обновить отверстия");
                        td.AddCommandLink(TaskDialogCommandLinkId.CommandLink2, "Оставить без изменений");
                        var res = td.Show();
                        unpinFlag  = res == TaskDialogResult.CommandLink1;
                        unpinAsked = true;
                    }

                    if (holeElement.Pinned && unpinFlag)
                    {
                        holeElement.Pinned = false;
                        ElementTransformUtils.MoveElement(doc, holeElement.Id, vec);
                    }
                    else if (!holeElement.Pinned)
                    {
                        ElementTransformUtils.MoveElement(doc, holeElement.Id, vec);
                    }
                }
                else
                {
                    holeElement = doc.Create.NewFamilyInstance(
                        new XYZ(
                            i.InsertionPoint.X,
                            i.InsertionPoint.Y,
                            i.Level.Elevation),
                        openingFamilySymbol,
                        i.Level,
                        StructuralType.NonStructural);
                    // поворачиваем на нужную позицию
                    Line axe = Line.CreateUnbound(i.InsertionPoint, XYZ.BasisZ);
                    ElementTransformUtils.RotateElement(doc, holeElement.Id, axe, i.Angle);

                    //делаем вырез в хосте
                    try
                    {
                        if (i.HasHosts)
                        {
                            foreach (var host in i.Hosts)
                            {
                                InstanceVoidCutUtils.AddInstanceVoidCut(doc, host, holeElement);
                            }
                        }
                    }
                    catch
                    {
                        log_cut.AddError(i.Id);
                    }
                }
                try
                {
                    //идентификация
                    holeElement.LookupParameter("ТеррНИИ_Идентификатор")?.Set(i.Id.ToString());
                    holeElement.LookupParameter("Связанный файл")?.Set(i.Name);
                }
                catch { log_id.AddError(i.Id); }


                try
                {
                    // задаем параметры
                    holeElement.LookupParameter("ADSK_Отверстие_Ширина").Set(i.HoleWidth);
                    holeElement.LookupParameter("ADSK_Отверстие_Высота").Set(i.HoleHeight);
                    holeElement.LookupParameter("ADSK_Толщина стены").Set(i.HoleDepth);
                    // (временно) работа с отверстиями в кирпиче
                    holeElement.LookupParameter("ТеррНИИ_Отверстие_В кирпиче")?.Set(1);
                }
                catch { log_param.AddError(i.Id); }

                try
                {
                    // назначаем отметки
                    holeElement.LookupParameter("ADSK_Отверстие_Отметка от этажа").Set(i.LevelOffset);
                    if (i.Level.Elevation == 0)
                    {
                        holeElement.LookupParameter("ADSK_Отверстие_Отметка этажа").Set(0);
                    }
                    else
                    {
                        holeElement.LookupParameter("ADSK_Отверстие_Отметка этажа").Set(i.Level.Elevation);
                    }
                    // обнуляем смещение
                    holeElement.get_Parameter(BuiltInParameter.INSTANCE_FREE_HOST_OFFSET_PARAM).Set(0);
                }
                catch { log_level.AddError(i.Id); }
            }
        }
Example #7
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());
                }
            }
        }
Example #8
0
        protected void PlaceOpeningFamilies(IEnumerable <Intersection> intersections)
        {
            var log_param = LoggingMachine.NewLog("Добавление отверстий", intersections.Select(x => x.Id), "Ошибка параметров размеров");
            var log_id    = LoggingMachine.NewLog("Добавление отверстий", intersections.Select(x => x.Id), "Ошибка параметров id");
            var log_level = LoggingMachine.NewLog("Добавление отверстий", intersections.Select(x => x.Id), "Ошибка параметров уровня");
            var log_cut   = LoggingMachine.NewLog("Добавление отверстий", intersections.Select(x => x.Id), "Ошибка вырезания");

            foreach (Intersection i in intersections)
            {
                Element holeElement;
                if (IsExisted(i))
                {
                    holeElement = ExistingOpenings.Where(x => x.LookupParameter("ТеррНИИ_Идентификатор").AsString() == i.Id.ToString()).First();
                    LocationPoint loc = holeElement.Location as LocationPoint;
                    XYZ           vec = new XYZ(i.InsertionPoint.X,
                                                i.InsertionPoint.Y,
                                                i.Level.ProjectElevation) - loc.Point;
                    ElementTransformUtils.MoveElement(doc, holeElement.Id, vec);
                }
                else
                {
                    holeElement = doc.Create.NewFamilyInstance(
                        new XYZ(
                            i.InsertionPoint.X,
                            i.InsertionPoint.Y,
                            i.Level.Elevation),
                        openingFamilySymbol,
                        i.Level,
                        StructuralType.NonStructural);
                    // поворачиваем на нужную позицию
                    Line axe = Line.CreateUnbound(i.InsertionPoint, XYZ.BasisZ);
                    ElementTransformUtils.RotateElement(doc, holeElement.Id, axe, i.Angle);

                    //делаем вырез в хосте
                    try
                    {
                        if (i.HasHosts)
                        {
                            foreach (var host in i.Hosts)
                            {
                                InstanceVoidCutUtils.AddInstanceVoidCut(doc, host, holeElement);
                            }
                        }
                    }
                    catch
                    {
                        log_cut.AddError(i.Id);
                    }
                }
                try
                {
                    //идентификация
                    holeElement.LookupParameter("ТеррНИИ_Идентификатор")?.Set(i.Id.ToString());
                    holeElement.LookupParameter("Связанный файл")?.Set(i.Name);
                }
                catch { log_id.AddError(i.Id); }


                try
                {
                    // задаем параметры
                    holeElement.LookupParameter("ADSK_Отверстие_Ширина").Set(i.HoleWidth);
                    holeElement.LookupParameter("ADSK_Отверстие_Высота").Set(i.HoleHeight);
                    holeElement.LookupParameter("ADSK_Толщина стены").Set(i.HoleDepth);
                    // (временно) работа с отверстиями в кирпиче
                    holeElement.LookupParameter("ТеррНИИ_Отверстие_В кирпиче")?.Set(1);
                }
                catch { log_param.AddError(i.Id); }

                try
                {
                    // назначаем отметки
                    holeElement.LookupParameter("ADSK_Отверстие_Отметка от этажа").Set(i.LevelOffset);
                    if (i.Level.Elevation == 0)
                    {
                        holeElement.LookupParameter("ADSK_Отверстие_Отметка этажа").Set(0);
                    }
                    else
                    {
                        holeElement.LookupParameter("ADSK_Отверстие_Отметка этажа").Set(i.Level.Elevation);
                    }
                    // обнуляем смещение
                    holeElement.get_Parameter(BuiltInParameter.INSTANCE_FREE_HOST_OFFSET_PARAM).Set(0);
                }
                catch { log_level.AddError(i.Id); }
            }
        }