前言
这个例子是修改材质中的外观部分。对于材质的内容可以参考其它博客: Revit API: Material 材质 Revit API: 材质- 参考官方文档(一) Revit API: 材质- 参考官方文档(二) Revit API: 材质- 参考官方文档(三)
内容
这是例子运行起来的效果,但不是所有材质可以被正常的设定。 被修改的参数如下,需要先把染色这个复选框勾上。 具体逻辑非常简单,在 EditMaterialTintColorProperty 这个方法里面。 简化的逻辑:
- 创建一个
AppearanceAssetEditScope - 开始这个
EditScope ,获得 Asset - 通过名称
common_Tint_color 获得对应的颜色属性 - 设定属性
- 结束
AppearanceAssetEditScope
internal void EditMaterialTintColorProperty(bool lighter)
{
using (AppearanceAssetEditScope editScope = new AppearanceAssetEditScope(m_document))
{
Asset editableAsset = editScope.Start(m_currentAppearanceAssetElementId);
AssetPropertyDoubleArray4d metalColorProp = editableAsset.FindByName("common_Tint_color") as AssetPropertyDoubleArray4d;
Color newColor = new Color(red, green, blue);
metalColorProp.SetValueAsColor(newColor);
editScope.Commit(true);
}
}
源码中的代码(有bug,需要自行修复):
internal void EditMaterialTintColorProperty(bool lighter)
{
using (AppearanceAssetEditScope editScope = new AppearanceAssetEditScope(m_document))
{
Asset editableAsset = editScope.Start(m_currentAppearanceAssetElementId);
AssetPropertyDoubleArray4d metalColorProp = editableAsset.FindByName("common_Tint_color") as AssetPropertyDoubleArray4d;
Color color = metalColorProp.GetValueAsColor();
byte red = color.Red;
byte green = color.Green;
byte blue = color.Blue;
int factor = 25;
if (lighter)
{
red = (byte)LimitValue(red + factor);
green = (byte)LimitValue(green + factor);
blue = (byte)LimitValue(blue + factor);
}
else
{
red = (byte)LimitValue(red - factor);
green = (byte)LimitValue(green - factor);
blue = (byte)LimitValue(blue - factor);
}
Color newColor = new Color(red, green, blue);
if (metalColorProp.IsValidValue(newColor))
metalColorProp.SetValueAsColor(newColor);
editScope.Commit(true);
}
}
|