KiCad-utils/src/main/java/com/rusefi/pcb/PcbMoveTool.java

140 lines
5.0 KiB
Java

package com.rusefi.pcb;
import com.rusefi.pcb.nodes.PcbNode;
import java.io.IOException;
import java.util.List;
/**
* (c) Andrey Belomutskiy
* 12/8/13
*/
public class PcbMoveTool {
public static void main(String[] args) throws IOException {
if (args.length != 4) {
System.out.println("Four parameters expected: SRC_FILENAME DST_FILENAME X Y");
return;
}
String srcFileName = args[0];
String dstFileName = args[1];
double x = Double.parseDouble(args[2]);
double y = Double.parseDouble(args[3]);
PcbNode node = readAndMove(srcFileName, x, y);
node.write(dstFileName);
}
public static PcbNode readAndMove(String fileName, double x, double y) throws IOException {
PcbNode node = PcbNode.readFromFile(fileName);
move(node, x, y);
return node;
}
public static void move(PcbNode pcbNode, double dx, double dy) {
System.out.println("Moving " + pcbNode + ": dx=" +dx + " dy=" + dy);
List<PcbNode> dimensions = pcbNode.iterate("dimension");
System.out.println("Moving " + dimensions.size() + " dimension");
for (PcbNode dimension : dimensions) {
moveAt(dx, dy, dimension.find("gr_text"));
movePts(dx, dy, dimension.find("feature1"));
movePts(dx, dy, dimension.find("feature2"));
movePts(dx, dy, dimension.find("crossbar"));
movePts(dx, dy, dimension.find("arrow1a"));
movePts(dx, dy, dimension.find("arrow1b"));
movePts(dx, dy, dimension.find("arrow2a"));
movePts(dx, dy, dimension.find("arrow2b"));
}
List<PcbNode> gr_lines = pcbNode.iterate("gr_line");
System.out.println("Moving " + gr_lines.size() + " gr_lines");
for (PcbNode gr_line : gr_lines)
moveStartEnd(dx, dy, gr_line);
List<PcbNode> gr_arcs = pcbNode.iterate("gr_arc");
System.out.println("Moving " + gr_arcs.size() + " gr_arcs");
for (PcbNode gr_arc : gr_arcs) {
PcbNode start = gr_arc.find("start");
moveCoordinatesInFirstChildren(dx, dy, start);
PcbNode end = gr_arc.find("end");
moveCoordinatesInFirstChildren(dx, dy, end);
}
List<PcbNode> gr_circles = pcbNode.iterate("gr_circle");
System.out.println("Moving " + gr_circles.size() + " gr_circles");
for (PcbNode gr_circle : gr_circles) {
PcbNode start = gr_circle.find("center");
moveCoordinatesInFirstChildren(dx, dy, start);
PcbNode end = gr_circle.find("end");
moveCoordinatesInFirstChildren(dx, dy, end);
}
List<PcbNode> gr_texts = pcbNode.iterate("gr_text");
System.out.println("Moving " + gr_texts.size() + " gr_texts");
for (PcbNode gr_text : gr_texts)
moveAt(dx, dy, gr_text);
List<PcbNode> zones = pcbNode.iterate("zone");
System.out.println("Moving " + zones.size() + " zones");
for (PcbNode zone : zones) {
List<PcbNode> filledPolygons = zone.iterate("filled_polygon");
for (PcbNode filledPolygon : filledPolygons)
movePts(dx, dy, filledPolygon);
List<PcbNode> polygons = zone.iterate("polygon");
for (PcbNode polygon : polygons)
movePts(dx, dy, polygon);
}
List<PcbNode> segments = pcbNode.iterate("segment");
System.out.println("Moving " + segments.size() + " segments");
for (PcbNode segment : segments)
moveStartEnd(dx, dy, segment);
List<PcbNode> vias = pcbNode.iterate("via");
System.out.println("Moving " + vias.size() + " vias");
for (PcbNode via : vias)
moveAt(dx, dy, via);
List<PcbNode> modules = pcbNode.iterate("module");
System.out.println("Moving " + modules.size() + " modules");
for (PcbNode module : modules)
moveAt(dx, dy, module);
}
public static void movePts(double dx, double dy, PcbNode polygon) {
PcbNode pts = polygon.find("pts");
for (PcbNode point : pts.nodes())
moveCoordinatesInFirstChildren(dx, dy, point);
}
public static void moveStartEnd(double dx, double dy, PcbNode segment) {
PcbNode start = segment.find("start");
moveCoordinatesInFirstChildren(dx, dy, start);
PcbNode end = segment.find("end");
moveCoordinatesInFirstChildren(dx, dy, end);
}
public static void moveAt(double dx, double dy, PcbNode module) {
PcbNode at = module.find("at");
moveCoordinatesInFirstChildren(dx, dy, at);
}
public static void moveCoordinatesInFirstChildren(double dx, double dy, PcbNode at) {
moveCoordinates(dx, dy, at, 0);
}
private static void moveCoordinates(double dx, double dy, PcbNode at, int index) {
double x = at.asDouble(index);
double y = at.asDouble(index + 1);
at.setDouble(index, x + dx);
at.setDouble(index + 1, y + dy);
}
}