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