From 50baeae449654779bf34f75b25ded1061704c6d5 Mon Sep 17 00:00:00 2001 From: chk <79915315+ChKendel@users.noreply.github.com> Date: Sat, 30 May 2026 15:47:58 +0200 Subject: [PATCH] Marker Gerierer --- .../A0_20Arucos_25mm_Seet103.json | 303 ++++++ .../A0_20Arucos_25mm_Seet103.pdf | 68 ++ .../A0_20Arucos_25mm_Seet123.json | 143 +++ .../A0_20Arucos_25mm_Seet123.pdf | 68 ++ .../A0_40Arucos_25mm_Seet103.json | 583 ++++++++++++ .../A0_40Arucos_25mm_Seet103.pdf | 68 ++ .../A0_60Arucos_25mm_Seet223.json | 863 ++++++++++++++++++ .../A0_60Arucos_25mm_Seet223.pdf | 68 ++ setup/generateTabletopPDF/a0_aruco.py | 374 ++++++++ 9 files changed, 2538 insertions(+) create mode 100644 setup/generateTabletopPDF/A0_20Arucos_25mm_Seet103.json create mode 100644 setup/generateTabletopPDF/A0_20Arucos_25mm_Seet103.pdf create mode 100644 setup/generateTabletopPDF/A0_20Arucos_25mm_Seet123.json create mode 100644 setup/generateTabletopPDF/A0_20Arucos_25mm_Seet123.pdf create mode 100644 setup/generateTabletopPDF/A0_40Arucos_25mm_Seet103.json create mode 100644 setup/generateTabletopPDF/A0_40Arucos_25mm_Seet103.pdf create mode 100644 setup/generateTabletopPDF/A0_60Arucos_25mm_Seet223.json create mode 100644 setup/generateTabletopPDF/A0_60Arucos_25mm_Seet223.pdf create mode 100644 setup/generateTabletopPDF/a0_aruco.py diff --git a/setup/generateTabletopPDF/A0_20Arucos_25mm_Seet103.json b/setup/generateTabletopPDF/A0_20Arucos_25mm_Seet103.json new file mode 100644 index 0000000..184ce54 --- /dev/null +++ b/setup/generateTabletopPDF/A0_20Arucos_25mm_Seet103.json @@ -0,0 +1,303 @@ +{ + "page_format": "A0", + "orientation": "portrait", + "page_size_mm": { + "width": 841.0, + "height": 1189.0 + }, + "seed": 103, + "num_arucos": 20, + "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": [ + -453.5, + -331.0, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 104, + "position": [ + -749.92, + -144.69, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 105, + "position": [ + -51.03, + 216.13, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 106, + "position": [ + -94.29, + -254.46, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 107, + "position": [ + -204.73, + 311.12, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 108, + "position": [ + 5.69, + -222.91, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 109, + "position": [ + -82.1, + 208.77, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 110, + "position": [ + -524.92, + 278.61, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 111, + "position": [ + -403.65, + 238.66, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 112, + "position": [ + -360.75, + 191.8, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 113, + "position": [ + -267.34, + 190.31, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 114, + "position": [ + -1017.49, + 215.5, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 115, + "position": [ + -919.81, + -264.8, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 116, + "position": [ + -480.39, + 157.71, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 117, + "position": [ + -415.03, + 265.79, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 118, + "position": [ + -70.87, + -288.32, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 119, + "position": [ + -712.35, + -212.06, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 120, + "position": [ + -484.2, + 305.52, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 121, + "position": [ + -1018.02, + -343.04, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 122, + "position": [ + -278.45, + -137.41, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + } + ] +} \ No newline at end of file diff --git a/setup/generateTabletopPDF/A0_20Arucos_25mm_Seet103.pdf b/setup/generateTabletopPDF/A0_20Arucos_25mm_Seet103.pdf new file mode 100644 index 0000000..621a433 --- /dev/null +++ b/setup/generateTabletopPDF/A0_20Arucos_25mm_Seet103.pdf @@ -0,0 +1,68 @@ +%PDF-1.3 +%東京 ReportLab Generated PDF document http://www.reportlab.com +1 0 obj +<< +/F1 2 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/Contents 7 0 R /MediaBox [ 0 0 2383.937 3370.394 ] /Parent 6 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +4 0 obj +<< +/PageMode /UseNone /Pages 6 0 R /Type /Catalog +>> +endobj +5 0 obj +<< +/Author (OpenAI) /CreationDate (D:20260530154201+02'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20260530154201+02'00') /Producer (ReportLab PDF Library - www.reportlab.com) + /Subject (A0 poster with random ArUco placement) /Title (A0_20Arucos_25mm_Seet103) /Trapped /False +>> +endobj +6 0 obj +<< +/Count 1 /Kids [ 3 0 R ] /Type /Pages +>> +endobj +7 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3859 +>> +stream +Gasba]ok34&OlYDMRG6m;ZCco!$!QbhLK!RfJV7=oh!\u1'OrHhUmXDhOZNlRn$I)WERh&T;_e2oC'Hor;$9La632HP)lEbO.SU66M^QSbNFpN^@X#UkLY34rUQU1NuVd"T:C6:H'Zd[s7lNa](uN@A`L;OL6QV5&QXG$L,M"!D;]Zd!HXPKsQXMJLoFU'@1(^Nu+BZgk?f4;75qN/S>(jA5+os%b3C0<]-t(PN!Ma6,U!fYJZ[HEt]qjnXjMm'`G%0Xe<'lneZ+9+!FE23^6,sQEXY]T!*4n)X*42ISeLnc-G.!rTPrnl/`h5Bp_sReVr:HNq@0d&(ME6M\kFM_>_F.]!DtKYU>BMoFTi&9\_a@ZPPUeX>US\i;\#oeNm0GG[8(@:*IuQT*31;\S@_PnBs[VHIBA:1:gmK!jG]fH$;D/T0,3pjL-HE=(4U'!1aE_-4#Sm+)0a*/C]JRgqMkkX+MldEF%o;EBNo'N,s>5t_Nh9a\![N"IMGF^60tKt;i7CThnC`X`6?FU+:V$(,iCQurk*2%N]/mF?,&O4Qk*QBtu20>Vs@>pIJ$*p&t0Zdooqla:0PCW!7*Q?/Gb[LPK9_lVIE=g&:@?5mLi[\A6pEgIbtFUsj^&"%JMQurq$Q*HYK.4l]',e:$oAUPD\FDajYCPc.#a0$_T%Y>D,Q9.,5;X@R'kTEF$k$cgPdqrrKGT^,[5d9C%@*JeiRKnH#*[J0JnoZs$[5%$nbHO&]_cgBo1]"fmoXk==qgr7Y2M/?j#hEb6H3N;'9`h`0(q$Rb[B)g#JGhN!pTOd9I7CHlB*;uc#hCgt[d":a\^CG)Ek_gGs3ETo>s*>a)-6FmZ#4^rX:dQkkLcVTICR;$9kg"(o6-1$ck@B&,+Ph#h1\N7nA,HJUc9gm/^G=$Y8^!hq:JU@&#UXoP.qqt.MNor7p-f3)@YDmKS9HYBg,Cmhl)kT&>FkM1]"HOb&>6*]idmBN56=e'iSXF%aaHbc_0^oVmuXF&<>6&jJ6T6nATHbc_0^oVmuXF%aaH`/0"\]uJ62U$JaR.\+Zot3FOHa0Q!_lRLdXCom_o%NP-A\bDE`N8sUX<0NkFUsR>1[GZZcdu/Vlgfd)[+o*%J/996+#r!C0PC3&"%JMQurq,FUsQs4Q(D=6dt#hG/NMl%AI/H7(k:-*d,;"]e!Flkq@&4Mck6(fcr+efCM`Dp\h0`?H=0*E4_E%@Li(B0>fRWX>qM-4)bJVNZ?9S#GsET^7;&?Vd>%[c<:Qr4[Quh]nA#TYsTl>.<4_(!BB8aY[)@D/;7OD%r&_g3cbh!FUsj^&"%JMO?G_aG25O:WVZ;*g7pRMH="Z6H#^Hf=,4V@^No&AL0:\hZ:A6VY34?oWnq[bH!\^@?Hi7c#2,b0gof8+6WQt6.>cZ2=g&:@?5mMTR"Xhb!OD#lA/fZ>p]`WYe[]kEY+7K_D0dYWYu@T#*@h>JVPZ`"UsM4jJ"A:0AShH/BXN$,EJG^o.RTA\A.em\[=AqZA-_<FUD?ja:.DCU^cVV5DQaIaBeaCCZ_!3iI-1;I>6O83$.e)K)0Xf0CXqU(,iW:aNuEVX?6`S$5d7*dZa(WtPZFCqU)c?<33*Mu]l@j=cSP&)gN@2Vd>;>Q#UN6#:$ZN#Pdk>7L+]0Ok712g_eonl]/;;/eppoP^biY\$pBQco8H]gAh=)5m#EdmlkjE>s4\1q]Ak[5mKnX(4b6bb^bkq'W&d\tof4n'JRVsq'`2VffNfEGln2!;PnDF;q6r28h5)jm/ra;s*[Y"Zbp:CQ]2%Kh**XL=Z&?L."=SEs%_>^2fb^'K;HA7(oW^$=]ZgJX9Sen`)2kpW>%qh:&]U8BP!OH)OB"bX)*i_I$!jh:qZgIk#mK'Z^!O=cR;cS*+C"h:pZ\23]a6K=_g>l?VZm+2),3*quQ!d==%USZdZlBtiehdr>BcpNYNF8ls1%f22Y>"QA#hE`8=K@EhG8CpkBcu'1@7JXAoD5S+(!M8M5q0@:C@\l7q"[K>l5@4RZZ$EFS!hdo?K4X%Ef2/lA_1R?:JRD1S_3tR[[G!>#[<4V`_1R?*QXDBu_R'a.Al;asaCr$d=ed2Ip&MRu0pFlkRO2K[dTigp5@fm6X\d*gE%g6Yh#hE`8=KbF'GR3o>%C9@[B"^+H=s"EZHbc_08/"+iH$I-+B>CT]-itI,4T&[>rF4@V@b,>4XOgK/GS'N:Mcoe)=ndGLpOHE@!8/W5,Lpig;Y8HAm+P!1-c`BL<1QD.5,r8-&SBMG8%!5[1Mf[p>g?T/X^U@r4pI];0^Pik6+7&M[F1FchpQUhUF5t^k&$qlm!!.XqNf.*]8%j/eNd]u)PlW*iVM>bCEQa&^pL^0UnQs_iA*+RgD'j+ELCE_g_)u:lht=SbHPni#2McZ_:k$hYZh3AV2cDblB,!5TjJU[CCeuugSus=[U?MNc_!IFQNk2kdM+_OcCS`cPmPBURV(m7>BsPH!lah;Y9>di$+PPW`de\Qql^+r)"O,T9^p%F;@')70mk-2qn$9O]eaq3ClN[p9RKe@$%0UGb!;lTg&).b,Oo~>endstream +endobj +xref +0 8 +0000000000 65535 f +0000000073 00000 n +0000000104 00000 n +0000000211 00000 n +0000000414 00000 n +0000000482 00000 n +0000000817 00000 n +0000000876 00000 n +trailer +<< +/ID +[<69f276e09b5581926ba94255cb8d0210><69f276e09b5581926ba94255cb8d0210>] +% ReportLab generated PDF document -- digest (http://www.reportlab.com) + +/Info 5 0 R +/Root 4 0 R +/Size 8 +>> +startxref +4826 +%%EOF diff --git a/setup/generateTabletopPDF/A0_20Arucos_25mm_Seet123.json b/setup/generateTabletopPDF/A0_20Arucos_25mm_Seet123.json new file mode 100644 index 0000000..735106f --- /dev/null +++ b/setup/generateTabletopPDF/A0_20Arucos_25mm_Seet123.json @@ -0,0 +1,143 @@ +{ + "page_format": "A0", + "orientation": "portrait", + "page_size_mm": { + "width": 841.0, + "height": 1189.0 + }, + "seed": 123, + "num_arucos": 20, + "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, + "x_mm": 87.49, + "y_mm": 142.77, + "size_mm": 25.0 + }, + { + "id": 104, + "x_mm": 695.26, + "y_mm": 90.6, + "size_mm": 25.0 + }, + { + "id": 105, + "x_mm": 660.09, + "y_mm": 219.88, + "size_mm": 25.0 + }, + { + "id": 106, + "x_mm": 225.54, + "y_mm": 51.78, + "size_mm": 25.0 + }, + { + "id": 107, + "x_mm": 698.27, + "y_mm": 148.7, + "size_mm": 25.0 + }, + { + "id": 108, + "x_mm": 151.8, + "y_mm": 890.64, + "size_mm": 25.0 + }, + { + "id": 109, + "x_mm": 65.2, + "y_mm": 1019.46, + "size_mm": 25.0 + }, + { + "id": 110, + "x_mm": 649.89, + "y_mm": 868.0, + "size_mm": 25.0 + }, + { + "id": 111, + "x_mm": 198.11, + "y_mm": 697.87, + "size_mm": 25.0 + }, + { + "id": 112, + "x_mm": 600.8, + "y_mm": 595.57, + "size_mm": 25.0 + }, + { + "id": 113, + "x_mm": 589.99, + "y_mm": 243.08, + "size_mm": 25.0 + }, + { + "id": 114, + "x_mm": 637.26, + "y_mm": 1022.12, + "size_mm": 25.0 + }, + { + "id": 115, + "x_mm": 102.48, + "y_mm": 536.0, + "size_mm": 25.0 + }, + { + "id": 116, + "x_mm": 185.37, + "y_mm": 143.8, + "size_mm": 25.0 + }, + { + "id": 117, + "x_mm": 700.95, + "y_mm": 729.68, + "size_mm": 25.0 + }, + { + "id": 118, + "x_mm": 760.12, + "y_mm": 1075.76, + "size_mm": 25.0 + }, + { + "id": 119, + "x_mm": 760.24, + "y_mm": 522.95, + "size_mm": 25.0 + }, + { + "id": 120, + "x_mm": 588.18, + "y_mm": 96.95, + "size_mm": 25.0 + }, + { + "id": 121, + "x_mm": 146.46, + "y_mm": 255.54, + "size_mm": 25.0 + }, + { + "id": 122, + "x_mm": 233.56, + "y_mm": 424.58, + "size_mm": 25.0 + } + ] +} \ No newline at end of file diff --git a/setup/generateTabletopPDF/A0_20Arucos_25mm_Seet123.pdf b/setup/generateTabletopPDF/A0_20Arucos_25mm_Seet123.pdf new file mode 100644 index 0000000..d9dd3b3 --- /dev/null +++ b/setup/generateTabletopPDF/A0_20Arucos_25mm_Seet123.pdf @@ -0,0 +1,68 @@ +%PDF-1.3 +%東京 ReportLab Generated PDF document http://www.reportlab.com +1 0 obj +<< +/F1 2 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/Contents 7 0 R /MediaBox [ 0 0 2383.937 3370.394 ] /Parent 6 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +4 0 obj +<< +/PageMode /UseNone /Pages 6 0 R /Type /Catalog +>> +endobj +5 0 obj +<< +/Author (OpenAI) /CreationDate (D:20260530153005+02'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20260530153005+02'00') /Producer (ReportLab PDF Library - www.reportlab.com) + /Subject (A0 poster with random ArUco placement) /Title (A0_20Arucos_25mm_Seet123) /Trapped /False +>> +endobj +6 0 obj +<< +/Count 1 /Kids [ 3 0 R ] /Type /Pages +>> +endobj +7 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 3715 +>> +stream +Gasb`]9;Qi&OlkuUR=!,h$Y>*nrQO@P^hrrn,IlaSpu39rpfILV#5W;rhLItoBk`(?f/TY>Oq6D?b_&>d9L8iX,Ns@&OT^oq;[h)qbLShrTSh3o9I3E[FbEU.DN.IO8jWK+(:3+Zn[2\4e=4^%NCU=s53"Kh`m:i$o+%n`2[8.p7rC78hp2Z5Q7I_D97!:VV%"tc])G2``bFDXql$u'O0Q&Z->VCCE?OCTpJN^MqOl]1deBtnj'GA!OG:&goffl1#t7'%$3V-i-%7NboudLNCh>8)0!3ZTp7=8EBO@kmARh!%gIi959TSpJC(Z6`gNgLmte(XDmn)_=UH)f.gKQ9P@8Ns""`'CYqig6'fX/a>rE<3f/0iQ>3;8Bkg=/6Tu]3'$6rA?!8/TKX:fmX;LJaPO%Z,]Q\]$hk6`tj\`!fsO%Z,]Q\_;S;bUWl9#Y@Dm0V#5dDN11%1K6TLq(/M%B>=\B,K?5H9G959`npQ=eXn>rAWC@h+j2\'4Lck'U)gEe]En?A@7[>FGd+2.mrrG'L?a/B<[W#NOR/&85J^oU+hjfFEqB$;Q/e0JGO-",:M@+HW3eg/=?QKE%Bk7TK6Q!r5o_lQpo=fY4s-eUpdQ!r1R(S`#eZPkaj+%9p2,#A_AT[mTUCHY.k-3:Gn%NuT5Dk:uq'[qId\jSni$nLKEiaHe>&e?dVL^-i2(UcTlK*=\85!GhNQ\OE(UHWe,b)%(0$N>gW:gA3>%n+TV*Xf'/[ph@6]E4j0T91@(q$X\H;mm6LuZ4WeAD^$Y(/d^!Pt3-Ji*ptXo%\]P'2V^!&?Rj%`qmqGe_)!Xb;s/(ZNoc(`9#D+fDQq^MVRl&_qisJ-hRd8BGLSRINfGsY+R?;"Nrn&r(B\B!f((.2*rLf]1bTu6`>)AaPbdmq/<=&f.&dVG_&;?MT))\6;:',$5!l8V_"KI_!Bs"\pA8?:X(VDNI>$;!XZpXsggNlt0f<IK%2SNT^%h.<oY@nq(*L81O60\@q@!j/Q;""n&q9GTGguBZX5@K\d!ofBOFZe^p'hi?qgaPY%m/\oPqS>kSb<3UOb^2"2h,CJi+!2];e.l4mJQ-#)<(i?r5B=YZ;[kY*LDI'CU+*ahY.7'a/;tRdI7J8;Zh6*31_*G%L[BJ6DVs=n_pL_ZON,"4#gGAA^@/\$[3`@Ff4Hm#`*nlZm&[eulKS*;p)p,6Mi81X$]Yp!1u1"(p@BB&,+NO0O=?pAil'@bLXq-[#5f^0Xo7,LsJQin3&\%YJ9c`SQ#Y/&Sgi$4Y&LI>*DC9gb4\kC.o[CEQa.5d7,:?qga>WWiM^%7Om"lb`%S@FPY%W7?T!/IRbC#D?b4oHL$I_)o5]pR.\*[]9]pc0^^$3HX;<3]U8A37^,o4Ohkeu/$s?11@;I]XOW&.YDlq,9G4FP_!I"CeC^B3AJuWU3Z_n%+j24'@S7+a:QDRJXg0pp(%K)5]nqK^Z)St4YZAD$MP(k)<])S4C1,\T"pS':%'(:e$PV;qAu.5`QH$.tQXMai)53u*&T8O(p7ms?2(ld]gq#hsfB6IgPVMMP/q[nDL=NeSG+K(d5"FWgXH"9TeQubH,-M.^oVmuXF%aaH[r2EQuZ@gY"oF0Bc+5\&3U)j(A9oB9LfYqVo>`["Mn83&?KYtm,9)uRAb#d9SWks\d-Hj#L%L2O?I>//*-"$&4^T)p"D+c[:.Y`(piW2Z;!+(cRUF)^qB)AA>^Ae?Q:R6if"l3@h=N-a*o(YT.:JSS6!!r37^3n4[!'=Ui?nJCE+B\5#YjPrG&(c/MNnQ2Q[:.YX@b1.n0n6s]mqN1#+IgsKiLQpRS9:`UJ#C,O@C4=a3MmWs*upb]"k\/+L>CI\k2P#cAN_$_***11?Vguh4WG$73?VFF5d6NrH8oRqN.-1VP1N.,n)&oUnb;p0RLVIGVL8Ht_^iQ(Wm)dSfMD*i-ca^O_-0lk[4sqNDdAGdlB:O=\pqZ_I/qsIgh,L2%gpaYIuGJ).mf)(PNi%Z9)G@bYZ(_sWns;QRrfYCfbi.dqLk.YE'2dQZ=MRg4[J%h,K[#hEa#g==o3r(]miD%*JQ0s&qqYh$i'WudW:l=%h!Y\1*sL=Ou`enS\sXc:Gq[4U'iNl(HD_lj?O_(;(]kE[]bCh0QT8el:g)F;rc'(hU8`n"3u,O>j9^#+LB<&b#6\fT0^GPIm94?aLATfg7p^eT]U8@u,?V"+aC)E`*8:)!*CmjVXEhU_f1)uF)j.sOlh,[;/_(Z)oaF7#Q=7OsmJ<-.__8ip?\5]>0^F-QYiYtl;VDEPSc*Uu0=pL[L%rsm"=pm^GP9)DOP7]9q\*f"0@&o(S+eEc#FF%)PRcQoko)6j(*MlT0PYah!*3-kk]NM((Vs9`R.\T-f".2U9`pO04S4Hd,O-=(lPYM%/]1-Cje2#XZgO/fbqHn:D+%^2D&2c`:\RMdjoMgVJRH_)_3tVMf$m%?k8h*mpT#5`c*"a@B@nuWfR$nYQ#l].]8L*EhD[]=m&9dc#`a$rm1_?a&^oWej2!_"*)gec43?G#*ek:XspDUkOBfL^2[dQSt^6A"6%C.#U2sV&j$2OG?N?\L:I5!q[Y_uX7%7fp9p*ok24aT\5R.Z#_=kendstream +endobj +xref +0 8 +0000000000 65535 f +0000000073 00000 n +0000000104 00000 n +0000000211 00000 n +0000000414 00000 n +0000000482 00000 n +0000000817 00000 n +0000000876 00000 n +trailer +<< +/ID +[<8c464eebdaef11a4ea517fa6232db978><8c464eebdaef11a4ea517fa6232db978>] +% ReportLab generated PDF document -- digest (http://www.reportlab.com) + +/Info 5 0 R +/Root 4 0 R +/Size 8 +>> +startxref +4682 +%%EOF diff --git a/setup/generateTabletopPDF/A0_40Arucos_25mm_Seet103.json b/setup/generateTabletopPDF/A0_40Arucos_25mm_Seet103.json new file mode 100644 index 0000000..0e7e303 --- /dev/null +++ b/setup/generateTabletopPDF/A0_40Arucos_25mm_Seet103.json @@ -0,0 +1,583 @@ +{ + "page_format": "A0", + "orientation": "portrait", + "page_size_mm": { + "width": 841.0, + "height": 1189.0 + }, + "seed": 103, + "num_arucos": 40, + "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": [ + -453.5, + -331.0, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 104, + "position": [ + -749.92, + -144.69, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 105, + "position": [ + -51.03, + 216.13, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 106, + "position": [ + -94.29, + -254.46, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 107, + "position": [ + -204.73, + 311.12, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 108, + "position": [ + 5.69, + -222.91, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 109, + "position": [ + -82.1, + 208.77, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 110, + "position": [ + -524.92, + 278.61, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 111, + "position": [ + -403.65, + 238.66, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 112, + "position": [ + -360.75, + 191.8, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 113, + "position": [ + -267.34, + 190.31, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 114, + "position": [ + -1017.49, + 215.5, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 115, + "position": [ + -919.81, + -264.8, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 116, + "position": [ + -480.39, + 157.71, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 117, + "position": [ + -415.03, + 265.79, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 118, + "position": [ + -70.87, + -288.32, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 119, + "position": [ + -712.35, + -212.06, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 120, + "position": [ + -484.2, + 305.52, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 121, + "position": [ + -1018.02, + -343.04, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 122, + "position": [ + -278.45, + -137.41, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 123, + "position": [ + -441.36, + 323.68, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 124, + "position": [ + -656.23, + 338.18, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 125, + "position": [ + -546.24, + -254.82, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 126, + "position": [ + -354.69, + 239.76, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 127, + "position": [ + -693.84, + -305.9, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 128, + "position": [ + -906.09, + 349.86, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 129, + "position": [ + -272.56, + -252.41, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 130, + "position": [ + -415.2, + -198.86, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 131, + "position": [ + -792.1, + 272.52, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 132, + "position": [ + -692.76, + -270.84, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 133, + "position": [ + 22.14, + -298.6, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 134, + "position": [ + -245.52, + -246.37, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 135, + "position": [ + -1030.98, + 361.6, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 136, + "position": [ + -553.56, + -190.0, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 137, + "position": [ + -23.73, + 289.53, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 138, + "position": [ + -531.23, + -298.84, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 139, + "position": [ + -801.83, + -245.79, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 140, + "position": [ + -824.79, + -167.79, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 141, + "position": [ + -229.87, + 188.58, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + }, + { + "id": 142, + "position": [ + -773.93, + -198.68, + -19 + ], + "normal": [ + 0, + 0, + 1 + ], + "spin": 90 + } + ] +} \ No newline at end of file diff --git a/setup/generateTabletopPDF/A0_40Arucos_25mm_Seet103.pdf b/setup/generateTabletopPDF/A0_40Arucos_25mm_Seet103.pdf new file mode 100644 index 0000000..d7045f2 --- /dev/null +++ b/setup/generateTabletopPDF/A0_40Arucos_25mm_Seet103.pdf @@ -0,0 +1,68 @@ +%PDF-1.3 +%東京 ReportLab Generated PDF document http://www.reportlab.com +1 0 obj +<< +/F1 2 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/Contents 7 0 R /MediaBox [ 0 0 2383.937 3370.394 ] /Parent 6 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +4 0 obj +<< +/PageMode /UseNone /Pages 6 0 R /Type /Catalog +>> +endobj +5 0 obj +<< +/Author (OpenAI) /CreationDate (D:20260530154248+02'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20260530154248+02'00') /Producer (ReportLab PDF Library - www.reportlab.com) + /Subject (A0 poster with random ArUco placement) /Title (A0_40Arucos_25mm_Seet103) /Trapped /False +>> +endobj +6 0 obj +<< +/Count 1 /Kids [ 3 0 R ] /Type /Pages +>> +endobj +7 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 7332 +>> +stream +Gasba]*Z;YifW00T@8lb>WUhu33Cm2sb(jj-_Ps.gRukGLOmIfIk-q+1M^cTcmVqa#:k-*/jcV2Q86Wh9=hmIU)0r.r[;s89nZ3QtBJm@XF$2cfkUo99%WF487Re9UBUsnnt?iEo/4bb]3kF_>aRFWaFR6hk[PEPiJ;XtpDRA4SXTbe2U3RjKW[X[sKm-#Uu)WnNA:or?S8gq#ekn<>XGK(EH)O(a@]7")>Xd6;][#uZ4AcZaQq)T0:0)0F&5fI_;BH'ajZ]*fn%^2b*5b@T=-DMn!POW'jR9q*J6DUIZgIp-h$4phqp=E%IVTE65!\i2!OEgdAj&&Rf44+soPnYZ*O.p(a>_>S?ED!98iNH,EY3WY"@PC,LjGXYe1Eq!>5D*3T01[3o@c0"/!nV0kLe3LeUBQs8d1IBjB/C4i`[<`@ZWJhKl.jjo?aZ]"Liqj[g`bXD.)"5"2hi20W!Fs\P'/2/qKJH-N3I]O4E>)XN;bjb;FmZ>U.m<"%5ePdTc0X28m3W['_T#UsM<$Mj,X>*E^balF/Nt=FaQK!4-PEB&*X7\db#a+'OiAf=3t+*ZMqa?@k&J"RCB1O-Je7Pe18G>$_cAa+d`X%C7*[.:K>_5PU$DZQ:&t4Z:N1CmanJWr.Rl]lFD0IDDr]J6DUIZgIp+e'tOKc>#lV3SjP?8LL:=[*:%#]83k8XEM.M&u8XsmRSWpZ.^jm8s!N,LXe`8\%_7g"2UE:"D^14XSG,cjo`G;+&_H6Q>:]]@Un&mQXR@0L,HY9T'1MSd.J%*e?i8%"-..9h8L#.jVbm4A98@k9ql>bdq-)\mEH!HKB_GnN,h$ksG)7GEl"RI;Ibf^oZ]RB"b9Uf)VQCQMT&Y'6d#@+P:qXS[oY00>PD+!@U9lIgO\jB/6*R+ITMP-Z>k;lo%Fe^kYUc5cD]b(F)goG7'$JfV+MorRa-dWHX8=#HKYQusK)lTS_-I=U\C"&@HrkY`GY#)nSh+R5(Te,r)%&Jn-k_idcVI#6$Qbdn%@4lkUE?11DE^7P#E$e[lL:=h=u=@0X&bA[mnCRu->'c_h5P(Qp3JVbt,?`1HQ,qn5XB0D$H>::>3e1ae[fI;f1S2kaa"^K2ZfTDu(XHd6*+0tlfouqj"XS[NNpAqVg"(VoaE4YI)Of%ttZM'(`Z`Y+MLL-LRl]l4(g]n?Qh_=B$62&Z`dri?%?+'PPTBjItlc#rl1WUWBiH.4@WNo.12G$"hb^+)mp"1taAJ2;(&!5>8a?H(g^4?GgD!/V8,U"D`#a%9m_8^?SW@$+ZGr;F@[SCBSE2&?OQ8fq_gn;fC!4kQ(J^=-KXmFH5b]f`P$T6`L?iSLA[,:uc$;XLll#k*"OYN"d2_GA&lgm'_IR[g`bXD8<7+^a-O/Qr8mZIRX\SZR15pG"Ys.FA0'ms31k)h/XBVk6/]jSA;5Z^a/g2d%m783_rK&5d@L%'`6TLYWFZkfc?M\.Pmg\o5A:N]0g)\*?)i03D?Yh"%Gd4;QDAENK+@1FreJ769N"+fKMXM0a<@Q1G%?p`ipscX\pQjlDZ#Sn-5#XqiF5AFck24"(p?obdn=PFWV`Qpjgh9+0qiU/s88)_lUl_fg@DffC`0-mcN*c515/OOfghDmCGRIn,]hM#+Vi3OEX=1O"kmI`2r:DXQLO7]hCcdn,]i&Lu+lh&5;m-*A.h*c[$sjeH:u'G1?nBLu)GtG#iF\d$BiL5\%@+*iE?pD:0=(UL9RTT/MtB:*hTR.^$#=cX#u*a;(&lArTnXS[NNpAqVg"(p?oa@`d7X=Cg1[!,eVH=`9c&4>RZ^=#&#(kYhXI,g7]UmhhTeYmDNFC_k(j(PQYSLEjo)S1hr6A`*2&cgELIRpP)SoTj\V88@Sd$)@/W-"@XfMQ=M5d2R9Z_l^73I>'3m+*rYp6K-2C^g2Q"G:S20O&Q,mJ2aEAnorf\l*i&cPQl&8t/%.@i,>!:\]7U0F1]#RIQ5E&?M,6em"tQo3oQI2Jfr8"D^14XSG,c()t)9Ch\JqQq(t[p"1taZ!l5SQse_Tbdn=1JIS*(&"%JKQuriqJPDMe^R0.n1$egJemlV!a4:UM#^Z9(=n_s'mK7(W#L'aiONg?5;E\NP8KLUAl9_MZ3*$hn%1^p2<6oS0b[t-NV*j)JS$R4'$`@FfYY*8V&BY33I;NB=D$.UXBM?!UB[XMT#QEHJ[a6Gr)]FFETeYoZ@>]JMTJUI(;O;UFFl.u/5d7,:8U"sk;kD1TBjfRP.gXYc1014*D$+BKRk`"=,Ngeu\9@:^%G'$?<>a74=C'PS'<&:dX.C\-T[H@aYu57<+f.Y^[1/Mh\X\:m!4-PD_3tT3CQT3Thp=u[md3SN66fS?NF@%&1$fC0dCVb=H:lb2m>-OP=dMCL]-UuNT^$h_]1]r@'aBCMG6uhe,P:ENMOnC%*S'c.0^Amt@*Jn-2&chPCk-?Qh3=b3mnglif6?Ya@=GBl_r3uX%+>?4Xs-d0*N._<,&$9$C1X4An@J^C)-Q&E7)!*\o*r%o"(p?obdn=P2'5_DfrZL:h;nF[o;QpKq&p\5!O).=CU2-!6^LI=?h%Uf3E%W&VWYPi4FB9P?+!Un1fGp\`g!nS6jFN?@k&JKEfn0RXF@KGIOE,=\lMed&qe;.h.lQ_LPMT(8;ic:=Z(R$Z*oWYR&b<,$53]ZX.;Nem*a,c?[`K"28(fEaN(CoKIA2RPLsNje5&C%'*HTkR]8^lFHLI`6,<1m^s%7'(!%mCVnfndnnd'L>=aAm'_IR[g`bXD'2re6$2:=h/qj=&?LRTYSJ.n>%j;2cpUMHN=1_R/VaY`jC6^$lLeBQgAQ$%"D`#af&U;kjQ]B<:T%U]'!02$==[nbCP@^Tbm)Ch'u*fZjh.Vcf'[AN?8Y-Uq0UX'`RaKX6PS:tpYJZ"mHo7=-c9gDMYrR>e(O-k_epP5G5K(ZgBWJh4ts)6OJ[C3>jf8t'!1=D=OTpIVH6i8?`15k]HC=7NF5I6_4"\9Kq5bb0l!\Fc0[R\I$@rh29-!R*$\Q9%0UH)@!4@iH=20IK1OV%"_i(,V/iM@-NBSG8[*8!CQoZZl8gf9W.8=L5']<8T@'l[clKIN,c>J]K5MVFG2#9dAcoqg)]0#rK7%D*lN"V6+B[*C=kAa>B\2R3O*!,Bl';p'`/;ZG!jsT!XBS/u()im_6E;W4Fl*V>6R,D8NF8m\@b,B==L/%6JRH_-Ji+VUepJTBo7:;o#O1$.BB]JkJRD1S_3tSm=\-MZ5LX2A9luNQ\\!*KJi8-DBk\W?;#!0TcNA=;iQsa"k[Wisa@r-(aOC4pL>:Pp+@=oWkMjDe-)[P#2+P:N56k:4BencHSQjn@fn\$Gb/g0d_J5\<+H6i'0^PXNaf^17Y%rVd*+sS@8BJ"sf+r@d$4ld6WaX&4"gn$mHmqqTb+BWt7#^4r&dDH0?2&ch0o]J3gP-c"7&,4()TAs`:[`@Pj>DaHs3R3q"B+<0-jTN/j2(b+kXP'6]*-gq@%0UH)&?OPMYhK?`2&chPCs]cjHICZ40#:`&>0hhblc_,9h)5hCaX(&Q4*9uu'ee:W>qCJBXMhrY0peF*%T^.qV^!e,`=%h\dpTLCS21[#hFAG=S%)Obm/hX+#*"EX9u+]5("JTdstTM:h'a^27j'Ih0Hi@gL#]kYn=(X-@O>>e]p[rR.YRoDA=k-Z7Wtm3JPpeGR;m4`Mco>;5qXjF/DX5Tg'>ks#M[<6[?tA+kX?t2MB5WdOs'2Kk&)*WDbcWcg5q;/0a_T&$:UjmSB;I5d9AQB&*]D2'3+THm&'M%pcb)p&7pZ&"*%B#hJV\)GI@&YCGsI-Lq5EY(9-q2!DsXIU1juSmg25,?WDfB\7X;*Zd$'Zent?_esr1em`.A?.Km:q`r+IICc5d<9fY@jaGRWMI,,\6(gs5lG=YFm@mY)(4hJeMB9ArTMhaP,FSbH*GFuR9o?6,@CHIM]1l\cm/k1C)]7.RaNo!,>e1&Rl'CLm.*aW#29uQZoFe7iXj:QR>^7GoMiD*r2M/?h#hEI#cYZE^C]nOY&Zir@YZB<]epN"L[#"D%m/4t@a\TD*>@u;NZRKu24Z'b^BT5^sc)/iE6Ca0)o@-^F):TWS;1@-ck>uI-(j:6kY\!sSDAO.5gVE#q+0m<0T3pP@5k`QTdrc*g:HQ>J=6#l\eho_dcli:afWS)3k:pKX%6.YFd,oOZ/<^m;FhNl"r5Gb(8^+aVOHjG4p^T!eSjL/oK?1=#n";DQ.\\/r%''W\OQ`e'YsO1N4cJi)C=a!CtH;NUcGA:oCuQaH==j=cIAZB\XkT,)0Y3Q>5IYu=M9kIF/[sO,eYj'm^>Cd*I``JCgbn4"2UE8%(g"Z2!ik:O9D*QCDn%5CEQa.TS"oZIYa/47^/bV@GdfsTK=u"mLDt3MOl7&U?F;t[Xhi2#)7PC@*i`m,Bqn8_dMk\"hiU)YhKA62&dD+[=LWQ%@HPMD6r<'-Tti"5'h\t!=V'H)OOsb>Pf$!Li4$EYXqVbSJ6GGOJSP^/uCdZ^o[E`=n_s&7r1.jO%iF+^+Rtt@`,;5L$YKLVsAYue/#O)ifJ];UZ=\i`BjU.[7dWB*BQF,!bOSLa<$IPejI=n4LQE`b&t&O;/S)R5%)riJF)4sB&*^55$&_`,44Vl^4Vt8<[Z$/L[%!I:E6G,jC]nMlQuoflP!d>+bRm'.P!ZW_L>>uuYa-"4]59h"kK!T&Q",R@~>endstream +endobj +xref +0 8 +0000000000 65535 f +0000000073 00000 n +0000000104 00000 n +0000000211 00000 n +0000000414 00000 n +0000000482 00000 n +0000000817 00000 n +0000000876 00000 n +trailer +<< +/ID +[] +% ReportLab generated PDF document -- digest (http://www.reportlab.com) + +/Info 5 0 R +/Root 4 0 R +/Size 8 +>> +startxref +8299 +%%EOF diff --git a/setup/generateTabletopPDF/A0_60Arucos_25mm_Seet223.json b/setup/generateTabletopPDF/A0_60Arucos_25mm_Seet223.json new file mode 100644 index 0000000..508df9b --- /dev/null +++ b/setup/generateTabletopPDF/A0_60Arucos_25mm_Seet223.json @@ -0,0 +1,863 @@ +{ + "page_format": "A0", + "orientation": "portrait", + "page_size_mm": { + "width": 841.0, + "height": 1189.0 + }, + "seed": 223, + "num_arucos": 60, + "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 + }, + { + "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 + } + ] +} \ No newline at end of file diff --git a/setup/generateTabletopPDF/A0_60Arucos_25mm_Seet223.pdf b/setup/generateTabletopPDF/A0_60Arucos_25mm_Seet223.pdf new file mode 100644 index 0000000..7f4f21e --- /dev/null +++ b/setup/generateTabletopPDF/A0_60Arucos_25mm_Seet223.pdf @@ -0,0 +1,68 @@ +%PDF-1.3 +%東京 ReportLab Generated PDF document http://www.reportlab.com +1 0 obj +<< +/F1 2 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/Contents 7 0 R /MediaBox [ 0 0 2383.937 3370.394 ] /Parent 6 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +4 0 obj +<< +/PageMode /UseNone /Pages 6 0 R /Type /Catalog +>> +endobj +5 0 obj +<< +/Author (OpenAI) /CreationDate (D:20260530154505+02'00') /Creator (ReportLab PDF Library - www.reportlab.com) /Keywords () /ModDate (D:20260530154505+02'00') /Producer (ReportLab PDF Library - www.reportlab.com) + /Subject (A0 poster with random ArUco placement) /Title (A0_60Arucos_25mm_Seet223) /Trapped /False +>> +endobj +6 0 obj +<< +/Count 1 /Kids [ 3 0 R ] /Type /Pages +>> +endobj +7 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 10717 +>> +stream +Gasba^!\2i;M>#;.ZTK3>5saY"Q3\(h>tIP!!WqB:K=#cZm%C;*\Ph2g@_$H9G$bPf1nMNp9UClMrdp=alV=M7ju6*ZP>I]Boj24Z-3ZU_RsR+_.5(ZC?]6N^j0%:r(WTW/HrTba@G(86N7\l'Ws@L]$?91NV1:+p.=MSQ<#56Moc?oE%UClt39.oi3(dN7#S4c7FcWG$L:@-c:je,#kB\YH>l3*,J26[P1/gRcp%"3>_F*42\0[n#tN"([H40H3#[2KHTLjFFp4%XJRin%D4$O?IX"Cug-"a8rW0"83KjkV[I19kESnr[Cmo4VI*%Tudl1Is@PYS456n*;=1nN!tH_m#5a'&saVU?BL"2e:P$u7jWXQ@7%Q35$.%eAr74-p&e=q1sV3A@Pr^p'+,_cdOjdp(kdj,4lof"<`=H"0tJ`j"T"l9t%g[pE.lYleJlD0%Knk)d/%R(TZK&BTj?@ELptU%dYFBIA>PpMCZ/C[$e89<&`M>CW-5^+W5ZQV('DHX$k-o+@!7F63P%Da,nK67hH7&6kMTII'^11]J9k$$Q@Q*jf2Y>/,+Lb`R04q!90H9\>fuO3#OTT.c>U;Q0qKkgfGb2u`H48?2o^t/ZY,A2F3Af(3hQ[7#QCZ/[[NJ]:a$/tEK!8iAXSelc6*K_n"2S.L$u.LNXMquZ('A'k@jiYR!]lM\"(j\#!d/8]ldc?PDQU@3l[AV[>Jk:@-!8blBQ1YeVqpe>A1nb*;/W"?G0o]b*&-\Y9VC7j$.e,_=HA$<<`5MVh\=/V!ArZ%[_Bm1;!A,(h1e8>9]Oe?>'F_8,(!'Rhm-_@".7O,#&iK`!J[uf(tLHMfO"mmC+0^1`/s'r1;G]j@N\d6JRCVFK!cF$e76:1`),O?1r1um@N\d6JRCVFJou"!%<(o$%?T"'YZ;JAl>eTuEgtk'm[oN6.L=V+Jm^_GK!cF$e74#FdC4&j"g:$m"si/%@%Ku)X&?P&FfuS_P4U4;@jA9A`F._n53FFac^hi'3fcpaG7LiNfjA=s@I\6'@hCoo*+FE=kjbDV=GO#(Ha65>qKYo!`%0b_BHF*Yj7ZW!U[;%TmZ1+MW9d0JYXr2KF?7OTT45)qGSW7/8q-P4=:[n-7R`)ePk*0cN,<[QV4tM=-'?[jTOLC!tlj:ZL(ORH;`!kI?.:\PBpc_H\F.tqS`8'r`ll77`eThXE@$juCuJmoAVOaq%krMFX(5d6g\_0Q@ilRe*N''V(PXfSL`<$OC-a*0M__E*Weeo",M[`>cP=Ic/nf9q63;lmYbK/(r:O[@Q%+,b-`'SpN)rR(=icBXV%X=_e`F"au*t/A_fEW;8WP&0bCEj_e`F"au*s4rjYbd$>Te1ed0iBQs`&]bXN#&Ps>4icaO>Dp\!;4PipQ*HVUejrjq7q>P>7I:9Z>M]&s4NCFXa2m#aZ[BjSP;+$!^eEklMPJD'Drfu%$pWS^eGL0i)Y?HbmP@5bbap@-X[Wn40<;/_h]*&&>g0H8jkH[$Jc?+3]pWWJog!250u\^J2U"cmUW)rY6aS7+<*!j`I@A:)EI2sD>9h+@7Q5>n[R8p`P+[5@R1A_91E?\N"1qS&S1f_'XXQsi,_h'Ma.5>pQ-Yats5H4C)Dh?_]GXbla6$?$(5h?_]G&ZjS=_0QRolT+_6$jYu^'nfQ19BT\Yi^pRh-2=A+!]*u@6FjIoc+7gF!+T2!OG-MCu'KPjt]lK53#)Kgg`.=-lC:+cn-04K1qq!@I'J79;$QXkMHmR,([=(^43)A#V[28?oC?%lsU?i)rC3=qK$K[i=3-P%C>"&Z:>@62KHSO+pVEFE*_%Ej8dk#""lMhkaI.iqYNV^Atpt$Hg&H1L0e.YE*[sCkf%B%`GDn%a<#1'Z]P?#X+#3gQ[Tt%rE1"=hotBjXUM7K\og^__s5ua?'@^]9h#NZ*j&,HQG_/&)Y]r.kJ4/(?#_/Tn+WD2,ri951d!lTn-Ub4V4^XMqRShPj@1poVhA(,E;1^YhjO/eoMs9cN1A7"(q.LdXKLHB_+CHkCO$phkL3+\m"CfaT*16,LuNr!/QqRV>QnmJ5L`-3@S#AJ;=Ea2b*q:N"#2,cs0^I;o"LlsSRG"7OBKJ;=MnrWK5Jj1=;epYQ9Z$p/qdB&@kISWr%ek]M0Ce)`#de3h$MB7S@5KaTb>3am5>#NVSD@BC.rlY;hs?*6$Bp"XGF;(P+r@c_VIpRUn""bO-3_edC?MKQJ38tYI!DmZsoY\oG.h&=+U@t8C6J;_rpieq]mg=iJmPc-&QiUF6J@^S6UYg\X8AF+BWQD"D]_'E]o/bF>$iN#0_g,Ji1)l"IHa^6#l@3]3:/>SO#*4%&4jE7P+X/lI+.Y$S&1c_ngW!]'QceJkCdB;[2rL@uH;nF[7=kat7VsOhhGVpR!j#`?%&3$-mNREklMPJD&!EZ]P?%,6u:23K+EmP!/GH2Y:H:oKr8u],kqZlqq\gNI&KYjFGq)!OImjA<.^R!=-pl)DE*K+<)6idh6miB2sL[Y6g/67:=V$^o0a'dIK-iOfnZ1f*Bn4V;tV)ciFZp%_7)RT.oVrCKuW+%(kTsdXF*jk!tMW[fW:/Md[A=IGG.e*Ws6)$j>lN&?Np&fnb2-f4%kYc&u"`;&9Vfd#(IRWEVS;hVZ%nWL1)&gTsegY$6p@^p)B$(tPE-=LZ;7CY$XlT'K;8_]$A&21fsd"Dc8:?m>lsf%'HgXT$o?rM/]=@Hts7%,.LUSFr6a!YpPR%goH0"=l7k,g[l^qRRM#'$sf7pWg2n!7==;URhHT4TULf!n`ed0];Jn&HQL](rJotj^?M?A:Oe1M@ZVeI?lZrjHY'7^W2a]616SH9e?:';/Q$^dY:*4Mi"RC@Of%M"Z>!$4rbCO'-c99eDIX5bK"86r%/+T5pa0="1h^N.G4%FUpJhcUqhe?0q]>XY0I;LiT*[3_BY:`%bNZK*plOKK>;p6D(g67@"@WRT(qH;%4P*37+*aV0A;Ijt";*D;BT(;JRCVEK(Tf`el*^D?OER(N#(ZH!ePOu"T)+OCYE0EXHuP`^J^osZ6$6eh.i9a]lj_5o-.:\7^,*i>Gh\^2hQ3b"RF>=f%VdmH3sf@.6oeP7o-1VT;",\bB<`P-%i!,a=4RIV"8I@[.`!nk1DRjHO@geSYVQ3emlcY4lAE/a$?jE"+bb,"R@cRXN*T1*^c'J"+7Fu%0Yu8#hCk4\a7+eBJ5][^"as$./:+6F[<77JRDd$O=(D1>jKXn@',h/W*:KKY@<+V(be$UGn7E1=%D(ZV8"$A4TpLKV#raDk1D[mmi3feq`6LOlFeOj_NjFAoUP(:S(A5S_0QLmCG?C!a+2j!JLK,[(cD!PB=B)ib_?=r>h:ZV@N-R^/R1tq[L`mP\5[[[VKpQ6S20hfV76Ht;%!Nmf)rim$j>iM?oDK0m#^B+en]!X.s)i\"MUQBll*WgR:(0rq7G6.Au@9BIeP'5=C(:kmKH3rYScZ8Iu-?e^o3$=;9o6:&HP?a!A)"fOFBV%=,rW)=YEgIe)80"8.2bd!Pu?P6A*CNB`$\^*>#=(/nW!>_7DKjK3;Dl8)M3&_0W3qXN,kELk/qs#(iuJG[Bc9T.F8HE9;G0BAW%rgLi"^i7P<`UQ6IN>u+Z#k[E+LhYdp5eoT4*&AVH6SccfT%Ku)X&?P%[Yats5H4IN1!]^)5F!+T:5d7Db5A>aS\n`EjY7#sTHjSB;&ZgrB%nBlcEYg>qKZt1JA'TqSHD0Y@LbG&arRW<]\,s?U-?IFG@EqVSfX#K:Zb"hrlP1^hi(^fuO3#OTT2?#L%K(HENXnL>KkP-OdK>p3]eliC&8W3$CcK=K=Mns"CXQe*0!ICL@5bc,2S%Zi8bagborB/o#=nu6\TL:oO2n\lluEo<\85V#/32qo>Z4a/JmUW;1AC!QK7jN;:Mis77)8J%k6?)V792-\YFtpG$F_rm6'SmaIoC(ZE\$.`<(_0QHUeK3ha^nU&,HQ=,AT&0\e'YE\C^k-!m4MGrh"i]Wo0!M#$ZI3QAdq^u-Sq7[s-uM%!XQ;^OSccm!2b&FHbBcJVq#'^+QXO/%Aj\r5]ob8\(j,un%09IQ0Y1U*?GW"g8g@G^7^-cid-KQ"DG,*;GT>QGef-8S,6rhn*!k,:J8BM2oE'rrXD<,1nbr7F-G@2u34;I5YZ6](dL5E$A(Qq0kSu,IYcJ(i19BZcotY.CmacD$=O2P+4U6R]DZoC_UsZXP(=S^2Jp"a0lh*`OmYtW1Rp;b#JebTRNF9HV#hJY]XQu,j"^8!D&hrT.JPd5A;:F7\J[t4i.*n2fbo"?e1PW:q`ip3\_9+0/EmQVGV5FY9Cs/Jtf?CM+9+5@A9..\XNnl`HVGV0O3\.(Kj]W'u3oS\G8u-u7%frGs!CXg@0%F4k;J<9Mh$%1E'G0Ap"C5FFG3nk2#hJ)MXLB(kL,G]1Z_e,I_+pZ[BF*1!+BX\U?p+_<7LV\qh\`@Gc.l^YcsI1qqhp#7Ikadd0*[0=(^N%g,*/8gKJU0lm-ESMle2nu)o8aQSgX@^%,9lhU8ui^G09DE^GRe5OrDn)I10mGaKOp?DjooF&?No;YT0H3#[2KHTLGf+?B)c(5#af.e@R#Q-!8``!#kf>VcXsgk/FUoQu6uHNkQEel=d&-NqF7cG6'E5"2T9l"R@cRXEu0opGT_nSgeR\lZrlgob+@lS_llf<5&M$)@4nO/Eq4^pYIne&?I`r!d2$VlZ0IV4"#8uCfO05DN/&;3=r:25bK/#AG$,iIb+GH?+ssGrH5P51=DI`*6%(9SZp#9AUc)o0W_)I:=s"-?G7(r#hF'1qNPdIQ[kY0_cdNYCH4)MGpCu2VGH;hs#VK6e.k5*"R)V0h!Vh;(Ih[16plLu+6Mrk)O64Xf88VKe(psa<5Wo.(b)LkG-=bW'8$@I-`Qsi3^5Q24r5TF'r+nJRL,8L:&!TRp5bb5qGCo\:IQ/?C:f69N,R_6?)?LSk=Mp93(3]2uq+j60bFZ0O.DQg$9^#i>\Q[*2@BXU1"CqlF+,X_WsjKd#(](-]GVgLk[KdWnFD5r"1u+o;@+H>lms-CWLN:hDZqXC`1g@-.pR;PjENqsGSJ^!H#4EgpOEr(,]j1MDng[]3ljg="LB$lHG;Q6MU#jtZMsju?9i4?[IN\H6TKdt)oJKK_Pl5+;Vfn$DEGdM,u>CNYc\bJ+a8E[5,)cmZYkafh&=,@2+"HKX,gN+pJ"fH)Sqk"#.6Mu_cdHWCGAX(StsDpk9llN&?L4'=SG:hm]AWZiJ_)p[;$p_[mmT>NF:RG043O/[1TKC,>a_"YV(.L[sUXs7_R)$l=)L5>'5E>R,%%;$.dW>XAo@RH4(s":B@c4U9VIGb3Qp`G(#dYli,To3*(c(U4ZpQgr8A1k?&ThXK%b@'V(HmehMs1&WL:Z:DI+^Y`%j3lYuH#2,cR@lEnsCug->7LjdBl]1!q$kSC4&:0!0dDu<^&HP4>f.H0XnNG#-]L!L^:>\j="C&0jnJB6s.a7$WH)Sg_MaG$t#%c<%YTC]/rXF*6A2,d>`PA]BCCFt/#hH,kBB=Z16Y;-YV,?VGKSuVsZn63@*lfIER3YO('[E'391_?a(cuX'lH_#foL:(c+=M$7)p/f3AC,%F/.VZ']l)X'P?ush`F;cCAc=\Dn$pq3[!NL*PeZVK2A+fc><]Oq2_q$3diaO$4O+C`a)oJ+'7dn[XGk;Sp4l43O;XCmH..emR@9p#ERri-kVCEG6j>,r&-7IHH0lkO-N:NQdh-VS3&ZjS&_u=+Q:lBm5/I'4``R(F(eZMia,6ibm(`;r_"+sbc$u7S*[cp:3[8skVOE'YY2uSi5ZbdTgc;[j,fXB88$chPchtj]hfI8\J4,$-4\j+2WQpM=jDV!nF'&B;G`!!qNF]f:hsO!G3PYa<&V\)qM6JnCEJq+mTQC;/)+To\smYDqE6rD\qo:(UAf#>]+3l]'8eYl3RoeNQ`Mlkf)Y:i73mg;,Jh>]5QFefhC+$Tr9!R*.*h-W"*->])lU10_!OImjA.NUG%<#?9Gge8EmR-`q$e[lL/iPV#s89V"?tb)Wd<72_HEi4O.iiObES33W2X2-cTbk"ihGN/hLK+/iCt&W!NuThm3FFac+>bY*03tTdNFfF__*)@LfpOCD&<>'')qppEe<4JRD1R7RP%=B,bn,N7j:cY[5-KCXrd%DJd-%LcK7<%;Q+4(GEUN$j:?#@!(i*5'@Wa<^clk3_k*ERgR2NGlUi0QW['#Y:TU^97H<',)<$tHBZ]P=*RTr12bLJ-<^=51h&?Jq9_-08=W&_b/3.!=:lU'o69C-1uP?oG?K(XL/f%M"Z=q1sV3FK9XP#_K&;Gb19>ih*nOrboAZ-lRuj$>,;(-P0O6"G_+?@L:W9'!,(NJU3RnXJ\=f*lD+DXKIA1?p+^G[292!@j"m7JRCWqod"r;7E%NrY(9tdK-&M5gkXI`JRH/@#hH#-5eSWQemj5Hn%)AgG-t!=]b:,+m*q$`#0/@PFDc-cf$311q;.2RO7(6#3B$3NYn+ep3RlsP%OMG)7LkMCo\smYDu74g@5M@Ml2n7]?!oS'@1D14r*Bsi)DE*K+F@dhhcETIF$Sr_!1"N)QB!e?O-N'5Atq(g2Au[.O,C_h`.2"8iLMSWL[OVZ?[3qX][LEtA%S>-H.2n-_\Zq&(hA[G_lTa9;&KOeQ_Vj#1Bkht47rA%n"eV7?!>@SqtVk2UtGTN;Fn(S?$f)`[2>q3qfU_L2I^&rMh,81/lSjnD:3XWM=QT.K(X4'p*Z2h?uil$a4@tr8E/kHXNP2-T3Oj;adkI3omVFKb9^8/k7%6Ob=F=t\nE9pQQ:idL:)b'Y\oG/Xk"?_(B[-2[;GiRm^3/Z^"YIE"P[c4ItF6"NBb63gW#jnGPchh@bAaf2s(,Sl9,Br7Lkdp]pNrU6[-nf:M4mb"RC@?f'@oqh&F1b\(omuH2!%rDeB1lH8-@bbI]C!dt$,uJD&:GhZa$bAseSOJD'FHfkqrqq;Zr*&G*4<~>endstream +endobj +xref +0 8 +0000000000 65535 f +0000000073 00000 n +0000000104 00000 n +0000000211 00000 n +0000000414 00000 n +0000000482 00000 n +0000000817 00000 n +0000000876 00000 n +trailer +<< +/ID +[<98463e78e9d8130117e49a2c824febd5><98463e78e9d8130117e49a2c824febd5>] +% ReportLab generated PDF document -- digest (http://www.reportlab.com) + +/Info 5 0 R +/Root 4 0 R +/Size 8 +>> +startxref +11685 +%%EOF diff --git a/setup/generateTabletopPDF/a0_aruco.py b/setup/generateTabletopPDF/a0_aruco.py new file mode 100644 index 0000000..9ef222d --- /dev/null +++ b/setup/generateTabletopPDF/a0_aruco.py @@ -0,0 +1,374 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import json +import random +from dataclasses import dataclass +from pathlib import Path +from typing import List, Tuple + +from reportlab.pdfgen import canvas +from reportlab.lib.units import mm + +try: + import cv2 +except ImportError as exc: + raise SystemExit( + "OpenCV ist erforderlich. Installiere es mit: pip install opencv-contrib-python" + ) from exc + + +# ========================= +# Header / Parameter +# ========================= + +PAGE_FORMAT = "A0" # z.B. A0, A1, A2, A3, A4 +ORIENTATION = "portrait" # "portrait" oder "landscape" + +NUM_ARUCOS = 60 +ARUCO_SIZE_MM = 25.0 +ARUCO_START_ID = 103 # 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 + +FORBIDDEN_RECT_W_MM = 204.0 +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 + +OUTPUT_BASENAME = f"A0_{NUM_ARUCOS}Arucos_{int(ARUCO_SIZE_MM)}mm_Seet{SEED}" + + +# ========================= +# DIN-Formate +# ========================= + +DIN_SIZES_MM = { + "A0": (841.0, 1189.0), + "A1": (594.0, 841.0), + "A2": (420.0, 594.0), + "A3": (297.0, 420.0), + "A4": (210.0, 297.0), +} + + +@dataclass(frozen=True) +class RectMM: + x: float + y: float + w: float + h: float + + def intersects(self, other: "RectMM") -> bool: + return not ( + self.x + self.w <= other.x + or other.x + other.w <= self.x + or self.y + self.h <= other.y + or other.y + other.h <= self.y + ) + + +def mm_to_pt(value_mm: float) -> float: + return value_mm * mm + + +def get_page_size_mm(page_format: str, orientation: str) -> Tuple[float, float]: + if page_format not in DIN_SIZES_MM: + raise ValueError(f"Unbekanntes Format: {page_format}. Unterstテシtzt: {sorted(DIN_SIZES_MM)}") + + w_mm, h_mm = DIN_SIZES_MM[page_format] + if orientation.lower() == "portrait": + return w_mm, h_mm + if orientation.lower() == "landscape": + return h_mm, w_mm + raise ValueError("ORIENTATION muss 'portrait' oder 'landscape' sein.") + + +def centered_rect(page_w_mm: float, page_h_mm: float, rect_w_mm: float, rect_h_mm: float) -> RectMM: + return RectMM( + x=(page_w_mm - rect_w_mm) / 2.0, + y=(page_h_mm - rect_h_mm) / 2.0, + w=rect_w_mm, + h=rect_h_mm, + ) + + +def expand_rect(rect: RectMM, margin_mm: float) -> RectMM: + return RectMM( + x=rect.x - margin_mm, + y=rect.y - margin_mm, + w=rect.w + 2.0 * margin_mm, + h=rect.h + 2.0 * margin_mm, + ) + + +def get_aruco_dictionary(): + # DICT_4X4_250 hat IDs 0..249 + return cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_4X4_250) + + +def marker_module_pattern(marker_id: int) -> List[List[int]]: + """ + Liefert ein 6x6-Raster (inkl. schwarzem Rand). + 1 = schwarz, 0 = weiss + """ + aruco_dict = get_aruco_dictionary() + img = cv2.aruco.generateImageMarker(aruco_dict, marker_id, 600) # nur zum Abtasten + modules = 6 + cell = img.shape[0] // modules + + pattern: List[List[int]] = [] + for r in range(modules): + row: List[int] = [] + for c in range(modules): + cy = int((r + 0.5) * cell) + cx = int((c + 0.5) * cell) + pixel = int(img[cy, cx]) # 0 = schwarz, 255 = weiss + row.append(1 if pixel < 128 else 0) + pattern.append(row) + return pattern + + +def draw_aruco_vector( + c: canvas.Canvas, + x_mm: float, + y_mm: float, + size_mm: float, + marker_id: int, + page_h_mm: float, +) -> None: + """ + Zeichnet den Marker als Vektor-Rechtecke. + x_mm, y_mm = linke obere Ecke in mm. + """ + pattern = marker_module_pattern(marker_id) + modules = len(pattern) + cell_mm = size_mm / modules + + for r in range(modules): + 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 + c.rect( + mm_to_pt(cell_x_mm), + mm_to_pt(page_h_mm - cell_y_mm - cell_mm), + mm_to_pt(cell_mm), + mm_to_pt(cell_mm), + stroke=0, + fill=1, + ) + + +def place_markers( + page_w_mm: float, + page_h_mm: float, + num_markers: int, + marker_size_mm: float, + border_margin_mm: float, + forbidden_area: RectMM, + forbidden_margin_mm: float, + seed: int, +) -> List[dict]: + rng = random.Random(seed) + placed: List[RectMM] = [] + result: List[dict] = [] + + allowed_x_min = border_margin_mm + allowed_y_min = border_margin_mm + allowed_x_max = page_w_mm - border_margin_mm - marker_size_mm + allowed_y_max = page_h_mm - border_margin_mm - marker_size_mm + + if allowed_x_max < allowed_x_min or allowed_y_max < allowed_y_min: + raise RuntimeError("Das Poster ist zu klein fテシr Randabstand und Markergrテカsse.") + + excluded = expand_rect(forbidden_area, forbidden_margin_mm) + + attempts = 0 + max_attempts = 200000 + + while len(result) < num_markers and attempts < max_attempts: + attempts += 1 + x = rng.uniform(allowed_x_min, allowed_x_max) + y = rng.uniform(allowed_y_min, allowed_y_max) + candidate = RectMM(x=x, y=y, w=marker_size_mm, h=marker_size_mm) + + if any(candidate.intersects(other) for other in placed): + continue + if candidate.intersects(excluded): + continue + + placed.append(candidate) + result.append( + { + "id": ARUCO_START_ID + len(result), + "x_mm": round(x, 2), + "y_mm": round(y, 2), + "size_mm": marker_size_mm, + } + ) + + if len(result) < num_markers: + raise RuntimeError( + f"Nicht alle Marker konnten platziert werden: {len(result)} von {num_markers} " + f"(nach {attempts} Versuchen)." + ) + + return result + + +def main() -> None: + page_w_mm, page_h_mm = get_page_size_mm(PAGE_FORMAT, ORIENTATION) + + if ARUCO_START_ID < 0 or ARUCO_START_ID + NUM_ARUCOS > 250: + raise ValueError("ARUCO_START_ID + NUM_ARUCOS muss in den Bereich 0..249 von DICT_4X4_250 fallen.") + + forbidden_rect = centered_rect(page_w_mm, page_h_mm, FORBIDDEN_RECT_W_MM, FORBIDDEN_RECT_H_MM) + + # Neues lokales Koordinatensystem + origin_x_mm = forbidden_rect.x + forbidden_rect.w - 90.0 + origin_y_mm = forbidden_rect.y + + placements = place_markers( + page_w_mm=page_w_mm, + page_h_mm=page_h_mm, + num_markers=NUM_ARUCOS, + marker_size_mm=ARUCO_SIZE_MM, + border_margin_mm=PAGE_BORDER_MARGIN_MM, + forbidden_area=forbidden_rect, + forbidden_margin_mm=FORBIDDEN_RECT_MARGIN_MM, + seed=SEED, + ) + + pdf_path = Path(f"{OUTPUT_BASENAME}.pdf") + json_path = Path(f"{OUTPUT_BASENAME}.json") + + c = canvas.Canvas(str(pdf_path), pagesize=(mm_to_pt(page_w_mm), mm_to_pt(page_h_mm))) + c.setTitle(pdf_path.stem) + c.setAuthor("OpenAI") + c.setSubject("A0 poster with random ArUco placement") + + # Weisser Hintergrund + c.setFillColorRGB(1, 1, 1) + c.rect(0, 0, mm_to_pt(page_w_mm), mm_to_pt(page_h_mm), stroke=0, fill=1) + + # Rechteck mit 1 mm schwarzer Linie + c.setStrokeColorRGB(0, 0, 0) + c.setLineWidth(mm_to_pt(LINE_WIDTH_MM)) + c.rect( + mm_to_pt(forbidden_rect.x), + mm_to_pt(page_h_mm - forbidden_rect.y - forbidden_rect.h), + mm_to_pt(forbidden_rect.w), + mm_to_pt(forbidden_rect.h), + stroke=1, + fill=0, + ) + + # Koordinatensystem + + ARROW_LEN_MM = 50.0 + + # X-Achse (rot, nach unten) + c.setStrokeColorRGB(1, 0, 0) + c.setLineWidth(mm_to_pt(1.0)) + + c.line( + mm_to_pt(origin_x_mm), + mm_to_pt(page_h_mm - origin_y_mm), + mm_to_pt(origin_x_mm), + mm_to_pt(page_h_mm - (origin_y_mm + ARROW_LEN_MM)), + ) + + # Pfeilspitze + c.line( + mm_to_pt(origin_x_mm), + mm_to_pt(page_h_mm - (origin_y_mm + ARROW_LEN_MM)), + mm_to_pt(origin_x_mm - 4), + mm_to_pt(page_h_mm - (origin_y_mm + ARROW_LEN_MM - 4)), + ) + c.line( + mm_to_pt(origin_x_mm), + mm_to_pt(page_h_mm - (origin_y_mm + ARROW_LEN_MM)), + mm_to_pt(origin_x_mm + 4), + mm_to_pt(page_h_mm - (origin_y_mm + ARROW_LEN_MM - 4)), + ) + + # Y-Achse (grテシn, nach links) + 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(page_h_mm - origin_y_mm), + ) + + # Pfeilspitze + c.line( + 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(page_h_mm - origin_y_mm - 4), + ) + c.line( + 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(page_h_mm - origin_y_mm + 4), + ) + + c.setStrokeColorRGB(0, 0, 0) + + # ArUcos zeichnen + c.setFillColorRGB(0, 0, 0) + for item in placements: + draw_aruco_vector( + c=c, + x_mm=item["x_mm"], + y_mm=item["y_mm"], + size_mm=item["size_mm"], + marker_id=item["id"], + page_h_mm=page_h_mm, + ) + + 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 + ], + }, + f, + indent=2, + ensure_ascii=False, + ) + + print(f"PDF geschrieben: {pdf_path.resolve()}") + print(f"JSON geschrieben: {json_path.resolve()}") + + +if __name__ == "__main__": + main() \ No newline at end of file