public Result Execute( ExternalCommandData commandData, ref string message, ElementSet elements) { UIApplication uiapp = commandData.Application; UIDocument uidoc = uiapp.ActiveUIDocument; Autodesk.Revit.ApplicationServices.Application app = uiapp.Application; Document doc = uidoc.Document; Document docUi = uidoc.Document; bool allGoodInTheHood = false; //app.SharedParametersFilename = LocalFiles.localSpFile; //DefinitionFile defFile = app.OpenSharedParameterFile(); //DefinitionGroups myGroups = defFile.Groups; //DefinitionGroup myGroup = myGroups.get_Item("Mechanical"); //Definitions myDefinitions = myGroup.Definitions; //ExternalDefinition eDef = myDefinitions.get_Item("AirFlowAirTerminal") as ExternalDefinition; // Create local directory LocalFiles.CreateLocalDir(); // Checks last time the OpenRFA online database was udpated LocalFiles.GetLastUpdateJsonOnline(); MainWindow appDialog = new MainWindow(); appDialog.WindowStartupLocation = WindowStartupLocation.CenterScreen; // Prompt user to select files Microsoft.Win32.OpenFileDialog openFilesDlg = new Microsoft.Win32.OpenFileDialog(); // Set filter for file extension and default file extension openFilesDlg.DefaultExt = ".rfa"; openFilesDlg.Filter = "Revit Family (*.rfa)|*.rfa"; openFilesDlg.Multiselect = true; openFilesDlg.Title = "Select Revit families to load parameters"; // Only open window if continueCommand is set true if (ImportProcess.continueCommand == true) { openFilesDlg.ShowDialog(); // Only open MainWindow if files are selected if (openFilesDlg.FileNames.Length > 0) { appDialog.ShowDialog(); // Print all families to be modified StringBuilder sb = new StringBuilder(); sb.Append("The following files will be modified. It is recommended to backup your families before proceeding. Would you like to continue?\n\n"); foreach (string fileName in openFilesDlg.FileNames) { sb.Append(fileName + "\n"); } MessageBoxResult resultConfirmOverwrite = System.Windows.MessageBox.Show(sb.ToString(), "Warning", MessageBoxButton.OKCancel); switch (resultConfirmOverwrite) { // Execute command if user confirmed case MessageBoxResult.OK: // Only executes if the user clicked "OK" button if (appDialog.DialogResult.HasValue && appDialog.DialogResult.Value) { // Opens configuration window ConfigureImport confDialog = new ConfigureImport(); confDialog.WindowStartupLocation = WindowStartupLocation.CenterScreen; confDialog.ShowDialog(); // Only execute command if configure process is committed by user if (confDialog.DialogResult.HasValue && confDialog.DialogResult.Value) { // Iterate through selected families and add parameters to each foreach (string fileName in openFilesDlg.FileNames) { // Check if user is trying to modify active doc if (fileName == docUi.PathName) { System.Windows.MessageBox.Show("This addin cannot be run on the active document. This family has been skipped in the process: \n" + fileName); } else { System.Windows.MessageBox.Show("Adding parameters to: " + fileName); doc = app.OpenDocumentFile(fileName); // Complete import process ImportProcess.ProcessImport(doc, app, confDialog.DialogResult.HasValue, confDialog.DialogResult.Value); doc.Close(true); } } } } // Clear all data in case addin is run again in the same session // TODO: Call this method with every method that uses the datatables? ImportProcess.ClearAllData(); allGoodInTheHood = true; break; case MessageBoxResult.Cancel: ImportProcess.ClearAllData(); allGoodInTheHood = false; break; } } } // Return results if (allGoodInTheHood) { return(Result.Succeeded); } else { return(Result.Cancelled); } }