| | |
| | | import dikuai.Gecaokuanjisuan; |
| | | import dikuai.Gecaoanquanjuli; |
| | | import bianjie.Bianjieyouhuatoxy; |
| | | import lujing.Lunjingguihua; |
| | | |
| | | import lujing.Qufenxingzhuang; |
| | | import lujing.AoxinglujingNoObstacle; |
| | | import lujing.YixinglujingNoObstacle; |
| | |
| | | YixinglujingNoObstacle.planPath(boundaryCoords, widthMetersStr, safetyDistanceMetersStr); |
| | | plannedPath = formatYixingPathSegments(segments); |
| | | } else { |
| | | // 无法判断地块类型,使用默认方法作为后备 |
| | | JOptionPane.showMessageDialog(this, "无法判断地块类型,使用默认路径生成方法", |
| | | // 无法判断地块类型 |
| | | JOptionPane.showMessageDialog(this, "无法判断地块类型,无法生成路径", |
| | | "提示", JOptionPane.WARNING_MESSAGE); |
| | | String plannerMode = resolvePlannerMode(patternDisplay); |
| | | plannedPath = Lunjingguihua.generatePathFromStrings( |
| | | boundaryCoords, |
| | | obstacleCoords != null ? obstacleCoords : "", |
| | | widthMetersStr, |
| | | safetyDistanceMetersStr, |
| | | plannerMode |
| | | ); |
| | | plannedPath = ""; |
| | | } |
| | | |
| | | if (!isMeaningfulValue(plannedPath)) { |
| | |
| | | return ""; |
| | | } |
| | | StringBuilder sb = new StringBuilder(); |
| | | AoxinglujingNoObstacle.Point last = null; |
| | | for (AoxinglujingNoObstacle.PathSegment segment : segments) { |
| | | // 只添加割草工作段,跳过过渡段 |
| | | if (segment.isMowing) { |
| | | // 如果起点与上一个终点不同,添加起点 |
| | | if (last == null || !equalsAoxingPoint(last, segment.start)) { |
| | | appendAoxingPoint(sb, segment.start); |
| | | } |
| | | // 添加终点 |
| | | appendAoxingPoint(sb, segment.end); |
| | | last = segment.end; |
| | | AoxinglujingNoObstacle.Point lastEnd = null; |
| | | boolean firstWritten = false; |
| | | for (AoxinglujingNoObstacle.PathSegment s : segments) { |
| | | if (!firstWritten) { |
| | | appendAoxingPoint(sb, s.start); |
| | | firstWritten = true; |
| | | lastEnd = s.start; |
| | | } else if (lastEnd == null || !equalsAoxingPoint(lastEnd, s.start)) { |
| | | appendAoxingPoint(sb, s.start); |
| | | lastEnd = s.start; |
| | | } |
| | | appendAoxingPointWithType(sb, s.end, s.isMowing); |
| | | lastEnd = s.end; |
| | | } |
| | | return sb.toString(); |
| | | } |
| | |
| | | return ""; |
| | | } |
| | | StringBuilder sb = new StringBuilder(); |
| | | YixinglujingNoObstacle.Point last = null; |
| | | for (YixinglujingNoObstacle.PathSegment segment : segments) { |
| | | // 只添加割草工作段,跳过过渡段 |
| | | if (segment.isMowing) { |
| | | // 如果起点与上一个终点不同,添加起点 |
| | | if (last == null || !equalsYixingPoint(last, segment.start)) { |
| | | appendYixingPoint(sb, segment.start); |
| | | } |
| | | // 添加终点 |
| | | appendYixingPoint(sb, segment.end); |
| | | last = segment.end; |
| | | YixinglujingNoObstacle.Point lastEnd = null; |
| | | boolean firstWritten = false; |
| | | for (YixinglujingNoObstacle.PathSegment s : segments) { |
| | | if (!firstWritten) { |
| | | appendYixingPoint(sb, s.start); |
| | | firstWritten = true; |
| | | lastEnd = s.start; |
| | | } else if (lastEnd == null || !equalsYixingPoint(lastEnd, s.start)) { |
| | | appendYixingPoint(sb, s.start); |
| | | lastEnd = s.start; |
| | | } |
| | | appendYixingPointWithType(sb, s.end, s.isMowing); |
| | | lastEnd = s.end; |
| | | } |
| | | return sb.toString(); |
| | | } |
| | |
| | | * 添加 AoxinglujingNoObstacle.Point 到字符串构建器 |
| | | */ |
| | | private void appendAoxingPoint(StringBuilder sb, AoxinglujingNoObstacle.Point point) { |
| | | private void appendAoxingPointWithType(StringBuilder sb, AoxinglujingNoObstacle.Point point, boolean isMowing) { |
| | | if (sb.length() > 0) { |
| | | sb.append(";"); |
| | | } |
| | | sb.append(String.format(java.util.Locale.US, "%.2f,%.2f,%s", point.x, point.y, isMowing ? "M" : "T")); |
| | | } |
| | | if (sb.length() > 0) { |
| | | sb.append(";"); |
| | | } |
| | |
| | | * 添加 YixinglujingNoObstacle.Point 到字符串构建器 |
| | | */ |
| | | private void appendYixingPoint(StringBuilder sb, YixinglujingNoObstacle.Point point) { |
| | | private void appendYixingPointWithType(StringBuilder sb, YixinglujingNoObstacle.Point point, boolean isMowing) { |
| | | if (sb.length() > 0) { |
| | | sb.append(";"); |
| | | } |
| | | sb.append(String.format(java.util.Locale.US, "%.2f,%.2f,%s", point.x, point.y, isMowing ? "M" : "T")); |
| | | } |
| | | if (sb.length() > 0) { |
| | | sb.append(";"); |
| | | } |
| | |
| | | |
| | | private String generateNewLandNumber() { |
| | | Map<String, Dikuai> existing = Dikuai.getAllDikuai(); |
| | | |
| | | // 获取割草机编号 |
| | | String mowerId = Setsys.getPropertyValue("mowerId"); |
| | | |
| | | // 如果有割草机编号,使用 编号+两位自增数字 格式 |
| | | if (mowerId != null && !mowerId.trim().isEmpty() && !"-1".equals(mowerId)) { |
| | | int attempt = 1; |
| | | while (true) { |
| | | // 格式化为两位数字,如 01, 02, ... |
| | | String suffix = String.format("%02d", attempt); |
| | | String candidate = mowerId + suffix; |
| | | if (!existing.containsKey(candidate)) { |
| | | return candidate; |
| | | } |
| | | attempt++; |
| | | } |
| | | } |
| | | |
| | | // 如果没有割草机编号,回退到默认逻辑 |
| | | int attempt = 1; |
| | | while (true) { |
| | | String candidate = "LAND" + attempt; |