Add a printer profile option to allow centered origin on rectangular
beds Some printers have (0, 0) at the center of the bed. Circular beds commonly, but also some rectangular beds.
This commit is contained in:
parent
e8c085b89c
commit
fbe50e33d3
5 changed files with 34 additions and 8 deletions
|
|
@ -72,6 +72,11 @@ class PrinterProfileManager(object):
|
|||
* - ``volume.formFactor``
|
||||
- ``string``
|
||||
- Form factor of the print bed, either ``rectangular`` or ``circular``
|
||||
* - ``centeredOrigin``
|
||||
- ``bool``
|
||||
- Whether the printer's origin is in the center of the bed, otherwise
|
||||
- the origin is assumed to be the lower left and all valid coordinates
|
||||
- positive.
|
||||
* - ``heatedBed``
|
||||
- ``bool``
|
||||
- Whether the printer has a heated bed (``True``) or not (``False``)
|
||||
|
|
@ -140,6 +145,7 @@ class PrinterProfileManager(object):
|
|||
formFactor = BedTypes.RECTANGULAR,
|
||||
),
|
||||
heatedBed = False,
|
||||
centeredOrigin = False,
|
||||
extruder=dict(
|
||||
count = 1,
|
||||
offsets = [
|
||||
|
|
@ -291,6 +297,7 @@ class PrinterProfileManager(object):
|
|||
import yaml
|
||||
with open(path) as f:
|
||||
profile = yaml.safe_load(f)
|
||||
profile = dict_merge(self._load_default(), profile)
|
||||
profile = self._ensure_valid_profile(profile)
|
||||
if not profile:
|
||||
self._logger.warn("Invalid profile: %s" % path)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -137,22 +137,25 @@ $(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();
|
||||
centeredOrigin = currentProfileData.hasOwnProperty("centeredOrigin") && currentProfileData.centeredOrigin();
|
||||
}
|
||||
|
||||
return {
|
||||
x: x,
|
||||
y: y,
|
||||
r: r,
|
||||
circular: circular
|
||||
circular: circular,
|
||||
centeredOrigin: centeredOrigin
|
||||
};
|
||||
} else {
|
||||
return undefined;
|
||||
|
|
@ -507,4 +510,4 @@ $(function() {
|
|||
["loginStateViewModel", "settingsViewModel"],
|
||||
"#gcode"
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -68,6 +68,7 @@ $(function() {
|
|||
self.editorVolumeFormFactor = ko.observable();
|
||||
|
||||
self.editorHeatedBed = ko.observable();
|
||||
self.editorCenteredOrigin = ko.observable();
|
||||
|
||||
self.editorNozzleDiameter = ko.observable();
|
||||
self.editorExtruders = ko.observable();
|
||||
|
|
@ -284,6 +285,7 @@ $(function() {
|
|||
self.editorVolumeFormFactor(data.volume.formFactor);
|
||||
|
||||
self.editorHeatedBed(data.heatedBed);
|
||||
self.editorCenteredOrigin(data.centeredOrigin);
|
||||
|
||||
self.editorNozzleDiameter(data.extruder.nozzleDiameter);
|
||||
self.editorExtruders(data.extruder.count);
|
||||
|
|
@ -349,6 +351,7 @@ $(function() {
|
|||
formFactor: self.editorVolumeFormFactor()
|
||||
},
|
||||
heatedBed: self.editorHeatedBed(),
|
||||
centeredOrigin: self.editorCenteredOrigin(),
|
||||
extruder: {
|
||||
count: parseInt(self.editorExtruders()),
|
||||
offsets: [
|
||||
|
|
|
|||
|
|
@ -100,6 +100,14 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">{{ _('Bed Origin') }}</label>
|
||||
<div class="controls">
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" data-bind="checked: printerProfiles.editorCenteredOrigin">{{ _('Origin (0, 0) is in the center of the bed') }}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">{{ _('Heated Bed') }}</label>
|
||||
<div class="controls">
|
||||
|
|
|
|||
Loading…
Reference in a new issue