Files
SzmediTools/Szmedi.RvKits/ModelManager/MaterialResolveCmd.cs

291 lines
12 KiB
C#
Raw Normal View History

2025-09-16 16:06:41 +08:00

using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Visual;
using Autodesk.Revit.UI;
using Nice3point.Revit.Toolkit.External;
using System;
using System.Linq;
using System.Text;
namespace Szmedi.RvKits.ModelManager
{
/// <summary>
/// 2020材质才支持修改
/// </summary>
[Transaction(TransactionMode.Manual)]
public class MaterialResolveCmd : ExternalCommand
{
public override void Execute()
{
FolderBrowserDialog dialog = new() { Multiselect = false };
if (!dialog.ShowDialog())
{
Result = Result.Cancelled;
return;
}
var newPath = dialog.SelectedPath;
DirectoryInfo directory = new(newPath);
var files = directory.GetFiles();
var materialList = new FilteredElementCollector(Document).OfClass(typeof(Material)).Cast<Material>();
using Transaction trans = new(Document, "材质处理");
try
{
trans.Start();
foreach (var material in materialList)
{
if (material.Name == "8+12mm水泥色水泥纤维板")
{
var appearance = Document.GetElement(material.AppearanceAssetId) as AppearanceAssetElement;
var asset = appearance?.GetRenderingAsset();
if (appearance == null)
{
break;
}
#if REVIT2018
var p = asset["unifiedbitmap_Bitmap"] as AssetPropertyString;
//p.Value
#elif REVIT2019 || REVIT2020
if (asset.FindByName("unifiedbitmap_Bitmap") is not AssetPropertyString val)
{
break;
}
if (val.Name == "unifiedbitmap_Bitmap" && val.Value.Contains("\\") && !File.Exists(val.Value))
{
var originalFile = new FileInfo(val.Value);
foreach (var info in files)
{
if (info.Name == originalFile.Name)
{
val.Value = info.Name;
}
}
}
#endif
for (var i = 0; i < asset.Size; i++)
{
#if REVIT2018
//using (StreamWriter writer = new StreamWriter("F:\\纤维板.txt"))
//{
// ReadAsset(asset, writer);
//}
#elif REVIT2019 || REVIT2020
var prop = asset.Get(i);
#endif
}
}
}
trans.Commit();
}
catch (Exception ex)
{
ErrorMessage = ex.Message;
if (trans.GetStatus() == TransactionStatus.Started)
{
trans.RollBack();
}
Result = Result.Failed;
}
}
#if REVIT2019||REVIT2020
public void ModifyAppearanceBitMap(Document doc, Material material, string bitmapPath)
{
using (var editScope = new AppearanceAssetEditScope(doc))
{
var editableAsset = editScope.Start(material.AppearanceAssetId);
var assetProperty = editableAsset.FindByName("generic_diffuse");
var connectedAsset = assetProperty.GetConnectedProperty(0) as Asset;
if (connectedAsset.Name == "UnifiedBitmapSchema")
{
var path = connectedAsset.FindByName(UnifiedBitmap.UnifiedbitmapBitmap) as AssetPropertyString;
path.Value = bitmapPath;
}
editScope.Commit(true);
}
}
public void ModifyAppearanceColor(Document doc, Material material, string bitmapPath)
{
if (material != null)
{
var appearanceAssetId = material.AppearanceAssetId;
var assetElem = doc.GetElement(appearanceAssetId) as AppearanceAssetElement;
doc.Invoke(
_ =>
{
using var editScope = new AppearanceAssetEditScope(assetElem.Document);
// returns an editable copy of the appearance asset
var editableAsset = editScope.Start(assetElem.Id);
// Diffuse image
var genericDiffuseProperty =
editableAsset.FindByName("generic_diffuse") as AssetPropertyDoubleArray4d;
genericDiffuseProperty.SetValueAsColor(new Color(100, 100, 100));
editScope.Commit(true);
}, "修改外观颜色");
}
}
#endif
public void ReadAsset(Asset asset, StringBuilder objWriter)
{
// Get the asset name, type and library name.
var name = asset.Name;
// travel the asset properties in the asset.
for (var idx = 0; idx < asset.Size; idx++)
{
var prop = asset[idx];
ReadAssetProperty(prop, name, objWriter);
}
}
public void ReadAssetProperty(AssetProperty prop, string strName, StringBuilder objWriter)
{
switch (prop.Type)
{
// Retrieve the value from simple type property is easy.
// for example, retrieve bool property value.
case (AssetPropertyType)4:
objWriter.AppendLine("-------------------------------");
objWriter.AppendLine(Enum.GetName(typeof(AssetPropertyType), prop.Type));
var assetPropertyInt = prop as AssetPropertyInteger;
objWriter.AppendLine(assetPropertyInt.Name + "= " + assetPropertyInt.Value);
break;
case (AssetPropertyType)14:
objWriter.AppendLine("-------------------------------");
objWriter.AppendLine(Enum.GetName(typeof(AssetPropertyType), prop.Type));
var assetPropertyDistance = prop as AssetPropertyDistance;
objWriter.AppendLine(assetPropertyDistance.Name + "= " + assetPropertyDistance.Value);
break;
case (AssetPropertyType)6:
objWriter.AppendLine("-------------------------------");
objWriter.AppendLine(Enum.GetName(typeof(AssetPropertyType), prop.Type));
var assetPropertyDouble = prop as AssetPropertyDouble;
objWriter.AppendLine(assetPropertyDouble.Name + "= " + assetPropertyDouble.Value);
break;
case (AssetPropertyType)7:
objWriter.AppendLine("-------------------------------");
objWriter.AppendLine(Enum.GetName(typeof(AssetPropertyType), prop.Type));
var assetPropertyDoubleArray2d = prop as AssetPropertyDoubleArray2d;
objWriter.AppendLine(assetPropertyDoubleArray2d.Name + "= " + assetPropertyDoubleArray2d.Value);
break;
case (AssetPropertyType)9:
objWriter.AppendLine("-------------------------------");
objWriter.AppendLine(Enum.GetName(typeof(AssetPropertyType), prop.Type));
var assetPropertyDoubleArray4d = prop as AssetPropertyDoubleArray4d;
objWriter.AppendLine(assetPropertyDoubleArray4d.Name + "= " + assetPropertyDoubleArray4d.GetValueAsDoubles());
break;
case (AssetPropertyType)11:
objWriter.AppendLine("-------------------------------");
objWriter.AppendLine(Enum.GetName(typeof(AssetPropertyType), prop.Type));
var val = prop as AssetPropertyString;
objWriter.AppendLine(val.Name + "= " + val.Value);
break;
case (AssetPropertyType)2:
objWriter.AppendLine("-------------------------------");
objWriter.AppendLine(Enum.GetName(typeof(AssetPropertyType), prop.Type));
var boolProp = prop as AssetPropertyBoolean;
objWriter.AppendLine(boolProp.Name + "= " + boolProp.Value);
break;
// When you retrieve the value from the data array property,
// you may need to get which value the property stands for.
// for example, the APT_Double44 may be a transform data.
case (AssetPropertyType)10:
objWriter.AppendLine("-------------------------------");
objWriter.AppendLine(Enum.GetName(typeof(AssetPropertyType), prop.Type));
var transformProp = prop as AssetPropertyDoubleArray4d;
var tranformValue = transformProp.GetValueAsDoubles();
objWriter.AppendLine(transformProp.Name + "= " + transformProp.GetValueAsDoubles());
break;
// The APT_List contains a list of sub asset properties with same type.
case (AssetPropertyType)19:
objWriter.AppendLine("-------------------------------");
objWriter.AppendLine(Enum.GetName(typeof(AssetPropertyType), prop.Type));
var propList = prop as AssetPropertyList;
var subProps = propList.GetValue();
if (subProps.Count == 0)
{
break;
}
switch (subProps[0].Type)
{
case (AssetPropertyType)4:
foreach (var subProp in subProps)
{
objWriter.AppendLine("子属性-------------------------------子属性");
objWriter.AppendLine(Enum.GetName(typeof(AssetPropertyType), subProps[0].Type));
var intProp = subProp as AssetPropertyInteger;
var intValue = intProp.Value;
objWriter.AppendLine(intProp.Name + "= " + intProp.Value.ToString());
}
break;
}
break;
case (AssetPropertyType)15:
objWriter.AppendLine("-------------------------------");
objWriter.AppendLine(Enum.GetName(typeof(AssetPropertyType), prop.Type));
var propAsset = prop as Asset;
ReadAsset(propAsset, objWriter);
break;
case (AssetPropertyType)16:
objWriter.AppendLine("参照-------------------------------");
objWriter.AppendLine(Enum.GetName(typeof(AssetPropertyType), prop.Type));
break;
default:
objWriter.AppendLine("-------------------------------");
objWriter.AppendLine(Enum.GetName(typeof(AssetPropertyType), prop.Type));
objWriter.AppendLine("居然有啥都不是类型的" + prop.Type);
break;
}
// Get the connected properties.
// please notice that the information of many texture stores here.
if (prop.NumberOfConnectedProperties == 0)
{
return;
}
foreach (var connectedProp in prop.GetAllConnectedProperties())
{
// Note: Usually, the connected property is an Asset.
ReadAssetProperty(connectedProp, strName, objWriter);
}
}
}
}