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;
}