//*****************************findLevel()***************************** public Level findLevel(Document doc, ObjDoors door) { string levelName = door.level.Name; // LINQ to find the level by its name. Level level = (from lvl in new FilteredElementCollector(doc). OfClass(typeof(Level)). Cast <Level>() where (lvl.Name == levelName) select lvl).First(); return(level); }
//*****************************findSymbol()***************************** public FamilySymbol findSymbol(Document doc, ObjDoors door) { string fsFamilyName = "Door-Opening"; string fsName = door.doorName; // LINQ to find the window's FamilySymbol by its type name. FamilySymbol familySymbol = (from fs in new FilteredElementCollector(doc). OfClass(typeof(FamilySymbol)). Cast <FamilySymbol>() where (fs.Family.Name == fsFamilyName && fs.Name == fsName) select fs).First(); return(familySymbol); }
//*****************************changeType()***************************** public void changeType(Document doc, ObjDoors CurrentDoors, FamilySymbol symbol) { Element e = CurrentDoors.doorElement; FamilyInstance familyInstance = e as FamilyInstance; // Transaction to change the element type Transaction trans = new Transaction(doc, "Edit Type"); trans.Start(); try { familyInstance.Symbol = symbol; } catch { } trans.Commit(); }
//*****************************CreateNewType()***************************** public FamilySymbol CreateNewType(Document doc, FamilySymbol oldType, ObjDoors linkedDoor, double offset) { double height = Math.Round(linkedDoor.doorHeight + offset, 3); double width = Math.Round(linkedDoor.doorWidth, 3); String doorType = doorTypeByUnits(doc, height, width); FamilySymbol familySymbol = null; using (Transaction t = new Transaction(doc, "Duplicate door")) { t.Start("duplicate"); familySymbol = oldType.Duplicate(doorType) as FamilySymbol; familySymbol.get_Parameter(BuiltInParameter.FAMILY_ROUGH_WIDTH_PARAM).Set(width); familySymbol.get_Parameter(BuiltInParameter.FAMILY_ROUGH_HEIGHT_PARAM).Set(height); t.Commit(); } return(familySymbol); }
public List <ObjDoors> CurrentModelDoors(Document doc) { List <ObjDoors> currentModelDoors = new List <ObjDoors>(); { LibraryGetItems library = new LibraryGetItems(); List <Element> doors = library.GetFamilyElement(doc, BuiltInCategory.OST_Doors); foreach (Element door in doors) { LocationPoint location = door.Location as LocationPoint; // Get level id parameter Parameter levelId = door.get_Parameter(BuiltInParameter.FAMILY_LEVEL_PARAM); // Get level value of id parameter string parmLevel_Id = library.GetParameterValue(levelId); // get all levels in current model List <Level> levels = library.GetLevels(doc); // find and match of door level and current model level to get level Level levelName = levels.Find(x => Convert.ToString(x.Id.IntegerValue) == parmLevel_Id); FamilySymbol familySymbol = library.GetFamilySymbol(doc, door.Name, BuiltInCategory.OST_Doors); // find unique identification of door //1bb68248-4b34-4821-9be3-8ddf47852209 = SOM ID var SOMIDParam = door.LookupParameter("SOM ID"); string doorId = library.GetParameterValue(SOMIDParam); ObjDoors ObjectDoor = new ObjDoors(); ObjectDoor.doorElement = door; ObjectDoor.doorName = door.Name; ObjectDoor.doorId = doorId; ObjectDoor.doorWidth = familySymbol.get_Parameter(BuiltInParameter.FAMILY_ROUGH_WIDTH_PARAM).AsDouble(); ObjectDoor.doorHeight = familySymbol.get_Parameter(BuiltInParameter.FAMILY_ROUGH_HEIGHT_PARAM).AsDouble(); ObjectDoor.X = location.Point.X; ObjectDoor.Y = location.Point.Y; ObjectDoor.Z = location.Point.Z; ObjectDoor.level = levelName; currentModelDoors.Add(ObjectDoor); } } return(currentModelDoors); }
//*****************************MoveDoors()***************************** public void MoveDoors(Document doc, ObjDoors linkedDoor, ObjDoors localDoor) { Element linkedElement = linkedDoor.doorElement; Element localElement = localDoor.doorElement; // get the column current location LocationPoint New_InstanceLocation = linkedElement.Location as LocationPoint; LocationPoint Old_InstanceLocation = localElement.Location as LocationPoint; XYZ oldPlace = Old_InstanceLocation.Point; // XY double New_x = linkedDoor.X; double New_y = linkedDoor.Y; //Get Level Level New_level = findLevel(doc, linkedDoor); XYZ New_xyz = new XYZ(New_x, New_y, New_level.Elevation); double Move_X = New_x - oldPlace.X; double Move_Y = New_y - oldPlace.Y; //Get Level Level Old_level = findLevel(doc, linkedDoor); double Move_Z = New_level.Elevation - Old_level.Elevation; // Move the element to new location. XYZ new_xyz = new XYZ(Move_X, Move_Y, Move_Z); //Start move using a transaction. Transaction t = new Transaction(doc); t.Start("Move Element"); ElementTransformUtils.MoveElement(doc, localElement.Id, new_xyz); //ElementTransformUtils.RotateElement(doc, element.Id, New_Axis, Rotate); t.Commit(); }
//*****************************RemoveUnused()***************************** public void RemoveUnused(Document doc, List <ObjDoors> List_DoorsLinkedModel, List <ObjDoors> List_DoorsCurrentModel) { foreach (ObjDoors CurrentDoor in List_DoorsCurrentModel) { // check to see if door exist ObjDoors DoorFound = List_DoorsLinkedModel.Find(x => x.doorId == CurrentDoor.doorId); // if it doesn't exist it will remove door from project if (DoorFound == null) { try { Transaction t = new Transaction(doc); t.Start("Remove Element"); Element e = CurrentDoor.doorElement; doc.Delete(e.Id); t.Commit(); } catch (Exception e) { string ErrMessage = e.Message; } } } }
//*****************************DoorProgram()***************************** public List <ObjDoors> DoorProgram(Document doc, UIDocument uidoc, List <ObjDoors> List_DoorsLinkedModel, List <ObjDoors> List_DoorsCurrentModel) { List <ObjDoors> ListObjDoors = new List <ObjDoors>(); // logger object. Logger logger = LogManager.GetLogger("program"); ExportExcel exportExcel = new ExportExcel(); // Get all levels and add to field. LibraryGetItems libGetItems = new LibraryGetItems(); _ListLevels = libGetItems.GetLevels(doc); foreach (ObjDoors linkedDoor in List_DoorsLinkedModel) { // check to see if door exist ObjDoors DoorFound = List_DoorsCurrentModel.Find(x => x.doorId == linkedDoor.doorId); // if it doesn't exist it will create a new door. if (DoorFound == null) { try { ObjDoors door = CreateDoors(uidoc, doc, linkedDoor); ListObjDoors.Add(door); } catch (Exception e) { string ErrMessage = e.Message; } } // if door exist the check to see if the location is the same and type. if (DoorFound != null) { try { MoveDoors(doc, linkedDoor, DoorFound); } catch (Exception e) { string ErrMessage = e.Message; } // Get all the levels from current project. Level level = findLevel(doc, linkedDoor); // Level offset from architecture. LibraryGetItems Library = new LibraryGetItems(); LibraryConvertUnits library_Units = new LibraryConvertUnits(); double offset = 0; Level CurrentLevel = _ListLevels.Find(x => x.Name == level.Name); try { Parameter parameter_LevelOffsetFF = CurrentLevel.LookupParameter("LEVEL OFFSET FF"); offset = library_Units.InchesToFeet(Convert.ToDouble(Library.GetParameterValue(parameter_LevelOffsetFF))); } catch { } // Check to see if door size match. double height = Math.Round(linkedDoor.doorHeight + offset, 3); double width = Math.Round(linkedDoor.doorWidth, 3); String doorType = doorTypeByUnits(doc, height, width); if (doorType != "0 x 0") { if (DoorFound.doorName != doorType) { //FamilySymbol familySymbol = findSymbol(doc, DoorFound, doorType); FamilySymbol familySymbol = FindElementByName(doc, typeof(FamilySymbol), doorType) as FamilySymbol; if (familySymbol == null) { FamilySymbol oldType = findSymbol(doc, DoorFound); FamilySymbol ChangeFamilySymbol = CreateNewType(doc, oldType, linkedDoor, offset); //FamilySymbol ChangeFamilySymbol = BKK_CreateNewType(doc, oldType, linkedDoor); changeType(doc, DoorFound, ChangeFamilySymbol); } if (familySymbol != null) { changeType(doc, DoorFound, familySymbol); } } } } } //REMOVE UNSUED DOORS. RemoveUnused(doc, List_DoorsLinkedModel, List_DoorsCurrentModel); return(ListObjDoors); }
//*****************************CreateDoors()***************************** public ObjDoors CreateDoors(UIDocument uidoc, Document doc, ObjDoors linkedDoor) { LibraryGetItems Library = new LibraryGetItems(); LibraryConvertUnits library_Units = new LibraryConvertUnits(); // Get all the levels from current project. Level level = findLevel(doc, linkedDoor); // Level offset from architecture. double offset = 0; Level CurrentLevel = _ListLevels.Find(x => x.Name == level.Name); try { Parameter parameter_LevelOffsetFF = CurrentLevel.LookupParameter("LEVEL OFFSET FF"); offset = library_Units.InchesToFeet(Convert.ToDouble(Library.GetParameterValue(parameter_LevelOffsetFF))); } catch { } // CREATE : door type height x width double height = Math.Round(linkedDoor.doorHeight + offset, 3); double width = Math.Round(linkedDoor.doorWidth, 3); String doorType = doorTypeByUnits(doc, height, width); if (doorType != "0 x 0") { FamilySymbol currentDoorType = null; try { currentDoorType = FindElementByName(doc, typeof(FamilySymbol), doorType) as FamilySymbol; } catch { } if (currentDoorType == null) { FamilySymbol familySymbol_OldType = FindElementByName(doc, typeof(FamilySymbol), "10 x 10") as FamilySymbol; currentDoorType = CreateNewType(doc, familySymbol_OldType, linkedDoor, offset); } // Convert coordinates to double and create XYZ point. Use offset level from current model. XYZ xyz = new XYZ(linkedDoor.X, linkedDoor.Y, CurrentLevel.Elevation + linkedDoor.doorSillHeight); //Find the hosting Wall (nearst wall to the insertion point) List <Wall> walls = Library.GetWalls(doc); Wall wall = null; double distance = double.MaxValue; foreach (Element e in walls) { Wall w = e as Wall; LocationCurve lc = w.Location as LocationCurve; Curve curve = lc.Curve; XYZ z = curve.GetEndPoint(0); if (linkedDoor.level.Elevation <= z.Z + 3 && linkedDoor.level.Elevation >= z.Z - 3) { int i = w.Id.IntegerValue; } //int i = w.Id.IntegerValue; double proximity = (w.Location as LocationCurve).Curve.Distance(xyz); if (proximity < distance) { distance = proximity; var SOMIDParam = e.LookupParameter("SOM ID"); string wallSOMId = Library.GetParameterValue(SOMIDParam); if (linkedDoor.HostObj.ToString() == wallSOMId) { wall = w; } } } try { if (wall != null) { // Create door. using (Transaction t = new Transaction(doc, "Create door")) { t.Start(); if (!currentDoorType.IsActive) { // Ensure the family symbol is activated. currentDoorType.Activate(); doc.Regenerate(); } // Create window // unless you specified a host, Revit will create the family instance as orphabt object. FamilyInstance fm = doc.Create.NewFamilyInstance(xyz, currentDoorType, wall, level, StructuralType.NonStructural); // Set new local door id to match linked model element id. Parameter SOMIDParam = fm.LookupParameter("SOM ID"); SOMIDParam.Set(linkedDoor.doorId); linkedDoor.wall = wall; t.Commit(); return(linkedDoor); } } } catch { } } return(null); }
/// <summary> /// Get linked model and select all the doors. /// </summary> /// <param name="doc"></param> /// <param name="uiApp"></param> /// <returns>Object of doors</returns> public List <ObjDoors> LinkedModelDoors(Document doc, UIApplication uiApp) { FilteredElementCollector collector = new FilteredElementCollector(doc); IList <Element> elems = collector .OfCategory(BuiltInCategory.OST_RvtLinks) .OfClass(typeof(RevitLinkType)) .ToElements(); List <ObjDoors> LinkedModelDoors = new List <ObjDoors>(); foreach (Element e in elems) { RevitLinkType linkType = e as RevitLinkType; String s = String.Empty; foreach (Document linkedDoc in uiApp.Application.Documents) { if (linkedDoc.Title.Equals(linkType.Name)) { LibraryGetItems library = new LibraryGetItems(); List <Element> doors = library.GetFamilyElement(linkedDoc, BuiltInCategory.OST_Doors); foreach (Element door in doors) { try { LocationPoint location = door.Location as LocationPoint; // Get level id parameter Parameter levelId = door.get_Parameter(BuiltInParameter.FAMILY_LEVEL_PARAM); // Get level value of id parameter string parmLevel_Id = library.GetParameterValue(levelId); // get all levels in linked model List <Level> levels = library.GetLevels(linkedDoc); // find and match of door level and linked model level to get level Level levelName = levels.Find(x => Convert.ToString(x.Id.IntegerValue) == parmLevel_Id); FamilySymbol familySymbol = library.GetFamilySymbol(linkedDoc, door.Name, BuiltInCategory.OST_Doors); // find unique identification of door\ ObjDoors ObjectDoor = new ObjDoors(); ObjectDoor.doorElement = door; ObjectDoor.doorName = door.Name; ObjectDoor.doorId = door.Id.ToString(); ObjectDoor.doorWidth = door.get_Parameter(BuiltInParameter.DOOR_WIDTH).AsDouble(); try { if (ObjectDoor.doorWidth == 0.0) { ObjectDoor.doorWidth = familySymbol.get_Parameter(BuiltInParameter.DOOR_WIDTH).AsDouble(); } } catch { } ObjectDoor.doorHeight = door.get_Parameter(BuiltInParameter.DOOR_HEIGHT).AsDouble(); try { if (ObjectDoor.doorHeight == 0.0) { ObjectDoor.doorHeight = familySymbol.get_Parameter(BuiltInParameter.DOOR_HEIGHT).AsDouble(); } } catch { } ObjectDoor.doorSillHeight = door.get_Parameter(BuiltInParameter.INSTANCE_SILL_HEIGHT_PARAM).AsDouble(); ObjectDoor.X = location.Point.X; ObjectDoor.Y = location.Point.Y; ObjectDoor.Z = location.Point.Z; ObjectDoor.level = levelName; FamilyInstance familyInstance = door as FamilyInstance; ObjectDoor.HostObj = familyInstance.Host.Id.IntegerValue; ObjectDoor.wall = linkedDoc.GetElement(familyInstance.Host.Id) as Wall; LinkedModelDoors.Add(ObjectDoor); } catch (Exception er) { string error = er.Message; } } } } } return(LinkedModelDoors); }