欢迎来到我的博客
Civil 3D开发与应用,欢迎加入QQ群:484124761
AutoCAD开发,欢迎加入QQ群:193522571

civil 3d 体积曲面提取等高线

为了求两个曲面的交线,

采用创建体积曲面并提取高程为0的等高线方法来迂回实现,

因缺少.net api,

不得不使用com api,

对于不熟悉Com用法的朋友(比如我自己),

可能会卡在这样那样的问题上,

这些问题在网络上能搜索到的有效信息比较少,

因而解决起来也比较麻烦。

 

难点在于类型的转换,

吃不准对象的类型,

转换就会失败。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
private void CreateSurfaceIntersectionLines(ref List<Point2dCollection> ptss)
{
    //获取曲面样式Id
    ObjectId volumeSurfaceStyleId = GetVolumeSurfaceStyleId();
    //创建体积曲面
    var volumeSurfaceId = TinVolumeSurface.Create("辅助体积曲面", egSurfaceId, gradingSurfaceId, volumeSurfaceStyleId);
    //获取Com对象
    AeccTinVolumeSurface aeccTVS = _comDoc.ObjectIdToObject((volumeSurfaceId.OldIdPtr).ToInt64()) as AeccTinVolumeSurface;
    //提取等高线
    IEnumerable contours = aeccTVS.ExtractContour(AeccDisplayOrientation.aeccDisplayOrientationPlan, AeccSurfaceFilterType.aeccSFMajorContours, -0.0001, 0.0001) as IEnumerable;
    //顶点集合,可能存在多条等高线,所以需要用集合
    //List<Point2dCollection> ptss = new List<Point2dCollection>();
    foreach (var contour in contours)
    {
        //转换为AcadLWPolyline,起初转为AcadPolyline,类型不对
        AcadLWPolyline pl = contour as AcadLWPolyline;
        if (pl != null)
        {
            Point2dCollection pts = new Point2dCollection();
            //坐标是以doulbe数组形式存储的
            double[] cors = pl.Coordinates as double[];
            for (int i = 0; i < cors.Length - 2; i += 2)
            {
                pts.Add(new Point2d(cors[i], cors[i + 1]));
            }
            ptss.Add(pts);
            //删除多段线
            pl.Delete();
        }
    }
    //删除辅助体积曲面
    aeccTVS.Delete();
}

 

posted @   david96007  阅读(1877)  评论(1编辑  收藏  举报
编辑推荐:
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
点击右上角即可分享
微信分享提示