public static AppearanceAssetElement GetGenericAppearanceAssetElement(Document doc) { var applicationLanguage = Revit.ActiveUIApplication.Application.Language; var languages = Enumerable.Repeat(applicationLanguage, 1). Concat ( Enum.GetValues(typeof(Autodesk.Revit.ApplicationServices.LanguageType)). Cast <Autodesk.Revit.ApplicationServices.LanguageType>(). Where(lang => lang != applicationLanguage && lang != Autodesk.Revit.ApplicationServices.LanguageType.Unknown) ); foreach (var lang in languages) { if (AppearanceAssetElement.GetAppearanceAssetElementByName(doc, GenericAssetName(lang)) is AppearanceAssetElement assetElement) { return(assetElement); } } return(null); }
static ElementId ToHost(Rhino.Render.RenderMaterial mat, Document doc, string name) { var appearanceAssetId = ElementId.InvalidElementId; #if REVIT_2019 if (AppearanceAssetElement.GetAppearanceAssetElementByName(doc, name) is AppearanceAssetElement appearanceAssetElement) { appearanceAssetId = appearanceAssetElement.Id; } else { appearanceAssetElement = GetGenericAppearanceAssetElement(doc); if (appearanceAssetElement is null) { var assets = Revit.ActiveUIApplication.Application.GetAssets(AssetType.Appearance); foreach (var asset in assets) { if (asset.Name == GenericAssetName()) { appearanceAssetElement = AppearanceAssetElement.Create(doc, name, asset); appearanceAssetId = appearanceAssetElement.Id; break; } } } else { appearanceAssetElement = appearanceAssetElement.Duplicate(name); appearanceAssetId = appearanceAssetElement.Id; } if (appearanceAssetId != ElementId.InvalidElementId) { using (var editScope = new AppearanceAssetEditScope(doc)) { var editableAsset = editScope.Start(appearanceAssetId); //var category = editableAsset.FindByName("category") as AssetPropertyString; //category.Value = $":{mat.Category.FirstCharUpper()}"; var description = editableAsset.FindByName("description") as AssetPropertyString; description.Value = mat.Notes ?? string.Empty; var keyword = editableAsset.FindByName("keyword") as AssetPropertyString; { string tags = string.Empty; foreach (var tag in (mat.Tags ?? string.Empty).Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)) { tags += $":{tag.Replace(':', ';')}"; } keyword.Value = tags; } if (mat.SmellsLikeMetal || mat.SmellsLikeTexturedMetal) { var generic_self_illum_luminance = editableAsset.FindByName(Generic.GenericIsMetal) as AssetPropertyBoolean; generic_self_illum_luminance.Value = true; } if (mat.Fields.TryGetValue(Rhino.Render.RenderMaterial.BasicMaterialParameterNames.Diffuse, out Rhino.Display.Color4f diffuse)) { var generic_diffuse = editableAsset.FindByName(Generic.GenericDiffuse) as AssetPropertyDoubleArray4d; generic_diffuse.SetValueAsDoubles(new double[] { diffuse.R, diffuse.G, diffuse.B, diffuse.A }); } if (mat.Fields.TryGetValue(Rhino.Render.RenderMaterial.BasicMaterialParameterNames.Transparency, out double transparency)) { var generic_transparency = editableAsset.FindByName(Generic.GenericTransparency) as AssetPropertyDouble; generic_transparency.Value = transparency; if (mat.Fields.TryGetValue(Rhino.Render.RenderMaterial.BasicMaterialParameterNames.TransparencyColor, out Rhino.Display.Color4f transparencyColor)) { diffuse = diffuse.BlendTo((float)transparency, transparencyColor); var generic_diffuse = editableAsset.FindByName(Generic.GenericDiffuse) as AssetPropertyDoubleArray4d; generic_diffuse.SetValueAsDoubles(new double[] { diffuse.R, diffuse.G, diffuse.B, diffuse.A }); } } if (mat.Fields.TryGetValue(Rhino.Render.RenderMaterial.BasicMaterialParameterNames.Ior, out double ior)) { var generic_refraction_index = editableAsset.FindByName(Generic.GenericRefractionIndex) as AssetPropertyDouble; generic_refraction_index.Value = ior; } if (mat.Fields.TryGetValue(Rhino.Render.RenderMaterial.BasicMaterialParameterNames.Shine, out double shine)) { if (mat.Fields.TryGetValue(Rhino.Render.RenderMaterial.BasicMaterialParameterNames.Specular, out Rhino.Display.Color4f specularColor)) { var generic_reflectivity_at_0deg = editableAsset.FindByName(Generic.GenericReflectivityAt0deg) as AssetPropertyDouble; generic_reflectivity_at_0deg.Value = shine * specularColor.L; } } if (mat.Fields.TryGetValue(Rhino.Render.RenderMaterial.BasicMaterialParameterNames.Reflectivity, out double reflectivity)) { if (mat.Fields.TryGetValue(Rhino.Render.RenderMaterial.BasicMaterialParameterNames.ReflectivityColor, out Rhino.Display.Color4f reflectivityColor)) { var generic_reflectivity_at_90deg = editableAsset.FindByName(Generic.GenericReflectivityAt90deg) as AssetPropertyDouble; generic_reflectivity_at_90deg.Value = reflectivity * reflectivityColor.L; if (mat.Fields.TryGetValue("fresnel-enabled", out bool fresnel_enabled) && !fresnel_enabled) { diffuse = diffuse.BlendTo((float)reflectivity, reflectivityColor); var generic_diffuse = editableAsset.FindByName(Generic.GenericDiffuse) as AssetPropertyDoubleArray4d; generic_diffuse.SetValueAsDoubles(new double[] { diffuse.R, diffuse.G, diffuse.B, diffuse.A }); } } } if (mat.Fields.TryGetValue("polish-amount", out double polish_amount)) { var generic_glossiness = editableAsset.FindByName(Generic.GenericGlossiness) as AssetPropertyDouble; generic_glossiness.Value = polish_amount; } if (mat.Fields.TryGetValue(Rhino.Render.RenderMaterial.BasicMaterialParameterNames.Emission, out Rhino.Display.Color4f emission)) { var generic_self_illum_filter_map = editableAsset.FindByName(Generic.GenericSelfIllumFilterMap) as AssetPropertyDoubleArray4d; generic_self_illum_filter_map.SetValueAsDoubles(new double[] { emission.R, emission.G, emission.B, emission.A }); } if (mat.Fields.TryGetValue(Rhino.Render.RenderMaterial.BasicMaterialParameterNames.DisableLighting, out bool self_illum)) { var generic_self_illum_luminance = editableAsset.FindByName(Generic.GenericSelfIllumLuminance) as AssetPropertyDouble; generic_self_illum_luminance.Value = self_illum ? 200000 : 0.0; } editScope.Commit(false); } } } #endif return(appearanceAssetId); }
static ElementId ToHost(Rhino.DocObjects.Material mat, Document doc, Dictionary <string, Autodesk.Revit.DB.Material> materials) { var id = ElementId.InvalidElementId; if (materials.TryGetValue(mat.Name ?? "Default", out var material)) { id = material.Id; } else { id = Autodesk.Revit.DB.Material.Create(doc, mat.Name); var newMaterial = doc.GetElement(id) as Autodesk.Revit.DB.Material; newMaterial.Color = new Autodesk.Revit.DB.Color(255, 255, 255); #if REVIT_2019 if (newMaterial.AppearanceAssetId == ElementId.InvalidElementId) { if (AppearanceAssetElement.GetAppearanceAssetElementByName(doc, mat.Name) is AppearanceAssetElement appearanceAssetElement) { newMaterial.AppearanceAssetId = appearanceAssetElement.Id; } else { appearanceAssetElement = AppearanceAssetElement.GetAppearanceAssetElementByName(doc, "Generic"); if (appearanceAssetElement is null) { var assets = Revit.ActiveUIApplication.Application.GetAssets(AssetType.Appearance); foreach (var asset in assets) { if (asset.Name == "Generic") { appearanceAssetElement = AppearanceAssetElement.Create(doc, mat.Name, asset); newMaterial.AppearanceAssetId = appearanceAssetElement.Id; break; } } } else { appearanceAssetElement = appearanceAssetElement.Duplicate(mat.Name); newMaterial.AppearanceAssetId = appearanceAssetElement.Id; } if (newMaterial.AppearanceAssetId != ElementId.InvalidElementId) { using (var editScope = new AppearanceAssetEditScope(doc)) { var editableAsset = editScope.Start(newMaterial.AppearanceAssetId); var genericDiffuseProperty = editableAsset.FindByName("generic_diffuse") as AssetPropertyDoubleArray4d; genericDiffuseProperty.SetValueAsColor(mat.DiffuseColor.ToHost()); var properties = new List <AssetProperty>(editableAsset.Size); for (int i = 0; i < editableAsset.Size; i++) { properties.Add(editableAsset[i]); } editScope.Commit(false); } } } } #endif materials.Add(mat.Name, newMaterial); } return(id); }