Added 'Check Trace Proximity' functionality under File -> Analyze menu

that checks if there are any traces or pads that are too close to each
other
This commit is contained in:
bancika
2020-12-20 12:48:12 +01:00
parent 26fa95670e
commit 3e5978beb7
19 changed files with 169 additions and 17 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -23,6 +23,7 @@ import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.geom.Area;
import java.awt.print.PrinterException;
import java.io.BufferedOutputStream;
import java.io.File;
@@ -34,6 +35,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -63,17 +65,19 @@ import org.diylc.core.IView;
import org.diylc.core.Project;
import org.diylc.core.Template;
import org.diylc.core.Theme;
import org.diylc.swing.images.IconLoader;
import org.diylc.core.annotations.PositiveNonZeroMeasureValidator;
import org.diylc.core.measures.Nudge;
import org.diylc.core.measures.Size;
import org.diylc.core.measures.SizeUnit;
import org.diylc.editor.FlexibleLeadsEditor;
import org.diylc.lang.LangUtil;
import org.diylc.netlist.Group;
import org.diylc.netlist.Netlist;
import org.diylc.netlist.Summary;
import org.diylc.presenter.Presenter;
import org.diylc.swing.gui.DialogFactory;
import org.diylc.swing.gui.editor.PropertyEditorDialog;
import org.diylc.swing.images.IconLoader;
import org.diylc.swing.plugins.config.ConfigPlugin;
import org.diylc.swing.plugins.edit.ComponentTransferable;
import org.diylc.swing.plugins.edit.FindDialog;
@@ -292,6 +296,10 @@ public class ActionFactory {
ISwingUI swingUI, INetlistAnalyzer summarizer) {
return new SummarizeNetlistAction(plugInPort, swingUI, summarizer);
}
public CheckProximityAction createCheckProximityAction(IPlugInPort plugInPort, ISwingUI swingUI) {
return new CheckProximityAction(plugInPort, swingUI);
}
// File menu actions.
@@ -419,7 +427,7 @@ public class ActionFactory {
@Override
public boolean editProperties(List<PropertyWrapper> properties,
Set<PropertyWrapper> defaultedProperties) {
Set<PropertyWrapper> defaultedProperties, String title) {
return false;
}
}, InMemoryConfigurationManager.getInstance());
@@ -1931,4 +1939,76 @@ public class ActionFactory {
}, true);
}
}
public static class CheckProximityAction extends AbstractAction implements Cloneable {
private static final long serialVersionUID = 1L;
private IPlugInPort plugInPort;
private ISwingUI swingUI;
private Size threshold;
public CheckProximityAction(IPlugInPort plugInPort, ISwingUI swingUI) {
super();
this.plugInPort = plugInPort;
this.swingUI = swingUI;
putValue(AbstractAction.NAME, "Check Trace Proximity");
putValue(AbstractAction.SMALL_ICON, IconLoader.TraceProximity.getIcon());
this.threshold = new Size(0.5d, SizeUnit.mm);
}
public Size getThreshold() {
return threshold;
}
public void setThreshold(Size threshold) {
this.threshold = threshold;
}
@Override
public void actionPerformed(ActionEvent e) {
PropertyWrapper wrapper = new PropertyWrapper("Threshold", Size.class, "getThreshold", "setThreshold", false, new PositiveNonZeroMeasureValidator(), 0);
try {
wrapper.readFrom(CheckProximityAction.this);
} catch (Exception e1) {
LOG.error("Error reading proximity threshold", e1);
}
if (swingUI.editProperties(Arrays.asList(wrapper), new HashSet<PropertyWrapper>(), (String)CheckProximityAction.this.getValue(NAME))) {
try {
wrapper.writeTo(CheckProximityAction.this);
} catch (Exception e1) {
LOG.error("Error writing proximity threshold", e1);
}
swingUI.executeBackgroundTask(new ITask<List<Area>>() {
@Override
public List<Area> doInBackground() throws Exception {
return plugInPort.checkContinuityAreaProximity(threshold);
}
@Override
public void failed(Exception e) {
swingUI.showMessage(e.getMessage(), (String)CheckProximityAction.this.getValue(NAME), ISwingUI.INFORMATION_MESSAGE);
}
@Override
public void complete(List<Area> res) {
if (res == null || res.size() == 0)
swingUI.showMessage(LangUtil.translate("No proximity issues detected."),
(String)CheckProximityAction.this.getValue(NAME), ISwingUI.INFORMATION_MESSAGE);
else
swingUI.showMessage(String.format("%s potential proximity issue(s) detected and marked red.", res.size()),
(String)CheckProximityAction.this.getValue(NAME), ISwingUI.WARNING_MESSAGE);
}
}, true);
}
}
@Override
public Object clone() throws CloneNotSupportedException {
return new CheckProximityAction(plugInPort, swingUI);
}
}
}
@@ -44,7 +44,7 @@ public class DummyView implements IView {
}
@Override
public boolean editProperties(List<PropertyWrapper> properties, Set<PropertyWrapper> defaultedProperties) {
public boolean editProperties(List<PropertyWrapper> properties, Set<PropertyWrapper> defaultedProperties, String title) {
return false;
}
@@ -298,9 +298,9 @@ public class MainFrame extends JFrame implements ISwingUI {
}
@Override
public boolean editProperties(List<PropertyWrapper> properties, Set<PropertyWrapper> defaultedProperties) {
public boolean editProperties(List<PropertyWrapper> properties, Set<PropertyWrapper> defaultedProperties, String title) {
PropertyEditorDialog editor =
DialogFactory.getInstance().createPropertyEditorDialog(properties, LangUtil.translate("Edit Selection"), true);
DialogFactory.getInstance().createPropertyEditorDialog(properties, title, true);
editor.setVisible(true);
defaultedProperties.addAll(editor.getDefaultedProperties());
return ButtonDialog.OK.equals(editor.getSelectedButtonCaption());
@@ -110,7 +110,7 @@ public class TemplateDialog extends JDialog {
}
@Override
public boolean editProperties(List<PropertyWrapper> properties, Set<PropertyWrapper> defaultedProperties) {
public boolean editProperties(List<PropertyWrapper> properties, Set<PropertyWrapper> defaultedProperties, String title) {
return false;
}
}, InMemoryConfigurationManager.getInstance());
@@ -67,7 +67,7 @@ public enum IconLoader {
JarBeanInto("jar_bean_into.png"), GraphEdgeDirected("graph_edge_directed.png"), LaserPointer("laserpointer.png"), TapeMeasure("tape_measure1.png"),
Elements("elements1.png"), GraphNodes("graph_nodes.png"), User("user1.png"), FlexibleLeads("flexible_leads.png"), Pads("pads.png"), Lock("lock.png"),
Unlock("lock_open.png"), Earth("earth.png"), Loadline("loadline.png"), LoadlineAdd("loadline_add.png"), SnapToGrid("snap_to_grid.png"),
SnapToComponents("snap_to_components.png"), SnapToNone("snap_to_none.png");
SnapToComponents("snap_to_components.png"), SnapToNone("snap_to_none.png"), TraceProximity("trace_proximity.png");
protected String name;
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

@@ -54,16 +54,15 @@ import org.diylc.components.misc.LoadlineEntity;
import org.diylc.core.IDIYComponent;
import org.diylc.core.IView;
import org.diylc.core.Project;
import org.diylc.swing.images.IconLoader;
import org.diylc.core.measures.Size;
import org.diylc.core.measures.SizeUnit;
import org.diylc.core.measures.Voltage;
import org.diylc.core.measures.VoltageUnit;
import org.diylc.lang.LangUtil;
import org.diylc.presenter.Presenter;
import org.diylc.swing.gui.DialogFactory;
import org.diylc.swing.gui.TranslatedPanel;
import org.diylc.swing.gui.editor.PropertyEditorDialog;
import org.diylc.swing.images.IconLoader;
import org.diylc.swing.plugins.canvas.CanvasPanel;
import org.diylc.swing.plugins.file.FileFilterEnum;
import org.diylc.swingframework.ButtonDialog;
@@ -520,9 +519,9 @@ public class LoadlineEditorFrame extends JFrame implements IView {
@Override
public boolean editProperties(List<PropertyWrapper> properties,
Set<PropertyWrapper> defaultedProperties) {
Set<PropertyWrapper> defaultedProperties, String title) {
PropertyEditorDialog editor = DialogFactory.getInstance().createPropertyEditorDialog(LoadlineEditorFrame.this, properties,
LangUtil.translate("Edit Selection"), true);
title, true);
editor.setVisible(true);
defaultedProperties.addAll(editor.getDefaultedProperties());
return ButtonDialog.OK.equals(editor.getSelectedButtonCaption());
@@ -91,6 +91,7 @@ public class FileMenuPlugin implements IPlugIn, IDynamicSubmenuHandler {
swingUI.injectSubmenu(ANALYZE_TITLE, IconLoader.Scientist.getIcon(), FILE_TITLE);
swingUI.injectMenuAction(actionFactory.createBomAction(plugInPort), ANALYZE_TITLE);
swingUI.injectMenuAction(actionFactory.createGenerateNetlistAction(plugInPort, swingUI), ANALYZE_TITLE);
swingUI.injectMenuAction(actionFactory.createCheckProximityAction(plugInPort, swingUI), ANALYZE_TITLE);
List<INetlistAnalyzer> summarizers = plugInPort.getNetlistAnalyzers();
if (summarizers != null) {
@@ -23,7 +23,7 @@ public class MockView implements IView {
@Override
public boolean editProperties(List<PropertyWrapper> properties,
Set<PropertyWrapper> defaultedProperties) {
Set<PropertyWrapper> defaultedProperties, String title) {
// TODO Auto-generated method stub
return false;
}