Merge branch 'centeredorigin' of https://github.com/markwal/OctoPrint into pr/markwal/centeredorigin

This commit is contained in:
Gina Häußge 2015-04-16 13:33:26 +02:00
commit 12310c5e3a
6 changed files with 52 additions and 11 deletions

View file

@ -531,7 +531,7 @@ class Profile(object):
elif key == "machine_height":
return self._printer_profile["volume"]["height"]
elif key == "machine_center_is_zero":
return self._printer_profile["volume"]["formFactor"] == "circular"
return self._printer_profile["volume"]["formFactor"] == "circular" or self._printer_profile["volume"]["origin"] == "center"
else:
return None

View file

@ -31,6 +31,14 @@ class BedTypes(object):
def values(cls):
return [getattr(cls, name) for name in cls.__dict__ if not name.startswith("__")]
class BedOrigin(object):
LOWERLEFT = "lowerleft"
CENTER = "center"
@classmethod
def values(cls):
return [getattr(cls, name) for name in cls.__dict__ if not name.startswith("__")]
class PrinterProfileManager(object):
"""
Manager for printer profiles. Offers methods to select the globally used printer profile and to list, add, remove,
@ -72,6 +80,10 @@ class PrinterProfileManager(object):
* - ``volume.formFactor``
- ``string``
- Form factor of the print bed, either ``rectangular`` or ``circular``
- ``volume.origin``
- ``string``
- Location of gcode origin in the print volume, either ``lowerleft``
- or ``center``
* - ``heatedBed``
- ``bool``
- Whether the printer has a heated bed (``True``) or not (``False``)
@ -138,6 +150,7 @@ class PrinterProfileManager(object):
depth = 200,
height = 200,
formFactor = BedTypes.RECTANGULAR,
origin = BedOrigin.LOWERLEFT
),
heatedBed = False,
extruder=dict(

View file

@ -266,6 +266,11 @@ GCODE.renderer = (function(){
y: -1 * renderOptions["bed"]["y"] * zoomFactor
};
if (renderOptions["bed"]["centeredOrigin"]) {
origin.x -= width / 2;
origin.y += height / 2;
}
ctx.beginPath();
ctx.strokeStyle = renderOptions["colorGrid"];
ctx.fillStyle = "#ffffff";
@ -281,15 +286,15 @@ GCODE.renderer = (function(){
ctx.beginPath();
for (i = 0; i <= renderOptions["bed"]["x"]; i += gridStep) {
ctx.moveTo(i * zoomFactor, 0);
ctx.lineTo(i * zoomFactor, -1 * renderOptions["bed"]["y"] * zoomFactor);
ctx.moveTo(origin.x + i * zoomFactor, origin.y);
ctx.lineTo(origin.x + i * zoomFactor, origin.y + height);
}
ctx.stroke();
ctx.beginPath();
for (i = 0; i <= renderOptions["bed"]["y"]; i += gridStep) {
ctx.moveTo(0, -1 * i * zoomFactor);
ctx.lineTo(renderOptions["bed"]["x"] * zoomFactor, -1 * i * zoomFactor);
ctx.moveTo(origin.x, origin.y + i * zoomFactor);
ctx.lineTo(origin.x + width, origin.y + i * zoomFactor);
}
ctx.stroke();
};
@ -496,7 +501,7 @@ GCODE.renderer = (function(){
offsetModelY = -1 * (renderOptions["bed"]["y"] / 2 - (mdlInfo.min.y + mdlInfo.modelSize.y / 2)) * zoomFactor;
offsetBedX = -1 * (renderOptions["bed"]["x"] / 2 - (mdlInfo.min.x + mdlInfo.modelSize.x / 2)) * zoomFactor;
offsetBedY = (renderOptions["bed"]["y"] / 2 - (mdlInfo.min.y + mdlInfo.modelSize.y / 2)) * zoomFactor;
} else if (renderOptions["bed"]["circular"]) {
} else if (renderOptions["bed"]["circular"] || renderOptions["bed"]["centeredOrigin"]) {
canvasCenter = ctx.transformedPoint(canvas.width / 2, canvas.height / 2);
offsetModelX = canvasCenter.x;
offsetModelY = canvasCenter.y;

View file

@ -137,22 +137,27 @@ $(function() {
}
if (currentProfileData && currentProfileData.volume && currentProfileData.volume.formFactor() && currentProfileData.volume.width() && currentProfileData.volume.depth()) {
var x = undefined, y = undefined, r = undefined, circular = false;
var x = undefined, y = undefined, r = undefined, circular = false, centeredOrigin = false;
var formFactor = currentProfileData.volume.formFactor();
if (formFactor == "circular") {
r = currentProfileData.volume.width() / 2;
circular = true;
centeredOrigin = true;
} else {
x = currentProfileData.volume.width();
y = currentProfileData.volume.depth();
if (currentProfileData.volume.origin) {
centeredOrigin = currentProfileData.volume.origin() == "center";
}
}
return {
x: x,
y: y,
r: r,
circular: circular
circular: circular,
centeredOrigin: centeredOrigin
};
} else {
return undefined;
@ -507,4 +512,4 @@ $(function() {
["loginStateViewModel", "settingsViewModel"],
"#gcode"
]);
});
});

View file

@ -12,7 +12,8 @@ $(function() {
formFactor: "rectangular",
width: 200,
depth: 200,
height: 200
height: 200,
origin: "lowerleft"
},
heatedBed: false,
axes: {
@ -66,6 +67,7 @@ $(function() {
self.editorVolumeDepth = ko.observable();
self.editorVolumeHeight = ko.observable();
self.editorVolumeFormFactor = ko.observable();
self.editorVolumeOrigin = ko.observable();
self.editorHeatedBed = ko.observable();
@ -93,6 +95,11 @@ $(function() {
{key: "black", name: gettext("black")}
]);
self.availableOrigins = ko.observable([
{key: "lowerleft", name: gettext("Lower Left")},
{key: "center", name: gettext("Centered")}
]);
self.koEditorExtruderOffsets = ko.computed(function() {
var extruderOffsets = self.editorExtruderOffsets();
var numExtruders = self.editorExtruders();
@ -282,6 +289,7 @@ $(function() {
self.editorVolumeDepth(data.volume.depth);
self.editorVolumeHeight(data.volume.height);
self.editorVolumeFormFactor(data.volume.formFactor);
self.editorVolumeOrigin(data.volume.origin);
self.editorHeatedBed(data.heatedBed);
@ -346,7 +354,8 @@ $(function() {
width: parseFloat(self.editorVolumeWidth()),
depth: parseFloat(self.editorVolumeDepth()),
height: parseFloat(self.editorVolumeHeight()),
formFactor: self.editorVolumeFormFactor()
formFactor: self.editorVolumeFormFactor(),
origin: self.editorVolumeOrigin()
},
heatedBed: self.editorHeatedBed(),
extruder: {

View file

@ -76,6 +76,15 @@
<label class="radio"><input type="radio" name="printerProfileFormFactorGroup" value="circular" data-bind="checked: printerProfiles.editorVolumeFormFactor"> {{ _('Circular') }}</label>
</div>
</div>
<div class="control-group">
<div class="control-group">
<label class="control-label">{{ _('Origin') }}</label>
<div class="controls">
<select data-bind="value: printerProfiles.editorVolumeOrigin, options: printerProfiles.availableOrigins, optionsText: 'name', optionsValue: 'key'">
</select>
</div>
</div>
</div>
<div class="control-group">
<label class="control-label">{{ _('Volume') }}</label>
<div class="controls form-inline">