/// <summary> /// Implement this method as an external command for Revit. /// </summary> /// <param name="commandData">An object that is passed to the external application /// which contains data related to the command, /// such as the application object and active view.</param> /// <param name="message">A message that can be set by the external application /// which will be displayed if a failure or cancellation is returned by /// the external command.</param> /// <param name="elements">A set of elements to which the external application /// can add elements that are to be highlighted in case of failure or cancellation.</param> /// <returns>Return the status of the external command. /// A result of Succeeded means that the API external method functioned as expected. /// Cancelled can be used to signify that the user canceled the external operation /// at some point. Failure should be returned if the application is unable to proceed with /// the operation.</returns> public Autodesk.Revit.UI.Result Execute(Autodesk.Revit.UI.ExternalCommandData commandData, ref string message, Autodesk.Revit.DB.ElementSet elements) { Transaction newTran = null; try { UIDocument uiDoc = commandData.Application.ActiveUIDocument; if (null == uiDoc) { message = "this command needs to be run in an active document."; return(Result.Failed); } Document doc = uiDoc.Document; ICollection <ElementId> selectedId = uiDoc.Selection.GetElementIds(); if (1 != selectedId.Count) { message = "Please select a multistory stairs before running this command."; return(Result.Failed); } MultistoryStairs mStairs = doc.GetElement(selectedId.ElementAt(0)) as MultistoryStairs; if (null == mStairs) { message = "Please select a multistory stairs before running this command."; return(Result.Failed); } View currentView = doc.ActiveView; if (null == currentView || currentView.ViewType != ViewType.Elevation || !currentView.CanBePrinted) { message = "The current view should be an elevation view to allow user to select levels."; return(Result.Failed); } // allow the user to select the stairs to add stairs. LevelSelectionFilter selectionFilter = new LevelSelectionFilter(mStairs, OperationAction.Add); IList <Reference> userSelectedRefs = uiDoc.Selection.PickObjects(Autodesk.Revit.UI.Selection.ObjectType.Element, selectionFilter); IEnumerable <ElementId> userSelectedIds = from refer in userSelectedRefs select refer.ElementId; // start the transaction and add the stairs into the multistory stairs. newTran = new Transaction(doc, "Add Stairs to Multistory Stairs"); newTran.Start(); mStairs.AddStairsByLevelIds(new HashSet <ElementId>(userSelectedIds)); newTran.Commit(); return(Autodesk.Revit.UI.Result.Succeeded); } catch (Exception e) { message = e.Message; if ((newTran != null) && newTran.HasStarted() && !newTran.HasEnded()) { newTran.RollBack(); } return(Autodesk.Revit.UI.Result.Failed); } }
/// <summary> /// Implement this method as an external command for Revit. /// </summary> /// <param name="commandData">An object that is passed to the external application /// which contains data related to the command, /// such as the application object and active view.</param> /// <param name="message">A message that can be set by the external application /// which will be displayed if a failure or cancellation is returned by /// the external command.</param> /// <param name="elements">A set of elements to which the external application /// can add elements that are to be highlighted in case of failure or cancellation.</param> /// <returns>Return the status of the external command. /// A result of Succeeded means that the API external method functioned as expected. /// Cancelled can be used to signify that the user canceled the external operation /// at some point. Failure should be returned if the application is unable to proceed with /// the operation.</returns> public Autodesk.Revit.UI.Result Execute(Autodesk.Revit.UI.ExternalCommandData commandData, ref string message, Autodesk.Revit.DB.ElementSet elements) { Transaction newTran = null; try { UIDocument uiDoc = commandData.Application.ActiveUIDocument; if (null == uiDoc) { message = "this command needs to be run in an active document."; return(Result.Failed); } Document doc = uiDoc.Document; ICollection <ElementId> selectedId = uiDoc.Selection.GetElementIds(); if (1 != selectedId.Count) { message = "Please select a stairs element before running this command."; return(Result.Failed); } Stairs stairsElem = doc.GetElement(selectedId.ElementAt(0)) as Stairs; if (null == stairsElem) { message = "Please select a stairs element before running this command."; return(Result.Failed); } if (stairsElem.MultistoryStairsId != ElementId.InvalidElementId) { TaskDialog.Show("Warning", "The selected stairs is in a multistory stairs already."); return(Result.Succeeded); } // create a multistory stairs by input a stair element. newTran = new Transaction(doc, "Create Multistory Stairs"); newTran.Start(); MultistoryStairs.Create(stairsElem); newTran.Commit(); return(Autodesk.Revit.UI.Result.Succeeded); } catch (Exception e) { message = e.Message; if ((newTran != null) && newTran.HasStarted() && !newTran.HasEnded()) { newTran.RollBack(); } return(Autodesk.Revit.UI.Result.Failed); } }