请问老师:
如下图,为什么transparency是0,但是实际看到在却不是非透明?
请上传一下您的模型文件。
2146.tt.dgn
颜色、线宽、线型是有这样的函数的,但可惜透明度没有找到。
好的,谢谢,符老师辛苦了
符老师,现在是不是有新的API可以拿到这种情况的透明度?
并没有。
我再咨询一下国外专家吧。不过,还是想问清楚:您这个元素是如何创建出来的?请详细描述其创建的过程,我们这边需要能复现这个现象才好分析原因。
我写了如下测试代码终于分析清楚了该问题的原因:
struct MyProcessor : public IElementGraphicsProcessor { virtual void _AnnounceElemDisplayParams(ElemDisplayParamsCR displayParams) override { WPrintfString wStr(L"element transparency = %.4f", displayParams.GetTransparency()); mdlDialog_dmsgsPrint (wStr); } virtual void _AnnounceElemMatSymb(ElemMatSymbCR matSymb) override { WChar materialName[256]; matSymb.GetMaterial()->GetName(materialName); WPrintfString wStr(L"material name = %s\n", materialName); mdlDialog_dmsgsPrint (wStr); } } void getTrans(WCharCP unparsed) { MyProcessor processor; ElementHandle eh(2385L, ACTIVEMODEL); ElementGraphicsOutput::Process(eh, processor); }
最终输出了如下信息:
这说明这个106类型的元素其元素透明度确实是0(不透明),但它被赋予了材质Gray glass no refract。查该材质的透明度应该是透明的。当一个元素被赋予材质后,其本身的透明度特性将失去效果。
Answer Verified By: 石磊
建模是用的OBD。哦,原来是这样。我试试。谢谢符老师。
进一步写代码分析,发现这个透明度是依靠TransmitIntensity来控制的。材质编程这一块极其复杂。
virtual void _AnnounceElemMatSymb(ElemMatSymbCR matSymb) override { WChar materialName[256]; MaterialCP pMat = matSymb.GetMaterial(); pMat->GetName(materialName); MaterialSettingsCR matSet = pMat->GetSettings(); WPrintfString wStr(L"material name = %s\nmaps count = %d", materialName, matSet.GetMaps().Size()); mdlDialog_dmsgsPrint(wStr); wStr.Sprintf(L"translucencyScale = %.4f\ntransmitIntensity = %.4f", matSet.GetTranslucencyScale(), matSet.GetTransmitIntensity()); mdlDialog_dmsgsPrint(wStr); for (auto iter : matSet.GetMaps()) { MaterialMapLayerCollectionCR layers = iter.second->GetLayers(); for (MaterialMapLayerConstIterator iter2 = layers.begin(); iter2 != layers.end(); ++iter2) { WPrintfString wStr2(L"MapType = %d, LayerType = %d, Opacity=%.4f", iter.second->GetType(), iter2->GetType(), iter2->GetOpacity()); mdlDialog_dmsgsPrint(wStr2); } } }
即:matSymb.GetMaterial()->GetSettings().GetTransmitIntensity()可获得0.9这个值,正好对应界面中的opacity为10。因为transmit表示透过度,而opacity表示不透明度,两者的值是相反的。再者,transmit的取值范围是0~1,而界面上的Opacity取值范围是0~100.
故opacity = (1-matSymb.GetMaterial()->GetSettings().GetTransmitIntensity()) * 100;
嗯,非常感谢符老师,说明非常详细。