Compare commits

..

37 commits

Author SHA1 Message Date
ceca65577c
Update mrbeam_index.jinja2 2018-06-29 01:29:29 +02:00
47cd5345e8
mr drawification 2018-06-29 01:12:06 +02:00
3a24067560
Update README.md 2018-06-29 01:04:49 +02:00
make-ing
ff8b77500b changed pull command in git-pull.py script to fix my github delete repo fuck up. 2017-01-20 11:30:05 +01:00
make-ing
39c8f7886a chrome vs. firefox bugfix... Maybe needs further check to see if it can be simplyfied. Maybe use other values etc... 2016-10-04 13:03:35 +02:00
Florian
eb5e7408a9 Merge pull request #80 from mrbeam/mrbeam-dev
July Release
2016-07-06 15:08:57 +02:00
clemniem
0e346add14 #77 fixed
dataURL needed to be encoded correctly for non latin1

- rephrasing of popup for DPI conversion (Illustrator)
2016-07-06 12:11:53 +02:00
clemniem
5a696e01fa - cleanup of code 2016-07-01 12:42:40 +02:00
clemniem
9311463cfa - remove text deleted (again)
- clippath text edited
2016-07-01 12:35:32 +02:00
Florian
b19477dcfb Merge pull request #74 from mrbeam/stable-1.2.2
bux fixing issue #67: Chrome now treats the event target attributes l…
2016-07-01 10:18:32 +02:00
Clem
75f69dd0df Merge pull request #73 from mrbeam/mrbeam-dev-textInSvg
Mrbeam dev text in svg
2016-07-01 10:10:31 +02:00
clemniem
793b009ab6 popup dialoge informing user about the handling of text elements in SVG that have been detected 2016-06-30 17:45:41 +02:00
clemniem
e366b4c805 popup shows always laser infill if text is in userContent. 2016-06-30 17:31:07 +02:00
make-ing
bcfa42a034 changed back to the correct grbl.hex file 2016-06-24 10:39:38 +02:00
clemniem
6c44d8e243 added text to infill conversion, text will be treated like an image and always engraved. 2016-06-23 16:51:50 +02:00
make-ing
24cebced83 removed the xml stuff which magically appeared a previous commit 2016-06-23 15:49:47 +02:00
clemniem
8e02a97a61 added text to infill conversion, test 2 2016-06-23 14:53:04 +02:00
clemniem
4cb819fd7b added text to infill conversion 2016-06-23 14:43:04 +02:00
clemniem
3ffdceb5af fixed conversion dialog, added second checkbox for text_fills, no real functionality added yet 2016-06-23 14:09:39 +02:00
clemniem
fffc0c4ecb excluded text from being jumped over, because it is not on the paper 2016-06-23 11:04:22 +02:00
make-ing
1966a8b68c fixed #28: select all elements with attribute "display=none" and remove them. 2016-06-21 16:20:41 +02:00
clemniem
aad5efff2d WIP show text after upload in svg.
missing:
- add warning/dialogue about text in conversion dialogue
- cleanup
2016-06-21 15:13:36 +02:00
make-ing
f486a24914 fixed the DPI settings not working Problem, and added a PNotify messsage if an Illustrator comment is detected. 2016-06-21 13:44:19 +02:00
make-ing
179d2571ee Merge remote-tracking branch 'origin/mrbeam-dev' into mrbeam-dev 2016-06-21 09:49:29 +02:00
make-ing
074140bcd0 removed "?" from position commands to avoid aditional "ok" response and mazbe problems with advanced character counting. 2016-06-21 09:49:04 +02:00
clemniem
6641390620 resolved #69
rectangles are now removed after pressing clear button
2016-06-20 11:26:08 +02:00
make-ing
12a3f092e2 fixed problem when svg elements contain mm units, by converting them to pixel with a fixed dpi of 90. 2016-06-17 14:18:44 +02:00
make-ing
25be52587e fixed problem when xml tag in svg file is missing. 2016-06-17 12:02:56 +02:00
make-ing
3bbdd702db added functionality to remove comments ahead of time to remove the progress bar bug on gcode files with embeded (base64) images. 2016-06-15 11:30:53 +02:00
make-ing
0c5804e51a added functionality to remove all clipPath elements from svg into the placeSVG function 2016-06-02 18:12:50 +02:00
make-ing
36837246fe Merge branch 'mrbeam' into mrbeam-dev 2016-06-02 15:28:11 +02:00
make-ing
2c416eafc2 added functionality to unlock the GUI when grbl is also unlocked with "$x" command 2016-06-02 14:43:20 +02:00
make-ing
16d2e18daa bux fixing issue #67: Chrome now treats the event target attributes like Firefox, so no need for distinction anymore.
(cherry picked from commit 3128ac7)
2016-05-27 18:27:13 +02:00
make-ing
3128ac7765 bux fixing issue #67: Chrome now treats the event target attributes like Firefox, so no need for distinction anymore. 2016-05-27 18:17:39 +02:00
make-ing
64763e8ce1 added version check again... was missing since the change to comm_acc2.py 2016-05-02 09:57:58 +02:00
make-ing
e7fcb5b228 Merge branch 'nativeserial' into mrbeam 2016-04-18 17:16:28 +02:00
make-ing
ba2716f968 added the Raspberry Pi native serial port ttyAMA* to serialList function 2016-04-13 12:09:39 +02:00
15 changed files with 2045 additions and 8306 deletions

View file

@ -1,5 +1,6 @@
OctoPrint OctoPrint
========= =========
What I did was take the MrBeam fork of Octoprint (because I have a MrBeam, and I like it) - and modify it for pen plotting with an axidraw v3 clone.
[![Flattr this git repo](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=foosel&url=https://github.com/foosel/OctoPrint&title=OctoPrint&language=&tags=github&category=software) [![Flattr this git repo](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=foosel&url=https://github.com/foosel/OctoPrint&title=OctoPrint&language=&tags=github&category=software)

File diff suppressed because it is too large Load diff

View file

@ -97,7 +97,7 @@ def update_source(git_executable, folder, target, force=False):
raise RuntimeError("Could not update, \"git reset --hard\" failed with returncode %d: %s" % (returncode, stdout)) raise RuntimeError("Could not update, \"git reset --hard\" failed with returncode %d: %s" % (returncode, stdout))
print(">>> Running: git pull") print(">>> Running: git pull")
returncode, stdout = _git(["pull"], folder, git_executable=git_executable) returncode, stdout = _git(["pull", "origin", "stable-1.2.2"], folder, git_executable=git_executable)
if returncode != 0: if returncode != 0:
raise RuntimeError("Could not update, \"git pull\" failed with returncode %d: %s" % (returncode, stdout)) raise RuntimeError("Could not update, \"git pull\" failed with returncode %d: %s" % (returncode, stdout))
print(stdout) print(stdout)

View file

@ -270,7 +270,7 @@ class SvgToGcodePlugin(octoprint.plugin.SlicerPlugin,
feedrate = max(1,data["defaultFeedrate"]) feedrate = max(1,data["defaultFeedrate"])
s.set(["defaultFeedrate"], feedrate) s.set(["defaultFeedrate"], feedrate)
if "svgDPI" in data and data["svgDPI"]: if "svgDPI" in data and data["svgDPI"]:
s.set(["svgDPI"], data["svgDPI"]) s.set_int(["svgDPI"], data["svgDPI"])
if "debug_logging" in data: if "debug_logging" in data:
old_debug_logging = s.get_boolean(["debug_logging"]) old_debug_logging = s.get_boolean(["debug_logging"])
new_debug_logging = data["debug_logging"] in octoprint.settings.valid_boolean_trues new_debug_logging = data["debug_logging"] in octoprint.settings.valid_boolean_trues

View file

@ -41,8 +41,10 @@ $(function(){
// image engraving stuff // image engraving stuff
// preset values are a good start for wood engraving // preset values are a good start for wood engraving
self.images_placed = ko.observable(false); self.images_placed = ko.observable(false);
self.text_placed = ko.observable(false);
self.show_image_parameters = ko.computed(function(){ self.show_image_parameters = ko.computed(function(){
return self.images_placed() || (self.fill_areas() && self.show_vector_parameters()); return (self.images_placed() || self.text_placed()
|| (self.fill_areas() && self.show_vector_parameters()));
}); });
self.imgIntensityWhite = ko.observable(0); self.imgIntensityWhite = ko.observable(0);
self.imgIntensityBlack = ko.observable(500); self.imgIntensityBlack = ko.observable(500);
@ -85,6 +87,7 @@ $(function(){
self.show_vector_parameters(self.workingArea.getPlacedSvgs().length > 0); self.show_vector_parameters(self.workingArea.getPlacedSvgs().length > 0);
self.show_fill_areas_checkbox(self.workingArea.hasFilledVectors()) self.show_fill_areas_checkbox(self.workingArea.hasFilledVectors())
self.images_placed(self.workingArea.getPlacedImages().length > 0); self.images_placed(self.workingArea.getPlacedImages().length > 0);
self.text_placed(self.workingArea.hasTextItems());
//self.show_image_parameters(self.workingArea.getPlacedImages().length > 0); //self.show_image_parameters(self.workingArea.getPlacedImages().length > 0);
if(self.show_vector_parameters() || self.show_image_parameters()){ if(self.show_vector_parameters() || self.show_image_parameters()){

View file

@ -76,13 +76,13 @@ Snap.plugin(function (Snap, Element, Paper, global) {
Snap.plugin( function( Snap, Element, Paper, global ) { Snap.plugin( function( Snap, Element, Paper, global ) {
var ftOption = { var ftOption = {
handleFill: "blue", handleFill: "red",
handleStrokeDashPreset: [5,5], handleStrokeDashPreset: [5,5],
handleStrokeWidth: 2, handleStrokeWidth: 2,
handleLength: 18, handleLength: 18,
handleRadius: 16, handleRadius: 16,
unscale: 1, unscale: 1,
handleStrokeDash: "5,5" handleStrokeDash: "5,5",
}; };
Element.prototype.ftToggleHandles = function(){ Element.prototype.ftToggleHandles = function(){
@ -100,15 +100,14 @@ Snap.plugin(function (Snap, Element, Paper, global) {
var rotateDragger = this.paper.select('#userContent').circle(bb.cx + bb.width/2 + ftOption.handleLength * ftOption.unscale, bb.cy, ftOption.handleRadius * ftOption.unscale ).attr({ fill: ftOption.handleFill }); var rotateDragger = this.paper.select('#userContent').circle(bb.cx + bb.width/2 + ftOption.handleLength * ftOption.unscale, bb.cy, ftOption.handleRadius * ftOption.unscale ).attr({ fill: ftOption.handleFill });
var translateDragger = this.paper.select('#userContent').circle(bb.cx, bb.cy, ftOption.handleRadius * ftOption.unscale).attr({ fill: ftOption.handleFill }); var translateDragger = this.paper.select('#userContent').circle(bb.cx, bb.cy, ftOption.handleRadius * ftOption.unscale).attr({ fill: ftOption.handleFill });
var resizeDragger = this.paper.select('#userContent').circle(bb.cx + bb.width/2, bb.cy - bb.height/2, ftOption.handleRadius * ftOption.unscale).attr({ fill: ftOption.handleFill});
var joinLine = freetransEl.ftDrawJoinLine( rotateDragger, ftOption.handleStrokeWidth * ftOption.unscale); var joinLine = freetransEl.ftDrawJoinLine( rotateDragger, ftOption.handleStrokeWidth * ftOption.unscale);
var handlesGroup = this.paper.select('#userContent').g( joinLine, rotateDragger, translateDragger, resizeDragger ); var handlesGroup = this.paper.select('#userContent').g( joinLine, rotateDragger, translateDragger );
freetransEl.data( "handlesGroup", handlesGroup ); freetransEl.data( "handlesGroup", handlesGroup );
freetransEl.data( "joinLine", joinLine); freetransEl.data( "joinLine", joinLine);
freetransEl.data( "scaleFactor", calcDistance( bb.cx, bb.cy, resizeDragger.attr('cx'), resizeDragger.attr('cy') ) ); freetransEl.data( "scaleFactor", calcDistance( bb.cx, bb.cy, rotateDragger.attr('cx'), rotateDragger.attr('cy') ) );
translateDragger.drag( translateDragger.drag(
elementDragMove.bind( translateDragger, freetransEl ), elementDragMove.bind( translateDragger, freetransEl ),
@ -119,13 +118,6 @@ Snap.plugin(function (Snap, Element, Paper, global) {
freetransEl.unclick(); freetransEl.unclick();
freetransEl.data("click", freetransEl.click( function() { this.ftRemoveHandles() } ) ); freetransEl.data("click", freetransEl.click( function() { this.ftRemoveHandles() } ) );
resizeDragger.drag(
dragHandleResizeMove.bind(resizeDragger,freetransEl),
dragHandleResizeStart.bind(resizeDragger, freetransEl),
dragHandleResizeEnd.bind(resizeDragger, freetransEl)
);
rotateDragger.drag( rotateDragger.drag(
dragHandleRotateMove.bind( rotateDragger, freetransEl ), dragHandleRotateMove.bind( rotateDragger, freetransEl ),
dragHandleRotateStart.bind( rotateDragger, freetransEl ), dragHandleRotateStart.bind( rotateDragger, freetransEl ),
@ -215,9 +207,8 @@ Snap.plugin(function (Snap, Element, Paper, global) {
// transformed bbox // transformed bbox
this.data("bbT", this.paper.rect( rectObjFromBB( this.getBBox(1) ) ) this.data("bbT", this.paper.rect( rectObjFromBB( this.getBBox(1) ) )
.attr({ fill: "none", 'vector-effect': "non-scaling-stroke", stroke: ftOption.handleFill, strokeWidth: ftOption.handleStrokeWidth, strokeDasharray: ftOption.handleStrokeDashPreset.join(',') }) .attr({ fill: "none", stroke: ftOption.handleFill, strokeWidth: ftOption.handleStrokeWidth, strokeDasharray: ftOption.handleStrokeDashPreset.join(',') })
.transform( this.transform().global.toString() ) ); .transform( this.transform().global.toString() ) );
// outer bbox // outer bbox
this.data("bb", this.paper.select('#userContent').rect( rectObjFromBB( this.getBBox() ) ) this.data("bb", this.paper.select('#userContent').rect( rectObjFromBB( this.getBBox() ) )
.attr({ fill: "none", stroke: 'gray', strokeWidth: ftOption.handleStrokeWidth, strokeDasharray: ftOption.handleStrokeDash }) ); .attr({ fill: "none", stroke: 'gray', strokeWidth: ftOption.handleStrokeWidth, strokeDasharray: ftOption.handleStrokeDash }) );
@ -290,34 +281,6 @@ Snap.plugin(function (Snap, Element, Paper, global) {
function elementDragEnd( mainEl, dx, dy, x, y ) { function elementDragEnd( mainEl, dx, dy, x, y ) {
}; };
function dragHandleResizeStart( mainElement ) {
this.ftStoreStartCenter();
};
function dragHandleResizeEnd( mainElement ) {
};
function dragHandleResizeMove( mainEl, dx, dy, x, y, event){
var handle = this;
var mainBB = mainEl.getBBox();
var unscale = mainEl.data('unscale');
//todo was ist ocx
handle.attr({ cx:+handle.data('ocx') + dx*unscale, cy: +handle.data('ocy')+dy*unscale});
var distance = calcDistance(mainBB.cx,mainBB.cy,handle.attr('cx'),handle.attr('cy'));
var scale = distance / mainEl.data("scaleFactor");
if(event.shiftKey){
scale = Math.round(scale*4) / 4;
}
mainEl.data("scale", scale );
mainEl.ftUpdateTransform();
};
function dragHandleRotateStart( mainElement ) { function dragHandleRotateStart( mainElement ) {
this.ftStoreStartCenter(); this.ftStoreStartCenter();
}; };
@ -334,12 +297,19 @@ Snap.plugin(function (Snap, Element, Paper, global) {
if(!mainEl.data('block_rotation')){ if(!mainEl.data('block_rotation')){
var angle = Snap.angle( mainBB.cx, mainBB.cy, handle.attr('cx'), handle.attr('cy') ) - 180; var angle = Snap.angle( mainBB.cx, mainBB.cy, handle.attr('cx'), handle.attr('cy') ) - 180;
if(event.shiftKey){ //enable block rotation if(event.shiftKey){
angle = Math.round(angle/30) * 30; angle = Math.round(angle/30) * 30;
} }
mainEl.data("angle", angle ); mainEl.data("angle", angle );
} }
var distance = calcDistance( mainBB.cx, mainBB.cy, handle.attr('cx'), handle.attr('cy') );
var scale = distance / mainEl.data("scaleFactor");
if(event.shiftKey){
scale = Math.round(scale*4) / 4;
}
mainEl.data("scale", scale );
mainEl.ftUpdateTransform(); mainEl.ftUpdateTransform();
mainEl.ftDrawJoinLine( handle ); mainEl.ftDrawJoinLine( handle );
}; };

View file

@ -30,14 +30,15 @@ Snap.plugin(function (Snap, Element, Paper, global) {
*/ */
Element.prototype.bake = function (toCubics, dec) { Element.prototype.bake = function (toCubics, dec) {
var elem = this; var elem = this;
if (!elem || !elem.paper) // don't handle unplaced elements. this causes double handling.
if (!elem || !elem.paper || elem.type !== "text" || elem.type !== "#text" || elem.type !== "tspan"){
return; return;
} // don't handle unplaced elements. this causes double handling.
if (typeof (toCubics) === 'undefined') if (typeof (toCubics) === 'undefined')
toCubics = false; toCubics = false;
if (typeof (dec) === 'undefined') if (typeof (dec) === 'undefined')
dec = 5; dec = 5;
//var children = elem.selectAll('*')
var children = elem.children(); var children = elem.children();
if (children.length > 0) { if (children.length > 0) {
for (var i = 0; i < children.length; i++) { for (var i = 0; i < children.length; i++) {
@ -54,14 +55,15 @@ Snap.plugin(function (Snap, Element, Paper, global) {
elem.type !== "polygon" && elem.type !== "polygon" &&
elem.type !== "polyline" && elem.type !== "polyline" &&
elem.type !== "image" && elem.type !== "image" &&
elem.type !== "path"){ elem.type !== "path" &&
elem.type !== "text" &&
// if(elem.type !== 'g' && elem.type !== 'desc' && elem.type !== 'defs') elem.type !== "tspan" &&
// console.log('skipping unsupported element ', elem.type); elem.type !== "#text"){
return; return;
} }
if (elem.type == 'image'){
if (elem.type == 'image' || elem.type == "text" || elem.type == "#text"){
// TODO ... // TODO ...
var x = parseFloat(elem.attr('x')), var x = parseFloat(elem.attr('x')),
y = parseFloat(elem.attr('y')), y = parseFloat(elem.attr('y')),
@ -89,7 +91,6 @@ Snap.plugin(function (Snap, Element, Paper, global) {
return; return;
} }
//if(elem.type !== 'path') console.log("bake: converting " + elem.type + " to path");
var path_elem = elem.convertToPath(); var path_elem = elem.convertToPath();
if (!path_elem || path_elem.attr('d') === '' || path_elem.attr('d') === null) if (!path_elem || path_elem.attr('d') === '' || path_elem.attr('d') === null)
@ -438,6 +439,19 @@ Snap.plugin(function (Snap, Element, Paper, global) {
// Possibly the cubed root of 6, but 1.81 works best // Possibly the cubed root of 6, but 1.81 works best
var num = 1.81; var num = 1.81;
var tag = old_element.type; var tag = old_element.type;
var convertMMtoPixel = function (val) {
attrList = ['rx','ry','r','cx','cy','x1','x2','y1','y2','x','y','width','height'];
for(var attrIdx in attrList) {
if(val.attr(attrList[attrIdx]) != null && val.attr(attrList[attrIdx]).indexOf('mm') > -1) {
var tmp = parseFloat(val.attr(attrList[attrIdx])) * 3.5433;
val.attr(attrList[attrIdx], tmp);
}
}
}
convertMMtoPixel(old_element);
switch (tag) { switch (tag) {
case 'ellipse': case 'ellipse':
case 'circle': case 'circle':

View file

@ -50,7 +50,7 @@ Snap.plugin(function (Snap, Element, Paper, global) {
} }
} }
} else { } else {
if(elem.type === 'image'){ if(elem.type === 'image' || elem.type === "text" || elem.type === "#text"){
selection.push(elem); selection.push(elem);
} else { } else {
if(fillPaths && elem.is_filled()){ if(fillPaths && elem.is_filled()){
@ -74,7 +74,10 @@ Snap.plugin(function (Snap, Element, Paper, global) {
elem.type !== "line" && elem.type !== "line" &&
elem.type !== "polygon" && elem.type !== "polygon" &&
elem.type !== "polyline" && elem.type !== "polyline" &&
elem.type !== "path" ){ elem.type !== "path" //&&
// elem.type !== "text" &&
// elem.type !== "#text"
){
return false; return false;
} }
@ -121,7 +124,7 @@ Snap.plugin(function (Snap, Element, Paper, global) {
// get svg as dataUrl // get svg as dataUrl
var svgStr = elem.outerSVG(); var svgStr = elem.outerSVG();
var svgDataUri = 'data:image/svg+xml;base64,' + window.btoa(svgStr); var svgDataUri = 'data:image/svg+xml;base64,' + window.btoa(unescape(encodeURIComponent(svgStr))); //deprecated unescape needed!
var source = new Image(); var source = new Image();
source.src = svgDataUri; source.src = svgDataUri;

View file

@ -107,6 +107,7 @@ $(function(){
self.clear = function(){ self.clear = function(){
snap.selectAll('#userContent>*').remove(); snap.selectAll('#userContent>*').remove();
snap.selectAll('#placedGcodes>*').remove(); snap.selectAll('#placedGcodes>*').remove();
snap.selectAll('rect:not(#coordGrid)').remove();
self.placedDesigns([]); self.placedDesigns([]);
}; };
@ -132,13 +133,14 @@ $(function(){
}; };
self.getXYCoord = function(evt){ self.getXYCoord = function(evt){
if(isFirefox) { if(/firefox/.test(navigator.userAgent.toLowerCase())) {
var scale = evt.target.parentElement.transform.baseVal[0].matrix.a; var scale = evt.target.parentElement.transform.baseVal[0].matrix.a;
var x = self.px2mm(evt.offsetX) * scale; var x = self.px2mm(evt.offsetX) * scale;
var y = self.px2mm(parseFloat(evt.target.attributes.height.value) - evt.offsetY) * scale; var y = self.px2mm(parseFloat(evt.target.attributes.height.value) - evt.offsetY) * scale;
} else { } else
{
var x = self.px2mm(evt.offsetX); var x = self.px2mm(evt.offsetX);
var y = self.px2mm(evt.target.ownerSVGElement.getBoundingClientRect().height - evt.offsetY); // hopefully this works across browsers var y = self.px2mm(parseFloat(evt.target.farthestViewportElement.clientHeight) - evt.offsetY);
} }
x = Math.min(x, self.workingAreaWidthMM()); x = Math.min(x, self.workingAreaWidthMM());
y = Math.min(y, self.workingAreaHeightMM()); y = Math.min(y, self.workingAreaHeightMM());
@ -241,11 +243,26 @@ $(function(){
var url = self._getSVGserveUrl(file); var url = self._getSVGserveUrl(file);
callback = function (f) { callback = function (f) {
var newSvgAttrs = {}; var newSvgAttrs = {};
var root_attrs = f.select('svg').node.attributes; if(f.select('svg') == null){
root_attrs = f.node.attributes;
} else {
var root_attrs = f.select('svg').node.attributes;
}
var doc_width = null; var doc_width = null;
var doc_height = null; var doc_height = null;
var doc_viewbox = null; var doc_viewbox = null;
// find clippath elements
var clipPathEl = f.selectAll('clipPath');
if(clipPathEl.length != 0){
console.warn("Warning: removed unsupported clipPath element in SVG");
self.svg_contains_clipPath_warning();
clipPathEl.remove()
}
// find all elements with "display=none" and remove them
f.selectAll("[display=none]").remove()
// iterate svg tag attributes // iterate svg tag attributes
for(var i = 0; i < root_attrs.length; i++){ for(var i = 0; i < root_attrs.length; i++){
var attr = root_attrs[i]; var attr = root_attrs[i];
@ -261,9 +278,19 @@ $(function(){
} }
} }
// find Illustrator comment and notify
f.node.childNodes.forEach(function(entry) {
if(entry.nodeType == 8) { // Nodetype 8 = comment
if(entry.textContent.indexOf('Illustrator') > -1) {
new PNotify({title: gettext("Illustrator SVG Detected"), text: "Illustrator SVG detected! To preserve coorect scale, please go to the \'Settings\' menu and change the \'SVG dpi\' field under \'Plugins/Svg Conversion\' according to your file. And add it again.", type: "info", hide: false});
}
}
});
// scale matrix // scale matrix
var mat = self.getDocumentViewBoxMatrix(doc_width, doc_height, doc_viewbox); var mat = self.getDocumentViewBoxMatrix(doc_width, doc_height, doc_viewbox);
var scaleMatrixStr = new Snap.Matrix(mat[0][0],mat[0][1],mat[1][0],mat[1][1],mat[0][2],mat[1][2]).toTransformString(); var dpiscale = 90 / self.settings.settings.plugins.svgtogcode.svgDPI();
var scaleMatrixStr = new Snap.Matrix(mat[0][0],mat[0][1],mat[1][0],mat[1][1],mat[0][2],mat[1][2]).scale(dpiscale).toTransformString();
newSvgAttrs['transform'] = scaleMatrixStr; newSvgAttrs['transform'] = scaleMatrixStr;
var newSvg = snap.group(f.selectAll("svg>*")); var newSvg = snap.group(f.selectAll("svg>*"));
@ -389,8 +416,20 @@ $(function(){
}; };
}; };
self.svg_contains_clipPath_warning = function(){
var error = "<p>" + gettext("The SVG file contains clipPath elements.<br/>clipPath is not supported yet and has been removed from file.") + "</p>";
//error += pnotifyAdditionalInfo("<pre>" + data.jqXHR.responseText + "</pre>");
new PNotify({
title: "clipPath elements removed",
text: error,
type: "warn",
hide: false
});
};
self.svg_contains_text_warning = function(svg){ self.svg_contains_text_warning = function(svg){
var error = "<p>" + gettext("The svg file contains text elements.<br/>Please convert them to paths.<br/>Otherwise they will be ignored.") + "</p>"; var error = "<p>" + gettext("The SVG file contains text elements.<br/>If you want to laser just their outlines,<br/>please convert them to paths.<br/>Otherwise they will be engraved with infill.") + "</p>";
//error += pnotifyAdditionalInfo("<pre>" + data.jqXHR.responseText + "</pre>"); //error += pnotifyAdditionalInfo("<pre>" + data.jqXHR.responseText + "</pre>");
new PNotify({ new PNotify({
title: "Text elements found", title: "Text elements found",
@ -398,7 +437,6 @@ $(function(){
type: "warn", type: "warn",
hide: false hide: false
}); });
svg.selectAll('text,tspan').remove();
}; };
self.svg_misfitting_warning = function(svg, misfitting){ self.svg_misfitting_warning = function(svg, misfitting){
@ -704,6 +742,16 @@ $(function(){
return snap.selectAll("#userContent image"); return snap.selectAll("#userContent image");
}; };
self.hasTextItems = function () {
if(snap.selectAll("#userContent tspan").length > 0 ||
snap.selectAll("#userContent text").length > 0 ||
snap.selectAll("userContent #text").length > 0) {
return true
}else{
return false
}
};
self.getPlacedGcodes = ko.computed(function() { self.getPlacedGcodes = ko.computed(function() {
var gcodeFiles = []; var gcodeFiles = [];
ko.utils.arrayForEach(self.placedDesigns(), function(design) { ko.utils.arrayForEach(self.placedDesigns(), function(design) {
@ -826,7 +874,7 @@ $(function(){
for (var i = 0; i < fillings.length; i++) { for (var i = 0; i < fillings.length; i++) {
var item = fillings[i]; var item = fillings[i];
if (item.type === 'image') { if (item.type === 'image' || item.type === "text" || item.type === "#text") {
// remove filter effects on images for proper rendering // remove filter effects on images for proper rendering
var style = item.attr('style'); var style = item.attr('style');
if (style !== null) { if (style !== null) {

View file

@ -331,7 +331,7 @@ class Printer(PrinterInterface, comm.MachineComPrintCallback):
def position(self, x, y): def position(self, x, y):
printer_profile = self._printerProfileManager.get_current_or_default() printer_profile = self._printerProfileManager.get_current_or_default()
movement_speed = min(printer_profile["axes"]["x"]["speed"], printer_profile["axes"]["y"]["speed"]) movement_speed = min(printer_profile["axes"]["x"]["speed"], printer_profile["axes"]["y"]["speed"])
self.commands(["G90", "G0 X%.3f Y%.3f F%d" % (x, y, movement_speed), "?"]) self.commands(["G90", "G0 X%.3f Y%.3f F%d" % (x, y, movement_speed)])
def _convert_rate_value(self, factor, min=0, max=200): def _convert_rate_value(self, factor, min=0, max=200):
if not isinstance(factor, (int, float, long)): if not isinstance(factor, (int, float, long)):

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

View file

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title data-bind="text: title">Mr Beam</title> <title data-bind="text: title">Mr Draw</title>
<link rel="shortcut icon" href="{{ url_for('static', filename='img/favicon.png') }}"> <link rel="shortcut icon" href="{{ url_for('static', filename='img/favicon.png') }}">
<link rel="apple-touch-icon" sizes="114x114" href="{{ url_for('static', filename='img/apple-touch-icon-114x114.png') }}"> <link rel="apple-touch-icon" sizes="114x114" href="{{ url_for('static', filename='img/apple-touch-icon-114x114.png') }}">
@ -16,7 +16,7 @@
<div class="container"> <div class="container">
<div class="navbar-header brand" style="min-width: 272px;"> <div class="navbar-header brand" style="min-width: 272px;">
<a class="navbar-brand" href="#"> <a class="navbar-brand" href="#">
<img alt="Mr Beam Logo" src="{{ url_for('static', filename='img/mr-typo-red_x120.png') }}"> <img alt="Mr Draw Logo" src="{{ url_for('static', filename='img/mr-draw-red_x120.png') }}">
</a> </a>
</div> </div>
<!-- Navbar --> <!-- Navbar -->
@ -58,7 +58,7 @@
<div id="control" class="accordion-inner" data-bind="visible: isReady() || isLocked() || isFlashing()"> <div id="control" class="accordion-inner" data-bind="visible: isReady() || isLocked() || isFlashing()">
<div data-bind="visible: isLocked "> <div data-bind="visible: isLocked ">
Mr Beam is in a locked state as it does not know its position. Mr Draw is in a locked state as it does not know its position.
First remove any objects blocking the gantry's travel range. First remove any objects blocking the gantry's travel range.
Then do a homing cycle. Then do a homing cycle.
<div style='text-align: center; padding:.5em;'> <div style='text-align: center; padding:.5em;'>
@ -657,12 +657,10 @@
<div class="span4"> <div class="span4">
<ul class="focus_steps"> <ul class="focus_steps">
<li>1. Place your material on the working area</li> <li>1. Place your material on the working area</li>
<li>2. Move the laser over the material</li> <li>2. Move the pen over the material</li>
<li>3. Put on your safety glasses</li> <li>&RightArrow; Now enable the pen calibration mode</li>
<li>4. Turn the laser safety switch to on</li> <li>5. Adjust the pen until it touches the paper</li>
<li>&RightArrow; Now enable the focus mode</li> <li>&RightArrow; Disable the pen calibration mode. </li>
<li>5. Adjust the focus until the laser beam is as small as possible</li>
<li>&RightArrow; Disable the focus mode. </li>
</ul> </ul>
<div style="text-align:center"> <div style="text-align:center">
<div class="btn-group" role="group" aria-label="focus mode control" style=""> <div class="btn-group" role="group" aria-label="focus mode control" style="">

View file

@ -88,7 +88,7 @@ class MachineCom(object):
self._finished_passes = 0 self._finished_passes = 0
# regular expressions # regular expressions
self._regex_command = re.compile("^\s*\$?([GM]\d+|[TH])") self._regex_command = re.compile("^\s*\$?([GM]\d+|[THX])")
self._regex_feedrate = re.compile("F\d+", re.IGNORECASE) self._regex_feedrate = re.compile("F\d+", re.IGNORECASE)
self._regex_intensity = re.compile("S\d+", re.IGNORECASE) self._regex_intensity = re.compile("S\d+", re.IGNORECASE)
@ -147,7 +147,7 @@ class MachineCom(object):
elif line.startswith('['): # feedback message elif line.startswith('['): # feedback message
self._handle_feedback_message(line) self._handle_feedback_message(line)
elif line.startswith('Grb'): # Grbl startup message elif line.startswith('Grb'): # Grbl startup message
self._handle_startup_message() self._handle_startup_message(line)
except: except:
self._logger.exception("Something crashed inside the monitoring loop, please report this to Mr. Beam") self._logger.exception("Something crashed inside the monitoring loop, please report this to Mr. Beam")
errorMsg = "See octoprint.log for details" errorMsg = "See octoprint.log for details"
@ -405,7 +405,7 @@ class MachineCom(object):
elif line[1:].startswith('Dis'): # [Disabled] elif line[1:].startswith('Dis'): # [Disabled]
pass pass
def _handle_startup_message(self): def _handle_startup_message(self, line):
if self.isOperational(): if self.isOperational():
errorMsg = "Machine reset." errorMsg = "Machine reset."
self._cmd = None self._cmd = None
@ -420,7 +420,14 @@ class MachineCom(object):
self._changeState(self.STATE_LOCKED) self._changeState(self.STATE_LOCKED)
eventManager().fire(Events.ERROR, {"error": self.getErrorString()}) eventManager().fire(Events.ERROR, {"error": self.getErrorString()})
else: else:
self._onConnected(self.STATE_LOCKED) versionMatch = re.search("Grbl (?P<grbl>.+?)(_(?P<git>[0-9a-f]{7})(?P<dirty>-dirty)?)? \[.+\]", line)
if versionMatch:
versionDict = versionMatch.groupdict()
self._writeGrblVersionToFile(versionDict)
if self._compareGrblVersion(versionDict) is False:
self._flashGrbl()
else:
self._onConnected(self.STATE_LOCKED)
def _update_grbl_pos(self, line): def _update_grbl_pos(self, line):
# line example: # line example:
@ -611,7 +618,7 @@ class MachineCom(object):
params = ["avrdude", "-patmega328p", "-carduino", "-b" + str(self._baudrate), "-P" + str(self._port), "-D", "-Uflash:w:" + pathToGrblHex] params = ["avrdude", "-patmega328p", "-carduino", "-b" + str(self._baudrate), "-P" + str(self._port), "-D", "-Uflash:w:" + pathToGrblHex]
rc = subprocesscall(params) rc = subprocesscall(params)
if rc is False: if rc == 0:
self._log("successfully flashed new grbl version") self._log("successfully flashed new grbl version")
self._openSerial() self._openSerial()
self._changeState(self.STATE_CONNECTING) self._changeState(self.STATE_CONNECTING)
@ -748,6 +755,10 @@ class MachineCom(object):
self._changeState(self.STATE_HOMING) self._changeState(self.STATE_HOMING)
return cmd return cmd
def _gcode_X_sent(self, cmd, cmd_type=None):
self._changeState(self.STATE_HOMING) # TODO: maybe change to seperate $X mode
return cmd
def _gcode_Hold_sent(self, cmd, cmd_type=None): def _gcode_Hold_sent(self, cmd, cmd_type=None):
self._changeState(self.STATE_PAUSED) self._changeState(self.STATE_PAUSED)
return cmd return cmd
@ -1158,6 +1169,9 @@ class PrintingGcodeFileInformation(PrintingFileInformation):
if not os.path.exists(self._filename) or not os.path.isfile(self._filename): if not os.path.exists(self._filename) or not os.path.isfile(self._filename):
raise IOError("File %s does not exist" % self._filename) raise IOError("File %s does not exist" % self._filename)
self._stripCommments()
self._size = os.stat(self._filename).st_size self._size = os.stat(self._filename).st_size
self._pos = 0 self._pos = 0
@ -1211,6 +1225,16 @@ class PrintingGcodeFileInformation(PrintingFileInformation):
self._logger.exception("Exception while processing line") self._logger.exception("Exception while processing line")
raise e raise e
def _stripCommments(self):
dir = os.path.dirname(os.path.abspath(self._filename))
tmpfile = open(dir + '/gcode.tmp', 'w')
with open(self._filename, "r") as fileobject:
for line in fileobject:
if process_gcode_line(line) is not None:
tmpfile.write(line)
tmpfile.close()
self._filename = dir + '/gcode.tmp'
def convert_pause_triggers(configured_triggers): def convert_pause_triggers(configured_triggers):
triggers = { triggers = {
"enable": [], "enable": [],
@ -1275,6 +1299,7 @@ def serialList():
baselist = baselist \ baselist = baselist \
+ glob.glob("/dev/ttyUSB*") \ + glob.glob("/dev/ttyUSB*") \
+ glob.glob("/dev/ttyACM*") \ + glob.glob("/dev/ttyACM*") \
+ glob.glob("/dev/ttyAMA*") \
+ glob.glob("/dev/tty.usb*") \ + glob.glob("/dev/tty.usb*") \
+ glob.glob("/dev/cu.*") \ + glob.glob("/dev/cu.*") \
+ glob.glob("/dev/cuaU*") \ + glob.glob("/dev/cuaU*") \