Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }