* flatpak file updated

* add sha generator

* fix mail

* remove mail

* Mini Toggle Switch - lugs do not get rotated when changing orientation;
rotate from the context menu doesn't work

* Added 'SVG Image' component

* Fixed the issue with Perf Board, Vero Board and TriPad Board sometimes
rendering an extra row with pads when there's no space for them

* release 4.18
This commit is contained in:
Bane Stojkovic
2021-07-11 15:05:11 +02:00
committed by GitHub
parent ad8d719eeb
commit 878d048040
26 changed files with 605 additions and 16 deletions
+1 -1
View File
@@ -6,9 +6,9 @@
<classpathentry kind="lib" path="lib/junit-4.7.jar"/> <classpathentry kind="lib" path="lib/junit-4.7.jar"/>
<classpathentry kind="lib" path="lib/app-framework.jar"/> <classpathentry kind="lib" path="lib/app-framework.jar"/>
<classpathentry kind="lib" path="lib/jettison-1.0.1.jar"/> <classpathentry kind="lib" path="lib/jettison-1.0.1.jar"/>
<classpathentry kind="lib" path="lib/xstream-1.3.1.jar"/>
<classpathentry kind="lib" path="lib/java-http-proxy.jar"/> <classpathentry kind="lib" path="lib/java-http-proxy.jar"/>
<classpathentry kind="lib" path="lib/AppleJavaExtensions.jar"/> <classpathentry kind="lib" path="lib/AppleJavaExtensions.jar"/>
<classpathentry kind="lib" path="lib/xstream-1.4.3.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="bin"/> <classpathentry kind="output" path="bin"/>
</classpath> </classpath>
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,5 @@
package org.diylc.core.annotations;
public enum BinaryType {
IMAGE, SVG
}
@@ -0,0 +1,31 @@
/*
DIY Layout Creator (DIYLC).
Copyright (c) 2009-2018 held jointly by the individual authors.
This file is part of DIYLC.
DIYLC is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DIYLC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with DIYLC. If not, see <http://www.gnu.org/licenses/>.
*/
package org.diylc.core.annotations;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface ByteArrayProperty {
public BinaryType binaryType();
}
@@ -3545,5 +3545,29 @@
</changes> </changes>
<url>https://github.com/bancika/diy-layout-creator/releases</url> <url>https://github.com/bancika/diy-layout-creator/releases</url>
</org.diylc.appframework.update.Version> </org.diylc.appframework.update.Version>
<org.diylc.appframework.update.Version>
<versionNumber>
<major>4</major>
<minor>18</minor>
<build>0</build>
</versionNumber>
<releaseDate>2021-07-11 00:00:00.000 CET</releaseDate>
<name></name>
<changes>
<org.diylc.appframework.update.Change>
<changeType>NEW_FEATURE</changeType>
<description>Added 'SVG Image' component, to allow importing vector graphics into projects</description>
</org.diylc.appframework.update.Change>
<org.diylc.appframework.update.Change>
<changeType>BUG_FIX</changeType>
<description>Mini Toggle Switch - lugs do not get rotated when changing orientation; rotate from the context menu doesn't work</description>
</org.diylc.appframework.update.Change>
<org.diylc.appframework.update.Change>
<changeType>BUG_FIX</changeType>
<description>Fixed the issue with Perf Board, Vero Board and TriPad Board sometimes rendering an extra row with pads when there's no space for them</description>
</org.diylc.appframework.update.Change>
</changes>
<url>https://github.com/bancika/diy-layout-creator/releases</url>
</org.diylc.appframework.update.Version>
</a> </a>
</java.util.Arrays_-ArrayList> </java.util.Arrays_-ArrayList>
+1
View File
@@ -6,6 +6,7 @@
<classpathentry kind="lib" path="lib/app-framework.jar"/> <classpathentry kind="lib" path="lib/app-framework.jar"/>
<classpathentry kind="lib" path="lib/jep-2.4.1.jar"/> <classpathentry kind="lib" path="lib/jep-2.4.1.jar"/>
<classpathentry kind="lib" path="lib/poi-3.5-FINAL-20090928.jar"/> <classpathentry kind="lib" path="lib/poi-3.5-FINAL-20090928.jar"/>
<classpathentry kind="lib" path="lib/svgSalamander-1.1.2.4.jar"/>
<classpathentry combineaccessrules="false" kind="src" path="/diylc-core"/> <classpathentry combineaccessrules="false" kind="src" path="/diylc-core"/>
<classpathentry kind="lib" path="lib/xstream-1.4.3.jar"/> <classpathentry kind="lib" path="lib/xstream-1.4.3.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/> <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
Binary file not shown.
Binary file not shown.
@@ -80,7 +80,7 @@ public class PerfBoard extends AbstractBoard {
int holeDiameter = getClosestOdd((int) HOLE_SIZE.convertToPixels()); int holeDiameter = getClosestOdd((int) HOLE_SIZE.convertToPixels());
double spacing = this.spacing.convertToPixels(); double spacing = this.spacing.convertToPixels();
while (y < finalSecondPoint.getY() - spacing) { while (y < finalSecondPoint.getY() - spacing - diameter / 2) {
x = firstPoint.getX(); x = firstPoint.getX();
y += spacing; y += spacing;
while (x < finalSecondPoint.getX() - spacing - diameter) { while (x < finalSecondPoint.getX() - spacing - diameter) {
@@ -71,7 +71,7 @@ public class TriPadBoard extends AbstractVeroBoard {
double spacing = this.spacing.convertToPixels(); double spacing = this.spacing.convertToPixels();
if (orientation == OrientationHV.HORIZONTAL) { if (orientation == OrientationHV.HORIZONTAL) {
while (y < finalSecondPoint.getY() - spacing) { while (y < finalSecondPoint.getY() - spacing - stripSize / 2) {
x = firstPoint.getX(); x = firstPoint.getX();
y += spacing; y += spacing;
@@ -70,7 +70,7 @@ public class VeroBoard extends AbstractVeroBoard {
int spacing = (int) this.spacing.convertToPixels(); int spacing = (int) this.spacing.convertToPixels();
if (orientation == OrientationHV.HORIZONTAL) { if (orientation == OrientationHV.HORIZONTAL) {
while (y < finalSecondPoint.getY() - spacing) { while (y < finalSecondPoint.getY() - spacing - stripSize / 2) {
x = firstPoint.getX(); x = firstPoint.getX();
y += spacing; y += spacing;
g2d.setColor(stripColor); g2d.setColor(stripColor);
@@ -37,6 +37,7 @@ import org.diylc.common.IPlugInPort;
import org.diylc.common.ObjectCache; import org.diylc.common.ObjectCache;
import org.diylc.common.OrientationHV; import org.diylc.common.OrientationHV;
import org.diylc.components.AbstractTransparentComponent; import org.diylc.components.AbstractTransparentComponent;
import org.diylc.components.transform.MiniToggleSwitchTransformer;
import org.diylc.core.ComponentState; import org.diylc.core.ComponentState;
import org.diylc.core.IDIYComponent; import org.diylc.core.IDIYComponent;
import org.diylc.core.IDrawingObserver; import org.diylc.core.IDrawingObserver;
@@ -53,7 +54,7 @@ import org.diylc.utils.Constants;
@ComponentDescriptor(name = "Mini Toggle Switch", category = "Electro-Mechanical", author = "Branislav Stojkovic", @ComponentDescriptor(name = "Mini Toggle Switch", category = "Electro-Mechanical", author = "Branislav Stojkovic",
description = "Panel mounted mini toggle switch", zOrder = IDIYComponent.COMPONENT, description = "Panel mounted mini toggle switch", zOrder = IDIYComponent.COMPONENT,
instanceNamePrefix = "SW", autoEdit = false, enableCache = true) instanceNamePrefix = "SW", autoEdit = false, enableCache = true, transformer = MiniToggleSwitchTransformer.class)
public class MiniToggleSwitch extends AbstractTransparentComponent<ToggleSwitchType> implements ISwitch { public class MiniToggleSwitch extends AbstractTransparentComponent<ToggleSwitchType> implements ISwitch {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@@ -286,9 +287,19 @@ public class MiniToggleSwitch extends AbstractTransparentComponent<ToggleSwitchT
// so far. // so far.
drawingObserver.stopTracking(); drawingObserver.stopTracking();
// Draw lugs. // Draw lugs.
int circleDiameter = getClosestOdd((int) CIRCLE_SIZE.convertToPixels()); int circleDiameter = getClosestOdd((int) CIRCLE_SIZE.convertToPixels());
int lugWidth = getClosestOdd((int) LUG_WIDTH.convertToPixels());
int lugHeight = getClosestOdd((int) LUG_THICKNESS.convertToPixels()); int lugWidth;
int lugHeight;
if (getOrientation() == OrientationHV.HORIZONTAL) {
lugHeight = getClosestOdd((int) LUG_WIDTH.convertToPixels());
lugWidth = getClosestOdd((int) LUG_THICKNESS.convertToPixels());
} else {
lugWidth = getClosestOdd((int) LUG_WIDTH.convertToPixels());
lugHeight = getClosestOdd((int) LUG_THICKNESS.convertToPixels());
}
for (Point2D p : controlPoints) { for (Point2D p : controlPoints) {
if (outlineMode) { if (outlineMode) {
g2d.setColor(theme.getOutlineColor()); g2d.setColor(theme.getOutlineColor());
@@ -42,7 +42,9 @@ import org.diylc.core.IDIYComponent;
import org.diylc.core.IDrawingObserver; import org.diylc.core.IDrawingObserver;
import org.diylc.core.Project; import org.diylc.core.Project;
import org.diylc.core.VisibilityPolicy; import org.diylc.core.VisibilityPolicy;
import org.diylc.core.annotations.BinaryType;
import org.diylc.core.annotations.BomPolicy; import org.diylc.core.annotations.BomPolicy;
import org.diylc.core.annotations.ByteArrayProperty;
import org.diylc.core.annotations.ComponentDescriptor; import org.diylc.core.annotations.ComponentDescriptor;
import org.diylc.core.annotations.EditableProperty; import org.diylc.core.annotations.EditableProperty;
import org.diylc.core.annotations.PercentEditor; import org.diylc.core.annotations.PercentEditor;
@@ -207,6 +209,7 @@ public class Image extends AbstractTransparentComponent<Void> {
return new ImageIcon(data); return new ImageIcon(data);
} }
@ByteArrayProperty(binaryType = BinaryType.IMAGE)
@EditableProperty(name = "Image") @EditableProperty(name = "Image")
public byte[] getData() { public byte[] getData() {
return data; return data;
@@ -0,0 +1,294 @@
/*
*
* DIY Layout Creator (DIYLC). Copyright (c) 2009-2018 held jointly by the individual authors.
*
* This file is part of DIYLC.
*
* DIYLC is free software: you can redistribute it and/or modify it under the terms of the GNU
* General Public License as published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* DIYLC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License along with DIYLC. If not, see
* <http://www.gnu.org/licenses/>.
*/
package org.diylc.components.misc;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Composite;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.URI;
import java.util.Random;
import org.apache.log4j.Logger;
import org.apache.poi.util.IOUtils;
import org.diylc.common.ObjectCache;
import org.diylc.common.Orientation;
import org.diylc.components.AbstractTransparentComponent;
import org.diylc.components.transform.ImageTransformer;
import org.diylc.core.ComponentState;
import org.diylc.core.IDIYComponent;
import org.diylc.core.IDrawingObserver;
import org.diylc.core.Project;
import org.diylc.core.VisibilityPolicy;
import org.diylc.core.annotations.BinaryType;
import org.diylc.core.annotations.BomPolicy;
import org.diylc.core.annotations.ByteArrayProperty;
import org.diylc.core.annotations.ComponentDescriptor;
import org.diylc.core.annotations.EditableProperty;
import org.diylc.core.annotations.PercentEditor;
import com.kitfox.svg.SVGDiagram;
import com.kitfox.svg.SVGException;
import com.kitfox.svg.SVGUniverse;
@ComponentDescriptor(name = "SVG Image", author = "Branislav Stojkovic", category = "Misc",
description = "Scalable Vector Graphics", instanceNamePrefix = "Svg",
zOrder = IDIYComponent.COMPONENT, flexibleZOrder = true, bomPolicy = BomPolicy.NEVER_SHOW,
transformer = ImageTransformer.class)
public class SVGImage extends AbstractTransparentComponent<Void> {
private static final Logger LOG = Logger.getLogger(SVGImage.class);
private static final long serialVersionUID = 1L;
public static String DEFAULT_TEXT = "Double click to edit text";
private static byte DEFAULT_SCALE = 25;
private Point2D.Double point = new Point2D.Double(0, 0);
private Point2D.Double secondPoint = null;
private Orientation orientation;
@Override
public String getControlPointNodeName(int index) {
return null;
}
private byte[] data;
private Byte scale;
private byte newScale = DEFAULT_SCALE;
private ImageSizingMode sizingMode = ImageSizingMode.Scale;
private transient SVGDiagram svgDiagram;
public SVGImage() {
try {
data = IOUtils.toByteArray(SVGImage.class.getResourceAsStream("diylc.svg"));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode,
Project project, IDrawingObserver drawingObserver) {
double scaleX;
double scaleY;
SVGDiagram svgDiagram = getSvgDiagram();
if (getSizingMode() == ImageSizingMode.Scale) {
scaleX = scaleY = 1d * getScale() / DEFAULT_SCALE;
} else {
Point2D secondPoint = getControlPoint(1);
scaleX = 1d * Math.abs(point.getX() - secondPoint.getX()) / svgDiagram.getWidth();
scaleY = 1d * Math.abs(point.getY() - secondPoint.getY()) / svgDiagram.getHeight();
}
Shape clip = g2d.getClip().getBounds();
if (!clip.intersects(new Rectangle2D.Double(point.getX(), point.getY(),
svgDiagram.getWidth() * scaleX, svgDiagram.getHeight() * scaleY))) {
return;
}
Composite oldComposite = g2d.getComposite();
if (alpha < MAX_ALPHA) {
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA));
}
double x;
double y;
if (getSizingMode() == ImageSizingMode.Scale) {
x = point.getX();
y = point.getY();
} else {
Point2D secondPoint = getControlPoint(1);
x = Math.min(point.getX(), secondPoint.getX());
y = Math.min(point.getY(), secondPoint.getY());
}
if (getOrientation() != Orientation.DEFAULT) {
double theta = getOrientation().toRadians();
g2d.rotate(theta, x, y);
}
g2d.scale(scaleX, scaleY);
g2d.translate(x / scaleX, y / scaleY);
try {
svgDiagram.render(g2d);
} catch (SVGException e) {
LOG.error("Error rendering SVG", e);
}
if (componentState == ComponentState.SELECTED) {
g2d.translate(-x / scaleX, -y / scaleY);
g2d.setComposite(oldComposite);
g2d.scale(1 / scaleX, 1 / scaleY);
g2d.setColor(SELECTION_COLOR);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1f));
g2d.drawRect((int) x, (int) y, (int) (svgDiagram.getWidth() * scaleX),
(int) (svgDiagram.getHeight() * scaleY));
}
}
@Override
public void drawIcon(Graphics2D g2d, int width, int height) {
int factor = 32 / width;
g2d.setColor(Color.decode("#91D4FF"));
g2d.fillOval(2 / factor, 2 / factor, width / 2 + 2 / factor, height / 2 + 2 / factor);
g2d.setColor(Color.decode("#91D4FF").darker());
g2d.drawOval(2 / factor, 2 / factor, width / 2 + 2 / factor, height / 2 + 2 / factor);
g2d.setColor(Color.decode("#A2D383"));
g2d.fillRect(width / 2 - 2 / factor, height / 2 - 2 / factor, width / 2, height / 2);
g2d.setColor(Color.decode("#A2D383").darker());
g2d.drawRect(width / 2 - 2 / factor, height / 2 - 2 / factor, width / 2, height / 2);
}
@Override
public int getControlPointCount() {
return getSizingMode() == ImageSizingMode.Scale ? 1 : 2;
}
@Override
public Point2D getControlPoint(int index) {
if (index == 0)
return point;
if (secondPoint == null) {
SVGDiagram svgDiagram = getSvgDiagram();
secondPoint = new Point2D.Double(point.getX() + svgDiagram.getWidth(),
point.getY() + svgDiagram.getHeight());
}
return secondPoint;
}
private SVGDiagram getSvgDiagram() {
if (svgDiagram == null) {
ByteArrayInputStream bis = new ByteArrayInputStream(data);
SVGUniverse universe = new SVGUniverse();
try {
URI url = universe.loadSVG(bis, "SVG-" + Integer.toHexString(new Random(System.currentTimeMillis()).nextInt()));
svgDiagram = universe.getDiagram(url);
svgDiagram.setIgnoringClipHeuristic(true);
} catch (IOException e) {
LOG.error("Error loading SVG", e);
}
}
return svgDiagram;
}
@Override
public boolean isControlPointSticky(int index) {
return false;
}
@Override
public VisibilityPolicy getControlPointVisibilityPolicy(int index) {
return getSizingMode() == ImageSizingMode.Scale ? VisibilityPolicy.NEVER
: VisibilityPolicy.WHEN_SELECTED;
}
@Override
public void setControlPoint(Point2D point, int index) {
if (index == 0) {
this.point.setLocation(point.getX(), point.getY());
} else {
if (secondPoint == null)
secondPoint = new Point2D.Double(point.getX(), point.getY());
else
secondPoint.setLocation(point.getX(), point.getY());
}
}
@ByteArrayProperty(binaryType = BinaryType.SVG)
@EditableProperty(name = "Image")
public byte[] getData() {
return data;
}
public void setData(byte[] data) {
this.data = data;
this.svgDiagram = null;
}
@PercentEditor(_100PercentValue = 25)
@EditableProperty(defaultable = false)
public byte getScale() {
if (scale != null) {
newScale = (byte) (scale / 2);
scale = null;
}
return newScale;
}
public void setScale(byte scale) {
this.newScale = scale;
}
@Override
public String getName() {
return super.getName();
}
@Override
public Void getValue() {
return null;
}
@EditableProperty(name = "Sizing Mode")
public ImageSizingMode getSizingMode() {
if (sizingMode == null)
sizingMode = ImageSizingMode.Scale;
return sizingMode;
}
public void setSizingMode(ImageSizingMode sizingMode) {
this.sizingMode = sizingMode;
}
@Override
public void setValue(Void value) {}
@EditableProperty
public Orientation getOrientation() {
if (orientation == null)
orientation = Orientation.DEFAULT;
return orientation;
}
public void setOrientation(Orientation orientation) {
this.orientation = orientation;
}
public static enum ImageSizingMode {
TwoPoints("Opposing Points"), Scale("Scale");
private String label;
private ImageSizingMode(String label) {
this.label = label;
}
@Override
public String toString() {
return label;
}
}
}
@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Creator: CorelDRAW 2020 (64-Bit) -->
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="600px" height="600px" version="1.1" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd"
viewBox="0 0 176.45 176.45"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xodm="http://www.corel.com/coreldraw/odm/2003">
<g id="Layer_x0020_1">
<metadata id="CorelCorpID_0Corel-Layer"/>
<g id="_1813767668992">
<path fill="#66CCFF" fill-rule="nonzero" d="M0.87 26.63l0 123.18c0,14.22 11.52,25.77 25.76,25.77l123.18 0c14.22,0 25.77,-11.55 25.77,-25.77l0 -123.18c0,-14.24 -11.55,-25.76 -25.77,-25.76l-123.18 0c-14.24,0 -25.76,11.52 -25.76,25.76z"/>
<path fill="none" fill-rule="nonzero" stroke="#3399FF" stroke-width="1.74" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" d="M0.87 26.63l0 123.18c0,14.22 11.52,25.77 25.76,25.77l123.18 0c14.22,0 25.77,-11.55 25.77,-25.77l0 -123.18c0,-14.24 -11.55,-25.76 -25.77,-25.76l-123.18 0c-14.24,0 -25.76,11.52 -25.76,25.76z"/>
<line fill="none" fill-rule="nonzero" stroke="black" stroke-width="6.89" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" x1="18.34" y1="105.69" x2="18.34" y2= "131.9" />
<line fill="none" fill-rule="nonzero" stroke="black" stroke-width="6.89" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" x1="44.55" y1="105.69" x2="44.55" y2= "131.9" />
<line fill="none" fill-rule="nonzero" stroke="black" stroke-width="6.89" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" x1="44.55" y1="131.9" x2="18.34" y2= "131.9" />
<line fill="none" fill-rule="nonzero" stroke="black" stroke-width="6.89" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" x1="18.34" y1="105.69" x2="44.55" y2= "105.69" />
<line fill="none" fill-rule="nonzero" stroke="black" stroke-width="6.89" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" x1="44.55" y1="105.69" x2="44.55" y2= "79.49" />
<line fill="none" fill-rule="nonzero" stroke="black" stroke-width="6.89" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" x1="62.02" y1="105.69" x2="62.02" y2= "131.9" />
<line fill="none" fill-rule="nonzero" stroke="black" stroke-width="6.89" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" x1="79.49" y1="27.07" x2="79.49" y2= "131.9" />
<path fill="black" fill-rule="nonzero" d="M25.2 131.9c0,3.78 -3.06,6.86 -6.86,6.86 -3.8,0 -6.89,-3.08 -6.89,-6.86 0,-3.8 3.09,-6.89 6.89,-6.89 3.8,0 6.86,3.09 6.86,6.89z"/>
<path fill="white" fill-rule="nonzero" d="M20.9 131.9c0,1.41 -1.16,2.56 -2.56,2.56 -1.43,0 -2.59,-1.15 -2.59,-2.56 0,-1.43 1.16,-2.59 2.59,-2.59 1.4,0 2.56,1.16 2.56,2.59z"/>
<path fill="black" fill-rule="nonzero" d="M25.2 105.69c0,3.78 -3.06,6.87 -6.86,6.87 -3.8,0 -6.89,-3.09 -6.89,-6.87 0,-3.8 3.09,-6.89 6.89,-6.89 3.8,0 6.86,3.09 6.86,6.89z"/>
<path fill="white" fill-rule="nonzero" d="M20.9 105.69c0,1.41 -1.16,2.57 -2.56,2.57 -1.43,0 -2.59,-1.16 -2.59,-2.57 0,-1.43 1.16,-2.59 2.59,-2.59 1.4,0 2.56,1.16 2.56,2.59z"/>
<path fill="black" fill-rule="nonzero" d="M51.41 131.9c0,3.78 -3.06,6.86 -6.86,6.86 -3.81,0 -6.89,-3.08 -6.89,-6.86 0,-3.8 3.08,-6.89 6.89,-6.89 3.8,0 6.86,3.09 6.86,6.89z"/>
<path fill="white" fill-rule="nonzero" d="M47.11 131.9c0,1.41 -1.16,2.56 -2.56,2.56 -1.44,0 -2.59,-1.15 -2.59,-2.56 0,-1.43 1.15,-2.59 2.59,-2.59 1.4,0 2.56,1.16 2.56,2.59z"/>
<path fill="black" fill-rule="nonzero" d="M51.41 79.49c0,3.77 -3.06,6.86 -6.86,6.86 -3.81,0 -6.89,-3.09 -6.89,-6.86 0,-3.81 3.08,-6.89 6.89,-6.89 3.8,0 6.86,3.08 6.86,6.89z"/>
<path fill="white" fill-rule="nonzero" d="M47.11 79.49c0,1.4 -1.16,2.56 -2.56,2.56 -1.44,0 -2.59,-1.16 -2.59,-2.56 0,-1.44 1.15,-2.59 2.59,-2.59 1.4,0 2.56,1.15 2.56,2.59z"/>
<path fill="black" fill-rule="nonzero" d="M68.88 131.9c0,3.78 -3.06,6.86 -6.86,6.86 -3.81,0 -6.89,-3.08 -6.89,-6.86 0,-3.8 3.08,-6.89 6.89,-6.89 3.8,0 6.86,3.09 6.86,6.89z"/>
<path fill="white" fill-rule="nonzero" d="M64.58 131.9c0,1.41 -1.16,2.56 -2.56,2.56 -1.44,0 -2.59,-1.15 -2.59,-2.56 0,-1.43 1.15,-2.59 2.59,-2.59 1.4,0 2.56,1.16 2.56,2.59z"/>
<path fill="black" fill-rule="nonzero" d="M68.88 105.69c0,3.78 -3.06,6.87 -6.86,6.87 -3.81,0 -6.89,-3.09 -6.89,-6.87 0,-3.8 3.08,-6.89 6.89,-6.89 3.8,0 6.86,3.09 6.86,6.89z"/>
<path fill="white" fill-rule="nonzero" d="M64.58 105.69c0,1.41 -1.16,2.57 -2.56,2.57 -1.44,0 -2.59,-1.16 -2.59,-2.57 0,-1.43 1.15,-2.59 2.59,-2.59 1.4,0 2.56,1.16 2.56,2.59z"/>
<path fill="black" fill-rule="nonzero" d="M86.35 131.9c0,3.78 -3.09,6.86 -6.86,6.86 -3.81,0 -6.89,-3.08 -6.89,-6.86 0,-3.8 3.08,-6.89 6.89,-6.89 3.77,0 6.86,3.09 6.86,6.89z"/>
<path fill="white" fill-rule="nonzero" d="M82.05 131.9c0,1.41 -1.16,2.56 -2.56,2.56 -1.44,0 -2.59,-1.15 -2.59,-2.56 0,-1.43 1.15,-2.59 2.59,-2.59 1.4,0 2.56,1.16 2.56,2.59z"/>
<path fill="black" fill-rule="nonzero" d="M86.35 27.07c0,3.81 -3.09,6.87 -6.86,6.87 -3.81,0 -6.89,-3.06 -6.89,-6.87 0,-3.8 3.08,-6.88 6.89,-6.88 3.77,0 6.86,3.08 6.86,6.88z"/>
<path fill="white" fill-rule="nonzero" d="M82.05 27.07c0,1.41 -1.16,2.57 -2.56,2.57 -1.44,0 -2.59,-1.16 -2.59,-2.57 0,-1.43 1.15,-2.59 2.59,-2.59 1.4,0 2.56,1.16 2.56,2.59z"/>
<line fill="none" fill-rule="nonzero" stroke="black" stroke-width="6.89" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" x1="96.96" y1="27.07" x2="96.96" y2= "131.9" />
<path fill="black" fill-rule="nonzero" d="M103.82 27.07c0,3.81 -3.09,6.87 -6.86,6.87 -3.8,0 -6.89,-3.06 -6.89,-6.87 0,-3.8 3.09,-6.88 6.89,-6.88 3.77,0 6.86,3.08 6.86,6.88z"/>
<path fill="white" fill-rule="nonzero" d="M99.52 27.07c0,1.41 -1.16,2.57 -2.56,2.57 -1.43,0 -2.59,-1.16 -2.59,-2.57 0,-1.43 1.16,-2.59 2.59,-2.59 1.4,0 2.56,1.16 2.56,2.59z"/>
<line fill="none" fill-rule="nonzero" stroke="black" stroke-width="6.89" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" x1="96.96" y1="131.9" x2="158.11" y2= "131.9" />
<path fill="black" fill-rule="nonzero" d="M164.97 131.9c0,3.78 -3.09,6.86 -6.86,6.86 -3.81,0 -6.89,-3.08 -6.89,-6.86 0,-3.8 3.08,-6.89 6.89,-6.89 3.77,0 6.86,3.09 6.86,6.89z"/>
<path fill="white" fill-rule="nonzero" d="M160.67 131.9c0,1.41 -1.16,2.56 -2.56,2.56 -1.44,0 -2.59,-1.15 -2.59,-2.56 0,-1.43 1.15,-2.59 2.59,-2.59 1.4,0 2.56,1.16 2.56,2.59z"/>
<path fill="none" fill-rule="nonzero" stroke="black" stroke-width="6.89" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" d="M158.11 27.07c-61.15,0 -61.15,87.36 0,87.36"/>
<path fill="black" fill-rule="nonzero" d="M164.97 114.43c0,3.77 -3.09,6.86 -6.86,6.86 -3.81,0 -6.89,-3.09 -6.89,-6.86 0,-3.8 3.08,-6.89 6.89,-6.89 3.77,0 6.86,3.09 6.86,6.89z"/>
<path fill="white" fill-rule="nonzero" d="M160.67 114.43c0,1.4 -1.16,2.56 -2.56,2.56 -1.44,0 -2.59,-1.16 -2.59,-2.56 0,-1.43 1.15,-2.59 2.59,-2.59 1.4,0 2.56,1.16 2.56,2.59z"/>
<path fill="black" fill-rule="nonzero" d="M164.97 27.07c0,3.81 -3.09,6.87 -6.86,6.87 -3.81,0 -6.89,-3.06 -6.89,-6.87 0,-3.8 3.08,-6.88 6.89,-6.88 3.77,0 6.86,3.08 6.86,6.88z"/>
<path fill="white" fill-rule="nonzero" d="M160.67 27.07c0,1.41 -1.16,2.57 -2.56,2.57 -1.44,0 -2.59,-1.16 -2.59,-2.57 0,-1.43 1.15,-2.59 2.59,-2.59 1.4,0 2.56,1.16 2.56,2.59z"/>
<path fill="#CCCCCC" fill-rule="nonzero" d="M158.11 26.19c-0.5,0 -0.88,0.39 -0.88,0.88l0 17.48c0,0.46 0.38,0.85 0.88,0.85 0.47,0 0.85,-0.39 0.85,-0.85l0 -17.48c0,-0.49 -0.38,-0.88 -0.85,-0.88zm0 69.89c-0.5,0 -0.88,0.38 -0.88,0.88l0 17.47c0,0.47 0.38,0.85 0.88,0.85 0.47,0 0.85,-0.38 0.85,-0.85l0 -17.47c0,-0.5 -0.38,-0.88 -0.85,-0.88z"/>
<path fill="none" fill-rule="nonzero" stroke="#8E8E8E" stroke-width="0.44" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" d="M158.11 26.19c-0.5,0 -0.88,0.39 -0.88,0.88l0 17.48c0,0.46 0.38,0.85 0.88,0.85 0.47,0 0.85,-0.39 0.85,-0.85l0 -17.48c0,-0.49 -0.38,-0.88 -0.85,-0.88zm0 69.89c-0.5,0 -0.88,0.38 -0.88,0.88l0 17.47c0,0.47 0.38,0.85 0.88,0.85 0.47,0 0.85,-0.38 0.85,-0.85l0 -17.47c0,-0.5 -0.38,-0.88 -0.85,-0.88z"/>
<polygon fill="#FFE303" fill-rule="nonzero" points="146.97,96.96 146.97,44.55 169.24,44.55 169.24,96.96 "/>
<polygon fill="none" fill-rule="nonzero" stroke="#B29E02" stroke-width="0.44" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" points="146.97,96.96 146.97,44.55 169.24,44.55 169.24,96.96 "/>
<path fill="black" fill-rule="nonzero" d="M103.82 131.9c0,3.78 -3.09,6.86 -6.86,6.86 -3.8,0 -6.89,-3.08 -6.89,-6.86 0,-3.8 3.09,-6.89 6.89,-6.89 3.77,0 6.86,3.09 6.86,6.89z"/>
<path fill="white" fill-rule="nonzero" d="M99.52 131.9c0,1.41 -1.16,2.56 -2.56,2.56 -1.43,0 -2.59,-1.15 -2.59,-2.56 0,-1.43 1.16,-2.59 2.59,-2.59 1.4,0 2.56,1.16 2.56,2.59z"/>
<line fill="none" fill-rule="nonzero" stroke="black" stroke-width="6.89" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" x1="18.34" y1="27.07" x2="79.49" y2= "79.49" />
<path fill="black" fill-rule="nonzero" d="M25.2 27.07c0,3.81 -3.06,6.87 -6.86,6.87 -3.8,0 -6.89,-3.06 -6.89,-6.87 0,-3.8 3.09,-6.88 6.89,-6.88 3.8,0 6.86,3.08 6.86,6.88z"/>
<path fill="white" fill-rule="nonzero" d="M20.9 27.07c0,1.41 -1.16,2.57 -2.56,2.57 -1.43,0 -2.59,-1.16 -2.59,-2.57 0,-1.43 1.16,-2.59 2.59,-2.59 1.4,0 2.56,1.16 2.56,2.59z"/>
<path fill="#CCCCCC" fill-rule="nonzero" d="M18.34 26.19c-0.47,0 -0.88,0.39 -0.88,0.86l-0.44 21.85c0,0.47 0.38,0.85 0.85,0.88 0,0 0.03,0 0.03,0 0.47,0 0.85,-0.38 0.88,-0.85l0.41 -21.86c0.03,-0.46 -0.35,-0.88 -0.85,-0.88 0,0 0,0 0,0l0 0zm0 56.77c-0.5,0 -0.88,0.41 -0.88,0.88l0 21.85c0,0.47 0.38,0.86 0.88,0.86 0.47,0 0.85,-0.39 0.85,-0.86l0 -21.85c0,-0.47 -0.38,-0.88 -0.85,-0.88z"/>
<path fill="none" fill-rule="nonzero" stroke="#8E8E8E" stroke-width="0.44" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" d="M18.34 26.19c-0.47,0 -0.88,0.39 -0.88,0.86l-0.44 21.85c0,0.47 0.38,0.85 0.85,0.88 0,0 0.03,0 0.03,0 0.47,0 0.85,-0.38 0.88,-0.85l0.41 -21.86c0.03,-0.46 -0.35,-0.88 -0.85,-0.88 0,0 0,0 0,0l0 0zm0 56.77c-0.5,0 -0.88,0.41 -0.88,0.88l0 21.85c0,0.47 0.38,0.86 0.88,0.86 0.47,0 0.85,-0.39 0.85,-0.86l0 -21.85c0,-0.47 -0.38,-0.88 -0.85,-0.88z"/>
<polygon fill="#404040" fill-rule="nonzero" points="11.56,83.84 11.56,48.9 25.09,48.9 25.09,83.84 "/>
<polygon fill="#DDDDDD" fill-rule="nonzero" points="11.56,51.96 11.56,48.9 25.09,48.9 25.09,51.96 "/>
<polygon fill="none" fill-rule="nonzero" stroke="#2C2C2C" stroke-width="0.44" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" points="11.56,83.84 11.56,48.9 25.09,48.9 25.09,83.84 "/>
<path fill="#CCCCCC" fill-rule="nonzero" d="M79.49 8.5c-2.57,0 -4.55,1.27 -5.84,3.23 -1.22,1.81 -1.82,4.21 -1.82,6.61 0,2.4 0.6,4.79 1.82,6.61 1.29,1.93 3.27,3.2 5.84,3.2 0.6,0 1.07,-0.47 1.07,-1.08 0,-0.6 -0.47,-1.1 -1.07,-1.1 -1.82,0 -3.12,-0.91 -4.03,-2.23 -0.96,-1.46 -1.43,-3.44 -1.43,-5.4 0,-1.99 0.47,-3.94 1.43,-5.4 0.91,-1.35 2.21,-2.26 4.03,-2.26 0.6,0 1.07,-0.47 1.07,-1.08 0,-0.6 -0.47,-1.1 -1.07,-1.1l0 0z"/>
<path fill="none" fill-rule="nonzero" stroke="#8E8E8E" stroke-width="0.44" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" d="M79.49 8.5c-2.57,0 -4.55,1.27 -5.84,3.23 -1.22,1.81 -1.82,4.21 -1.82,6.61 0,2.4 0.6,4.79 1.82,6.61 1.29,1.93 3.27,3.2 5.84,3.2 0.6,0 1.07,-0.47 1.07,-1.08 0,-0.6 -0.47,-1.1 -1.07,-1.1 -1.82,0 -3.12,-0.91 -4.03,-2.23 -0.96,-1.46 -1.43,-3.44 -1.43,-5.4 0,-1.99 0.47,-3.94 1.43,-5.4 0.91,-1.35 2.21,-2.26 4.03,-2.26 0.6,0 1.07,-0.47 1.07,-1.08 0,-0.6 -0.47,-1.1 -1.07,-1.1l0 0z"/>
<path fill="#CCCCCC" fill-rule="nonzero" d="M96.96 10.68c1.82,0 3.11,0.91 3.99,2.26 0.97,1.46 1.46,3.42 1.46,5.4 0,1.96 -0.49,3.94 -1.46,5.4 -0.88,1.32 -2.17,2.23 -3.99,2.23 -0.61,0 -1.1,0.5 -1.1,1.1 0,0.61 0.49,1.08 1.1,1.08 2.53,0 4.52,-1.27 5.81,-3.2 1.22,-1.82 1.82,-4.21 1.82,-6.61 0,-2.4 -0.6,-4.8 -1.82,-6.61 -1.29,-1.96 -3.28,-3.23 -5.81,-3.23 -0.61,0 -1.1,0.5 -1.1,1.1 0,0.61 0.49,1.08 1.1,1.08l0 0z"/>
<path fill="none" fill-rule="nonzero" stroke="#8E8E8E" stroke-width="0.44" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" d="M96.96 10.68c1.82,0 3.11,0.91 3.99,2.26 0.97,1.46 1.46,3.42 1.46,5.4 0,1.96 -0.49,3.94 -1.46,5.4 -0.88,1.32 -2.17,2.23 -3.99,2.23 -0.61,0 -1.1,0.5 -1.1,1.1 0,0.61 0.49,1.08 1.1,1.08 2.53,0 4.52,-1.27 5.81,-3.2 1.22,-1.82 1.82,-4.21 1.82,-6.61 0,-2.4 -0.6,-4.8 -1.82,-6.61 -1.29,-1.96 -3.28,-3.23 -5.81,-3.23 -0.61,0 -1.1,0.5 -1.1,1.1 0,0.61 0.49,1.08 1.1,1.08l0 0z"/>
<path fill="#CCCCCC" fill-rule="nonzero" d="M79.49 8.72c-0.5,0 -0.88,0.39 -0.88,0.88 0,0.47 0.38,0.86 0.88,0.86l4.35 0c0.5,0 0.88,-0.39 0.88,-0.86 0,-0.49 -0.38,-0.88 -0.88,-0.88l-4.35 0zm13.09 0c-0.47,0 -0.88,0.39 -0.88,0.88 0,0.47 0.41,0.86 0.88,0.86l4.38 0c0.47,0 0.85,-0.39 0.85,-0.86 0,-0.49 -0.38,-0.88 -0.85,-0.88l-4.38 0z"/>
<path fill="none" fill-rule="nonzero" stroke="#8E8E8E" stroke-width="0.44" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" d="M79.49 8.72c-0.5,0 -0.88,0.39 -0.88,0.88 0,0.47 0.38,0.86 0.88,0.86l4.35 0c0.5,0 0.88,-0.39 0.88,-0.86 0,-0.49 -0.38,-0.88 -0.88,-0.88l-4.35 0zm13.09 0c-0.47,0 -0.88,0.39 -0.88,0.88 0,0.47 0.41,0.86 0.88,0.86l4.38 0c0.47,0 0.85,-0.39 0.85,-0.86 0,-0.49 -0.38,-0.88 -0.85,-0.88l-4.38 0z"/>
<path fill="khaki" fill-rule="nonzero" d="M99.14 9.6c0,3.01 -4.88,5.46 -10.92,5.46 -6.03,0 -10.94,-2.45 -10.94,-5.46 0,-3.03 4.91,-5.45 10.94,-5.45 6.04,0 10.92,2.42 10.92,5.45z"/>
<path fill="none" fill-rule="nonzero" stroke="#A8A162" stroke-width="0.44" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" d="M99.14 9.6c0,3.01 -4.88,5.46 -10.92,5.46 -6.03,0 -10.94,-2.45 -10.94,-5.46 0,-3.03 4.91,-5.45 10.94,-5.45 6.04,0 10.92,2.42 10.92,5.45z"/>
<path fill="#CCCCCC" fill-rule="nonzero" d="M17.24 131.9c0,6.59 0,11.57 0.55,15.29 0.58,3.97 1.84,6.7 4.24,8.49 2.37,1.77 5.84,2.68 10.97,3.09 4.93,0.41 11.52,0.41 20.28,0.41 0.61,0 1.08,-0.47 1.08,-1.07 0,-0.61 -0.47,-1.11 -1.08,-1.11 -8.71,0 -15.24,0 -20.12,-0.38 -4.71,-0.41 -7.79,-1.16 -9.81,-2.67 -1.95,-1.46 -2.89,-3.67 -3.39,-7.06 -0.55,-3.64 -0.55,-8.49 -0.55,-14.99 0,-0.61 -0.46,-1.1 -1.07,-1.1 -0.61,0 -1.1,0.49 -1.1,1.1l0 0z"/>
<path fill="none" fill-rule="nonzero" stroke="#8E8E8E" stroke-width="0.44" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" d="M17.24 131.9c0,6.59 0,11.57 0.55,15.29 0.58,3.97 1.84,6.7 4.24,8.49 2.37,1.77 5.84,2.68 10.97,3.09 4.93,0.41 11.52,0.41 20.28,0.41 0.61,0 1.08,-0.47 1.08,-1.07 0,-0.61 -0.47,-1.11 -1.08,-1.11 -8.71,0 -15.24,0 -20.12,-0.38 -4.71,-0.41 -7.79,-1.16 -9.81,-2.67 -1.95,-1.46 -2.89,-3.67 -3.39,-7.06 -0.55,-3.64 -0.55,-8.49 -0.55,-14.99 0,-0.61 -0.46,-1.1 -1.07,-1.1 -0.61,0 -1.1,0.49 -1.1,1.1l0 0z"/>
<path fill="#CCCCCC" fill-rule="nonzero" d="M157 131.9c0,6.5 0,11.35 -0.52,14.99 -0.52,3.39 -1.46,5.6 -3.42,7.06 -2.01,1.51 -5.09,2.26 -9.78,2.67 -4.9,0.38 -11.41,0.38 -20.11,0.38 -0.61,0 -1.11,0.5 -1.11,1.11 0,0.6 0.5,1.07 1.11,1.07 8.76,0 15.34,0 20.28,-0.41 5.12,-0.41 8.59,-1.32 10.94,-3.09 2.42,-1.79 3.66,-4.52 4.24,-8.49 0.55,-3.72 0.55,-8.7 0.55,-15.29 0,-0.61 -0.47,-1.1 -1.07,-1.1 -0.61,0 -1.11,0.49 -1.11,1.1z"/>
<path fill="none" fill-rule="nonzero" stroke="#8E8E8E" stroke-width="0.44" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" d="M157 131.9c0,6.5 0,11.35 -0.52,14.99 -0.52,3.39 -1.46,5.6 -3.42,7.06 -2.01,1.51 -5.09,2.26 -9.78,2.67 -4.9,0.38 -11.41,0.38 -20.11,0.38 -0.61,0 -1.11,0.5 -1.11,1.11 0,0.6 0.5,1.07 1.11,1.07 8.76,0 15.34,0 20.28,-0.41 5.12,-0.41 8.59,-1.32 10.94,-3.09 2.42,-1.79 3.66,-4.52 4.24,-8.49 0.55,-3.72 0.55,-8.7 0.55,-15.29 0,-0.61 -0.47,-1.1 -1.07,-1.1 -0.61,0 -1.11,0.49 -1.11,1.1z"/>
<path fill="#CCCCCC" fill-rule="nonzero" d="M48.9 157.23c-0.47,0 -0.88,0.38 -0.88,0.88 0,0.47 0.41,0.85 0.88,0.85l13.12 0c0.47,0 0.85,-0.38 0.85,-0.85 0,-0.5 -0.38,-0.88 -0.85,-0.88l-13.12 0zm65.53 0c-0.5,0 -0.88,0.38 -0.88,0.88 0,0.47 0.38,0.85 0.88,0.85l13.09 0c0.5,0 0.88,-0.38 0.88,-0.85 0,-0.5 -0.38,-0.88 -0.88,-0.88l-13.09 0z"/>
<path fill="none" fill-rule="nonzero" stroke="#8E8E8E" stroke-width="0.44" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" d="M48.9 157.23c-0.47,0 -0.88,0.38 -0.88,0.88 0,0.47 0.41,0.85 0.88,0.85l13.12 0c0.47,0 0.85,-0.38 0.85,-0.85 0,-0.5 -0.38,-0.88 -0.85,-0.88l-13.12 0zm65.53 0c-0.5,0 -0.88,0.38 -0.88,0.88 0,0.47 0.38,0.85 0.88,0.85l13.09 0c0.5,0 0.88,-0.38 0.88,-0.85 0,-0.5 -0.38,-0.88 -0.88,-0.88l-13.09 0z"/>
<path fill="#6B6DCE" fill-rule="nonzero" d="M51.08 144.99c-1.19,0 -2.18,0.99 -2.18,2.18l0 21.85c0,1.21 0.99,2.18 2.18,2.18l4.82 0c0.55,-0.97 1.62,-1.63 2.84,-1.63 1.21,0 2.26,0.66 2.84,1.63l63.76 0c1.21,0 2.18,-0.97 2.18,-2.18l0 -21.85c0,-1.19 -0.97,-2.18 -2.18,-2.18l-63.76 0c-0.58,0.99 -1.63,1.65 -2.84,1.65 -1.22,0 -2.29,-0.66 -2.84,-1.65l-4.82 0z"/>
<line fill="none" fill-rule="nonzero" stroke="#5A5CAF" stroke-width="0.44" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" x1="55.46" y1="144.99" x2="55.46" y2= "171.2" />
<line fill="none" fill-rule="nonzero" stroke="#5A5CAF" stroke-width="0.44" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" x1="62.02" y1="144.99" x2="62.02" y2= "171.2" />
<path fill="#8CACEA" fill-rule="nonzero" d="M111.81 144.99l0 26.21 13.53 0c1.21,0 2.18,-0.97 2.18,-2.18l0 -21.85c0,-1.19 -0.97,-2.18 -2.18,-2.18l-13.53 0 0 0z"/>
<line fill="none" fill-rule="nonzero" stroke="white" stroke-width="0.88" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" x1="119.67" y1="154.17" x2="119.67" y2= "162.02" />
<path fill="none" fill-rule="nonzero" stroke="#4A4C90" stroke-width="0.44" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="2.61313" d="M51.08 144.99c-1.19,0 -2.18,0.99 -2.18,2.18l0 21.85c0,1.21 0.99,2.18 2.18,2.18l4.82 0c0.55,-0.97 1.62,-1.63 2.84,-1.63 1.21,0 2.26,0.66 2.84,1.63l63.76 0c1.21,0 2.18,-0.97 2.18,-2.18l0 -21.85c0,-1.19 -0.97,-2.18 -2.18,-2.18l-63.76 0c-0.58,0.99 -1.63,1.65 -2.84,1.65 -1.22,0 -2.29,-0.66 -2.84,-1.65l-4.82 0z"/>
<path fill="black" fill-rule="nonzero" d="M67.25 88.44c0,2.76 -2.26,5.02 -5.01,5.02 -2.79,0 -5.05,-2.26 -5.05,-5.02 0,-2.78 2.26,-5.04 5.05,-5.04 2.75,0 5.01,2.26 5.01,5.04z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

@@ -0,0 +1,92 @@
/*
DIY Layout Creator (DIYLC).
Copyright (c) 2009-2018 held jointly by the individual authors.
This file is part of DIYLC.
DIYLC is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DIYLC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with DIYLC. If not, see <http://www.gnu.org/licenses/>.
*/
package org.diylc.components.transform;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import org.diylc.common.IComponentTransformer;
import org.diylc.common.OrientationHV;
import org.diylc.components.electromechanical.MiniToggleSwitch;
import org.diylc.core.IDIYComponent;
public class MiniToggleSwitchTransformer implements IComponentTransformer {
@Override
public boolean canRotate(IDIYComponent<?> component) {
return component.getClass().equals(MiniToggleSwitch.class);
}
@Override
public boolean canMirror(IDIYComponent<?> component) {
return component.getClass().equals(MiniToggleSwitch.class);
}
@Override
public boolean mirroringChangesCircuit() {
return true;
}
@Override
public void rotate(IDIYComponent<?> component, Point2D center, int direction) {
AffineTransform rotate = AffineTransform.getRotateInstance(Math.PI / 2 * direction, center.getX(), center.getY());
for (int index = 0; index < component.getControlPointCount(); index++) {
Point2D p = new Point2D.Double();
rotate.transform(component.getControlPoint(index), p);
component.setControlPoint(p, index);
}
MiniToggleSwitch sw = (MiniToggleSwitch) component;
OrientationHV o = sw.getOrientation();
int oValue = o.ordinal();
oValue += direction;
if (oValue < 0)
oValue = OrientationHV.values().length - 1;
if (oValue >= OrientationHV.values().length)
oValue = 0;
o = OrientationHV.values()[oValue];
sw.setOrientation(o);
}
@Override
public void mirror(IDIYComponent<?> component, Point2D center, int direction) {
MiniToggleSwitch sw = (MiniToggleSwitch) component;
if (direction == IComponentTransformer.HORIZONTAL) {
double dx = 2 * (center.getX() - sw.getControlPoint(1).getX());
double dy = 0;
for (int i = 0; i < sw.getControlPointCount(); i++) {
Point2D p = sw.getControlPoint(i);
sw.setControlPoint(new Point2D.Double(p.getX() + dx, p.getY() + dy), i);
}
} else {
double dx = 0;
double dy = 2 * (center.getY() - sw.getControlPoint(1).getY());
for (int i = 0; i < sw.getControlPointCount(); i++) {
Point2D p = sw.getControlPoint(i);
sw.setControlPoint(new Point2D.Double(p.getX() + dx, p.getY() + dy), i);
}
}
}
}
+1
View File
@@ -17,6 +17,7 @@
<classpathentry kind="lib" path="lib/orsonpdf-1.8.jar"/> <classpathentry kind="lib" path="lib/orsonpdf-1.8.jar"/>
<classpathentry kind="lib" path="lib/gestures-wrapper-0.2.jar"/> <classpathentry kind="lib" path="lib/gestures-wrapper-0.2.jar"/>
<classpathentry kind="lib" path="lib/jar-loader.jar"/> <classpathentry kind="lib" path="lib/jar-loader.jar"/>
<classpathentry kind="lib" path="lib/svgSalamander-1.1.2.4.jar"/>
<classpathentry combineaccessrules="false" kind="src" path="/diylc-core"/> <classpathentry combineaccessrules="false" kind="src" path="/diylc-core"/>
<classpathentry kind="lib" path="lib/xstream-1.4.3.jar"/> <classpathentry kind="lib" path="lib/xstream-1.4.3.jar"/>
<classpathentry kind="lib" path="lib/java-http-proxy.jar"/> <classpathentry kind="lib" path="lib/java-http-proxy.jar"/>
+2 -1
View File
@@ -10,7 +10,7 @@
<property name="jar.dir" value="${build.dir}/jar" /> <property name="jar.dir" value="${build.dir}/jar" />
<property name="report.dir" value="${build.dir}/junitreport" /> <property name="report.dir" value="${build.dir}/junitreport" />
<property name="main.class" value="org.diylc.DIYLCStarter" /> <property name="main.class" value="org.diylc.DIYLCStarter" />
<property name="diylc.version" value="4.17.0" /> <property name="diylc.version" value="4.18.0" />
<property name="osx.jre8.path" value="jre\osx\jdk8u275-b01-jre\Contents\Home\" /> <property name="osx.jre8.path" value="jre\osx\jdk8u275-b01-jre\Contents\Home\" />
@@ -163,6 +163,7 @@
<zipfileset dir="flatpak" includes="com.diy_fever.DIYLayoutCreator.desktop" /> <zipfileset dir="flatpak" includes="com.diy_fever.DIYLayoutCreator.desktop" />
<zipfileset dir="flatpak" includes="com.diy_fever.DIYLayoutCreator.metainfo.xml" /> <zipfileset dir="flatpak" includes="com.diy_fever.DIYLayoutCreator.metainfo.xml" />
</zip> </zip>
<checksum file="${build.dir}/diylc-${diylc.version}.zip" algorithm="SHA-256"/>
</target> </target>
<target name="full" depends="win,universal,mac" /> <target name="full" depends="win,universal,mac" />
@@ -33,10 +33,31 @@
<url type="donation">http://diy-fever.com/donate</url> <url type="donation">http://diy-fever.com/donate</url>
<url type="help">https://github.com/bancika/diy-layout-creator/tree/wiki</url> <url type="help">https://github.com/bancika/diy-layout-creator/tree/wiki</url>
<url type="faq">https://github.com/bancika/diy-layout-creator/blob/wiki/FAQ.md</url> <url type="faq">https://github.com/bancika/diy-layout-creator/blob/wiki/FAQ.md</url>
<url type="contact">bancika_AT_gmail.com</url> <!--<url type="contact">mailto:bancika_AT_gmail.com</url>-->
<update_contact>nbenitezl_AT_gmail.com</update_contact> <update_contact>nbenitezl_AT_gmail.com</update_contact>
<content_rating type="oars-1.1"/> <content_rating type="oars-1.1"/>
<releases> <releases>
<release version="4.18.0" date="2021-07-11">
<description>
<ul>
<li>[New Feature] Added 'SVG Image' component, to allow importing vector graphics into projects</li>
<li>[Bug Fix] Mini Toggle Switch - lugs do not get rotated when changing orientation; rotate from the context menu doesn't work</li>
<li>[Bug Fix] Fixed the issue with Perf Board, Vero Board and TriPad Board sometimes rendering an extra row with pads when there's no space for them</li>
</ul>
</description>
<url>https://github.com/bancika/diy-layout-creator/releases/tag/v4.18.0</url>
</release>
<release version="4.17.0" date="2021-02-14">
<description>
<ul>
<li>[New Feature] Added 'Eurorack Stripboard' component, designed by David Haillant</li>
<li>[New Feature] Allow multi-line text in label components</li>
<li>[Improvement] Slightly fancier splash screen :)</li>
<li>[Bug Fix] Fixed a major memory leak when using Undo functionality</li>
</ul>
</description>
<url>https://github.com/bancika/diy-layout-creator/releases/tag/v4.17.0</url>
</release>
<release version="4.16.0" date="2021-01-17"> <release version="4.16.0" date="2021-01-17">
<description> <description>
<ul> <ul>
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -30,6 +30,7 @@ import javax.swing.JLabel;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import org.diylc.common.PropertyWrapper; import org.diylc.common.PropertyWrapper;
import org.diylc.components.misc.LoadlineEntity; import org.diylc.components.misc.LoadlineEntity;
import org.diylc.core.annotations.ByteArrayProperty;
import org.diylc.core.annotations.DynamicList; import org.diylc.core.annotations.DynamicList;
import org.diylc.core.annotations.MultiLineText; import org.diylc.core.annotations.MultiLineText;
import org.diylc.core.measures.AbstractMeasure; import org.diylc.core.measures.AbstractMeasure;
@@ -77,8 +78,17 @@ public class FieldEditorFactory {
MeasureArrayEditor editor = new MeasureArrayEditor(property); MeasureArrayEditor editor = new MeasureArrayEditor(property);
return editor; return editor;
} }
if (byte[].class.isAssignableFrom(property.getType())) { if (byte[].class.isAssignableFrom(property.getType())) {
ImageEditor editor = new ImageEditor(property); ByteArrayProperty annotation = null;
try {
property.getGetter().isAnnotationPresent(ByteArrayProperty.class);
annotation = property.getGetter().getAnnotation(ByteArrayProperty.class);
} catch (SecurityException e) {
LOG.error("Error while reading ByteArrayProperty annotation", e);
} catch (NoSuchMethodException e) {
LOG.error("Error while reading ByteArrayProperty annotation", e);
}
ImageEditor editor = new ImageEditor(property, annotation == null ? null : annotation.binaryType());
return editor; return editor;
} }
if (property.getType().isEnum()) { if (property.getType().isEnum()) {
@@ -27,6 +27,7 @@ import javax.swing.JButton;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import org.apache.poi.util.IOUtils; import org.apache.poi.util.IOUtils;
import org.diylc.common.PropertyWrapper; import org.diylc.common.PropertyWrapper;
import org.diylc.core.annotations.BinaryType;
import org.diylc.swing.gui.DialogFactory; import org.diylc.swing.gui.DialogFactory;
import org.diylc.swing.plugins.file.FileFilterEnum; import org.diylc.swing.plugins.file.FileFilterEnum;
@@ -38,16 +39,19 @@ public class ImageEditor extends JButton {
private static final String title = "Click to load image file"; private static final String title = "Click to load image file";
public ImageEditor(final PropertyWrapper property) { private BinaryType binaryType;
public ImageEditor(final PropertyWrapper property, BinaryType binaryType) {
super(property.isUnique() ? title : ("(multi value) " + title)); super(property.isUnique() ? title : ("(multi value) " + title));
this.binaryType = binaryType;
if (property.isReadOnly()) if (property.isReadOnly())
setEnabled(false); setEnabled(false);
addActionListener(new ActionListener() { addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(java.awt.event.ActionEvent e) { public void actionPerformed(java.awt.event.ActionEvent e) {
File file = DialogFactory.getInstance().showOpenDialog(FileFilterEnum.IMAGES.getFilter(), File file = DialogFactory.getInstance().showOpenDialog(getFileFilterEnum().getFilter(),
null, FileFilterEnum.IMAGES.getExtensions()[0], null); null, getFileFilterEnum().getExtensions()[0], null);
if (file != null) { if (file != null) {
property.setChanged(true); property.setChanged(true);
FileInputStream fis; FileInputStream fis;
@@ -63,6 +67,13 @@ public class ImageEditor extends JButton {
} }
}); });
} }
private FileFilterEnum getFileFilterEnum() {
if (binaryType == BinaryType.SVG) {
return FileFilterEnum.SVG;
}
return FileFilterEnum.IMAGES;
}
// @Override // @Override
// public void setBackground(Color bg) { // public void setBackground(Color bg) {
@@ -30,7 +30,7 @@ public enum FileFilterEnum {
PNG("PNG Images (*.png)", "png"), PDF("PDF Files (*.pdf)", "pdf"), DIY("DIY Project Files (*.diy)", "diy"), EXCEL( PNG("PNG Images (*.png)", "png"), PDF("PDF Files (*.pdf)", "pdf"), DIY("DIY Project Files (*.diy)", "diy"), EXCEL(
"Excel Workbooks (*.xls)", "xls"), CSV("Comma Separated Files (*.csv)", "csv"), HTML("HTML Files (*.html)", "Excel Workbooks (*.xls)", "xls"), CSV("Comma Separated Files (*.csv)", "csv"), HTML("HTML Files (*.html)",
"html"), IMAGES("Image Files (*.png, *.jpg, *.gif)", "png", "jpg", "gif"), XML("XML Files (*.xml)", "xml"), "html"), IMAGES("Image Files (*.png, *.jpg, *.gif)", "png", "jpg", "gif"), XML("XML Files (*.xml)", "xml"),
TEST("Test Files (*.tst)", "tst"), CRV("Curve Files (*.crv)", "crv"); TEST("Test Files (*.tst)", "tst"), CRV("Curve Files (*.crv)", "crv"), SVG("SVG Files (*.svg)", "svg");
FileFilter filter; FileFilter filter;
String[] extensions; String[] extensions;