From 5033a958921a872d6f75c31fea82575f7d9b7557 Mon Sep 17 00:00:00 2001 From: Andy Edwards Date: Mon, 19 Jul 2021 09:40:53 -0500 Subject: [PATCH] feat: show leads in comments, import comments from walls --- .../java/org/breakout/BreakoutMainView.java | 6 +- .../java/org/breakout/ImportWallsTask.java | 160 ++++++++++-------- .../org/breakout/model/calc/CalcShot.java | 2 + .../org/breakout/model/calc/CalcStation.java | 1 + .../org/breakout/model/calc/Parsed2Calc.java | 2 + .../breakout/model/parsed/ParsedProject.java | 4 + .../breakout/model/parsed/ParsedStation.java | 1 + .../breakout/model/parsed/ProjectParser.java | 25 +++ .../breakout/model/raw/MetacaveExporter.java | 35 ++-- .../breakout/model/raw/MetacaveImporter.java | 7 +- dewalls-java | 2 +- 11 files changed, 150 insertions(+), 95 deletions(-) diff --git a/breakout-main/src/main/java/org/breakout/BreakoutMainView.java b/breakout-main/src/main/java/org/breakout/BreakoutMainView.java index 0512b8a9..5552e358 100644 --- a/breakout-main/src/main/java/org/breakout/BreakoutMainView.java +++ b/breakout-main/src/main/java/org/breakout/BreakoutMainView.java @@ -3780,11 +3780,13 @@ protected Void work() throws Exception { boolean showCheckedLeads = getProjectModel().get(ProjectModel.showCheckedLeads); setStatus("Updating lead index..."); MultiMap index = new LinkedListMultiMap<>(); - forEach(leads, lead -> { + Task.Iteratee leadHandler = lead -> { if (lead.getStation() != null && (showCheckedLeads || !lead.isDone())) { index.put(new StationKey(lead.getCave(), lead.getStation()), lead); } - }); + }; + forEach(leads, leadHandler); + forEach(parsedProject.leads, leadHandler); if (isCanceled()) { return null; } diff --git a/breakout-main/src/main/java/org/breakout/ImportWallsTask.java b/breakout-main/src/main/java/org/breakout/ImportWallsTask.java index e8bc4fc9..33721255 100644 --- a/breakout-main/src/main/java/org/breakout/ImportWallsTask.java +++ b/breakout-main/src/main/java/org/breakout/ImportWallsTask.java @@ -25,7 +25,6 @@ import org.andork.swing.async.SelfReportingTask; import org.andork.unit.Angle; import org.andork.unit.Length; -import org.andork.unit.UnitizedNumber; import org.andork.util.StringUtils; import org.andork.walls.WallsMessage; import org.andork.walls.lst.StationPosition; @@ -69,8 +68,8 @@ class ImportWallsTask extends SelfReportingTask { private String currentTripName; private MutableSurveyTrip currentTrip; private final List rowsInCurrentTrip = new ArrayList<>(); - private final Map rowsByFromStationName = new HashMap<>(); private final List fixedStations = new ArrayList<>(); + private void endCurrentTrip() { if (!rowsInCurrentTrip.isEmpty()) { ensureCurrentTrip(); @@ -90,7 +89,8 @@ private MutableSurveyTrip ensureCurrentTrip() { if (currentUnits == null) { throw new IllegalStateException("missing currentUnits"); } - currentTrip = new MutableSurveyTrip() + currentTrip = + new MutableSurveyTrip() .setName(currentTripName) .setDistanceUnit(currentUnits.getDUnit()) .setAngleUnit(currentUnits.getAUnit()) @@ -111,21 +111,30 @@ private MutableSurveyTrip ensureCurrentTrip() { return currentTrip; } - private static final List> tripDependentFields = Arrays.asList( - WallsUnits::getDUnit, - WallsUnits::getDecl, WallsUnits::getGrid, - WallsUnits::getIncd, - WallsUnits::getInca, WallsUnits::getIncab, - WallsUnits::getIncv, WallsUnits::getIncvb, - WallsUnits::getAUnit, WallsUnits::getAbUnit, - WallsUnits::getVUnit, WallsUnits::getVbUnit, - WallsUnits::isTypeabCorrected, WallsUnits::isTypevbCorrected); + private static final List> tripDependentFields = + Arrays + .asList( + WallsUnits::getDUnit, + WallsUnits::getDecl, + WallsUnits::getGrid, + WallsUnits::getIncd, + WallsUnits::getInca, + WallsUnits::getIncab, + WallsUnits::getIncv, + WallsUnits::getIncvb, + WallsUnits::getAUnit, + WallsUnits::getAbUnit, + WallsUnits::getVUnit, + WallsUnits::getVbUnit, + WallsUnits::isTypeabCorrected, + WallsUnits::isTypevbCorrected); private void setCurrentUnits(WallsUnits units) { if (currentUnits != units) { if (units == null || currentUnits == null) { endCurrentTrip(); - } else { + } + else { for (Function field : tripDependentFields) { if (!Objects.equals(field.apply(units), field.apply(currentUnits))) { endCurrentTrip(); @@ -181,16 +190,19 @@ public void parsedVector(Vector vector) { try { if (vector.units.getVectorType() == VectorType.RECTANGULAR) { vector.deriveCtFromRect(); - } else { + } + else { vector.applyHeightCorrections(this); } - } catch (SegmentParseException e) { + } + catch (SegmentParseException e) { errors.add(new ImportError(e)); throw new RuntimeException(e); } String fromStationName = vector.units.processStationName(vector.from); - MutableSurveyRow row = new MutableSurveyRow() + MutableSurveyRow row = + new MutableSurveyRow() .setFromStation(fromStationName) .setToStation(vector.units.processStationName(vector.to)) .setDistance(Objects.toString(vector.distance, null)) @@ -205,7 +217,6 @@ public void parsedVector(Vector vector) { .setComment(vector.comment); rowsInCurrentTrip.add(row); rows.add(row); - rowsByFromStationName.put(fromStationName, row); } @Override @@ -216,6 +227,9 @@ public void parsedDate(Date date) { @Override public void parsedNote(String station, String parsedNote) { + MutableSurveyRow row = new MutableSurveyRow().setFromStation(station).setComment(parsedNote); + rowsInCurrentTrip.add(row); + rows.add(row); awaitingTripNameComment = false; } @@ -242,9 +256,11 @@ public ImportWallsTask(BreakoutMainView mainView, Iterable wallsFiles) { String s = p.toString().toLowerCase(); if (s.endsWith(".srv")) { surveyFiles.put(p, null); - } else if (s.endsWith(".lst")) { + } + else if (s.endsWith(".lst")) { stationReportFiles.add(p); - } else if (s.endsWith(".wpj")) { + } + else if (s.endsWith(".wpj")) { projFiles.add(p); } } @@ -256,15 +272,18 @@ public ImportWallsTask(BreakoutMainView mainView, Iterable wallsFiles) { private void putSurveyFiles(WallsProjectEntry entry) { if (entry.isDetatched()) { - wallsVisitor.message(new WallsMessage( - "warning", - "Entry is detached and won't be imported: " + StringUtils.join(" -> ", entry.titlePath()), - entry.statusSegment())); + wallsVisitor + .message( + new WallsMessage( + "warning", + "Entry is detached and won't be imported: " + StringUtils.join(" -> ", entry.titlePath()), + entry.statusSegment())); return; } if (entry.isSurvey()) { surveyFiles.put(entry.absolutePath(), entry); - } else if (entry instanceof WallsProjectBook) { + } + else if (entry instanceof WallsProjectBook) { ((WallsProjectBook) entry).children().stream().forEach(this::putSurveyFiles); } } @@ -279,26 +298,35 @@ protected Void workDuringDialog() throws Exception { parseSurveyFiles(); parseStationReportFiles(); -// applyFixedStationPositions(); + // applyFixedStationPositions(); - } catch (Exception ex) { + } + catch (Exception ex) { if (ex instanceof SegmentParseException) { errors.add(new ImportError((SegmentParseException) ex)); - } else { - errors.add(new ImportError( - Severity.ERROR, "Unexpected error: " + ex.getLocalizedMessage(), - new Segment("", currentFile, 0, 0))); + } + else { + errors + .add( + new ImportError( + Severity.ERROR, + "Unexpected error: " + ex.getLocalizedMessage(), + new Segment("", currentFile, 0, 0))); } logger.log(Level.SEVERE, "Failed to import walls data", ex); } try { newModel = new SurveyTableModel(ArrayLists.map(rows, row -> row.toImmutable())); - } catch (Exception ex) { + } + catch (Exception ex) { newModel = new SurveyTableModel(); - errors.add(new ImportError( - Severity.ERROR, "Unexpected error: " + ex.getLocalizedMessage(), - new Segment("", currentFile, 0, 0))); + errors + .add( + new ImportError( + Severity.ERROR, + "Unexpected error: " + ex.getLocalizedMessage(), + new Segment("", currentFile, 0, 0))); logger.log(Level.SEVERE, "Failed to import walls data", ex); } OnEDT.onEDT(() -> { @@ -322,7 +350,8 @@ protected Void workDuringDialog() throws Exception { if (doImport) { mainView.addSurveyRowsFrom(newModel); logger.info(() -> "imported " + newModel.getRowCount() + " shots from walls data"); - } else { + } + else { logger.info("user canceled walls import"); } }); @@ -367,7 +396,8 @@ private void parseSurveyFiles() throws SegmentParseException, IOException { if (surveyEntry != null) { setCurrentTripName(surveyEntry.absolutePath().getFileName().toString()); parser.parseSurveyEntry(surveyEntry); - } else { + } + else { setCurrentTripName(file.getFileName().toString()); parser.parseFile(file.toFile()); } @@ -391,48 +421,32 @@ private void parseStationReportFiles() throws IOException { } WallsStationReport report = parser.getReport(); - SurveyTrip trip = new MutableSurveyTrip() - .setDatum(report.datum) - .setUtmZone(String.valueOf(report.utmZone)) - .setName(null) - .setDistanceUnit(Length.meters) - .setAngleUnit(Angle.degrees) - .setOverrideFrontAzimuthUnit(Angle.degrees) - .setOverrideBackAzimuthUnit(Angle.degrees) - .setOverrideFrontInclinationUnit(Angle.degrees) - .setOverrideBackInclinationUnit(Angle.degrees) - .setBackAzimuthsCorrected(true) - .setBackInclinationsCorrected(true) - .toImmutable(); - + SurveyTrip trip = + new MutableSurveyTrip() + .setDatum(report.datum) + .setUtmZone(String.valueOf(report.utmZone)) + .setName(null) + .setDistanceUnit(Length.meters) + .setAngleUnit(Angle.degrees) + .setOverrideFrontAzimuthUnit(Angle.degrees) + .setOverrideBackAzimuthUnit(Angle.degrees) + .setOverrideFrontInclinationUnit(Angle.degrees) + .setOverrideBackInclinationUnit(Angle.degrees) + .setBackAzimuthsCorrected(true) + .setBackInclinationsCorrected(true) + .toImmutable(); + for (StationPosition station : report.stationPositions) { MutableSurveyRow row = new MutableSurveyRow(); row.setTrip(trip); row.setFromStation(station.getNameWithPrefix()); - if (Double.isFinite(station.north)) row.setNorthing((report.utmSouth - ? 1000000 - station.north - : station.north) + " m"); - if (Double.isFinite(station.east)) row.setEasting(station.east + " m"); - if (Double.isFinite(station.up)) row.setElevation(station.up + " m"); + if (Double.isFinite(station.north)) + row.setNorthing((report.utmSouth ? 1000000 - station.north : station.north) + " m"); + if (Double.isFinite(station.east)) + row.setEasting(station.east + " m"); + if (Double.isFinite(station.up)) + row.setElevation(station.up + " m"); rows.add(row); } } - - private void applyFixedStationPositions() { - for (FixedStation station : fixedStations) { - if (!UnitizedNumber.isFinite(station.north) && - !UnitizedNumber.isFinite(station.east) && - !UnitizedNumber.isFinite(station.elevation)) { - continue; - } - String stationName = station.units.processStationName(station.name); - MutableSurveyRow row = rowsByFromStationName.get(stationName); - if (row == null) { - continue; - } - if (station.north != null) row.setNorthing(station.north.toString()); - if (station.east != null) row.setEasting(station.east.toString()); - if (station.elevation != null) row.setElevation(station.elevation.toString()); - } - } } diff --git a/breakout-main/src/main/java/org/breakout/model/calc/CalcShot.java b/breakout-main/src/main/java/org/breakout/model/calc/CalcShot.java index 0ceb9d5f..bc051868 100644 --- a/breakout-main/src/main/java/org/breakout/model/calc/CalcShot.java +++ b/breakout-main/src/main/java/org/breakout/model/calc/CalcShot.java @@ -24,6 +24,8 @@ public class CalcShot { public CalcCrossSection fromCrossSection; public CalcCrossSection toCrossSection; + public String comment; + public Collection splayTriangles; public Iterable vertices() { diff --git a/breakout-main/src/main/java/org/breakout/model/calc/CalcStation.java b/breakout-main/src/main/java/org/breakout/model/calc/CalcStation.java index 7a8cde22..4f7f531e 100644 --- a/breakout-main/src/main/java/org/breakout/model/calc/CalcStation.java +++ b/breakout-main/src/main/java/org/breakout/model/calc/CalcStation.java @@ -8,6 +8,7 @@ public class CalcStation { public String name; public String cave; + public String comment; public float date; private CalcShot originatingShot; diff --git a/breakout-main/src/main/java/org/breakout/model/calc/Parsed2Calc.java b/breakout-main/src/main/java/org/breakout/model/calc/Parsed2Calc.java index e262656a..1d15c3a3 100644 --- a/breakout-main/src/main/java/org/breakout/model/calc/Parsed2Calc.java +++ b/breakout-main/src/main/java/org/breakout/model/calc/Parsed2Calc.java @@ -483,6 +483,7 @@ public void link(ParsedStation parsedFromStation, ParsedShot parsed, ParsedStati fromStation.name = fromKey.station; fromStation.cave = fromKey.cave; fromStation.date = shot.date; + fromStation.comment = parsedFromStation.comment; project.stations.put(fromKey, fromStation); } else { @@ -498,6 +499,7 @@ public void link(ParsedStation parsedFromStation, ParsedShot parsed, ParsedStati toStation.name = toKey.station; toStation.cave = toKey.cave; toStation.date = shot.date; + toStation.comment = parsedToStation.comment; project.stations.put(toKey, toStation); } else { diff --git a/breakout-main/src/main/java/org/breakout/model/parsed/ParsedProject.java b/breakout-main/src/main/java/org/breakout/model/parsed/ParsedProject.java index c546aa8e..47abfd33 100644 --- a/breakout-main/src/main/java/org/breakout/model/parsed/ParsedProject.java +++ b/breakout-main/src/main/java/org/breakout/model/parsed/ParsedProject.java @@ -1,11 +1,15 @@ package org.breakout.model.parsed; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.breakout.model.ShotKey; +import org.breakout.model.raw.SurveyLead; public class ParsedProject { public final Map caves = new HashMap<>(); public final Map shots = new HashMap<>(); + public final List leads = new ArrayList<>(); } diff --git a/breakout-main/src/main/java/org/breakout/model/parsed/ParsedStation.java b/breakout-main/src/main/java/org/breakout/model/parsed/ParsedStation.java index 9e301f2d..742ae801 100644 --- a/breakout-main/src/main/java/org/breakout/model/parsed/ParsedStation.java +++ b/breakout-main/src/main/java/org/breakout/model/parsed/ParsedStation.java @@ -16,6 +16,7 @@ public class ParsedStation { public ParsedCrossSection crossSection; public List splays; public List leads; + public String comment; private BitSet flags; private static final int IS_ENTRANCE = 0; diff --git a/breakout-main/src/main/java/org/breakout/model/parsed/ProjectParser.java b/breakout-main/src/main/java/org/breakout/model/parsed/ProjectParser.java index 9caa5109..1e9f7170 100644 --- a/breakout-main/src/main/java/org/breakout/model/parsed/ProjectParser.java +++ b/breakout-main/src/main/java/org/breakout/model/parsed/ProjectParser.java @@ -7,6 +7,7 @@ import java.util.IdentityHashMap; import java.util.Objects; import java.util.function.BiFunction; +import java.util.regex.Pattern; import org.andork.datescraper.DateMatcher; import org.andork.datescraper.DatePatterns; @@ -19,6 +20,8 @@ import org.breakout.model.ShotKey; import org.breakout.model.StationKey; import org.breakout.model.parsed.ParseMessage.Severity; +import org.breakout.model.raw.MutableSurveyLead; +import org.breakout.model.raw.SurveyLead; import org.breakout.model.raw.SurveyRow; import org.breakout.model.raw.SurveyTrip; @@ -294,10 +297,14 @@ public String getString(ParsedField field) { return field != null && !isNullOrEmpty(field.value) ? field.value : null; } + private static Pattern leadPattern = + Pattern.compile("\\b(leads?|go(es|ing)?|continues?|dig)\\b", Pattern.CASE_INSENSITIVE); + public ShotKey parse(SurveyRow raw) { SurveyTrip trip = raw.getTrip(); ParsedTrip parsedTrip = parse(trip); ParsedCave cave = ensureCave(trip.getCave()); + String comment = raw.getComment(); ParsedStation fromStation = parsedTrip.stations.isEmpty() ? null : parsedTrip.stations.get(parsedTrip.stations.size() - 1); @@ -328,6 +335,23 @@ public ShotKey parse(SurveyRow raw) { if (fromStation.crossSection == null) { fromStation.crossSection = parseCrossSection(raw, trip); } + + if (toStation == null) { + fromStation.comment = comment; + } + } + + if (comment != null && leadPattern.matcher(comment).find()) { + ParsedStation leadStation = fromStation != null ? fromStation : toStation; + if (leadStation != null) { + SurveyLead lead = + new MutableSurveyLead() + .setCave(leadStation.key().cave) + .setStation(leadStation.key().station) + .setDescription(comment) + .toImmutable(); + project.leads.add(lead); + } } ParsedShotMeasurement frontsights = parseFrontsights(raw, trip); @@ -351,6 +375,7 @@ public ShotKey parse(SurveyRow raw) { fromStation.splays.add(splay); } else if (fromStation != null && toStation != null) { + toStation.comment = comment; ParsedShot shot = new ParsedShot(); shot.fromStation = fromStation; shot.toStation = toStation; diff --git a/breakout-main/src/main/java/org/breakout/model/raw/MetacaveExporter.java b/breakout-main/src/main/java/org/breakout/model/raw/MetacaveExporter.java index 91dfadba..cc4fc1fd 100644 --- a/breakout-main/src/main/java/org/breakout/model/raw/MetacaveExporter.java +++ b/breakout-main/src/main/java/org/breakout/model/raw/MetacaveExporter.java @@ -191,6 +191,7 @@ else if (survey.size() != 0) { addProperty(fromStation, "station", row.getFromStation()); survey.add(fromStation); } + String comment = row.getComment(); if (truthy(row.getToStation())) { // insert shot @@ -206,6 +207,9 @@ else if (survey.size() != 0) { if (row.isExcludeFromPlotting()) { shot.addProperty("excludeFromPlot", true); } + if (comment != null) { + shot.addProperty("comment", comment); + } survey.add(shot); // insert to station @@ -214,15 +218,20 @@ else if (survey.size() != 0) { addProperty(toStation, "station", row.getToStation()); survey.add(toStation); } - else if (truthy( - or( - row.getDistance(), - row.getFrontAzimuth(), - row.getFrontInclination(), - row.getBackAzimuth(), - row.getBackInclination()))) { - measurements = new JsonArray(); - fromStation.add("splays", measurements); + else { + if (comment != null) { + addProperty(fromStation, "comment", comment); + } + if (truthy( + or( + row.getDistance(), + row.getFrontAzimuth(), + row.getFrontInclination(), + row.getBackAzimuth(), + row.getBackInclination()))) { + measurements = new JsonArray(); + fromStation.add("splays", measurements); + } } } // add frontsight measurements @@ -373,14 +382,6 @@ public void exportLeads(List leads) { } } - private static JsonArray convertMeasurementString(String str) { - JsonArray result = new JsonArray(); - for (String s : str.split("\\s+")) { - result.add(s); - } - return result; - } - public JsonObject export(SurveyLead lead) { JsonObject converted = new JsonObject(); converted.addProperty("station", lead.getStation()); diff --git a/breakout-main/src/main/java/org/breakout/model/raw/MetacaveImporter.java b/breakout-main/src/main/java/org/breakout/model/raw/MetacaveImporter.java index a28d2a0c..e4098625 100644 --- a/breakout-main/src/main/java/org/breakout/model/raw/MetacaveImporter.java +++ b/breakout-main/src/main/java/org/breakout/model/raw/MetacaveImporter.java @@ -290,12 +290,16 @@ public void importTripSurvey(SurveyTrip trip, JsonArray survey) { if (shot != null && shot.size() > 0 && toStation != null) { row.setOverrideToCave(intern(getAsString(toStation, "cave"))); row.setToStation(intern(getAsString(toStation, "station"))); + row.setComment(getAsString(shot, "comment")); if (shot.has("surveyNotesFile")) { row .setOverrideAttachedFiles( PersistentVector.create(intern(getAsString(shot, "surveyNotesFile")))); } } + else { + row.setComment(getAsString(fromStation, "comment")); + } rows.set(rowIndex, row); } return row; @@ -311,8 +315,7 @@ public void importTripSurvey(SurveyTrip trip, JsonArray survey) { } } - if (fromStation != null - && fromStation.has("station") + if (fromStation.has("station") && shot != null && shot.size() > 0 && toStation != null diff --git a/dewalls-java b/dewalls-java index 8220d6e8..daa78e83 160000 --- a/dewalls-java +++ b/dewalls-java @@ -1 +1 @@ -Subproject commit 8220d6e83a776e4328885825af758245b070ff88 +Subproject commit daa78e8383b675891185ccef91bbb2bea6b3a75a