public StationAreaItem AddPointArea(MSTSCoord coord, double snapDist, MSTSBase tileBase) { PointF found = new PointF(0, 0); double dist = -1, closestDist = double.PositiveInfinity; int i; int closestI = -1; PointF closest; StationAreaItem newPoint = new StationAreaItem(TypeEditor.ROUTECONFIG, this); if (areaCompleted) { StationAreaItem p1; StationAreaItem p2; for (i = 0; i < stationArea.Count - 1; i++) { p1 = stationArea[i]; p2 = stationArea[i + 1]; dist = DrawUtility.FindDistanceToSegment(coord.ConvertToPointF(), new AESegment(p1.Coord.ConvertToPointF(), p2.Coord.ConvertToPointF()), out found); if (dist >= 0 && dist < snapDist && dist < closestDist) { closestDist = dist; closestI = i + 1; closest = found; } dist = -1; } p1 = stationArea[stationArea.Count - 1]; p2 = stationArea[0]; dist = DrawUtility.FindDistanceToSegment(coord.ConvertToPointF(), new AESegment(p1.Coord.ConvertToPointF(), p2.Coord.ConvertToPointF()), out closest); if (dist >= 0 && dist < snapDist && dist < closestDist) { closestDist = dist; closestI = 0; closest = found; } if (closestDist < double.PositiveInfinity) { coord = tileBase.getMstsCoord(closest); newPoint.configCoord(coord); newPoint.toggleSelected(); stationArea.Insert(closestI, newPoint); } else { return(null); } } else { // Until area complete, we only add new point at the end newPoint.configCoord(coord); newPoint.toggleSelected(); stationArea.Add(newPoint); } return(newPoint); }
public void checkForNewConnector(ORRouteConfig orRouteConfig, List <TrackSegment> segments, MSTSBase tileBase) { PointF pointIntersect; int realPosit = 0; int ii = 0; // First, we remove all un configured connectors //foreach (StationAreaItem SAWidget in stationArea) for (int cnt = 0; cnt < stationArea.Count; cnt++) { var SAWidget = stationArea[cnt]; if (SAWidget.IsInterface() && !SAWidget.getStationConnector().isConfigured()) { removeConnector(orRouteConfig, SAWidget); cnt--; } } // Next, we search for new connectors and add them List <AESegment> polySegment = getPolySegment(); for (int cntPointEdge = 0; cntPointEdge < polySegment.Count; cntPointEdge++) { List <System.Drawing.PointF> pointsIntersect = new List <System.Drawing.PointF>(); foreach (var segment in segments) { if ((segment.NodeIdx == 35 || segment.NodeIdx == 86) && cntPointEdge > 2 && (segment.SectionIdxA == 191 || segment.SectionIdxA == 40000)) { ii = 1; } pointIntersect = DrawUtility.FindIntersection(polySegment[cntPointEdge], new AESegment(segment)); if (!pointIntersect.IsEmpty) { StationAreaItem newPoint = new StationAreaItem(TypeEditor.ROUTECONFIG, this); MSTSCoord coord = tileBase.getMstsCoord(pointIntersect); newPoint.configCoord(coord); //newPoint.toggleSelected(); realPosit++; // +1 car on doit placer après le cntEdge courant List <AESegment> newPolySegment = getPolySegment(); insertConnector(newPolySegment, newPoint); newPoint.DefineAsInterface(segment); } } realPosit++; // On incrémente pour suivre le cntPointEdge } }