MrDraw/src/octoprint/static/js/app/viewmodels/slicing.js
2017-02-12 12:35:57 +02:00

281 lines
9.4 KiB
JavaScript

$(function() {
function SlicingViewModel(parameters) {
var self = this;
self.loginState = parameters[0];
self.printerProfiles = parameters[1];
self.file = ko.observable(undefined);
self.target = undefined;
self.path = undefined;
self.data = undefined;
self.defaultSlicer = undefined;
self.defaultProfile = undefined;
self.destinationFilename = ko.observable();
self.gcodeFilename = self.destinationFilename; // TODO: for backwards compatiblity, mark deprecated ASAP
self.title = ko.observable();
self.slicer = ko.observable();
self.slicers = ko.observableArray();
self.profile = ko.observable();
self.profiles = ko.observableArray();
self.printerProfile = ko.observable();
self.allViewModels = undefined;
self.slicersForFile = function(file) {
if (file === undefined) {
return [];
}
return _.filter(self.configuredSlicers(), function(slicer) {
return _.any(slicer.sourceExtensions, function(extension) {
return _.endsWith(file.toLowerCase(), "." + extension.toLowerCase());
});
});
};
self.profilesForSlicer = function(key) {
if (key == undefined) {
key = self.slicer();
}
if (key == undefined || !self.data.hasOwnProperty(key)) {
return;
}
var slicer = self.data[key];
var selectedProfile = undefined;
self.profiles.removeAll();
_.each(_.values(slicer.profiles), function(profile) {
var name = profile.displayName;
if (name == undefined) {
name = profile.key;
}
if (profile.default) {
selectedProfile = profile.key;
}
self.profiles.push({
key: profile.key,
name: name
})
});
self.profile(selectedProfile);
self.defaultProfile = selectedProfile;
};
self.resetProfiles = function() {
self.profiles.removeAll();
self.profile(undefined);
};
self.configuredSlicers = ko.pureComputed(function() {
return _.filter(self.slicers(), function(slicer) {
return slicer.configured;
});
});
self.matchingSlicers = ko.computed(function() {
var slicers = self.slicersForFile(self.file());
var containsSlicer = function(key) {
return _.any(slicers, function(slicer) {
return slicer.key == key;
});
};
var current = self.slicer();
if (!containsSlicer(current)) {
if (self.defaultSlicer !== undefined && containsSlicer(self.defaultSlicer)) {
self.slicer(self.defaultSlicer);
} else {
self.slicer(undefined);
self.resetProfiles();
}
} else {
self.profilesForSlicer(self.slicer());
}
return slicers;
});
self.afterSlicingOptions = [
{"value": "none", "text": gettext("Do nothing")},
{"value": "select", "text": gettext("Select for printing")},
{"value": "print", "text": gettext("Start printing")}
];
self.afterSlicing = ko.observable("none");
self.show = function(target, file, force, path) {
if (!self.enableSlicingDialog() && !force) {
return;
}
var filename = file.substr(0, file.lastIndexOf("."));
if (filename.lastIndexOf("/") != 0) {
path = path || filename.substr(0, filename.lastIndexOf("/"));
filename = filename.substr(filename.lastIndexOf("/") + 1);
}
self.requestData();
self.target = target;
self.file(file);
self.path = path;
self.title(_.sprintf(gettext("Slicing %(filename)s"), {filename: filename}));
self.destinationFilename(filename);
self.printerProfile(self.printerProfiles.currentProfile());
self.afterSlicing("none");
$("#slicing_configuration_dialog").modal("show");
};
self.slicer.subscribe(function(newValue) {
if (newValue === undefined) {
self.resetProfiles();
} else {
self.profilesForSlicer(newValue);
}
});
self.enableSlicingDialog = ko.pureComputed(function() {
return self.configuredSlicers().length > 0;
});
self.enableSlicingDialogForFile = function(file) {
return self.slicersForFile(file).length > 0;
};
self.enableSliceButton = ko.pureComputed(function() {
return self.destinationFilename() != undefined
&& self.destinationFilename().trim() != ""
&& self.slicer() != undefined
&& self.profile() != undefined;
});
self.requestData = function() {
return OctoPrint.slicing.listAllSlicersAndProfiles()
.done(function(data) {
self.fromResponse(data);
});
};
self.destinationExtension = ko.pureComputed(function() {
var fallback = "???";
if (self.slicer() === undefined) {
return fallback;
}
var slicer = self.data[self.slicer()];
if (slicer === undefined) {
return fallback;
}
var extensions = slicer.extensions;
if (extensions === undefined) {
return fallback;
}
var destinationExtensions = extensions.destination;
if (destinationExtensions === undefined || !destinationExtensions.length) {
return fallback;
}
return destinationExtensions[0] || fallback;
});
self.fromResponse = function(data) {
self.data = data;
var selectedSlicer = undefined;
self.slicers.removeAll();
_.each(_.values(data), function(slicer) {
var name = slicer.displayName;
if (name == undefined) {
name = slicer.key;
}
if (slicer.default && slicer.configured) {
selectedSlicer = slicer.key;
}
var props = {
key: slicer.key,
name: name,
configured: slicer.configured,
sourceExtensions: slicer.extensions.source,
destinationExtensions: slicer.extensions.destination,
sameDevice: slicer.sameDevice
};
self.slicers.push(props);
});
self.defaultSlicer = selectedSlicer;
if (self.allViewModels) {
callViewModels(self.allViewModels, "onSlicingData", [data]);
}
};
self.slice = function() {
var destinationFilename = self._sanitize(self.destinationFilename());
var destinationExtensions = self.data[self.slicer()] && self.data[self.slicer()].extensions && self.data[self.slicer()].extensions.destination
? self.data[self.slicer()].extensions.destination
: ["???"];
if (!_.any(destinationExtensions, function(extension) {
return _.endsWith(destinationFilename.toLowerCase(), "." + extension.toLowerCase());
})) {
destinationFilename = destinationFilename + "." + destinationExtensions[0];
}
var data = {
slicer: self.slicer(),
profile: self.profile(),
printerProfile: self.printerProfile(),
destination: destinationFilename
};
if (self.path != undefined) {
data["path"] = self.path;
}
if (self.afterSlicing() == "print") {
data["print"] = true;
} else if (self.afterSlicing() == "select") {
data["select"] = true;
}
OctoPrint.files.slice(self.target, self.file(), data)
.done(function() {
$("#slicing_configuration_dialog").modal("hide");
self.destinationFilename(undefined);
self.slicer(self.defaultSlicer);
self.profile(self.defaultProfile);
});
};
self._sanitize = function(name) {
return name.replace(/[^a-zA-Z0-9\-_\.\(\) ]/g, "").replace(/ /g, "_");
};
self.onStartup = function() {
self.requestData();
};
self.onEventSettingsUpdated = function(payload) {
self.requestData();
};
self.onAllBound = function(allViewModels) {
self.allViewModels = allViewModels;
};
}
OCTOPRINT_VIEWMODELS.push([
SlicingViewModel,
["loginStateViewModel", "printerProfilesViewModel"],
"#slicing_configuration_dialog"
]);
});