diff --git a/diylc/diylc-core/src/org/diylc/core/measures/Voltage.java b/diylc/diylc-core/src/org/diylc/core/measures/Voltage.java index 7ffd8aed..5794c96c 100644 --- a/diylc/diylc-core/src/org/diylc/core/measures/Voltage.java +++ b/diylc/diylc-core/src/org/diylc/core/measures/Voltage.java @@ -40,7 +40,7 @@ public class Voltage extends AbstractMeasure { return new Voltage(value, unit); } - public static Voltage parseCapacitance(String value) { + public static Voltage parseVoltage(String value) { value = value.replace("*", ""); for (VoltageUnit unit : VoltageUnit.values()) { if (value.toLowerCase().endsWith(unit.toString().toLowerCase())) { diff --git a/diylc/diylc-core/src/org/diylc/netlist/AbstractNetlistParser.java b/diylc/diylc-core/src/org/diylc/netlist/AbstractNetlistParser.java index 9b0875fd..7bc5d0ef 100644 --- a/diylc/diylc-core/src/org/diylc/netlist/AbstractNetlistParser.java +++ b/diylc/diylc-core/src/org/diylc/netlist/AbstractNetlistParser.java @@ -42,9 +42,10 @@ public abstract class AbstractNetlistParser implements INetlistParser { private static Size X_OFFSET = new Size(1.5d, SizeUnit.in); private static Size Y_OFFSET = new Size(0.3d, SizeUnit.in); - private static int ROW_COUNT = 15; + private static int ROW_COUNT = 12; - public List parseFile(String fileName, List outputWarnings) throws NetlistParseException { + public List parseFile(String fileName, List outputWarnings) + throws NetlistParseException { String content; try { content = new String(Files.readAllBytes(Paths.get(fileName))); @@ -55,7 +56,8 @@ public abstract class AbstractNetlistParser implements INetlistParser { return parse(content, outputWarnings); } - public List parse(String content, List outputWarnings) throws NetlistParseException { + public List parse(String content, List outputWarnings) + throws NetlistParseException { List result = new ArrayList(); Pattern pattern = Pattern.compile(getItemRegex(), Pattern.MULTILINE | Pattern.DOTALL); @@ -75,9 +77,15 @@ public abstract class AbstractNetlistParser implements INetlistParser { } Map valueMap = new HashMap(); - List> typeCandidates = getComponentTypeCandidates(type, valueMap); - if (typeCandidates == null) { - outputWarnings.add("Type mappings not found for " + type + "."); + List> typeCandidates; + try { + typeCandidates = getComponentTypeCandidates(type, valueMap); + if (typeCandidates == null) { + outputWarnings.add("Type mappings not found for " + type + "."); + continue; + } + } catch (Exception e) { + outputWarnings.add("Error parsing type mappings for " + type + "."); continue; } @@ -94,16 +102,17 @@ public abstract class AbstractNetlistParser implements INetlistParser { result.add(new ParsedNetlistEntry(typeCandidates, type, valueMap)); } - + Collections.sort(result, new Comparator() { @Override public int compare(ParsedNetlistEntry o1, ParsedNetlistEntry o2) { int comp = o1.getRawType().compareToIgnoreCase(o2.getRawType()); if (comp == 0 && o1.getValues().containsKey("Name") && o2.getValues().containsKey("Name")) - comp = o1.getValues().get("Name").toString().compareToIgnoreCase(o2.getValues().get("Name").toString()); + comp = o1.getValues().get("Name").toString() + .compareToIgnoreCase(o2.getValues().get("Name").toString()); return comp; - } + } }); return result; @@ -113,6 +122,7 @@ public abstract class AbstractNetlistParser implements INetlistParser { List outputWarnings) { double dx = 0; double dy = 0; + int rowIdx = 0; List> result = new ArrayList>(); for (int i = 0; i < components.size(); i++) { ParsedNetlistComponent parsedComponent = components.get(i); @@ -133,18 +143,21 @@ public abstract class AbstractNetlistParser implements INetlistParser { Point2D controlPoint = new Point2D.Double(p.getX() + dx, p.getY() + dy); component.setControlPoint(controlPoint, j); } - - if (i > 0 && i % ROW_COUNT == 0) { + + if (rowIdx + 1 == ROW_COUNT) { dx += X_OFFSET.convertToPixels(); dy = 0; + rowIdx = 0; } else { dy += Y_OFFSET.convertToPixels(); + rowIdx++; } - + Method[] methods = clazz.getMethods(); for (Map.Entry value : parsedComponent.getValues().entrySet()) { try { - Optional first = Arrays.stream(methods).filter(x -> x.getName().equals("set" + value.getKey())).findFirst(); + Optional first = Arrays.stream(methods) + .filter(x -> x.getName().equals("set" + value.getKey())).findFirst(); if (first.isPresent()) { Method setter = first.get(); setter.invoke(component, value.getValue()); diff --git a/diylc/diylc-library/src/org/diylc/netlist/TangoNetlistParser.java b/diylc/diylc-library/src/org/diylc/netlist/TangoNetlistParser.java index ed274b0e..103abd48 100644 --- a/diylc/diylc-library/src/org/diylc/netlist/TangoNetlistParser.java +++ b/diylc/diylc-library/src/org/diylc/netlist/TangoNetlistParser.java @@ -5,6 +5,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map; +import org.apache.log4j.Logger; import org.diylc.components.passive.AxialElectrolyticCapacitor; import org.diylc.components.passive.AxialFilmCapacitor; import org.diylc.components.passive.CapacitorSymbol; @@ -14,20 +15,28 @@ import org.diylc.components.passive.RadialElectrolytic; import org.diylc.components.passive.RadialFilmCapacitor; import org.diylc.components.passive.Resistor; import org.diylc.components.passive.ResistorSymbol; +import org.diylc.components.semiconductors.BJTSymbol; import org.diylc.components.semiconductors.DIL_IC; import org.diylc.components.semiconductors.DiodeGlass; import org.diylc.components.semiconductors.DiodePlastic; import org.diylc.components.semiconductors.DiodeSymbol; +import org.diylc.components.semiconductors.JFETSymbol; import org.diylc.components.semiconductors.LED; import org.diylc.components.semiconductors.LEDSymbol; +import org.diylc.components.semiconductors.MOSFETSymbol; import org.diylc.components.semiconductors.PhotoDiodeSymbol; import org.diylc.components.semiconductors.SchottkyDiodeSymbol; +import org.diylc.components.semiconductors.TransistorTO220; +import org.diylc.components.semiconductors.TransistorTO92; import org.diylc.components.semiconductors.ZenerDiodeSymbol; import org.diylc.core.measures.Capacitance; import org.diylc.core.measures.Resistance; +import org.diylc.core.measures.Voltage; public class TangoNetlistParser extends AbstractNetlistParser { + private static final Logger LOG = Logger.getLogger(TangoNetlistParser.class); + @Override public String getName() { return "Tango"; @@ -65,23 +74,36 @@ public class TangoNetlistParser extends AbstractNetlistParser { } if (type.toUpperCase().startsWith("CAP_ELECTRO")) { - additionalOutputs.put("Polarized", true); + boolean polarized = true; + if (type.toUpperCase().endsWith("_NP")) { + polarized = false; + type = type.substring(0, type.length() - 3); + } + if (type.length() > "CAP_ELECTRO".length()) { + String voltage = type.substring("CAP_ELECTRO".length() + 1) + "V"; + try { + additionalOutputs.put("VoltageNew", Voltage.parseVoltage(voltage)); + } catch (Exception e) { + LOG.error("Error while parsing voltage " + voltage); + } + } + additionalOutputs.put("Polarized", polarized); types.add(AxialElectrolyticCapacitor.class); types.add(RadialElectrolytic.class); types.add(MultiSectionCapacitor.class); types.add(CapacitorSymbol.class); } - + if (type.toUpperCase().startsWith("DIP")) { try { - int pinCount = Integer.parseInt(type.substring(3)); + int pinCount = Integer.parseInt(type.substring(3)); additionalOutputs.put("PinCount", DIL_IC.PinCount.valueOf("_" + pinCount)); - } catch (Exception e) { + } catch (Exception e) { } - - types.add(DIL_IC.class); + + types.add(DIL_IC.class); } - + if (type.equalsIgnoreCase("DIODE")) { types.add(DiodeGlass.class); types.add(DiodePlastic.class); @@ -90,12 +112,26 @@ public class TangoNetlistParser extends AbstractNetlistParser { types.add(DiodeSymbol.class); types.add(ZenerDiodeSymbol.class); } - + if (type.equalsIgnoreCase("LED")) { types.add(LED.class); types.add(LEDSymbol.class); } - + + if (type.equalsIgnoreCase("TO92")) { + types.add(TransistorTO92.class); + types.add(BJTSymbol.class); + types.add(MOSFETSymbol.class); + types.add(JFETSymbol.class); + } + + if (type.equalsIgnoreCase("TO220")) { + types.add(TransistorTO220.class); + types.add(BJTSymbol.class); + types.add(MOSFETSymbol.class); + types.add(JFETSymbol.class); + } + return types; } diff --git a/diylc/diylc-swing/build.xml b/diylc/diylc-swing/build.xml index e25c5499..5fbe27e3 100644 --- a/diylc/diylc-swing/build.xml +++ b/diylc/diylc-swing/build.xml @@ -10,7 +10,7 @@ - + diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index 25252d94..feeae81f 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/src/org/diylc/swing/ActionFactory.java b/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java index b51ee85e..82f5c362 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java +++ b/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java @@ -524,7 +524,8 @@ public class ActionFactory { @Override public String getDescription() { - return LangUtil.translate("Netlist files"); + List ext = extensions.stream().map(ex -> "*." + ex).collect(Collectors.toList()); + return LangUtil.translate("Netlist files") + " (" + String.join(",", ext) + ")"; } }; } @@ -546,6 +547,8 @@ public class ActionFactory { LOG.debug("Importing netlist from " + file.getAbsolutePath()); List outputWarnings = new ArrayList(); List entries = parser.parseFile(file.getAbsolutePath(), outputWarnings); + if (!outputWarnings.isEmpty()) + LOG.warn("Parsing produced warnings:\n" + String.join("\n", outputWarnings)); return entries; } @@ -560,6 +563,8 @@ public class ActionFactory { List parsedComponents = entries.stream().map(entry -> new ParsedNetlistComponent(results.get(entry.getRawType()), entry.getValues())).collect(Collectors.toList()); List> components = parser.generateComponents(parsedComponents, outputWarnings); + if (!outputWarnings.isEmpty()) + LOG.warn("Component creation produced warnings:\n" + String.join("\n", outputWarnings)); plugInPort.pasteComponents(components, false, false); } } catch (Exception e) {