/// <summary> /// /// </summary> /// <param name="g"></param> /// <param name="canvasWidth">画布宽度</param> /// <param name="centerMileage">中心里程</param> /// <param name="radiusMileage">里程半径</param> private void draw2DProjects(Graphics g, float canvasWidth, double centerMileage, double radiusMileage) { // 如果视点距离过近,视野半径只有20米,不再绘制 if (radiusMileage < 10) { return; } g.DrawString("济青高铁", defaultFont, Brushes.Red, new PointF(canvasWidth - 100, Cap1StartY)); //float titleHeight = 30; float scaleX; //float width = panel1.Size.Width; Matrix m = getTransM((float)centerMileage, (float)radiusMileage, canvasWidth, out scaleX, 50); //Matrix im = getInvTransM((float)centerMileage, (float)radiusMileage, canvasWidth, 50); // 左右50个像素空白 PointF[] sd = { new PointF(50, MileageAxisStartY), new PointF(canvasWidth / 2, MileageAxisStartY), new PointF(canvasWidth - 50, MileageAxisStartY) }; // 窗口 double[] sdMileage = { centerMileage - radiusMileage, centerMileage, centerMileage + radiusMileage }; //im.TransformPoints(sdMileage); string dkcode; double dkm; RectangleF areaf; //绘制里程坐标 g.DrawLine(roundPen, sd[0], sd[1]); g.DrawLine(roundPen, sd[1], sd[2]); string str; // 写里程坐标 for (int i = 0; i < 3; i++) { mRWScene.mMainPath.getDKCodebyPathMileage(sdMileage[i], out dkcode, out dkm); str = CRailwayLineList.CombiDKCode(dkcode, dkm); if (i == 1) { str = "当前里程" + str; if (string.IsNullOrEmpty(mDesc)) { areaf = new RectangleF(sd[i].X - 60, MileageAxisStartY + 5, 250, 20); } else { str += "。 下一目标:" + mDesc; areaf = new RectangleF(sd[i].X - 60, MileageAxisStartY + 5, 520, 20); } g.DrawString(str, defaultFont, Brushes.Black, areaf); } else { areaf = new RectangleF(sd[i].X - 40, MileageAxisStartY + 5, 80, 20); g.DrawString(str, defaultFont, Brushes.Black, areaf, centerFormat); } } //myGraphics.Transform = m; foreach (CRailwayTunnel t in mRWScene.mTunnelList) { draw_TunnelFX(g, t, 60, canvasWidth, m, scaleX); } foreach (CRailwayRoad r in mRWScene.mRoadList) { draw_RoadFX(g, r, 60, canvasWidth, m, scaleX); } foreach (CRailwayBridge b in mRWScene.mBridgeList) { draw_BridgeFX(g, b, 60, canvasWidth, m, scaleX); } foreach (CContBeam cb in mRWScene.mContBeamList) { draw_ContBeam(g, cb, 60, canvasWidth, m, scaleX); } foreach (CHotSpot hs in mRWScene.mConsSpotList) { draw_ConsSpot(g, hs, 60, canvasWidth, m, scaleX); } //draw_TunnelFX(myGraphics, ls, ld, width, m, 5000, -1000, 100, scaleX); //draw_TunnelFX(myGraphics, ls, ld, width, m, 5000, 1500, 10, scaleX); //draw_TunnelFX(myGraphics, ls, ld, width, m, 7500, -1000, 100, scaleX); //PointF[] sd = { new PointF(4000, 100), new PointF(6000, 100) }; // 窗口 //m.TransformPoints(sd); //Console.WriteLine(sd[0]); //Console.WriteLine(sd[1]); //im.TransformPoints(sd); //Console.WriteLine(sd[0]); //Console.WriteLine(sd[1]); //float scale = wh / 2 / vw; //Matrix rm = new Matrix(); //rm.Scale(2, 1); //rm.Translate(-50, -150); //rm.TransformPoints(sd); }
private void Sgworld_OnObjectAction(string ObjectID, IAction66 Action) { double d; if (Action.Code == ActionCode.AC_WAYPOINT_REACHED) { string strObjID = sgworld.ProjectTree.GetItemName(ObjectID); if (strObjID.Equals("TrainObj0")) { #if DEBUG Console.WriteLine("计数:" + mTrainWayPointCount + " of " + mTrainWayPointTotal); #endif mTrainWayPointCount = Math.Min(mTrainWayPointCount, mTrainWayPointTotal - 1); if (mTrainWayPointCount % 15 == 14) { RandomFollow(); } //double dis = CoordinateConverter.getUTMDistance(mDynamicTrain[0].Position.X, mDynamicTrain[0].Position.Y, mNavigationList[mNavNextIndex].Longitude, mNavigationList[mNavNextIndex].Latitude); //根据GPS确定里程, mSceneData.mMainPath.getPathMileagebyGPS(rx[mTrainWayPointCount], ry[mTrainWayPointCount], out mMainMileage, out d); //mDynamicTrain[0].Waypoints[mTrainWayPointTotal- mTrainWayPointCount] //mCurrentMileage = rm[mTrainWayPointCount]; mDistoNext = rm[mTrainWayPointTotal - 1] - rm[mTrainWayPointCount]; //#if DEBUG // if (Math.Abs(mDistoNext - dis) > 100) // Console.WriteLine("Something wrong in " + mTrainWayPointCount + " dis " + mDistoNext + " vs " + dis); //#endif string dkcode; double dkm; mSceneData.mMainPath.getDKCodebyPathMileage(mMainMileage, out dkcode, out dkm); string str = mNavigationList[mNavNextIndex].ObjectRef.ToString(); // 更新显示面板 panelInfo.mtotalProj = mNavigationList.Count; panelInfo.mcurrentProj = mNavNextIndex; panelInfo.mdkCode = CRailwayLineList.CombiDKCode(dkcode, dkm); panelInfo.mdistance = Math.Round(mDistoNext, 2); panelInfo.mnextProj = str; panelInfo.mconsLog = mSceneData.GetStrConsByGPS(rx[mTrainWayPointCount], ry[mTrainWayPointCount], 5000); panelInfo.updatePanel(); // 更新2D进度 panel2D.update2DPanel(mMainMileage, 500); if (mDistoNext < 500) // 可能 { ReachOnePlace(); //double dis = CoordinateConverter.getUTMDistance(mDynamicTrain[0].Position.X, mDynamicTrain[0].Position.Y, mNavigationList[mNavIndex + 1].Longitude, mNavigationList[mNavIndex + 1].Latitude); //#if DEBUG // Console.WriteLine("计数:" + mTrainWayPointCount + " of " + mTrainWayPointTotal + "count dis "+ mDistoNext + "\t gis dis" + dis); //#endif // if (mTrainWayPointTotal - mTrainWayPointCount <= 1) // { //#if DEBUG // ModelInfo.Helper.LogHelper.WriteLog(mNavIndex + ":train到达 " + mNavigationList[mNavIndex].ObjectRef.ToString() ); //#endif // //for (int j = 0; j < mDynamicTrain.Length; j++) // //{ // // mDynamicTrain[j].Pause = true; // //} // //mDistoNext = 0; // } } mTrainWayPointCount++; } else if (strObjID.Equals("VirtualObj")) { mVirtualWayPointCount--; if (isOnOneWay && mVirtualOnly) { double dis = CoordinateConverter.getUTMDistance(mVirtualObj.Position.X, mVirtualObj.Position.Y, mNavigationList[mNavNextIndex].Longitude, mNavigationList[mNavNextIndex].Latitude); if (dis < 100 || mVirtualWayPointCount == 0) { #if DEBUG ModelInfo.Helper.LogHelper.WriteLog(mNavIndex + "virtual到达 " + mNavigationList[mNavNextIndex].ObjectRef.ToString() + " 距离为 " + dis); #endif //sgworld.OnObjectAction -= Sgworld_OnObjectAction; ReachOnePlace(); } } } } }