/// <summary> 找到边坡线附近所属的中心轴线 </summary> /// <param name="pl"></param> /// <remarks>未找到则返回 null </remarks> private static SubgradeSection FindCenterAxisOnScreen(DocumentModifier docMdf, Polyline pl) { var pline = pl; var bdbl = pline.Bounds.Value.MinPoint; // 左下角点 bdbl = new Point3d(bdbl.X - Options_General.RoadWidth / 2, bdbl.Y - 0, bdbl.Z); var bdtr = pline.Bounds.Value.MaxPoint; // 右上角点 bdtr = new Point3d(bdtr.X + Options_General.RoadWidth / 2, bdtr.Y + 0, bdtr.Z); var res = docMdf.acEditor.SelectCrossingWindow(bdbl, bdtr, SubgradeSection.Filter); if (res.Status == PromptStatus.OK) { var ids = res.Value.GetObjectIds(); Line minLine = null; var minDis = double.MaxValue; // 可能找到多条轴线,比较轴线中点到边坡线两个端点距离最小的那个轴线 foreach (var id in ids) { var l = id.GetObject(OpenMode.ForRead) as Line; var dir = l.StartPoint - l.EndPoint; if (dir.IsParallelTo(new Vector3d(0, 1, 0))) { // 根据距离最近的原则来从众多的轴线中寻找匹配项 var centMid = l.StartPoint.Add((l.EndPoint - l.StartPoint).DivideBy(2)); // 轴线的中点 var d1 = centMid.DistanceTo(pl.StartPoint); var d2 = centMid.DistanceTo(pl.StartPoint); var minD = Math.Min(d1, d2); if (minD < minDis) { minLine = l; minDis = minD; } } } // 构造 CenterAxis 对象 SubgradeSection centerLine = null; var si = SectionInfo.FromCenterLine(minLine); if (si != null && si.FullyCalculated) { centerLine = new SubgradeSection(docMdf, minLine, si); } if (centerLine == null) { string errorMsg = ""; centerLine = SubgradeSection.Create(docMdf, minLine, out errorMsg); if (centerLine == null) { } } return(centerLine); } docMdf.WriteLineIntoDebuger("在边坡线周围没有找到中心轴线。请检查边坡线数据中是否保存有道路中线句柄值,或者将视图缩小以在屏幕中显示出对应的轴线。轴线搜索范围:" + "\r\n" + bdbl + " ~ " + bdtr); return(null); }
/// <summary> 根据边坡线对象中可能存储的轴线对象句柄值来提取对应的轴线对象 </summary> /// <param name="pl"></param> /// <remarks>未找到则返回 null </remarks> private static SubgradeSection FindCenterAxisOnHandle(DocumentModifier docMdf, Polyline pl) { var data = SlopeData.FromEntity(pl); if (data != null && data.FullyCalculated) { var cl = data.CenterAxisHandle.GetDBObject <Line>(docMdf.acDataBase); if (cl != null) { var si = SectionInfo.FromCenterLine(cl); if (si != null) { var ss = new SubgradeSection(docMdf, cl, si); return(ss); } } } return(null); }
/// <summary> 构造方式二: 通过<seealso cref="SubgradeSection" /> 进行指定 </summary> /// <param name="docMdf"></param> /// <param name="pline"></param> /// <param name="axis"></param> /// <param name="onLeft"></param> /// <param name="isFill"></param> /// <param name="retainingWall"></param> public SlopeLine(DocumentModifier docMdf, Polyline pline, SubgradeSection axis, bool onLeft, bool isFill, RetainingWallType retainingWallType, Polyline retainingWall = null) { _docMdf = docMdf; // Pline = pline; Section = axis; Station = axis.XData.Station; _onLeft = onLeft; _isFill = isFill; _retainingWallType = retainingWallType; _retainingWall = retainingWall; if (retainingWall != null) { _retainingWallCurve = _retainingWall.GetGeCurve() as CompositeCurve3d; } // 构造边坡系统 ConstructSlopeSys(pline, out _slopes, out _platforms); }
/// <summary> /// 构造方式一:从零开始判断与计算(不能成功构造,则返回 null) /// </summary> /// <param name="docMdf"></param> /// <param name="centerLine"></param> /// <returns></returns> public static SubgradeSection Create(DocumentModifier docMdf, Line centerLine, out string errorMsg) { errorMsg = null; // var infoBlock = FindInfoBlock(docMdf.acEditor, centerLine); if (infoBlock != null) { var att = infoBlock.GetAttributeReference(Options_General.StationFieldDef); string station = att?.TextString; if (station != null) { var slp = new SubgradeSection(docMdf, centerLine, infoBlock, station); return(slp); } } else { errorMsg = "在横断面构造时未找到横断面数据栏"; } return(null); }