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); }
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); } } }
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(); }
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()); } } }
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(); } }
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); } } }
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()); } } }
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); } } }