public void ResetMaterialControls()
        {
            // Identify the indices of the
            columnIndecies = new List <int>();
            foreach (string groupParam in massGroupingParams)
            {
                for (int i = 0; i < headers.Count; i++)
                {
                    string val = headers[i];
                    if (val == groupParam)
                    {
                        columnIndecies.Add(i);
                        break;
                    }
                }
            }

            // Group figure out how many groupings we need
            groupingNames = new List <string>();
            foreach (object obj in importDataGrid.Items)
            {
                try
                {
                    DataRowView drv   = obj as DataRowView;
                    string      gName = string.Empty;
                    foreach (int i in columnIndecies)
                    {
                        if (gName == string.Empty)
                        {
                            gName = drv.Row.ItemArray[i].ToString();
                        }
                        else
                        {
                            gName += " - " + drv.Row.ItemArray[i].ToString();
                        }
                    }
                    if (!groupingNames.Contains(gName))
                    {
                        groupingNames.Add(gName);
                    }
                }
                catch (Exception ex)
                {
                    TaskDialog.Show("Error: ", ex.Message);
                }
            }

            // instantiate the controls onto the material control area
            controlPanel.Children.Clear();
            organizedMasses = new List <List <MassObject> >();
            foreach (string gName in groupingNames)
            {
                MaterialSelectorControl ctrl = new MaterialSelectorControl(gName, projMaterials);
                ctrl.Margin = new Thickness(0, 0, 0, 0);
                controlPanel.Children.Add(ctrl);
                organizedMasses.Add(new List <MassObject>());
            }

            foreach (object obj in importDataGrid.Items)
            {
                try
                {
                    DataRowView drv     = obj as DataRowView;
                    string      curName = string.Empty;
                    foreach (int i in columnIndecies)
                    {
                        if (curName == string.Empty)
                        {
                            curName = drv.Row.ItemArray[i].ToString();
                        }
                        else
                        {
                            curName += " - " + drv.Row.ItemArray[i].ToString();
                        }
                    }
                    int index = groupingNames.IndexOf(curName);


                    string rName = drv.Row.ItemArray[2].ToString();
                    string rNumb = drv.Row.ItemArray[3].ToString();
                    if (rName == string.Empty && rName == null && rNumb == string.Empty && rNumb == null)
                    {
                        continue;
                    }
                    string dept                   = drv.Row.ItemArray[0].ToString();
                    string rType                  = drv.Row.ItemArray[1].ToString();
                    string progAreaStr            = drv.Row.ItemArray[4].ToString();
                    string qtyStr                 = drv.Row.ItemArray[5].ToString();
                    List <ParameterObj> paramObjs = new List <ParameterObj>();
                    for (int i = 6; i < drv.Row.ItemArray.Length; i++)
                    {
                        ParameterObj po = new ParameterObj();
                        po.Name  = "#" + headers[i] + "#";
                        po.Value = drv.Row.ItemArray[i].ToString();
                        paramObjs.Add(po);
                    }
                    MassObject mo = new MassObject();
                    mo.RoomName   = rName;
                    mo.RoomNumber = rNumb;

                    if (dept != null && dept != string.Empty)
                    {
                        mo.Department = dept;
                    }
                    else
                    {
                        mo.Department = string.Empty;
                    }

                    if (rType != null && rType != string.Empty)
                    {
                        mo.RoomType = rType;
                    }
                    else
                    {
                        mo.RoomType = string.Empty;
                    }

                    double area = 0;
                    if (double.TryParse(progAreaStr, out area))
                    {
                        mo.ProgramArea = area;
                    }
                    else
                    {
                        mo.ProgramArea = 0;
                    }

                    int qty = 1;
                    if (int.TryParse(qtyStr, out qty))
                    {
                        mo.Quantity = qty;
                    }
                    else
                    {
                        mo.Quantity = 1;
                    }

                    //if (paramObjs != null && paramObjs.Count > 0)
                    mo.Parameters = paramObjs;
                    organizedMasses[index].Add(mo);
                }
                catch { }
            }
        }
        private void createButton_Click(object sender, RoutedEventArgs e)
        {
            // Get the currently set materials
            List <Material> mats = new List <Material>();

            foreach (UIElement uiElem in controlPanel.Children)
            {
                MaterialSelectorControl matCtrl = uiElem as MaterialSelectorControl;
                mats.Add(matCtrl.Material);
            }

            System.Diagnostics.Process proc = System.Diagnostics.Process.GetCurrentProcess();
            IntPtr       handle             = proc.MainWindowHandle;
            SettingsForm form = new SettingsForm(organizedMasses, mats, paramsOut, uiDoc);

            System.Windows.Interop.WindowInteropHelper helper = new System.Windows.Interop.WindowInteropHelper(form);
            helper.Owner = handle;
            Hide();
            form.ShowDialog();
            List <Parameter> selectedParameters = form.SelectedParameters;

            // Get the DisplayUnitTypes for length and area.
            Units           units     = uiDoc.Document.GetUnits();
            FormatOptions   areaFO    = units.GetFormatOptions(UnitType.UT_Area);
            FormatOptions   lengthFO  = units.GetFormatOptions(UnitType.UT_Length);
            DisplayUnitType lengthDUT = lengthFO.DisplayUnits;
            DisplayUnitType areaDUT   = areaFO.DisplayUnits;

            double defaultHeight = 10;

            if (lengthDUT == DisplayUnitType.DUT_CENTIMETERS || lengthDUT == DisplayUnitType.DUT_DECIMETERS || lengthDUT == DisplayUnitType.DUT_METERS ||
                lengthDUT == DisplayUnitType.DUT_METERS_CENTIMETERS || lengthDUT == DisplayUnitType.DUT_MILLIMETERS)
            {
                defaultHeight = 9.84252;
            }
            string temp = "start";

            try
            {
                // Time to start creating masses, gather information for the schema
                excelFileName      = new System.IO.FileInfo(excelFilePath).Name;
                temp               = "excel file";
                excelWorksheetName = worksheetComboBox.SelectedItem.ToString();
                temp               = "worksheet";
                paramNames         = new List <string>();
                foreach (Parameter p in selectedParameters)
                {
                    if (p != null)
                    {
                        paramNames.Add(p.Definition.Name);
                    }
                    else
                    {
                        paramNames.Add(string.Empty);
                    }
                }
                temp             = "params";
                creationDateTime = DateTime.Now.ToString("yyyymmdd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
                temp             = "creation date";
                // Other data, massGroupingParams, symbolId, and levelId are already defined.
            }
            catch (Exception ex)
            {
                TaskDialog.Show(temp, ex.Message);
            }
            // Create the masses
            using (Transaction t = new Transaction(uiDoc.Document, "Create Masses"))
            {
                t.Start();

                // Make sure the Symbol is active
                if (!selectedSymbol.IsActive)
                {
                    selectedSymbol.Activate();
                    uiDoc.Document.Regenerate();
                }

                // Iterate through the masses
                double currentX = 0;

                for (int i = 0; i < organizedMasses.Count; i++)
                {
                    try
                    {
                        List <MassObject> massGrp = organizedMasses[i];

                        double maxX     = 0;
                        double currentY = 0;
                        string groupId  = groupingNames[i];
                        foreach (MassObject mass in massGrp)
                        {
                            for (int j = 0; j < mass.Quantity; j++)
                            {
                                // Location
                                XYZ loc = new XYZ(currentX, currentY, selectedLevel.ProjectElevation);

                                //FamilyInstance
                                FamilyInstance fi = uiDoc.Document.Create.NewFamilyInstance(loc, selectedSymbol, Autodesk.Revit.DB.Structure.StructuralType.NonStructural);

                                // Calculate width and depth
                                double sideLength = 10;
                                if (mass.ProgramArea > 0)
                                {
                                    sideLength = Math.Sqrt(mass.ProgramArea);
                                }
                                if (sideLength > maxX)
                                {
                                    maxX = sideLength;
                                }

                                // Set the parameters as necessary
                                if (selectedParameters[0] != null && selectedParameters[0].Definition.ParameterType == ParameterType.Text)
                                {
                                    fi.get_Parameter(selectedParameters[0].Definition).Set(mass.Department);
                                }

                                if (selectedParameters[1] != null && selectedParameters[1].Definition.ParameterType == ParameterType.Text)
                                {
                                    fi.get_Parameter(selectedParameters[1].Definition).Set(mass.RoomType);
                                }

                                if (selectedParameters[2] != null && selectedParameters[2].Definition.ParameterType == ParameterType.Text)
                                {
                                    fi.get_Parameter(selectedParameters[2].Definition).Set(mass.RoomName);
                                }

                                if (selectedParameters[3] != null && selectedParameters[3].Definition.ParameterType == ParameterType.Text)
                                {
                                    fi.get_Parameter(selectedParameters[3].Definition).Set(mass.RoomNumber);
                                }

                                if (selectedParameters[4] != null && selectedParameters[4].Definition.ParameterType == ParameterType.Area)
                                {
                                    fi.get_Parameter(selectedParameters[4].Definition).Set(UnitUtils.ConvertToInternalUnits(mass.ProgramArea, areaDUT));
                                }

                                if (selectedParameters[5] != null && selectedParameters[5].Definition.ParameterType == ParameterType.Material)
                                {
                                    fi.get_Parameter(selectedParameters[5].Definition).Set(mats[i].Id);
                                }

                                if (selectedParameters[6] != null && selectedParameters[6].Definition.ParameterType == ParameterType.Length)
                                {
                                    fi.get_Parameter(selectedParameters[6].Definition).Set(UnitUtils.ConvertToInternalUnits(sideLength, lengthDUT));
                                }

                                if (selectedParameters[7] != null && selectedParameters[7].Definition.ParameterType == ParameterType.Length)
                                {
                                    fi.get_Parameter(selectedParameters[7].Definition).Set(UnitUtils.ConvertToInternalUnits(sideLength, lengthDUT));
                                }

                                if (selectedParameters[8] != null && selectedParameters[8].Definition.ParameterType == ParameterType.Length)
                                {
                                    fi.get_Parameter(selectedParameters[8].Definition).Set(UnitUtils.ConvertToInternalUnits(defaultHeight, lengthDUT));
                                }

                                for (int k = 9; k < mass.Parameters.Count + 9; k++)
                                {
                                    if (k - 9 < mass.Parameters.Count)
                                    {
                                        ParameterObj po = mass.Parameters[k - 9];
                                        if (selectedParameters[k] != null)
                                        {
                                            try
                                            {
                                                switch (selectedParameters[k].StorageType)
                                                {
                                                case StorageType.Double:
                                                    double dbl = 0;
                                                    if (double.TryParse(po.Value, out dbl))
                                                    {
                                                        Parameter p = fi.get_Parameter(selectedParameters[k].Definition);
                                                        if (p.Definition.ParameterType == ParameterType.Area)
                                                        {
                                                            p.Set(UnitUtils.ConvertToInternalUnits(dbl, areaDUT));
                                                        }
                                                        else if (p.Definition.ParameterType == ParameterType.Length)
                                                        {
                                                            p.Set(UnitUtils.ConvertToInternalUnits(dbl, lengthDUT));
                                                        }
                                                        else
                                                        {
                                                            p.Set(dbl);
                                                        }
                                                    }
                                                    break;

                                                case StorageType.Integer:
                                                    int integer = 0;
                                                    if (int.TryParse(po.Value, out integer))
                                                    {
                                                        fi.get_Parameter(selectedParameters[k].Definition).Set(integer);
                                                    }
                                                    break;

                                                case StorageType.ElementId:
                                                    int elemIdInt = 0;
                                                    if (int.TryParse(po.Value, out integer))
                                                    {
                                                        fi.get_Parameter(selectedParameters[k].Definition).Set(new ElementId(elemIdInt));
                                                    }
                                                    break;

                                                default:
                                                    fi.get_Parameter(selectedParameters[k].Definition).Set(po.Value);
                                                    break;
                                                }
                                            }
                                            catch { }
                                        }
                                    }
                                }

                                // Store the local Schema data, ie the creation datetime.
                                try
                                {
                                    StoreElemDateTime(fi, groupId);
                                }
                                catch (Exception ex)
                                {
                                    TaskDialog.Show("Schema Error", ex.Message);
                                }

                                // Adjust the y Position
                                currentY = currentY + sideLength + 5;
                            }
                        }
                        // Adjust the X position
                        currentX = currentX + maxX + 5;
                    }
                    catch (Exception ex)
                    {
                        TaskDialog.Show("Error", ex.Message);
                    }
                }

                // Store the schema data for the entire creation set.
                //try
                //{
                //    if (StoreImportData())
                //        TaskDialog.Show("Success", "Should have successfully created the collection schema.");
                //    else
                //        TaskDialog.Show("Failure", "Failed to create the collection schema.");

                //}
                //catch (Exception ex)
                //{
                //    TaskDialog.Show("Schema Error", ex.Message);
                //}
                t.Commit();
            }
            Close();
        }