mirror of
https://github.com/bancika/diy-layout-creator
synced 2026-11-10 17:22:09 +10:00
graph improvmeents
This commit is contained in:
@@ -21,6 +21,7 @@
|
||||
*/
|
||||
package org.diylc.common;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.diylc.graph.Graph;
|
||||
@@ -28,5 +29,5 @@ import org.diylc.graph.GraphKey;
|
||||
|
||||
public interface IGraphProcessor {
|
||||
|
||||
Map<GraphKey, Graph> extractGraphs();
|
||||
Map<Graph, List<GraphKey>> extractGraphs();
|
||||
}
|
||||
|
||||
@@ -283,6 +283,6 @@ public abstract class AbstractComponent<T> implements IDIYComponent<T> {
|
||||
|
||||
@Override
|
||||
public String getControlPointNodeName(int index) {
|
||||
return getName() + "." + index;
|
||||
return Integer.toString(index);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,11 +18,36 @@ public class Graph {
|
||||
return this.vertices.equals(other.vertices);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((vertices == null) ? 0 : vertices.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
Graph other = (Graph) obj;
|
||||
if (vertices == null) {
|
||||
if (other.vertices != null)
|
||||
return false;
|
||||
} else if (!vertices.equals(other.vertices))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (Vertex v : vertices) {
|
||||
sb.append("\t").append(v.getNode1()).append(" - ").append(v.getNode2()).append("\n");
|
||||
sb.append("\t").append(v).append("\n");
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@@ -52,6 +52,6 @@ public class Node {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return component.getName() + "." + pointIndex + " @ (" + component.getControlPoint(pointIndex).getX() + ":" + component.getControlPoint(pointIndex).getY() + ")";
|
||||
return component.getName() + "." + component.getControlPointNodeName(pointIndex) /*+ " @ (" + component.getControlPoint(pointIndex).getX() + ":" + component.getControlPoint(pointIndex).getY() + ")"*/;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,29 +1,34 @@
|
||||
package org.diylc.graph;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
|
||||
public class Vertex {
|
||||
|
||||
private Node node1;
|
||||
private Node node2;
|
||||
private Set<Node> nodes = new HashSet<Node>();
|
||||
|
||||
public Vertex(Node node1, Node node2) {
|
||||
this.node1 = node1;
|
||||
this.node2 = node2;
|
||||
nodes.add(node1);
|
||||
nodes.add(node2);
|
||||
}
|
||||
|
||||
public Node getNode1() {
|
||||
return node1;
|
||||
Iterator<Node> i = nodes.iterator();
|
||||
return i.next();
|
||||
}
|
||||
|
||||
public Node getNode2() {
|
||||
return node2;
|
||||
}
|
||||
|
||||
Iterator<Node> i = nodes.iterator();
|
||||
i.next();
|
||||
return i.next();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((node1 == null) ? 0 : node1.hashCode());
|
||||
result = prime * result + ((node2 == null) ? 0 : node2.hashCode());
|
||||
result = prime * result + ((nodes == null) ? 0 : nodes.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -36,21 +41,16 @@ public class Vertex {
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
Vertex other = (Vertex) obj;
|
||||
if (node1 == null) {
|
||||
if (other.node1 != null)
|
||||
if (nodes == null) {
|
||||
if (other.nodes != null)
|
||||
return false;
|
||||
} else if (!node1.equals(other.node1))
|
||||
return false;
|
||||
if (node2 == null) {
|
||||
if (other.node2 != null)
|
||||
return false;
|
||||
} else if (!node2.equals(other.node2))
|
||||
} else if (!nodes.equals(other.nodes))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return node1.toString() + " -> " + node2.toString();
|
||||
return getNode1().toString() + " <-> " + getNode2().toString();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -301,7 +301,7 @@ public class Presenter implements IPlugInPort {
|
||||
LOG.info(String.format("loadProjectFromFile(%s)", fileName));
|
||||
try {
|
||||
List<String> warnings = new ArrayList<String>();
|
||||
Project project = (Project) projectFileManager.deserializeProjectFromFile(fileName, warnings);
|
||||
Project project = (Project) projectFileManager.deserializeProjectFromFile(fileName, warnings);
|
||||
loadProject(project, true);
|
||||
projectFileManager.fireFileStatusChanged();
|
||||
if (!warnings.isEmpty()) {
|
||||
@@ -2687,8 +2687,8 @@ public class Presenter implements IPlugInPort {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public Map<GraphKey, Graph> extractGraphs() {
|
||||
Map<GraphKey, Graph> result = new HashMap<GraphKey, Graph>();
|
||||
public Map<Graph, List<GraphKey>> extractGraphs() {
|
||||
Map<Graph, List<GraphKey>> result = new HashMap<Graph, List<GraphKey>>();
|
||||
List<Node> nodes = new ArrayList<Node>();
|
||||
|
||||
List<ISwitch> switches = new ArrayList<ISwitch>();
|
||||
@@ -2753,7 +2753,15 @@ public class Presenter implements IPlugInPort {
|
||||
}
|
||||
List<Line2D> connections = getConnections(switchPositions);
|
||||
Graph graph = constructGraph(nodes, connections, continuity);
|
||||
result.put(new GraphKey(posList), graph);
|
||||
|
||||
// merge graphs that are effectivelly the same
|
||||
if (result.containsKey(graph)) {
|
||||
result.get(graph).add(new GraphKey(posList));
|
||||
} else {
|
||||
List<GraphKey> list = new ArrayList<GraphKey>();
|
||||
list.add(new GraphKey(posList));
|
||||
result.put(graph, list);
|
||||
}
|
||||
|
||||
// find the next combination if possible
|
||||
if (positions[i] < switches.get(i).getPositionCount() - 1) {
|
||||
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -65,10 +65,11 @@ public class SingleCoilPickup extends AbstractTransparentComponent<String> {
|
||||
|
||||
private static Color BODY_COLOR = Color.white;
|
||||
private static Color BASE_COLOR = Color.gray;
|
||||
private static Color POINT_COLOR = Color.lightGray;
|
||||
// private static Color POINT_COLOR = Color.lightGray;
|
||||
private static Size WIDTH = new Size(15.5d, SizeUnit.mm);
|
||||
private static Size LENGTH = new Size(83d, SizeUnit.mm);
|
||||
private static Size BASE_RADIUS = new Size(0.15d, SizeUnit.in);
|
||||
private static Size BASE_RADIUS = new Size(0.15d, SizeUnit.in);
|
||||
private static Size POINT_SPACING = new Size(0.1d, SizeUnit.in);
|
||||
|
||||
// strat-specific
|
||||
private static Size STRAT_LIP_WIDTH = new Size(5d, SizeUnit.mm);
|
||||
@@ -99,7 +100,52 @@ public class SingleCoilPickup extends AbstractTransparentComponent<String> {
|
||||
private Color poleColor = METAL_COLOR;
|
||||
private Color baseColor = BASE_COLOR;
|
||||
private SingleCoilType type = SingleCoilType.Stratocaster;
|
||||
private PolePieceType polePieceType = PolePieceType.Rods;
|
||||
private PolePieceType polePieceType = PolePieceType.Rods;
|
||||
|
||||
private Point[] controlPoints = new Point[] {new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0)};
|
||||
|
||||
public SingleCoilPickup() {
|
||||
updateControlPoints();
|
||||
}
|
||||
|
||||
private Point[] getControlPoints() {
|
||||
if (controlPoints == null) {
|
||||
controlPoints =
|
||||
new Point[] {controlPoint, new Point(controlPoint.x, controlPoint.y),
|
||||
new Point(controlPoint.x, controlPoint.y), new Point(controlPoint.x, controlPoint.y)};
|
||||
updateControlPoints();
|
||||
}
|
||||
return controlPoints;
|
||||
}
|
||||
|
||||
@SuppressWarnings("incomplete-switch")
|
||||
private void updateControlPoints() {
|
||||
Point[] points = getControlPoints();
|
||||
int pointSpacing = (int) POINT_SPACING.convertToPixels();
|
||||
int dx = 1;
|
||||
int dy = 0;
|
||||
if (orientation != Orientation.DEFAULT) {
|
||||
switch (orientation) {
|
||||
case _90:
|
||||
dx = 0;
|
||||
dy = -1;
|
||||
break;
|
||||
case _180:
|
||||
dx = -1;
|
||||
dy = 0;
|
||||
break;
|
||||
case _270:
|
||||
dx = 0;
|
||||
dy = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
points[1].setLocation(points[0].x + dx * pointSpacing, points[0].y + dy * pointSpacing);
|
||||
points[2]
|
||||
.setLocation(points[0].x + 2 * dx * pointSpacing, points[0].y + 2 * dy * pointSpacing);
|
||||
points[3]
|
||||
.setLocation(points[0].x + 3 * dx * pointSpacing, points[0].y + 3 * dy * pointSpacing);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project,
|
||||
@@ -120,8 +166,8 @@ public class SingleCoilPickup extends AbstractTransparentComponent<String> {
|
||||
g2d.fill(body[3]);
|
||||
else
|
||||
g2d.fill(body[0]);
|
||||
g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : POINT_COLOR);
|
||||
g2d.fill(body[1]);
|
||||
// g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : POINT_COLOR);
|
||||
// g2d.fill(body[1]);
|
||||
|
||||
// g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : color);
|
||||
// g2d.fill(body[3]);
|
||||
@@ -190,9 +236,10 @@ public class SingleCoilPickup extends AbstractTransparentComponent<String> {
|
||||
public Shape[] getBody() {
|
||||
if (body == null) {
|
||||
body = new Shape[5];
|
||||
|
||||
int x = controlPoint.x;
|
||||
int y = controlPoint.y;
|
||||
|
||||
Point[] points = getControlPoints();
|
||||
int x = (points[0].x + points[3].x) / 2;
|
||||
int y = (points[0].y + points[3].y) / 2;;
|
||||
int width = (int) WIDTH.convertToPixels();
|
||||
int length = (int) LENGTH.convertToPixels();
|
||||
int stratInnerLength = (int) STRAT_INNER_LENGTH.convertToPixels();
|
||||
@@ -388,7 +435,7 @@ public class SingleCoilPickup extends AbstractTransparentComponent<String> {
|
||||
|
||||
@Override
|
||||
public int getControlPointCount() {
|
||||
return 1;
|
||||
return 4;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -403,12 +450,12 @@ public class SingleCoilPickup extends AbstractTransparentComponent<String> {
|
||||
|
||||
@Override
|
||||
public Point getControlPoint(int index) {
|
||||
return controlPoint;
|
||||
return getControlPoints()[index];
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setControlPoint(Point point, int index) {
|
||||
this.controlPoint.setLocation(point);
|
||||
getControlPoints()[index].setLocation(point);
|
||||
// Invalidate the body
|
||||
body = null;
|
||||
}
|
||||
@@ -432,7 +479,8 @@ public class SingleCoilPickup extends AbstractTransparentComponent<String> {
|
||||
public void setOrientation(Orientation orientation) {
|
||||
this.orientation = orientation;
|
||||
// Invalidate the body
|
||||
body = null;
|
||||
body = null;
|
||||
updateControlPoints();
|
||||
}
|
||||
|
||||
@EditableProperty
|
||||
@@ -468,7 +516,17 @@ public class SingleCoilPickup extends AbstractTransparentComponent<String> {
|
||||
|
||||
@Override
|
||||
public String getControlPointNodeName(int index) {
|
||||
return getName() + ".PickupTerminal";
|
||||
switch (index) {
|
||||
case 0:
|
||||
return"North Start";
|
||||
case 1:
|
||||
return "North End";
|
||||
case 2:
|
||||
return "South Start";
|
||||
case 3:
|
||||
return "South End";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public enum SingleCoilType {
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user