more flexible leads support

This commit is contained in:
bancika
2020-04-18 13:24:36 +02:00
parent 3ef9586764
commit e8031a6cb4
6 changed files with 232 additions and 104 deletions
@@ -372,7 +372,7 @@ public class RotarySelectorSwitch extends AbstractMultiPartComponent<String> {
}
public enum RotaryPositionCount {
public static enum RotaryPositionCount {
TWO(2), THREE(3), FOUR(4);
private int count;
@@ -189,53 +189,55 @@ public class TransistorTO126 extends AbstractTransistorPackage {
// Draw pins.
if (folded) {
int leadThickness = getClosestOdd(LEAD_THICKNESS.convertToPixels());
int leadLength = (int) getLeadLength().convertToPixels();
Color finalPinColor;
Color finalPinBorderColor;
if (outlineMode) {
finalPinColor = new Color(0, 0, 0, 0);
finalPinBorderColor =
componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
: theme.getOutlineColor();
} else {
finalPinColor = METAL_COLOR;
finalPinBorderColor = METAL_COLOR.darker();
}
for (Point point : controlPoints) {
switch (orientation) {
case DEFAULT:
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness));
g2d.setColor(finalPinBorderColor);
g2d.drawLine(point.x, point.y, point.x + leadLength - leadThickness / 2, point.y);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2));
g2d.setColor(finalPinColor);
g2d.drawLine(point.x, point.y, point.x + leadLength - leadThickness / 2, point.y);
break;
case _90:
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness));
g2d.setColor(finalPinBorderColor);
g2d.drawLine(point.x, point.y, point.x, point.y + leadLength - leadThickness / 2);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2));
g2d.setColor(finalPinColor);
g2d.drawLine(point.x, point.y, point.x, point.y + leadLength - leadThickness / 2);
break;
case _180:
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness));
g2d.setColor(finalPinBorderColor);
g2d.drawLine(point.x, point.y, point.x - leadLength - leadThickness / 2, point.y);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2));
g2d.setColor(finalPinColor);
g2d.drawLine(point.x, point.y, point.x - leadLength - leadThickness / 2, point.y);
break;
case _270:
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness));
g2d.setColor(finalPinBorderColor);
g2d.drawLine(point.x, point.y, point.x, point.y - leadLength);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2));
g2d.setColor(finalPinColor);
g2d.drawLine(point.x, point.y, point.x, point.y - leadLength);
break;
if (getLeadLength().getValue() > 0) {
int leadThickness = getClosestOdd(LEAD_THICKNESS.convertToPixels());
int leadLength = (int) getLeadLength().convertToPixels();
Color finalPinColor;
Color finalPinBorderColor;
if (outlineMode) {
finalPinColor = new Color(0, 0, 0, 0);
finalPinBorderColor =
componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
: theme.getOutlineColor();
} else {
finalPinColor = METAL_COLOR;
finalPinBorderColor = METAL_COLOR.darker();
}
for (Point point : controlPoints) {
switch (orientation) {
case DEFAULT:
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness));
g2d.setColor(finalPinBorderColor);
g2d.drawLine(point.x, point.y, point.x + leadLength - leadThickness / 2, point.y);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2));
g2d.setColor(finalPinColor);
g2d.drawLine(point.x, point.y, point.x + leadLength - leadThickness / 2, point.y);
break;
case _90:
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness));
g2d.setColor(finalPinBorderColor);
g2d.drawLine(point.x, point.y, point.x, point.y + leadLength - leadThickness / 2);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2));
g2d.setColor(finalPinColor);
g2d.drawLine(point.x, point.y, point.x, point.y + leadLength - leadThickness / 2);
break;
case _180:
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness));
g2d.setColor(finalPinBorderColor);
g2d.drawLine(point.x, point.y, point.x - leadLength - leadThickness / 2, point.y);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2));
g2d.setColor(finalPinColor);
g2d.drawLine(point.x, point.y, point.x - leadLength - leadThickness / 2, point.y);
break;
case _270:
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness));
g2d.setColor(finalPinBorderColor);
g2d.drawLine(point.x, point.y, point.x, point.y - leadLength);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2));
g2d.setColor(finalPinColor);
g2d.drawLine(point.x, point.y, point.x, point.y - leadLength);
break;
}
}
}
} else {
@@ -216,53 +216,55 @@ public class TransistorTO220 extends AbstractTransistorPackage {
// Draw pins.
if (folded) {
int leadThickness = getClosestOdd(LEAD_THICKNESS.convertToPixels());
int leadLength = (int) getLeadLength().convertToPixels();
Color finalPinColor;
Color finalPinBorderColor;
if (outlineMode) {
finalPinColor = new Color(0, 0, 0, 0);
finalPinBorderColor =
componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
: theme.getOutlineColor();
} else {
finalPinColor = METAL_COLOR;
finalPinBorderColor = METAL_COLOR.darker();
}
for (Point point : controlPoints) {
switch (orientation) {
case DEFAULT:
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness));
g2d.setColor(finalPinBorderColor);
g2d.drawLine(point.x, point.y, point.x + leadLength - leadThickness / 2, point.y);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2));
g2d.setColor(finalPinColor);
g2d.drawLine(point.x, point.y, point.x + leadLength - leadThickness / 2, point.y);
break;
case _90:
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness));
g2d.setColor(finalPinBorderColor);
g2d.drawLine(point.x, point.y, point.x, point.y + leadLength - leadThickness / 2);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2));
g2d.setColor(finalPinColor);
g2d.drawLine(point.x, point.y, point.x, point.y + leadLength - leadThickness / 2);
break;
case _180:
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness));
g2d.setColor(finalPinBorderColor);
g2d.drawLine(point.x, point.y, point.x - leadLength - leadThickness / 2, point.y);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2));
g2d.setColor(finalPinColor);
g2d.drawLine(point.x, point.y, point.x - leadLength - leadThickness / 2, point.y);
break;
case _270:
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness));
g2d.setColor(finalPinBorderColor);
g2d.drawLine(point.x, point.y, point.x, point.y - leadLength);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2));
g2d.setColor(finalPinColor);
g2d.drawLine(point.x, point.y, point.x, point.y - leadLength);
break;
if (getLeadLength().getValue() > 0) {
int leadThickness = getClosestOdd(LEAD_THICKNESS.convertToPixels());
int leadLength = (int) getLeadLength().convertToPixels();
Color finalPinColor;
Color finalPinBorderColor;
if (outlineMode) {
finalPinColor = new Color(0, 0, 0, 0);
finalPinBorderColor =
componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
: theme.getOutlineColor();
} else {
finalPinColor = METAL_COLOR;
finalPinBorderColor = METAL_COLOR.darker();
}
for (Point point : controlPoints) {
switch (orientation) {
case DEFAULT:
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness));
g2d.setColor(finalPinBorderColor);
g2d.drawLine(point.x, point.y, point.x + leadLength - leadThickness / 2, point.y);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2));
g2d.setColor(finalPinColor);
g2d.drawLine(point.x, point.y, point.x + leadLength - leadThickness / 2, point.y);
break;
case _90:
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness));
g2d.setColor(finalPinBorderColor);
g2d.drawLine(point.x, point.y, point.x, point.y + leadLength - leadThickness / 2);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2));
g2d.setColor(finalPinColor);
g2d.drawLine(point.x, point.y, point.x, point.y + leadLength - leadThickness / 2);
break;
case _180:
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness));
g2d.setColor(finalPinBorderColor);
g2d.drawLine(point.x, point.y, point.x - leadLength - leadThickness / 2, point.y);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2));
g2d.setColor(finalPinColor);
g2d.drawLine(point.x, point.y, point.x - leadLength - leadThickness / 2, point.y);
break;
case _270:
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness));
g2d.setColor(finalPinBorderColor);
g2d.drawLine(point.x, point.y, point.x, point.y - leadLength);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2));
g2d.setColor(finalPinColor);
g2d.drawLine(point.x, point.y, point.x, point.y - leadLength);
break;
}
}
}
} else {
@@ -94,7 +94,7 @@ public class TubeSocket extends AbstractTransparentComponent<String> {
private int angle;
private Color color = BODY_COLOR;
private String electrodeLabels = null;
private Mount mount = null;
private Mount mount = Mount.CHASSIS;
private Color labelColor = LABEL_COLOR;
private Point[] controlPoints = new Point[] {new Point(0, 0)};
@@ -427,7 +427,7 @@ public class TubeSocket extends AbstractTransparentComponent<String> {
@EditableProperty(name = "Mount")
public Mount getMount() {
if (mount == null)
mount = Mount.PCB;
mount = Mount.CHASSIS;
return mount;
}
@@ -461,7 +461,7 @@ public class TubeSocket extends AbstractTransparentComponent<String> {
}
}
static enum Mount {
public static enum Mount {
CHASSIS("Chassis"), PCB("PCB");
String name;
@@ -1,18 +1,27 @@
package org.diylc.editor;
import java.awt.Point;
import java.awt.geom.AffineTransform;
import java.util.HashSet;
import java.util.Set;
import org.diylc.common.IProjectEditor;
import org.diylc.common.Orientation;
import org.diylc.components.AbstractCurvedComponent.PointCount;
import org.diylc.components.AbstractLeadedComponent;
import org.diylc.components.connectivity.AWG;
import org.diylc.components.connectivity.HookupWire;
import org.diylc.components.passive.PotentiometerPanel;
import org.diylc.components.passive.PotentiometerPanel.Type;
import org.diylc.components.semiconductors.AbstractTransistorPackage;
import org.diylc.components.semiconductors.TransistorTO126;
import org.diylc.components.semiconductors.TransistorTO220;
import org.diylc.components.tube.TubeSocket;
import org.diylc.components.tube.TubeSocket.Mount;
import org.diylc.core.IDIYComponent;
import org.diylc.core.Project;
import org.diylc.core.measures.Size;
import org.diylc.core.measures.SizeUnit;
import org.diylc.presenter.InstantiationManager;
public class FlexibleLeadsEditor implements IProjectEditor {
@@ -25,13 +34,18 @@ public class FlexibleLeadsEditor implements IProjectEditor {
for (IDIYComponent<?> c : selection) {
if (c instanceof AbstractLeadedComponent<?>)
addLeads((AbstractLeadedComponent<?>) c, project, newSelection);
else if (c instanceof AbstractTransistorPackage)
addLeads((AbstractTransistorPackage) c, project, newSelection);
else if (c instanceof PotentiometerPanel)
addLeads((PotentiometerPanel) c, project, newSelection);
else if (c instanceof TubeSocket)
addLeads((TubeSocket) c, project, newSelection);
}
return newSelection;
}
private void addLeads(AbstractLeadedComponent<?> c, Project project, Set<IDIYComponent<?>> newSelection) {
AbstractLeadedComponent<?> leaded = (AbstractLeadedComponent<?>)c;
private void addLeads(AbstractLeadedComponent<?> leaded, Project project, Set<IDIYComponent<?>> newSelection) {
Size l = leaded.getLength();
// do not apply to jumpers, etc
if (l == null)
@@ -77,16 +91,126 @@ public class FlexibleLeadsEditor implements IProjectEditor {
newSelection.add(w2);
// inject leads right before the component
int index = project.getComponents().indexOf(c);
int index = project.getComponents().indexOf(leaded);
project.getComponents().add(index, w1);
project.getComponents().add(index, w2);
}
private void addLeads(AbstractTransistorPackage c, Project project, Set<IDIYComponent<?>> newSelection) {
if (c.getFolded()) {
Size offsetX = new Size(0.4d, SizeUnit.in);
Size offsetY = new Size(0.1d, SizeUnit.in);
// create leads
for (int i = 0; i < 3; i++) {
Point p0 = c.getControlPoint(i);
double dx = -offsetX.convertToPixels();
double dy = offsetY.convertToPixels() * (i - 1);
} else {
// calculate lead position
Point p1 = new Point((int)(p0.x + dx / 2), (int)(p0.y + dy / 2));
Point p2 = new Point((int)(p0.x + dx), (int)(p0.y + dy));
if (c.getOrientation() != Orientation.DEFAULT) {
AffineTransform tx = AffineTransform.getRotateInstance(c.getOrientation().toRadians(), p0.x, p0.y);
tx.transform(p1, p1);
tx.transform(p2, p2);
}
HookupWire w = new HookupWire();
// make the leads thicker for TO220 and TO126
if (c instanceof TransistorTO220 || c instanceof TransistorTO126)
w.setGauge(AWG._24);
else
w.setGauge(AWG._26);
w.setLeadColor(AbstractTransistorPackage.METAL_COLOR);
w.setPointCount(PointCount.THREE);
w.setControlPoint(p0, 0);
w.setControlPoint(p1, 1);
w.setControlPoint(p2, 2);
newSelection.add(w);
// inject leads right before the component
int index = project.getComponents().indexOf(c);
project.getComponents().add(index, w);
}
if (c instanceof TransistorTO220) {
TransistorTO220 t = (TransistorTO220)c;
if (t.getFolded())
t.setLeadLength(new Size(0d, SizeUnit.mm));
}
else if (c instanceof TransistorTO126) {
TransistorTO126 t = (TransistorTO126)c;
if (t.getFolded())
t.setLeadLength(new Size(0d, SizeUnit.mm));
}
}
private void addLeads(PotentiometerPanel c, Project project, Set<IDIYComponent<?>> newSelection) {
Size offsetY = new Size(1d, SizeUnit.in);
// don't do it for PCB type
if (c.getType() == Type.PCB)
return;
// create leads
for (int i = 0; i < 3; i++) {
Point p0 = c.getControlPoint(i);
double dx = 0;
double dy = offsetY.convertToPixels();
// calculate lead position
Point p1 = new Point((int)(p0.x + dx / 2), (int)(p0.y + dy / 2));
Point p2 = new Point((int)(p0.x + dx), (int)(p0.y + dy));
if (c.getOrientation() != Orientation.DEFAULT) {
AffineTransform tx = AffineTransform.getRotateInstance(c.getOrientation().toRadians(), p0.x, p0.y);
tx.transform(p1, p1);
tx.transform(p2, p2);
}
HookupWire w = new HookupWire();
getInstantiationManager().fillWithDefaultProperties(w, null);
w.setPointCount(PointCount.THREE);
w.setControlPoint(p0, 0);
w.setControlPoint(p1, 1);
w.setControlPoint(p2, 2);
newSelection.add(w);
// inject leads right before the component
int index = project.getComponents().indexOf(c);
project.getComponents().add(index + 1, w);
}
}
private void addLeads(TubeSocket c, Project project, Set<IDIYComponent<?>> newSelection) {
Point center = c.getControlPoint(0);
// don't do it for PCB type
if (c.getMount() == Mount.PCB)
return;
// create leads
for (int i = 1; i < c.getControlPointCount(); i++) {
Point p = c.getControlPoint(i);
double dx = p.x - center.x;
double dy = p.y - center.y;
// calculate lead position
Point p1 = new Point((int)(p.x + dx), (int)(p.y + dy));
Point p2 = new Point((int)(p.x + dx * 2), (int)(p.y + dy * 2));
HookupWire w = new HookupWire();
getInstantiationManager().fillWithDefaultProperties(w, null);
w.setPointCount(PointCount.THREE);
w.setControlPoint(p, 0);
w.setControlPoint(p1, 1);
w.setControlPoint(p2, 2);
newSelection.add(w);
// inject leads right before the component
int index = project.getComponents().indexOf(c);
project.getComponents().add(index + 1, w);
}
}