diff --git a/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java b/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java index 8ca5be98..cb1e9b21 100644 --- a/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java +++ b/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java @@ -174,9 +174,10 @@ public interface IPlugInPort extends ISelectionProcessor, IMouseProcessor, IKeyP * * @param g2d * @param drawOptions specific drawing options - * @param filter + * @param filter + * @param externalZoom */ - void draw(Graphics2D g2d, Set drawOptions, IComponentFiler filter); + void draw(Graphics2D g2d, Set drawOptions, IComponentFiler filter, Double externalZoom); Double[] getAvailableZoomLevels(); diff --git a/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java b/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java index 1da493ca..2ce94c79 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java +++ b/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java @@ -27,6 +27,7 @@ import java.awt.Point; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.geom.Area; +import java.awt.geom.Line2D; import java.awt.geom.Path2D; import java.awt.geom.PathIterator; import java.util.ArrayList; @@ -122,12 +123,13 @@ public class DrawingManager { * @param controlPointSlot * @param componentSlot * @param dragInProgress + * @param externalZoom * @return */ public List> drawProject(Graphics2D g2d, Project project, Set drawOptions, IComponentFiler filter, Rectangle selectionRect, Collection> selectedComponents, Set> lockedComponents, Set> groupedComponents, List controlPointSlot, - List> componentSlot, boolean dragInProgress) { + List> componentSlot, boolean dragInProgress, Double externalZoom) { failedComponents.clear(); if (project == null) { return failedComponents; @@ -139,6 +141,9 @@ public class DrawingManager { } else { zoom = 1 / Constants.PIXEL_SIZE; } + + if (externalZoom != null) + zoom *= externalZoom; G2DWrapper g2dWrapper = new G2DWrapper(g2d, zoom); @@ -175,20 +180,23 @@ public class DrawingManager { GridType gridType = GridType.LINES; if (drawOptions.contains(DrawOption.GRID) && gridType != GridType.NONE) { double zoomStep = project.getGridSpacing().convertToPixels() * zoom; + float gridThickness = (float) (1f * (zoom > 1 ? 1 : zoom)); if (gridType == GridType.CROSSHAIR) { - g2d.setStroke(new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10f, new float[] { + g2d.setStroke(new BasicStroke(gridThickness, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10f, new float[] { (float) zoomStep / 2, (float) zoomStep / 2}, (float) zoomStep / 4)); } else if (gridType == GridType.DOT) { - g2d.setStroke(new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10f, new float[] {1f, + g2d.setStroke(new BasicStroke(gridThickness, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10f, new float[] {1f, (float) zoomStep - 1}, 0f)); + } else { + g2d.setStroke(ObjectCache.getInstance().fetchZoomableStroke(gridThickness)); } g2dWrapper.setColor(theme.getGridColor()); for (double i = zoomStep; i < d.width; i += zoomStep) { - g2dWrapper.drawLine((int) i, 0, (int) i, d.height - 1); + g2dWrapper.draw(new Line2D.Double(i, 0, i, d.height - 1)); } for (double j = zoomStep; j < d.height; j += zoomStep) { - g2dWrapper.drawLine(0, (int) j, d.width - 1, (int) j); + g2dWrapper.draw(new Line2D.Double(0, j, d.width - 1, j)); } } diff --git a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java index 47671fea..9c58b497 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java +++ b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java @@ -436,7 +436,7 @@ public class Presenter implements IPlugInPort { } @Override - public void draw(Graphics2D g2d, Set drawOptions, final IComponentFiler filter) { + public void draw(Graphics2D g2d, Set drawOptions, final IComponentFiler filter, Double externalZoom) { if (currentProject == null) { return; } @@ -478,7 +478,10 @@ public class Presenter implements IPlugInPort { getLockedComponents(), groupedComponents, Arrays.asList(instantiationManager.getFirstControlPoint(), - instantiationManager.getPotentialControlPoint()), componentSlotToDraw, dragInProgress); + instantiationManager.getPotentialControlPoint()), + componentSlotToDraw, + dragInProgress, + externalZoom); List failedComponentNames = new ArrayList(); for (IDIYComponent component : failedComponents) { failedComponentNames.add(component.getName()); diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 71a0d159..984d913c 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/AbstractLeadedComponent.java b/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java index 76461cd4..d19430c0 100644 --- a/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java +++ b/diylc/diylc-library/src/org/diylc/components/AbstractLeadedComponent.java @@ -293,13 +293,13 @@ public abstract class AbstractLeadedComponent extends AbstractTransparentComp } private void drawLeads(Graphics2D g2d, double theta, double leadLength) { - int endX = (int) Math.round(points[0].x + Math.cos(theta) * leadLength); - int endY = (int) Math.round(points[0].y + Math.sin(theta) * leadLength); - g2d.drawLine(points[0].x, points[0].y, endX, endY); + double endX = points[0].x + Math.cos(theta) * leadLength; + double endY = points[0].y + Math.sin(theta) * leadLength; + g2d.draw(new Line2D.Double(points[0].x, points[0].y, endX, endY)); - endX = (int) Math.round(points[1].x + Math.cos(theta - Math.PI) * leadLength); - endY = (int) Math.round(points[1].y + Math.sin(theta - Math.PI) * leadLength); - g2d.drawLine(points[1].x, points[1].y, endX, endY); + endX = points[1].x + Math.cos(theta - Math.PI) * leadLength; + endY = points[1].y + Math.sin(theta - Math.PI) * leadLength; + g2d.draw(new Line2D.Double(points[1].x, points[1].y, endX, endY)); } private void drawLead(Graphics2D g2d, ComponentState componentState, IDrawingObserver observer, boolean isCopperArea) { diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index 71a0d159..984d913c 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/lib/swing-framework.jar b/diylc/diylc-swing/lib/swing-framework.jar index 33f56a18..1d90f3d0 100644 Binary files a/diylc/diylc-swing/lib/swing-framework.jar and b/diylc/diylc-swing/lib/swing-framework.jar differ diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index 95d62b4f..d6a3e14f 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/gui/TemplateDialog.java b/diylc/diylc-swing/src/org/diylc/swing/gui/TemplateDialog.java index 577261e1..da856ffb 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/gui/TemplateDialog.java +++ b/diylc/diylc-swing/src/org/diylc/swing/gui/TemplateDialog.java @@ -290,7 +290,7 @@ public class TemplateDialog extends JDialog { super.paint(g); // Graphics2D g2d = (Graphics2D) g; // AffineTransform transform = g2d.getTransform(); - presenter.draw((Graphics2D) g, EnumSet.of(DrawOption.ZOOM, DrawOption.ANTIALIASING), null); + presenter.draw((Graphics2D) g, EnumSet.of(DrawOption.ZOOM, DrawOption.ANTIALIASING), null, null); // g2d.setTransform(transform); // Rectangle rect = canvasPanel.getBounds(); // BorderFactory.createEtchedBorder().paintBorder(canvasPanel, diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java index 8ad40bf7..e5ee7d99 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java @@ -237,7 +237,7 @@ public class CanvasPanel extends JComponent implements Autoscroll { if (ConfigurationManager.getInstance().readBoolean(IPlugInPort.SHOW_GRID_KEY, true)) { drawOptions.add(DrawOption.GRID); } - plugInPort.draw(g2d, drawOptions, null); + plugInPort.draw(g2d, drawOptions, null, null); if (useHardwareAcceleration) { VolatileImage volatileImage = (VolatileImage) bufferImage; do { diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java index 0894b5c1..a91c8a53 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java @@ -318,8 +318,8 @@ public class UploadDialog extends ButtonDialog { zoomRatio = rect.getHeight() / d.getHeight(); } - g2d.scale(zoomRatio, zoomRatio); - UploadDialog.this.plugInPort.draw(g2d, EnumSet.of(DrawOption.ANTIALIASING), null); +// g2d.scale(zoomRatio, zoomRatio); + UploadDialog.this.plugInPort.draw(g2d, EnumSet.of(DrawOption.ANTIALIASING), null, zoomRatio); } public String getKeywords() { diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectDrawingProvider.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectDrawingProvider.java index ad0ae364..8959e7be 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectDrawingProvider.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectDrawingProvider.java @@ -21,15 +21,15 @@ */ package org.diylc.swing.plugins.file; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.util.EnumSet; - -import org.diylc.appframework.miscutils.ConfigurationManager; -import org.diylc.common.DrawOption; -import org.diylc.common.IPlugInPort; -import org.diylc.swingframework.IDrawingProvider; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.util.EnumSet; + +import org.diylc.appframework.miscutils.ConfigurationManager; +import org.diylc.common.DrawOption; +import org.diylc.common.IPlugInPort; +import org.diylc.swingframework.IDrawingProvider; /** * {@link IDrawingProvider} implementation that uses {@link IPlugInPort} to draw a project onto the @@ -51,12 +51,12 @@ public class ProjectDrawingProvider implements IDrawingProvider { } @Override - public Dimension getSize() { + public Dimension getSize() { return plugInPort.getCanvasDimensions(useZoom); } @Override - public void draw(int page, Graphics g) { + public void draw(int page, Graphics g, double zoomFactor) { EnumSet drawOptions = EnumSet.of(DrawOption.ANTIALIASING); if (useZoom) { drawOptions.add(DrawOption.ZOOM); @@ -67,7 +67,7 @@ public class ProjectDrawingProvider implements IDrawingProvider { if (ConfigurationManager.getInstance().readBoolean(IPlugInPort.OUTLINE_KEY, false)) { drawOptions.add(DrawOption.OUTLINE_MODE); } - plugInPort.draw((Graphics2D) g, drawOptions, null); + plugInPort.draw((Graphics2D) g, drawOptions, null, zoomFactor); } @Override diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectPreview.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectPreview.java index 5608bc0a..ad8ce808 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectPreview.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/ProjectPreview.java @@ -147,8 +147,8 @@ public class ProjectPreview extends JPanel implements PropertyChangeListener, IF // System.out.println(x + "," + y); // g2d.translate(x, y); - g2d.scale(zoomRatio, zoomRatio); - presenter.draw(g2d, EnumSet.noneOf(DrawOption.class), null); +// g2d.scale(zoomRatio, zoomRatio); + presenter.draw(g2d, EnumSet.noneOf(DrawOption.class), null, zoomRatio); g2d.setColor(Color.black); g2d.drawRect(0, 0, d.width - (int) (1 / zoomRatio), d.height - (int) (1 / zoomRatio)); diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/TraceMaskDrawingProvider.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/TraceMaskDrawingProvider.java index 6212b3d5..77436da2 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/file/TraceMaskDrawingProvider.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/file/TraceMaskDrawingProvider.java @@ -59,8 +59,8 @@ public class TraceMaskDrawingProvider implements IDrawingProvider { } @Override - public void draw(int page, Graphics g) { - plugInPort.draw((Graphics2D) g, EnumSet.of(DrawOption.ANTIALIASING), new PCBLayerFiler(getUsedLayers()[page])); + public void draw(int page, Graphics g, double zoomFactor) { + plugInPort.draw((Graphics2D) g, EnumSet.of(DrawOption.ANTIALIASING), new PCBLayerFiler(getUsedLayers()[page]), zoomFactor); } @Override diff --git a/diylc/diylc-swing/update.xml b/diylc/diylc-swing/update.xml index dd78aba6..29c26665 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -2357,7 +2357,11 @@ 2019-01-28 00:00:00.000 CET - + + + IMPROVEMENT + Better precision when exporting to PDF and PNG files + BUG_FIX "PCB Text" components are not included in trace mask exports