ElementGraphicsProcessor的实现如下,参考C++的样例做的。
public class MeshProcessor : ElementGraphicsProcessor { private List<PolyfaceHeader> _meshData = new List<PolyfaceHeader>(); private List<Color> _colorData = new List<Color>(); private FacetOptions _options; private DTransform3d _transform = DTransform3d.Identity; public MeshProcessor(FacetOptions options) { _options = options; } public bool Success = false; public DTransform3d Transform { //get { return _transform; } get { return DTransform3d.Identity; } } public List<PolyfaceHeader> MeshData { get { return _meshData; } } public List<Color> ColorData { get { return _colorData; } } public override BentleyStatus ProcessFacets(PolyfaceHeader meshData, bool filled) { var mesh = new PolyfaceHeader(); mesh.CopyFrom(meshData); mesh.Transform(ref _transform, false); _meshData.Add(mesh); Success = true; return BentleyStatus.Success; } public override void AnnounceElementDisplayParameters(ElementDisplayParameters displayParams) { ColorData.Add(Color.FromArgb((int)displayParams.LineColorTBGR)); } public override FacetOptions GetFacetOptions() { return _options; } public override bool ProcessAsFacets(bool isPolyface) { return true; } public override bool ProcessAsBody(bool isCurved) { return false; } public override void AnnounceTransform(DTransform3d trans) { if (trans != null) { _transform = trans; } else { _transform = DTransform3d.Identity; } } }
对于大部分Element都还不错,但是对CellHeaderElement,SharedCellElement以及ExtendedElementElement的几何面片化会出问题。如下图:
原模型(SharedCellElement):SharedCellElement.dgn
转换前: 转换后:
原模型(ExtendedElementElement):ExtendedElementElement.dgn
转换前:转换后:
还望帮忙用C#或C++测试一下是我的代码问题还是别的什么问题,谢谢!
下图是我用你的第一个dgn文件转换后的结果,形状都是对的,只不过是位置和大小不对应,AnnounceTransform会传递给你一个变换矩阵的参数,在这个函数里边保存一下这个参数,然后在ProcessFacets函数里边把传递进来的meshData变换一下就对了。
Answer Verified By: Hengwei Wang
目前已经使用了AnnounceTransform,并且对mesh进行了转换:
public override BentleyStatus ProcessFacets(PolyfaceHeader meshData, bool filled) { var mesh = new PolyfaceHeader(); mesh.CopyFrom(meshData); mesh.Transform(ref _transform, false); _meshData.Add(mesh); Success = true; return BentleyStatus.Success; }
请问您使用的是C++还是C#的API?我怀疑是C# API中的实现有问题,因为其他Element是好的。不过如果我的怀疑有误,那应该就是我解析meshData的方法有问题了。
用的C#