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