AddMaterials.Command.Execute C# (CSharp) Method

Execute() public method

public Execute ( ExternalCommandData commandData, string &message, ElementSet elements ) : System.Result
commandData ExternalCommandData
message string
elements ElementSet
return System.Result
        public Result Execute(
            ExternalCommandData commandData,
            ref string message,
            ElementSet elements)
        {
            UIApplication uiapp = commandData.Application;
              UIDocument uidoc = uiapp.ActiveUIDocument;
              Document doc = uidoc.Document;

              // Create dictionary of existing
              // materials keyed by their name.

              Dictionary<string, Material> materials
            = new FilteredElementCollector( doc )
              .OfClass( typeof( Material ) )
              .Cast<Material>()
              .ToDictionary<Material, string>(
            e => e.Name );

              // Ditto for fill patterns.

              Dictionary<string, FillPatternElement> fillPatterns
            = new FilteredElementCollector( doc )
              .OfClass( typeof( FillPatternElement ) )
              .Cast<FillPatternElement>()
              .ToDictionary<FillPatternElement, string>(
            e => e.Name );

              try
              {
            var materialsToImport = ReadMaterialsFromXlsx( materials, fillPatterns ).ToList();
            var browser = new MaterialBrowserViewModel { Materials = materialsToImport };
            var window = new MaterialsView { DataContext = browser };
            var res = window.ShowDialog();
            if( !res.HasValue || !res.Value )
              return Result.Cancelled;

            var materialsToAdd = browser.Materials.Where( x => x.AddToProject ).ToList();
            if( !materialsToAdd.Any() )
              return Result.Cancelled;

            using( var tx = new Transaction( doc ) )
            {
              tx.Start( "Add Materials" );
              foreach( var materialViewModel in materialsToAdd )
              {
            var materialCSI = materials[materialViewModel.BaseMaterialClass];
            var myMaterial = materialCSI.Duplicate( materialViewModel.Name );
            myMaterial.Color = materialViewModel.Color;
            myMaterial.Transparency = (int) materialViewModel.Transparency;
            if( materialViewModel.SurfacePattern != null )
              myMaterial.SurfacePatternId
                = fillPatterns[materialViewModel.SurfacePattern.Name].Id;
            if( materialViewModel.CutPattern != null )
              myMaterial.CutPatternId
                = fillPatterns[materialViewModel.CutPattern.Name].Id;
              }
              tx.Commit();
            }

            string msg = string.Format(
              "{0} row{1} successfully parsed and "
              + "{2} material{3} added:",
              materialsToImport.Count,
              PluralSuffix( materialsToImport.Count ),
              materialsToAdd.Count,
              PluralSuffix( materialsToAdd.Count ) );

            TaskDialog dlg = new TaskDialog(
            "Revit AddMaterials" );

            dlg.MainInstruction = msg;

            dlg.MainContent = string.Join( ", ",
              materialsToAdd.Select( x => x.Name ) ) + ".";

            dlg.Show();
              }
              catch( Exception ex )
              {
            message
              = "Revit AddMaterials Exception:\n" + ex;

            return Result.Failed;
              }
              return Result.Succeeded;
        }