first working version of infill

This commit is contained in:
Teja 2015-10-13 15:57:51 +02:00
parent fec89b70f4
commit 70b97bbca9
3 changed files with 108 additions and 83 deletions

View file

@ -76,30 +76,32 @@ $(function(){
// shows conversion dialog and extracts svg first
self.show_conversion_dialog = function() {
self.svg = self.workingArea.getCompositionSVG();
self.gcodeFilesToAppend = self.workingArea.getPlacedGcodes();
self.show_image_parameters(self.workingArea.getPlacedImages().length > 0);
self.show_vector_parameters(self.workingArea.getPlacedSvgs().length > 0);
if(self.svg !== undefined){
if(self.laserIntensity() === undefined){
var intensity = self.settings.settings.plugins.svgtogcode.defaultIntensity();
self.laserIntensity(intensity);
}
if(self.laserSpeed() === undefined){
var speed = self.settings.settings.plugins.svgtogcode.defaultFeedrate();
self.laserSpeed(speed);
}
self.workingArea.getCompositionSVG(function(composition){
self.svg = composition;
self.gcodeFilesToAppend = self.workingArea.getPlacedGcodes();
self.show_image_parameters(self.workingArea.getPlacedImages().length > 0);
self.show_vector_parameters(self.workingArea.getPlacedSvgs().length > 0);
var gcodeFile = self.create_gcode_filename(self.workingArea.placedDesigns());
self.gcodeFilename(gcodeFile);
self.title(gettext("Converting"));
$("#dialog_vector_graphics_conversion").modal("show"); // calls self.convert() afterwards
} else {
// just gcodes were placed. Start lasering right away.
self.convert();
}
if(self.svg !== undefined){
if(self.laserIntensity() === undefined){
var intensity = self.settings.settings.plugins.svgtogcode.defaultIntensity();
self.laserIntensity(intensity);
}
if(self.laserSpeed() === undefined){
var speed = self.settings.settings.plugins.svgtogcode.defaultFeedrate();
self.laserSpeed(speed);
}
var gcodeFile = self.create_gcode_filename(self.workingArea.placedDesigns());
self.gcodeFilename(gcodeFile);
self.title(gettext("Converting"));
$("#dialog_vector_graphics_conversion").modal("show"); // calls self.convert() afterwards
} else {
// just gcodes were placed. Start lasering right away.
self.convert();
}
});
};
self.create_gcode_filename = function(placedDesigns){

View file

@ -1,4 +1,4 @@
// render_fills - a snapsvg.io plugin to render fills of svg files into a bitmap.
// render_fills.js - a snapsvg.io plugin to render the infill of svg files into a bitmap.
// Copyright (C) 2015 Teja Philipp <osd@tejaphilipp.de>
//
// based on work by http://davidwalsh.name/convert-canvas-image
@ -91,7 +91,7 @@ Snap.plugin(function (Snap, Element, Paper, global) {
return false;
};
Element.prototype.embedImage = function(){
Element.prototype.embedImage = function(callback){
var elem = this;
if(elem.type !== 'image') return;
@ -107,7 +107,10 @@ Snap.plugin(function (Snap, Element, Paper, global) {
var dataUrl = canvas.toDataURL('image/png');
elem.attr('href', dataUrl);
canvas.remove();
console.log('embedded img');
if(typeof callback === 'function'){
callback(elem.attr('id'));
console.log('embedded img');
}
};
image.src = url;
@ -152,58 +155,6 @@ Snap.plugin(function (Snap, Element, Paper, global) {
});
_renderInfill = function (wMM, hMM, pxPerMM, callback) {
// TODO abort transformations
$('#tmpSvg').remove();
snap.selectAll('#fillRendering').remove();
var wPT = wMM * 90/25.4;
var hPT = hMM * 90/25.4;
var tmpSvg = Snap(wPT,hPT);
tmpSvg.attr('id', 'tmpSvg');
// get filled
var userContent = snap.select("#userContent").clone();
tmpSvg.append(userContent);
userContent.bake();
var fillings = userContent.removeUnfilled();
for (var i = 0; i < fillings.length; i++) {
var item = fillings[i];
if(item.type === 'image'){
var style = item.attr('style');
if(style !== null){
var strippedFilters = style.replace(/filter.+?;/, '');
item.attr('style', strippedFilters);
}
// TODO embed Image callbacks!!
item.embedImage();
} else {
item.attr('fill', '#ff0000');
item.attr('stroke', 'none');
}
}
var cb;
if(typeof callback === 'function'){
cb = callback;
} else {
cb = function(result){
var waBB = snap.select('#coordGrid').getBBox();
_check_fill(result, waBB.w, waBB.h);
$('#tmpSvg').remove();
};
}
tmpSvg.renderPNG(wMM, hMM, pxPerMM, cb);
};
_check_fill = function(imgDataUrl, w, h){
var fillImage = snap.image(imgDataUrl, 0, 0, w, h);
fillImage.attr('id', 'fillRendering');
snap.select("#userContent").prepend(fillImage);
};

View file

@ -623,10 +623,12 @@ $(function(){
self.check_sizes_and_placements();
};
self.getCompositionSVG = function(){
self.getCompositionSVG = function(callback){
self.abortFreeTransforms();
var tmpsvg = snap.select("#userContent").innerSVG(); // get working area
return self._wrapInSvgAndScale(tmpsvg);
self.renderInfill(self.workingAreaWidthMM(), self.workingAreaHeightMM(), 10, function(){
var tmpsvg = snap.select("#userContent").innerSVG(); // get working area
callback( self._wrapInSvgAndScale(tmpsvg));
});
};
self._wrapInSvgAndScale = function(content){
@ -685,8 +687,9 @@ $(function(){
self.draw_gcode_img_placeholder = function(x,y,w,h,url, target){
var i = snap.rect(x,y,w,h).attr({
stroke: '#AA0000',
'stroke-width': 1
stroke: '#AAAAAA',
'stroke-width': 1,
fill: 'none'
});
snap.select(target).append(i);
if(url !== ""){
@ -735,6 +738,75 @@ $(function(){
}
});
};
self._embedAllImages = function(svg, callback){
var allImages = svg.selectAll('image');
var linkedImages = allImages.items.filter(function(i){ return !i.attr('href').startsWith('data:') });
if(linkedImages.length > 0){
var callbackCounter = linkedImages.length;
for (var i = 0; i < linkedImages.length; i++) {
var img = linkedImages[i];
img.embedImage(function(){
callbackCounter--;
if(callbackCounter === 0 && typeof callback === 'function'){
callback();
}
});
}
} else {
// callback if nothing to embed
if(typeof callback === 'function'){
callback();
}
}
}
self.renderInfill = function (wMM, hMM, pxPerMM, callback) {
self.abortFreeTransforms();
// $('#tmpSvg').remove();
// snap.selectAll('#fillRendering').remove();
var wPT = wMM * 90 / 25.4;
var hPT = hMM * 90 / 25.4;
var tmpSvg = Snap(wPT, hPT);
tmpSvg.attr('id', 'tmpSvg');
// get filled
var userContent = snap.select("#userContent").clone();
tmpSvg.append(userContent);
userContent.bake();
self._embedAllImages(tmpSvg, function(){
var fillings = userContent.removeUnfilled();
for (var i = 0; i < fillings.length; i++) {
var item = fillings[i];
if (item.type === 'image') {
var style = item.attr('style');
if (style !== null) {
var strippedFilters = style.replace(/filter.+?;/, '');
item.attr('style', strippedFilters);
}
} else {
item.attr('fill', '#ff0000');
item.attr('stroke', 'none');
}
}
var cb = function (result) {
var waBB = snap.select('#coordGrid').getBBox();
var fillImage = snap.image(result, 0, 0, waBB.w, waBB.h);
fillImage.attr('id', 'fillRendering');
snap.select("#userContent").prepend(fillImage);
$('#tmpSvg').remove();
if (typeof callback === 'function') {
callback();
}
};
tmpSvg.renderPNG(wMM, hMM, pxPerMM, cb);
});
};
self.onBeforeBinding = function(){
self.files.workingArea = self;