Commit 00e0a48c authored by Amanda Ghassaei's avatar Amanda Ghassaei
Browse files

adding in custom gcode functions

parent 63a60e33
......@@ -2,8 +2,8 @@
* Created by aghassaei on 5/28/15.
*/
define(['underscore', 'appState', 'lattice', 'stlLoader', 'threeModel', 'cam', 'component', 'stockComponent'],
function(_, appState, lattice, THREE, three, cam, Component, StockComponent){
define(['underscore', 'appState', 'lattice', 'stlLoader', 'threeModel', 'cam', 'component', 'stockComponent', 'assemblerPost'],
function(_, appState, lattice, THREE, three, cam, Component, StockComponent, AssemblerPostMethods){
var assemblerMaterial = new THREE.MeshLambertMaterial({color:0xaaaaaa, shading: THREE.FlatShading, transparent:true, opacity:0.3});
var stlLoader = new THREE.STLLoader();
......@@ -19,16 +19,6 @@ define(['underscore', 'appState', 'lattice', 'stlLoader', 'threeModel', 'cam', '
this.camProcesses = json.camProcesses;
this.numMaterials = json.numMaterials;
this.customHeader = json.customHeader || function(settings){
return "";
};
this.customFooter = json.customFooter || function(){};
this.customHome = json.customHome || function(){};
this.customPickUpStock = json.customPickUpStock || function(){};
this.customPlacePart = json.customPlacePart || function(){};
this.customFunctionsContext = {
clearHeight: 8
};
this.object3D = new THREE.Object3D();
three.sceneAdd(this.object3D);
......@@ -43,7 +33,10 @@ define(['underscore', 'appState', 'lattice', 'stlLoader', 'threeModel', 'cam', '
this.setVisibility(cam.isVisible());
three.render();
AssemblerPostMethods.call(this, id, json);//needed to separate this for now
}
Assembler.prototype = Object.create(AssemblerPostMethods.prototype);
Assembler.prototype.getID = function(){
return this.id;
......@@ -183,139 +176,7 @@ define(['underscore', 'appState', 'lattice', 'stlLoader', 'threeModel', 'cam', '
return tree;
};
//post process
Assembler.prototype.postProcess = function(settings, exporter){
_.each(this.components, function(component){
component.postReset();
});
var data = "";
data += exporter.makeHeader(settings);
data += this._makeHeader(settings, exporter);
data += "\n\n";
data += exporter.addComment("begin program");
data += "\n";
data += this._postProcessCells(settings, exporter);
data += "\n\n";
data += exporter.addComment("end program");
data += "\n";
data += exporter.makeFooter(settings);
return data;
};
Assembler.prototype._makeHeader = function(settings, exporter){
var data = this.customHeader(settings);
data += this.home(exporter, settings);
return data;
};
Assembler.prototype.home = function(exporter, settings){
// this.components.zAxis.postMoveTo(settings.rapidHeight*settings*scale);
return exporter.goHome(settings);
};
Assembler.prototype._postProcessCells = function(settings, exporter){
var data = "";
var self = this;
var lastIndex = null;
lattice.rasterCells(cam._getOrder(cam.get("camStrategy")), function(cell){
if (!cell) return;
var cellPosition = cell.getAbsolutePosition().multiplyScalar(settings.scale);
var cellIndex = cell.getAbsoluteIndex();
if (!self.shouldPickUpStock){
data += self._postGetStock(cellIndex, lastIndex, cellPosition, cell.materialName, settings, exporter);
} else {
// var thisStockPosition = _.clone(stockPosition);
// if (multStockPositions) {
// thisStockPosition.x += stockNum % stockArraySize.y * stockSeparation;
// thisStockPosition.y -= Math.floor(stockNum / stockArraySize.y) * stockSeparation;
// stockNum += 1;
// if (stockNum >= stockArraySize.x * stockArraySize.y) stockNum = 0;
// }
// data += self._postMoveXY(exporter, stockPosition.x-wcs.x, stockPosition.y-wcs.y);
// data += self._postMoveToStock(exporter, thisStockPosition, rapidHeight, wcs, safeHeight);
}
data += self._postReleaseStock(cellIndex, cellPosition, cell.materialName, settings, exporter);
data += "\n";
lastIndex = cellIndex.clone();
});
return data;
};
Assembler.prototype._postMoveXY = function(position, settings, exporter){
position = this.components.zAxis.applyAbsoluteRotation(position);
return exporter.rapidXY(position, settings);
};
// Assembler.prototype._postMoveToStock = function(exporter, stockPosition, rapidHeight, wcs, safeHeight){
// var data = "";
// data += exporter.rapidZ(stockPosition.z-wcs.z+safeHeight);
// data += exporter.moveZ(stockPosition.z-wcs.z);
// data += this._postGetStock(exporter);
// data += exporter.moveZ(stockPosition.z-wcs.z+safeHeight);
// data += exporter.rapidZ(rapidHeight);
// return data;
// };
Assembler.prototype._postGetStock = function(index, lastIndex, position, material, settings, exporter){
var data = "";
if (lastIndex === null || (lastIndex.z-index.z)%2 != 0){
data += exporter.addLine("G0", ["A" + (index.z%2*0.3125).toFixed(4)], "new layer");
data += "\n";
}
data += exporter.addComment("get stock " + JSON.stringify(index));
return data;
};
Assembler.prototype._postReleaseStock = function(index, position, material, settings, exporter){
var data = "";
var stock = _.find(this.stock, function(thisStock){
return thisStock.getMaterial() == material
});
if (stock === undefined) {
console.warn("no stock defined of type " + material + " for this assembler");
return data;
}
position.sub(stock.getPosition().multiplyScalar(settings.scale));
position.sub(settings.originPosition);
data += this._postMoveXY(position.clone(), settings, exporter);
data += exporter.rapidZ(position.z+settings.safeHeight, settings);
data += exporter.moveZ(position.z, settings);
//place part
data += exporter.addComment(JSON.stringify(index));
if (material == "brass") data += exporter.addLine("M3");
else if (material == "fiberGlass") data += exporter.addLine("M4");
data += exporter.addLine("G4", ["P" + 0.75]);
data += exporter.addLine("M5");
data += exporter.moveZ(position.z, settings);
data += exporter.moveZ(position.z+settings.safeHeight, settings);
data += exporter.rapidZ(settings.rapidHeight, settings);
return data;
};
//animation methods
......
/**
* Created by aghassaei on 8/19/15.
*/
define(['underscore', 'appState', 'lattice', 'cam'], function(_, appState, lattice, cam){
function AssemblerPost(id, json){
//settings:
// feedRate: THREE.Vector3
// originPosition: THREE.Vector3
// rapidHeight: 30 - max z height of machine, used when we want to be sure we're clear
// rapidSpeeds: THREE.Vector3
// safeHeight: 4.5 - height above parts where we start to move slowly
// scale: 1.27
// stockPosition: THREE.Vector3
this.customFunctionsContext = {
zClearHeight: 8,//height above part to clear during assembly
zPreload: 0.2,
wait: 0.75,//seconds
blOvershoot: 1.0
};
this.customHeader = function(exporter, settings, context){
var data = "";
data += exporter.setUnits(lattice.get("units"));
data += this.customHome(exporter, settings, context);
return data;
};
this.customFooter = function(exporter, settings, context){
var data = "";
data += this.customHome(exporter, settings, context);
return data;
};
this.customHome = function(exporter, settings, context){
var data = "";
data += exporter.goHome(settings);
return data;
};
this.customPickUpStock = function(exporter, settings, context){//not relevant for your assembler
var data = "";
return data;
};
this.customChangeZLayer = function(currentIndex, lastIndex, exporter, settings, context){
var data = "";
if (lastIndex === null || (currentIndex.z-lastIndex.z)%2 != 0){
data += exporter.addLine("G0", ["A" + (currentIndex.z%2*0.3125).toFixed(4)], "new layer");
data += "\n";
}
return data;
};
this.customMoveXY = function(position, index, exporter, settings, context){
var data = "";
data += exporter.rapidXY(position, settings);
return data;
};
this.customPlacePart = function(position, index, material, exporter, settings, context){
var data = "";
data += exporter.rapidZ(position.z + settings.safeHeight, settings);
data += exporter.moveZ(position.z, settings);
if (material == "brass") data += exporter.addLine("M3");
else if (material == "fiberGlass") data += exporter.addLine("M4");
data += exporter.addComment(JSON.stringify(index));
data += exporter.addLine("G4", ["P" + context.wait]);
data += exporter.addLine("M5");
data += exporter.moveZ(position.z, settings);
data += exporter.moveZ(position.z + settings.safeHeight, settings);
data += exporter.rapidZ(position.z + context.zClearHeight, settings);
return data;
};
}
//post process
AssemblerPost.prototype.postProcess = function(settings, exporter){//called from outside);
var data = "";
data += this.customHeader(exporter, settings, this.customFunctionsContext);
data += exporter.newLine();
data += exporter.newLine();
data += exporter.addComment("begin program");
data += exporter.newLine();
data += this._postProcessCells(exporter, settings, this.customFunctionsContext);
data += exporter.newLine();
data += exporter.newLine();
data += exporter.addComment("end program");
data += exporter.newLine();
data += this.customFooter(exporter, settings, this.customFunctionsContext);
return data;
};
AssemblerPost.prototype._postProcessCells = function(exporter, settings, context){
var data = "";
var self = this;
var lastIndex = null;
lattice.rasterCells(cam._getOrder(cam.get("camStrategy")), function(cell){
if (!cell) return;
var cellPosition = cell.getAbsolutePosition().multiplyScalar(settings.scale);
var cellIndex = cell.getAbsoluteIndex();
if (!self.shouldPickUpStock){
data += self._postGetStock(cellIndex, lastIndex, cellPosition, cell.materialName, settings, exporter, context);
} else {
// var thisStockPosition = _.clone(stockPosition);
// if (multStockPositions) {
// thisStockPosition.x += stockNum % stockArraySize.y * stockSeparation;
// thisStockPosition.y -= Math.floor(stockNum / stockArraySize.y) * stockSeparation;
// stockNum += 1;
// if (stockNum >= stockArraySize.x * stockArraySize.y) stockNum = 0;
// }
// data += self._postMoveXY(exporter, stockPosition.x-wcs.x, stockPosition.y-wcs.y);
// data += self._postMoveToStock(exporter, thisStockPosition, rapidHeight, wcs, safeHeight);
}
data += self._postReleaseStock(cellIndex, cellPosition, cell.materialName, settings, exporter, context);
data += "\n";
lastIndex = cellIndex.clone();
});
return data;
};
// Assembler.prototype._postMoveToStock = function(exporter, stockPosition, rapidHeight, wcs, safeHeight){
// var data = "";
// data += exporter.rapidZ(stockPosition.z-wcs.z+safeHeight);
// data += exporter.moveZ(stockPosition.z-wcs.z);
// data += this._postGetStock(exporter);
// data += exporter.moveZ(stockPosition.z-wcs.z+safeHeight);
// data += exporter.rapidZ(rapidHeight);
// return data;
// };
AssemblerPost.prototype._postGetStock = function(index, lastIndex, position, material, settings, exporter, context){
var data = "";
if (lastIndex === null || lastIndex.z != index.z){
data += this.customChangeZLayer(index, lastIndex, exporter, settings, context)
}
data += exporter.addComment("get stock " + JSON.stringify(index));
return data;
};
AssemblerPost.prototype._postReleaseStock = function(index, position, material, settings, exporter, context){
var data = "";
var stock = _.find(this.stock, function(thisStock){
return thisStock.getMaterial() == material
});
if (stock === undefined) {
console.warn("no stock defined of type " + material + " for this assembler");
return data;
}
position.sub(stock.getPosition().multiplyScalar(settings.scale));
position.sub(settings.originPosition);
data += this.customMoveXY(position.clone(), index.clone(), exporter, settings, context);
data += this.customPlacePart(position, index, material, exporter, settings, context);
return data;
};
return AssemblerPost;
});
\ No newline at end of file
......@@ -10,19 +10,6 @@ define(['underscore', 'cam', 'lattice'], function(_, cam, lattice){
this.animationSpeed = null;
}
GCodeExporter.prototype.makeHeader = function(settings){
var data = "";
if (lattice.get("units") == "inches") data += this.addLine("G20", [], "units inches");
else data += this.addLine("G21", [], "units mm");
// data += this.addLine("G90", [], "absolute positioning");
// data += this.addLine("G54", [], "work offset");
//// data += this.addLine("G49", [], "cancel tool length comp");
// data += this.addLine("G40", [], "cancel tool radius comp");
//// data += this.addLine("M09", [], "coolant off");
// data += this.goHome(settings);
return data;
};
GCodeExporter.prototype.addLine = function(command, params, comment){
var data = "";
data += command + " ";
......@@ -40,9 +27,21 @@ define(['underscore', 'cam', 'lattice'], function(_, cam, lattice){
};
GCodeExporter.prototype._setSpeed = function(speed){
this.postSpeed = speed;
return "F"+ speed + "\n";
};
GCodeExporter.prototype.setUnits = function(units){
if (units == "inches") return this.addLine("G20", [], "units inches");
else if (units == "mm") return this.addLine("G21", [], "units mm");
console.warn("units " + units + " not recognized");
return "";
};
GCodeExporter.prototype.newLine = function(){
return "\n";
};
//GCodeExporter.prototype._rapidXYZ = function(x, y, z){
// return this._goXYZ(x,y,z);
//};
......@@ -59,13 +58,6 @@ define(['underscore', 'cam', 'lattice'], function(_, cam, lattice){
return data + this._goXYZ(null, null, z);
};
GCodeExporter.prototype._goXYZ = function(x, y, z){
if (x !== null) x = "X"+parseFloat(x).toFixed(3);
if (y !== null) y = "Y"+parseFloat(y).toFixed(3);
if (z !== null) z = "Z"+parseFloat(z).toFixed(3);
return this.addLine("G01", [x,y,z]);
};
GCodeExporter.prototype.moveXY = function(x, y, settings){
var data = "";
if (this.postSpeed != settings.feedRate.x) data += this._setSpeed(settings.feedRate.x);
......@@ -78,18 +70,25 @@ define(['underscore', 'cam', 'lattice'], function(_, cam, lattice){
return data + this._goXYZ(null, null, z);
};
GCodeExporter.prototype.goHome = function(settings){
var data = this._setSpeed(settings.rapidSpeeds.z);
return data + this._goXYZ(0,0,settings.rapidHeight);
GCodeExporter.prototype._goXYZ = function(x, y, z){
if (x !== null) x = "X"+parseFloat(x).toFixed(3);
if (y !== null) y = "Y"+parseFloat(y).toFixed(3);
if (z !== null) z = "Z"+parseFloat(z).toFixed(3);
return this.addLine("G01", [x,y,z]);
};
GCodeExporter.prototype.makeFooter = function(settings){
var data = "";
data += this.goHome(settings);
// data += this.addLine("M30", [], "program stop");
return data;
GCodeExporter.prototype.goHome = function(settings){
var data = this.rapidZ(settings.rapidHeight, settings);
return data + this.rapidXY({x:0, y:0}, settings);
};
GCodeExporter.prototype.save = function(data){
var blob = new Blob([data], {type: "text/plain;charset=utf-8"});
saveAs(blob, "GCodeExport" + ".nc");
......
......@@ -184,6 +184,7 @@ require.config({
//assemblers
assembler: 'cam/assemblers/Assembler',
assemblerPost: 'cam/assemblers/AssemblerPost',
component: 'cam/assemblers/Component',
stockComponent: 'cam/assemblers/StockComponent',
......
......@@ -126,7 +126,7 @@ define(['three'], function(THREE){
camStrategy: "raster",
placementOrder: "XYZ",//used for raster strategy entry
camProcess: "gcode",
rapidHeight:30,
rapidHeight: 30,
rapidHeightRelative: true,
safeHeight: 4.5,
originPosition: new THREE.Vector3(0,0,0),
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment