diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index a40bd210..ae89d6c4 100644 Binary files a/diylc/diylc-library/lib/diylc-core.jar and b/diylc/diylc-library/lib/diylc-core.jar differ diff --git a/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java b/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java index 16b645f6..66d35c43 100644 --- a/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java +++ b/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java @@ -213,7 +213,13 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp g2d.fill(shape); } } - decorateComponentBody(g2d, outlineMode); + + Composite newComposite = null; + if (!decorateAboveBorder()) + decorateComponentBody(g2d, outlineMode); + else + newComposite = g2d.getComposite(); + g2d.setComposite(oldComposite); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); Color finalBorderColor; @@ -230,6 +236,12 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp } g2d.setColor(finalBorderColor); g2d.draw(shape); + + if (decorateAboveBorder()) { + g2d.setComposite(newComposite); + decorateComponentBody(g2d, outlineMode); + g2d.setComposite(oldComposite); + } // Draw label. g2d.setFont(project.getFont()); @@ -344,6 +356,10 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp protected void decorateComponentBody(Graphics2D g2d, boolean outlineMode) { // Do nothing. } + + protected boolean decorateAboveBorder() { + return false; + } protected int calculateLabelYCoordinate(Rectangle2D shapeRect, Rectangle2D textRect, FontMetrics fontMetrics) { return (int) (shapeRect.getHeight() - textRect.getHeight()) / 2 + fontMetrics.getAscent(); diff --git a/diylc/diylc-library/src/org/diylc/components/passive/RadialInductor.java b/diylc/diylc-library/src/org/diylc/components/passive/RadialInductor.java new file mode 100644 index 00000000..0e6be459 --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/passive/RadialInductor.java @@ -0,0 +1,223 @@ +/* + + 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 . + +*/ +package org.diylc.components.passive; + +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.Stroke; +import java.awt.geom.Area; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Line2D; +import java.awt.geom.Rectangle2D; +import java.awt.geom.RoundRectangle2D; + +import org.diylc.common.ObjectCache; +import org.diylc.common.SimpleComponentTransformer; +import org.diylc.components.AbstractRadialComponent; +import org.diylc.core.CreationMethod; +import org.diylc.core.IDIYComponent; +import org.diylc.core.annotations.ComponentDescriptor; +import org.diylc.core.annotations.EditableProperty; +import org.diylc.core.measures.Inductance; +import org.diylc.core.measures.Resistance; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; + +@ComponentDescriptor(name = "Inductor (Radial)", author = "Branislav Stojkovic", category = "Passive", + creationMethod = CreationMethod.POINT_BY_POINT, instanceNamePrefix = "L", + description = "Vertically mounted ferrite core inductor", zOrder = IDIYComponent.COMPONENT, + transformer = SimpleComponentTransformer.class) +public class RadialInductor extends AbstractRadialComponent { + + private static final long serialVersionUID = 1L; + + public static Size DEFAULT_SIZE = new Size(1d / 4, SizeUnit.in); + public static Color BODY_COLOR = Color.darkGray; + public static Color BORDER_COLOR = BODY_COLOR.darker(); + public static Color MARKER_COLOR = Color.decode("#8CACEA"); + public static Color TICK_COLOR = Color.white; + public static Size HEIGHT = new Size(0.4d, SizeUnit.in); + public static Size EDGE_RADIUS = new Size(0.5d, SizeUnit.mm); + public static Size LIP = new Size(0.05d, SizeUnit.in); + + private Inductance value = null; + private Resistance resistance = null; + + private boolean folded = false; + private Size height = HEIGHT; + private Size lip = LIP; + + public RadialInductor() { + super(); + this.bodyColor = BODY_COLOR; + this.borderColor = BORDER_COLOR; + this.labelColor = TICK_COLOR; + this.leadColor = COPPER_COLOR; + } + + @Override + public String getValueForDisplay() { + return getValue().toString(); + } + + @Override + protected void decorateComponentBody(Graphics2D g2d, boolean outlineMode) { + if (!getFolded()) + return; + + Area body = new Area(getBodyShape()); + int leadThickness = (int) getLeadThickness(); + double lip = getLip().convertToPixels(); + Stroke stroke = ObjectCache.getInstance().fetchBasicStroke(leadThickness / 2); + Rectangle rect = body.getBounds(); + Area copper = new Area(); + for (double y = lip + leadThickness / 2; y < rect.height - lip - leadThickness; y += leadThickness * 0.9d) { + double margin; + if (y < leadThickness || y > rect.height - leadThickness) + margin = -leadThickness / 4; + else + margin = leadThickness / 4; + Line2D line = new Line2D.Double(-margin + lip, y - rect.height / 2, rect.width - lip + margin, y - rect.height / 2); + Shape s = stroke.createStrokedShape(line); + copper.add(new Area(s)); + } +// copper.intersect(body); + g2d.setColor(COPPER_COLOR); + g2d.fill(copper); + g2d.setColor(COPPER_COLOR.darker()); + g2d.draw(copper); + } + + @Override + protected boolean decorateAboveBorder() { + return true; + } + + public void drawIcon(Graphics2D g2d, int width, int height) { + g2d.rotate(-Math.PI / 4, width / 2, height / 2); + g2d.setColor(COPPER_COLOR); + g2d.drawLine(0, height * 2 / 5, width / 2, height * 2 / 5); + g2d.drawLine(0, height * 3 / 5, width / 2, height * 3 / 5); + g2d.rotate(Math.PI / 2, width / 2, height / 2); + g2d.setColor(BODY_COLOR); + Rectangle2D a = new Rectangle2D.Double(width / 2 - 5, 6, 10, height - 14); + g2d.fill(a); + g2d.setColor(BORDER_COLOR); + g2d.draw(a); + g2d.setColor(COPPER_COLOR); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1f)); + for (int i = 0; i < 5; i++) { + g2d.drawLine(width / 2 - 5, 11 + 2 * i, width / 2 + 5, 11 + 2 * i); + } + } + + @Override + protected Size getDefaultWidth() { + return null; + } + + @Override + public Size getWidth() { + return super.getWidth(); + } + + @Override + protected Size getDefaultLength() { + // We'll reuse width property to set the diameter. + return DEFAULT_SIZE; + } + + @EditableProperty(name = "Diameter") + @Override + public Size getLength() { + return super.getLength(); + } + + @EditableProperty + public boolean getFolded() { + return folded; + } + + public void setFolded(boolean folded) { + this.folded = folded; + } + + @EditableProperty + public Size getHeight() { + if (height == null) { + height = HEIGHT; + } + return height; + } + + public void setHeight(Size height) { + this.height = height; + } + + @Override + protected Shape getBodyShape() { + double height = (int) getHeight().convertToPixels(); + double diameter = (int) getLength().convertToPixels(); + double lip = getLip().convertToPixels(); + if (folded) { + Area body = new Area(new RoundRectangle2D.Double(0f, -height / 2 - LEAD_THICKNESS.convertToPixels() / 2, + getClosestOdd(diameter), getClosestOdd(height), EDGE_RADIUS.convertToPixels(), EDGE_RADIUS.convertToPixels())); + body.subtract(new Area(new Rectangle2D.Double(0f, -height / 2 + lip - LEAD_THICKNESS.convertToPixels() / 2, + lip, height - 2 * lip))); + body.subtract(new Area(new Rectangle2D.Double(diameter - lip, -height / 2 + lip - LEAD_THICKNESS.convertToPixels() / 2, + lip * 2, height - 2 * lip))); + return body; + } + return new Ellipse2D.Double(0f, 0f, getClosestOdd(diameter), getClosestOdd(diameter)); + } + + @EditableProperty + @Override + public Inductance getValue() { + return value; + } + + @Override + public void setValue(Inductance value) { + this.value = value; + } + + @EditableProperty + public Resistance getResistance() { + return resistance; + } + + public void setResistance(Resistance resistance) { + this.resistance = resistance; + } + + @EditableProperty + public Size getLip() { + return lip; + } + + public void setLip(Size lip) { + this.lip = lip; + } +} diff --git a/diylc/diylc-library/src/org/diylc/components/passive/ToroidalInductor.java b/diylc/diylc-library/src/org/diylc/components/passive/ToroidalInductor.java new file mode 100644 index 00000000..17aee575 --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/passive/ToroidalInductor.java @@ -0,0 +1,167 @@ +/* + * + * 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 + * . + */ +package org.diylc.components.passive; + +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.Stroke; +import java.awt.geom.Area; +import java.awt.geom.Line2D; +import java.awt.geom.Rectangle2D; +import java.awt.geom.RoundRectangle2D; + +import org.diylc.common.ObjectCache; +import org.diylc.common.SimpleComponentTransformer; +import org.diylc.components.AbstractLeadedComponent; +import org.diylc.core.CreationMethod; +import org.diylc.core.IDIYComponent; +import org.diylc.core.annotations.ComponentDescriptor; +import org.diylc.core.annotations.EditableProperty; +import org.diylc.core.annotations.PositiveMeasureValidator; +import org.diylc.core.measures.Inductance; +import org.diylc.core.measures.Resistance; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; + +@ComponentDescriptor(name = "Toroidal Inductor", author = "Branislav Stojkovic", category = "Passive", + creationMethod = CreationMethod.POINT_BY_POINT, instanceNamePrefix = "L", + description = "Ferrite core torroidal inductor mounted vertically", zOrder = IDIYComponent.COMPONENT, + transformer = SimpleComponentTransformer.class) +public class ToroidalInductor extends AbstractLeadedComponent { + + private static final long serialVersionUID = 1L; + + public static Size DEFAULT_WIDTH = new Size(8d, SizeUnit.mm); + public static Size DEFAULT_HEIGHT = new Size(14d, SizeUnit.mm); + public static Color BODY_COLOR = Color.darkGray; + public static Color LABEL_COLOR = Color.white; + public static Color BORDER_COLOR = BODY_COLOR.darker(); + public static int BAND_SPACING = 5; + public static int FIRST_BAND = -4; + + private Inductance value = null; + private Resistance resistance = null; + + public ToroidalInductor() { + super(); + this.bodyColor = BODY_COLOR; + this.borderColor = BORDER_COLOR; + this.leadColor = COPPER_COLOR; + this.labelColor = LABEL_COLOR; + } + + @Override + protected boolean supportsStandingMode() { + return false; + } + + @EditableProperty(validatorClass = PositiveMeasureValidator.class) + public Inductance getValue() { + return value; + } + + public void setValue(Inductance value) { + this.value = value; + } + + @Override + public String getValueForDisplay() { + return getValue().toString(); + } + + public void drawIcon(Graphics2D g2d, int width, int height) { + g2d.rotate(-Math.PI / 4, width / 2, height / 2); + g2d.setColor(COPPER_COLOR); + g2d.drawLine(0, height / 2, width, height / 2); + g2d.setColor(BODY_COLOR); + Rectangle2D a = new Rectangle2D.Double(width / 2 - 5, 6, 10, height - 14); + g2d.fill(a); + g2d.setColor(BORDER_COLOR); + g2d.draw(a); + g2d.setColor(COPPER_COLOR); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1f)); + for (int i = 0; i < 9; i++) { + g2d.drawLine(width / 2 - 5, 7 + 2 * i, width / 2 + 5, 7 + 2 * i); + } + } + + @Override + protected Size getDefaultWidth() { + return DEFAULT_HEIGHT; + } + + @Override + protected Size getDefaultLength() { + return DEFAULT_WIDTH; + } + + + @Override + protected Shape getBodyShape() { + double width = getWidth().convertToPixels(); + double length = getLength().convertToPixels(); + return new RoundRectangle2D.Double(0f, 0f, length, getClosestOdd(width), length / 4, length / 4); + } + + @Override + protected boolean decorateAboveBorder() { + return true; + } + + @Override + protected void decorateComponentBody(Graphics2D g2d, boolean outlineMode) { + if (outlineMode) + return; + Area body = new Area(getBodyShape()); + int leadThickness = (int) getLeadThickness(); + Stroke stroke = ObjectCache.getInstance().fetchBasicStroke(leadThickness / 2); + Rectangle rect = body.getBounds(); + Area copper = new Area(); + for (double y = leadThickness / 2; y < rect.height; y += leadThickness * 0.9d) { + double margin; + if (y < leadThickness || y > rect.height - leadThickness) + margin = -leadThickness / 4; + else + margin = leadThickness / 4; + Line2D line = new Line2D.Double(-margin, y, rect.width + margin, y); + Shape s = stroke.createStrokedShape(line); + copper.add(new Area(s)); + } +// copper.intersect(body); + g2d.setColor(COPPER_COLOR); + g2d.fill(copper); + g2d.setColor(COPPER_COLOR.darker()); + g2d.draw(copper); + } + + @Deprecated + public boolean getFlipStanding() { + return super.getFlipStanding(); + } + + @EditableProperty + public Resistance getResistance() { + return resistance; + } + + public void setResistance(Resistance resistance) { + this.resistance = resistance; + } +} diff --git a/diylc/diylc-swing/config.properties b/diylc/diylc-swing/config.properties index 420e0fa5..96e15b65 100644 --- a/diylc/diylc-swing/config.properties +++ b/diylc/diylc-swing/config.properties @@ -1,5 +1,5 @@ # Uncomment lines you want to edit and change the part after the "=" sign. #org.diylc.presenter.InstantiationManager.MAX_RECENT_COMPONENTS=20 -org.diylc.swing.plugins.canvas.CanvasPanel.USE_HARDWARE_ACCELLERATION=true -org.diylc.swingframework.ruler.Ruler.USE_HARDWARE_ACCELLERATION=true +#org.diylc.swing.plugins.canvas.CanvasPanel.USE_HARDWARE_ACCELLERATION=true +#org.diylc.swingframework.ruler.Ruler.USE_HARDWARE_ACCELLERATION=true #org.diylc.swing.gui.editor.PropertyEditorDialog.SHOW_DEFAULT_BOXES=true \ No newline at end of file diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index a40bd210..ae89d6c4 100644 Binary files a/diylc/diylc-swing/lib/diylc-core.jar and b/diylc/diylc-swing/lib/diylc-core.jar differ diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index daa0e842..d6dde11e 100644 Binary files a/diylc/diylc-swing/library/main.jar and b/diylc/diylc-swing/library/main.jar differ diff --git a/diylc/diylc-swing/update.xml b/diylc/diylc-swing/update.xml index aac529d4..ae1f5a3a 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -2261,6 +2261,14 @@ NEW_FEATURE "Signal Transformer" added + + + NEW_FEATURE + "Radial Inductor" added + + + NEW_FEATURE + "Toroidal Inductor" added NEW_FEATURE