Skip to content

Commit 9fb5cd4

Browse files
author
Cindy Wang
committed
DM-7190: fix the issues related to add region, highlight box size while zooming the image, and update the dispatch function related to add/remove region entry.
1 parent 3f894b4 commit 9fb5cd4

File tree

12 files changed

+385
-206
lines changed

12 files changed

+385
-206
lines changed

src/firefly/html/demo/ffapi-highlevel-test.html

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@
7777
</div>
7878
<div>
7979
<a href='javascript:addRegionEntry()'>Add Region Entry </a>
80-
<select id='regionEntry_add'><option selected disabled>Regiion Layers:</option></select>
80+
<select id='regionEntry_add'><option selected disabled>Region Layers:</option></select>
8181
<a href='javascript:removeRegionEntry()'>Remove Region Entry</a>
8282
<select id='regionEntry_remove'><option selected disabled>Regiion Layers:</option></select>
8383
<div>
@@ -266,6 +266,7 @@
266266
'PHYSICAL;box (360, 220, 60, 60, 0) #color=orange text={ph3}'
267267
];
268268

269+
window.emptyRegion = '';
269270
window.regionAry2 = [
270271
'J2000',
271272
'boxcircle point 202.45 47.262 # color=red text="pt boxcircle 6" delete=0',
@@ -289,17 +290,19 @@
289290
'image; box 280 200 72 72 0 # color=cyan text={right syntax}'
290291
];
291292

292-
var moreRegionAry = [
293+
294+
window.moreRegionAry = [
293295
'image;ellipse 100 100 20p 40p 30p 60p 40p 80p 20 # color=green text={ellipseannulus 2}',
294296
'J2000;ellipse 202.55556, 47.188286 20p 40p 0i # color=#48f text={ellipse 1} width=10',
295-
'image;box 130 100 20p 40p 30p 50p 70p 100p 30 # color=red text={slanted box annulus 3}'
297+
'image;box 130 100 20p 40p 30p 50p 70p 100p 30 # color=red text={slanted box annulus 3}',
298+
'j2000;box(47.247072i, 180.445347i, 50p, 20p, 0) # color=cyan width=6 text="box 12-3"'
296299
];
297300

298301
window.regions = [];
299302
window.regionId = window.regions.length;
300303

301304
document.getElementById('regionLayerContent').value = window.regionAry.join('\n');
302-
document.getElementById('moreRegionContent').value = moreRegionAry.join('\n');
305+
document.getElementById('moreRegionContent').value = window.moreRegionAry.join('\n');
303306
//document.getElementById('createRegionId').placeholder = "Region_Plot_" + (window.regionId+1);
304307
updateRegionLayerList();
305308
};
@@ -311,14 +314,19 @@
311314
window.regionId++;
312315
layerId = "Region_Plot_" + window.regionId;
313316
document.getElementById('createRegionId').value = layerId;
317+
314318
}
315319

316-
if (window.regionId === 3) {
320+
if (window.regionId === 0) {
321+
document.getElementById('regionLayerContent').value = window.emptyRegion;
322+
} else if (window.regionId === 3) { // region with error
317323
document.getElementById('regionLayerContent').value = window.regionWithError.join('\n');
318-
} else if (window.regionId > 1) {
319-
document.getElementById('regionLayerContent').value = window.regionAry2.join('\n');
320-
} else {
324+
} else if (window.regionId === 1) { // short region list
321325
document.getElementById('regionLayerContent').value = window.regionAry.join('\n');
326+
} else if (window.regionId === 2) { // short region list for removing all
327+
document.getElementById('regionLayerContent').value = window.moreRegionAry.join('\n');
328+
} else if (window.regionId > 3) { // longer region list
329+
document.getElementById('regionLayerContent').value = window.regionAry2.join('\n');
322330
}
323331

324332
var regionAry = document.getElementById('regionLayerContent').value.split('\n').filter(function(r) { return (r.length !== 0);});
@@ -385,8 +393,12 @@
385393

386394
selectBox.getElementsByTagName('option')[0].selected = 'selected';
387395

388-
firefly.action.dispatchAddRegionEntry(selectedLayerId, addRegions);
389-
firefly.action.dispatchAddRegionEntry(selectedLayerId, addRegions, window.ffViewer.dispatch);
396+
firefly.action.dispatchAddRegionEntry(selectedLayerId, addRegions, 'regiontest');
397+
if (selectedLayerId === 'Region Layers:') {
398+
firefly.action.dispatchAddRegionEntry(null, addRegions, null, null, dispatcher = window.ffViewer.dispatch);
399+
} else {
400+
firefly.action.dispatchAddRegionEntry(selectedLayerId, addRegions, null, null, dispatcher = window.ffViewer.dispatch);
401+
}
390402
};
391403

392404
removeRegionEntry = function() {

src/firefly/js/drawingLayers/RegionPlot.js

Lines changed: 50 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* License information at https://github.com/Caltech-IPAC/firefly/blob/master/License.txt
33
*/
4-
import DrawLayerCntlr from '../visualize/DrawLayerCntlr.js';
4+
import DrawLayerCntlr, {dispatchDeleteRegionLayer} from '../visualize/DrawLayerCntlr.js';
55
import {makeDrawingDef} from '../visualize/draw/DrawingDef.js';
66
import DrawLayer, {DataTypes, ColorChangeType} from '../visualize/draw/DrawLayer.js';
77
import {makeFactoryDef} from '../visualize/draw/DrawLayerFactory.js';
@@ -16,7 +16,7 @@ import DrawLayerCntrl, {dispatchModifyCustomField,
1616
dispatchAddRegionEntry,
1717
dispatchRemoveRegionEntry, dlRoot} from '../visualize/DrawLayerCntlr.js';
1818

19-
import {get, isEmpty} from 'lodash';
19+
import {get, set, isEmpty} from 'lodash';
2020

2121
const ID= 'REGION_PLOT';
2222
const TYPE_ID= 'REGION_PLOT_TYPE';
@@ -27,6 +27,12 @@ var idCnt=0;
2727

2828
/**
2929
* create region plot layer
30+
* in region plot layer, attribute regionAry: region description array
31+
* dataFrom: regionAry is from 'json' object or 'ds9' string
32+
* regions: array of region object constructed by parsing regionAry
33+
* regionObjAry: array of drawing object constructed from regions
34+
* => regions and regionObjAry are updated as adding or removing regions occurs
35+
* highlightedRegion: selected region
3036
* @return {Function}
3137
*/
3238
function creator(initPayload) {
@@ -43,61 +49,25 @@ function creator(initPayload) {
4349
canHighlight:true,
4450
canUserChangeColor: ColorChangeType.DISABLE,
4551
isPointData:false,
46-
hasPerPlotData: false,
52+
hasPerPlotData: true,
4753
destroyWhenAllDetached: true
4854
};
4955

5056
var actionTypes = [DrawLayerCntrl.REGION_ADD_ENTRY,
5157
DrawLayerCntlr.REGION_REMOVE_ENTRY];
5258

53-
var dl = DrawLayer.makeDrawLayer( get(initPayload, 'drawLayerId', `${ID}-${idCnt}`),
54-
TYPE_ID, get(initPayload, 'title', 'Region Plot'),
59+
var id = get(initPayload, 'drawLayerId', `${ID}-${idCnt}`);
60+
var dl = DrawLayer.makeDrawLayer( id, TYPE_ID, get(initPayload, 'title', 'Region Plot'),
5561
options, drawingDef, actionTypes, pairs );
5662

5763
dl.regionAry = get(initPayload, 'regionAry', null);
5864
dl.dataFrom = get(initPayload, 'dataFrom', 'ds9');
59-
60-
/*
61-
if (regionAry) {
62-
dl.regions = get(initPayload, 'dataFrom', 'ds9') === 'json' ? RegionFactory.parseRegionJson(regionAry) :
63-
RegionFactory.parseRegionDS9(regionAry);
64-
} else {
65-
dl.regions = null;
66-
}
67-
*/
6865
dl.highlightedRegion = get(initPayload, 'highlightedRegion', null);
6966

7067
idCnt++;
7168
return dl;
7269
}
7370

74-
// for testing
75-
function removeRegionDescription(mouseStatePayload) {
76-
//const {drawLayerId} = mouseStatePayload.drawLayer;
77-
78-
const id= TYPE_ID + '-0';
79-
80-
var removeRegionAry = [
81-
'image;ellipse 100 100 20p 40p 30p 60p 40p 80p 20 # color=green text={ellipseannulus 2}',
82-
'J2000;ellipse 202.55556, 47.188286 20p 40p 0i # color=#48f text={ellipse 1} width=10',
83-
'image;box 130 100 20p 40p 30p 50p 70p 100p 30 # color=red text={slanted box annulus 3}'];
84-
dispatchRemoveRegionEntry(id, removeRegionAry);
85-
}
86-
87-
// for testing
88-
function addRegionDescription(mouseStatePayload) {
89-
//const {drawLayerId} = mouseStatePayload.drawLayer;
90-
91-
const id= TYPE_ID + '-0';
92-
93-
var regionAry = [
94-
'image;ellipse 100 100 20p 40p 30p 60p 40p 80p 20 # color=green text={ellipseannulus 2}',
95-
'J2000;ellipse 202.55556, 47.188286 20p 40p 0i # color=#48f text={ellipse 1} width=10',
96-
'image;box 130 100 20p 40p 30p 50p 70p 100p 30 # color=red text={slanted box annulus 3}'];
97-
98-
dispatchAddRegionEntry(id, regionAry);
99-
}
100-
10171
/**
10272
* find the drawObj which is selected for highlight
10373
* @param mouseStatePayload
@@ -115,9 +85,10 @@ function highlightChange(mouseStatePayload) {
11585

11686
function* getDrawObj() {
11787
var index = 0;
88+
var dataPlot = get(data, plotId);
11889

119-
while (index < data.length) {
120-
yield data[index++];
90+
while (index < dataPlot.length) {
91+
yield dataPlot[index++];
12192
}
12293
}
12394
var gen = getDrawObj();
@@ -167,7 +138,7 @@ function highlightChange(mouseStatePayload) {
167138
* @returns {*}
168139
*/
169140
function getLayerChanges(drawLayer, action) {
170-
const {changes, regionId, regionChanges, drawLayerId } = action.payload;
141+
const {changes, regionChanges, drawLayerId } = action.payload;
171142

172143
if (drawLayerId && drawLayerId !== drawLayer.drawLayerId) return null;
173144
var dd = Object.assign({}, drawLayer.drawData);
@@ -189,14 +160,25 @@ function getLayerChanges(drawLayer, action) {
189160
}
190161
return Object.assign({}, changes, {drawData: dd});
191162
case DrawLayerCntrl.REGION_ADD_ENTRY:
192-
if (regionId === drawLayer.drawLayerId && regionChanges) {
193-
dd[DataTypes.DATA] = addRegionsToData(drawLayer, dd[DataTypes.DATA], regionChanges);
163+
if (regionChanges) {
164+
var {layerTitle} = action.payload;
165+
166+
if (layerTitle) {
167+
drawLayer.title = layerTitle.slice(); // update title of the layer
168+
}
169+
addRegionsToData(drawLayer, regionChanges);
170+
Object.keys(dd[DataTypes.DATA]).forEach((plotId) => {
171+
set(dd[DataTypes.DATA], plotId, drawLayer.drawObjAry)
172+
});
194173
}
195174
return {drawData: dd};
196175

197176
case DrawLayerCntrl.REGION_REMOVE_ENTRY:
198-
if (regionId === drawLayer.drawLayerId && regionChanges) {
199-
dd[DataTypes.DATA] = removeRegionsFromData(drawLayer, dd[DataTypes.DATA], regionChanges);
177+
if (regionChanges) {
178+
removeRegionsFromData(drawLayer, regionChanges);
179+
Object.keys(dd[DataTypes.DATA]).forEach((plotId) => {
180+
set(dd[DataTypes.DATA], plotId, drawLayer.drawObjAry)
181+
});
200182
}
201183

202184
return {drawData: dd};
@@ -207,58 +189,59 @@ function getLayerChanges(drawLayer, action) {
207189
}
208190

209191
function getDrawData(dataType, plotId, drawLayer, action, lastDataRet) {
210-
const {highlightedRegion, regionAry, dataFrom} = drawLayer;
192+
const {highlightedRegion, drawObjAry} = drawLayer;
193+
var preData = get(lastDataRet, plotId, null) || lastDataRet;
211194

212195
switch (dataType) {
213196
case DataTypes.DATA:
214-
return isEmpty(lastDataRet) ? plotAllRegions(regionAry, dataFrom, drawLayer) : lastDataRet;
197+
return isEmpty(preData) ? drawObjAry || plotAllRegions(drawLayer) : preData;
215198
case DataTypes.HIGHLIGHT_DATA:
216-
return isEmpty(lastDataRet) ? plotHighlightRegion(highlightedRegion) : lastDataRet;
199+
return isEmpty(preData) ? plotHighlightRegion(highlightedRegion, plotId) : preData;
217200
}
218201
return null;
219202
}
220203
/**
221204
* create DrawingObj for all regions
222-
* @param regionAry array of region strings
223-
* @param dataFrom from 'json' (server) or 'ds9' (original ds9 description)
224205
* @param dl drawing layer
225206
* @returns {*}
226207
*/
227-
function plotAllRegions(regionAry, dataFrom, dl) {
208+
function plotAllRegions(dl) {
209+
var {dataFrom, regionAry} = dl; //regionAry: array of region strings
210+
//dataFrom: from 'json' (server) or 'ds9' (original ds9 description)
228211
if (!regionAry) {
229212
return [];
230213
}
231214

232215
dl.regions = (dataFrom === 'json') ? RegionFactory.parseRegionJson(regionAry) :
233-
RegionFactory.parseRegionDS9(regionAry);
234-
235-
return drawRegions(dl.regions);
216+
RegionFactory.parseRegionDS9(regionAry);
236217

218+
dl.drawObjAry = drawRegions(dl.regions); //no need regionAry anymore
219+
return dl.drawObjAry;
237220
}
238221

239222
/**
240223
* create DrawingObj for highlighted region
241224
* @param highlightedObj
225+
* @param plotId
242226
* @returns {*}
243227
*/
244-
function plotHighlightRegion(highlightedObj) {
228+
function plotHighlightRegion(highlightedObj, plotId) {
245229
if (!highlightedObj) {
246230
return [];
247231
}
248232

249233
if (highlightedObj.region) highlightedObj.region.highlighted = 1;
250-
return [DrawOp.makeHighlight(highlightedObj, primePlot(visRoot()))];
234+
return [DrawOp.makeHighlight(highlightedObj, primePlot(visRoot(), plotId))];
251235
}
252236

253237
/**
254238
* add new DrawingObj into originally displayed DrawingObj set
255239
* @param drawLayer
256-
* @param lastData
257240
* @param addedRegions
258241
* @returns {Array}
259242
*/
260-
function addRegionsToData(drawLayer, lastData, addedRegions) {
261-
var {regions} = drawLayer;
243+
function addRegionsToData(drawLayer, addedRegions) {
244+
var {regions, drawObjAry: lastData} = drawLayer;
262245
var resultRegions = regions ? regions.slice() : [];
263246
var allDrawobjs = lastData ? lastData.slice() : [];
264247

@@ -276,25 +259,21 @@ function addRegionsToData(drawLayer, lastData, addedRegions) {
276259
}
277260

278261
drawLayer.regions = resultRegions;
262+
drawLayer.drawObjAry = allDrawobjs;
279263
return allDrawobjs;
280264
}
281265

282266
/**
283267
* remove DrawingObj from originally displayed DrawingObj set
284268
* @param drawLayer
285-
* @param lastData
286269
* @param removedRegions
287270
* @returns {Array}
288271
*/
289-
function removeRegionsFromData(drawLayer, lastData, removedRegions) {
290-
var resultRegions;
272+
function removeRegionsFromData(drawLayer, removedRegions) {
273+
var {regions, drawObjAry: lastData} = drawLayer;
274+
var resultRegions = regions ? regions.slice() : [];
291275
var allDrawObjs = lastData ? lastData.slice() : [];
292276

293-
resultRegions = allDrawObjs.reduce( (prev, drawObj) => {
294-
prev.push(drawObj.region);
295-
return prev;
296-
}, []);
297-
298277
if (resultRegions.length === 0) {
299278
return []; // no region to be removed
300279
}
@@ -313,5 +292,6 @@ function removeRegionsFromData(drawLayer, lastData, removedRegions) {
313292
}
314293

315294
drawLayer.regions = resultRegions;
295+
drawLayer.drawObjAry = allDrawObjs;
316296
return allDrawObjs;
317297
}

0 commit comments

Comments
 (0)