From 953c3b9edf56e9c39940abc4f646fc2c7dc784db Mon Sep 17 00:00:00 2001 From: hneemann Date: Thu, 31 Mar 2016 23:27:28 +0200 Subject: [PATCH] added exporter for SVG-LaTeX --- src/main/dig/FullAdder_RC_CLA.dig | 12 ++--- .../digital/draw/graphics/GraphicSVG.java | 11 ++--- .../draw/graphics/GraphicSVGLaTeX.java | 49 +++++++++++++++++++ .../digital/draw/shapes/ClockShape.java | 2 +- .../digital/draw/shapes/DemuxerShape.java | 8 +-- .../digital/draw/shapes/InputShape.java | 4 +- .../digital/draw/shapes/MuxerShape.java | 8 +-- .../java/de/neemann/digital/gui/Main.java | 6 +-- src/main/resources/lang/lang_en.properties | 1 + 9 files changed, 72 insertions(+), 29 deletions(-) create mode 100644 src/main/java/de/neemann/digital/draw/graphics/GraphicSVGLaTeX.java diff --git a/src/main/dig/FullAdder_RC_CLA.dig b/src/main/dig/FullAdder_RC_CLA.dig index ce3068615..3f9c8f67b 100644 --- a/src/main/dig/FullAdder_RC_CLA.dig +++ b/src/main/dig/FullAdder_RC_CLA.dig @@ -30,7 +30,7 @@ Label - C_i-1 + C0 @@ -242,7 +242,7 @@ Label - C_i + C3 @@ -346,7 +346,7 @@ Label - C_i-1 + C0 @@ -638,10 +638,6 @@ Inputs 5 - - Inputs - 5 - 0 @@ -651,7 +647,7 @@ Label - C_i + C3 diff --git a/src/main/java/de/neemann/digital/draw/graphics/GraphicSVG.java b/src/main/java/de/neemann/digital/draw/graphics/GraphicSVG.java index ef39478fd..68476ea17 100644 --- a/src/main/java/de/neemann/digital/draw/graphics/GraphicSVG.java +++ b/src/main/java/de/neemann/digital/draw/graphics/GraphicSVG.java @@ -7,8 +7,7 @@ import java.util.Date; * @author hneemann */ public class GraphicSVG implements Graphic, Closeable { - private static final int TEXTSIZE = 20; - private static final int DEF_SCALE = 100; + private static final int DEF_SCALE = 30; private final BufferedWriter w; public GraphicSVG(File file, Vector min, Vector max) throws IOException { @@ -22,7 +21,7 @@ public class GraphicSVG implements Graphic, Closeable { public GraphicSVG(File file, Vector min, Vector max, File source, int svgScale) throws IOException { w = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "utf-8")); w.write("\n" + - "\n"); + "\n"); w.write("\n"); if (source != null) { w.write("\n"); @@ -32,8 +31,8 @@ public class GraphicSVG implements Graphic, Closeable { " xmlns:svg=\"http://www.w3.org/2000/svg\"\n" + " xmlns=\"http://www.w3.org/2000/svg\"\n"); - double width = (max.x - min.x) * svgScale / 900; - double height = (max.y - min.y) * svgScale / 900; + double width = (max.x - min.x) * svgScale / 100; + double height = (max.y - min.y) * svgScale / 100; w.write(" width=\"" + width + "mm\"\n" + " height=\"" + height + "mm\"\n" + @@ -142,7 +141,7 @@ public class GraphicSVG implements Graphic, Closeable { } } - private String getColor(Style style) { + public String getColor(Style style) { return "#" + Integer.toHexString(style.getColor().getRGB()).substring(2); } diff --git a/src/main/java/de/neemann/digital/draw/graphics/GraphicSVGLaTeX.java b/src/main/java/de/neemann/digital/draw/graphics/GraphicSVGLaTeX.java new file mode 100644 index 000000000..e3bb5af36 --- /dev/null +++ b/src/main/java/de/neemann/digital/draw/graphics/GraphicSVGLaTeX.java @@ -0,0 +1,49 @@ +package de.neemann.digital.draw.graphics; + +import java.io.File; +import java.io.IOException; + +/** + * @author hneemann + */ +public class GraphicSVGLaTeX extends GraphicSVG { + public GraphicSVGLaTeX(File file, Vector min, Vector max) throws IOException { + super(file, min, max); + } + + @Override + public void drawText(Vector p1, Vector p2, String text, Orientation orientation, Style style) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < text.length(); i++) { + char c = text.charAt(i); + switch (c) { + case '~': + case '\u00AC': + sb.append("$\\neg$"); + break; + case '\u2265': + sb.append("$\\geq$"); + break; + case '&': + sb.append("\\&"); + break; + default: + sb.append(c); + } + } + super.drawText(p1, p2, sb.toString(), orientation, style); + } + + @Override + public void drawCircle(Vector p1, Vector p2, Style style) { + if ((style != Style.WIRE && style != Style.WIRE_OUT) || Math.abs(p1.x - p2.x) > 2) + super.drawCircle(p1, p2, style); + } + + @Override + public String getColor(Style style) { + if (style == Style.WIRE) return super.getColor(Style.NORMAL); + if (style == Style.WIRE_OUT) return super.getColor(Style.NORMAL); + return super.getColor(style); + } +} diff --git a/src/main/java/de/neemann/digital/draw/shapes/ClockShape.java b/src/main/java/de/neemann/digital/draw/shapes/ClockShape.java index 80480336d..b318d8d1d 100644 --- a/src/main/java/de/neemann/digital/draw/shapes/ClockShape.java +++ b/src/main/java/de/neemann/digital/draw/shapes/ClockShape.java @@ -46,7 +46,7 @@ public class ClockShape implements Shape { @Override public void drawTo(Graphic graphic, boolean heighLight) { - graphic.drawPolygon(new Polygon(true).add(-SIZE * 2 - 2, -SIZE).add(-2, -SIZE).add(-2, SIZE).add(-SIZE * 2 - 2, SIZE), Style.NORMAL); + graphic.drawPolygon(new Polygon(true).add(-SIZE * 2 - 1, -SIZE).add(-1, -SIZE).add(-1, SIZE).add(-SIZE * 2 - 1, SIZE), Style.NORMAL); Vector textPos = new Vector(-SIZE * 3, 0); graphic.drawText(textPos, textPos.add(1, 0), label, Orientation.RIGHTCENTER, Style.NORMAL); diff --git a/src/main/java/de/neemann/digital/draw/shapes/DemuxerShape.java b/src/main/java/de/neemann/digital/draw/shapes/DemuxerShape.java index 6107ccf49..7995df22b 100644 --- a/src/main/java/de/neemann/digital/draw/shapes/DemuxerShape.java +++ b/src/main/java/de/neemann/digital/draw/shapes/DemuxerShape.java @@ -51,10 +51,10 @@ public class DemuxerShape implements Shape { @Override public void drawTo(Graphic graphic, boolean highLight) { graphic.drawPolygon(new Polygon(true) - .add(2, 3) - .add(SIZE * 2 - 2, -2) - .add(SIZE * 2 - 2, height + 2) - .add(2, height - 3), Style.NORMAL); + .add(1, 3) + .add(SIZE * 2 - 1, -2) + .add(SIZE * 2 - 1, height + 2) + .add(1, height - 3), Style.NORMAL); graphic.drawText(new Vector(SIZE * 2 - 2, 0), new Vector(SIZE * 2, 0), "0", Orientation.RIGHTTOP, Style.SHAPE_PIN); } } diff --git a/src/main/java/de/neemann/digital/draw/shapes/InputShape.java b/src/main/java/de/neemann/digital/draw/shapes/InputShape.java index 007951045..15049e2fd 100644 --- a/src/main/java/de/neemann/digital/draw/shapes/InputShape.java +++ b/src/main/java/de/neemann/digital/draw/shapes/InputShape.java @@ -62,9 +62,9 @@ public class InputShape implements Shape { } } - Vector center = new Vector(-2 - SIZE, 0); + Vector center = new Vector(-1 - SIZE, 0); graphic.drawCircle(center.sub(RAD), center.add(RAD), style); - graphic.drawPolygon(new Polygon(true).add(-SIZE * 2 - 2, -SIZE).add(-2, -SIZE).add(-2, SIZE).add(-SIZE * 2 - 2, SIZE), Style.NORMAL); + graphic.drawPolygon(new Polygon(true).add(-SIZE * 2 - 1, -SIZE).add(-1, -SIZE).add(-1, SIZE).add(-SIZE * 2 - 1, SIZE), Style.NORMAL); Vector textPos = new Vector(-SIZE * 3, 0); graphic.drawText(textPos, textPos.add(1, 0), label, Orientation.RIGHTCENTER, Style.NORMAL); diff --git a/src/main/java/de/neemann/digital/draw/shapes/MuxerShape.java b/src/main/java/de/neemann/digital/draw/shapes/MuxerShape.java index 15f152cac..effb4a359 100644 --- a/src/main/java/de/neemann/digital/draw/shapes/MuxerShape.java +++ b/src/main/java/de/neemann/digital/draw/shapes/MuxerShape.java @@ -46,10 +46,10 @@ public class MuxerShape implements Shape { @Override public void drawTo(Graphic graphic, boolean heighLight) { graphic.drawPolygon(new Polygon(true) - .add(2, -2) - .add(SIZE * 2 - 2, 3) - .add(SIZE * 2 - 2, inputCount * SIZE - 3) - .add(2, inputCount * SIZE + 2), Style.NORMAL); + .add(1, -2) + .add(SIZE * 2 - 1, 3) + .add(SIZE * 2 - 1, inputCount * SIZE - 3) + .add(1, inputCount * SIZE + 2), Style.NORMAL); graphic.drawText(new Vector(3, 0), new Vector(4, 0), "0", Orientation.LEFTTOP, Style.SHAPE_PIN); } } diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index e3e268e4e..d2040b2d8 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -5,10 +5,7 @@ import de.neemann.digital.core.wiring.Clock; import de.neemann.digital.draw.elements.Circuit; import de.neemann.digital.draw.elements.PinException; import de.neemann.digital.draw.elements.PinOrder; -import de.neemann.digital.draw.graphics.Exporter; -import de.neemann.digital.draw.graphics.Graphic; -import de.neemann.digital.draw.graphics.GraphicMinMax; -import de.neemann.digital.draw.graphics.GraphicSVG; +import de.neemann.digital.draw.graphics.*; import de.neemann.digital.draw.library.ElementLibrary; import de.neemann.digital.draw.model.ModelDescription; import de.neemann.digital.draw.model.RealTimeClock; @@ -164,6 +161,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { JMenu export = new JMenu(Lang.get("menu_export")); export.add(new ExportAction(Lang.get("menu_exportSVG"), "svg", GraphicSVG::new)); + export.add(new ExportAction(Lang.get("menu_exportSVGLaTex"), "svg", GraphicSVGLaTeX::new)); JMenu file = new JMenu(Lang.get("menu_file")); diff --git a/src/main/resources/lang/lang_en.properties b/src/main/resources/lang/lang_en.properties index ed9b4ca6c..348f36a7b 100644 --- a/src/main/resources/lang/lang_en.properties +++ b/src/main/resources/lang/lang_en.properties @@ -133,6 +133,7 @@ menu_fast=Run Fast menu_fast_tt=Runs the model until a break is detected by the BRK element. menu_export=Export menu_exportSVG=Export SVG +menu_exportSVGLaTex=Export SVG+LaTeX menu_delete=Delete elements menu_delete_tt=Delete selected single element or group of elements