diff --git a/diylc/diylc-core/src/main/resources/update.xml b/diylc/diylc-core/src/main/resources/update.xml
index 41eaa9f1..af36f18a 100644
--- a/diylc/diylc-core/src/main/resources/update.xml
+++ b/diylc/diylc-core/src/main/resources/update.xml
@@ -425,6 +425,10 @@
2025-12-21 00:00:00.000 CET
+
+ NEW_FEATURE
+ Added 'Ending Style' property to 'Copper Trace' and 'Curved Trace' to allow choosing round or flat style
+
IMPROVEMENT
Added configuration for text scale factor in rare cases when system scale factor is not applied correctly; requires adding a configuration property to confix.xml with key 'fontScaleFactor' and a desired float value
diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/AbstractLeadedComponent.java b/diylc/diylc-library/src/main/java/org/diylc/components/AbstractLeadedComponent.java
index 2994619a..7d23c65c 100644
--- a/diylc/diylc-library/src/main/java/org/diylc/components/AbstractLeadedComponent.java
+++ b/diylc/diylc-library/src/main/java/org/diylc/components/AbstractLeadedComponent.java
@@ -43,7 +43,6 @@ import org.diylc.common.IPlugInPort;
import org.diylc.common.LineStyle;
import org.diylc.common.ObjectCache;
import org.diylc.common.VerticalAlignment;
-import org.diylc.components.AbstractLabeledComponent;
import org.diylc.core.ComponentState;
import org.diylc.core.IDrawingObserver;
import org.diylc.core.Project;
@@ -434,7 +433,7 @@ public abstract class AbstractLeadedComponent extends AbstractLabeledComponen
Stroke stroke = null;
switch (getStyle()) {
case SOLID:
- stroke = ObjectCache.getInstance().fetchBasicStroke(thickness);
+ stroke = ObjectCache.getInstance().fetchStroke(thickness, getEndingStyle() == LineEndingStyle.Round ? BasicStroke.CAP_ROUND : BasicStroke.CAP_BUTT);
break;
case DASHED:
stroke =
@@ -747,6 +746,10 @@ public abstract class AbstractLeadedComponent extends AbstractLabeledComponen
hideShortLeads = false;
return hideShortLeads;
}
+
+ protected LineEndingStyle getEndingStyle() {
+ return LineEndingStyle.Round;
+ }
public void setHideShortLeads(Boolean hideShortLeads) {
this.hideShortLeads = hideShortLeads;
diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/LineEndingStyle.java b/diylc/diylc-library/src/main/java/org/diylc/components/LineEndingStyle.java
new file mode 100644
index 00000000..786ee9f9
--- /dev/null
+++ b/diylc/diylc-library/src/main/java/org/diylc/components/LineEndingStyle.java
@@ -0,0 +1,5 @@
+package org.diylc.components;
+
+public enum LineEndingStyle {
+ Round, Flat
+}
diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/connectivity/CopperTrace.java b/diylc/diylc-library/src/main/java/org/diylc/components/connectivity/CopperTrace.java
index 9dd83877..a012649f 100644
--- a/diylc/diylc-library/src/main/java/org/diylc/components/connectivity/CopperTrace.java
+++ b/diylc/diylc-library/src/main/java/org/diylc/components/connectivity/CopperTrace.java
@@ -28,6 +28,7 @@ import com.bancika.gerberwriter.GerberFunctions;
import org.diylc.common.ObjectCache;
import org.diylc.common.PCBLayer;
import org.diylc.components.AbstractLeadedComponent;
+import org.diylc.components.LineEndingStyle;
import org.diylc.components.transform.SimpleComponentTransformer;
import org.diylc.core.ComponentState;
import org.diylc.core.CreationMethod;
@@ -58,6 +59,7 @@ public class CopperTrace extends AbstractLeadedComponent implements ILayer
private Size thickness = THICKNESS;
private PCBLayer layer = PCBLayer._1;
+ private LineEndingStyle endingStyle = LineEndingStyle.Round;
public CopperTrace() {
super();
@@ -202,6 +204,16 @@ public class CopperTrace extends AbstractLeadedComponent implements ILayer
return false;
}
+ @EditableProperty(name = "Ending Style")
+ @Override
+ public LineEndingStyle getEndingStyle() {
+ return endingStyle;
+ }
+
+ public void setEndingStyle(LineEndingStyle endingStyle) {
+ this.endingStyle = endingStyle;
+ }
+
@Override
public Set getGerberRenderModes() {
return EnumSet.of(GerberRenderMode.Normal);
diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/connectivity/CurvedTrace.java b/diylc/diylc-library/src/main/java/org/diylc/components/connectivity/CurvedTrace.java
index 91c3f39e..94221597 100644
--- a/diylc/diylc-library/src/main/java/org/diylc/components/connectivity/CurvedTrace.java
+++ b/diylc/diylc-library/src/main/java/org/diylc/components/connectivity/CurvedTrace.java
@@ -17,8 +17,7 @@
*/
package org.diylc.components.connectivity;
-import java.awt.Color;
-import java.awt.Graphics2D;
+import java.awt.*;
import java.awt.geom.Path2D;
import java.util.EnumSet;
import java.util.Set;
@@ -29,6 +28,8 @@ import org.diylc.common.LineStyle;
import org.diylc.common.ObjectCache;
import org.diylc.common.PCBLayer;
import org.diylc.components.AbstractCurvedComponent;
+import org.diylc.components.AbstractLeadedComponent;
+import org.diylc.components.LineEndingStyle;
import org.diylc.components.transform.SimpleComponentTransformer;
import org.diylc.core.ComponentState;
import org.diylc.core.IDIYComponent;
@@ -58,6 +59,7 @@ public class CurvedTrace extends AbstractCurvedComponent implements ILayer
protected Size size = SIZE;
private PCBLayer layer = PCBLayer._1;
+ private LineEndingStyle endingStyle = LineEndingStyle.Round;
@Override
protected Color getDefaultColor() {
@@ -67,7 +69,7 @@ public class CurvedTrace extends AbstractCurvedComponent implements ILayer
@Override
protected void drawCurve(Path2D curve, Graphics2D g2d, ComponentState componentState, IDrawingObserver drawingObserver) {
float thickness = (float) size.convertToPixels();
- g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(thickness));
+ g2d.setStroke(ObjectCache.getInstance().fetchStroke(thickness, getEndingStyle() == LineEndingStyle.Round ? BasicStroke.CAP_ROUND : BasicStroke.CAP_BUTT));
Color curveColor =
componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
: color;
@@ -97,6 +99,15 @@ public class CurvedTrace extends AbstractCurvedComponent implements ILayer
public void setLayer(PCBLayer layer) {
this.layer = layer;
}
+
+ @EditableProperty(name = "Ending Style")
+ public LineEndingStyle getEndingStyle() {
+ return endingStyle;
+ }
+
+ public void setEndingStyle(LineEndingStyle endingStyle) {
+ this.endingStyle = endingStyle;
+ }
@Override
public int getLayerId() {