diff --git a/js/lattice/CompositeEditorLattice.js b/js/lattice/CompositeEditorLattice.js index c23bd8b17481e8770d09ce4230aeb3bb2b9cb03d..f63612ea62c60c59bb875191e5e4f8dcf3bf0bd1 100644 --- a/js/lattice/CompositeEditorLattice.js +++ b/js/lattice/CompositeEditorLattice.js @@ -54,24 +54,34 @@ define(['underscore', 'backbone', 'appState', 'globals', 'plist', 'three', 'thre this.set("color", makeRandomColor()); }, - makeNewCompositeMaterial: function(name, dimensions){ + makeNewCompositeMaterial: function(dimensions){ if (this.get("numCells") == 0) { console.warn("no cells in this composite"); return; } - if (name == "") name = "Composite Material " + compositeNum++; var id = this.get("id"); + materials.setMaterial(id, this.toJSONForSave(dimensions)); + }, + + toJSONForSave: function(dimensions){ + var name = this.get("name"); + if (name == "") name = "Composite Material " + compositeNum++; + if (dimensions) var _dimensions = dimensions.clone(); + var cellsMin = this.get("cellsMin"); + if (cellsMin) cellsMin = cellsMin.clone(); + var cellsMax = this.get("cellsMax"); + if (cellsMax) cellsMax = cellsMax.clone(); var data = { name: name, color: this.get("color"), altColor: this.get("color"), numCells: this.get("numCells"), sparseCells: JSON.parse(JSON.stringify(this.sparseCells)), - cellsMin: this.get("cellsMin").clone(), - cellsMax: this.get("cellsMax").clone(), - dimensions: dimensions + cellsMin: cellsMin, + cellsMax: cellsMax, + dimensions: _dimensions }; - materials.setMaterial(id, data); + return data; }, diff --git a/js/menus/CompositeMenuView.js b/js/menus/CompositeMenuView.js index 55b5bed34f874839c1f195f482d10d7cf5973a19..03555636ad32c7d2d60adf3cea617d407e6d7d9b 100644 --- a/js/menus/CompositeMenuView.js +++ b/js/menus/CompositeMenuView.js @@ -2,8 +2,8 @@ * Created by aghassaei on 6/10/15. */ -define(['jquery', 'underscore', 'menuParent', 'plist', 'lattice', 'globals', 'materials', 'text!compositeMenuTemplate'], - function($, _, MenuParentView, plist, lattice, globals, materials, template){ +define(['jquery', 'underscore', 'menuParent', 'plist', 'lattice', 'globals', 'materials', 'text!compositeMenuTemplate', 'fileSaver'], + function($, _, MenuParentView, plist, lattice, globals, materials, template, fileSaver){ var dimensions; @@ -57,13 +57,13 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'lattice', 'globals', 'ma this._exit(); return; } - lattice.compositeEditor.makeNewCompositeMaterial($("#compositeName").val(), dimensions.clone()); + lattice.compositeEditor.makeNewCompositeMaterial(dimensions.clone()); this._exit(); }, _saveComposite: function(e){ e.preventDefault(); - //save as file + fileSaver.saveMaterial(lattice.compositeEditor.get("id"), lattice.compositeEditor.toJSONForSave(dimensions)); }, _cancelComposite: function(e){ diff --git a/js/menus/MaterialEditorMenuView.js b/js/menus/MaterialEditorMenuView.js index 835092afb5f3acf4706821400a29b79a10a8c879..ce9bbd7912018d107e7a62efa1d0c1d012712f71 100644 --- a/js/menus/MaterialEditorMenuView.js +++ b/js/menus/MaterialEditorMenuView.js @@ -3,8 +3,8 @@ */ -define(['jquery', 'underscore', 'menuParent', 'plist', 'materials', 'text!materialEditorMenuTemplate'], - function($, _, MenuParentView, plist, materials, template){ +define(['jquery', 'underscore', 'menuParent', 'plist', 'materials', 'text!materialEditorMenuTemplate', 'fileSaver'], + function($, _, MenuParentView, plist, materials, template, fileSaver){ var materialNameIndex = 1; @@ -14,7 +14,8 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'materials', 'text!materi "click #cancelMaterial": "_cancelMaterial", "click #deleteMaterial": "_deleteMaterial", "click #finishMaterial": "_save", - "click #newRandomColor": "_changeRandomColor" + "click #newRandomColor": "_changeRandomColor", + "click #saveMaterial": "_saveMaterialToFile" }, _initialize: function(){ @@ -51,6 +52,11 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'materials', 'text!materi this._exit(); }, + _saveMaterialToFile: function(e){ + e.preventDefault(); + fileSaver.saveMaterial(this.model.get("materialType")); + }, + _deleteMaterial: function(e){ e.preventDefault(); var deleted = materials.setMaterial(this.model.get("materialType"), null); diff --git a/js/menus/templates/CompositeMenuView.html b/js/menus/templates/CompositeMenuView.html index 65e8888bb35148872f41d6b48c8f17ecb8a49bcc..bf882d68779825ea503b3a461e53a5f1ae1704c3 100644 --- a/js/menus/templates/CompositeMenuView.html +++ b/js/menus/templates/CompositeMenuView.html @@ -1,5 +1,3 @@ -<a href="#" class="btn btn-halfWidth btn-lg btn-default importJSON">Load Composite</a> -<a id="saveComposite" href="#" class="btn btn-halfWidth btn-lg pull-right btn-default">Save Composite</a><br/><br/> Name: <input id="compositeName" data-property="name" value="<%= name %>" placeholder="Enter Name" class="seventyFiveWidth form-control textInput compositeEditor" type="text"><br/><br/> Num Cells: <%= numCells %><br/><br/> Bounding Box: <%= dimensions.x %> x <%= dimensions.y %> x <%= dimensions.z %><br/><br/> @@ -26,4 +24,5 @@ Available Materials:<br/> <% }); %><br/> <a id="finishComposite" href="#" class="btn btn-block btn-lg btn-success">Save Composite</a><br/> <a id="cancelComposite" href="#" class="btn btn-halfWidth btn-lg btn-default">Cancel / Exit</a> -<a id="deleteComposite" href="#" class="btn btn-halfWidth pull-right btn-lg btn-default"><span class="fui-trash"></span> Delete</a><br/> \ No newline at end of file +<a id="deleteComposite" href="#" class="btn btn-halfWidth pull-right btn-lg btn-default"><span class="fui-trash"></span> Delete</a><br/><br/> +<a id="saveComposite" href="#" class="btn btn-block btn-lg btn-default">Save Composite To File</a><br/><br/> diff --git a/js/menus/templates/MaterialEditorMenuView.html b/js/menus/templates/MaterialEditorMenuView.html index e2578716b8cbbd8fa979e0f44b2911eea2186641..7443bf4a4f31c3fe401fc3747c936406bea13925 100644 --- a/js/menus/templates/MaterialEditorMenuView.html +++ b/js/menus/templates/MaterialEditorMenuView.html @@ -1,5 +1,3 @@ -<a href="#" class="btn btn-halfWidth btn-lg btn-default importJSON">Load Material</a> -<a id="saveMaterial" href="#" class="btn btn-halfWidth btn-lg pull-right btn-default">Save Material</a><br/><br/> Name: <input data-property="name" value="<%= name %>" placeholder="Enter Name" class="seventyFiveWidth form-control textInput materialEditor" type="text"><br/><br/> Display Color: <input id="materialColor" style="border-color: <%= altColor %> ;" data-property="altColor" value="<%= altColor %>" placeholder="Enter HEX" class="halfWidth materialEditor form-control hexInput" type="text"><br/><br/> @@ -9,8 +7,10 @@ Realistic Color: Material Properties:<br/><br/>- add properties here<br/><br/> <a id="finishMaterial" href="#" class="btn btn-block btn-lg btn-success">Save Material</a><br/> <% if (noDelete){ %> - <a id="cancelMaterial" href="#" class="btn btn-block btn-lg btn-default">Cancel / Exit</a> + <a id="cancelMaterial" href="#" class="btn btn-halfWidth btn-lg btn-default">Cancel / Exit</a> + <a id="saveMaterial" href="#" class="btn btn-halfWidth btn-lg pull-right btn-default">Save To File</a><br/><br/> <% } else { %> <a id="cancelMaterial" href="#" class="btn btn-halfWidth btn-lg btn-default">Cancel / Exit</a> - <a id="deleteMaterial" href="#" class="btn btn-halfWidth pull-right btn-lg btn-default"><span class="fui-trash"></span> Delete</a><br/> -<% } %> \ No newline at end of file + <a id="deleteMaterial" href="#" class="btn btn-halfWidth pull-right btn-lg btn-default"><span class="fui-trash"></span> Delete</a><br/><br/> + <a id="saveMaterial" href="#" class="btn btn-block btn-lg pull-right btn-default">Save Material To File</a><br/><br/> +<% } %> diff --git a/js/models/FileSaver.js b/js/models/FileSaver.js index ccc28fb8d59acfc6d06c1e0d746a775dbb2960c1..a7f9f0872df256aceda0e01e4cf746d1c0cf4cba 100644 --- a/js/models/FileSaver.js +++ b/js/models/FileSaver.js @@ -43,6 +43,12 @@ define(['underscore', 'fileSaverLib', 'lattice', 'materials', 'ribbon', 'menuWra _saveFile(data, name, ".user"); } + function saveMaterial(id, material){ + var data = {materials:{}}; + data.materials[id] = material || _getMaterialDataToSave(id); + _saveFile(JSON.stringify(data), data.materials[id].name, ".json"); + } + function _getAssemblerDataToSave(){ var assemblerData = _.omit(globals.cam.toJSON(), ["origin", "stock", "exporter", "appState", "lattice", "machine", "simLineNumber"]); if (!globals.cam.get("editsMadeToProgram")) assemblerData.dataOut = ""; @@ -56,11 +62,15 @@ define(['underscore', 'fileSaverLib', 'lattice', 'materials', 'ribbon', 'menuWra function _getMaterialsDataToSave(){ var data = {}; _.each(_.keys(materials), function(key){ - data[key] = _.omit(materials[key], "threeMaterial"); + data[key] = _getMaterialDataToSave(key); }); return data; } + function _getMaterialDataToSave(id){ + return _.omit(materials[id], "threeMaterial"); + } + function loadFile(data){//parsed json todo make this better - load composite if (!data.materials){ console.warn("no material definitions in this file"); @@ -99,6 +109,7 @@ define(['underscore', 'fileSaverLib', 'lattice', 'materials', 'ribbon', 'menuWra return {//return public methods // save: save, save: save, + saveMaterial: saveMaterial, // saveAssembler: saveAssembler, // saveUser: saveUser, loadFile: loadFile