public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { var uiapp = commandData.Application; var uidoc = uiapp.ActiveUIDocument; var doc = uidoc.Document; var handler = new GridInstallEvent(); var exEvent = ExternalEvent.Create(handler); var grid = new GridSetup(exEvent, handler); var window = WindowSetup(grid); //---------------------------------------------------------------------------------------- var selection = uidoc.Selection; Room newRoom = null; //-----User select existing Room first----- if (selection.GetElementIds().Count > 0) { foreach (var item in selection.GetElementIds()) { var elementType = doc.GetElement(item); if (elementType.ToString() == typeof(Room).ToString()) { newRoom = elementType as Room; } } } using (var transaction = new Transaction(doc, "Get room parameters")) { transaction.Start(); var view = doc.ActiveView; if (newRoom == null) { try { if (uidoc.ActiveView.SketchPlane == null || view.GenLevel == null) { TaskDialog.Show("Section View", "Please switch to level view."); return(Result.Cancelled); } var point = selection.PickPoint("Point to create a room"); newRoom = doc.Create.NewRoom(view.GenLevel, new UV(point.X, point.Y)); } catch (OperationCanceledException) { return(Result.Cancelled); } } //---------------------------------------------------------------------------------------- var box = newRoom.get_BoundingBox(view); if (box == null) { return(Result.Failed); } PointF roomMin = new PointF(); roomMin.X = (float)(box.Min.X * FeetToMil); roomMin.Y = (float)(box.Min.Y * FeetToMil); PointF roomMax = new PointF(); roomMax.X = (float)(box.Max.X * FeetToMil); roomMax.Y = (float)(box.Max.Y * FeetToMil); var roomDimensions = new RoomDimensions(); grid.Scale = roomDimensions.GetScale(roomMin, roomMax, grid.CanvasSize); grid.RevitWalls = roomDimensions.GetWalls(newRoom); if (grid.RevitWalls.Count == 0) { TaskDialog.Show("Error", "Room not detected"); return(Result.Cancelled); } grid.Derrivation = GetDerrivation(box, grid); var bBox = new WpfCoordinates(); grid.BoundingBoxLines = bBox.GetBoundingBox(roomMin, roomMax, grid); SymbolPreselectCheck(window); grid.DrawWalls(); transaction.RollBack(); } grid.TextBoxScale.Text = "Scale 1: " + grid.Scale; return(Result.Succeeded); }