1
1
/*
2
2
* License information at https://github.com/Caltech-IPAC/firefly/blob/master/License.txt
3
3
*/
4
- import DrawLayerCntlr from '../visualize/DrawLayerCntlr.js' ;
4
+ import DrawLayerCntlr , { dispatchDeleteRegionLayer } from '../visualize/DrawLayerCntlr.js' ;
5
5
import { makeDrawingDef } from '../visualize/draw/DrawingDef.js' ;
6
6
import DrawLayer , { DataTypes , ColorChangeType } from '../visualize/draw/DrawLayer.js' ;
7
7
import { makeFactoryDef } from '../visualize/draw/DrawLayerFactory.js' ;
@@ -16,7 +16,7 @@ import DrawLayerCntrl, {dispatchModifyCustomField,
16
16
dispatchAddRegionEntry ,
17
17
dispatchRemoveRegionEntry , dlRoot } from '../visualize/DrawLayerCntlr.js' ;
18
18
19
- import { get , isEmpty } from 'lodash' ;
19
+ import { get , set , isEmpty } from 'lodash' ;
20
20
21
21
const ID = 'REGION_PLOT' ;
22
22
const TYPE_ID = 'REGION_PLOT_TYPE' ;
@@ -27,6 +27,12 @@ var idCnt=0;
27
27
28
28
/**
29
29
* 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
30
36
* @return {Function }
31
37
*/
32
38
function creator ( initPayload ) {
@@ -43,61 +49,25 @@ function creator(initPayload) {
43
49
canHighlight :true ,
44
50
canUserChangeColor : ColorChangeType . DISABLE ,
45
51
isPointData :false ,
46
- hasPerPlotData : false ,
52
+ hasPerPlotData : true ,
47
53
destroyWhenAllDetached : true
48
54
} ;
49
55
50
56
var actionTypes = [ DrawLayerCntrl . REGION_ADD_ENTRY ,
51
57
DrawLayerCntlr . REGION_REMOVE_ENTRY ] ;
52
58
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' ) ,
55
61
options , drawingDef , actionTypes , pairs ) ;
56
62
57
63
dl . regionAry = get ( initPayload , 'regionAry' , null ) ;
58
64
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
- */
68
65
dl . highlightedRegion = get ( initPayload , 'highlightedRegion' , null ) ;
69
66
70
67
idCnt ++ ;
71
68
return dl ;
72
69
}
73
70
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
-
101
71
/**
102
72
* find the drawObj which is selected for highlight
103
73
* @param mouseStatePayload
@@ -115,9 +85,10 @@ function highlightChange(mouseStatePayload) {
115
85
116
86
function * getDrawObj ( ) {
117
87
var index = 0 ;
88
+ var dataPlot = get ( data , plotId ) ;
118
89
119
- while ( index < data . length ) {
120
- yield data [ index ++ ] ;
90
+ while ( index < dataPlot . length ) {
91
+ yield dataPlot [ index ++ ] ;
121
92
}
122
93
}
123
94
var gen = getDrawObj ( ) ;
@@ -167,7 +138,7 @@ function highlightChange(mouseStatePayload) {
167
138
* @returns {* }
168
139
*/
169
140
function getLayerChanges ( drawLayer , action ) {
170
- const { changes, regionId , regionChanges, drawLayerId } = action . payload ;
141
+ const { changes, regionChanges, drawLayerId } = action . payload ;
171
142
172
143
if ( drawLayerId && drawLayerId !== drawLayer . drawLayerId ) return null ;
173
144
var dd = Object . assign ( { } , drawLayer . drawData ) ;
@@ -189,14 +160,25 @@ function getLayerChanges(drawLayer, action) {
189
160
}
190
161
return Object . assign ( { } , changes , { drawData : dd } ) ;
191
162
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
+ } ) ;
194
173
}
195
174
return { drawData : dd } ;
196
175
197
176
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
+ } ) ;
200
182
}
201
183
202
184
return { drawData : dd } ;
@@ -207,58 +189,59 @@ function getLayerChanges(drawLayer, action) {
207
189
}
208
190
209
191
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 ;
211
194
212
195
switch ( dataType ) {
213
196
case DataTypes . DATA :
214
- return isEmpty ( lastDataRet ) ? plotAllRegions ( regionAry , dataFrom , drawLayer ) : lastDataRet ;
197
+ return isEmpty ( preData ) ? drawObjAry || plotAllRegions ( drawLayer ) : preData ;
215
198
case DataTypes . HIGHLIGHT_DATA :
216
- return isEmpty ( lastDataRet ) ? plotHighlightRegion ( highlightedRegion ) : lastDataRet ;
199
+ return isEmpty ( preData ) ? plotHighlightRegion ( highlightedRegion , plotId ) : preData ;
217
200
}
218
201
return null ;
219
202
}
220
203
/**
221
204
* create DrawingObj for all regions
222
- * @param regionAry array of region strings
223
- * @param dataFrom from 'json' (server) or 'ds9' (original ds9 description)
224
205
* @param dl drawing layer
225
206
* @returns {* }
226
207
*/
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)
228
211
if ( ! regionAry ) {
229
212
return [ ] ;
230
213
}
231
214
232
215
dl . regions = ( dataFrom === 'json' ) ? RegionFactory . parseRegionJson ( regionAry ) :
233
- RegionFactory . parseRegionDS9 ( regionAry ) ;
234
-
235
- return drawRegions ( dl . regions ) ;
216
+ RegionFactory . parseRegionDS9 ( regionAry ) ;
236
217
218
+ dl . drawObjAry = drawRegions ( dl . regions ) ; //no need regionAry anymore
219
+ return dl . drawObjAry ;
237
220
}
238
221
239
222
/**
240
223
* create DrawingObj for highlighted region
241
224
* @param highlightedObj
225
+ * @param plotId
242
226
* @returns {* }
243
227
*/
244
- function plotHighlightRegion ( highlightedObj ) {
228
+ function plotHighlightRegion ( highlightedObj , plotId ) {
245
229
if ( ! highlightedObj ) {
246
230
return [ ] ;
247
231
}
248
232
249
233
if ( highlightedObj . region ) highlightedObj . region . highlighted = 1 ;
250
- return [ DrawOp . makeHighlight ( highlightedObj , primePlot ( visRoot ( ) ) ) ] ;
234
+ return [ DrawOp . makeHighlight ( highlightedObj , primePlot ( visRoot ( ) , plotId ) ) ] ;
251
235
}
252
236
253
237
/**
254
238
* add new DrawingObj into originally displayed DrawingObj set
255
239
* @param drawLayer
256
- * @param lastData
257
240
* @param addedRegions
258
241
* @returns {Array }
259
242
*/
260
- function addRegionsToData ( drawLayer , lastData , addedRegions ) {
261
- var { regions} = drawLayer ;
243
+ function addRegionsToData ( drawLayer , addedRegions ) {
244
+ var { regions, drawObjAry : lastData } = drawLayer ;
262
245
var resultRegions = regions ? regions . slice ( ) : [ ] ;
263
246
var allDrawobjs = lastData ? lastData . slice ( ) : [ ] ;
264
247
@@ -276,25 +259,21 @@ function addRegionsToData(drawLayer, lastData, addedRegions) {
276
259
}
277
260
278
261
drawLayer . regions = resultRegions ;
262
+ drawLayer . drawObjAry = allDrawobjs ;
279
263
return allDrawobjs ;
280
264
}
281
265
282
266
/**
283
267
* remove DrawingObj from originally displayed DrawingObj set
284
268
* @param drawLayer
285
- * @param lastData
286
269
* @param removedRegions
287
270
* @returns {Array }
288
271
*/
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 ( ) : [ ] ;
291
275
var allDrawObjs = lastData ? lastData . slice ( ) : [ ] ;
292
276
293
- resultRegions = allDrawObjs . reduce ( ( prev , drawObj ) => {
294
- prev . push ( drawObj . region ) ;
295
- return prev ;
296
- } , [ ] ) ;
297
-
298
277
if ( resultRegions . length === 0 ) {
299
278
return [ ] ; // no region to be removed
300
279
}
@@ -313,5 +292,6 @@ function removeRegionsFromData(drawLayer, lastData, removedRegions) {
313
292
}
314
293
315
294
drawLayer . regions = resultRegions ;
295
+ drawLayer . drawObjAry = allDrawObjs ;
316
296
return allDrawObjs ;
317
297
}
0 commit comments