mirror of
https://github.com/bancika/diy-layout-creator
synced 2026-11-10 17:22:09 +10:00
Next (#656)
* 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:
@@ -6,9 +6,9 @@
|
||||
<classpathentry kind="lib" path="lib/junit-4.7.jar"/>
|
||||
<classpathentry kind="lib" path="lib/app-framework.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/AppleJavaExtensions.jar"/>
|
||||
<classpathentry kind="lib" path="lib/xstream-1.4.3.jar"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</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>
|
||||
<url>https://github.com/bancika/diy-layout-creator/releases</url>
|
||||
</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>
|
||||
</java.util.Arrays_-ArrayList>
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
<classpathentry kind="lib" path="lib/app-framework.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/svgSalamander-1.1.2.4.jar"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/diylc-core"/>
|
||||
<classpathentry kind="lib" path="lib/xstream-1.4.3.jar"/>
|
||||
<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());
|
||||
double spacing = this.spacing.convertToPixels();
|
||||
|
||||
while (y < finalSecondPoint.getY() - spacing) {
|
||||
while (y < finalSecondPoint.getY() - spacing - diameter / 2) {
|
||||
x = firstPoint.getX();
|
||||
y += spacing;
|
||||
while (x < finalSecondPoint.getX() - spacing - diameter) {
|
||||
|
||||
@@ -71,7 +71,7 @@ public class TriPadBoard extends AbstractVeroBoard {
|
||||
double spacing = this.spacing.convertToPixels();
|
||||
|
||||
if (orientation == OrientationHV.HORIZONTAL) {
|
||||
while (y < finalSecondPoint.getY() - spacing) {
|
||||
while (y < finalSecondPoint.getY() - spacing - stripSize / 2) {
|
||||
x = firstPoint.getX();
|
||||
y += spacing;
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ public class VeroBoard extends AbstractVeroBoard {
|
||||
int spacing = (int) this.spacing.convertToPixels();
|
||||
|
||||
if (orientation == OrientationHV.HORIZONTAL) {
|
||||
while (y < finalSecondPoint.getY() - spacing) {
|
||||
while (y < finalSecondPoint.getY() - spacing - stripSize / 2) {
|
||||
x = firstPoint.getX();
|
||||
y += spacing;
|
||||
g2d.setColor(stripColor);
|
||||
|
||||
+15
-4
@@ -37,6 +37,7 @@ import org.diylc.common.IPlugInPort;
|
||||
import org.diylc.common.ObjectCache;
|
||||
import org.diylc.common.OrientationHV;
|
||||
import org.diylc.components.AbstractTransparentComponent;
|
||||
import org.diylc.components.transform.MiniToggleSwitchTransformer;
|
||||
import org.diylc.core.ComponentState;
|
||||
import org.diylc.core.IDIYComponent;
|
||||
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",
|
||||
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 {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
@@ -286,9 +287,19 @@ public class MiniToggleSwitch extends AbstractTransparentComponent<ToggleSwitchT
|
||||
// so far.
|
||||
drawingObserver.stopTracking();
|
||||
// Draw lugs.
|
||||
int circleDiameter = getClosestOdd((int) CIRCLE_SIZE.convertToPixels());
|
||||
int lugWidth = getClosestOdd((int) LUG_WIDTH.convertToPixels());
|
||||
int lugHeight = getClosestOdd((int) LUG_THICKNESS.convertToPixels());
|
||||
int circleDiameter = getClosestOdd((int) CIRCLE_SIZE.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) {
|
||||
if (outlineMode) {
|
||||
g2d.setColor(theme.getOutlineColor());
|
||||
|
||||
@@ -42,7 +42,9 @@ 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;
|
||||
@@ -207,6 +209,7 @@ public class Image extends AbstractTransparentComponent<Void> {
|
||||
return new ImageIcon(data);
|
||||
}
|
||||
|
||||
@ByteArrayProperty(binaryType = BinaryType.IMAGE)
|
||||
@EditableProperty(name = "Image")
|
||||
public byte[] getData() {
|
||||
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 |
+92
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,7 @@
|
||||
<classpathentry kind="lib" path="lib/orsonpdf-1.8.jar"/>
|
||||
<classpathentry kind="lib" path="lib/gestures-wrapper-0.2.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 kind="lib" path="lib/xstream-1.4.3.jar"/>
|
||||
<classpathentry kind="lib" path="lib/java-http-proxy.jar"/>
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<property name="jar.dir" value="${build.dir}/jar" />
|
||||
<property name="report.dir" value="${build.dir}/junitreport" />
|
||||
<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\" />
|
||||
|
||||
@@ -163,6 +163,7 @@
|
||||
<zipfileset dir="flatpak" includes="com.diy_fever.DIYLayoutCreator.desktop" />
|
||||
<zipfileset dir="flatpak" includes="com.diy_fever.DIYLayoutCreator.metainfo.xml" />
|
||||
</zip>
|
||||
<checksum file="${build.dir}/diylc-${diylc.version}.zip" algorithm="SHA-256"/>
|
||||
</target>
|
||||
|
||||
<target name="full" depends="win,universal,mac" />
|
||||
|
||||
@@ -33,10 +33,31 @@
|
||||
<url type="donation">http://diy-fever.com/donate</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="contact">bancika_AT_gmail.com</url>
|
||||
<!--<url type="contact">mailto:bancika_AT_gmail.com</url>-->
|
||||
<update_contact>nbenitezl_AT_gmail.com</update_contact>
|
||||
<content_rating type="oars-1.1"/>
|
||||
<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">
|
||||
<description>
|
||||
<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.diylc.common.PropertyWrapper;
|
||||
import org.diylc.components.misc.LoadlineEntity;
|
||||
import org.diylc.core.annotations.ByteArrayProperty;
|
||||
import org.diylc.core.annotations.DynamicList;
|
||||
import org.diylc.core.annotations.MultiLineText;
|
||||
import org.diylc.core.measures.AbstractMeasure;
|
||||
@@ -77,8 +78,17 @@ public class FieldEditorFactory {
|
||||
MeasureArrayEditor editor = new MeasureArrayEditor(property);
|
||||
return editor;
|
||||
}
|
||||
if (byte[].class.isAssignableFrom(property.getType())) {
|
||||
ImageEditor editor = new ImageEditor(property);
|
||||
if (byte[].class.isAssignableFrom(property.getType())) {
|
||||
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;
|
||||
}
|
||||
if (property.getType().isEnum()) {
|
||||
|
||||
@@ -27,6 +27,7 @@ import javax.swing.JButton;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.apache.poi.util.IOUtils;
|
||||
import org.diylc.common.PropertyWrapper;
|
||||
import org.diylc.core.annotations.BinaryType;
|
||||
import org.diylc.swing.gui.DialogFactory;
|
||||
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";
|
||||
|
||||
public ImageEditor(final PropertyWrapper property) {
|
||||
private BinaryType binaryType;
|
||||
|
||||
public ImageEditor(final PropertyWrapper property, BinaryType binaryType) {
|
||||
super(property.isUnique() ? title : ("(multi value) " + title));
|
||||
this.binaryType = binaryType;
|
||||
if (property.isReadOnly())
|
||||
setEnabled(false);
|
||||
addActionListener(new ActionListener() {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(java.awt.event.ActionEvent e) {
|
||||
File file = DialogFactory.getInstance().showOpenDialog(FileFilterEnum.IMAGES.getFilter(),
|
||||
null, FileFilterEnum.IMAGES.getExtensions()[0], null);
|
||||
File file = DialogFactory.getInstance().showOpenDialog(getFileFilterEnum().getFilter(),
|
||||
null, getFileFilterEnum().getExtensions()[0], null);
|
||||
if (file != null) {
|
||||
property.setChanged(true);
|
||||
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
|
||||
// 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(
|
||||
"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"),
|
||||
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;
|
||||
String[] extensions;
|
||||
|
||||
Reference in New Issue
Block a user