diff options
Diffstat (limited to 'src/jcgp/gui/population/ChromosomePane.java')
| -rw-r--r-- | src/jcgp/gui/population/ChromosomePane.java | 106 | 
1 files changed, 79 insertions, 27 deletions
diff --git a/src/jcgp/gui/population/ChromosomePane.java b/src/jcgp/gui/population/ChromosomePane.java index f09d452..ede01e0 100644 --- a/src/jcgp/gui/population/ChromosomePane.java +++ b/src/jcgp/gui/population/ChromosomePane.java @@ -1,7 +1,10 @@  package jcgp.gui.population; +import java.util.ArrayList; +  import javafx.scene.control.ScrollPane;  import javafx.scene.layout.Pane; +import javafx.scene.shape.Line;  import jcgp.backend.population.Chromosome;  import jcgp.backend.population.Connection;  import jcgp.backend.population.Input; @@ -26,16 +29,20 @@ public class ChromosomePane extends ScrollPane {  	private GUIInput[] guiInputs;  	private GUIOutput[] guiOutputs; +	private ArrayList<Line> connectionLines; +	  	private Pane content;  	private int rows, columns;  	private boolean target = false; -	public ChromosomePane(Chromosome chromosome, GUI gui, PopulationPane parent) { +	public ChromosomePane(Chromosome chromosome) {  		super(); -		final Resources resources = gui.getExperiment().getResources(); +		final Resources resources = GUI.resources; +		 +		connectionLines = new ArrayList<Line>();  		rows = resources.rows();  		columns = resources.columns(); @@ -44,7 +51,9 @@ public class ChromosomePane extends ScrollPane {  		content.setId("content pane for genes");  		// generate the GUIGenes -		// inputs +		/*  +		 * inputs +		 */  		guiInputs = new GUIInput[resources.inputs()];  		for (int i = 0; i < guiInputs.length; i++) {  			// make the GUI elements @@ -54,43 +63,91 @@ public class ChromosomePane extends ScrollPane {  			GUIHandlers.addHandlers(guiInputs[i]);  		}  		content.getChildren().addAll(guiInputs); -		// nodes +		 +		/*  +		 * nodes +		 */  		guiNodes = new GUINode[rows][columns]; +		double angle, xPos, yPos;  		for (int r = 0; r < rows; r++) {  			for (int c = 0; c < columns; c++) { +				// make the connection lines +				Line lines[] = new Line[resources.arity()]; +				for (int l = 0; l < lines.length; l++) { +					angle = ((((double) (l + 1)) / ((double) (lines.length + 1))) * Constants.THETA) - (Constants.THETA / 2); +					xPos = (-Math.cos(angle) * Constants.NODE_RADIUS) + (((c + 1) * (2 * Constants.NODE_RADIUS + Constants.SPACING)) + Constants.NODE_RADIUS); +					yPos = (Math.sin(angle) * Constants.NODE_RADIUS) + ((r * (2 * Constants.NODE_RADIUS + Constants.SPACING)) + Constants.NODE_RADIUS); +					 +					lines[l] = new Line(xPos, yPos, xPos, yPos); +					lines[l].setMouseTransparent(true); +					//lines[l].setVisible(false); +					connectionLines.add(lines[l]); +				}  				// make the GUI elements -				guiNodes[r][c] = new GUINode(chromosome.getNode(r, c)); +				guiNodes[r][c] = new GUINode(chromosome.getNode(r, c), lines) { +					@Override +					public GUIConnection getGUIConnection(Connection connection) { +						if (connection instanceof Input) { +							return guiInputs[((Input) connection).getIndex()]; +						} else if (connection instanceof Node) { +							return guiNodes[((Node) connection).getRow()][((Node) connection).getColumn()]; +						} else { +							// something bad happened! +							throw new ClassCastException(); +						} +					} +				};  				guiNodes[r][c].relocate(((chromosome.getNode(r, c).getColumn() + 1) * (2 * Constants.NODE_RADIUS + Constants.SPACING)) + Constants.NODE_RADIUS,  						(chromosome.getNode(r, c).getRow() * (2 * Constants.NODE_RADIUS + Constants.SPACING)) + Constants.NODE_RADIUS);  				GUIHandlers.addHandlers(guiNodes[r][c]);  			}  			content.getChildren().addAll(guiNodes[r]);  		} -		// outputs +		 +		/*  +		 * outputs +		 */  		guiOutputs = new GUIOutput[resources.outputs()];  		for (int i = 0; i < guiOutputs.length; i++) {  			// make the GUI elements -			guiOutputs[i] = new GUIOutput(chromosome.getOutput(i)); +			guiOutputs[i] = new GUIOutput(chromosome.getOutput(i)) { + +				@Override +				public GUIConnection getGUIConnection(Connection connection) { +					if (connection instanceof Input) { +						return guiInputs[((Input) connection).getIndex()]; +					} else if (connection instanceof Node) { +						return guiNodes[((Node) connection).getRow()][((Node) connection).getColumn()]; +					} else { +						// something bad happened! +						throw new ClassCastException(); +					} +				} +				 +			};  			guiOutputs[i].relocate(((resources.columns() + 1) * (2 * Constants.NODE_RADIUS + Constants.SPACING)) + Constants.NODE_RADIUS,  					(chromosome.getOutput(i).getIndex() * (2 * Constants.NODE_RADIUS + Constants.SPACING)) + Constants.NODE_RADIUS);  			GUIHandlers.addHandlers(guiOutputs[i]);  		}  		content.getChildren().addAll(guiOutputs); +		// add lines to the pane as on top of genes +		content.getChildren().addAll(connectionLines); +		  		setPrefWidth(620);	  		setContent(content);  	} -	protected GUIGene getGuiGene(Connection gene) { -		if (gene instanceof Input) { -			return guiInputs[((Input) gene).getIndex()]; -		} else if (gene instanceof Node) { -			return guiNodes[((Node) gene).getRow()][((Node) gene).getColumn()]; -		} else { -			// something bad happened! -			throw new ClassCastException(); -		}	 -	} +//	protected GUIGene getGuiGene(Connection gene) { +//		if (gene instanceof Input) { +//			return guiInputs[((Input) gene).getIndex()]; +//		} else if (gene instanceof Node) { +//			return guiNodes[((Node) gene).getRow()][((Node) gene).getColumn()]; +//		} else { +//			// something bad happened! +//			throw new ClassCastException(); +//		}	 +//	}  	protected boolean isTarget() {  		return target; @@ -111,7 +168,7 @@ public class ChromosomePane extends ScrollPane {  		}  	} -	public static boolean isAllowed(GUIGene source, GUIGene target) { +	public static boolean isAllowed(GUIMutable source, GUIConnection target) {  		if (source instanceof GUINode) {  			// if the source is a node, all inputs and some nodes are valid  			if (target instanceof GUIInput) { @@ -119,23 +176,18 @@ public class ChromosomePane extends ScrollPane {  			} else if (target instanceof GUINode) {  				// target and source are nodes, let's look at levels back  				Node t = ((GUINode) target).getNode(), s = ((GUINode) source).getNode(); -				if (s.getColumn() - t.getColumn() > 0 && s.getColumn() - t.getColumn() <= 1 /* TODO this should be levels back */) { +				if (s.getColumn() - t.getColumn() > 0 && s.getColumn() - t.getColumn() <= GUI.resources.levelsBack()) {  					return true;  				} -				return false; -			} else if (target instanceof GUIOutput) { -				return false; -			} else { -				throw new ClassCastException("Target was neither GUINode nor GUIInput nor GUIOutput.");  			} +			return false;  		} else if (source instanceof GUIOutput) {  			// if the source is an output, any node or input is valid  			if (target instanceof GUINode || target instanceof GUIInput) {  				return true; -			} else if (target instanceof GUIOutput) { -				return false;  			} else { -				throw new ClassCastException("Target was neither GUINode nor GUIInput nor GUIOutput."); +				// this should never happen... +				return false;  			}  		}  		// if the source was neither node nor output, something bad is happening  | 
