CircuitOnline/public/js/wire.js

177 lines
6 KiB
JavaScript
Raw Normal View History

//wire object
function Wire(node1, node2, scope) {
this.objectType = "Wire";
this.node1 = node1;
this.scope = scope;
this.node2 = node2;
this.type = "horizontal";
this.updateData();
this.scope.wires.push(this);
forceResetNodes=true;
}
//if data changes
// get the terminals of the wires
Wire.prototype.updateData = function() {
this.x1 = this.node1.absX();
this.y1 = this.node1.absY();
this.x2 = this.node2.absX();
this.y2 = this.node2.absY();
if (this.x1 == this.x2) this.type = "vertical";
}
Wire.prototype.updateScope=function(scope){
this.scope=scope;
this.checkConnections();
}
//to check if nodes are disconnected
Wire.prototype.checkConnections = function() {
var check = this.node1.deleted||this.node2.deleted||!this.node1.connections.contains(this.node2) || !this.node2.connections.contains(this.node1);
if (check) this.delete();
return check;
}
Wire.prototype.update = function() {
if(embed)return;
if(this.node1.absX()==this.node2.absX()){
this.x1=this.x2=this.node1.absX();
this.type="vertical";
}
else if(this.node1.absY()==this.node2.absY()){
this.y1=this.y2=this.node1.absY();
this.type="horizontal";
}
var updated = false;
if (wireToBeChecked && this.checkConnections()) {
this.delete();
return;
} // SLOW , REMOVE
// select a wire
if (simulationArea.shiftDown==false&&simulationArea.mouseDown == true && simulationArea.selected == false && this.checkWithin(simulationArea.mouseDownX, simulationArea.mouseDownY)) {
simulationArea.selected = true;
simulationArea.lastSelected = this;
updated = true;
}
// double click on a wire to place a node
else if(simulationArea.mouseDown && simulationArea.lastSelected==this&& !this.checkWithin(simulationArea.mouseX, simulationArea.mouseY)){
// lets move this wiree !
if(this.node1.type == NODE_INTERMEDIATE && this.node2.type == NODE_INTERMEDIATE) {
if(this.type=="horizontal"){
this.node1.y= simulationArea.mouseY
this.node2.y= simulationArea.mouseY
} else if(this.type=="vertical"){
this.node1.x= simulationArea.mouseX
this.node2.x= simulationArea.mouseX
}
}
// var n = new Node(simulationArea.mouseDownX, simulationArea.mouseDownY, 2, this.scope.root);
// n.clicked = true;
// n.wasClicked = true;
// simulationArea.lastSelected=n;
// this.converge(n);
}
if (simulationArea.lastSelected == this) {
}
if (this.node1.deleted || this.node2.deleted){
this.delete();
return;
} //if either of the nodes are deleted
//NODE POSITION when we move a COMPONENT to make lines drawen horzontally or vertically
if (simulationArea.mouseDown == false) {
if (this.type == "horizontal") {
if (this.node1.absY() != this.y1) {
// if(this.checkConnections()){this.delete();return;}
var n = new Node(this.node1.absX(), this.y1, 2, this.scope.root);
this.converge(n);
updated = true;
} else if (this.node2.absY() != this.y2) {
// if(this.checkConnections()){this.delete();return;}
var n = new Node(this.node2.absX(), this.y2, 2, this.scope.root);
this.converge(n);
updated = true;
}
} else if (this.type == "vertical") {
if (this.node1.absX() != this.x1) {
// if(this.checkConnections()){this.delete();return;}
var n = new Node(this.x1, this.node1.absY(), 2, this.scope.root);
this.converge(n);
updated = true;
} else if (this.node2.absX() != this.x2) {
// if(this.checkConnections()){this.delete();return;}
var n = new Node(this.x2, this.node2.absY(), 2, this.scope.root);
this.converge(n);
updated = true;
}
}
}
return updated;
}
Wire.prototype.draw = function() {
// for calculating min-max Width,min-max Height
ctx = simulationArea.context;
var color;
if (simulationArea.lastSelected == this)
color = "blue";
else if (this.node1.value == undefined||this.node2.value == undefined)
color = "red";
else if (this.node1.bitWidth == 1)
color = ["red", "DarkGreen", "Lime"][this.node1.value + 1];
else
color = "black";
drawLine(ctx, this.node1.absX(), this.node1.absY(), this.node2.absX(), this.node2.absY(), color, 3);
}
// checks if node lies on wire
Wire.prototype.checkConvergence = function(n) {
return this.checkWithin(n.absX(), n.absY());
}
// fn checks if coordinate lies on wire
Wire.prototype.checkWithin = function(x, y) {
if ((this.type == "horizontal") && (this.node1.absX() < this.node2.absX()) && (x > this.node1.absX()) && (x < this.node2.absX()) && (y === this.node2.absY()))
return true;
else if ((this.type == "horizontal") && (this.node1.absX() > this.node2.absX()) && (x < this.node1.absX()) && (x > this.node2.absX()) && (y === this.node2.absY()))
return true;
else if ((this.type == 'vertical') && (this.node1.absY() < this.node2.absY()) && (y > this.node1.absY()) && (y < this.node2.absY()) && (x === this.node2.absX()))
return true;
else if ((this.type == 'vertical') && (this.node1.absY() > this.node2.absY()) && (y < this.node1.absY()) && (y > this.node2.absY()) && (x === this.node2.absX()))
return true
return false;
}
//add intermediate node between these 2 nodes
Wire.prototype.converge = function(n) {
this.node1.connect(n);
this.node2.connect(n);
this.delete();
}
Wire.prototype.delete = function() {
forceResetNodes=true;
updateSimulation = true;
this.node1.connections.clean(this.node2);
this.node2.connections.clean(this.node1);
this.scope.wires.clean(this);
this.node1.checkDeleted();
this.node2.checkDeleted();
}