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