revit二次开发 材质相关 您所在的位置:网站首页 revit导出材质 revit二次开发 材质相关

revit二次开发 材质相关

2024-06-06 01:56| 来源: 网络整理| 查看: 265

最近一直在研究revit材质导出方面,采用了官方的CustomExport接口。 材质导出分为两种:着色和真实。 着色方面: 着色方面的颜色导出相对简单,使用onMaterial(MaterialNode node)中的node。

public void OnMaterial(MaterialNode node) { material = (this.CurrentDocument.GetElement(node.MaterialId) as Material); ExMaterial mxmaterial=new ExMaterial(); mxMaterial.id = node.MaterialId.IntegerValue; mxMaterial.name = material.Name; Color color = node.Color; if (color.IsValid) { mxMaterial.diffuse[0] = (double)color.Red / 255.0; mxMaterial.diffuse[1] = (double)color.Green / 255.0; mxMaterial.diffuse[2] = (double)color.Blue / 255.0; } else { #对于color.IsValid的一个补充获取颜色的值 mxMaterial.diffuse[0] = (double)material.Color.Red / 255.0; mxMaterial.diffuse[1] = (double)material.Color.Green / 255.0; mxMaterial.diffuse[2] = (double)material.Color.Blue / 255.0; } mxMaterial.transparent=1.0-node.Transparency; } #过滤器的颜色 var filterIds = view.GetFilters(); foreach (var id in filterIds) { var filter = doc.GetElement(id) as ParameterFilterElement; if (filter == null) continue; bool passed = true; if (filter.GetCategories().Contains(ele.Category.Id)) { var rules = filter.GetRules(); if (rules.Count > 0) { foreach (var r in rules) { if (!r.ElementPasses(ele)) { passed = false; break; } } } if (passed) { diffuses[0] = (double)view.GetFilterOverrides(id).ProjectionFillColor.Red / 255; diffuses[1] = (double)view.GetFilterOverrides(id).ProjectionFillColor.Green / 255; diffuses[2] = (double)view.GetFilterOverrides(id).ProjectionFillColor.Blue / 255; return filter; } } }

真实方面: 依旧是通过node,获取它的asset

第一种获取asset

Asset asset = null; if (node.HasOverriddenAppearance) { asset = node.GetAppearanceOverride(); } else { asset = node.GetAppearance(); }

但是不一定能获取到asset的值。测试得到asset.size0,可以尝试遍历asset的值。 方法可以参考这篇大神博客:https://blog.csdn.net/zouzouol/article/details/89329573

//判断材质是否是玻璃类别 特殊情况 string value = (asset["UIDefinition"] as AssetPropertyString).Value if (value.Contains("SolidGlass")) { //使用玻璃类别的方法获取不同种类玻璃的颜色 SolidGlass(asset, ref mxMaterial); //例子方法如下: //AssetPropertyEnum assetProperty1 = asset["solidglass_transmittance"] as AssetPropertyEnum; //if(assetProperty1.Value==0) //{ //白色玻璃 //颜色的值为固定值,在文档中写死的。文档路径如下 //C:\ProgramFiles (x86)\CommonFiles\Autodesk Shared\Materials\2018\assetlibrary_base.fbm\Mats // mxMaterial.diffuse[0] = 0.858; // mxMaterial.diffuse[1] = 0.893; // mxMaterial.diffuse[2] = 0.879; // } }

第二种获取asset

从欧特克材质库取asset。这是对上面方法取到的asset,进行的一个补充获取,比较耗时。有一些情况下,asset的size包含数量很少,此时启用这种方法。

private static Asset getAdskasset(Document doc, ElementId assetId) { AssetSet assetSet = doc.Application.get_Assets(AssetType.Appearance); Asset asset = (doc.GetElement(assetId) as AppearanceAssetElement).GetRenderingAsset(); if (asset.Size Asset asset0 = assetSetIterator.Current as Asset; if (asset0 != null && asset0.Name == asset.Name) { asset = asset0; break; } } } return asset; }

取出asset后,再使用上面的方法,遍历属性,查看所有的信息。再针对性的得到想要的信息,如颜色,类别等。方法同上。

注:不同的版本,获取的方式有一些区别,需要针对版本进行修改。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有