使用以下设置,将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 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返回的索引是负值,需要取绝对值。