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曲面的高程分析样式设置。