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

Civil 3D曲面高程分析

Civil 3d曲面分析功能很强大,

但其分析样式过于自由,

由于自由度过大,

用户的使用体验并不好(个人偏见,不一定对)。

Map3D中的样式,

可以使用USGS国家地理调色板的色带,

结果相对漂亮,

于是产生了将其移植到Civil 3D中的想法,

自己写了一部分代码,

运行结果如下:

 

 

代码片段(主要代码)如下:

        public void SetElevationAnalysis()
        {
            string styName = "原始地形高程分析";
            if (!SelectSurface()) return;
            using (Transaction tr = doc.TransactionManager.StartTransaction())
            {
                TinSurface sur = surId.GetObject(OpenMode.ForWrite) as TinSurface;

                double minEle = sur.GetGeneralProperties().MinimumElevation;
                double maxEle = sur.GetGeneralProperties().MaximumElevation;
                sur.Analysis.SetElevationData(CreateElevationAnalysis(minEle, maxEle));
            
                if (GetStyleByName(styName))
                {

                    (_comDoc.ObjectIdToObject(surId.OldIdPtr.ToInt64()) as AeccTinSurface).set_Style(styName);
                }
                sur.Rebuild();
                tr.Commit();
            }
        }

 

上面代码中的CreateElevationAnalysis方法如下:

用来生成曲面高程分析数据。

 private SurfaceAnalysisElevationData[] CreateElevationAnalysis(double minEle, double maxEle)
        {
            double min = (Math.Floor(minEle / 5)) * 5;
            double max = Math.Ceiling(maxEle);
            double step = Math.Ceiling((max - min) / 22);
            Color[] colors = new Color[]
            {
                Color.FromRgb(116,156,92 ),
                Color.FromRgb(116,172,100),
                Color.FromRgb(148,188,116),
                Color.FromRgb(180,212,116),
                Color.FromRgb(204,228,148),
                Color.FromRgb(220,236,164),
                Color.FromRgb(244,236,164),
                Color.FromRgb(236,220,156),
                Color.FromRgb(244,204,132),
                Color.FromRgb(236,180,132),
                Color.FromRgb(220,156,124),
                Color.FromRgb(196,140,124),
                Color.FromRgb(212,156,148),
                Color.FromRgb(228,172,164),
                Color.FromRgb(220,188,180),
                Color.FromRgb(236,196,212),
                Color.FromRgb(252,204,228),
                Color.FromRgb(252,220,236),
                Color.FromRgb(252,228,224),
                Color.FromRgb(252,220,228),
                Color.FromRgb(252,244,252),
                Color.FromRgb(252,252,252)

            };
            SurfaceAnalysisElevationData[] datas = new SurfaceAnalysisElevationData[22];

            for (int i = 0; i < 22; i++)
            {
                datas[i] = new SurfaceAnalysisElevationData(min + (step * i), min + (step * (i + 1)), colors[i]);
            }

            return datas;
        }

 

GetStyleByName方法如下:

用来获取曲面样式。

 bool GetStyleByName(string styName)
        {
            var styles = civilDoc.Styles.SurfaceStyles;
            if (!styles.Contains(styName))
            {

                using (Transaction tr = doc.TransactionManager.StartTransaction())
                {
                    ObjectId id = styles.Add(styName);
                    SurfaceStyle sty = id.GetObject(OpenMode.ForWrite) as SurfaceStyle;
                    sty.CreateBy = "\u738B\u78CA";
                    if (styName.Contains("高程") || styName.Contains("高度"))
                    {
                        sty.GetDisplayStylePlan(SurfaceDisplayStyleType.Elevations).Visible = true;
                        sty.GetDisplayStyleModel(SurfaceDisplayStyleType.Elevations).Visible = true;
                    }
                    if (styName.Contains("坡度"))
                    {
                        sty.GetDisplayStylePlan(SurfaceDisplayStyleType.Slopes).Visible = true;
                        sty.GetDisplayStyleModel(SurfaceDisplayStyleType.Slopes).Visible = true;
                    }
                    tr.Commit();
                }
            }
            return (civilDoc.Styles.SurfaceStyles.Contains(styName));
        }
SelectSurface()方法用来获取surId,
你可以自行完成,
_comDoc是com文档,
用来设置曲面样式,
.netapi不全,
不得不借助com api来实现,
这部分内容可以参考《Autocad Civil 3D .net 二次开发》中相关章节的内容。

有了以上代码,
相信您可以很快的编译出自己的命令,
来实现Civil 3D曲面的高程分析样式设置。

 

posted @ 2020-04-21 15:02  david96007  阅读(1841)  评论(1编辑  收藏  举报