Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

211
LINES

< > BotCompany Repo | #1035943 // G22ShapeCollectorPanel - latest shape collector version

JavaX fragment (include) [tags: use-pretranspiled]

Transpiled version (70256L) is out of date.

1  
// TODO: call fullyConfigured in normal constructor
2  
// (so we don't end up erroneously making EMPTY G22ShapeCollectorPanel's)
3  
sclass G22ShapeCollectorPanel > MetaWithChangeListeners is Swingable {
4  
  settable G22Utils g22utils;
5  
  settable bool qoiAlways;
6  
  settableWithVar S imageSourceDesc = "Left screen half";
7  
  
8  
  AnalyzedImage completedImage;
9  
  
10  
  // seconds per gradient color cycle
11  
  settable double gradientCycleTime = 2.0;
12  
  
13  
  settable int maxDrift = 100;
14  
  new MouseInComponentMonitor mouseMonitor;
15  
  PicturesByMD5 pics;
16  
  new JMaxSpeedAnimation anim;
17  
  JCheckBox cbOn = jcheckbox("On", true);
18  
  //JCheckBox cbFreezeOnHover = jcheckbox("Freeze on hover", true);
19  
  JCheckBox cbAnimateGradients = jcheckbox("Animate gradients", false);
20  
  JSpinner colorsSpinner = jListSpinner(itemPlus(2, dropFirst(firstNCubes(16))));
21  
  JSpinner blurSpinner = jSpinner(0, 0, 99);
22  
  JLabel lblStats = rightAlignedLabel();
23  
  JSlider driftSlider;
24  
  JCheckBox cbAntiDrift = jcheckbox("Antidrift", true);
25  
  
26  
  class AnalyzedImage extends G22DataWrangler {
27  
    G22DataWrangler wrangler() { this; }
28  
    
29  
    simplyCached byte[] qoiData() {
30  
      ret g22utils.timeFunction("QOI compress",
31  
        -> toQOI(inputImage()));
32  
    }
33  
  
34  
    simplyCached S qoiMD5() {
35  
      ret md5(qoiData());
36  
    }
37  
38  
    S saveImage() {
39  
      pics.put(qoiMD5(), qoiData());
40  
      ret qoiMD5();
41  
    }
42  
  }
43  
  
44  
  void init {
45  
    if (pics != null) ret;
46  
    pics = g22utils.picturesByMD5();
47  
    
48  
    driftSlider = jSlider(-maxDrift, maxDrift, 0);
49  
    componentPopupMenuItem(driftSlider,
50  
      "Reset", r { driftSlider.setValue(0) });
51  
    
52  
    //looselyBindLiveValueToCheckBox(g22utils.liveProjectVar("Freeze on hover"), cbFreezeOnHover);
53  
    looselyBindLiveValueToCheckBox(g22utils.liveProjectVar("Animate gradients"), cbAnimateGradients);
54  
    looselyBindLiveValueToSpinner(g22utils.liveProjectVar("colors"), colorsSpinner);
55  
    looselyBindLiveValueToSpinner(g22utils.liveProjectVar("blur"), blurSpinner);
56  
    looselyBindLiveValueToSlider(g22utils.liveProjectVar("brightnessDrift"), driftSlider);
57  
    looselyBindLiveValueToCheckBox(g22utils.liveProjectVar("Antidrift"), cbAntiDrift);
58  
  }
59  
  
60  
  swappable BufferedImage nextInputImage() {
61  
    ret shootLeftScreenHalf();
62  
  }
63  
  
64  
  selfType imageSource(IF0<BufferedImage> imageSource, S imageSourceDesc default str(imageSource)) {
65  
    nextInputImage = imageSource;
66  
    imageSourceDesc = imageSourceDesc;
67  
    this;
68  
  }
69  
  
70  
  bool running() {
71  
    ret isChecked(cbOn)
72  
      /*&& !(isChecked(cbFreezeOnHover) && mouseMonitor!)*/;
73  
  }
74  
  
75  
  BufferedImage nextFrame() {
76  
    if (!running()) {
77  
      sleepSeconds(0.1);
78  
      null;
79  
    }
80  
81  
    var inputImage = nextInputImage();
82  
    new AnalyzedImage ai;
83  
84  
    var wrangler = ai.wrangler();
85  
    wrangler.timings(g22utils.functionTimings());
86  
    wrangler.inputImage(inputImage);
87  
    wrangler.colors(intFromSpinner(colorsSpinner));
88  
    wrangler.blur(intFromSpinner(blurSpinner));
89  
    
90  
    // drift is between -1 and 1
91  
    var drift = (float) (intFromSlider(driftSlider)/100.0);
92  
    if (isChecked(cbAnimateGradients))
93  
      drift = (float) transformFromZeroToOne(-1, 1, frac(sysSeconds()/gradientCycleTime));
94  
    
95  
    wrangler.drift(drift);
96  
    wrangler.antiDrift(isChecked(cbAntiDrift) || isChecked(cbAnimateGradients) ? -drift : 0);
97  
98  
    wrangler.stepUntilStage(wrangler.regionsStage);
99  
    g22utils.setTransientProjectVar("Last wrangler", wrangler);
100  
    
101  
    L qoiInfo = !qoiAlways ? null : ll(
102  
      "QOI: " + str_toK(l(ai.qoiData())),
103  
      "Hash: " + takeFirst(3, ai.qoiMD5()),
104  
      "Saved: " + yesNo_short(pics.has(ai.qoiMD5())));
105  
    
106  
    setText(lblStats, commaCombine(
107  
      anim.fps(),
108  
      nRegions(wrangler.regions),
109  
      qoiInfo,
110  
      nImages(pics.imageCount()) + " saved",
111  
      n2(countConcepts(g22utils.concepts(), G22PointOfInterest), "POI")
112  
    );
113  
  
114  
    completedImage = ai;
115  
    g22utils.setTransientProjectVar("Last analyzed image", ai);
116  
    ret toBufferedImage(wrangler.posterizedImage);
117  
  }
118  
  
119  
  swappable JComponent watchingUI() {
120  
    ret liveValueLabel(varImageSourceDesc());
121  
  }
122  
  
123  
  cachedVisualize {
124  
    init();
125  
    
126  
    anim.renderFrame(l0 nextFrame);
127  
128  
    mouseMonitor.init(anim.imageSurface());
129  
    
130  
    // UI main layout
131  
132  
    ret northAndCenterWithMargins(
133  
      northAndCenterWithMargin(
134  
        jcenteredline(withLabel("Watching:", watchingUI())),
135  
        jCenteredSection(" Visual Controls ", 
136  
          jHigherScrollPane_borderless_center(withSideMargin(
137  
            jcenteredline(
138  
              cbOn, //cbFreezeOnHover,
139  
              jCenteredSection("Colors", colorsSpinner),
140  
              jCenteredSection("Blur", blurSpinner),
141  
              cbAnimateGradients,
142  
              jCenteredSection("Drift", driftSlider),
143  
              cbAntiDrift,
144  
          )
145  
        )))),
146  
      centerAndSouthWithMargin(
147  
        jCenteredSection(" What I See ", anim),
148  
        centerAndEastWithMargin(lblStats,
149  
          jThreadedButton("Save image", -> {
150  
            completedImage?.saveImage();
151  
          })))
152  
    );
153  
  }
154  
  
155  
  ImageSurface imageSurface() {
156  
    ret anim.imageSurface();
157  
  }
158  
  
159  
  static G22ShapeCollectorPanel fullyConfigured(G22Utils g22utils, G22ShapeCollectorPanel collector default new) {
160  
    ret (G22ShapeCollectorPanel) g22utils.leftArrowWithVars([[
161  
      collector g22utils < g22utils
162  
      collector visualize
163  
      is <- collector imageSurface
164  
      hoveringOverRegion <- new Var<IImageRegion>
165  
      is addOverlay < G2Drawable g -> {
166  
        region <- hoveringOverRegion get
167  
        if notNull region {
168  
          //zoomGraphics g (is zoomY) (is zoomY)
169  
          for outline in g22_allBorderTraces_autoDiagonals region {
170  
            for p in outline {
171  
              p <- scalePt p (is zoomY) (is zoomY)
172  
              //drawPixel g p < Color green
173  
              fillRect g (Color green) (p x) (p y) (iceil < is zoomX) (iceil < is zoomY)
174  
            }
175  
          }
176  
        }
177  
      }
178  
      
179  
      collector anim, displayNewImage <- IVF1 image -> {
180  
        pt <- is mousePosition
181  
        if isNull pt {
182  
          hoveringOverRegion clear
183  
        } else {
184  
          ai <- collector completedImage
185  
          regionMaker <- ai wrangler, regionMaker
186  
          hoveringOverRegion set <
187  
            regionMaker getRegion < regionMaker regionAt pt
188  
          // TODO: doesn't work like this
189  
          // if not < collector running { is repaint }
190  
        }
191  
        //toolTip is hoveringOverRegion
192  
        collector anim, displayNewImage_base image
193  
      }
194  
      
195  
      is imageSurfaceOnLeftClick < IVF1 pt -> {
196  
        region <- hoveringOverRegion get
197  
        if isNull region { ret }
198  
        ai <- collector completedImage
199  
        md5 <- ai saveImage
200  
        poi <- new G22PointOfInterest
201  
        poi imageMD5 <- md5
202  
        poi pt <- pt
203  
        poi bnpSettings <- ai wrangler, bnpSettings
204  
        poi source <- spaceCombine "Clicked" (byUser) "on" ( ymdWithSlashes)
205  
        registerConcept (concepts) poi
206  
      }
207  
      
208  
      collector
209  
    ]], +collector);
210  
  }
211  
}

download  show line numbers  debug dex  old transpilations   

Travelled to 2 computer(s): elmgxqgtpvxh, mqqgnosmbjvj

No comments. add comment

Snippet ID: #1035943
Snippet name: G22ShapeCollectorPanel - latest shape collector version
Eternal ID of this version: #1035943/58
Text MD5: 30c8d8a182f74adae710ea229aeb61ec
Author: stefan
Category: javax / gazelle 22
Type: JavaX fragment (include)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2022-09-15 18:38:35
Source code size: 7138 bytes / 211 lines
Pitched / IR pitched: No / No
Views / Downloads: 173 / 398
Version history: 57 change(s)
Referenced in: [show references]