concept G22PointOfInterest > ConceptWithChangeListeners { S imageMD5; Pt pt; BlurAndPosterizeSettings bnpSettings; //Set labels; S source; S labelsText; toString { ret commaCombine("Point of interest " + id, labelsText); } G22Utils g22utils() { ret main g22utils(this); } BufferedImage image() { var img = galleryImage(); ret img?.image(); } G22GalleryImage galleryImage() { ret g22utils().galleryImageForMD5(imageMD5); } bool sameImage(G22PointOfInterest otherPOI) { ret otherPOI != null && eq(imageMD5, otherPOI.imageMD5); } G22DataWrangler wrangler() { ret wranglerStealingFrom(null, null); } G22DataWrangler wranglerStealingFrom(G22PointOfInterest otherPOI, G22DataWrangler otherWrangler) { if (otherWrangler != null && !sameImage(otherPOI)) otherWrangler = null; new G22DataWrangler wrangler; wrangler.inputImage(otherWrangler != null ? otherWrangler.inputImage : image()); wrangler.stealingFrom(otherWrangler); wrangler.timings(g22utils().functionTimings()); wrangler.importSettings(bnpSettings); ret wrangler; } IImageRegion regionAroundPoint(G22DataWrangler wrangler default wrangler()) { var rm = wrangler.regionMaker(); ret rm.getRegion(rm.regionAt(pt)); } }