improve precision of exported files

This commit is contained in:
Branislav Stojkovic
2019-01-31 13:43:18 +01:00
parent 1b8a72d24a
commit 53eb70e693
15 changed files with 52 additions and 36 deletions
@@ -175,8 +175,9 @@ public interface IPlugInPort extends ISelectionProcessor, IMouseProcessor, IKeyP
* @param g2d * @param g2d
* @param drawOptions specific drawing options * @param drawOptions specific drawing options
* @param filter * @param filter
* @param externalZoom
*/ */
void draw(Graphics2D g2d, Set<DrawOption> drawOptions, IComponentFiler filter); void draw(Graphics2D g2d, Set<DrawOption> drawOptions, IComponentFiler filter, Double externalZoom);
Double[] getAvailableZoomLevels(); Double[] getAvailableZoomLevels();
@@ -27,6 +27,7 @@ import java.awt.Point;
import java.awt.Rectangle; import java.awt.Rectangle;
import java.awt.RenderingHints; import java.awt.RenderingHints;
import java.awt.geom.Area; import java.awt.geom.Area;
import java.awt.geom.Line2D;
import java.awt.geom.Path2D; import java.awt.geom.Path2D;
import java.awt.geom.PathIterator; import java.awt.geom.PathIterator;
import java.util.ArrayList; import java.util.ArrayList;
@@ -122,12 +123,13 @@ public class DrawingManager {
* @param controlPointSlot * @param controlPointSlot
* @param componentSlot * @param componentSlot
* @param dragInProgress * @param dragInProgress
* @param externalZoom
* @return * @return
*/ */
public List<IDIYComponent<?>> drawProject(Graphics2D g2d, Project project, Set<DrawOption> drawOptions, public List<IDIYComponent<?>> drawProject(Graphics2D g2d, Project project, Set<DrawOption> drawOptions,
IComponentFiler filter, Rectangle selectionRect, Collection<IDIYComponent<?>> selectedComponents, IComponentFiler filter, Rectangle selectionRect, Collection<IDIYComponent<?>> selectedComponents,
Set<IDIYComponent<?>> lockedComponents, Set<IDIYComponent<?>> groupedComponents, List<Point> controlPointSlot, Set<IDIYComponent<?>> lockedComponents, Set<IDIYComponent<?>> groupedComponents, List<Point> controlPointSlot,
List<IDIYComponent<?>> componentSlot, boolean dragInProgress) { List<IDIYComponent<?>> componentSlot, boolean dragInProgress, Double externalZoom) {
failedComponents.clear(); failedComponents.clear();
if (project == null) { if (project == null) {
return failedComponents; return failedComponents;
@@ -140,6 +142,9 @@ public class DrawingManager {
zoom = 1 / Constants.PIXEL_SIZE; zoom = 1 / Constants.PIXEL_SIZE;
} }
if (externalZoom != null)
zoom *= externalZoom;
G2DWrapper g2dWrapper = new G2DWrapper(g2d, zoom); G2DWrapper g2dWrapper = new G2DWrapper(g2d, zoom);
if (drawOptions.contains(DrawOption.ANTIALIASING)) { if (drawOptions.contains(DrawOption.ANTIALIASING)) {
@@ -175,20 +180,23 @@ public class DrawingManager {
GridType gridType = GridType.LINES; GridType gridType = GridType.LINES;
if (drawOptions.contains(DrawOption.GRID) && gridType != GridType.NONE) { if (drawOptions.contains(DrawOption.GRID) && gridType != GridType.NONE) {
double zoomStep = project.getGridSpacing().convertToPixels() * zoom; double zoomStep = project.getGridSpacing().convertToPixels() * zoom;
float gridThickness = (float) (1f * (zoom > 1 ? 1 : zoom));
if (gridType == GridType.CROSSHAIR) { 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)); (float) zoomStep / 2, (float) zoomStep / 2}, (float) zoomStep / 4));
} else if (gridType == GridType.DOT) { } 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)); (float) zoomStep - 1}, 0f));
} else {
g2d.setStroke(ObjectCache.getInstance().fetchZoomableStroke(gridThickness));
} }
g2dWrapper.setColor(theme.getGridColor()); g2dWrapper.setColor(theme.getGridColor());
for (double i = zoomStep; i < d.width; i += zoomStep) { 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) { 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));
} }
} }
@@ -436,7 +436,7 @@ public class Presenter implements IPlugInPort {
} }
@Override @Override
public void draw(Graphics2D g2d, Set<DrawOption> drawOptions, final IComponentFiler filter) { public void draw(Graphics2D g2d, Set<DrawOption> drawOptions, final IComponentFiler filter, Double externalZoom) {
if (currentProject == null) { if (currentProject == null) {
return; return;
} }
@@ -478,7 +478,10 @@ public class Presenter implements IPlugInPort {
getLockedComponents(), getLockedComponents(),
groupedComponents, groupedComponents,
Arrays.asList(instantiationManager.getFirstControlPoint(), Arrays.asList(instantiationManager.getFirstControlPoint(),
instantiationManager.getPotentialControlPoint()), componentSlotToDraw, dragInProgress); instantiationManager.getPotentialControlPoint()),
componentSlotToDraw,
dragInProgress,
externalZoom);
List<String> failedComponentNames = new ArrayList<String>(); List<String> failedComponentNames = new ArrayList<String>();
for (IDIYComponent<?> component : failedComponents) { for (IDIYComponent<?> component : failedComponents) {
failedComponentNames.add(component.getName()); failedComponentNames.add(component.getName());
Binary file not shown.
@@ -293,13 +293,13 @@ public abstract class AbstractLeadedComponent<T> extends AbstractTransparentComp
} }
private void drawLeads(Graphics2D g2d, double theta, double leadLength) { private void drawLeads(Graphics2D g2d, double theta, double leadLength) {
int endX = (int) Math.round(points[0].x + Math.cos(theta) * leadLength); double endX = points[0].x + Math.cos(theta) * leadLength;
int endY = (int) Math.round(points[0].y + Math.sin(theta) * leadLength); double endY = points[0].y + Math.sin(theta) * leadLength;
g2d.drawLine(points[0].x, points[0].y, endX, endY); 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); endX = points[1].x + Math.cos(theta - Math.PI) * leadLength;
endY = (int) Math.round(points[1].y + Math.sin(theta - Math.PI) * leadLength); endY = points[1].y + Math.sin(theta - Math.PI) * leadLength;
g2d.drawLine(points[1].x, points[1].y, endX, endY); g2d.draw(new Line2D.Double(points[1].x, points[1].y, endX, endY));
} }
private void drawLead(Graphics2D g2d, ComponentState componentState, IDrawingObserver observer, boolean isCopperArea) { private void drawLead(Graphics2D g2d, ComponentState componentState, IDrawingObserver observer, boolean isCopperArea) {
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -290,7 +290,7 @@ public class TemplateDialog extends JDialog {
super.paint(g); super.paint(g);
// Graphics2D g2d = (Graphics2D) g; // Graphics2D g2d = (Graphics2D) g;
// AffineTransform transform = g2d.getTransform(); // 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); // g2d.setTransform(transform);
// Rectangle rect = canvasPanel.getBounds(); // Rectangle rect = canvasPanel.getBounds();
// BorderFactory.createEtchedBorder().paintBorder(canvasPanel, // BorderFactory.createEtchedBorder().paintBorder(canvasPanel,
@@ -237,7 +237,7 @@ public class CanvasPanel extends JComponent implements Autoscroll {
if (ConfigurationManager.getInstance().readBoolean(IPlugInPort.SHOW_GRID_KEY, true)) { if (ConfigurationManager.getInstance().readBoolean(IPlugInPort.SHOW_GRID_KEY, true)) {
drawOptions.add(DrawOption.GRID); drawOptions.add(DrawOption.GRID);
} }
plugInPort.draw(g2d, drawOptions, null); plugInPort.draw(g2d, drawOptions, null, null);
if (useHardwareAcceleration) { if (useHardwareAcceleration) {
VolatileImage volatileImage = (VolatileImage) bufferImage; VolatileImage volatileImage = (VolatileImage) bufferImage;
do { do {
@@ -318,8 +318,8 @@ public class UploadDialog extends ButtonDialog {
zoomRatio = rect.getHeight() / d.getHeight(); zoomRatio = rect.getHeight() / d.getHeight();
} }
g2d.scale(zoomRatio, zoomRatio); // g2d.scale(zoomRatio, zoomRatio);
UploadDialog.this.plugInPort.draw(g2d, EnumSet.of(DrawOption.ANTIALIASING), null); UploadDialog.this.plugInPort.draw(g2d, EnumSet.of(DrawOption.ANTIALIASING), null, zoomRatio);
} }
public String getKeywords() { public String getKeywords() {
@@ -56,7 +56,7 @@ public class ProjectDrawingProvider implements IDrawingProvider {
} }
@Override @Override
public void draw(int page, Graphics g) { public void draw(int page, Graphics g, double zoomFactor) {
EnumSet<DrawOption> drawOptions = EnumSet.of(DrawOption.ANTIALIASING); EnumSet<DrawOption> drawOptions = EnumSet.of(DrawOption.ANTIALIASING);
if (useZoom) { if (useZoom) {
drawOptions.add(DrawOption.ZOOM); drawOptions.add(DrawOption.ZOOM);
@@ -67,7 +67,7 @@ public class ProjectDrawingProvider implements IDrawingProvider {
if (ConfigurationManager.getInstance().readBoolean(IPlugInPort.OUTLINE_KEY, false)) { if (ConfigurationManager.getInstance().readBoolean(IPlugInPort.OUTLINE_KEY, false)) {
drawOptions.add(DrawOption.OUTLINE_MODE); drawOptions.add(DrawOption.OUTLINE_MODE);
} }
plugInPort.draw((Graphics2D) g, drawOptions, null); plugInPort.draw((Graphics2D) g, drawOptions, null, zoomFactor);
} }
@Override @Override
@@ -147,8 +147,8 @@ public class ProjectPreview extends JPanel implements PropertyChangeListener, IF
// System.out.println(x + "," + y); // System.out.println(x + "," + y);
// g2d.translate(x, y); // g2d.translate(x, y);
g2d.scale(zoomRatio, zoomRatio); // g2d.scale(zoomRatio, zoomRatio);
presenter.draw(g2d, EnumSet.noneOf(DrawOption.class), null); presenter.draw(g2d, EnumSet.noneOf(DrawOption.class), null, zoomRatio);
g2d.setColor(Color.black); g2d.setColor(Color.black);
g2d.drawRect(0, 0, d.width - (int) (1 / zoomRatio), d.height - (int) (1 / zoomRatio)); g2d.drawRect(0, 0, d.width - (int) (1 / zoomRatio), d.height - (int) (1 / zoomRatio));
@@ -59,8 +59,8 @@ public class TraceMaskDrawingProvider implements IDrawingProvider {
} }
@Override @Override
public void draw(int page, Graphics g) { public void draw(int page, Graphics g, double zoomFactor) {
plugInPort.draw((Graphics2D) g, EnumSet.of(DrawOption.ANTIALIASING), new PCBLayerFiler(getUsedLayers()[page])); plugInPort.draw((Graphics2D) g, EnumSet.of(DrawOption.ANTIALIASING), new PCBLayerFiler(getUsedLayers()[page]), zoomFactor);
} }
@Override @Override
+4
View File
@@ -2358,6 +2358,10 @@
<releaseDate>2019-01-28 00:00:00.000 CET</releaseDate> <releaseDate>2019-01-28 00:00:00.000 CET</releaseDate>
<name></name> <name></name>
<changes> <changes>
<org.diylc.appframework.update.Change>
<changeType>IMPROVEMENT</changeType>
<description>Better precision when exporting to PDF and PNG files</description>
</org.diylc.appframework.update.Change>
<org.diylc.appframework.update.Change> <org.diylc.appframework.update.Change>
<changeType>BUG_FIX</changeType> <changeType>BUG_FIX</changeType>
<description>"PCB Text" components are not included in trace mask exports</description> <description>"PCB Text" components are not included in trace mask exports</description>