Beispiel #1
0
 /// <summary>
 /// 得到材质的Asset集合
 /// </summary>
 /// <param name="node"></param>
 private void ReadBitMap(MaterialNode node)
 {
     if (node.MaterialId != ElementId.InvalidElementId)
     {
         Asset theAsset = node.GetAppearance();
         if (node.HasOverriddenAppearance)
         {
             theAsset = node.GetAppearanceOverride();
         }
         if (theAsset == null)
         {
             Material  material     = _doc.GetElement(node.MaterialId) as Material;
             ElementId appearanceId = material.AppearanceAssetId;
             AppearanceAssetElement appearanceElem = _doc.GetElement(appearanceId) as AppearanceAssetElement;
             theAsset = appearanceElem.GetRenderingAsset();
         }
         if (theAsset.Size == 0)
         {
             //Asset大小为0,则为欧特克材质
             foreach (Asset objCurrentAsset in _objlibraryAsset)
             {
                 if (objCurrentAsset.Name == theAsset.Name && objCurrentAsset.LibraryName == theAsset.LibraryName)
                 {
                     ReadAsset(objCurrentAsset, ttrgb);
                 }
             }
         }
         else
         {
             ReadAsset(theAsset, ttrgb);
         }
     }
 }
Beispiel #2
0
        //----------------------------------------------------------
        public static void set_appearance_asset(Document doc, Material material)
        {
            try
            {
                var asset = new FilteredElementCollector(doc).OfClass(typeof(AppearanceAssetElement)).First(x => x.Name == "Generic");

                AppearanceAssetElement assetElem = asset as AppearanceAssetElement;

                AppearanceAssetElement assetElemNew = assetElem.Duplicate(material.Name + DateTime.Now.ToString("ddMMyyHHmmss"));

                AppearanceAssetEditScope editScope = new AppearanceAssetEditScope(doc);
                Asset editableAsset = editScope.Start(assetElemNew.Id);
                AssetPropertyDoubleArray4d genericDiffuseProperty = editableAsset.FindByName("generic_diffuse") as AssetPropertyDoubleArray4d;
                genericDiffuseProperty.SetValueAsColor(material.Color);
                AssetPropertyDouble genericTransparency = editableAsset.FindByName("generic_transparency") as AssetPropertyDouble;
                genericTransparency.Value = Convert.ToDouble(material.Transparency) / 100;

                editScope.Commit(true);
                material.AppearanceAssetId = assetElemNew.Id;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
Beispiel #3
0
        /// <summary>
        /// Check if the selected material supports "tint".
        /// </summary>
        /// <returns>True if the selected material supports "tint" or not.</returns>
        private bool SupportTintColor()
        {
            if (this.m_currentAppearanceAssetElementId == ElementId.InvalidElementId)
            {
                return(false);
            }

            AppearanceAssetElement assetElem = m_document.GetElement(this.m_currentAppearanceAssetElementId) as AppearanceAssetElement;

            if (assetElem == null)
            {
                return(false);
            }

            Asset asset = assetElem.GetRenderingAsset();
            AssetPropertyDoubleArray4d tintColorProp = asset["common_Tint_color"] as AssetPropertyDoubleArray4d;

            if (tintColorProp == null)
            {
                return(false);
            }

            // If the material supports tint but it is not enabled, it will be enabled first with a value (255 255 255)
            AssetPropertyBoolean tintToggleProp = asset["common_Tint_toggle"] as AssetPropertyBoolean;

            if ((tintToggleProp != null) && !(tintToggleProp.Value))
            {
                EnableTintColor();
            }

            return(true);
        }
    private string GetAppearanceParameters(AppearanceAssetElement appearance)
    {
        String res = "##########################\n";

        foreach (Parameter p in appearance.Parameters)
        {
            string     defName = "Definition: " + p.Definition.Name;
            Definition def     = p.Definition;

            switch (p.StorageType)
            {
            case StorageType.Double:
                //covert the number into Metric
                defName += " : " + p.AsValueString();
                break;

            case StorageType.ElementId:
                //find out the name of the element
                ElementId id = p.AsElementId();
                if (id.IntegerValue >= 0)
                {
                    defName += " : " + ModelService.Service.RvtDoc.GetElement(id).Name;
                }
                else
                {
                    defName += " : " + id.IntegerValue.ToString();
                }
                break;

            case StorageType.Integer:
                if (ParameterType.YesNo == p.Definition.ParameterType)
                {
                    if (p.AsInteger() == 0)
                    {
                        defName += " : " + "False";
                    }
                    else
                    {
                        defName += " : " + "True";
                    }
                }
                else
                {
                    defName += " : " + p.AsInteger().ToString();
                }
                break;

            case StorageType.String:
                defName += " : " + p.AsString();
                break;

            default:
                defName = "Unexposed parameter.";
                break;
            }
            res += "\n" + defName;
        }

        return(res);
    }
Beispiel #5
0
        public void ShowMaterialInfo(Document doc)
        {
            // Find material
            FilteredElementCollector fec = new FilteredElementCollector(doc);

            fec.OfClass(typeof(Material));

            String materialName = "Checker"; // "Copper";//"Prism - Glass - Textured"; // "Parking Stripe"; // "Copper";
                                             // "Carpet (1)";// "Prism - Glass - Textured";// "Parking Stripe"; // "Prism 1";// "Brick, Common" ;// "Acoustic Ceiling Tile 24 x 48";  // "Aluminum"
            Material mat = fec.Cast <Material>().First <Material>(m => m.Name == materialName);



            ElementId appearanceAssetId = mat.AppearanceAssetId;

            AppearanceAssetElement appearanceAsset = doc.GetElement(appearanceAssetId) as AppearanceAssetElement;

            Asset renderingAsset = appearanceAsset.GetRenderingAsset();



            RenderAppearanceDescriptor rad
                = new RenderAppearanceDescriptor(renderingAsset);


            PropertyDescriptorCollection collection = rad.GetProperties();

            TaskDialog.Show("Total properties", "Properties found: " + collection.Count);
            //

            string s = ": Material Asset Properties";

            TaskDialog dlg = new TaskDialog(s);

            dlg.MainInstruction = mat.Name + s;

            s = string.Empty;

            List <PropertyDescriptor> orderableCollection = new List <PropertyDescriptor>(collection.Count);

            foreach (PropertyDescriptor descr in collection)
            {
                orderableCollection.Add(descr);
            }



            foreach (AssetPropertyPropertyDescriptor descr in
                     orderableCollection.OrderBy <PropertyDescriptor, String>(pd => pd.Name).Cast <AssetPropertyPropertyDescriptor>())
            {
                object value = descr.GetValue(rad);

                s += "\nname: " + descr.Name
                     + " | type: " + descr.PropertyType.Name
                     + " | value: " + value;
            }
            dlg.MainContent = s;
            dlg.Show();
        }
 // 定义获取贴图名称的方法
 public void GetMapname(Document doc, Material mat)
 {
     if (Convert.ToString(mat.AppearanceAssetId) != "-1")
     {
         AppearanceAssetElement appearanceAssetElement = doc.GetElement(mat.AppearanceAssetId) as AppearanceAssetElement;
         Asset  asset  = appearanceAssetElement.GetRenderingAsset();
         Asset  asset2 = asset.FindByName("generic_diffuse").GetSingleConnectedAsset();
         string name   = asset2.FindByName("unifiedbitmap_Bitmap").ToString();
     }
 }
Beispiel #7
0
        public void GetDiffuseColor()
        {
            var      message   = new StringBuilder();
            Document doc       = this.ActiveUIDocument.Document;
            var      materials = new FilteredElementCollector(doc).OfClass(typeof(Material)).ToList();

            foreach (Material mat in materials)
            {
                try
                {
                    ElementId appAssetId = mat.AppearanceAssetId;
                    if (appAssetId != ElementId.InvalidElementId)
                    {
                        AppearanceAssetElement assetElem = mat.Document.GetElement(appAssetId) as AppearanceAssetElement;
                        if (assetElem != null)
                        {
                            using (Transaction t = new Transaction(assetElem.Document, "Get Material Color"))
                            {
                                t.Start();
                                using (AppearanceAssetEditScope editScope = new AppearanceAssetEditScope(assetElem.Document))
                                {
                                    string name = mat.Name;

                                    Asset editableAsset = editScope.Start(assetElem.Id);

                                    AssetPropertyDoubleArray4d genericDiffuseProperty = editableAsset.FindByName("generic_diffuse") as AssetPropertyDoubleArray4d;
                                    var    color = genericDiffuseProperty.GetValueAsColor();
                                    string red   = color.Red.ToString();
                                    string green = color.Green.ToString();
                                    string blue  = color.Blue.ToString();
                                    message.AppendLine(name + "-" + red + "_" + green + "_" + blue + ".");

                                    editScope.Commit(true);
                                }
                                t.Commit();
                            }
                        }
                        else
                        {
                            message.AppendLine(mat.Name.ToString() + " - " + appAssetId.ToString());
                        }
                    }
                    else
                    {
                        message.AppendLine(mat.Name.ToString() + " - " + appAssetId.ToString());
                    }
                }
                catch (Exception ex)
                {
                    message.AppendLine(mat.Name.ToString() + " - " + ex.Message);
                }
            }
            TaskDialog.Show("Materials in the project", message.ToString());
        }
Beispiel #8
0
        void GetTexturesFromAllDocuments(IList <Document> targetDocumentsList, IList <string> targetList)
        {
            foreach (Document currentDoc in targetDocumentsList)
            {
                IList <Element> allMat = new FilteredElementCollector(currentDoc).OfClass(typeof(Material)).ToList();
                foreach (Element currentMatElemn in allMat)
                {
                    Material currentMat = currentMatElemn as Material;
                    AppearanceAssetElement currentAppearance = currentDoc.GetElement(currentMat.AppearanceAssetId) as AppearanceAssetElement;

                    foreach (string currentString in GetAssetPropValueFromMaterial(currentAppearance, targetList))
                    {
                        targetList.Add(currentString);
                    }
                }
            }
        }
Beispiel #9
0
        public override bool CastTo <Q>(out Q target)
        {
            if (base.CastTo <Q>(out target))
            {
                return(true);
            }

            if (typeof(Q).IsAssignableFrom(typeof(Grasshopper.Kernel.Types.GH_Material)))
            {
                if (RhinoDoc.ActiveDoc is RhinoDoc doc)
                {
                    var renderMaterial = Rhino.Render.RenderMaterial.CreateBasicMaterial(Rhino.DocObjects.Material.DefaultMaterial, doc);
                    renderMaterial.Name = Name;

#if REVIT_2018
                    if (AppearanceAsset?.Value is DB.AppearanceAssetElement appearance)
                    {
                        using (var asset = appearance.GetRenderingAsset())
                            AppearanceAssetElement.SimulateRenderMaterial(renderMaterial, asset, doc);
                    }
                    else
#endif
                    if (Value is DB.Material material)
                    {
                        renderMaterial.Fields.Set(Rhino.Render.RenderMaterial.BasicMaterialParameterNames.Diffuse, material.Color.ToColor());
                        renderMaterial.Fields.Set(Rhino.Render.RenderMaterial.BasicMaterialParameterNames.Shine, material.Shininess / 128.0 * Rhino.DocObjects.Material.MaxShine);
                        renderMaterial.Fields.Set(Rhino.Render.RenderMaterial.BasicMaterialParameterNames.Reflectivity, 1.0 / Math.Exp((1.0 - (material.Smoothness / 100.0)) * 10));
                        renderMaterial.Fields.Set(Rhino.Render.RenderMaterial.BasicMaterialParameterNames.Transparency, material.Transparency / 100.0);
                    }

                    if (renderMaterial is null)
                    {
                        target = default(Q);
                    }
                    else
                    {
                        target = (Q)(object)new Grasshopper.Kernel.Types.GH_Material(renderMaterial);
                    }

                    return(true);
                }
            }

            return(false);
        }
Beispiel #10
0
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            //获取当前文档
            UIDocument uiDoc = commandData.Application.ActiveUIDocument;
            Document   doc   = commandData.Application.ActiveUIDocument.Document;
            //指定输出信息的文件
            FileStream   fs = new FileStream(@"C:\Users\11265\Desktop\0.txt", FileMode.OpenOrCreate);
            StreamWriter sw = new StreamWriter(fs);
            //指定存放贴图路径的列表
            List <string> oldPathList           = new List <string>();
            List <string> newPathList           = new List <string>();
            List <string> fileNameList          = new List <string>();
            Dictionary <string, string> dicPath = new Dictionary <string, string>();



            // 获取元素
            IList <Reference> referList = uiDoc.Selection.PickObjects(ObjectType.Element, "请框选需要的构件");
            Element           elem      = doc.GetElement(referList.First().ElementId);
            //获取元素的材质
            ICollection <ElementId> ids = elem.GetMaterialIds(false);
            Material material           = doc.GetElement(ids.First()) as Material;
            AppearanceAssetElement appearanceAssetElement = doc.GetElement(material.AppearanceAssetId) as AppearanceAssetElement;
            Asset asset = appearanceAssetElement.GetRenderingAsset();

            for (int i = 0; i < asset.Size; i++)
            {
                AssetProperty prop = asset[i];
                ReadAssetProperty(prop, sw, oldPathList);
            }
            sw.Flush();
            sw.Close();
            TaskDialog.Show("demo", "转换完成");
            foreach (var item in oldPathList)
            {
                TaskDialog.Show("result", item);
            }

            //复制文件更改材质路径



            return(Result.Succeeded);
        }
Beispiel #11
0
        /// <summary>
        /// Check if the button Lighter is enabled.
        /// </summary>
        /// <returns>True if the material can be made lighter or not.</returns>
        internal bool IsLighterEnabled()
        {
            if (!SupportTintColor())
            {
                return(false);
            }

            AppearanceAssetElement assetElem = m_document.GetElement(m_currentAppearanceAssetElementId) as AppearanceAssetElement;

            if (assetElem == null)
            {
                return(false);
            }

            Asset asset = assetElem.GetRenderingAsset();
            AssetPropertyDoubleArray4d tintColorProp = asset.FindByName("common_Tint_color") as AssetPropertyDoubleArray4d;
            Color tintColor = tintColorProp.GetValueAsColor();
            Color white     = new Color(255, 255, 255);

            return(!ColorsEqual(tintColor, white));
        }
Beispiel #12
0
        /// <summary>
        /// Check if the button Darker is enabled.
        /// </summary>
        /// <returns>True if the material can be made darker or not.</returns>
        internal bool IsDarkerEnabled()
        {
            if (!SupportTintColor())
            {
                return(false);
            }

            AppearanceAssetElement assetElem = m_document.GetElement(this.m_currentAppearanceAssetElementId) as AppearanceAssetElement;

            if (assetElem == null)
            {
                return(false);
            }

            Asset asset = assetElem.GetRenderingAsset();
            AssetPropertyDoubleArray4d tintColorProp = asset["common_Tint_color"] as AssetPropertyDoubleArray4d;
            Color tintColor = tintColorProp.GetValueAsColor();
            Color black     = new Color(0, 0, 0);

            return(!ColorsEqual(tintColor, black));
        }
        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);
        }
Beispiel #14
0
        //----------------------------------------------------------
        public void SetColorAppearanceAsset(Document doc, Material material)
        {
            try
            {
                var           list = new FilteredElementCollector(doc).OfClass(typeof(AppearanceAssetElement)).ToList();
                List <string> name = new List <string>();
                foreach (AppearanceAssetElement e in list)
                {
                    name.Add(e.Name);
                }
                string newName = "";
                for (var i = 0; i < 10000000; i++)
                {
                    if (name.Any(x => x == material.Name + "(" + i.ToString() + ")") == false)
                    {
                        newName = material.Name + "(" + i.ToString() + ")";
                        break;
                    }
                }

                AppearanceAssetElement assetElem = list[0] as AppearanceAssetElement;

                AppearanceAssetElement assetElemNew = assetElem.Duplicate(newName);

                AppearanceAssetEditScope editScope = new AppearanceAssetEditScope(doc);
                Asset editableAsset = editScope.Start(assetElemNew.Id);
                AssetPropertyDoubleArray4d genericDiffuseProperty = editableAsset["generic_diffuse"] as AssetPropertyDoubleArray4d;
                genericDiffuseProperty.SetValueAsColor(material.Color);
                AssetPropertyDouble genericTransparency = editableAsset["generic_transparency"] as AssetPropertyDouble;
                genericTransparency.Value = Convert.ToDouble(material.Transparency) / 100;

                editScope.Commit(true);
                material.AppearanceAssetId = assetElemNew.Id;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
Beispiel #15
0
 public void OnMaterial(MaterialNode node)
 {
     matid = node.MaterialId.IntegerValue;
     if (!matLink.ContainsKey(matid))
     {
         StringBuilder log = new StringBuilder();
         XMaterial     mat = new XMaterial();
         Element       e   = Documents.Peek().GetElement(node.MaterialId);
         if (e is Material)
         {
             Material m = e as Material;
             mat.Name = m.Name;
             if (m.UseRenderAppearanceForShading)
             {
                 mat.Color = new XColor(1.0f, 1.0f, 1.0f, 1 - (float)node.Transparency);
             }
             else
             {
                 mat.Color = new XColor(m.Color.Red / 255f, m.Color.Green / 255f, m.Color.Blue / 255f, 1 - (float)node.Transparency);
             }
             mat.Specular  = XColor.white * (m.Smoothness / 100f);
             mat.Shininess = m.Shininess / 100f;
             Element _e = Documents.Peek().GetElement(m.AppearanceAssetId);
             if (EnableLog)
             {
                 log.Append("Material:" + m.Name + "\n");
                 log.Append("AppearanceAssetElement:" + (_e is AppearanceAssetElement).ToString() + "\n");
             }
             if (_e is AppearanceAssetElement)
             {
                 AppearanceAssetElement aae = _e as AppearanceAssetElement;
                 Asset a = aae.GetRenderingAsset();
                 if (EnableLog)
                 {
                     log.Append("Asset.Size:" + a.Size.ToString() + "\n");
                 }
                 if (a.Size > 0)
                 {
                     for (int i = 0; i < a.Size; i++)
                     {
                         if (EnableLog)
                         {
                             LogMaterial(a[i], log);
                         }
                         XMapping t = ReadTexture(a[i]);
                         if (t != null)
                         {
                             mat.Maps.Add(t);
                         }
                     }
                 }
             }
         }
         else
         {
             mat.Name      = node.NodeName;
             mat.Color     = new XColor(node.Color.Red / 255f, node.Color.Green / 255f, node.Color.Blue / 255f, 1 - (float)node.Transparency);
             mat.Specular  = new XColor(0, 0, 0, 1);
             mat.Shininess = 0f;
         }
         matLog.Add(log.ToString());
         matLink.Add(matid, XData.Materials.Count);
         XData.Materials.Add(mat);
     }
 }
Beispiel #16
0
        public Message Execute(Document doc, Message msg)
        {
            JObject msgData   = JObject.Parse(msg.Data);
            string  elementId = msgData["Id"].ToString();

            Material mat = doc.GetElement(new ElementId(Int32.Parse(elementId))) as Material;

            try
            {
                System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();
                s.Start();

                LMAStudio.StreamVR.Common.Models.Material dto = _converter.ConvertToDTO(mat).ToObject <LMAStudio.StreamVR.Common.Models.Material>();

                AppearanceAssetElement assetElement = doc.GetElement(mat.AppearanceAssetId) as AppearanceAssetElement;
                Asset asset = assetElement?.GetRenderingAsset();

                if (asset == null)
                {
                    return(new Message
                    {
                        Type = "EMPTY",
                        Data = $"No material asset found for: {mat.Name} ({mat.Id})"
                    });
                }

                string bmpPathFull = "";

                for (int i = 0; i < asset.Size; i++)
                {
                    AssetProperty prop = asset.Get(i);
                    if (textureProperties.Contains(prop.Name) && prop.NumberOfConnectedProperties > 0)
                    {
                        Asset connectedAsset = prop.GetSingleConnectedAsset();
                        for (int j = 0; j < connectedAsset.Size; j++)
                        {
                            AssetProperty prop2 = connectedAsset.Get(j);
                            if (prop2.Name == "unifiedbitmap_Bitmap")
                            {
                                bmpPathFull = (prop2 as AssetPropertyString).Value;
                            }
                        }
                    }
                }

                if (string.IsNullOrEmpty(bmpPathFull))
                {
                    return(new Message
                    {
                        Type = "EMPTY",
                        Data = $"No exportable material found for: {mat.Name} ({mat.Id})"
                    });
                }

                string texturesDirectory = "C:\\Program Files (x86)\\Common Files\\Autodesk Shared\\Materials\\Textures";
                string bmpPath           = bmpPathFull.Split('|').LastOrDefault();

                string fullPath         = texturesDirectory + "\\" + bmpPath;
                string materialFileName = new FileInfo(fullPath).Name;

                byte[] materialAlbedo = File.ReadAllBytes(fullPath);

                UploadOBJ(dto, materialAlbedo, materialFileName);

                _log($"Export/Upload time for {1} materials: {s.ElapsedMilliseconds}ms");
                s.Stop();

                return(new Message
                {
                    Type = "MAT",
                    Data = mat.Id.ToString()
                });
            }
            catch (Exception e)
            {
                return(new Message
                {
                    Type = "ERROR",
                    Data = $"Error: {mat.Name} ({mat.Id}) {e.ToString()}"
                });
            }
        }
        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);
        }
        void FindTextureBitmapPaths(Document doc)
        {
            // Find materials
            FilteredElementCollector fec
                = new FilteredElementCollector(doc);

            fec.OfClass(typeof(Material));

            IEnumerable <Material> targetMaterials
                = fec.Cast <Material>().Where <Material>(mtl =>
                                                         targetMaterialNames.Contains(mtl.Name));

            foreach (Material material in targetMaterials)
            {
                // Get appearance asset for read
                ElementId appearanceAssetId = material
                                              .AppearanceAssetId;

                AppearanceAssetElement appearanceAssetElem
                    = doc.GetElement(appearanceAssetId)
                      as AppearanceAssetElement;

                Asset asset = appearanceAssetElem
                              .GetRenderingAsset();

                // Walk through all first level assets to find
                // connected Bitmap properties.  Note: it is
                // possible to have multilevel connected
                // properties with Bitmaps in the leaf nodes.
                // So this would need to be recursive.

                int size = asset.Size;
                for (int assetIdx = 0; assetIdx < size; assetIdx++)
                {
                    //AssetProperty aProperty = asset[assetIdx]; // 2018
                    AssetProperty aProperty = asset.Get(assetIdx); // 2019

                    if (aProperty.NumberOfConnectedProperties < 1)
                    {
                        continue;
                    }

                    // Find first connected property.
                    // Should work for all current (2018) schemas.
                    // Safer code would loop through all connected
                    // properties based on the number provided.

                    Asset connectedAsset = aProperty
                                           .GetConnectedProperty(0) as Asset;

                    // We are only checking for bitmap connected assets.

                    if (connectedAsset.Name == "UnifiedBitmapSchema")
                    {
                        // This line is 2018.1 & up because of the
                        // property reference to UnifiedBitmap
                        // .UnifiedbitmapBitmap.  In earlier versions,
                        // you can still reference the string name
                        // instead: "unifiedbitmap_Bitmap"

                        //AssetPropertyString path = connectedAsset[ // 2018
                        //  UnifiedBitmap.UnifiedbitmapBitmap]
                        //    as AssetPropertyString;

                        AssetPropertyString path = connectedAsset // 2019
                                                   .FindByName(UnifiedBitmap.UnifiedbitmapBitmap)
                                                   as AssetPropertyString;

                        // This will be a relative path to the
                        // built -in materials folder, addiitonal
                        // render appearance folder, or an
                        // absolute path.

                        TaskDialog.Show("Connected bitmap",
                                        String.Format("{0} from {2}: {1}",
                                                      aProperty.Name, path.Value,
                                                      connectedAsset.LibraryName));
                    }
                }
            }
        }
        void GetElementMaterialInfo(Document doc)
        {
            FilteredElementCollector collector
                = new FilteredElementCollector(doc)
                  .WhereElementIsNotElementType()
                  .OfClass(typeof(Material));

            try
            {
                foreach (Material material in collector)
                {
                    if (material.Name.Equals("Air"))
                    {
                        AppearanceAssetElement appearanceElement
                            = doc.GetElement(material.AppearanceAssetId)
                              as AppearanceAssetElement;

                        Asset appearanceAsset = appearanceElement
                                                .GetRenderingAsset();

                        List <AssetProperty> assetProperties
                            = new List <AssetProperty>();

                        PropertySetElement physicalPropSet
                            = doc.GetElement(material.StructuralAssetId)
                              as PropertySetElement;

                        PropertySetElement thermalPropSet
                            = doc.GetElement(material.ThermalAssetId)
                              as PropertySetElement;

                        ThermalAsset thermalAsset = thermalPropSet
                                                    .GetThermalAsset();

                        StructuralAsset physicalAsset = physicalPropSet
                                                        .GetStructuralAsset();

                        ICollection <Parameter> physicalParameters
                            = physicalPropSet.GetOrderedParameters();

                        ICollection <Parameter> thermalParameters
                            = thermalPropSet.GetOrderedParameters();

                        // Appearance Asset

                        for (int i = 0; i < appearanceAsset.Size; i++)
                        {
                            AssetProperty property = appearanceAsset[i];
                            assetProperties.Add(property);
                        }
                        foreach (AssetProperty assetProp in assetProperties)
                        {
                            Type   type           = assetProp.GetType();
                            object assetPropValue = null;
                            var    prop           = type.GetProperty("Value");
                            if (prop != null &&
                                prop.GetIndexParameters().Length == 0)
                            {
                                assetPropValue = prop.GetValue(assetProp);
                            }
                        }

                        // Physical (Structural) Asset

                        foreach (Parameter p in physicalParameters)
                        {
                            // Work with parameters here
                            // The only parameter not in the orderedParameters
                            // that is needed is the Asset name, which you
                            // can get by 'physicalAsset.Name'.
                        }

                        // Thermal Asset

                        foreach (Parameter p in thermalParameters)
                        {
                            //Work with parameters here
                            //The only parameter not in the orderedParameters
                            // that is needed is the Asset name, shich you
                            // can get by 'thermalAsset.Name'.
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
        public static List <TextureBundle> GetTextureBundles(Document doc, out List <string> paths)
        {
            if (_bundleCache.ContainsKey(doc.PathName))
            {
                paths = _texturePathCache[doc.PathName];
                return(_bundleCache[doc.PathName]);
            }
            _texturePathCache.Add(doc.PathName, new List <string>());

            // Find materials
            FilteredElementCollector fec = new FilteredElementCollector(doc).OfClass(typeof(Material));

            // Convert materials to bundles
            List <TextureBundle> bundles = new List <TextureBundle>();

            foreach (var m in fec.Cast <Material>())
            {
                try
                {
                    var bundle = new TextureBundle(m);

                    ElementId appearanceAssetId = m.AppearanceAssetId;
                    AppearanceAssetElement appearanceAssetElem
                        = doc.GetElement(appearanceAssetId)
                          as AppearanceAssetElement;

                    if (appearanceAssetElem == null)
                    {
                        continue;
                    }

                    Asset asset = appearanceAssetElem
                                  .GetRenderingAsset();

                    if (asset == null)
                    {
                        continue;
                    }

                    for (int assetIdx = 0; assetIdx < asset.Size; assetIdx++)
                    {
                        AssetProperty aProperty = asset[assetIdx];
                        if (aProperty.NumberOfConnectedProperties < 1)
                        {
                            continue;
                        }

                        Asset connectedAsset = aProperty
                                               .GetConnectedProperty(0) as Asset;

                        // See if there is a path associated.
#if REVIT2018 || REVIT2019 || REVIT2020
                        // This line is 2018.1 & up because of the
                        // property reference to UnifiedBitmap
                        // .UnifiedbitmapBitmap.  In earlier versions,
                        // you can still reference the string name
                        // instead: "unifiedbitmap_Bitmap"
                        AssetPropertyString path = connectedAsset[
                            UnifiedBitmap.UnifiedbitmapBitmap]
                                                   as AssetPropertyString;
#else
                        AssetPropertyString path =
                            connectedAsset["unifiedbitmap_Bitmap"] as AssetPropertyString;
#endif
                        // If there is no asset path, nothing to pursue (Empty field)
                        if (path == null || String.IsNullOrEmpty(path.Value))
                        {
                            continue;
                        }

                        // See what kind of texture it is.
                        if (TryGetTextureTypeFromAssetName(connectedAsset.Name, out var t))
                        {
                            // This will be a relative path to the
                            // built -in materials folder, addiitonal
                            // render appearance folder, or an
                            // absolute path.
                            string assetName = Path.GetFileNameWithoutExtension(path.Value);

                            // Ensure that we have a valid texture path.
                            if (RevitTextures.ContainsKey(assetName))
                            {
                                bundle.TexturePaths.Add(t, new SafenedFilename(RevitTextures[assetName]));
                            }
                            else
                            {
                                //Logger.LogError(
                                //    $"Found asset outisde of Revit material lib: {path.Value}. Could not add to export"
                                //    );
                            }
                        }
                    }

                    // Return the bundle we created.
                    bundles.Add(bundle);
                }
                catch (Exception e)
                {
                    //Logger.LogException("Error in bundle creation: ", e);
                }
            }

            var bundleList = bundles.Where(b => b != null).ToList();
            _bundleCache.Add(doc.PathName, bundleList);
            paths = _texturePathCache[doc.PathName];

            return(bundleList);
        }
Beispiel #21
0
        public void OnMaterial(MaterialNode node)
        {
            currentTransparencyDouble = node.Transparency;
            currentColor           = node.Color;
            currentShiniess        = node.Glossiness;
            currentTransparencyint = Convert.ToInt32(node.Transparency);


            if (node.MaterialId != ElementId.InvalidElementId)
            {
                Asset theAsset = node.GetAppearance();
                if (node.HasOverriddenAppearance)
                {
                    theAsset = node.GetAppearanceOverride();
                }
                if (theAsset == null)
                {
                    //Element m = _doc.GetElement(node.MaterialId);
                    Material  material     = _doc.GetElement(node.MaterialId) as Material;
                    ElementId appearanceId = material.AppearanceAssetId;
                    AppearanceAssetElement appearanceElem = _doc.GetElement(appearanceId) as AppearanceAssetElement;
                    theAsset = appearanceElem.GetRenderingAsset();
                }


                if (theAsset.Size == 0)
                {
                    //TaskDialog.Show("revit","欧特克材质");
                    foreach (Asset objCurrentAsset in _objlibraryAsset)
                    {
                        if (objCurrentAsset.Name == theAsset.Name && objCurrentAsset.LibraryName == theAsset.LibraryName)
                        {
                            //var theValue = objCurrentAsset.Type.ToString();
                            ReadAsset(objCurrentAsset);
                            //TaskDialog.Show("欧特克材质", theValue);
                        }
                    }
                }
                else
                {
                    ReadAsset(theAsset);
                }



                //AssetProperty aProperty = theAsset[assetIdx];
                //if (aProperty.NumberOfConnectedProperties < 1)
                //    continue;
                //// Find first connected property.
                //// Should work for all current (2018) schemas.
                //// Safer code would loop through all connected
                //// properties based on the number provided.
                //Asset connectedAsset = aProperty.GetConnectedProperty(0) as Asset;
                //// We are only checking for bitmap connected assets.
                //if (connectedAsset.Name == "UnifiedBitmapSchema")
                //{
                //    // This line is 2018.1 & up because of the
                //    // property reference to UnifiedBitmap
                //    // .UnifiedbitmapBitmap. In earlier versions,
                //    // you can still reference the string name
                //    // instead: "unifiedbitmap_Bitmap"
                //    AssetPropertyString path = connectedAsset["unifiedbitmap_Bitmap"] as AssetPropertyString;
                //    // This will be a relative path to the
                //    // built -in materials folder, addiitonal
                //    // render appearance folder, or an
                //    // absolute path.
                //    TaskDialog.Show("Connected bitmap", String.Format("{0} from {2}: {1}", aProperty.Name, path.Value, connectedAsset.LibraryName));
            }

            if (currentMterialId != node.MaterialId)
            {
                var trgb = Util.ColorTransparencyToInt(currentColor, currentTransparencyint);
                face.Add(-1);
                face.Add(trgb);
                face.Add(currentTransparencyint);
                face.Add(-2);
                face.Add(-2);
                face.Add(-2);
                face.Add(-2);
                face.Add(-2);
                face.Add(-2);
                currentMterialId = node.MaterialId;


                var ttrgb = Util.ColorTransparencyString(currentColor, currentTransparencyint);

                if (!transparencys.ContainsKey(ttrgb))
                {
                    transparencys.Add(ttrgb, 1.0 - currentTransparencyDouble);
                }

                if (!colors.ContainsKey(ttrgb))
                {
                    colors.Add(ttrgb, currentColor);
                }
            }
            else
            {
                if (materialIndex == 0)
                {
                    var trgb = Util.ColorTransparencyToInt(currentColor, currentTransparencyint);
                    face.Add(-1);
                    face.Add(trgb);
                    face.Add(currentTransparencyint);
                    face.Add(-2);
                    face.Add(-2);
                    face.Add(-2);
                    face.Add(-2);
                    face.Add(-2);
                    face.Add(-2);
                    currentMterialId = node.MaterialId;
                    var ttrgb = Util.ColorTransparencyString(currentColor, currentTransparencyint);
                    colors.Add(ttrgb, currentColor);
                    transparencys.Add(ttrgb, currentTransparencyint);
                }
            }
            materialIndex++;
        }
    public List <BIM_Service.Material> Get(string elementID)
    {
        try
        {
            Document doc;
            if (ModelService.Service.IsActive)
            {
                doc = ModelService.Service.RvtDoc;
            }
            else if (TCPServer.Server.IsActive)
            {
                doc = TCPServer.Server.RvtDoc;
            }
            else
            {
                throw new Exception("Server not running...");
            }


            Element element = doc.GetElement(new ElementId(Convert.ToInt32(elementID)));

            List <BIM_Service.Material> materialsList = new List <BIM_Service.Material>();

            ICollection <ElementId> mats = element.GetMaterialIds(false);

            foreach (ElementId el in mats)
            {
                Material mat = (Material)doc.GetElement(el);

                AppearanceAssetElement appearance = (AppearanceAssetElement)doc.GetElement(mat.AppearanceAssetId);

                Asset theAsset = appearance.GetRenderingAsset();
                BIM_Service.Material elementMat = new BIM_Service.Material();

                //TODO: Use Appearance/Graphics properties

                //if (!mat.UseRenderAppearanceForShading)
                //{
                elementMat.name  = mat.Name;
                elementMat.id    = mat.Id.IntegerValue;
                elementMat.color = "[" +
                                   mat.Color.Red.ToString() + "," +
                                   mat.Color.Green.ToString() + "," +
                                   mat.Color.Blue.ToString() + "," +
                                   mat.Transparency.ToString() + "]";

                elementMat.shininess = mat.Shininess.ToString();
                elementMat.smothness = mat.Smoothness.ToString();
                //}
                //else
                //{
                //    elementMat.name = theAsset.Name;

                //    elementMat.id = theAsset.Id.IntegerValue;
                //    elementMat.color = "[" +
                //        theAsset.Color.Red.ToString() + "," +
                //        theAsset.Color.Green.ToString() + "," +
                //        theAsset.Color.Blue.ToString() + "," +
                //        theAsset.Transparency.ToString() + "]";

                //    elementMat.shininess = theAsset.Shininess.ToString();
                //    elementMat.smothness = theAsset.Smoothness.ToString();
                //}



                materialsList.Add(elementMat);
            }

            return(materialsList);
        }
        catch (Exception e)
        {
            TaskDialog.Show("Error", e.Message);
        }
        return(null);
    }
Beispiel #23
0
        IList <string> GetAssetPropValueFromMaterial(AppearanceAssetElement currentAppearance, IList <string> targetList)
        {
            IList <string> valuesToReturn = new List <string>();

            if (currentAppearance != null)
            {
                Asset thisAsset = currentAppearance.GetRenderingAsset();
                if (thisAsset != null)
                {
                    for (int i = 0; i < thisAsset.Size; i++)
                    {
                        AssetProperty currentProp = thisAsset[i];

                        if (currentProp != null)
                        {
                            AssetPropertyString currentPropString = currentProp as AssetPropertyString;
                            if (currentPropString != null)
                            {
                                if (currentPropString.Value != null && currentPropString.Value != "")
                                {
                                    CheckStringAValidTexturePathCorrectItAndAddToList(currentPropString.Value, targetList);
                                }
                            }
                        }

                        IList <AssetProperty> allProp = currentProp.GetAllConnectedProperties();

                        if (allProp != null && allProp.Count > 0)
                        {
                            foreach (AssetProperty currentConnectedProp in allProp)
                            {
#if R2016 || R2017
                                if (currentConnectedProp.Type == AssetPropertyType.APT_Asset)
                                {
                                    Asset currentConnectedAsset = currentConnectedProp as Asset;
                                    if (currentConnectedAsset != null)
                                    {
                                        for (int j = 0; j < currentConnectedAsset.Size; j++)
                                        {
                                            AssetProperty currentConnectedAssetProp = currentConnectedAsset[j];
                                            if (currentConnectedAssetProp != null)
                                            {
                                                AssetPropertyString currentConnectedAssetPropString = currentConnectedAssetProp as AssetPropertyString;
                                                if (currentConnectedAssetPropString != null)
                                                {
                                                    if (currentConnectedAssetPropString.Value != null && currentConnectedAssetPropString.Value != "")
                                                    {
                                                        CheckStringAValidTexturePathCorrectItAndAddToList(currentConnectedAssetPropString.Value, targetList);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
#else
                                if (currentConnectedProp.Type == AssetPropertyType.Asset)
                                {
                                    Asset currentConnectedAsset = currentConnectedProp as Asset;
                                    if (currentConnectedAsset != null)
                                    {
                                        for (int j = 0; j < currentConnectedAsset.Size; j++)
                                        {
                                            AssetProperty currentConnectedAssetProp = currentConnectedAsset[j];
                                            if (currentConnectedAssetProp != null)
                                            {
                                                AssetPropertyString currentConnectedAssetPropString = currentConnectedAssetProp as AssetPropertyString;
                                                if (currentConnectedAssetPropString != null)
                                                {
                                                    if (currentConnectedAssetPropString.Value != null && currentConnectedAssetPropString.Value != "")
                                                    {
                                                        CheckStringAValidTexturePathCorrectItAndAddToList(currentConnectedAssetPropString.Value, targetList);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
#endif
                            }
                        }
                    }
                }
            }
            return(valuesToReturn);
        }
Beispiel #24
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);
        }
Beispiel #25
0
 public static AppearanceAssetElement Duplicate(this AppearanceAssetElement element, string name)
 {
     return(AppearanceAssetElement.Create(element.Document, name, element.GetRenderingAsset()));
 }
        public static Assimp.Material ConvertToAssimpMaterial(TextureBundle bundle, Document doc)
        {
            // Create new material with base props
            // from the Revit material
            var newmat = new Assimp.Material()
            {
                Opacity      = bundle.Material.GetOpacity(),
                Reflectivity = 0f,
                Name         = bundle.Material.Name,
                ColorDiffuse = bundle.Material.ToColor4D()
            };

            // Extract base properties from revit material
            ElementId appearanceAssetId            = bundle.Material.AppearanceAssetId;
            AppearanceAssetElement appearanceAsset = doc.GetElement(appearanceAssetId) as AppearanceAssetElement;
            Asset renderingAsset = appearanceAsset.GetRenderingAsset();
            RenderAppearanceDescriptor rad
                = new RenderAppearanceDescriptor(renderingAsset);
            PropertyDescriptorCollection collection          = rad.GetProperties();
            List <PropertyDescriptor>    orderableCollection = new List <PropertyDescriptor>(collection.Count);

            List <string> allPropNames = orderableCollection.Select(f => f.Name).ToList();

            foreach (PropertyDescriptor descr in collection)
            {
                orderableCollection.Add(descr);
                switch (descr.Name)
                {
                    #region Notes

                    // The commented out properties aren't in use yet,
                    // but do work with revit materials as expected.

                    //case "texture_UScale":
                    //    var uScale = renderingAsset["texture_UScale"] as AssetPropertyDouble;
                    //    break;
                    //case "texture_VScale":
                    //    break;
                    //case "texture_UOffset":
                    //    break;
                    //case "texture_VOffset":
                    //    break;
                    //case "texture_RealWorldScaleX":
                    //    var xScale = renderingAsset["texture_RealWorldScaleX"] as AssetPropertyDistance;
                    //    break;
                    //case "texture_RealWorldScaleY":
                    //    break;

                    #endregion

                case "generic_diffuse":
                    var prop = renderingAsset.GetAssetProperty <AssetPropertyDoubleArray4d>("generic_diffuse");
                    newmat.ColorDiffuse = ColorFromAssetDoubleArray4d(prop);
                    break;

                case "glazing_reflectance":
                    // This is glass, so we should reduce the transparency.
                    var refl = renderingAsset.GetAssetProperty <AssetPropertyDouble>("glazing_reflectance");
                    if (refl == null)
                    {
                        var reflFloat = renderingAsset.GetAssetProperty <AssetPropertyFloat>("glazing_reflectance");
                        newmat.Reflectivity = reflFloat?.Value ?? 0f;
                    }
                    else
                    {
                        newmat.Reflectivity = (float)refl.Value;
                    }
                    newmat.Opacity = Math.Abs(0f - newmat.Reflectivity);
                    break;

                case "common_Tint_color":
                    // Tint shouldn't be used if generic diffuse is set
                    if (
                        renderingAsset.GetAssetProperty <AssetPropertyDoubleArray4d>("generic_diffuse") != null
                        )
                    {
                        continue;
                    }
                    var tintProp = renderingAsset.GetAssetProperty <AssetPropertyDoubleArray4d>("common_Tint_color");
                    newmat.ColorDiffuse = ColorFromAssetDoubleArray4d(tintProp);
                    break;

                default:
                    break;
                }
            }

            // Set textures
            foreach (var tx in bundle.TexturePaths)
            {
                // Get the filename
                var txFileName = tx.Value.SafeFileName;
                if (tx.Key == RevitTextureType.Color)
                {
                    newmat.TextureDiffuse = new TextureSlot(
                        $"Textures/{txFileName}",
                        TextureType.Diffuse,
                        0,    // Texture index in the material
                        TextureMapping.Box,
                        0,    //
                        0.5f, // Blend mode
                        TextureOperation.Add,
                        TextureWrapMode.Clamp,
                        TextureWrapMode.Clamp,
                        0 // Flags,
                        );
                }
                else if (tx.Key == RevitTextureType.Bump)
                {
                    newmat.TextureHeight = new TextureSlot(
                        $"Textures/{txFileName}",
                        TextureType.Diffuse,
                        0,    // Texture index in the material
                        TextureMapping.Box,
                        0,    //
                        0.5f, // Blend mode
                        TextureOperation.Add,
                        TextureWrapMode.Clamp,
                        TextureWrapMode.Clamp,
                        0 // Flags,
                        );
                }
            }
            return(newmat);
        }