Aruco Spiegeln

This commit is contained in:
chk
2026-05-30 16:38:41 +02:00
parent 50baeae449
commit 36b68b240d
8 changed files with 1942 additions and 909 deletions

View File

@@ -0,0 +1,69 @@
{
"page_format": "A0",
"orientation": "portrait",
"page_size_mm": {
"width": 841.0,
"height": 1189.0
},
"seed": 223,
"num_arucos": 46,
"aruco_size_mm": 25.0,
"aruco_dictionary": "DICT_4X4_250",
"aruco_start_id": 103,
"page_border_margin_mm": 50.0,
"forbidden_rectangle_mm": {
"x": 318.5,
"y": 94.5,
"w": 204.0,
"h": 1000.0
},
"forbidden_rectangle_margin_mm": 30.0,
"placements": [
{"id": 103, "position": [536.71, 185.44, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 104, "position": [344.23, -286.54, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 105, "position": [688.69, -320.72, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 106, "position": [1006.0, 158.33, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 107, "position": [573.41, 211.86, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 108, "position": [167.8, -172.08, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 109, "position": [94.68, 208.66, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 110, "position": [486.25, 212.24, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 111, "position": [342.27, -330.59, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 112, "position": [283.72, -262.58, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 113, "position": [498.68, 168.67, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 114, "position": [602.86, -364.05, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 115, "position": [50.09, -218.11, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 116, "position": [626.21, -278.75, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 117, "position": [434.36, 283.81, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 118, "position": [-22.42, 335.83, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 119, "position": [404.7, -175.1, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 120, "position": [777.4, -236.15, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 121, "position": [-21.27, -188.23, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 122, "position": [803.39, -297.37, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 123, "position": [209.75, -363.23, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 124, "position": [523.07, 267.04, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 125, "position": [573.73, 170.64, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 126, "position": [7.61, -281.21, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 127, "position": [601.87, 300.33, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 128, "position": [749.75, -284.01, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 129, "position": [440.99, 194.32, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 130, "position": [221.73, 333.11, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 131, "position": [93.78, 144.5, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 132, "position": [-25.7, 194.58, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 133, "position": [685.21, 166.8, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 134, "position": [18.19, 191.57, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 135, "position": [823.11, -344.38, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 136, "position": [312.3, -159.11, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 137, "position": [863.59, -335.92, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 138, "position": [132.14, 169.03, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 139, "position": [219.16, 297.24, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 140, "position": [44.16, 339.22, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 141, "position": [407.49, 258.42, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 142, "position": [504.58, -312.75, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 143, "position": [362.89, 292.01, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 144, "position": [943.63, -245.76, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 145, "position": [765.87, 316.04, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 146, "position": [988.02, -369.14, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 147, "position": [643.17, 316.43, -19], "normal": [0, 0, 1], "spin": 90},
{"id": 148, "position": [723.35, 328.05, -19], "normal": [0, 0, 1], "spin": 90}
]
}

File diff suppressed because one or more lines are too long

View File

@@ -9,7 +9,7 @@
"num_arucos": 60,
"aruco_size_mm": 25.0,
"aruco_dictionary": "DICT_4X4_250",
"aruco_start_id": 103,
"aruco_start_id": 46,
"page_border_margin_mm": 50.0,
"forbidden_rectangle_mm": {
"x": 318.5,
@@ -19,845 +19,65 @@
},
"forbidden_rectangle_margin_mm": 30.0,
"placements": [
{
"id": 103,
"position": [
-536.71,
-185.44,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 104,
"position": [
-344.23,
286.54,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 105,
"position": [
-688.69,
320.72,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 106,
"position": [
-1006.0,
-158.33,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 107,
"position": [
-573.41,
-211.86,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 108,
"position": [
-167.8,
172.08,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 109,
"position": [
-94.68,
-208.66,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 110,
"position": [
-486.25,
-212.24,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 111,
"position": [
-342.27,
330.59,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 112,
"position": [
-283.72,
262.58,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 113,
"position": [
-498.68,
-168.67,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 114,
"position": [
-602.86,
364.05,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 115,
"position": [
-50.09,
218.11,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 116,
"position": [
-626.21,
278.75,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 117,
"position": [
-434.36,
-283.81,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 118,
"position": [
22.42,
-335.83,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 119,
"position": [
-404.7,
175.1,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 120,
"position": [
-777.4,
236.15,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 121,
"position": [
21.27,
188.23,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 122,
"position": [
-803.39,
297.37,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 123,
"position": [
-209.75,
363.23,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 124,
"position": [
-523.07,
-267.04,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 125,
"position": [
-573.73,
-170.64,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 126,
"position": [
-7.61,
281.21,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 127,
"position": [
-601.87,
-300.33,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 128,
"position": [
-749.75,
284.01,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 129,
"position": [
-440.99,
-194.32,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 130,
"position": [
-221.73,
-333.11,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 131,
"position": [
-93.78,
-144.5,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 132,
"position": [
25.7,
-194.58,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 133,
"position": [
-685.21,
-166.8,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 134,
"position": [
-18.19,
-191.57,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 135,
"position": [
-823.11,
344.38,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 136,
"position": [
-312.3,
159.11,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 137,
"position": [
-863.59,
335.92,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 138,
"position": [
-132.14,
-169.03,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 139,
"position": [
-219.16,
-297.24,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 140,
"position": [
-44.16,
-339.22,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 141,
"position": [
-407.49,
-258.42,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 142,
"position": [
-504.58,
312.75,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 143,
"position": [
-362.89,
-292.01,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 144,
"position": [
-943.63,
245.76,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 145,
"position": [
-765.87,
-316.04,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 146,
"position": [
-988.02,
369.14,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 147,
"position": [
-643.17,
-316.43,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 148,
"position": [
-723.35,
-328.05,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 149,
"position": [
-645.09,
184.84,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 150,
"position": [
-934.88,
-143.6,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 151,
"position": [
-875.7,
-173.65,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 152,
"position": [
-186.04,
274.07,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 153,
"position": [
-369.77,
186.49,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 154,
"position": [
-304.35,
359.67,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 155,
"position": [
-575.27,
-315.06,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 156,
"position": [
-959.16,
321.55,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 157,
"position": [
-803.25,
-172.36,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 158,
"position": [
-117.7,
-298.66,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 159,
"position": [
-649.69,
223.0,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 160,
"position": [
-105.71,
187.71,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 161,
"position": [
-826.71,
-239.16,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
},
{
"id": 162,
"position": [
-524.84,
266.25,
-19
],
"normal": [
0,
0,
1
],
"spin": 90
}
{"id": 46, "position": [536.71, 185.44, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 47, "position": [344.23, -286.54, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 48, "position": [688.69, -320.72, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 49, "position": [1006.0, 158.33, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 50, "position": [573.41, 211.86, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 51, "position": [167.8, -172.08, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 52, "position": [94.68, 208.66, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 53, "position": [486.25, 212.24, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 54, "position": [342.27, -330.59, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 55, "position": [283.72, -262.58, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 56, "position": [498.68, 168.67, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 57, "position": [602.86, -364.05, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 58, "position": [50.09, -218.11, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 59, "position": [626.21, -278.75, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 60, "position": [434.36, 283.81, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 61, "position": [-22.42, 335.83, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 62, "position": [404.7, -175.1, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 63, "position": [777.4, -236.15, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 64, "position": [-21.27, -188.23, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 65, "position": [803.39, -297.37, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 66, "position": [209.75, -363.23, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 67, "position": [523.07, 267.04, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 68, "position": [573.73, 170.64, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 69, "position": [7.61, -281.21, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 70, "position": [601.87, 300.33, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 71, "position": [749.75, -284.01, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 72, "position": [440.99, 194.32, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 73, "position": [221.73, 333.11, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 74, "position": [93.78, 144.5, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 75, "position": [-25.7, 194.58, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 76, "position": [685.21, 166.8, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 77, "position": [18.19, 191.57, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 78, "position": [823.11, -344.38, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 79, "position": [312.3, -159.11, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 80, "position": [863.59, -335.92, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 81, "position": [132.14, 169.03, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 82, "position": [219.16, 297.24, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 83, "position": [44.16, 339.22, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 84, "position": [407.49, 258.42, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 85, "position": [504.58, -312.75, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 86, "position": [362.89, 292.01, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 87, "position": [943.63, -245.76, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 88, "position": [765.87, 316.04, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 89, "position": [988.02, -369.14, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 90, "position": [643.17, 316.43, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 91, "position": [723.35, 328.05, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 92, "position": [645.09, -184.84, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 93, "position": [934.88, 143.6, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 94, "position": [875.7, 173.65, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 95, "position": [186.04, -274.07, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 96, "position": [369.77, -186.49, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 97, "position": [304.35, -359.67, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 98, "position": [575.27, 315.06, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 99, "position": [959.16, -321.55, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 100, "position": [803.25, 172.36, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 101, "position": [117.7, 298.66, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 102, "position": [649.69, -223.0, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 103, "position": [105.71, -187.71, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 104, "position": [826.71, 239.16, -27.3], "normal": [0, 0, 1], "spin": 90},
{"id": 105, "position": [524.84, -266.25, -27.3], "normal": [0, 0, 1], "spin": 90}
]
}
}

File diff suppressed because one or more lines are too long

View File

@@ -9,6 +9,7 @@ from typing import List, Tuple
from reportlab.pdfgen import canvas
from reportlab.lib.units import mm
from reportlab.pdfbase import pdfmetrics
try:
import cv2
@@ -27,7 +28,7 @@ ORIENTATION = "portrait" # "portrait" oder "landscape"
NUM_ARUCOS = 60
ARUCO_SIZE_MM = 25.0
ARUCO_START_ID = 103 # erster Marker aus DICT_4X4_250
ARUCO_START_ID = 46 # erster Marker aus DICT_4X4_250
SEED = 223 # Zufalls-Seed für reproduzierbare Verteilung
PAGE_BORDER_MARGIN_MM = 50.0 # Abstand aller Marker vom Seitenrand
@@ -37,6 +38,9 @@ FORBIDDEN_RECT_H_MM = 1000.0
FORBIDDEN_RECT_MARGIN_MM = 30.0 # keine ArUcos innerhalb dieses Abstands
LINE_WIDTH_MM = 1.0 # Linienstärke des Rechtecks
TEXT_FONT = "Times-Roman"
TEXT_SIZE_PT = 8
TEXT_GAP_MM = 4.0
OUTPUT_BASENAME = f"A0_{NUM_ARUCOS}Arucos_{int(ARUCO_SIZE_MM)}mm_Seet{SEED}"
@@ -151,7 +155,8 @@ def draw_aruco_vector(
for col in range(modules):
if pattern[r][col] == 1:
cell_x_mm = x_mm + col * cell_mm
cell_y_mm = y_mm + (modules - 1 - r) * cell_mm
#cell_y_mm = y_mm + (modules - 1 - r) * cell_mm
cell_y_mm = y_mm + r * cell_mm
c.rect(
mm_to_pt(cell_x_mm),
mm_to_pt(page_h_mm - cell_y_mm - cell_mm),
@@ -162,6 +167,24 @@ def draw_aruco_vector(
)
def draw_aruco_label(
c: canvas.Canvas,
x_mm: float,
y_mm: float,
size_mm: float,
page_h_mm: float,
marker_id: int,
) -> None:
c.setFont(TEXT_FONT, TEXT_SIZE_PT)
text = str(marker_id)
text_width_pt = pdfmetrics.stringWidth(text, TEXT_FONT, TEXT_SIZE_PT)
text_x_pt = mm_to_pt(x_mm + size_mm / 2.0) - text_width_pt / 2.0
font = pdfmetrics.getFont(TEXT_FONT)
ascent_mm = (font.face.ascent / 1000.0) * TEXT_SIZE_PT * 0.352777777777778
text_baseline_y_mm = y_mm + size_mm + TEXT_GAP_MM + ascent_mm
c.drawString(text_x_pt, mm_to_pt(page_h_mm - text_baseline_y_mm), text)
def place_markers(
page_w_mm: float,
page_h_mm: float,
@@ -295,27 +318,27 @@ def main() -> None:
mm_to_pt(page_h_mm - (origin_y_mm + ARROW_LEN_MM - 4)),
)
# Y-Achse (grün, nach links)
# Y-Achse (grün, nach rechts)
c.setStrokeColorRGB(0, 0.7, 0)
c.line(
mm_to_pt(origin_x_mm),
mm_to_pt(page_h_mm - origin_y_mm),
mm_to_pt(origin_x_mm - ARROW_LEN_MM),
mm_to_pt(origin_x_mm + ARROW_LEN_MM),
mm_to_pt(page_h_mm - origin_y_mm),
)
# Pfeilspitze
c.line(
mm_to_pt(origin_x_mm - ARROW_LEN_MM),
mm_to_pt(origin_x_mm + ARROW_LEN_MM),
mm_to_pt(page_h_mm - origin_y_mm),
mm_to_pt(origin_x_mm - ARROW_LEN_MM + 4),
mm_to_pt(origin_x_mm + ARROW_LEN_MM - 4),
mm_to_pt(page_h_mm - origin_y_mm - 4),
)
c.line(
mm_to_pt(origin_x_mm - ARROW_LEN_MM),
mm_to_pt(origin_x_mm + ARROW_LEN_MM),
mm_to_pt(page_h_mm - origin_y_mm),
mm_to_pt(origin_x_mm - ARROW_LEN_MM + 4),
mm_to_pt(origin_x_mm + ARROW_LEN_MM - 4),
mm_to_pt(page_h_mm - origin_y_mm + 4),
)
@@ -332,39 +355,59 @@ def main() -> None:
marker_id=item["id"],
page_h_mm=page_h_mm,
)
draw_aruco_label(
c=c,
x_mm=item["x_mm"],
y_mm=item["y_mm"],
size_mm=item["size_mm"],
page_h_mm=page_h_mm,
marker_id=item["id"],
)
c.showPage()
c.save()
# JSON mit Positionen
with json_path.open("w", encoding="utf-8") as f:
json.dump(
{
"page_format": PAGE_FORMAT,
"orientation": ORIENTATION,
"page_size_mm": {"width": page_w_mm, "height": page_h_mm},
"seed": SEED,
"num_arucos": NUM_ARUCOS,
"aruco_size_mm": ARUCO_SIZE_MM,
"aruco_dictionary": "DICT_4X4_250",
"aruco_start_id": ARUCO_START_ID,
"page_border_margin_mm": PAGE_BORDER_MARGIN_MM,
"forbidden_rectangle_mm": {
"x": round(forbidden_rect.x, 2),
"y": round(forbidden_rect.y, 2),
"w": forbidden_rect.w,
"h": forbidden_rect.h,
},
"forbidden_rectangle_margin_mm": FORBIDDEN_RECT_MARGIN_MM,
"placements": [
{"id": p["id"],"position": [-1*round((p["y_mm"] + ARUCO_SIZE_MM / 2) - origin_y_mm, 2), round(origin_x_mm - (p["x_mm"] + ARUCO_SIZE_MM / 2), 2),-19],"normal": [0, 0, 1],"spin": 90}
for p in placements
],
meta = {
"page_format": PAGE_FORMAT,
"orientation": ORIENTATION,
"page_size_mm": {"width": page_w_mm, "height": page_h_mm},
"seed": SEED,
"num_arucos": NUM_ARUCOS,
"aruco_size_mm": ARUCO_SIZE_MM,
"aruco_dictionary": "DICT_4X4_250",
"aruco_start_id": ARUCO_START_ID,
"page_border_margin_mm": PAGE_BORDER_MARGIN_MM,
"forbidden_rectangle_mm": {
"x": round(forbidden_rect.x, 2),
"y": round(forbidden_rect.y, 2),
"w": forbidden_rect.w,
"h": forbidden_rect.h,
},
f,
indent=2,
ensure_ascii=False,
)
"forbidden_rectangle_margin_mm": FORBIDDEN_RECT_MARGIN_MM,
}
f.write(json.dumps(meta, indent=2, ensure_ascii=False)[:-2])
f.write(',\n "placements": [\n')
for index, p in enumerate(placements):
item = {
"id": p["id"],
"position": [
round((p["y_mm"] + ARUCO_SIZE_MM / 2) - origin_y_mm, 2),
-1*round(origin_x_mm - (p["x_mm"] + ARUCO_SIZE_MM / 2), 2),
-27.3,
],
"normal": [0, 0, 1],
"spin": 90,
}
line = json.dumps(item, ensure_ascii=False)
if index < len(placements) - 1:
line += ","
f.write(f" {line}\n")
f.write(" ]\n}\n")
print(f"PDF geschrieben: {pdf_path.resolve()}")
print(f"JSON geschrieben: {json_path.resolve()}")