mirror of
https://github.com/bancika/diy-layout-creator
synced 2026-11-10 17:22:09 +10:00
Diode symbol
This commit is contained in:
+215
@@ -0,0 +1,215 @@
|
||||
package org.diylc.components.tube;
|
||||
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Point;
|
||||
import java.awt.Shape;
|
||||
import java.awt.geom.Ellipse2D;
|
||||
import java.awt.geom.GeneralPath;
|
||||
|
||||
import org.diylc.common.ObjectCache;
|
||||
import org.diylc.core.IDIYComponent;
|
||||
import org.diylc.core.IPropertyValidator;
|
||||
import org.diylc.core.ValidationException;
|
||||
import org.diylc.core.VisibilityPolicy;
|
||||
import org.diylc.core.annotations.ComponentDescriptor;
|
||||
import org.diylc.core.annotations.EditableProperty;
|
||||
|
||||
@ComponentDescriptor(name = "Diode Symbol", author = "Branislav Stojkovic", category = "Tubes", instanceNamePrefix = "V", description = "Diode tube symbol", stretchable = false, zOrder = IDIYComponent.COMPONENT)
|
||||
public class DiodeSymbol extends AbstractTubeSymbol {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
protected Point[] controlPoints = new Point[] { new Point(0, 0),
|
||||
new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0) };
|
||||
|
||||
protected boolean directlyHeated = false;
|
||||
|
||||
public DiodeSymbol() {
|
||||
super();
|
||||
updateControlPoints();
|
||||
}
|
||||
|
||||
public Shape[] getBody() {
|
||||
if (body == null) {
|
||||
body = new Shape[3];
|
||||
int x = controlPoints[0].x;
|
||||
int y = controlPoints[0].y;
|
||||
int pinSpacing = (int) PIN_SPACING.convertToPixels();
|
||||
|
||||
// electrodes
|
||||
GeneralPath polyline = new GeneralPath();
|
||||
|
||||
// plate
|
||||
polyline.moveTo(x + pinSpacing * 3 / 2, y - pinSpacing);
|
||||
polyline.lineTo(x + pinSpacing * 9 / 2, y - pinSpacing);
|
||||
|
||||
// cathode
|
||||
if (directlyHeated) {
|
||||
polyline.moveTo(controlPoints[2].x, controlPoints[2].y
|
||||
- pinSpacing);
|
||||
polyline.lineTo(controlPoints[2].x + pinSpacing,
|
||||
controlPoints[2].y - pinSpacing * 2);
|
||||
polyline.lineTo(controlPoints[4].x, controlPoints[4].y
|
||||
- pinSpacing);
|
||||
} else {
|
||||
polyline.moveTo(x + pinSpacing * 2, y + pinSpacing);
|
||||
polyline.lineTo(x + pinSpacing * 4, y + pinSpacing);
|
||||
}
|
||||
|
||||
body[0] = polyline;
|
||||
|
||||
// connectors
|
||||
polyline = new GeneralPath();
|
||||
|
||||
// plate
|
||||
polyline.moveTo(controlPoints[1].x, controlPoints[1].y);
|
||||
polyline.lineTo(x + pinSpacing * 3, y - pinSpacing);
|
||||
|
||||
// cathode
|
||||
if (directlyHeated) {
|
||||
polyline.moveTo(controlPoints[2].x, controlPoints[2].y);
|
||||
polyline.lineTo(controlPoints[2].x, controlPoints[2].y
|
||||
- pinSpacing);
|
||||
|
||||
polyline.moveTo(controlPoints[4].x, controlPoints[4].y);
|
||||
polyline.lineTo(controlPoints[4].x, controlPoints[4].y
|
||||
- pinSpacing);
|
||||
} else {
|
||||
polyline.moveTo(controlPoints[2].x, controlPoints[2].y);
|
||||
polyline.lineTo(x + pinSpacing * 2, y + pinSpacing);
|
||||
|
||||
if (showHeaters) {
|
||||
polyline.moveTo(controlPoints[3].x, controlPoints[3].y);
|
||||
polyline.lineTo(controlPoints[3].x, controlPoints[3].y
|
||||
- pinSpacing);
|
||||
polyline.lineTo(controlPoints[3].x + pinSpacing / 2,
|
||||
controlPoints[3].y - 3 * pinSpacing / 2);
|
||||
|
||||
polyline.moveTo(controlPoints[4].x, controlPoints[4].y);
|
||||
polyline.lineTo(controlPoints[4].x, controlPoints[4].y
|
||||
- pinSpacing);
|
||||
polyline.lineTo(controlPoints[4].x - pinSpacing / 2,
|
||||
controlPoints[4].y - 3 * pinSpacing / 2);
|
||||
}
|
||||
}
|
||||
|
||||
body[1] = polyline;
|
||||
|
||||
// bulb
|
||||
body[2] = new Ellipse2D.Double(x + pinSpacing / 2, y - pinSpacing
|
||||
* 5 / 2, pinSpacing * 5, pinSpacing * 5);
|
||||
}
|
||||
return body;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawIcon(Graphics2D g2d, int width, int height) {
|
||||
g2d.setColor(COLOR);
|
||||
|
||||
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1));
|
||||
|
||||
g2d.drawLine(width / 4, height / 4, width * 3 / 4, height / 4);
|
||||
g2d.drawLine(width / 2, height / 4, width / 2, 0);
|
||||
|
||||
g2d.drawLine(width / 4 + 2 * width / 32, height * 3 / 4, width * 3 / 4
|
||||
- 4 * width / 32, height * 3 / 4);
|
||||
g2d.drawLine(width / 4 + 2 * width / 32, height * 3 / 4, width / 4 + 2
|
||||
* width / 32, height - 1);
|
||||
|
||||
g2d.drawOval(1, 1, width - 1 - 2 * width / 32, height - 1 - 2 * width
|
||||
/ 32);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Point getControlPoint(int index) {
|
||||
return controlPoints[index];
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getControlPointCount() {
|
||||
return controlPoints.length;
|
||||
}
|
||||
|
||||
protected void updateControlPoints() {
|
||||
int pinSpacing = (int) PIN_SPACING.convertToPixels();
|
||||
// Update control points.
|
||||
int x = controlPoints[0].x;
|
||||
int y = controlPoints[0].y;
|
||||
|
||||
controlPoints[1].x = x + pinSpacing * 3;
|
||||
controlPoints[1].y = y - pinSpacing * 3;
|
||||
|
||||
controlPoints[2].x = x + pinSpacing * 2;
|
||||
controlPoints[2].y = y + pinSpacing * 3;
|
||||
|
||||
controlPoints[3].x = x + pinSpacing * 3;
|
||||
controlPoints[3].y = y + pinSpacing * 3;
|
||||
|
||||
controlPoints[4].x = x + pinSpacing * 4;
|
||||
controlPoints[4].y = y + pinSpacing * 3;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setControlPoint(Point point, int index) {
|
||||
controlPoints[index].setLocation(point);
|
||||
// Invalidate body
|
||||
body = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VisibilityPolicy getControlPointVisibilityPolicy(int index) {
|
||||
if (directlyHeated) {
|
||||
return index > 0 && index != 3 ? VisibilityPolicy.WHEN_SELECTED
|
||||
: VisibilityPolicy.NEVER;
|
||||
} else if (showHeaters) {
|
||||
return index > 0 ? VisibilityPolicy.WHEN_SELECTED
|
||||
: VisibilityPolicy.NEVER;
|
||||
} else {
|
||||
return index < 3 && index > 0 ? VisibilityPolicy.WHEN_SELECTED
|
||||
: VisibilityPolicy.NEVER;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isControlPointSticky(int index) {
|
||||
if (directlyHeated)
|
||||
return index > 0 && index != 3;
|
||||
else if (showHeaters) {
|
||||
return index > 0;
|
||||
} else {
|
||||
return index > 0 && index < 3;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Point getTextLocation() {
|
||||
int pinSpacing = (int) PIN_SPACING.convertToPixels();
|
||||
return new Point(controlPoints[0].x + pinSpacing * 5,
|
||||
controlPoints[0].y + pinSpacing * 2);
|
||||
}
|
||||
|
||||
@EditableProperty(name = "Directly heated")
|
||||
public boolean getDirectlyHeated() {
|
||||
return directlyHeated;
|
||||
}
|
||||
|
||||
public void setDirectlyHeated(boolean directlyHeated) {
|
||||
this.directlyHeated = directlyHeated;
|
||||
// Invalidate body
|
||||
body = null;
|
||||
}
|
||||
|
||||
public class HeaterValidator implements IPropertyValidator {
|
||||
|
||||
@Override
|
||||
public void validate(Object value) throws ValidationException {
|
||||
if (value != null && value instanceof Boolean) {
|
||||
boolean b = (Boolean) value;
|
||||
if (!b && getDirectlyHeated()) {
|
||||
throw new ValidationException(
|
||||
"Must show heaters for directly heated tubes.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+2
@@ -171,6 +171,8 @@ public class PentodeSymbol extends AbstractTubeSymbol {
|
||||
g2d.setStroke(new BasicStroke(1f, BasicStroke.CAP_ROUND,
|
||||
BasicStroke.JOIN_BEVEL, 0, new float[] { 3f }, 6f));
|
||||
g2d.drawLine(width / 8, height / 2, width * 7 / 8, height / 2);
|
||||
g2d.drawLine(width / 8, height * 3 / 8, width * 7 / 8, height * 3 / 8);
|
||||
g2d.drawLine(width / 8, height * 5 / 8, width * 7 / 8, height * 5 / 8);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+52
-14
@@ -11,6 +11,7 @@ import org.diylc.common.ObjectCache;
|
||||
import org.diylc.core.IDIYComponent;
|
||||
import org.diylc.core.VisibilityPolicy;
|
||||
import org.diylc.core.annotations.ComponentDescriptor;
|
||||
import org.diylc.core.annotations.EditableProperty;
|
||||
|
||||
@ComponentDescriptor(name = "Triode Symbol", author = "Branislav Stojkovic", category = "Tubes", instanceNamePrefix = "V", description = "Triode tube symbol", stretchable = false, zOrder = IDIYComponent.COMPONENT)
|
||||
public class TriodeSymbol extends AbstractTubeSymbol {
|
||||
@@ -20,6 +21,8 @@ public class TriodeSymbol extends AbstractTubeSymbol {
|
||||
protected Point[] controlPoints = new Point[] { new Point(0, 0),
|
||||
new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0) };
|
||||
|
||||
protected boolean directlyHeated = false;
|
||||
|
||||
public TriodeSymbol() {
|
||||
super();
|
||||
updateControlPoints();
|
||||
@@ -50,8 +53,17 @@ public class TriodeSymbol extends AbstractTubeSymbol {
|
||||
polyline.lineTo(x + pinSpacing * 9 / 2, y - pinSpacing);
|
||||
|
||||
// cathode
|
||||
polyline.moveTo(x + pinSpacing * 2, y + pinSpacing);
|
||||
polyline.lineTo(x + pinSpacing * 4, y + pinSpacing);
|
||||
if (directlyHeated) {
|
||||
polyline.moveTo(controlPoints[2].x, controlPoints[2].y
|
||||
- pinSpacing);
|
||||
polyline.lineTo(controlPoints[2].x + pinSpacing,
|
||||
controlPoints[2].y - pinSpacing * 2);
|
||||
polyline.lineTo(controlPoints[4].x, controlPoints[4].y
|
||||
- pinSpacing);
|
||||
} else {
|
||||
polyline.moveTo(x + pinSpacing * 2, y + pinSpacing);
|
||||
polyline.lineTo(x + pinSpacing * 4, y + pinSpacing);
|
||||
}
|
||||
|
||||
body[0] = polyline;
|
||||
|
||||
@@ -67,21 +79,31 @@ public class TriodeSymbol extends AbstractTubeSymbol {
|
||||
polyline.lineTo(x + pinSpacing * 3, y - pinSpacing);
|
||||
|
||||
// cathode
|
||||
polyline.moveTo(controlPoints[2].x, controlPoints[2].y);
|
||||
polyline.lineTo(x + pinSpacing * 2, y + pinSpacing);
|
||||
|
||||
if (showHeaters) {
|
||||
polyline.moveTo(controlPoints[3].x, controlPoints[3].y);
|
||||
polyline.lineTo(controlPoints[3].x, controlPoints[3].y
|
||||
if (directlyHeated) {
|
||||
polyline.moveTo(controlPoints[2].x, controlPoints[2].y);
|
||||
polyline.lineTo(controlPoints[2].x, controlPoints[2].y
|
||||
- pinSpacing);
|
||||
polyline.lineTo(controlPoints[3].x + pinSpacing / 2,
|
||||
controlPoints[3].y - 3 * pinSpacing / 2);
|
||||
|
||||
polyline.moveTo(controlPoints[4].x, controlPoints[4].y);
|
||||
polyline.lineTo(controlPoints[4].x, controlPoints[4].y
|
||||
- pinSpacing);
|
||||
polyline.lineTo(controlPoints[4].x - pinSpacing / 2,
|
||||
controlPoints[4].y - 3 * pinSpacing / 2);
|
||||
} else {
|
||||
polyline.moveTo(controlPoints[2].x, controlPoints[2].y);
|
||||
polyline.lineTo(x + pinSpacing * 2, y + pinSpacing);
|
||||
|
||||
if (showHeaters) {
|
||||
polyline.moveTo(controlPoints[3].x, controlPoints[3].y);
|
||||
polyline.lineTo(controlPoints[3].x, controlPoints[3].y
|
||||
- pinSpacing);
|
||||
polyline.lineTo(controlPoints[3].x + pinSpacing / 2,
|
||||
controlPoints[3].y - 3 * pinSpacing / 2);
|
||||
|
||||
polyline.moveTo(controlPoints[4].x, controlPoints[4].y);
|
||||
polyline.lineTo(controlPoints[4].x, controlPoints[4].y
|
||||
- pinSpacing);
|
||||
polyline.lineTo(controlPoints[4].x - pinSpacing / 2,
|
||||
controlPoints[4].y - 3 * pinSpacing / 2);
|
||||
}
|
||||
}
|
||||
|
||||
body[1] = polyline;
|
||||
@@ -154,7 +176,10 @@ public class TriodeSymbol extends AbstractTubeSymbol {
|
||||
|
||||
@Override
|
||||
public VisibilityPolicy getControlPointVisibilityPolicy(int index) {
|
||||
if (showHeaters) {
|
||||
if (directlyHeated) {
|
||||
return index != 3 ? VisibilityPolicy.WHEN_SELECTED
|
||||
: VisibilityPolicy.NEVER;
|
||||
} else if (showHeaters) {
|
||||
return VisibilityPolicy.WHEN_SELECTED;
|
||||
} else {
|
||||
return index < 3 ? VisibilityPolicy.WHEN_SELECTED
|
||||
@@ -164,7 +189,9 @@ public class TriodeSymbol extends AbstractTubeSymbol {
|
||||
|
||||
@Override
|
||||
public boolean isControlPointSticky(int index) {
|
||||
if (showHeaters) {
|
||||
if (directlyHeated) {
|
||||
return index != 3;
|
||||
} else if (showHeaters) {
|
||||
return true;
|
||||
} else {
|
||||
return index < 3;
|
||||
@@ -177,4 +204,15 @@ public class TriodeSymbol extends AbstractTubeSymbol {
|
||||
return new Point(controlPoints[0].x + pinSpacing * 5,
|
||||
controlPoints[0].y + pinSpacing * 2);
|
||||
}
|
||||
|
||||
@EditableProperty(name = "Directly heated")
|
||||
public boolean getDirectlyHeated() {
|
||||
return directlyHeated;
|
||||
}
|
||||
|
||||
public void setDirectlyHeated(boolean directlyHeated) {
|
||||
this.directlyHeated = directlyHeated;
|
||||
// Invalidate body
|
||||
body = null;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user