diff --git a/diylc/diylc-core/src/org/diylc/netlist/NetlistAnalyzer.java b/diylc/diylc-core/src/org/diylc/netlist/NetlistAnalyzer.java index 183ac549..9b0931e3 100644 --- a/diylc/diylc-core/src/org/diylc/netlist/NetlistAnalyzer.java +++ b/diylc/diylc-core/src/org/diylc/netlist/NetlistAnalyzer.java @@ -398,7 +398,26 @@ public abstract class NetlistAnalyzer { return c.getName() + " " + c.getValueForDisplay(); } - protected Set> extractComponents(Netlist netlist) { + public static List>> extractComponentGroups(List netlists) { + List>> res = new ArrayList>>(); + for (Netlist n : netlists) { + res.addAll(extractComponentGroups(n)); + } + return res; + } + + public static List>> extractComponentGroups(Netlist netlist) { + List>> res = new ArrayList>>(); + for (Group g : netlist.getGroups()) { + Set> components = new HashSet>(); + for (Node n : g.getNodes()) + components.add(n.getComponent()); + res.add(components); + } + return res; + } + + public static Set> extractComponents(Netlist netlist) { Set> res = new HashSet>(); for (Group g : netlist.getGroups()) for (Node n : g.getNodes()) diff --git a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java index 5c5901c8..92198eee 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java +++ b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java @@ -80,6 +80,7 @@ import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; import org.diylc.netlist.Group; import org.diylc.netlist.Netlist; +import org.diylc.netlist.NetlistAnalyzer; import org.diylc.netlist.Node; import org.diylc.netlist.Position; import org.diylc.netlist.SwitchSetup; @@ -1905,6 +1906,8 @@ public class Presenter implements IPlugInPort { public void expandSelection(ExpansionMode expansionMode) { LOG.info(String.format("expandSelection(%s)", expansionMode)); List> newSelection = new ArrayList>(this.selectedComponents); + List netlists = extractNetlists(); + List>> allGroups = NetlistAnalyzer.extractComponentGroups(netlists); // Find control points of all selected components and all types Set selectedNamePrefixes = new HashSet(); if (expansionMode == ExpansionMode.SAME_TYPE) { @@ -1916,23 +1919,26 @@ public class Presenter implements IPlugInPort { // Now try to find components that intersect with at least one component // in the pool. for (IDIYComponent component : getCurrentProject().getComponents()) { + // no need to consider it, it's already in the selection + if (newSelection.contains(component)) + continue; + // construct a list of component groups that contain the current component + List>> componentGroups = new ArrayList>>(); + for (Set> e : allGroups) + if (e.contains(component)) + componentGroups.add(e); + if (componentGroups.isEmpty()) + continue; // Skip already selected components or ones that cannot be stuck to // other components. - ComponentArea area = drawingManager.getComponentArea(component); - if (newSelection.contains(component) || !component.isControlPointSticky(0) || area == null - || area.getOutlineArea() == null) - continue; boolean matches = false; - for (IDIYComponent selectedComponent : this.selectedComponents) { - ComponentArea selectedArea = drawingManager.getComponentArea(selectedComponent); - if (selectedArea == null || selectedArea.getOutlineArea() == null) - continue; - Area intersection = new Area(area.getOutlineArea()); - intersection.intersect(selectedArea.getOutlineArea()); - if (!intersection.isEmpty()) { - matches = true; - break; - } + outer: for (IDIYComponent selectedComponent : this.selectedComponents) { + // try to find the selectedComponent in one of the groups + for (Set> s : componentGroups) + if (s.contains(selectedComponent)) { + matches = true; + break outer; + } } if (matches) { diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 97907000..31ecf77d 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/Abstract3LegSymbol.java b/diylc/diylc-library/src/org/diylc/components/Abstract3LegSymbol.java index 46b0f1e7..8e42539a 100644 --- a/diylc/diylc-library/src/org/diylc/components/Abstract3LegSymbol.java +++ b/diylc/diylc-library/src/org/diylc/components/Abstract3LegSymbol.java @@ -29,7 +29,7 @@ import java.awt.Rectangle; import java.awt.Shape; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; - + import org.diylc.appframework.miscutils.ConfigurationManager; import org.diylc.common.Display; import org.diylc.common.HorizontalAlignment; @@ -334,6 +334,13 @@ public abstract class Abstract3LegSymbol extends AbstractComponent { body[i] = rotate.createTransformedShape(body[i]); } } + } + + @Override + public String getControlPointNodeName(int index) { + if (index >= 3) + return null; + return Integer.toString(index + 1); } /** diff --git a/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java b/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java index b59b06f4..f6fcb7b3 100644 --- a/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java +++ b/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java @@ -623,7 +623,7 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp @Override public String getInternalLinkName(int index1, int index2) { - if ((index1 == 0 && index2 == getControlPointCount() - 1) || (index2 == 0 && index1 == getControlPointCount() - 1)) + if ((index1 == 0 && index2 == 1) || (index2 == 0 && index1 == 1)) return getName(); return null; } @@ -650,6 +650,13 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp public void setMoveLabel(boolean moveLabel) { this.moveLabel = moveLabel; } + + @Override + public String getControlPointNodeName(int index) { + if (index >= 2) + return null; + return Integer.toString(index + 1); + } public enum LabelOriantation { Directional, Horizontal diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/CopperTrace.java b/diylc/diylc-library/src/org/diylc/components/connectivity/CopperTrace.java index d1c6b67f..639cf9e0 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/CopperTrace.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/CopperTrace.java @@ -167,4 +167,9 @@ public class CopperTrace extends AbstractLeadedComponent { public String getControlPointNodeName(int index) { return null; } + + public boolean getMoveLabel() { + // override to disable edit + return false; + } } diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/Jumper.java b/diylc/diylc-library/src/org/diylc/components/connectivity/Jumper.java index 643be812..88fcad81 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/Jumper.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/Jumper.java @@ -162,5 +162,10 @@ public class Jumper extends AbstractLeadedComponent implements IContinuity @Override public boolean arePointsConnected(int index1, int index2) { return true; - } + } + + public boolean getMoveLabel() { + // override to disable edit + return false; + } } diff --git a/diylc/diylc-library/src/org/diylc/components/semiconductors/AbstractTransistorPackage.java b/diylc/diylc-library/src/org/diylc/components/semiconductors/AbstractTransistorPackage.java index 706bd456..b107c4b4 100644 --- a/diylc/diylc-library/src/org/diylc/components/semiconductors/AbstractTransistorPackage.java +++ b/diylc/diylc-library/src/org/diylc/components/semiconductors/AbstractTransistorPackage.java @@ -201,4 +201,11 @@ public abstract class AbstractTransistorPackage extends AbstractTransparentCompo public boolean canPointMoveFreely(int pointIndex) { return false; } + + @Override + public String getControlPointNodeName(int index) { + if (index >= 3) + return null; + return Integer.toString(index + 1); + } } diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index 97907000..31ecf77d 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 111b958d..df0f9edf 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 fc72dbe7..a7cf1f65 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -2646,6 +2646,10 @@ IMPROVEMENT Output SPICE node names in the "Nxxx" format + + IMPROVEMENT + Improve "Expand Selection" feature to use the same algorithm as netlists for better precision + IMPROVEMENT Improve performance of netlist calculations