revit二次开发 材质相关 | 您所在的位置:网站首页 › revit导出材质 › revit二次开发 材质相关 |
最近一直在研究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 实验室设备网 版权所有 |