From 9c1388dbd592270418f904f74e8f08e10dff4a6a Mon Sep 17 00:00:00 2001 From: liuxiangyu Date: Tue, 21 Oct 2014 20:11:11 +0800 Subject: [PATCH 01/14] view --- server/views/__init__.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/server/views/__init__.py b/server/views/__init__.py index 2afc228..1c9d404 100644 --- a/server/views/__init__.py +++ b/server/views/__init__.py @@ -1,4 +1,4 @@ -from flask import render_template +from flask import render_template, redirect, url_for from .. import app @app.route('/') @@ -6,7 +6,11 @@ def index(): return render_template('circuit.html') @app.route('/') def goto(path): - return render_template(path + '.html') + pages = ["circuit", "shape", "simulation", "experiment", "help"]; + for page in pages: + if path == page: + return render_template(path + '.html') + return render_template('circuit.html') from . import biobrick from . import design From 851898cfe561dba28e341c873a04a29f62643c24 Mon Sep 17 00:00:00 2001 From: liuxiangyu Date: Tue, 21 Oct 2014 22:27:14 +0800 Subject: [PATCH 02/14] vector name --- server/static/js/shape-view.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/static/js/shape-view.js b/server/static/js/shape-view.js index d63ca4f..99215b3 100644 --- a/server/static/js/shape-view.js +++ b/server/static/js/shape-view.js @@ -198,7 +198,7 @@ g.Application = Class.extend({ shape.selectable = false; shape.draggable = false; this.views[0].addFigure(shape, this.baseX, this.baseY); - this.label = new graphiti.shape.basic.Label("2070bp"); + this.label = new graphiti.shape.basic.Label("pSB1C3(2070bp)"); this.label.setColor("#0d0d0d"); this.label.setFontColor("#0d0d0d"); this.label.setFontSize(radius / 10); From 672aa21af8bb7a40ad8e4eac374f5d822b1ca7e6 Mon Sep 17 00:00:00 2001 From: JieweiWei Date: Tue, 21 Oct 2014 22:27:58 +0800 Subject: [PATCH 03/14] simulate --- server/static/js/input-range.js | 6 +- server/static/js/simulation-ctrl.js | 103 +++++++++++---- server/static/js/simulation-data.js | 106 +++++++++------ server/static/js/simulation-draw.js | 193 ++++++++++++++++++---------- server/templates/simulation.html | 2 +- 5 files changed, 280 insertions(+), 130 deletions(-) diff --git a/server/static/js/input-range.js b/server/static/js/input-range.js index c44d8d1..ec356fd 100644 --- a/server/static/js/input-range.js +++ b/server/static/js/input-range.js @@ -1,13 +1,13 @@ -$(function() { +$(ShowOutput = function() { var el, newPoint, newPlace, offset; - $(".adjust_input").change(function() { + $(".adjust_input").unbind('mouseup').bind('mouseup', function() { el = $(this); width = el.width(); newPoint = (el.val() - el.attr("min")) / (el.attr("max") - el.attr("min")); if ($(this).parent().prop('id') == 'static_adjust_input') { offset = 15.5; } else { - offset = 8.6; + offset = 8; } if (newPoint < 0) { newPlace = 0; } else if (newPoint > 1) { newPlace = width; } diff --git a/server/static/js/simulation-ctrl.js b/server/static/js/simulation-ctrl.js index 28bad1f..0260d78 100644 --- a/server/static/js/simulation-ctrl.js +++ b/server/static/js/simulation-ctrl.js @@ -9,6 +9,12 @@ * */ +/* The horizontal accuracy in static graph. */ +window.STATIC_PRECISION_X = 4; + +/* The horizontal accuracy in dynamic graph. */ +window.DYNAMIC_PRECISION_X= 2; + /* Switching tabs of #simulation_main_draw. */ $(function() { $('#simulation_main_draw>div').click(function() { @@ -131,22 +137,6 @@ function PrecisionControl(dataArray, p) { return dataArray_; } -/** - * @Retain p decimal places by Scientific notation. - * - * @param {dataArray} array of float. - * - * @param {p} accuracy. - * - *@return array with p decimal places by Scientific notation. - */ -function ArrayToExponential(dataArray, p) { - var dataArray_ = []; - for (var i = 0; i < dataArray.length; ++i) { - dataArray_.push(dataArray[i].toExponential(p)); - } - return dataArray_; -} /* Chart all graphs. */ function ChartAllGraphs() { @@ -180,9 +170,11 @@ $(function() { data: JSON.stringify(reactionInfos[curCircuit]), async: false, success: function(dynamicData) { + /* Record the time interval in the current circuit. */ + recordAdjustValues[curCircuit]['t'] = reactionInfos[curCircuit]['t']; + dynamicDrawData[curCircuit]['x'] = dynamicData['t']; dynamicDrawData[curCircuit]['y'] = dynamicData['c']; - ChartAllGraphs(); $('#show_dynamic_box').click(); }, @@ -195,7 +187,8 @@ $(function() { /* Adjust the concentration of anther input. */ $(AdjustStatic = function() { - $('#static_adjust_box input[type=range]').change(function() { + //ShowOutput(); + $('#static_adjust_box input[type=range]').unbind('change').bind('change', function() { var adjustVar = $(this).prop('id'); reactionInfos[curCircuit]['c_static'] = parseFloat($(this).val()); @@ -210,6 +203,9 @@ $(AdjustStatic = function() { for (var i = 0; i < staticData['c_output'].length; ++i) { var variable = staticData['c_output'][i]['variable']; if (adjustVar.indexOf(variable) < 0) { + /* Record the c_static of current circuit. */ + recordAdjustValues[curCircuit]['c_static'][adjustVar.substring(0, adjustVar.length-3)] = reactionInfos[curCircuit]['c_static']; + staticDrawData[curCircuit]['y'][i] = staticData['c_output'][i]; ChartAllGraphs(); $('.show_static_box').eq(i).click(); @@ -239,14 +235,15 @@ function SetCircuits () { 'RBS' : 'RBS2.png', 'terminator': 'terminator2.png', }; - + var logic = logics[curCircuit][curLogic]; var allParts = logic['inputparts'].concat(logic['outputparts']); for (var m = 0; m < allParts.length; ++m) { var newLine = $( '' + '
' + - '' + + '' + '' ); for (var n = 0; n < allParts[m].length; ++n) { @@ -272,12 +269,70 @@ function SetCircuits () { } newLine.appendTo($('#simulation_adjust_main tbody')); } - + AdjustRBS(); }; -/* 调节RIPS */ -$(function() { - $('.adjust_line input[type=range]').change(function() { +/* Adjust RIPS. */ +$(AdjustRBS = function() { + $('.adjust_line input[type=range]').unbind('change').bind('change', function() { + var index = $(this).parent().parent('.adjust_line').prev().length; + /* Modify RBS. */ + var RBS = RBSList[$(this).val()]; + /* Record the RBS type. */ + recordAdjustValues[curCircuit]['circuitRBS'][curLogic][index] = parseInt($(this).val()); + + var curPart = $(this).parent().prev('td').children('.part'); + curPart.eq(1).find('.ui.label.labelbg').text(RBS); + + /* Modify the curve. */ + var outputName = curPart.eq(2).find('.ui.label.labelbg').text(); + reactionInfos[curCircuit]['output_RBS'][outputName] = RBS; + /* Get static data. */ + $.ajax({ + type: 'POST', + url: '/simulation/simulate/static', + contentType: 'application/json', + dataType: 'json', + data: JSON.stringify(reactionInfos[curCircuit]), + async: false, + complete: function(data) { + if (data.responseText.indexOf('NaN') >= 0) { + staticDrawData[curCircuit] = { + 'x': undefined, + 'y': undefined, + }; + } else { + var staticData = JSON.parse(data.responseText); + staticDrawData[curCircuit] = { + 'x': staticData['c_input'], + 'y': staticData['c_output'], + }; + } + }, + fail: function() { + $("#nodata").modal("show"); + }, + }); + + /* Get dynamic data. */ + $.ajax({ + type: 'POST', + url: '/simulation/simulate/dynamic', + contentType: 'application/json', + dataType: 'json', + data: JSON.stringify(reactionInfos[curCircuit]), + async: false, + success: function(dynamicData) { + dynamicDrawData[curCircuit] = { + 'x': dynamicData['t'], + 'y': dynamicData['c'], + }; + }, + fail: function() { + $("#nodata").modal("show"); + }, + }); + ChartAllGraphs(); }); }); diff --git a/server/static/js/simulation-data.js b/server/static/js/simulation-data.js index 38b92b6..1e20e9a 100644 --- a/server/static/js/simulation-data.js +++ b/server/static/js/simulation-data.js @@ -15,24 +15,16 @@ window.TIME = 60; /* Default concentration of reactants. */ window.CONCENTRATION = 1e-9; +/* Default ajust concentration of reactants. */ +window.ADJUST_CONCENTRATION = 0.0001; + /* Fixed concentration of defaults. */ window.FIXED_C = CONCENTRATION; -/* The horizontal accuracy in static graph. */ -window.STATIC_PRECISION_X = 4; - -/* The horizontal accuracy in dynamic graph. */ -window.DYNAMIC_PRECISION_X= 2; - -/* The Vertical accuracy in static graph. */ -window.STATIC_PRECISION_Y = 3; - -/* The Vertical accuracy in dynamic graph. */ -window.DYNAMIC_PRECISION_Y = 3; /* Access to relevant data of all circuits. */ $(function() { - var reactionData = JSON.parse(sessionStorage.getItem('preprocess')); + window.reactionData = JSON.parse(sessionStorage.getItem('preprocess')); if (reactionData == null || reactionData.length == 0) { $("#nodata").modal("show"); } else { @@ -124,30 +116,62 @@ $(function() { } }); -/** - * @Get RIPS of current logic of current circuit. - * - * @return a directory of RIPS of current logic of current circuit. - * - */ -function GetCurRIPS() { - var RIPS = {}; - var logic = logics[curCircuit][curLogic]; - if (logic['logic_type'] == 'toggle_switch_1') { - } else if (logic['logic_type'] == 'toggle_switch_2') { - } else if (logic['logic_type'] == 'simple_logic') { - } else if (logic['logic_type'] == 'or_gate') { - } else { - var allParts = logic['inputparts'].concat(logic['outputparts']); - for (var i = 0; i < allParts.length; ++i) { - var url = '/biobrick/' + (i < logic['inputparts'].length ? 'input' : 'output') + '?id=' + allParts[i][1]['id']; - alert(url); - $.get(url, function(data) { - console.log(data); - }) +/* Get RIPS of current logic of current circuit. */ +$(function() { + window.RBSList = []; + $.ajax({ + url: '/biobrick/RBS', + contentType: 'application/json', + dataType: 'json', + async: false, + success: function(data) { + for (var i = 0; i < data['result'].length; ++i) { + RBSList.push(data['result'][i]['name']); + } + }, + fail: function() { + $("#nodata").modal("show"); + }, + }); +}); + +$(function() { + /* Record the adjusted values. */ + window.recordAdjustValues = []; + /* For each circuit. */ + for (var i = 0; i < logics.length; ++i) { + recordAdjustValues.push({ + 't': TIME, + 'c_static': {}, + 'circuitRBS': [], + }); + for (var j = 0; j < reactionData.length; ++j) { + var input = reactionData[i]['inputs']; + for (var k = 0; k < input.length; ++k) { + $.ajax({ + url: '/biobrick/input?id=' + input[k]['id'], + type: 'GET', + contentType: 'application/json', + dataType: 'json', + async: false, + success: function(data) { + recordAdjustValues[i]['c_static'][data['result']['name']] = ADJUST_CONCENTRATION; + } + }); + } + } + /* For each logic. */ + for (var j = 0; j < logics[i].length; ++j) { + var allParts = logics[i][j]['inputparts'].concat(logics[i][j]['outputparts']); + var logicRBS = []; + /* For each part. */ + for (var k = 0; k < allParts.length; ++k) { + logicRBS.push($.inArray(allParts[k][1]['name'] ,RBSList)); + } + recordAdjustValues[i]['circuitRBS'].push(logicRBS); } } -}; +}); /* Show data in console for test. */ function ShowData() { @@ -166,8 +190,16 @@ function ShowData() { console.log('logics: '); console.log(logics); + console.log('RBSList: '); + console.log(RBSList); + + console.log('recordAdjustValues: '); + console.log(recordAdjustValues); + return reactionInfos.length == circuits.length && - staticDrawData.length == circuits.length && - dynamicDrawData.length == circuits.length && - logics.length == circuits.length; + staticDrawData.length == circuits.length && + dynamicDrawData.length == circuits.length && + logics.length == circuits.length && + RBSList.length == 54 && + recordAdjustValues.length == circuits.length; } diff --git a/server/static/js/simulation-draw.js b/server/static/js/simulation-draw.js index 190ce80..b99451d 100644 --- a/server/static/js/simulation-draw.js +++ b/server/static/js/simulation-draw.js @@ -9,64 +9,95 @@ * */ +/* Color output curve. */ +window.OUTPUT_COLORS = ['#D95C5C', '#6ECFF5', '#00B5AD']; + +/* The number of horizontal displayed points in dynamic graph. */ +window.NUM_OF_SCALE = 10; + +/* The Vertical accuracy in graph. */ +window.PRECISION_Y = 3; + /* Common property of line graph. */ window.SAME_PROPERTIES = { - align: 'center', - tip: { - enable: true, - shadow: true, - move_duration: 400, - border: { - enable: true, - radius: 5, - width: 0, - }, - }, - legend: { - enable: true, - row: 1, - column: 'max', - valign: 'top', - sign: 'bar', - background_color: null, - offsetx: -80, - border: true, - color: 'gray', - }, - sub_option: { - smooth : true, - label: false, - point_size: 0, - }, - subtitle: { - text: 'concentration of output(s)/mM', - fontsize:12, - color:'gray', - textAlign:'left', - padding:'0 0 0 0', - height:30 - }, - background_color: null, + align: 'center', + tip: { + enable: true, + shadow: true, + move_duration: 400, border: { - enable: false, - width:0, + enable: true, + radius: 5, + width: 0, }, listeners: { parseText:function(tip,name,value,text,i){ - return name + " : " + value; - } + return name + " : " + (parseFloat(value).toFixed(PRECISION_Y)); }, - crosshair: { - enable:true, - line_color:'#62bce9', - } + }, + }, + legend: { + enable: true, + row: 1, + column: 'max', + valign: 'top', + sign: 'bar', + background_color: null, + offsetx: -80, + border: true, + color: 'gray', + }, + sub_option: { + smooth : true, + label: false, + point_size: 0, + }, + background_color: null, + border: { + enable: false, + width:0, + }, + crosshair: { + enable:true, + line_color:'#62bce9', + }, }; -/* Color output curve. */ -window.OUTPUT_COLORS = ['#D95C5C', '#6ECFF5', '#00B5AD']; - -/* The number of horizontal displayed points in dynamic graph. */ -window.NUM_OF_SCALE = 10; +/** + * @Adjustment data accuracy. + * + * @param {rowData} raw data. + * + * @return {data} data adjusted. + * + * @return {min} the accuracy. + * + */ +function AdjustDataY(rowData) { + var newData = new Array(); + var minAll = 999999; + for (var key in rowData) { + var min = 99999; + for (var i = 0; i < rowData[key].length; ++i) { + var num = parseFloat(rowData[key][i]).toExponential(PRECISION_Y) ; + var e = parseInt(num.split('e')[1]); + if (e < min) { + min = e; + } + } + if (min < minAll) { + minAll = min; + } + } + for (var key in rowData) { + var aNewData = new Array(); + for (var i = 0; i < rowData[key].length; ++i) { + aNewData.push(rowData[key][i] * Math.pow(10, -minAll)) + } + newData[key] = aNewData; + } + return {'data': newData, 'e': minAll}; +} /** * @Create static_box. @@ -104,15 +135,22 @@ function DrawStaticPerformance(labels, output) { CreateStaticBox(output.length); inputDatas = new Array(); + var es = new Array(); for (var i = 0; i < output.length; ++i) { var inputData = new Array(); inputData['var'] = output[i]['variable']; inputData['output'] = []; var count = 0; + var rowData = new Array(); + for (var outputName in output[i]['c']) { + rowData[outputName] = output[i]['c'][outputName]; + } + var newData = AdjustDataY(rowData); + es.push(newData['e']); for (var outputName in output[i]['c']) { inputData['output'].push({ name: outputName, - value: ArrayToExponential(output[i]['c'][outputName], STATIC_PRECISION_Y), + value: newData['data'][outputName], color: OUTPUT_COLORS[count++], line_width: 3, }); @@ -133,7 +171,15 @@ function DrawStaticPerformance(labels, output) { tip: SAME_PROPERTIES['tip'], legend: SAME_PROPERTIES['legend'], sub_option: SAME_PROPERTIES['sub_option'], - subtitle: SAME_PROPERTIES['subtitle'], + subtitle: { + text: 'concentration of output(s)/10^' + es[i] + 'mM', + fontsize:12, + color:'gray', + textAlign:'left', + padding:'0 0 0 0', + height:30, + }, + crosshair: SAME_PROPERTIES['crosshair'], footnote:{ text: inputDatas[i]['var']+'/mM', padding:'20 20', @@ -162,7 +208,6 @@ function DrawStaticPerformance(labels, output) { width:0, }, }); - /* Pain the graph. */ var chart = new iChart.LineBasic2D(chartDirs[i]); chart.draw(); @@ -181,12 +226,17 @@ function DrawDynamicPerformance(tLabel, data) { var allData = new Array(); var count = 0; + var rowData = new Array(); + for (var key in data) { + rowData[key] = data[key]; + } + var newData = AdjustDataY(rowData); for (var key in data) { allData.push({ - name: key, - value: ArrayToExponential(data[key], DYNAMIC_PRECISION_Y), - color: OUTPUT_COLORS[count++], - line_width: 3, + name: key, + value: newData['data'][key], + color: OUTPUT_COLORS[count++], + line_width: 3, }); } @@ -200,8 +250,16 @@ function DrawDynamicPerformance(tLabel, data) { height : 320, background_color: SAME_PROPERTIES['background_color'], footnote: SAME_PROPERTIES['footnote'], + crosshair: SAME_PROPERTIES['crosshair'], tip: SAME_PROPERTIES['tip'], - subtitle: SAME_PROPERTIES['subtitle'], + subtitle: { + text: 'concentration of output(s)/10^' + newData['e'] + 'mM', + fontsize:12, + color:'gray', + textAlign:'left', + padding:'0 0 0 0', + height:30 + }, footnote:{ text: 'time/min', padding:'20 20', @@ -248,17 +306,20 @@ $(ShowStaticModal = function() { /* Modify the properties of the graph. */ chartDirs[index].render = 'showgraph'; - chartDirs[index]['tip']['listeners'] = SAME_PROPERTIES['listeners']; - chartDirs[index]['crosshair'] = SAME_PROPERTIES['crosshair']; chartDirs[index].width = 780; chartDirs[index].height = 400; chartDirs[index].coordinate.width = 650; chartDirs[index].coordinate.height = 350; + var anotherVarName = chartDirs[negate[index]]['footnote']['text']; $('#dynamic_adjust_box').hide(); $('#static_adjust_box').show() - .find('h3').text('concentration of ' + chartDirs[negate[index]]['footnote']['text']); - $('#static_adjust_box').find('input[type=range]').prop('id', chartDirs[negate[index]]['footnote']['text']); - + .find('h3').text('concentration of ' + anotherVarName); + $('#static_adjust_box') + .find('input[type=range]') + .prop('id', anotherVarName) + /* Set time interval value. */ + .val(recordAdjustValues[curCircuit]['c_static'][anotherVarName.substring(0, anotherVarName.length-3)]); + $('.adjust_input').mouseup(); /* Chart the graph in the modal box. */ var chart = new iChart.LineBasic2D(chartDirs[index]); chart.draw(); @@ -278,13 +339,15 @@ $(function() { /* Modify the properties of the graph. */ chartDir.render = 'showgraph'; - chartDir['tip']['listeners'] = SAME_PROPERTIES['listeners']; - chartDir['crosshair'] = SAME_PROPERTIES['crosshair']; chartDir.width = 780; chartDir.height = 400; chartDir.coordinate.width = 630; chartDir.coordinate.height = 350; - $('#dynamic_adjust_box').show(); + $('#dynamic_adjust_box') + .show() + /* Set time interval value. */ + .find('input[type=range]').val(recordAdjustValues[curCircuit]['t']); + $('.adjust_input').mouseup(); $('#static_adjust_box').hide(); /* Chart the graph in the modal box. */ diff --git a/server/templates/simulation.html b/server/templates/simulation.html index 857bff4..b4f114b 100644 --- a/server/templates/simulation.html +++ b/server/templates/simulation.html @@ -54,7 +54,7 @@

Concentration of input

0.0001 mM - 1 + 0.0001 1 mM
From efa8884a41faa334123b8b61a60c0ec2133201b0 Mon Sep 17 00:00:00 2001 From: JieweiWei Date: Tue, 21 Oct 2014 22:39:14 +0800 Subject: [PATCH 04/14] update --- server/static/js/simulation-draw.js | 2 +- server/templates/simulation.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/server/static/js/simulation-draw.js b/server/static/js/simulation-draw.js index b99451d..56604a4 100644 --- a/server/static/js/simulation-draw.js +++ b/server/static/js/simulation-draw.js @@ -10,7 +10,7 @@ */ /* Color output curve. */ -window.OUTPUT_COLORS = ['#D95C5C', '#6ECFF5', '#00B5AD']; +window.OUTPUT_COLORS = ['#FF0000', '#00FF00', '#0000FF']; /* The number of horizontal displayed points in dynamic graph. */ window.NUM_OF_SCALE = 10; diff --git a/server/templates/simulation.html b/server/templates/simulation.html index b4f114b..4b6edc3 100644 --- a/server/templates/simulation.html +++ b/server/templates/simulation.html @@ -62,9 +62,9 @@

Concentration of input

time interval

20 min - + 60 min - 580 min + 600 min
From e7015e16db61ef3ff7e4a637340d01e86093b394 Mon Sep 17 00:00:00 2001 From: liuxiangyu Date: Tue, 21 Oct 2014 22:56:02 +0800 Subject: [PATCH 05/14] flame --- server/static/js/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/static/js/main.js b/server/static/js/main.js index 43cf0ca..5da4bac 100644 --- a/server/static/js/main.js +++ b/server/static/js/main.js @@ -51,7 +51,7 @@ $(document).ready(function() { $("#showIndex").mouseleave(function() { $(this).find("span").hide(); $(this).find("span").empty(); - $(this).find("span").append("Flame"); + $(this).find("span").append("FLAME"); $(this).find("span").show("slow"); }); From 3ef1c288e50d019b9055f4c5c1b9dc869d2617d5 Mon Sep 17 00:00:00 2001 From: JieweiWei Date: Tue, 21 Oct 2014 22:59:57 +0800 Subject: [PATCH 06/14] update dna --- server/static/js/dna.js | 230 ++++------------------------ server/static/js/simulation-ctrl.js | 2 +- 2 files changed, 33 insertions(+), 199 deletions(-) diff --git a/server/static/js/dna.js b/server/static/js/dna.js index 179dcad..e74f313 100644 --- a/server/static/js/dna.js +++ b/server/static/js/dna.js @@ -1,48 +1,33 @@ -/* 有命名片段的颜色列表 */ +/** + * @file dna.js + * @Control the components in dna page. + * @author Jiewei Wei + * @mail weijieweijerry@163.com + * @github https://github.com/JieweiWei + * @data Oct 19 2014 + * @copyright 2014 SYSU-Software. All rights reserved. + * + */ + +/* Color list. */ window.colors = { 'promoter' : 'rgb(255, 128, 0)', 'RBS': 'rgb(0, 127, 255)', 'terminator': 'rgb(210, 0, 0)', 'output': 'rgb(160, 32, 240)', - /* 默认颜色 */ 'biobrick_scar': 'rgb(128,128,128)', 'poly_A': 'rgb(128,128,128)', - /* 酶切位点颜色 */ - 'restriction': 'rgb(0,250,145)', }; -/* 每次DNA新增的行数 */ -LINE_OF_SHOW = 4; - -/* 定义一行所显示的DNA单元数目 */ +/* Number of rows in each new DNA. */ +window.LINE_OF_SHOW = 4; +/* The number of DNA cell line displayed. */ window.LEN_OF_LINE = 42; -/* 定义第二条链比第一条链浅色比例 */ +/* Color coefficient. */ window.COLOR_PERCENTAGE = 1.4; -/* 酶切片段 */ -window.restrictionPart = { - 'EcoRI': { - 'fir' : [[1,1,0,1], [1,0,1,1], [1,0,1,0], [1,0,1,0], [1,0,1,0], [1,1,0,0]], - 'sec' : [[0,0,1,1], [1,0,1,0], [1,0,1,0], [1,0,1,0], [1,1,1,0], [0,1,1,1]], - 'firStr' : 'GAATTC', - }, - 'XbaI': { - 'fir' : [[1,1,0,1], [1,0,1,1], [1,0,1,0], [1,0,1,0], [1,0,1,0], [1,1,0,0]], - 'sec' : [[0,0,1,1], [1,0,1,0], [1,0,1,0], [1,0,1,0], [1,1,1,0], [0,1,1,1]], - 'firStr' : 'TCTAGA', - }, - 'SpeI': { - 'fir' : [[1,1,0,1], [1,0,1,1], [1,0,1,0], [1,0,1,0], [1,0,1,0], [1,1,0,0]], - 'sec' : [[0,0,1,1], [1,0,1,0], [1,0,1,0], [1,0,1,0], [1,1,1,0], [0,1,1,1]], - 'firStr' : 'ACTAGT', - }, - 'PstI': { - 'fir' : [[0,1,0,0], [1,0,1,1], [1,0,1,0], [1,0,1,0], [1,1,1,0], [0,0,0,1]], - 'sec' : [[0,1,0,0], [1,0,1,1], [1,0,1,0], [1,0,1,0], [1,1,1,0], [0,0,0,1]], - 'firStr' : 'CTGCAG', - }, }; -/* 获取输入和输出名字 */ +/* Get input and output data. */ $(function() { $("#progress").modal('setting', 'closable', false).modal("show"); var preprocess = JSON.parse(sessionStorage.getItem('preprocess')); @@ -88,7 +73,7 @@ $(function() { } }); -/* 获取DNA链的数据 */ +/* Get dna data. */ $(function() { var circuits = JSON.parse(sessionStorage.getItem('circuits')); if (circuits == null) { @@ -102,9 +87,8 @@ $(function() { } }); -/* 初始化DNA双链 */ +/* Init dna. */ $(function () { - /* 已经显示的行 */ strHaveShow = 0; allFrtStr = ''; for (var i = 0; i < dnaData.length; ++i) { @@ -113,7 +97,14 @@ $(function () { reArrange(); }); -/* DNA双链匹配工具函数 */ + +/** + * @dna match. + * + * @param {astrand} one of astrand of dna. + * + * @return another astrand of dna. + */ function MatchDNA(astrand) { var dnaMatch = { 'A' : 'T', 'T' : 'A', 'C' : 'G', 'G' : 'C', @@ -125,37 +116,27 @@ function MatchDNA(astrand) { return otherStrand; } -/* 根据第一条链重整DNA双链 */ +/* Arrange the secone astrand according to the first astrand. */ function reArrange() { frtStr = allFrtStr.substr(strHaveShow, LEN_OF_LINE * LINE_OF_SHOW); strHaveShow += frtStr.length; - // $('.dna_line').remove(); for (var i = 0; i < frtStr.length; i += LEN_OF_LINE) { var line1Str = frtStr.substr(i, LEN_OF_LINE); var line2Str = MatchDNA(line1Str); var tagTR = $('
'); var frtTR = $('
'); var sndTR = $('
'); - //var frtTR = $('
'); - //var sndTR = $('
'); - //var unitTR = $('
'); for (var j = 0; j < line1Str.length; ++j) { tagTR.append($(' ')); - // frtTR.find('input').val(frtTR.find('input').val()+line1Str[j]).prop('disabled', 'disabled'); frtTR.append($('' + line1Str[j] + '')); - // sndTR.find('input').val(sndTR.find('input').val()+line2Str[j]).prop('disabled', 'disabled'); sndTR.append($(''+ line2Str[j] + '')); - //unitTR.append($(' ')); } $('
') .append(tagTR).append(frtTR) .append(sndTR) - //.append(unitTR) .appendTo($('#dna_content')); } initColor(); - //changeDNA(); - //selectBoth(); setName(); } @@ -171,14 +152,13 @@ $('#dna_content').scroll(function(){ $(function() { $('#showNewDna').click(function() { reArrange(); - // alert(parseInt(allFrtStr.length / LEN_OF_LINE)); if (strHaveShow == allFrtStr.length) { $(this).hide(); } }); }); -/* 在标签栏添加片段名称 */ +/* Add tag name. */ $(setName = function() { var lens = 0; for (var i = 0; i < dnaData.length; ++i) { @@ -187,7 +167,7 @@ $(setName = function() { } }); -/* 初始化所有链的颜色 */ +/* Init color. */ $(initColor = function () { var left = 0, right = dnaData[0][2].length; for (var i = 0; i < dnaData.length-1; ++i) { @@ -200,156 +180,10 @@ $(initColor = function () { } }); -/* 获取第二条链的颜色 */ +/* Get color of second astrand. */ function getSecondColor(color) { var rgb = color.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/i); return 'rgb(' + parseInt(parseInt(rgb[1])*COLOR_PERCENTAGE) + ',' + parseInt(parseInt(rgb[2])*COLOR_PERCENTAGE) + ',' + parseInt(parseInt(rgb[3])*COLOR_PERCENTAGE) + ')'; -} - -// function chanegColor(frtStrand, lens, colors) { -// frtStrand.children('span').each(function() { -// var curSpanIndex = $(this).prevAll('span').length; -// var curIndex = frtStrand.parent('.dna_line').prevAll().length * LEN_OF_LINE + curSpanIndex; -// var i = 0; -// for (; i < lens.length; ++i) { -// if (curIndex <= lens[i]) { -// break; -// } -// } -// $(this).css('background-color', colors[i]); -// var color = $(this).css('background-color'); -// var rgb = color.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/i); -// color = 'rgb(' + parseInt(parseInt(rgb[1])*COLOR_PERCENTAGE) + ',' -// + parseInt(parseInt(rgb[2])*COLOR_PERCENTAGE) + ',' -// + parseInt(parseInt(rgb[3])*COLOR_PERCENTAGE) + ')'; -// frtStrand.next().children('span').eq(curSpanIndex) -// .css('background-color', color); -// }); -// } - - /* 判断输入是否为AGCT或者agct */ -//function isUnit(event) { -// return event.which == 65 || event.which == 71 || -// event.which == 67 || event.which == 84 || -// event.which == 97 || event.which == 103 || -// event.which == 99 || event.which == 116; -//} - -/* 第二条链根据第一条链改变 */ -//$(changeDNA = function () { -// $('.first_strand').keypress(function(event) { -// /* 只能输入AGCT和agct */ -// if (isUnit(event)) { -// return true; -// } else { -// return false; -// } -// }).keyup(function(event) { -// /* 当输入AGCT,agct或者回退键结束后重整DNA链 */ -// if (isUnit(event) || event.keyCode == 8) { -// var curIndex = $(this).parents('.dna_line').prevAll().length; -// var cursorPos = $(this).getCursorPosition(); -// var fstAll = ''; -// $('.first_strand').each(function() { -// fstAll += $(this).val(); -// }); -// reArrange(fstAll.toUpperCase()); -// $('.first_strand').eq(curIndex).selectRange(cursorPos, cursorPos); -// } -// }); -//}); - -/* 是否进行多行选择 */ -//window.isMultiLine = false; - -/* 两条链同步选中 */ -//$(selectBoth = function() { -// $('.first_strand').select(function(event) { -// var cursorR = $(this).getCursorRange(); -// for (var i = cursorR.start+1; i <= cursorR.end; ++i) { -// $(this).parent().find('span:nth-of-type('+i+')') -// .css('background-color', 'rgb(255, 255, 0)'); -// $(this).parent().next().find('span:nth-of-type('+i+')') -// .css('background-color', 'rgba(255, 255, 0, 0.6)'); -// } -// var offset = $(this).parent() -// .find('span:nth-of-type('+cursorR.start+')').offset(); -// var top = offset.top; -// var left = offset.left; -// /* 点击按钮出现评论框 */ -// $('#dna_aside button:eq(1)').show().click(function(event) { -// $('#dna_modal_box').css({'top': top+'px', 'left': left+'px',}) -// .show().find('input').focus(); -// }); -// }).keydown(function(event) { -// /* 输入AGCT,agct,CTRL或者方向键入 */ -// if (isUnit(event) || event.keyCode == 8 || -// event.which >= 37 && event.which <= 40) { -// initColor(); -// } -// }).click(function(event) { -// if (!isMultiLine) { -// initColor(); -// } -// }).keydown(function(event) { -// isMultiLine = event.which == 17; -// }).keyup(function() { -// isMultiLine = false; -// }); -//}); - -/* 左键点击后评论框和评论按钮消失 */ -/* 左键点击后,颜色初始化 */ -//$(function() { -// $('body').click(function() { -// $('#dna_aside button:eq(1)').hide(); -// }).not('#comment_button').click(function() { -// if ($('#dna_modal_box').css('display') == 'none') { -// initColor(); -// } -// }); -//}); - -/* 输入评论 */ -//$(function() { -// $('#dna_modal_box').find('input').change(function() { -// $('#dna_modal_box').hide(); -// }).keydown(function(event) { -// /* 输入回车隐藏评论框 */ -// if (event.which == 13) { -// $('#dna_modal_box').hide(); -// } -// }); -// $('#dna_modal_box .remove').click(function() { -// $('#dna_modal_box').hide(); -// }); -//}); -// -// -///* 找出未标记DNA的酶切位点 */ -//$(function() { -// var circuits = JSON.parse(sessionStorage.getItem('circuits')); -// for (var k = 0; k < circuits.length; ++k) { -// var dna = circuits[k]['dna']; -// var start = 0; -// for (var i = 0; i < dna.length; ++i) { -// if (dna[i][1] == 'biobrick_scar' || dna[i][1] == 'poly_A') { -// var indexs = new Array(); -// for (var name in restrictionPart) { -// var index = dna[i][2].indexOf(restrictionPart[name]['firStr']) -// if (index >= 0) { -// $('.first_line span:eq('+start+'):gt('+start+'):lt('+(start+index)+')').css('background-color', colors['restriction']); -// $('.second_line span:eq('+start+'):gt('+start+'):lt('+(start+index)+')').css('background-color', getSecondColor(colors['restriction'])); -// } -// } -// } -// start += dna[i][2].length; -// } -// } -// }); -// -// $(document).ready(function() { -// $("#progress").modal("show"); -// }); +} \ No newline at end of file diff --git a/server/static/js/simulation-ctrl.js b/server/static/js/simulation-ctrl.js index 0260d78..b0ebc7a 100644 --- a/server/static/js/simulation-ctrl.js +++ b/server/static/js/simulation-ctrl.js @@ -147,7 +147,7 @@ function ChartAllGraphs() { staticDrawData[curCircuit]['y'] ); } else { - alert('Simulate Error'); + //alert('Simulate Error'); } DrawDynamicPerformance( PrecisionControl(dynamicDrawData[curCircuit]['x'], DYNAMIC_PRECISION_X), From 319a746564b827778cb5c90a497a473d65122966 Mon Sep 17 00:00:00 2001 From: liuxiangyu Date: Tue, 21 Oct 2014 23:05:52 +0800 Subject: [PATCH 07/14] delete img --- server/static/images/circuit/Terminator0.png | Bin 34531 -> 0 bytes server/static/images/circuit/Terminator1.png | Bin 36092 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 server/static/images/circuit/Terminator0.png delete mode 100644 server/static/images/circuit/Terminator1.png diff --git a/server/static/images/circuit/Terminator0.png b/server/static/images/circuit/Terminator0.png deleted file mode 100644 index 59f6a9eae0f40a3c737acaae76ec481ae1e4a832..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34531 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 Zhrg#Z?dWa;?m}c>@O1TaS?83{1OQ=`bmss7 diff --git a/server/static/images/circuit/Terminator1.png b/server/static/images/circuit/Terminator1.png deleted file mode 100644 index 2321966c782595a4c08842c340516bc500a19888..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36092 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 From 40ee62cc1db7786f4ab0300cad61ee5bee218cdf Mon Sep 17 00:00:00 2001 From: liuxiangyu Date: Tue, 21 Oct 2014 23:06:24 +0800 Subject: [PATCH 08/14] update --- server/static/images/circuit/terminator0.png | Bin 0 -> 34531 bytes server/static/images/circuit/terminator1.png | Bin 0 -> 36092 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 server/static/images/circuit/terminator0.png create mode 100644 server/static/images/circuit/terminator1.png diff --git a/server/static/images/circuit/terminator0.png b/server/static/images/circuit/terminator0.png new file mode 100644 index 0000000000000000000000000000000000000000..59f6a9eae0f40a3c737acaae76ec481ae1e4a832 GIT binary patch literal 34531 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 Zhrg#Z?dWa;?m}c>@O1TaS?83{1OQ=`bmss7 literal 0 HcmV?d00001 diff --git a/server/static/images/circuit/terminator1.png b/server/static/images/circuit/terminator1.png new file mode 100644 index 0000000000000000000000000000000000000000..2321966c782595a4c08842c340516bc500a19888 GIT binary patch literal 36092 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 literal 0 HcmV?d00001 From 2c07b59700ee20ed6906ba89e5f961f122198a2e Mon Sep 17 00:00:00 2001 From: JieweiWei Date: Wed, 22 Oct 2014 00:35:00 +0800 Subject: [PATCH 09/14] update simulate --- server/static/js/simulation-draw.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/static/js/simulation-draw.js b/server/static/js/simulation-draw.js index 56604a4..50ead0c 100644 --- a/server/static/js/simulation-draw.js +++ b/server/static/js/simulation-draw.js @@ -186,7 +186,7 @@ function DrawStaticPerformance(labels, output) { height:30, }, coordinate: { - width: 380, + width: 360, height: 250, grid_color: 'gray', axis:{ From a652fd965b2d9eb04269713266a03af8887930af Mon Sep 17 00:00:00 2001 From: liuxiangyu Date: Wed, 22 Oct 2014 01:10:32 +0800 Subject: [PATCH 10/14] simulation css --- server/static/css/simulation.css | 6 +++--- server/static/js/simulation-draw.js | 6 +++--- server/templates/simulation.html | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/server/static/css/simulation.css b/server/static/css/simulation.css index ed16287..1640d68 100644 --- a/server/static/css/simulation.css +++ b/server/static/css/simulation.css @@ -67,7 +67,7 @@ body { } #Static { - width: 90%; + width: 1100px; top: 12%; left: 1%; z-index: 2; @@ -257,7 +257,7 @@ body { .static_box { float: left; width: 450px; - margin: 0 3% 0 3%; + margin: 0 20px 0 20px; } .search.icon { @@ -345,10 +345,10 @@ body { #static_adjust_box h3, #dynamic_adjust_box h3 { margin: 10px; - text-align: center; } .input_range { + margin-top:100px; height: 20px; position: relative; } diff --git a/server/static/js/simulation-draw.js b/server/static/js/simulation-draw.js index 50ead0c..fa5498e 100644 --- a/server/static/js/simulation-draw.js +++ b/server/static/js/simulation-draw.js @@ -172,7 +172,7 @@ function DrawStaticPerformance(labels, output) { legend: SAME_PROPERTIES['legend'], sub_option: SAME_PROPERTIES['sub_option'], subtitle: { - text: 'concentration of output(s)/10^' + es[i] + 'mM', + text: 'Concentration of output(s)/10^' + es[i] + 'mM', fontsize:12, color:'gray', textAlign:'left', @@ -253,7 +253,7 @@ function DrawDynamicPerformance(tLabel, data) { crosshair: SAME_PROPERTIES['crosshair'], tip: SAME_PROPERTIES['tip'], subtitle: { - text: 'concentration of output(s)/10^' + newData['e'] + 'mM', + text: 'Concentration of output(s)/10^' + newData['e'] + 'mM', fontsize:12, color:'gray', textAlign:'left', @@ -313,7 +313,7 @@ $(ShowStaticModal = function() { var anotherVarName = chartDirs[negate[index]]['footnote']['text']; $('#dynamic_adjust_box').hide(); $('#static_adjust_box').show() - .find('h3').text('concentration of ' + anotherVarName); + .find('h3').text('Concentration of ' + anotherVarName); $('#static_adjust_box') .find('input[type=range]') .prop('id', anotherVarName) diff --git a/server/templates/simulation.html b/server/templates/simulation.html index 4b6edc3..f905516 100644 --- a/server/templates/simulation.html +++ b/server/templates/simulation.html @@ -59,7 +59,7 @@

Concentration of input

-

time interval

+

Time interval

20 min From fd471e85a4f8e736a62fefa284bb3b361e921fdd Mon Sep 17 00:00:00 2001 From: liuxiangyu Date: Wed, 22 Oct 2014 01:23:16 +0800 Subject: [PATCH 11/14] fix a bug in dna --- server/static/js/dna.js | 3 +-- server/static/js/shape-view.js | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/server/static/js/dna.js b/server/static/js/dna.js index e74f313..f11a7ec 100644 --- a/server/static/js/dna.js +++ b/server/static/js/dna.js @@ -25,7 +25,6 @@ window.LINE_OF_SHOW = 4; window.LEN_OF_LINE = 42; /* Color coefficient. */ window.COLOR_PERCENTAGE = 1.4; -}; /* Get input and output data. */ $(function() { @@ -186,4 +185,4 @@ function getSecondColor(color) { return 'rgb(' + parseInt(parseInt(rgb[1])*COLOR_PERCENTAGE) + ',' + parseInt(parseInt(rgb[2])*COLOR_PERCENTAGE) + ',' + parseInt(parseInt(rgb[3])*COLOR_PERCENTAGE) + ')'; -} \ No newline at end of file +} diff --git a/server/static/js/shape-view.js b/server/static/js/shape-view.js index 99215b3..5455b2a 100644 --- a/server/static/js/shape-view.js +++ b/server/static/js/shape-view.js @@ -655,15 +655,15 @@ g.Shapes.Logic = graphiti.shape.basic.Rectangle.extend({ var inputpart = new g.Shapes.Part(logic.inputparts[0], "input"); this.addItem(inputpart); } else { + var gate = new g.Gate(logic.logic_type, this.gateWidth, this.gateHeight); + this.addItem(gate); var lastpartlength = logic.outputparts[partslength - 1].length; logic.outputparts[partslength - 1][lastpartlength - 2].type = "outputfinal"; var outputpart = new g.Shapes.Part(logic.outputparts[0], "output"); this.addItem(outputpart); if (logic.logic_type === "inverter") { this.gateWidth += 100; - } - var gate = new g.Gate(logic.logic_type, this.gateWidth, this.gateHeight); - this.addItem(gate); + } } }, From dd9c71c5240ddd59e43f0dc013c7763da50d9fed Mon Sep 17 00:00:00 2001 From: liuxiangyu Date: Wed, 22 Oct 2014 01:39:45 +0800 Subject: [PATCH 12/14] shape some bug --- server/static/js/graphiti/Connection.js | 1 + server/static/js/shape-view.js | 21 ++++++++++----------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/server/static/js/graphiti/Connection.js b/server/static/js/graphiti/Connection.js index ce8ee80..d80dcb4 100644 --- a/server/static/js/graphiti/Connection.js +++ b/server/static/js/graphiti/Connection.js @@ -54,6 +54,7 @@ init: function() { this.regulated = false; this.draggable = false; + this.selectable = false; //this.Activator = new g.Buttons.Activate(); //this.Repressor = new g.Buttons.Inhibit(); //this.remove = new g.Buttons.Remove(); diff --git a/server/static/js/shape-view.js b/server/static/js/shape-view.js index 5455b2a..9aa6068 100644 --- a/server/static/js/shape-view.js +++ b/server/static/js/shape-view.js @@ -479,7 +479,7 @@ g.Shapes.Circuit = graphiti.shape.basic.Rectangle.extend({ if (figure.hitTest(x, y) == true) { if (result === null) { result = figure; - } else if (result.getZOrder() < figure.getZOrder()) { + } else if (result.getZOrder() < figure.getZOrder() && figure.NAME != "graphiti.Gate" && figure.NAME != "graphiti.Connection") { result = figure; } } @@ -569,7 +569,7 @@ g.Shapes.Part = graphiti.shape.basic.Rectangle.extend({ if (child.hitTest(x, y) == true) { if (result === null) { result = child; - } else if (result.getZOrder() < figure.getZOrder()) { + } else if (result.getZOrder() < figure.getZOrder() && figure.NAME != "graphiti.Connection") { result = child; } } @@ -730,7 +730,7 @@ g.Shapes.Logic = graphiti.shape.basic.Rectangle.extend({ if (figure.hitTest(x, y) == true) { if (result === null) { result = figure; - } else if (result.getZOrder() < figure.getZOrder()) { + } else if (result.getZOrder() < figure.getZOrder() && figure.NAME != "graphiti.Gate" && figure.NAME != "graphiti.Connection") { result = figure; } } @@ -814,15 +814,14 @@ g.Shapes.VectorBiobrick = graphiti.shape.icon.Icon.extend({ this.label.setColor("#0d0d0d"); this.label.setFontColor("#0d0d0d"); this.label.setFontSize(8); - var locator; if (angle < 5.0 * 3.1415926 / 6.0) { - locator = new graphiti.layout.locator.RightLocator(this); + this.locator = new graphiti.layout.locator.RightLocator(this); } else if (angle > 7.0 * 3.1415926 / 6.0) { - locator = new graphiti.layout.locator.LeftLocator(this); + this.locator = new graphiti.layout.locator.LeftLocator(this); } else { - locator = new graphiti.layout.locator.BottomLocator(this); + this.locator = new graphiti.layout.locator.BottomLocator(this); } - this.addFigure(this.label, locator); + this.addFigure(this.label, this.locator); }, onClick: function() { @@ -844,8 +843,8 @@ g.Shapes.VectorBiobrick = graphiti.shape.icon.Icon.extend({ e.figure.setCanvas(null); that.children.remove(e.figure); } - }); - this.addFigure(this.label, new graphiti.layout.locator.RightLocator(this)); + }); + this.addFigure(this.label, this.locator); this.repaint(); } }); @@ -853,7 +852,7 @@ g.Shapes.VectorBiobrick = graphiti.shape.icon.Icon.extend({ g.Gate = graphiti.shape.icon.Icon.extend({ - NAME : "graphiti.Buttons.Back", + NAME : "graphiti.Gate", /** * From fa87f6fc474079b33b513c7e75ecf960e1bb77d2 Mon Sep 17 00:00:00 2001 From: liuxiangyu Date: Wed, 22 Oct 2014 01:57:20 +0800 Subject: [PATCH 13/14] fix radar bug --- server/static/js/circuit.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/server/static/js/circuit.js b/server/static/js/circuit.js index c2f3db1..df8ca1d 100644 --- a/server/static/js/circuit.js +++ b/server/static/js/circuit.js @@ -1063,13 +1063,13 @@ Recommend.prototype.nextstep = function() { this.currentstep.addClass("active"); if (this.index < this.data.length) { for (var i = 0; i < this.data[this.index].length; ++i) { - var newlogic = new Logicitem(this.data[this.index][i], this); + var newlogic = new Logicitem(this.data[this.index][i], i, this); this.logiclist.append(newlogic.view); } } else { for (var i = 0; i < this.result.length; ++i) { - var newlogic = new Logicitem(this.result[i], this); - newlogic.view.unbind("click"); + var newlogic = new Logicitem(this.result[i], i, this); + newlogic.view.unbind("click"); this.logiclist.append(newlogic.view); } this.confirmbut.show(); @@ -1086,13 +1086,14 @@ Recommend.prototype.nextstep = function() { * * @description item object list in recommend */ -function Logicitem(data, parent) { +function Logicitem(data, index, parent) { var that = this; this.view = logic.clone(true); + this.index = index; this.data = data; this.view.find("img")[0].src = "../static/images/frame/" + data.name + ".png"; this.view.find(".label[name='name']").append(data.name); - this.view.find(".right").append("hello"); + this.view.find(".right").append("hello"); var radardata = { labels: ["Efficiency", "Realiability", "Accessiblity", "Demand", "Specificity"], datasets: [ @@ -1109,7 +1110,7 @@ function Logicitem(data, parent) { ] }; this.view.mouseenter(function() { - window.myRadar = new Chart(document.getElementById("recommendradar" + data.id).getContext("2d")).Radar(radardata, { + window.myRadar = new Chart(document.getElementById("recommendradar" + data.id + that.index).getContext("2d")).Radar(radardata, { responsive: true, angleLineColor : "rgba(255,255,255,.5)", scaleLineColor: "rgba(255,255,255,.5)" From 15401a0b2bd4956a7be6583428f6c8c9feea1bd0 Mon Sep 17 00:00:00 2001 From: liuxiangyu Date: Wed, 22 Oct 2014 02:08:32 +0800 Subject: [PATCH 14/14] simulation output css --- server/static/css/simulation.css | 2 -- 1 file changed, 2 deletions(-) diff --git a/server/static/css/simulation.css b/server/static/css/simulation.css index 1640d68..45babb5 100644 --- a/server/static/css/simulation.css +++ b/server/static/css/simulation.css @@ -367,13 +367,11 @@ output { background-image: -o-linear-gradient(top, #444444, #999999); background-image: -webkit-gradient(linear, left top, left bottom, from(#444444), to(#999999)); background-image: -webkit-linear-gradient(top, #444444, #999999); - width: 40px; height: 30px; text-align: center; color: white; border-radius: 10px; display: none; - font: bold 15px/30px Georgia; bottom: 180%; left: 0; margin-left: -1%;