AutoCAD Civil 3D .Net二次開發一書中第11.2節使用customdraw實現了縱斷面圖標尺的顯示,
對於不熟悉c++的用戶來說,
掌握這部分內容有些困難,
今天就用另一種方式來實現同樣的功能。
這里涉及到的主要方法與前一篇帖子類似,
都是使用的DrawableOverrule。
話不多數,
直接上代碼。
相對於書中c++代碼,
代碼要簡單不少。
需要注意的是有些參數的獲取方式及對象的屬性值有所變化,
所以下面的代碼與書中的c++並不完全相同。
上面截圖就是用以下代碼實現的,
有需要的朋友可以在此基礎上修修改改來實現自己的需求,
直接拿走,
不用謝!
public class ProfileViewOverrule : DrawableOverrule { Document doc; CivilDocument civilDoc; double m_CannoScale; double m_Scale = 1; Point3d axOriginPoint;
public override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.Drawable drawable, Autodesk.AutoCAD.GraphicsInterface.WorldDraw wd) { doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; civilDoc = CivilApplication.ActiveDocument; m_CannoScale = doc.Database.Cannoscale.Scale; var ut = civilDoc.Settings.DrawingSettings.UnitZoneSettings.DrawingUnits; if (ut == DrawingUnitType.Feet) { m_Scale = 12; } else if (ut == DrawingUnitType.Meters) { m_Scale = 1000; } ProfileView pv = (ProfileView)drawable; if (pv == null) return base.WorldDraw(drawable, wd); var pos = pv.GraphOverrides; var ge = pv.GeometricExtents; axOriginPoint = ge.MinPoint; //var maxEle = pv.ElevationMax; //var minEle = pv.ElevationMin; var maxEle = ge.MaxPoint.Y; var minEle = ge.MinPoint.Y; var styId = pv.StyleId; if (styId == null) return base.WorldDraw(drawable, wd); Color color = Color.FromColorIndex(ColorMethod.ByLayer, 192); string layerName; double l = 1; double w = 1; double vs = 1; using (Transaction tr = doc.TransactionManager.StartTransaction()) { var sty = styId.GetObject(OpenMode.ForRead) as ProfileViewStyle; if (sty != null) { color = sty.GetDisplayStylePlan(ProfileViewDisplayStyleType.LeftAxisTicksMinor).Color; layerName = sty.GetDisplayStylePlan(ProfileViewDisplayStyleType.LeftAxisTicksMinor).Layer; l = sty.LeftAxis.MinorTickStyle.Interval; w = sty.LeftAxis.MinorTickStyle.Size; vs = sty.GraphStyle.VerticalExaggeration; } tr.Commit(); } wd.SubEntityTraits.Color = color.ColorIndex; Point3d startPt = axOriginPoint + new Vector3d(-w * m_Scale / m_CannoScale, 0, 0); Point3d endPt = startPt + new Vector3d(0, (maxEle - minEle) / m_CannoScale, 0); wd.Geometry.WorldLine(startPt, endPt); int i = 0; for (double d = minEle; maxEle - d > 0.001; d += l * vs * 2 / m_CannoScale) { startPt = axOriginPoint + new Vector3d(-w * m_Scale / (2 * m_CannoScale), i * l * vs / m_CannoScale, 0); endPt = startPt + new Vector3d(0, l * vs / m_CannoScale, 0); Autodesk.AutoCAD.DatabaseServices.Polyline pl = new Autodesk.AutoCAD.DatabaseServices.Polyline(); pl.AddVertexAt(0, new Point2d(startPt.X, startPt.Y), 0, w * m_Scale / m_CannoScale, w * m_Scale / m_CannoScale); pl.AddVertexAt(1, new Point2d(endPt.X, endPt.Y), 0, w * m_Scale / m_CannoScale, w * m_Scale / m_CannoScale); wd.Geometry.Polyline(pl, 0, 1); //pl.WorldDraw(wd); //pl.Dispose(); i += 2; } return base.WorldDraw(drawable, wd); } }
如何調用上面的代碼,
可以參照這個鏈接中的文章。