MrDraw/src/octoprint/plugins/lasercutterprofiles/static/js/lasercutterprofiles.js

267 lines
8.2 KiB
JavaScript

$(function() {
function LaserCutterProfilesViewModel(params) {
var self = this;
self.workingarea = params[0];
self.control = params[1];
self.conversion = params[2];
self._cleanProfile = function() {
return {
id: "",
name: "",
model: "",
volume: {
formFactor: "rectangular",
width: 216,
depth: 297,
height: 0,
origin_offset_x: 1,
origin_offset_y: 1
},
zAxis: false,
axes: {
x: {speed: 6000, inverted: false},
y: {speed: 6000, inverted: false},
z: {speed: 200, inverted: false}
}
};
};
self.profiles = new ItemListHelper(
"laserCutterProfiles",
{
"name": function(a, b) {
// sorts ascending
if (a["name"].toLocaleLowerCase() < b["name"].toLocaleLowerCase()) return -1;
if (a["name"].toLocaleLowerCase() > b["name"].toLocaleLowerCase()) return 1;
return 0;
}
},
{},
"name",
[],
[],
10
);
self.defaultProfile = ko.observable();
self.currentProfile = ko.observable();
self.currentProfileData = ko.observable(ko.mapping.fromJS(self._cleanProfile()));
self.editorNew = ko.observable(false);
self.editorName = ko.observable();
self.editorIdentifier = ko.observable();
self.editorModel = ko.observable();
self.editorVolumeWidth = ko.observable();
self.editorVolumeDepth = ko.observable();
self.editorVolumeHeight = ko.observable();
self.editorZAxis = ko.observable();
self.editorAxisXSpeed = ko.observable();
self.editorAxisYSpeed = ko.observable();
self.editorAxisZSpeed = ko.observable();
self.editorAxisXInverted = ko.observable(false);
self.editorAxisYInverted = ko.observable(false);
self.editorAxisZInverted = ko.observable(false);
self.makeDefault = function(data) {
var profile = {
id: data.id,
default: true
};
self.updateProfile(profile);
};
self.requestData = function() {
$.ajax({
url: BASEURL + "plugin/lasercutterprofiles/profiles",
type: "GET",
dataType: "json",
success: self.fromResponse
})
};
self.fromResponse = function(data) {
var items = [];
var defaultProfile = undefined;
var currentProfile = undefined;
var currentProfileData = undefined;
_.each(data.profiles, function(entry) {
if (entry.default) {
defaultProfile = entry.id;
}
if (entry.current) {
currentProfile = entry.id;
currentProfileData = ko.mapping.fromJS(entry, self.currentProfileData);
}
entry["isdefault"] = ko.observable(entry.default);
entry["iscurrent"] = ko.observable(entry.current);
items.push(entry);
});
self.profiles.updateItems(items);
self.defaultProfile(defaultProfile);
self.currentProfile(currentProfile);
self.currentProfileData(currentProfileData);
self.workingarea.workingAreaWidthMM(self.currentProfileData().volume.width() - self.currentProfileData().volume.origin_offset_x());
self.workingarea.workingAreaHeightMM(self.currentProfileData().volume.depth() - self.currentProfileData().volume.origin_offset_y());
var maxSpeed = Math.min(self.currentProfileData().axes.x.speed(), self.currentProfileData().axes.y.speed());
self.conversion.maxSpeed(maxSpeed);
};
self.addProfile = function(callback) {
var profile = self._editorData();
$.ajax({
url: BASEURL + "plugin/lasercutterprofiles/profiles",
type: "POST",
dataType: "json",
contentType: "application/json; charset=UTF-8",
data: JSON.stringify({profile: profile}),
success: function() {
if (callback !== undefined) {
callback();
}
self.requestData();
}
});
};
self.removeProfile = function(data) {
$.ajax({
url: data.resource,
type: "DELETE",
dataType: "json",
success: self.requestData
})
};
self.updateProfile = function(profile, callback) {
if (profile == undefined) {
profile = self._editorData();
}
$.ajax({
url: BASEURL + "plugin/lasercutterprofiles/profiles/" + profile.id,
type: "PATCH",
dataType: "json",
contentType: "application/json; charset=UTF-8",
data: JSON.stringify({profile: profile}),
success: function() {
if (callback !== undefined) {
callback();
}
self.requestData();
}
});
};
self.showEditProfileDialog = function(data) {
var add = false;
if (data == undefined) {
data = self._cleanProfile();
add = true;
}
self.editorNew(add);
self.editorIdentifier(data.id);
self.editorName(data.name);
self.editorModel(data.model);
self.editorVolumeWidth(data.volume.width);
self.editorVolumeDepth(data.volume.depth);
self.editorVolumeHeight(data.volume.height);
self.editorZAxis(data.zAxis);
self.editorAxisXSpeed(data.axes.x.speed);
self.editorAxisXInverted(data.axes.x.inverted);
self.editorAxisYSpeed(data.axes.y.speed);
self.editorAxisYInverted(data.axes.y.inverted);
self.editorAxisZSpeed(data.axes.z.speed);
self.editorAxisZInverted(data.axes.z.inverted);
var editDialog = $("#settings_laserCutterProfiles_editDialog");
var confirmButton = $("button.btn-confirm", editDialog);
var dialogTitle = $("h3.modal-title", editDialog);
dialogTitle.text(add ? gettext("Add Profile") : _.sprintf(gettext("Edit Profile \"%(name)s\""), {name: data.name}));
confirmButton.unbind("click");
confirmButton.bind("click", function() {
self.confirmEditProfile(add);
});
editDialog.modal("show");
};
self.confirmEditProfile = function(add) {
var callback = function() {
$("#settings_laserCutterProfiles_editDialog").modal("hide");
};
if (add) {
self.addProfile(callback);
} else {
self.updateProfile(undefined, callback);
}
};
self.isReadOnly = function (data){
return (data.id === "_mrbeam_senior" || data.id === "_mrbeam_junior");
};
self._editorData = function() {
var profile = {
id: self.editorIdentifier(),
name: self.editorName(),
model: self.editorModel(),
volume: {
width: parseFloat(self.editorVolumeWidth()),
depth: parseFloat(self.editorVolumeDepth()),
height: parseFloat(self.editorVolumeHeight()),
},
zAxis: self.editorZAxis(),
axes: {
x: {
speed: parseInt(self.editorAxisXSpeed()),
inverted: self.editorAxisXInverted()
},
y: {
speed: parseInt(self.editorAxisYSpeed()),
inverted: self.editorAxisYInverted()
},
z: {
speed: parseInt(self.editorAxisZSpeed()),
inverted: self.editorAxisZInverted()
}
}
};
return profile;
};
self.onSettingsShown = self.requestData;
self.onStartup = function(){
self.requestData();
self.control.showZAxis = ko.computed(function(){
var has = self.currentProfileData()['zAxis']();
return has;
}); // dependency injection
};
}
// view model class, identifier, parameters for constructor, container to bind to
ADDITIONAL_VIEWMODELS.push([LaserCutterProfilesViewModel,
["workingAreaViewModel", "controlViewModel", "vectorConversionViewModel"],
document.getElementById("laserCutterProfiles")]);
});