RevitAPI: How to get asset properties of material I want?

中文链接

By Aaron Lu

Question:

I was asked about how to get xxx property from material several times, since there are too many properties, it is hard to find the exact one we want. and developers may stops here:

private void CustomerApproach(Material material)
{
ElementId appearanceId = material.AppearanceAssetId;
AppearanceAssetElement appearanceElem =
RevitDoc.GetElement(appearanceId) as AppearanceAssetElement;
Asset theAsset = appearanceElem.GetRenderingAsset();
for (int idx = 0; idx < theAsset.Size; idx++)
{
////Too many properties, how to know which one is I want?
AssetProperty ap = theAsset[idx];
}
}

2FirstEdit

Well, I don’t know the answer either, but we can do a simple test, like this:

private void DumpAppearanceAssetProperties(Material material)
{
ElementId appearanceId = material.AppearanceAssetId;
AppearanceAssetElement appearanceElem = material.Document.
GetElement(appearanceId) as AppearanceAssetElement;
Asset theAsset = appearanceElem.GetRenderingAsset();
List<AssetProperty> assets = new List<AssetProperty>();
for (int idx = 0; idx < theAsset.Size; idx++)
{
AssetProperty ap = theAsset[idx];
assets.Add(ap);
}
// order the properties!
assets = assets.OrderBy(ap => ap.Name).ToList();
for (int idx = 0; idx < assets.Count; idx++)
{
AssetProperty ap = assets[idx];
Type type = ap.GetType();
object apVal = null;
try
{
// using .net reflection to get the value
var prop = type.GetProperty("Value");
if (prop != null &&
prop.GetIndexParameters().Length == 0)
{
apVal = prop.GetValue(ap);
}
else
{
apVal = "<No Value Property>";
}
}
catch (Exception ex)
{
apVal = ex.GetType().Name + "-" + ex.Message;
}
if (apVal is DoubleArray)
{
var doubles = apVal as DoubleArray;
apVal = doubles.Cast<double>().Aggregate("", (s, d) => s + Math.Round(d,5) + ",");
}
Log(idx + " : [" + ap.Type + "] " + ap.Name + " = " + apVal);
}
}

You might still ask even if we dump all the properties, we still can’t find the one, because the output looks like this:

result1:

0 : [APT_String] AdvancedUIDefinition = Mats/Generic/GenericAdvancedUI.xml
1 : [APT_String] AssetLibID = AD121259-C03E-4A1D-92D8-59A22B4807AD
2 : [APT_String] assettype = materialappearance
3 : [APT_String] BaseSchema = GenericSchema
4 : [APT_String] category = :Concrete:Default:Miscellaneous
5 : [APT_Boolean] color_by_object = False
6 : [APT_Integer] common_Shared_Asset = 1
7 : [APT_DoubleArray4d] common_Tint_color = 0.315,0.315,0.315,1,
8 : [APT_Boolean] common_Tint_toggle = False
9 : [APT_String] description = Generic material.
10 : [APT_String] ExchangeGUID =
11 : [APT_Boolean] generic_ao_details = True
12 : [APT_Double] generic_ao_distance = 4
13 : [APT_Boolean] generic_ao_on = False
14 : [APT_Integer] generic_ao_samples = 16
15 : [APT_Boolean] generic_backface_cull = False
16 : [APT_Double] generic_bump_amount = 9.39325797868605E-275
17 : [APT_DoubleArray4d] generic_bump_map = 0,0,0,1,
18 : [APT_Double] generic_cutout_opacity = 1
19 : [APT_DoubleArray4d] generic_diffuse = 0.51353,0.52278,0.47005,1,
20 : [APT_Double] generic_diffuse_image_fade = 1
21 : [APT_Double] generic_glossiness = 0
22 : [APT_Boolean] generic_is_metal = False
23 : [APT_Integer] generic_refl_depth = 0
24 : [APT_Integer] generic_reflection_glossy_samples = 12
25 : [APT_Double] generic_reflectivity_at_0deg = 0.5
26 : [APT_Double] generic_reflectivity_at_90deg = 0.5
27 : [APT_Integer] generic_refr_depth = -1
28 : [APT_Integer] generic_refraction_glossy_samples = 12
29 : [APT_Double] generic_refraction_index = 1
30 : [APT_Double] generic_refraction_translucency_weight = 0
31 : [APT_Boolean] generic_roundcorners_allow_different_materials = False
32 : [APT_Double] generic_roundcorners_radius = 0
33 : [APT_Double] generic_self_illum_color_temperature = 6500
34 : [APT_DoubleArray4d] generic_self_illum_filter_map = 1,1,1,1,
35 : [APT_Double] generic_self_illum_luminance = 0
36 : [APT_Double] generic_transparency = 0
37 : [APT_Double] generic_transparency_image_fade = 1
38 : [APT_Boolean] Hidden = False
39 : [APT_String] ImplementationGeneric =
40 : [APT_String] ImplementationMentalRay = Mats/Generic/MentalImage.xml
41 : [APT_String] ImplementationOGS = Mats/Generic/OGS.xml
42 : [APT_String] ImplementationPreview = Mats/Generic/PreviewColor.xml
43 : [APT_String] keyword =
44 : [APT_String] localname = Generic
45 : [APT_String] localtype = Appearance
46 : [APT_Integer] mode = 4
47 : [APT_DoubleArray2d] PatternOffset = 0,0,
48 : [APT_Integer] revision = 1
49 : [APT_Integer] SchemaVersion = 4
50 : [APT_String] swatch = Swatch-Cube
51 : [APT_String] thumbnail = C:/Users/lua.ADS/AppData/Local/Temp/MaterialThumbnails_PID_1434/73c06a00Smooth Precast Structural.png
52 : [APT_String] UIDefinition = Mats/Generic/GenericUI.xml
53 : [APT_String] UIName = Smooth Precast Structural
54 : [APT_Integer] version = 2
55 : [APT_String] VersionGUID = B1E74BC9-150D-4CB2-BFF1-376BEAD5FEAE 

Well, let’s update some property and dump again, e.g. I changed properties under “Reflectivity” group, the result is:

0 : [APT_String] AdvancedUIDefinition = Mats/Generic/GenericAdvancedUI.xml
1 : [APT_String] AssetLibID = AD121259-C03E-4A1D-92D8-59A22B4807AD
2 : [APT_String] assettype = materialappearance
3 : [APT_String] BaseSchema = GenericSchema
4 : [APT_String] category = :Concrete:Default:Miscellaneous
5 : [APT_Boolean] color_by_object = False
6 : [APT_Integer] common_Shared_Asset = 1
7 : [APT_DoubleArray4d] common_Tint_color = 0.315,0.315,0.315,1,
8 : [APT_Boolean] common_Tint_toggle = False
9 : [APT_String] description = Generic material.
10 : [APT_String] ExchangeGUID =
11 : [APT_Boolean] generic_ao_details = True
12 : [APT_Double] generic_ao_distance = 4
13 : [APT_Boolean] generic_ao_on = False
14 : [APT_Integer] generic_ao_samples = 16
15 : [APT_Boolean] generic_backface_cull = False
16 : [APT_Double] generic_bump_amount = 9.39325797868605E-275
17 : [APT_DoubleArray4d] generic_bump_map = 0,0,0,1,
18 : [APT_Double] generic_cutout_opacity = 1
19 : [APT_DoubleArray4d] generic_diffuse = 0.51353,0.52278,0.47005,1,
20 : [APT_Double] generic_diffuse_image_fade = 1
21 : [APT_Double] generic_glossiness = 0
22 : [APT_Boolean] generic_is_metal = False
23 : [APT_Integer] generic_refl_depth = 0
24 : [APT_Integer] generic_reflection_glossy_samples = 12
25 : [APT_Double] generic_reflectivity_at_0deg = 0.2
26 : [APT_Double] generic_reflectivity_at_90deg = 0.96
27 : [APT_Integer] generic_refr_depth = -1
28 : [APT_Integer] generic_refraction_glossy_samples = 12
29 : [APT_Double] generic_refraction_index = 1
30 : [APT_Double] generic_refraction_translucency_weight = 0
31 : [APT_Boolean] generic_roundcorners_allow_different_materials = False
32 : [APT_Double] generic_roundcorners_radius = 0
33 : [APT_Double] generic_self_illum_color_temperature = 6500
34 : [APT_DoubleArray4d] generic_self_illum_filter_map = 1,1,1,1,
35 : [APT_Double] generic_self_illum_luminance = 0
36 : [APT_Double] generic_transparency = 0
37 : [APT_Double] generic_transparency_image_fade = 1
38 : [APT_Boolean] Hidden = False
39 : [APT_String] ImplementationGeneric =
40 : [APT_String] ImplementationMentalRay = Mats/Generic/MentalImage.xml
41 : [APT_String] ImplementationOGS = Mats/Generic/OGS.xml
42 : [APT_String] ImplementationPreview = Mats/Generic/PreviewColor.xml
43 : [APT_String] keyword =
44 : [APT_String] localname = Generic
45 : [APT_String] localtype = Appearance
46 : [APT_Integer] mode = 4
47 : [APT_DoubleArray2d] PatternOffset = 0,0,
48 : [APT_Integer] revision = 1
49 : [APT_Integer] SchemaVersion = 4
50 : [APT_String] swatch = Swatch-Cube
51 : [APT_String] thumbnail = C:/Users/lua.ADS/AppData/Local/Temp/MaterialThumbnails_PID_1434/70db4100Smooth Precast Structural(7).png
52 : [APT_String] UIDefinition = Mats/Generic/GenericUI.xml
53 : [APT_String] UIName = Smooth Precast Structural
54 : [APT_Integer] version = 2
55 : [APT_String] VersionGUID = E5E10B97-7ED0-4EE5-B64B-314565517119 

You got the idea?

Yes, compare the results!

2vs3

 

It is now that obvious, those are the properties we changed:

generic_reflectivity_at_0deg

generic_reflectivity_at_90deg

 

Note:

  • I put all AssetProperty in a list and order them by name, otherwise, it might be a mess and not situable to compare.
  • If AssetProperty is a AssetPropertyReference, we can call GetAllConnectedProperties() to iterate the sub-properties of it.

 

 

 


Comments

One response to “RevitAPI: How to get asset properties of material I want?”

  1. Moustafa khalil Avatar
    Moustafa khalil

    hi,
    thanks for this. is there an access to the Image, in the generic Section, to manipulate its “Scale”–> width and height

Leave a Reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading