Skip to content

Commit 21e6a80

Browse files
author
Cindy Wang
committed
The fooprint can be drawn and operated on multiple plots synchronounsly. Fixed the bug for editing the rotate angle in drawing layer panel. Showing all handles (rotate or resize) while moving the footprint or marker.
1 parent e3c137b commit 21e6a80

File tree

4 files changed

+171
-51
lines changed

4 files changed

+171
-51
lines changed

src/firefly/js/drawingLayers/FootprintTool.js

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import {clone} from '../util/WebUtil.js';
2222
import {getDS9Region} from '../rpc/PlotServicesJson.js';
2323
import {FootprintFactory} from '../visualize/draw/FootprintFactory.js';
2424
import {makeViewPortPt, makeWorldPt, makeImagePt} from '../visualize/Point.js';
25-
import {get, set, isArray, has} from 'lodash';
25+
import {get, set, isArray, has, isNil} from 'lodash';
2626
import Enum from 'enum';
2727

2828

@@ -215,7 +215,7 @@ export function footprintMoveActionCreator(rawAction) {
215215

216216
refPt = imagePt;
217217
footprintStatus = FootprintStatus.relocate;
218-
isHandle = {isOutline: true};
218+
isHandle = {isOutline: true, isRotate: true};
219219
}
220220

221221
if (move) {
@@ -297,7 +297,7 @@ function getLayerChanges(drawLayer, action) {
297297
var {plotIdAry} = action.payload;
298298

299299

300-
if (angleDeg) {
300+
if (!isNil(angleDeg)) {
301301
return updateFootprintAngle(angleDeg, obj, plotIdAry[0]);
302302
} else {
303303
return updateFootprintText(fpText, fpTextLoc, obj);
@@ -350,16 +350,26 @@ function updateFootprintText(text, textLoc, footprintDrawObj) {
350350

351351
/**
352352
* set footprint rotate angle
353-
* @param angleDeg
353+
* @param angleDegStr
354354
* @param footprintDrawObj
355355
* @param plotId
356356
* @returns {*}
357357
*/
358-
function updateFootprintAngle(angleDeg, footprintDrawObj, plotId) {
358+
function updateFootprintAngle(angleDegStr, footprintDrawObj, plotId) {
359359
const plot = primePlot(visRoot(), plotId);
360360
var cc = CsysConverter.make(plot);
361+
var angleDeg;
362+
363+
angleDeg = angleDegStr ? parseFloat(angleDegStr) : 0.0;
364+
365+
while (angleDeg > 180.0 || angleDeg < -180.0) {
366+
angleDeg = angleDeg < 0 ? angleDeg + 360 : angleDeg - 360;
367+
}
361368

362369
var angleUpdatedObj = updateFootprintDrawobjAngle(footprintDrawObj, cc, footprintDrawObj.pts[0], angleDeg, ANGLE_UNIT.degree, true);
370+
if (angleUpdatedObj) {
371+
angleUpdatedObj.angleFromUI = true;
372+
}
363373

364374
return angleUpdatedObj ? {drawData: {data: [angleUpdatedObj]}} : {};
365375
}
@@ -423,6 +433,7 @@ function createFootprintObjs(action, text, textLoc, crtFpObj) {
423433
} else {
424434
footprintObj = updateFootprintDrawobjAngle(crtFpObj, cc, wpt,
425435
angle, angleUnit);
436+
footprintObj.angleFromUI = false;
426437
}
427438
} else { // start to move or rotate (mouse down) or end the operation (mouse up)
428439
if (footprintStatus !== FootprintStatus.select ) {
@@ -470,6 +481,7 @@ function centerForRotation(drawObj, wpt) {
470481
var {outlineIndex, drawObjAry} = drawObj;
471482
var outlineBox = (outlineIndex && drawObjAry && drawObjAry.length > outlineIndex ) ? drawObjAry[outlineIndex] : null;
472483

484+
//return outlineBox.pts[0];
473485
return (outlineBox && outlineBox.outlineType === OutlineType.plotcenter) ? outlineBox.pts[0] : wpt;
474486
}
475487
/**

src/firefly/js/drawingLayers/FootprintToolUI.jsx

Lines changed: 44 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,28 +14,30 @@ import {primePlot, getDrawLayerById} from '../visualize/PlotViewUtil.js';
1414
import CoordUtil from '../visualize/CoordUtil.js';
1515
import CsysConverter from '../visualize/CsysConverter.js';
1616
import {visRoot} from '../visualize/ImagePlotCntlr.js';
17-
import {isNil, get} from 'lodash';
17+
import {InputFieldView} from '../ui/InputFieldView.jsx';
18+
import {isNil, get, isEmpty} from 'lodash';
1819
import numeral from 'numeral';
20+
import validator from 'validator';
1921

2022
export const getFootprintToolUIComponent = (drawLayer,pv) => <FootprintToolUI drawLayer={drawLayer} pv={pv}/>;
2123
export const defaultFootprintTextLoc = TextLocation.REGION_SE;
2224

25+
const precision = '0[.000000]';
26+
2327
class FootprintToolUI extends React.Component {
2428
constructor(props) {
2529
super(props);
2630

27-
var fpText = get(this.props.drawLayer, ['drawData', 'data', '0', 'text'], '');
28-
var fpTextLoc = get(this.props.drawLayer, ['drawData', 'data', '0', 'textLoc'], defaultFootprintTextLoc);
29-
var angle = get(this.props.drawLayer, ['drawData', 'data', '0', 'angle'], 0.0);
30-
var angleUnit = get(this.props.drawLayer, ['drawData', 'data', '0', angleUnit], ANGLE_UNIT.radian);
31-
var angleDeg = convertAngle(angleUnit.key, 'deg', angle);
32-
var fpInfo = get(this.props.drawLayer, 'fpInfo');
31+
var {angle = 0.0, angleUnit = ANGLE_UNIT.radian,
32+
text = '', textLoc = defaultFootprintTextLoc} = get(this.props.drawLayer, ['drawData', 'data', '0']) || {};
33+
34+
var angleDeg = `${formatAngle(convertAngle(angleUnit.key, 'deg', angle))}`;
35+
var {fpInfo, currentPt} = this.props.drawLayer;
3336
const plot= primePlot(visRoot(),this.props.pv.plotId);
34-
var {currentPt} = this.props.drawLayer;
3537

3638
this.csys = CsysConverter.make(plot);
37-
this.state = {fpText, fpTextLoc: fpTextLoc.key, angleDeg, fpInfo,
38-
currentPt: this.csys.getWorldCoords(currentPt)};
39+
this.state = {fpText: text, fpTextLoc: textLoc.key, angleDeg, fpInfo,
40+
currentPt: this.csys.getWorldCoords(currentPt), isValidAngle: true};
3941
this.changeFootprintText = this.changeFootprintText.bind(this);
4042
this.changeFootprintTextLocation = this.changeFootprintTextLocation.bind(this);
4143
this.changeFootprintAngle = this.changeFootprintAngle.bind(this);
@@ -63,11 +65,11 @@ class FootprintToolUI extends React.Component {
6365
this.setState({currentPt});
6466
}
6567

66-
var {angle = 0.0, angleUnit = ANGLE_UNIT.radian} = get(dl, ['drawData', 'data', '0']);
67-
var angleDeg = convertAngle(angleUnit.key, 'radian', angle);
68+
if (!get(dl, ['drawData', 'data', '0', 'angleFromUI'], false)) {
69+
var {angle = 0.0, angleUnit = ANGLE_UNIT.radian} = get(dl, ['drawData', 'data', '0']) || {};
6870

69-
if (angleDeg !== this.state.angleDeg) {
70-
this.setState({angleDeg});
71+
angle = convertAngle(angleUnit.key, 'deg', angle);
72+
this.setState({angleDeg: `${formatAngle(angle)}`, isValidAngle: true});
7173
}
7274
}
7375
}
@@ -93,9 +95,16 @@ class FootprintToolUI extends React.Component {
9395

9496
changeFootprintAngle(ev) {
9597
var angleDeg = get(ev, 'target.value');
98+
var isValidAngle = true;
9699

97-
this.setState({angleDeg});
98-
dispatchModifyCustomField( this.props.drawLayer.drawLayerId, {angleDeg}, this.props.pv.plotId);
100+
if (isEmpty(angleDeg) || !validator.isFloat(angleDeg)) {
101+
if (!angleDeg) angleDeg = '';
102+
isValidAngle = false;
103+
}
104+
this.setState({isValidAngle, angleDeg});
105+
if (isValidAngle) {
106+
dispatchModifyCustomField(this.props.drawLayer.drawLayerId, {angleDeg}, this.props.pv.plotId);
107+
}
99108
}
100109

101110
render() {
@@ -106,17 +115,18 @@ class FootprintToolUI extends React.Component {
106115
};
107116

108117
var textOnLink = `Add ${get(this.state.fpInfo, 'footprint')} ${get(this.state.fpInfo, 'instrument')}`;
118+
var {isValidAngle, angleDeg, fpText, fpTextLoc} = this.state;
109119

110120
return (
111121
<div style={{display:'flex', justifyContent:'flex-start', padding:'5px 0 9px 0'}}>
112122
<div style={tStyle}>
113123
<div> Label:<input style={{width: 60}}
114124
type='text'
115-
value={this.state.fpText}
125+
value={fpText}
116126
onChange={this.changeFootprintText}/>
117127
</div>
118128
<div> Corners:
119-
<select value={this.state.fpTextLoc} onChange={ this.changeFootprintTextLocation }>
129+
<select value={fpTextLoc} onChange={ this.changeFootprintTextLocation }>
120130
<option value={TextLocation.REGION_NE.key}> NE </option>
121131
<option value={TextLocation.REGION_NW.key}> NW </option>
122132
<option value={TextLocation.REGION_SE.key}> SE </option>
@@ -125,11 +135,15 @@ class FootprintToolUI extends React.Component {
125135
</div>
126136
</div>
127137
<div style={tStyle}>
128-
<div> Angle:<input style={{width: 60}}
129-
type='text'
130-
value={this.state.angleDeg}
131-
onChange={this.changeFootprintAngle}/>
132-
</div>
138+
<InputFieldView
139+
valid={isValidAngle}
140+
onChange={this.changeFootprintAngle}
141+
value={angleDeg}
142+
message={'invalid angle value'}
143+
label={'Angle:'}
144+
labelWidth={30}
145+
146+
/>
133147
<div title={textOnLink}>
134148
<a className='ff-href' style={{textDecoration: 'underline'}}
135149
onClick={()=>addFootprintDrawLayer(this.props.pv, this.state.fpInfo)}>{textOnLink}</a>
@@ -173,6 +187,11 @@ function convertWorldToString(pt) {
173187
var str = '';
174188
if (!pt) return str;
175189

176-
var precision = '0.0000';
177190
return `${numeral(pt.x).format(precision)} ${numeral(pt.y).format(precision)}`;
178-
}
191+
}
192+
193+
function formatAngle(angle) {
194+
var anglePre = parseFloat(`${numeral(angle).format(precision)}`);
195+
196+
return `${anglePre}`;
197+
}

src/firefly/js/drawingLayers/MarkerTool.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ export function markerToolMoveActionCreator(rawAction) {
188188
wpt = getWorldOrImage(makeImagePt(imageCenter.x + dx, imageCenter.y + dy), cc);
189189
move.apt = {x: dx, y: dy, type: ShapeDataObj.UnitType.IMAGE_PIXEL};
190190
markerStatus = MarkerStatus.relocate;
191-
isHandle = {isOutline: true};
191+
isHandle = {isOutline: true, isResize: true};
192192
}
193193
}
194194
// resize (newDize) or relocate (wpt), status remains the same

0 commit comments

Comments
 (0)