使用以下设置,将Element解析为PolyfaceHeader
public override bool ProcessAsBody(bool isCurved) { return false; } public override bool ProcessAsFacets(bool isPolyface) { return true; } public override BentleyStatus ProcessFacets(PolyfaceHeader meshData, bool filled) { list.Add(meshData); return base.ProcessFacets(meshData, filled); }
返回的PolyfaceHeader参数见下
这个参数是指面的数量吗?如何进一步解析,得到每一个面的数据?
通过PolyfaceHeader.Point和PolyfaceHeader.PointIndex可以计算出平面数据,但是如果是曲面的话,好像就无法表达。看点的数量,曲面已经平面化了?
这个您可以在Msth中画一个矩形,再画一个圆形,然后用Mstn的Mesh From Element转换成Mesh元素,把Mesh元素传递给这个接口,然后调试看一下meshData的具体值跟Mesh图形对照一下就明白了,Mesh元素的几何数据画的特殊一点这样利于观察,例如您的圆心画到原点,半径给成1,10等这些特殊值。
Answer Verified By: Chao Cheng
平面数据都很好理解,对于一个复杂的三维元素,不是很能理解。
测试了examples\Elements\exampleSolids 的代码,代码无法操作复杂实体。
后来通过SolidUtil.GetBodyFaces,取到了面级别的数据。但是新的问题,.net下没有封装GetPlanarFaceData方法,无法判断面的种类。
另外,想请问下,ElementGraphicsProcessor和SolidUtil这两个几何类的建议适用场景?
面片是如何表达您所说的球面的?我所理解的mesh都是由三角平面片或四角平面片构成。
使用SolidUtil.GetBodyFaces(),返回3个面,通过SolidUtil::GetPlanarFaceData()可以判断出两个平面,一个非平面,这个非平面如何进一步判断为弧面?API里好像没找到表达弧面的几何结构,统一都用SubEntity。
C:\Program Files\Bentley\MicroStationCONNECTSDK\Documentation\MicroStationAPI.chm看看SDK这个文档对GetPlanarFaceData的注释,不是您理解的意思。Mesh就是下图这样表达球面的,类似于我上边说的以直代曲的意思。SubEntity可以转换成其他几何数据(SolidUtil::Convert::SubEntityToCurveVector或SolidUtil::Convert::SubEntityToGeometry)
我觉得,我理解没错吧,虽然函数本身是用来求平面中心点及中心点处的法向量的,但是返回值可以表示传入的面是不是平面。
另外,对一个球体使用Mesh from Element命令,设置Max Num为3,对这个转化成的mesh使用ElementGraphicsProcessor,.net下返回的结果有问题,见下图,多个面片使用同一个点,测试有32个面片有共同的点
设置Max Num为4,允许四角面片的话,结果正常.
完全有这种可能呀,球的顶点处如果您导出的精度设置的比较高的话,会有好几个面片共用同一顶点:
上面两个图,区别在于Max Num 3和4 ,使用PolyfaceHeader.PointIndex重新生成,应该不是精度问题,可能是.net接口问题吧,或者是我没有理解数据结构。
您试试c/c++的接口,如果c/c++接口运行结果一样的话,那应该还是重新生成时用法不对。目前来说c#确实会有一些问题,没有c/c++的接口可靠一些。
.net和c++接口都没问题,数据是正确的,之前是数据结构没弄明白,PolyfaceHeader.PointIndex返回的点索引以1开始,对应到PolyfaceHeader.Point时,需要减1。
另外.net下PolyfaceHeader.PointIndex返回的索引是负值,需要取绝对值。