Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 28 additions & 24 deletions src/main/java/com/neuronrobotics/bowlerstudio/threed/MakeRuler.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,45 +24,50 @@ public class MakeRuler {
private static HashMap<Integer, CSG> numbers = new HashMap<>();

public static Group createRuler(boolean flipNumber) {
int numCentimeters = 30;
double width = 0.15;
double height = 10;
return createRuler(flipNumber, 30); // 30 cm default length
}

public static Group createRuler(boolean flipNumber, int rulerLengthCM) {
double baseWidth = 0.15; // The width of the ruler base in mm
double tickLength = 8; // The length of a tick in mm
double tickWidth = 0.25; // The width of a tick in mm
Group ruler = new Group();

new Thread(() -> {
// Create base mesh for the ruler line
TriangleMesh baseMesh = createRectangleMesh(width, 1.0f);
TriangleMesh baseMesh = createRectangleMesh(rulerLengthCM * 10 + tickWidth, baseWidth);
MeshView baseView = new MeshView(baseMesh);
baseView.setMouseTransparent(true);
baseView.setCullFace(CullFace.NONE);
PhongMaterial phongMaterial = new PhongMaterial(Color.BLACK);

baseView.setMaterial(phongMaterial);

// Position the base line in the middle
Affine baseTransform = new Affine();
baseTransform.setTy(height / 2 - 1.0);
baseTransform.setTx(-tickWidth / 2.0);
baseTransform.setTy(-baseWidth / 2.0);
baseView.getTransforms().add(baseTransform);
BowlerKernel.runLater(() -> ruler.getChildren().add(baseView));

// Constants for spacing
double mmSpacing = width / (numCentimeters * 10.0);
double tickWidth = 0.25;
// Draw tick marks and labels
for (int i = 0; i <= numCentimeters * 10; i++) {
double x = i * mmSpacing;
for (int i = 0; i <= rulerLengthCM * 10; i++) {
TriangleMesh tickMesh;

// Determine tick type based on position
if (i % 10 == 0) {
// Centimeter marks
tickMesh = createRectangleMesh(tickWidth, height / 1.5);
if (i % 20 == 0) {
// Centimeter tick marks
tickMesh = createRectangleMesh(tickWidth, tickLength);
// Always draw a number at the end of the ruler
if ((i % 20 == 0) || (i == (int)(rulerLengthCM * 10))) {
// Add centimeter number using SVGPath
int number = i / 10;
if (numbers.get(number) == null) {
numbers.put(number, CSG.textToSize("" + i, 4, 6, 0.1).movey(height).moveToCenterX()
// Prevent double "0" at origin "(flipNumber || (i != 0))"
if ((numbers.get(number) == null) && (flipNumber || (i != 0))) {
numbers.put(number, CSG.textToSize("" + i, 4, 6, 0.1).movey(tickLength + 0.5).moveToCenterX()
.setColor(Color.BLACK));
}
CSG movey = flipNumber?numbers.get(number).roty(180): numbers.get(number);
CSG movey = flipNumber ? numbers.get(number).roty(180) : numbers.get(number);
int index=i;
BowlerKernel.runLater(() -> {
MeshView numberGroup = movey.newMesh();
Expand All @@ -75,11 +80,11 @@ public static Group createRuler(boolean flipNumber) {
});
}
} else if (i % 5 == 0) {
// 5mm marks
tickMesh = createRectangleMesh(tickWidth, height / 2.5);
// 5mm tick marks
tickMesh = createRectangleMesh(tickWidth, tickLength / 2);
} else {
// 1mm marks
tickMesh = createRectangleMesh(tickWidth, height / 4);
// 1mm tick marks
tickMesh = createRectangleMesh(tickWidth, tickLength / 4);
}

// Create and position tick mark
Expand All @@ -91,7 +96,6 @@ public static Group createRuler(boolean flipNumber) {
// com.neuronrobotics.sdk.common.Log.error("Tick for " + i);
Affine tickTransform = new Affine();
tickTransform.setTx(i - tickWidth / 2);
// tickTransform.setTy((height - tickView.getBoundsInLocal().getHeight()) / 2);
tickView.getTransforms().add(tickTransform);
tickView.setCullFace(CullFace.NONE);
BowlerKernel.runLater(() -> ruler.getChildren().add(tickView));
Expand All @@ -100,11 +104,11 @@ public static Group createRuler(boolean flipNumber) {
return ruler;
}

private static TriangleMesh createRectangleMesh(double width, double height) {
private static TriangleMesh createRectangleMesh(double width, double tickLength) {
float[] points = { 0, 0, 0, // point 0
(float) width, 0, 0, // point 1
(float) width, (float) height, 0, // point 2
0, (float) height, 0 // point 3
(float) width, (float) tickLength, 0, // point 2
0, (float) tickLength, 0 // point 3
};

float[] texCoords = { 0, 0, 1, 0, 1, 1, 0, 1 };
Expand Down