Document Doc = commandData.Application.ActiveUIDocument.Document;
var UiApp = commandData.Application.Application;
UIDocument uiDoc = commandData.Application.ActiveUIDocument;
var collector = new FilteredElementCollector(Doc);
var classfilter = new ElementClassFilter(typeof(Material));
collector.WherePasses(classfilter);
var materials = collector.ToElements().ToList();
Selection sel = uiDoc.Selection;
Reference refe = sel.PickObject(ObjectType.Element, "选择一个族实例");
Element elem = Doc.GetElement(refe);
Wall wall = elem as Wall;
WallType wallType = wall.WallType;
CompoundStructure compoundStructure = wallType.GetCompoundStructure();//复合结构
IList<CompoundStructureLayer> layers = compoundStructure.GetLayers();//复核结构层
foreach (var item in layers)
{
Material mat2 = Doc.GetElement(item.MaterialId) as Material;//材质
IList<Asset> objlibraryAsset = UiApp.GetAssets(AssetType.Appearance);//对象库资产
//写入临时文件
using (var objWriter = new StreamWriter(@"D:\aaa.txt"))
{
if (mat2 != null)
{
objWriter.Write(mat2.Name + "\r");
var assetElementId = mat2.AppearanceAssetId;//外观库
var objMainColor = mat2.Color.Red + "," + mat2.Color.Green + "," +
mat2.Color.Blue;
if (assetElementId != ElementId.InvalidElementId)//无效的元素id
{
var objassetElement = Doc.GetElement(assetElementId) as AppearanceAssetElement;//外观资产要素
if (objassetElement != null)
{
var currentAsset = objassetElement.GetRenderingAsset();//获得渲染资源
// 检索不到材质外观时,为欧特克材质库材质
if (currentAsset.Size == 0)
{
foreach (Asset objCurrentAsset in objlibraryAsset)
{
if (objCurrentAsset.Name == currentAsset.Name &&
objCurrentAsset.LibraryName == currentAsset.LibraryName)
{
ReadAsset(objCurrentAsset, mat2.Id.ToString(), objWriter);
}
}
}
else
{
ReadAssetProperty(currentAsset, mat2.Id.ToString(), mat2.Name,
objWriter);
}
}
}
}
objWriter.Close();
}
}
Process.Start(@"D:\aaa.txt");//指定进程与Process组件关联
public void ReadAsset(Asset asset, string strMaterialId, StreamWriter objWriter)//读取材质
{
// Get the asset name, type and library name.
string name = asset.Name;
// travel the asset properties in the asset.
for (int idx = 0; idx < asset.Size; idx++)
{
AssetProperty prop = asset.Get(idx);
ReadAssetProperty(prop, strMaterialId, name, objWriter);
}
}
public void ReadAssetProperty(AssetProperty prop, string strMaterialId, string strName, StreamWriter objWriter)//读取材质属性 { switch (prop.Type) { case AssetPropertyType.Properties: //var AssetProperties = prop as AssetProperties; { Asset pa = prop as Asset; objWriter.WriteLine("[Properties] start***********************************************"); ReadAsset(pa, strMaterialId, objWriter); objWriter.WriteLine("[Properties] end*************************************************"); } break; case AssetPropertyType.Boolean: AssetPropertyBoolean boolProp = prop as AssetPropertyBoolean; objWriter.WriteLine("[Boolean] " + boolProp.Name + "= " + boolProp.Value.ToString()); break; case AssetPropertyType.Enumeration: AssetPropertyEnum enumProp = prop as AssetPropertyEnum; objWriter.WriteLine("[Enumeration] " + enumProp.Name + "= " + enumProp.Value.ToString()); break; case AssetPropertyType.Integer: var intProp = prop as AssetPropertyInteger; objWriter.WriteLine("[Integer] " + intProp.Name + "= " + intProp.Value.ToString()); break; case AssetPropertyType.Float: var floatProp = prop as AssetPropertyFloat; objWriter.WriteLine("[Float] " + floatProp.Name + "= " + floatProp.Value.ToString()); break; case AssetPropertyType.Double1: var doubleProp = prop as AssetPropertyDouble; objWriter.WriteLine("[Double1] " + doubleProp.Name + "= " + doubleProp.Value.ToString()); break; case AssetPropertyType.Double2: var double2Prop = prop as AssetPropertyDoubleArray2d; objWriter.WriteLine("[Double2] " + double2Prop.Name + "= " + double2Prop.Value.ToString()); break; case AssetPropertyType.Double3: { var double3Prop = prop as AssetPropertyDoubleArray3d; var vlist = double3Prop.GetValueAsDoubles(); string msg = ""; vlist.ToList().ForEach(f => msg += f.ToString() + ","); objWriter.WriteLine("[Double3] " + double3Prop.Name + "= " + msg); } break; case AssetPropertyType.Double4: { var double4Prop = prop as AssetPropertyDoubleArray4d; var vlist = double4Prop.GetValueAsDoubles(); string msg = ""; vlist.ToList().ForEach(f => msg += f.ToString() + ","); objWriter.WriteLine("[Double4] " + double4Prop.Name + "= " + msg); } 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.Double44: { AssetPropertyDoubleArray4d transformProp = prop as AssetPropertyDoubleArray4d; var vlist = transformProp.GetValueAsDoubles(); string msg = ""; vlist.ToList().ForEach(f => msg += f.ToString() + ","); objWriter.WriteLine("[Double44] " + transformProp.Name + "= " + msg); } break; case AssetPropertyType.String: AssetPropertyString val = prop as AssetPropertyString; objWriter.WriteLine("[String] " + val.Name + "= " + val.Value.ToString()); break; case AssetPropertyType.Time: AssetPropertyTime timeProp = prop as AssetPropertyTime; objWriter.WriteLine("[Time] " + timeProp.Name + "= " + timeProp.Value.ToString()); break; case AssetPropertyType.Distance: var distanceProp = prop as AssetPropertyDistance; objWriter.WriteLine("[Distance] " + distanceProp.Name + "= " + distanceProp.Value); break; case AssetPropertyType.Asset: Asset propAsset = prop as Asset; objWriter.WriteLine("[Asset]" + propAsset.Name + " start ***********************************************"); ReadAsset(propAsset, strMaterialId, objWriter); objWriter.WriteLine("[Asset]" + propAsset.Name + " end *************************************************"); break; case AssetPropertyType.Reference: var referenceProp = prop as AssetPropertyReference; objWriter.WriteLine("[Reference] "); break; case AssetPropertyType.Longlong: var longProp = prop as AssetPropertyInt64; objWriter.WriteLine("[Longlong] " + longProp.Name + "= " + longProp.Value.ToString()); break; case AssetPropertyType.ULonglong: var ulongProp = prop as AssetPropertyUInt64; objWriter.WriteLine("[ULonglong] " + ulongProp.Name + "= " + ulongProp.Value.ToString()); break; // The APT_List contains a list of sub asset properties with same type. case AssetPropertyType.List: { AssetPropertyList propList = prop as AssetPropertyList; IList<AssetProperty> subProps = propList.GetValue(); if (subProps.Count == 0) break; objWriter.WriteLine("[List] start***********************************************"); foreach (AssetProperty subProp in subProps) { ReadAssetProperty(subProp, strMaterialId, strName, objWriter); } objWriter.WriteLine("[List] end***********************************************"); } break; case AssetPropertyType.Float3: { var float3Prop = prop as AssetPropertyFloatArray; string msg = ""; var list = float3Prop.GetValue(); list.ToList().ForEach(f => msg += f.ToString() + ","); objWriter.WriteLine("[Float3] " + float3Prop.Name + "= " + msg); } break; default: objWriter.WriteLine("未定义的类型:" + prop.Type.ToString()); break; } if (prop.NumberOfConnectedProperties == 0) return; foreach (AssetProperty connectedProp in prop.GetAllConnectedProperties()) { ReadAssetProperty(connectedProp, strMaterialId, strName, objWriter); } }