public static List <RefPlane> CollectRefPlanes(Document famDoc) { List <RefPlane> rps = new FilteredElementCollector(famDoc) .OfClass(typeof(ReferencePlane)) .Cast <ReferencePlane>() .Select(i => new RefPlane(i)) .ToList(); List <RefPlane> levels = new FilteredElementCollector(famDoc) .OfClass(typeof(Level)) .Cast <Level>() .Select(i => new RefPlane(i)) .ToList(); rps.AddRange(levels); List <RefPlane> sketchPlanes = new FilteredElementCollector(famDoc) .OfClass(typeof(SketchPlane)) .Cast <SketchPlane>() .Select(i => new RefPlane(i)) .ToList(); rps.AddRange(sketchPlanes); return(rps); }
public IEnumerable <CW_Element> Get(string documentTitle, string uniqueId) { var cwElements = new List <CW_Element>(); if (GetDocument(documentTitle) is Document document) { var rvtElements = new List <Element>(); if (string.IsNullOrEmpty(uniqueId)) { rvtElements = new FilteredElementCollector(document).WhereElementIsNotElementType().ToList(); var typeElements = new FilteredElementCollector(document).WhereElementIsElementType(); rvtElements.AddRange(typeElements); } else if (int.TryParse(uniqueId, out int elementId)) { var element = document.GetElement(new ElementId(elementId)); if (element != null) { rvtElements.Add(element); } } else { var element = document.GetElement(uniqueId); if (element != null) { rvtElements.Add(element); } } foreach (var element in rvtElements) { var cwElement = RvtToCwElementConverter.ConvertElementToCW_Element(element); if (cwElement != null) { cwElements.Add(cwElement); } } } return(cwElements); }
/// <summary> /// Given the filter in use by a stream returns the document elements that match it. /// </summary> /// <param name="filter"></param> /// <returns></returns> private List <Element> GetSelectionFilterObjects(ISelectionFilter filter) { var doc = CurrentDoc.Document; var selection = new List <Element>(); switch (filter.Name) { case "Category": var catFilter = filter as ListSelectionFilter; var bics = new List <BuiltInCategory>(); var categories = ConnectorRevitUtils.GetCategories(doc); IList <ElementFilter> elementFilters = new List <ElementFilter>(); foreach (var cat in catFilter.Selection) { elementFilters.Add(new ElementCategoryFilter(categories[cat].Id)); } var categoryFilter = new LogicalOrFilter(elementFilters); selection = new FilteredElementCollector(doc) .WhereElementIsNotElementType() .WhereElementIsViewIndependent() .WherePasses(categoryFilter).ToList(); return(selection); case "View": var viewFilter = filter as ListSelectionFilter; var views = new FilteredElementCollector(doc) .WhereElementIsNotElementType() .OfClass(typeof(View)) .Where(x => viewFilter.Selection.Contains(x.Name)); foreach (var view in views) { var ids = selection.Select(x => x.UniqueId); var viewElements = new FilteredElementCollector(doc, view.Id) .WhereElementIsNotElementType() .WhereElementIsViewIndependent() .Where(x => x.IsPhysicalElement()) .Where(x => !ids.Contains(x.UniqueId)) //exclude elements already added from other views .ToList(); selection.AddRange(viewElements); } return(selection); case "Project Info": var projectInfoFilter = filter as ListSelectionFilter; if (projectInfoFilter.Selection.Contains("Project Info")) { selection.Add(doc.ProjectInformation); } if (projectInfoFilter.Selection.Contains("Views 2D")) { selection.AddRange(new FilteredElementCollector(doc) .WhereElementIsNotElementType() .OfCategory(BuiltInCategory.OST_Views) .Cast <View>() .Where(x => x.ViewType == ViewType.CeilingPlan || x.ViewType == ViewType.FloorPlan || x.ViewType == ViewType.Elevation || x.ViewType == ViewType.Section) .ToList()); } if (projectInfoFilter.Selection.Contains("Views 3D")) { selection.AddRange(new FilteredElementCollector(doc) .WhereElementIsNotElementType() .OfCategory(BuiltInCategory.OST_Views) .Cast <View>() .Where(x => x.ViewType == ViewType.ThreeD) .ToList()); } if (projectInfoFilter.Selection.Contains("Levels")) { selection.AddRange(new FilteredElementCollector(doc) .WhereElementIsNotElementType() .OfCategory(BuiltInCategory.OST_Levels).ToList()); } if (projectInfoFilter.Selection.Contains("Families & Types")) { //get all the elementtypes of the categories we support var allCategoryFilter = new LogicalOrFilter(ConnectorRevitUtils.GetCategories(doc).Select(x => new ElementCategoryFilter(x.Value.Id)).Cast <ElementFilter>().ToList()); selection.AddRange(new FilteredElementCollector(doc) .WhereElementIsElementType() .WherePasses(allCategoryFilter).ToList()); } return(selection); case "Parameter": try { var propFilter = filter as PropertySelectionFilter; var query = new FilteredElementCollector(doc) .WhereElementIsNotElementType() .WhereElementIsNotElementType() .WhereElementIsViewIndependent() .Where(x => x.IsPhysicalElement()) .Where(fi => fi.LookupParameter(propFilter.PropertyName) != null); propFilter.PropertyValue = propFilter.PropertyValue.ToLowerInvariant(); switch (propFilter.PropertyOperator) { case "equals": query = query.Where(fi => GetStringValue(fi.LookupParameter(propFilter.PropertyName)) == propFilter.PropertyValue); break; case "contains": query = query.Where(fi => GetStringValue(fi.LookupParameter(propFilter.PropertyName)).Contains(propFilter.PropertyValue)); break; case "is greater than": query = query.Where(fi => UnitUtils.ConvertFromInternalUnits( fi.LookupParameter(propFilter.PropertyName).AsDouble(), fi.LookupParameter(propFilter.PropertyName).DisplayUnitType) > double.Parse(propFilter.PropertyValue)); break; case "is less than": query = query.Where(fi => UnitUtils.ConvertFromInternalUnits( fi.LookupParameter(propFilter.PropertyName).AsDouble(), fi.LookupParameter(propFilter.PropertyName).DisplayUnitType) < double.Parse(propFilter.PropertyValue)); break; } selection = query.ToList(); } catch (Exception e) { Log.CaptureException(e); } return(selection); } return(selection); }
public void Execute(UIApplication uiapp) { try { UIDocument uidoc = uiapp.ActiveUIDocument; Document doc = uidoc.Document; // myListView_ALL_Fam_Master.Items.Add(doc.GetElement(uidoc.Selection.GetElementIds().First()).Name); if (uidoc.Selection.GetElementIds().Count != 1) { MessageBox.Show("Please select ONE Wall."); return; } Element myElementWall = doc.GetElement(uidoc.Selection.GetElementIds().First()); if (myElementWall.GetType() == typeof(FamilyInstance)) { FamilyInstance myFamilyInstance = myElementWall as FamilyInstance; myElementWall = myFamilyInstance.Host; if (myElementWall == null) { MessageBox.Show("Family instance must be hosted to a wall."); return; } } /// TECHNIQUE 07 OF 19 (EE07_RotatingEntities.cs) ///↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ROTATING ENTITIES ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ /// /// Interfaces and ENUM's: /// /// /// Demonstrates classes: /// FamilyInstance /// Line /// Wall /// Curve /// ElementTransformUtils /// /// /// Key methods: /// ((LocationPoint)myFamilyInstance.Location).Point; /// Line.CreateUnbound( /// myFamilyInstance.GetTransform().BasisZ /// /// ((LocationCurve)myWall.Location).Curve /// XYZ myXYZ = (myCurve.GetEndPoint(1) + myCurve.GetEndPoint(0)) / 2; /// /// ElementTransformUtils.RotateElement( /// /// /// /// https://github.com/joshnewzealand/Revit-API-Playpen-CSharp /// List <Element> myListOfStuffOnWall = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).OfCategory(BuiltInCategory.OST_GenericModel).Where(x => (((FamilyInstance)x).Host != null)).Where(x => ((FamilyInstance)x).Host.Id == myElementWall.Id).ToList(); List <Element> myListOfFurniture = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).OfCategory(BuiltInCategory.OST_Furniture).Where(x => (((FamilyInstance)x).Host != null)).Where(x => ((FamilyInstance)x).Host.Id == myElementWall.Id).ToList(); myListOfStuffOnWall.AddRange(myListOfFurniture); if (myListOfStuffOnWall.Count() > 0) { using (Transaction tx = new Transaction(doc)) { tx.Start("Rotate People"); foreach (FamilyInstance myFI in myListOfStuffOnWall) { FamilyInstance myFamilyInstance = myFI as FamilyInstance; XYZ myXYZInstance = ((LocationPoint)myFamilyInstance.Location).Point; Line myLineBasisY = Line.CreateUnbound(myXYZInstance, myFamilyInstance.GetTransform().BasisZ); // tf_01072_4 = Transform.CreateRotation(myTransform_FakeBasis2.BasisZ, d1 / 10 * myInt_DivideInteger); ElementTransformUtils.RotateElement(doc, myFamilyInstance.Id, myLineBasisY, Math.PI / 4); } tx.Commit(); } } if (myWindow1.myCheckBoxWithWall.IsChecked.Value) { if (myElementWall.Category.Name == "Walls") { Wall myWall = myElementWall as Wall; using (Transaction tx = new Transaction(doc)) { tx.Start("Rotate Wall"); Curve myCurve = ((LocationCurve)myWall.Location).Curve; XYZ myXYZ = (myCurve.GetEndPoint(1) + myCurve.GetEndPoint(0)) / 2; Line myLineBasisZ = Line.CreateUnbound(myXYZ, XYZ.BasisZ); ElementTransformUtils.RotateElement(doc, myWall.Id, myLineBasisZ, Math.PI / 20); tx.Commit(); } } } } #region catch and finally catch (Exception ex) { _952_PRLoogleClassLibrary.DatabaseMethods.writeDebug("EE07_RotatingEntities" + Environment.NewLine + ex.Message + Environment.NewLine + ex.InnerException, true); } finally { } #endregion }
/// <summary> /// Given the filter in use by a stream returns the document elements that match it. /// </summary> /// <param name="filter"></param> /// <returns></returns> private List <Element> GetSelectionFilterObjects(ISelectionFilter filter) { var doc = CurrentDoc.Document; var selection = new List <Element>(); switch (filter.Slug) { case "all": selection.AddRange(doc.SupportedElements()); // includes levels selection.Add(doc.ProjectInformation); selection.AddRange(doc.Views2D()); selection.AddRange(doc.Views3D()); selection.AddRange(doc.SupportedTypes()); return(selection); case "category": var catFilter = filter as ListSelectionFilter; var bics = new List <BuiltInCategory>(); var categories = ConnectorRevitUtils.GetCategories(doc); IList <ElementFilter> elementFilters = new List <ElementFilter>(); foreach (var cat in catFilter.Selection) { elementFilters.Add(new ElementCategoryFilter(categories[cat].Id)); } var categoryFilter = new LogicalOrFilter(elementFilters); selection = new FilteredElementCollector(doc) .WhereElementIsNotElementType() .WhereElementIsViewIndependent() .WherePasses(categoryFilter).ToList(); return(selection); case "view": var viewFilter = filter as ListSelectionFilter; var views = new FilteredElementCollector(doc) .WhereElementIsNotElementType() .OfClass(typeof(View)) .Where(x => viewFilter.Selection.Contains(x.Name)); foreach (var view in views) { var ids = selection.Select(x => x.UniqueId); var viewElements = new FilteredElementCollector(doc, view.Id) .WhereElementIsNotElementType() .WhereElementIsViewIndependent() .Where(x => x.IsPhysicalElement()) .Where(x => !ids.Contains(x.UniqueId)) //exclude elements already added from other views .ToList(); selection.AddRange(viewElements); } return(selection); case "project-info": var projectInfoFilter = filter as ListSelectionFilter; if (projectInfoFilter.Selection.Contains("Project Info")) { selection.Add(doc.ProjectInformation); } if (projectInfoFilter.Selection.Contains("Views 2D")) { selection.AddRange(doc.Views2D()); } if (projectInfoFilter.Selection.Contains("Views 3D")) { selection.AddRange(doc.Views3D()); } if (projectInfoFilter.Selection.Contains("Levels")) { selection.AddRange(doc.Levels()); } if (projectInfoFilter.Selection.Contains("Families & Types")) { selection.AddRange(doc.SupportedTypes()); } return(selection); case "param": try { var propFilter = filter as PropertySelectionFilter; var query = new FilteredElementCollector(doc) .WhereElementIsNotElementType() .WhereElementIsNotElementType() .WhereElementIsViewIndependent() .Where(x => x.IsPhysicalElement()) .Where(fi => fi.LookupParameter(propFilter.PropertyName) != null); propFilter.PropertyValue = propFilter.PropertyValue.ToLowerInvariant(); switch (propFilter.PropertyOperator) { case "equals": query = query.Where(fi => GetStringValue(fi.LookupParameter(propFilter.PropertyName)) == propFilter.PropertyValue); break; case "contains": query = query.Where(fi => GetStringValue(fi.LookupParameter(propFilter.PropertyName)).Contains(propFilter.PropertyValue)); break; case "is greater than": query = query.Where(fi => RevitVersionHelper.ConvertFromInternalUnits( fi.LookupParameter(propFilter.PropertyName).AsDouble(), fi.LookupParameter(propFilter.PropertyName)) > double.Parse(propFilter.PropertyValue)); break; case "is less than": query = query.Where(fi => RevitVersionHelper.ConvertFromInternalUnits( fi.LookupParameter(propFilter.PropertyName).AsDouble(), fi.LookupParameter(propFilter.PropertyName)) < double.Parse(propFilter.PropertyValue)); break; } selection = query.ToList(); } catch (Exception e) { Log.CaptureException(e); } return(selection); } return(selection); }
public void Execute(UIApplication uiapp) { try { UIDocument uidoc = uiapp.ActiveUIDocument; Document doc = uidoc.Document; // myListView_ALL_Fam_Master.Items.Add(doc.GetElement(uidoc.Selection.GetElementIds().First()).Name); if (uidoc.Selection.GetElementIds().Count != 1) { MessageBox.Show("Please select ONE Wall."); return; } Element myElementWall = doc.GetElement(uidoc.Selection.GetElementIds().First()); if (myElementWall.GetType() == typeof(FamilyInstance)) { FamilyInstance myFamilyInstance = myElementWall as FamilyInstance; myElementWall = myFamilyInstance.Host; if (myElementWall == null) { MessageBox.Show("Family instance must be hosted to a wall."); return; } } /// TECHNIQUE 08 OF 19 (EE08_MoveElementAroundHostingSurface.cs) ///↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ MOVING ELEMENTS AROUND A HOSTING SURFACE ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ /// The people walk around the perimeter of the wall, and it will work on any surface /// /// /// Interfaces and ENUM's: /// /// /// Demonstrates classes: /// Reference /// Face /// Transform /// PlanarFace /// CurveLoop /// /// /// Key methods: /// myElementWall.GetGeometryObjectFromReference(pickedRef) as Face /// pickedRef.ConvertToStableRepresentation(doc).Contains("INSTANCE")) /// (myElementWall as FamilyInstance).GetTotalTransform(); /// myFace.GetBoundingBox().Min /// myFace.Evaluate(myUV_Min) /// /// myXYZ_FamilyTransform.OfPoint(myXYZ_CornerOne) /// myXYZ_FamilyTransform.OfVector(myPlanarFace.XVector); /// myCurveLoop.GetExactLength(); /// /// /// L1.GetEndPoint(0)).Normalize().Multiply(myDouble_ThisFarAlong); /// ElementTransformUtils.MoveElement(doc, myFamilyInstance.Id, myXYZ_MoveThisMuch); /// /// * class is actually part of the .NET framework (not Revit API) /// /// /// /// https://github.com/joshnewzealand/Revit-API-Playpen-CSharp List <Element> myListOfStuffOnWall = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).OfCategory(BuiltInCategory.OST_GenericModel).Where(x => (((FamilyInstance)x).Host != null)).Where(x => ((FamilyInstance)x).Host.Id == myElementWall.Id).ToList(); List <Element> myListOfFurniture = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).OfCategory(BuiltInCategory.OST_Furniture).Where(x => (((FamilyInstance)x).Host != null)).Where(x => ((FamilyInstance)x).Host.Id == myElementWall.Id).ToList(); myListOfStuffOnWall.AddRange(myListOfFurniture); if (myListOfStuffOnWall.Count() > 0) { using (Transaction tx = new Transaction(doc)) { tx.Start("Rotate People"); foreach (FamilyInstance myFI in myListOfStuffOnWall) { FamilyInstance myFamilyInstance = myFI as FamilyInstance; Reference pickedRef = myFI.HostFace; ////doc.Delete(myListElementID); ////myListElementID.Clear(); Face myFace = myElementWall.GetGeometryObjectFromReference(pickedRef) as Face; if (myFace == null) { return; } Transform myXYZ_FamilyTransform = Transform.Identity; if (pickedRef.ConvertToStableRepresentation(doc).Contains("INSTANCE")) { myXYZ_FamilyTransform = (myElementWall as FamilyInstance).GetTotalTransform(); } Transform myTransform = Transform.Identity; if (myFace.GetType() != typeof(PlanarFace)) { return; } PlanarFace myPlanarFace = myFace as PlanarFace; UV myUV_Min = myFace.GetBoundingBox().Min; UV myUV_Max = myFace.GetBoundingBox().Max; XYZ myXYZ_CornerOne = myFace.Evaluate(myUV_Min); myTransform.Origin = myXYZ_FamilyTransform.OfPoint(myXYZ_CornerOne); myTransform.BasisX = myXYZ_FamilyTransform.OfVector(myPlanarFace.XVector); myTransform.BasisY = myXYZ_FamilyTransform.OfVector(myPlanarFace.YVector); myTransform.BasisZ = myXYZ_FamilyTransform.OfVector(myPlanarFace.FaceNormal); XYZ myXYZ_Centre = XYZ.Zero; XYZ myXYZ_Min = new XYZ(myUV_Min.U, myUV_Min.V, 0); XYZ myXYZ_Max = new XYZ(myUV_Max.U, myUV_Max.V, 0); XYZ myXYZ_UV_CornerOne = (((myXYZ_Max - myXYZ_Min) * 0.1)); //; + myXYZ_Min; XYZ myXYZ_UV_CornerTwo = (((myXYZ_Max - myXYZ_Min) * 0.9)); // + myXYZ_Min; XYZ myXYZ_UV_Corner01 = new XYZ(myXYZ_UV_CornerOne.X, myXYZ_UV_CornerOne.Y, 0); XYZ myXYZ_UV_Corner02 = new XYZ(myXYZ_UV_CornerTwo.X, myXYZ_UV_CornerOne.Y, 0); XYZ myXYZ_UV_Corner03 = new XYZ(myXYZ_UV_CornerTwo.X, myXYZ_UV_CornerTwo.Y, 0); XYZ myXYZ_UV_Corner04 = new XYZ(myXYZ_UV_CornerOne.X, myXYZ_UV_CornerTwo.Y, 0); Line L1 = Line.CreateBound(myTransform.OfPoint(myXYZ_UV_Corner01), myTransform.OfPoint(myXYZ_UV_Corner02)); Line L2 = Line.CreateBound(myTransform.OfPoint(myXYZ_UV_Corner02), myTransform.OfPoint(myXYZ_UV_Corner03)); Line L3 = Line.CreateBound(myTransform.OfPoint(myXYZ_UV_Corner03), myTransform.OfPoint(myXYZ_UV_Corner04)); Line L4 = Line.CreateBound(myTransform.OfPoint(myXYZ_UV_Corner04), myTransform.OfPoint(myXYZ_UV_Corner01)); CurveLoop myCurveLoop = new CurveLoop(); myCurveLoop.Append(L1); myCurveLoop.Append(L2); myCurveLoop.Append(L3); myCurveLoop.Append(L4); double myDouble_ExactLength = myCurveLoop.GetExactLength(); double myDouble_ExactLength_Twenty = myDouble_ExactLength / 40; XYZ myXYZ_Result = myTransform.OfPoint((myXYZ_Max - myXYZ_Min) / 2); int myIntCurrentSpinnerValue = myWindow1.myIntegerUpDown_OneToTwentyCount.Value.Value; int myInt_Positioning = (40 / myListOfStuffOnWall.Count()) * (myListOfStuffOnWall.IndexOf(myFI) + 1); myIntCurrentSpinnerValue = (40 - myInt_Positioning) + myIntCurrentSpinnerValue; if (myIntCurrentSpinnerValue > 40) { myIntCurrentSpinnerValue = myIntCurrentSpinnerValue - 40; } double myDouble_FutureForeach = myDouble_ExactLength_Twenty * myIntCurrentSpinnerValue; double myDouble_ThisFarAlong; switch (myDouble_FutureForeach) { case double n when n < L1.Length: myDouble_ThisFarAlong = myDouble_FutureForeach; myXYZ_Result = L1.GetEndPoint(0) + (L1.GetEndPoint(1) - L1.GetEndPoint(0)).Normalize().Multiply(myDouble_ThisFarAlong); break; case double n when n >= L1.Length& n < L1.Length + L2.Length: myDouble_ThisFarAlong = myDouble_FutureForeach - L1.Length; myXYZ_Result = L2.GetEndPoint(0) + (L2.GetEndPoint(1) - L2.GetEndPoint(0)).Normalize().Multiply(myDouble_ThisFarAlong); break; case double n when n >= L1.Length + L2.Length& n < L1.Length + L2.Length + L3.Length: myDouble_ThisFarAlong = myDouble_FutureForeach - L1.Length - L2.Length; myXYZ_Result = L3.GetEndPoint(0) + (L3.GetEndPoint(1) - L3.GetEndPoint(0)).Normalize().Multiply(myDouble_ThisFarAlong); break; case double n when n >= L1.Length + L2.Length + L3.Length: myDouble_ThisFarAlong = myDouble_FutureForeach - L1.Length - L2.Length - L3.Length; myXYZ_Result = L4.GetEndPoint(0) + (L4.GetEndPoint(1) - L4.GetEndPoint(0)).Normalize().Multiply(myDouble_ThisFarAlong); break; } XYZ myXYZ_MoveThisMuch = myXYZ_Result - ((LocationPoint)myFamilyInstance.Location).Point; ElementTransformUtils.MoveElement(doc, myFamilyInstance.Id, myXYZ_MoveThisMuch); //SketchPlane mySketchPlane = SketchPlane.Create(doc, pickedRef); //myListElementID.Add(doc.Create.NewModelCurve(L1, mySketchPlane).Id); //myListElementID.Add(doc.Create.NewModelCurve(L2, mySketchPlane).Id); //myListElementID.Add(doc.Create.NewModelCurve(L3, mySketchPlane).Id); //myListElementID.Add(doc.Create.NewModelCurve(L4, mySketchPlane).Id); } tx.Commit(); } if (myWindow1.myIntegerUpDown_OneToTwentyCount.Value.Value == 40) { myWindow1.myIntegerUpDown_OneToTwentyCount.Value = 0; } myWindow1.myIntegerUpDown_OneToTwentyCount.Value++; } } #region catch and finally catch (Exception ex) { DatabaseMethods.writeDebug("EE08_MoveElementAroundHostingSurface" + Environment.NewLine + ex.Message + Environment.NewLine + ex.InnerException, true); } finally { } #endregion }
Result IExternalCommand.Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { Debug.Listeners.Clear(); Debug.Listeners.Add(new RbsLogger.Logger("ElementsElevation")); Document doc = commandData.Application.ActiveUIDocument.Document; Config cfg = Config.Activate(false); if (cfg == null) { Debug.WriteLine("Unable to read config xml file"); return(Result.Cancelled); } List <FamilyInstance> fams = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance)).Cast <FamilyInstance>().ToList(); List <FamilyInstance> famsHoles = new List <FamilyInstance>(); List <Element> ColumnsAndWalls = new FilteredElementCollector(doc) .WhereElementIsNotElementType() .OfClass(typeof(FamilyInstance)) .OfCategory(BuiltInCategory.OST_StructuralColumns) .ToList(); ColumnsAndWalls.AddRange(new FilteredElementCollector(doc).OfClass(typeof(Wall)).ToList()); Debug.WriteLine("Columns and wall found: " + ColumnsAndWalls.Count); int ColumnAndWallsCount = 0; Parameter paramBaseLevelElev; Parameter paramElevOnLevel; foreach (FamilyInstance fi in fams) { string famname = fi.Symbol.FamilyName; if (string.IsNullOrEmpty(famname)) { continue; } int prefixLength = cfg.namePrefixes.First().Length; if (famname.Length <= prefixLength) { continue; } string firstSymbols = famname.Substring(0, prefixLength); if (cfg.namePrefixes.Contains(firstSymbols)) { paramBaseLevelElev = fi.LookupParameter(cfg.paramBaseLevel); paramElevOnLevel = fi.LookupParameter(cfg.paramElevOnLevel); if (paramBaseLevelElev != null && paramElevOnLevel != null) { famsHoles.Add(fi); } } } Debug.WriteLine("Holes found: " + famsHoles.Count); Level baseLevel = null; double elev = 0; int count = 0; int err = 0; BasePoint projectBasePoint = new FilteredElementCollector(doc) .OfClass(typeof(BasePoint)) .WhereElementIsNotElementType() .Cast <BasePoint>() .Where(i => i.IsShared == false) .First(); double projectPointElevation = projectBasePoint.get_BoundingBox(null).Min.Z; Debug.WriteLine("Project base point elevation: " + (projectPointElevation * 304.8).ToString()); using (Transaction t = new Transaction(doc)) { t.Start("Transaction"); if (famsHoles.Count == 0 && ColumnsAndWalls.Count == 0) { TaskDialog.Show("Holes elevation", "Семейства не найдены. Проверьте настройки"); return(Result.Failed); } else { foreach (FamilyInstance fi in famsHoles) { Debug.WriteLine("Current family: " + fi.Id.IntegerValue); baseLevel = LevelUtils.GetBaseLevelofElement(fi); if (baseLevel != null) //обычные семейства на основе стены { elev = LevelUtils.GetOffsetFromLevel(fi); } else //семейства без основы - худший вариант; у семейства нет ни уровня, ни основы. ищу ближайший уровень через координаты { Debug.WriteLine("Family is without base level!"); LocationPoint lp = fi.Location as LocationPoint; if (lp == null) { Debug.WriteLine("No location point"); continue; } XYZ point = lp.Point; Debug.WriteLine("Location point: " + point.ToString()); baseLevel = LevelUtils.GetNearestLevel(point, doc, projectPointElevation); if (baseLevel == null) { message += "Не удалось получить уровень для элемента " + fi.Name + " id " + fi.Id; message += " на отметке " + (point.Z * 304.8).ToString("F0"); Debug.WriteLine("Unable to get level. " + message); elements.Insert(fi); } elev = point.Z - baseLevel.Elevation - projectPointElevation; Debug.WriteLine("Nearest level id: " + baseLevel.Id.IntegerValue + ", elev: " + elev.ToString("F1")); } GetParameter(fi, cfg.paramElevOnLevel, true).Set(elev); GetParameter(fi, cfg.paramBaseLevel, true).Set(baseLevel.Elevation); count++; } } Debug.WriteLine("Families done: " + count); if (cfg.useWallAndColumns) { Debug.WriteLine("Start wall and columns processing"); foreach (Element elem in ColumnsAndWalls) { Debug.WriteLine("Current elem id: " + elem.Id.IntegerValue); Parameter baseLevelParam = null; Parameter baseOffsetParam = null; Parameter topLevelParam = null; Parameter topOffsetParam = null; if (elem is FamilyInstance) { Debug.WriteLine("It is column"); FamilyInstance col = elem as FamilyInstance; baseLevelParam = col.get_Parameter(BuiltInParameter.SCHEDULE_BASE_LEVEL_PARAM); baseOffsetParam = col.get_Parameter(BuiltInParameter.SCHEDULE_BASE_LEVEL_OFFSET_PARAM); topLevelParam = col.get_Parameter(BuiltInParameter.SCHEDULE_TOP_LEVEL_PARAM); topOffsetParam = col.get_Parameter(BuiltInParameter.SCHEDULE_TOP_LEVEL_OFFSET_PARAM); } else if (elem is Wall) { Debug.WriteLine("It is wall"); Wall w = elem as Wall; baseLevelParam = w.get_Parameter(BuiltInParameter.WALL_BASE_CONSTRAINT); baseOffsetParam = w.get_Parameter(BuiltInParameter.WALL_BASE_OFFSET); topLevelParam = w.get_Parameter(BuiltInParameter.WALL_HEIGHT_TYPE); topOffsetParam = w.get_Parameter(BuiltInParameter.WALL_TOP_OFFSET); } if (baseLevelParam == null || baseOffsetParam == null || topLevelParam == null || topOffsetParam == null) { Debug.WriteLine("Incorrect level or height parameters"); continue; } Level baseLev = doc.GetElement(baseLevelParam.AsElementId()) as Level; if (baseLev == null) { Debug.WriteLine("No base level"); continue; } double baseLevElev = baseLev.Elevation; double baseOffset = baseOffsetParam.AsDouble(); double baseElev = baseLevElev + baseOffset; Level topLev = doc.GetElement(topLevelParam.AsElementId()) as Level; double topElev = 0; if (topLev == null) { if (elem is Wall) { double heigth = elem.get_Parameter(BuiltInParameter.WALL_USER_HEIGHT_PARAM).AsDouble(); topElev = baseElev + heigth; } else { continue; } } else { double topLevElev = topLev.Elevation; double topOffset = topOffsetParam.AsDouble(); topElev = topLevElev + topOffset; } SetElevParamValue(elem, baseElev, cfg.paramBottomElevName, cfg); SetElevParamValue(elem, topElev, cfg.paramTopElevName, cfg); ColumnAndWallsCount++; Debug.WriteLine("Walls and columns done: " + ColumnAndWallsCount); //заполняю сокращенную марку //Parameter shortMarkParam = elem.LookupParameter("МаркаСокращенная"); //if (shortMarkParam == null) continue; //Parameter markParam = elem.get_Parameter(BuiltInParameter.ALL_MODEL_MARK); //if (markParam == null) continue; //if (!markParam.HasValue) continue; //string mark = markParam.AsString(); //if (string.IsNullOrEmpty(mark)) continue; //string[] markArray = mark.Split('-'); //if (markArray.Length < 3) continue; //string shortMark = markArray[0] + "-" + markArray[2]; //shortMarkParam.Set(shortMark); } } t.Commit(); } string msg = "Найдено проемов и отверстий: " + famsHoles.Count.ToString() + "\nОбработано семейств: " + count + "\nНе удалось обработать: " + err; if (cfg.useWallAndColumns) { msg += "\nЕще обработано колонн и стен: " + ColumnAndWallsCount; } Debug.WriteLine(msg); BalloonTip.Show("Holes elevation", msg); cfg.Save(); return(Result.Succeeded); }