Fixed a couple of issue with the gcode viewer

Most notably the interfering options tracked in #398, but also made "Center viewport on model" and "Zoom in on model" automatically deselect and de-apply if viewport gets manipulated by user, therefore properly allowing the re-select by the user to work to.

Closes #398
This commit is contained in:
Gina Häußge 2014-08-08 16:22:48 +02:00
parent 6474f25253
commit f195af017e
2 changed files with 117 additions and 25 deletions

View file

@ -47,7 +47,9 @@ GCODE.renderer = (function(){
invertAxes: {x: false, y: false}, invertAxes: {x: false, y: false},
bed: {x: 200, y: 200}, bed: {x: 200, y: 200},
container: undefined container: undefined,
onInternalOptionChange: undefined
}; };
var offsetModelX = 0, offsetModelY = 0; var offsetModelX = 0, offsetModelY = 0;
@ -142,45 +144,107 @@ GCODE.renderer = (function(){
ctx.lineCap = 'round'; ctx.lineCap = 'round';
trackTransforms(ctx); trackTransforms(ctx);
canvas.addEventListener('mousedown',function(evt){ // dragging => translating
canvas.addEventListener('mousedown', function(event){
document.body.style.mozUserSelect = document.body.style.webkitUserSelect = document.body.style.userSelect = 'none'; document.body.style.mozUserSelect = document.body.style.webkitUserSelect = document.body.style.userSelect = 'none';
lastX = evt.offsetX || (evt.pageX - canvas.offsetLeft);
lastY = evt.offsetY || (evt.pageY - canvas.offsetTop); // remember starting point of dragging gesture
dragStart = ctx.transformedPoint(lastX,lastY); lastX = event.offsetX || (event.pageX - canvas.offsetLeft);
lastY = event.offsetY || (event.pageY - canvas.offsetTop);
dragStart = ctx.transformedPoint(lastX, lastY);
// not yet dragged anything
dragged = false; dragged = false;
},false); }, false);
canvas.addEventListener('mousemove',function(evt){
lastX = evt.offsetX || (evt.pageX - canvas.offsetLeft); canvas.addEventListener('mousemove', function(event){
lastY = evt.offsetY || (evt.pageY - canvas.offsetTop); // save current mouse coordinates
lastX = event.offsetX || (event.pageX - canvas.offsetLeft);
lastY = event.offsetY || (event.pageY - canvas.offsetTop);
// mouse movement => dragged
dragged = true; dragged = true;
if (dragStart){
if (dragStart !== undefined){
// translate
var pt = ctx.transformedPoint(lastX,lastY); var pt = ctx.transformedPoint(lastX,lastY);
ctx.translate(pt.x-dragStart.x,pt.y-dragStart.y); ctx.translate(pt.x - dragStart.x, pt.y - dragStart.y);
reRender(); reRender();
renderOptions["centerViewport"] = false;
renderOptions["zoomInOnModel"] = false;
renderOptions["zoomInOnBed"] = false;
offsetModelX = 0;
offsetModelY = 0;
offsetBedX = 0;
offsetBedY = 0;
scaleX = 1;
scaleY = 1;
if (renderOptions["onInternalOptionChange"] !== undefined) {
renderOptions["onInternalOptionChange"]({
centerViewport: false,
moveModel: false,
zoomInOnModel: false,
zoomInOnBed: false
});
}
} }
},false); }, false);
canvas.addEventListener('mouseup',function(evt){
dragStart = null; canvas.addEventListener('mouseup', function(event){
if (!dragged) zoom(evt.shiftKey ? -1 : 1 ); // reset dragStart
},false); dragStart = undefined;
}, false);
// mouse wheel => zooming
var zoom = function(clicks){ var zoom = function(clicks){
var pt = ctx.transformedPoint(lastX,lastY); // focus on last mouse position prior to zoom
var pt = ctx.transformedPoint(lastX, lastY);
ctx.translate(pt.x,pt.y); ctx.translate(pt.x,pt.y);
// determine zooming factor and perform zoom
var factor = Math.pow(scaleFactor,clicks); var factor = Math.pow(scaleFactor,clicks);
ctx.scale(factor,factor); ctx.scale(factor,factor);
// return to old position
ctx.translate(-pt.x,-pt.y); ctx.translate(-pt.x,-pt.y);
// render
reRender(); reRender();
// disable conflicting options
renderOptions["zoomInOnModel"] = false;
renderOptions["zoomInOnBed"] = false;
offsetModelX = 0;
offsetModelY = 0;
offsetBedX = 0;
offsetBedY = 0;
scaleX = 1;
scaleY = 1;
if (renderOptions["onInternalOptionChange"] !== undefined) {
renderOptions["onInternalOptionChange"]({
zoomInOnModel: false,
zoomInOnBed: false
});
}
}; };
var handleScroll = function(evt){ var handleScroll = function(event){
var delta; var delta;
if(evt.detail<0 || evt.wheelDelta>0)delta=zoomFactorDelta;
else delta=-1*zoomFactorDelta; // determine zoom direction & delta
if (event.detail < 0 || event.wheelDelta > 0) {
delta = zoomFactorDelta;
} else {
delta = -1 * zoomFactorDelta;
}
if (delta) zoom(delta); if (delta) zoom(delta);
return evt.preventDefault() && false;
return event.preventDefault() && false;
}; };
canvas.addEventListener('DOMMouseScroll',handleScroll,false); canvas.addEventListener('DOMMouseScroll',handleScroll,false);
canvas.addEventListener('mousewheel',handleScroll,false); canvas.addEventListener('mousewheel',handleScroll,false);
}; };
var drawGrid = function() { var drawGrid = function() {
@ -448,8 +512,13 @@ GCODE.renderer = (function(){
}; };
var applyZoom = function(mdlInfo) { var applyZoom = function(mdlInfo) {
// get middle of canvas
var pt = ctx.transformedPoint(canvas.width/2,canvas.height/2); var pt = ctx.transformedPoint(canvas.width/2,canvas.height/2);
// get current transform
var transform = ctx.getTransform(); var transform = ctx.getTransform();
// move to middle of canvas, reset scale, move back
if (scaleX && scaleY && transform.a && transform.d) { if (scaleX && scaleY && transform.a && transform.d) {
ctx.translate(pt.x, pt.y); ctx.translate(pt.x, pt.y);
ctx.scale(1 / scaleX, 1 / scaleY); ctx.scale(1 / scaleX, 1 / scaleY);
@ -458,6 +527,7 @@ GCODE.renderer = (function(){
} }
if (mdlInfo && renderOptions["zoomInOnModel"]) { if (mdlInfo && renderOptions["zoomInOnModel"]) {
// if we need to zoom in on model, scale factor is calculated by longer side of object in relation to that axis of canvas
var scaleF = mdlInfo.modelSize.x > mdlInfo.modelSize.y ? (canvas.width - 10) / mdlInfo.modelSize.x : (canvas.height - 10) / mdlInfo.modelSize.y; var scaleF = mdlInfo.modelSize.x > mdlInfo.modelSize.y ? (canvas.width - 10) / mdlInfo.modelSize.x : (canvas.height - 10) / mdlInfo.modelSize.y;
scaleF /= zoomFactor; scaleF /= zoomFactor;
if (transform.a && transform.d) { if (transform.a && transform.d) {
@ -468,6 +538,7 @@ GCODE.renderer = (function(){
ctx.translate(-pt.x, -pt.y); ctx.translate(-pt.x, -pt.y);
} }
} else { } else {
// reset scale to 1
scaleX = 1; scaleX = 1;
scaleY = 1; scaleY = 1;
} }
@ -477,18 +548,23 @@ GCODE.renderer = (function(){
var width = canvas.width - 10; var width = canvas.width - 10;
var height = canvas.height - 10; var height = canvas.height - 10;
// de-invert
if (currentInvertX || currentInvertY) { if (currentInvertX || currentInvertY) {
ctx.scale(currentInvertX ? -1 : 1, currentInvertY ? -1 : 1); ctx.scale(currentInvertX ? -1 : 1, currentInvertY ? -1 : 1);
ctx.translate(currentInvertX ? -width : 0, currentInvertY ? height : 0); ctx.translate(currentInvertX ? -width : 0, currentInvertY ? height : 0);
} }
// get settings
var invertX = renderOptions["invertAxes"]["x"]; var invertX = renderOptions["invertAxes"]["x"];
var invertY = renderOptions["invertAxes"]["y"]; var invertY = renderOptions["invertAxes"]["y"];
// invert
if (invertX || invertY) { if (invertX || invertY) {
ctx.translate(invertX ? width : 0, invertY ? -height : 0); ctx.translate(invertX ? width : 0, invertY ? -height : 0);
ctx.scale(invertX ? -1 : 1, invertY ? -1 : 1); ctx.scale(invertX ? -1 : 1, invertY ? -1 : 1);
} }
// save for later
currentInvertX = invertX; currentInvertX = invertX;
currentInvertY = invertY; currentInvertY = invertY;
}; };
@ -530,7 +606,7 @@ GCODE.renderer = (function(){
dirty = true; dirty = true;
renderOptions[opt] = options[opt]; renderOptions[opt] = options[opt];
if ($.inArray(opt, ["moveModel", "centerViewport", "zoomInOnModel", "bed", "invertAxes"])) { if ($.inArray(opt, ["moveModel", "centerViewport", "zoomInOnModel", "bed", "invertAxes"]) > -1) {
mustRefresh = true; mustRefresh = true;
} }
} }

View file

@ -60,7 +60,8 @@ function GcodeViewModel(loginStateViewModel, settingsViewModel) {
extrusionWidth: self.renderer_extrusionWidthEnabled() ? self.renderer_extrusionWidth() : 1, extrusionWidth: self.renderer_extrusionWidthEnabled() ? self.renderer_extrusionWidth() : 1,
showNextLayer: self.renderer_showNext(), showNextLayer: self.renderer_showNext(),
showPreviousLayer: self.renderer_showPrevious(), showPreviousLayer: self.renderer_showPrevious(),
zoomInOnModel: self.renderer_zoomOnModel() zoomInOnModel: self.renderer_zoomOnModel(),
onInternalOptionChange: self._onInternalRendererOptionChange
}; };
if (additionalRendererOptions) { if (additionalRendererOptions) {
_.extend(renderer, additionalRendererOptions); _.extend(renderer, additionalRendererOptions);
@ -172,7 +173,7 @@ function GcodeViewModel(loginStateViewModel, settingsViewModel) {
self.clear = function() { self.clear = function() {
GCODE.ui.clear(); GCODE.ui.clear();
} };
self._configureLayerSlider = function() { self._configureLayerSlider = function() {
self.layerSlider = $("#gcode_slider_layers").slider({ self.layerSlider = $("#gcode_slider_layers").slider({
@ -370,6 +371,20 @@ function GcodeViewModel(loginStateViewModel, settingsViewModel) {
} }
}; };
self._onInternalRendererOptionChange = function(options) {
if (!options) return;
for (var opt in options) {
if (opt == "zoomInOnModel" && options[opt] != self.renderer_zoomOnModel()) {
self.renderer_zoomOnModel(false);
} else if (opt == "centerViewport" && options[opt] != self.renderer_centerViewport()) {
self.renderer_centerViewport(false);
} else if (opt == "moveModel" && options[opt] != self.renderer_centerModel()) {
self.renderer_centerModel(false);
}
}
};
self.changeLayer = function(event) { self.changeLayer = function(event) {
if (self.currentlyPrinting && self.renderer_syncProgress()) self.renderer_syncProgress(false); if (self.currentlyPrinting && self.renderer_syncProgress()) self.renderer_syncProgress(false);
@ -389,4 +404,5 @@ function GcodeViewModel(loginStateViewModel, settingsViewModel) {
GCODE.ui.changeSelectedCommands(self.layerSlider.slider("getValue"), tuple[0], tuple[1]); GCODE.ui.changeSelectedCommands(self.layerSlider.slider("getValue"), tuple[0], tuple[1]);
}; };
} }