From 6579673518ed9b30c62ea19cd7a8f6da93d2ee80 Mon Sep 17 00:00:00 2001 From: Davide Grilli Date: Thu, 14 May 2026 11:11:35 +0200 Subject: [PATCH] report_completo: evita la rottura delle tabelle tra pagine MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ogni blocco (titolo + tabella) è avvolto in KeepTogether: simboli del modello, campionamento e parametri per induttore, riepilogo finale. Co-Authored-By: Claude Sonnet 4.6 --- report_completo.pdf | 42 +++++++++++++++--------------- report_completo.py | 62 +++++++++++++++++++++++++-------------------- 2 files changed, 56 insertions(+), 48 deletions(-) diff --git a/report_completo.pdf b/report_completo.pdf index 6bcecb7..e458ea5 100644 --- a/report_completo.pdf +++ b/report_completo.pdf @@ -264,7 +264,7 @@ endobj << /Contents 44 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 39 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << -/FormXob.2d36cfaf1d7a727fbc9dbe852c81696d 27 0 R /FormXob.6c66aadaa7b2a17e486dde038bab02d8 8 0 R /FormXob.7601099d9335b106ed93832e9814b04a 25 0 R +/FormXob.7601099d9335b106ed93832e9814b04a 25 0 R >> >> /Rotate 0 /Trans << @@ -276,7 +276,7 @@ endobj << /Contents 45 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 39 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << -/FormXob.54163c3782757071795d75694983e8e8 12 0 R /FormXob.58fd9065da41fbda427556a0c89d6ce5 29 0 R /FormXob.e029775049c7567a15a2c0c367364dfb 19 0 R +/FormXob.2d36cfaf1d7a727fbc9dbe852c81696d 27 0 R /FormXob.54163c3782757071795d75694983e8e8 12 0 R /FormXob.58fd9065da41fbda427556a0c89d6ce5 29 0 R /FormXob.6c66aadaa7b2a17e486dde038bab02d8 8 0 R /FormXob.e029775049c7567a15a2c0c367364dfb 19 0 R >> >> /Rotate 0 /Trans << @@ -301,7 +301,7 @@ endobj endobj 38 0 obj << -/Author (\(anonymous\)) /CreationDate (D:20260514110024+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260514110024+02'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (\(anonymous\)) /CreationDate (D:20260514110619+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260514110619+02'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False >> endobj @@ -319,38 +319,38 @@ Gau0CgMYb"%"6H'n?Ep/> stream -Gb!#\95iQS&AJ$CbcPp4XS;ZAd"@h+KaPjqCaJ;]5d2G6"p7Fr,g&E)rqOe0'iHe542'-u7?O+2S]<\HbaJRO?WMV&$\1GgE-B'JEL=t#8KqS`$#_.)i]9@k.RB:5!aam23l(+$#q^:o8@'m"\)ht+iZhCh_r=t8KXJgpR1%N[)oHgJ0Ob1Ak%U4/F%A*SAOV_5mn[B_)(%#2rqH3bV>P_uF\oOWEqFtT\FJS\K&O12+@^l!/Ih&QGAU?FXUH1HFd,m?me-N6K4=5+U9rN"?aeW7qjuom!-^b,aHf7sYO]4oJL"U>gqu80hhNVnp9WF5Uo@^SA[VLeHnA1YDM4_pTi-O/(Kobd:4M"+_nL>"&B^!hFe:BSKN/ePA&JXW-UqcB'G[d6_T6\3?&bnKZ\s4EpcG+2FK3QD#FB[L'b`Aj'?/dl-\fnZ4e9IUI)m@?%?X\\]lZ)]'UE1OR;UG]\<7>Q=C7>P$#'C]WQ$k&e/to*[YA@OYpd\ph%c0/:a_4$`JMJh;[mt?1goss``OoLXJ!%pPD!)6jA56r8furo/3=?E=*5Of)IR5RkriL!FIOkZq)n+2V^lQJ2!cbZ:sT\n`P=6[[P;>mJ(]TgAOqG2JPIYb$*-uh9cR.V@C+H6CXWKSO#jA)#.WckjccoN"g$\Mg4Na+1TX'I?6hsanFJc^5ML"7`hKO(NbeKkZ_6Wa1Gr:+iMoY[p-/0+9Y"d_?qmJ3TYaJ&Pk**D,c?P!/l@?(l&1sm4V.&CYiF=2Zdq5qjc7592DIRrR2Zo(($b48m=sUseDNpiL)5gB-[$/dm@)KfsEf/$tZ?3J9e.?q-W-Qr"[5?_PC7d@M/MD=$g1Q[IgYJU_mEL[MaHT^"UJQQ`=-62_UU)XPB35b\%bq<<%&jK/gn5Ji`3t>DAHd&\Ro:DV4)"#u6I"`!X$N**nISLFuX*e3gGaWGhNlGAXdg(>>@Z,5LYS;=bS<^n+#kY0n[C,R+PdZT^b-?(gLQfYd1X29:oKJeG-5Fb/Sfn>/?,M^5\\3!h'fe$_$N5Y:q4Ph!q,>bJPIt\Bd,XMK,BP55]Fk0GG2t"]O1cQF20Fo=9TrOJXtiX?G-7/dL+-T9)46Nu6)E4&L'@Qeh=VsSgCU3:F]VM\eTQL\3auj3>o)+uJjE<2bX*^N1*-K5R('l.*_`U5Q[!X"-W&S161UI:?OW/I+VBI&a/AK*@K!1.M?4b?Cma8Fcd9hTEsaB_b!,Y:sP^bSWS7)E'ai>p8,'[:Nf`OP@LJW8&r7.8_RWtU5Z'![Y:n5*`\=!S?]NIkQJ@QpdRS\dG#Pe7\$)+XTu&3(qKgJk:u1LU-?!eYNaJ?p`V%L+or_JI5cquW@uOr*mEO^'eG,2)#4N.2X*PmR]4]oR\;;YuN"q*OBQ]*?FLUj2299hoK;kO=[^`LUSEuI/N[t0.:Ok_Y!PD0R6.<)5ga6^c:+n+r#,*KskDu4X-2:S9,Lc6rMW^(85]WFNSPma)1\qaY*6D]1B#(e5Di$529J^p^/8&bM@_Ufq;nq+-+uR9\TJ0")0@%^CE%^*94i'Qa`#Fo!ml#AKe16/A:*>4+C%V_\nhJ_VjK^a%-%?~>endstream +Gb!#\8T3?Q'YaHG]NaKj):-#2keVE$6A8ns[M&4?+;g4cK7tR#''16*Isg-m$RqL,P>c=#'PH:8IJLkk./pOC1Ka_U0nHZ(#)pH1###X9P:Ll>3Vd^4C.^jMeXB&`aq?1k_K34](hHGu+IjCMn0p1O)MEg6?1+HE`d^iO0DZ1<-*U1Gb_d/*(Gn&]0$PoGn+NmZ`GR\jhiN@rdi1laSuAAIORKGF:Ha%JK1fM4:6P/5VW+:&O[-`USWOtkH:tfdZoA.WqN_Je\-61Al,RW;3^qRjNBI9A5?@B$udj6KksnFodZS\,Y7JPbWX1f_aB70CHn;j6^mj?=B=Ug_q+sHmRKhE(b.FgIZYrUrq*Z_2sabh"ej`8?1SpI6s+"d3C\t3F^Tm26rDnm.eF.Yf%#%gEd!kS(OtUHP"q:1n_b$5X^YaOBVN#+o#/mXU8Lq7P7QoQXt2\Qc-=XM4pjfZ'Ue#%FtYCV0"&c:Am"h@)&.$&_g!)W%V[pr,)-C;fDVV?i63Sk&fnS'=f;F?/3!9eSO4\u%Me-d*$fWY;MJ:VA\cm[4A`;e[/KYZ!c_4LGDg`F`\7/DKRUI'Li2e!%hdKO)aHCHGUHND6?Rk:k5Z@=?YV0$?Vj.U!e`"1Es"PCu!Z9kq*!>$GQK)T%_!ish$L"1Dr3[%pllMN'QKO-,Bl2OfDCVDWG)!-mMbj:rr$n)$tlL]&;18i[3-6sR4\,#L'G8c(W@KZV/\")GSf;9`_`^!K$>$Rtmf\*^`ZR$6157RG;-*TAm36PO73Ra]@:i^+-EWp(U''>sF(i#RC*kgn,4He>m,^O=AP'3:tP33+L_S7>EU3r;s5$JkCY&#nY`8G,^J9@U$'H,a4-AZnV6s?3K[YW*d\N2Kt>89e)]&EX,PI=an7C.0LQ=-!uMn3W$K"!YeXVi]0:ml)kusYmg<'"D\kC1@ns/7b9B%1Yk!bLks:<>eX9_P#@ShU@-P]u;f/?k9p@mpnI36W)%2+R;N\Pb\;NKP/$s%+`8L#aZG#iHBi3`lGL&5>[,E6R6c-&p+_q1GC#UC=lN2"MGVQ(oG.SNLhQ9*`CVg[s?PKU8(0XJ?Wip(PDa3&_SR7Fd4?:.pT>M\[-!-n7DR%\b21s[J>E4Nr-me_;c``Jeh&%JWDr6O-cJe?VpA/Bf/O.$OU@6K"ZHr5fniCf=9dp2>(N<,3&tn%gB%&Vo.>*TDNnJ>nVebKg-GnpJ5,,Q(We11/_j`;;O\&*0=d$\7OIHT[ZXU[!e:Y'X)U\EV%5ct+]6dfPF.F,l^9[J^"Nbj]5%BJD/ITCq8bbD48-=r1E(Nofa.!s&mE@!Vj+PQ(W?X51r~>endstream endobj 42 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 1682 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1679 >> stream -Gat%#gMYb8&:N/3bbGiel^b_-hcsLi'oj$O6i+b1GB7^R*;)7CC"/?=38f3_da3lrE\b%aO+qr8t7d]:']%F+`/ESK^dO,F!P"]o!Zo=DtS4uh67-[2HE*5m&l18Z8)WluE7HT\O.ok(X!:U2c4>Q4km1)K6[.;"CF4CWF)VBG.XJ;0Vj<.&k>1+WEi=m;K10D1:`UVCY'omjf1@D!H%@h^=/2ogqB8!*sD6Zsr'glWAg94mlYBtF4?A2"%Y9G9]3722*$or6Ak@Z;)q%P_qQ'Iiu*R)76m/73,4Hi6jU!/k-/BI+bbZCLn,DaW"KiS[0Vs>V_PhF5QJ>X'^,gWW9hq=31ZT?aUaj[l2bt*l=EJ[%=Qe=:Mj=be`c?`s4P%cA^&OjC_!H4Ik1c`cbQbsO4ReC_2S&C[*dLbbM"LOS;-;?9Kh)rol86q_&Dim[?MGdPV^,sL`.Lo7kn;Cf3p'"$H>=*#r,fil6$_287SJnl!f*l$GhQi6T$Y\a-l[.F+&^uJ]s;hp':[$r;HAobf_A*.@=^?=QJS"JNrAugOs$f'MMoc.EY_"NlmpdnF0jQh;RP$S??2aUmXs6$(=Z@B*iN:Y6!]W?J\&6-A4.H:kYh;)j:OGS!u!EFbm5T9GSQ2Dl>?g!qgD183>ibdmPM`i@!Dp4?'(hZo>)h4PbtK$(JWiENX_7_`1jI0edj)LZeE,qM!AV?'+$*Nk4ZL'I@QhH?`-9a]C^4bd[Ktk2=6lP:qQi>"ug/$jLlF_DX-Ipg_uZ4n+K4SC77D;i7R!c[%j@p;F[rtI`,"@lqMDo![VPZHdg`iT'>of#6%,=:T=,-IY?ggLb0_Ue/4*$NC`BOUf2W_\9:VDn\Z]c7%>THbI."tBh@E>_T\qd)PWhFMY^pU'L'*#@qb6QZ^OWQm`8>paD/4+b=?W2LfHkVFV$Yk]+ZGfRh;)#68>6li2U^%ICZsM^R`5`G()51LI_'RDV22``6>M\=,M4P$5t\$eoI_`r0Ghq:18>=n8Wbo%bGn8[s)>iidb3$g_31mW:jYC)E"+,NWB(\V<8?nSG*`,Y6N3O6)FiVrQ^hf+YgB!bM3,Y3'F_CN:hH^FYb[YQ6kj!5X/jP'&p+(gTsrQl9sSOkWj:1obi`HArquKheZaOQmri^H9oTDE_43HVMPu*I;^^7_VkSrd2b16]%=aslUCR)-($#2ohb2SnIDG*`:tHu#N!JSCtWSo;!r'tDJ3ZY=KC>GfcjedAcAI'DVo!qps/UU$fuaUMFK]-'W>e<3!25J(ejo2hRQnX~>endstream +GatU3gMYb:%"7kOn1cMVa`-[SDr)`l]L\7+EJjuYq]JOPTu+69>O;L.If+5.ZQrn0@Um?^7Yg'oO@)nOS3C&(a(p4_kAW:E5QUI&TOJ8jGAoVcI32mW["^SN:k?$CEJ^.FkV5GbhB4KqXO;3UL0LQ`qfP:fYr*b7^*XKpOI%;)0Q;%/rC?LKjdQsIF9V!#^/t+lR"'baqdBDc55QoS8g^*P@&.F9#ub\,)TO\$^-YD%_DttM2S,@(K``S^m#4JtB[Lg"Z!O>6O^VP+k^:::MlmhH$,DW*aq0[a@,f[b]#Jd)K#4#go"7'!62[\gt(/<1FLfkEnRdqi]E&S8O8Woeh?a$S3U--G$hBMd=$MF5c-Sh/P66,BK+>I5L^7jtS4Sm.9=K]m>U6JoiFCrsTr&N)jkcP>&f$17@JKM"gi`imJ,kOlgc==V@pS'`qBZMXl,[rQdCf2L(C6_0ARm?o'38=Td<_?cD7oF7VCk#%Lp>/PDG7SueBA9Rn*UW?H9sJ,Jr>hE/J1.^l[2c%Rt?N(#"?+Pa\OT7It`cE$W!Ue.j#E,2F8F@R)dWWBiMBCS=r8g,19<4%%H;$H`su/K8H2D1DTpK#jC4hImg?=Ga=SGU$aS?@_fc$o`&br0gQ-n0PW##YJ;-C47-JM@71RiT7/e+n*=#d[XtCi`4JfjDj_-`*S`Z?D0>8uR^E@L/`?ZS"Wt2#15k`Kg$s=""!\g?1nlnbM'3+4"[e^nL'L1FI97c?qIGEjP_ht#A8k+_0gV_]iljZel*epf%%esINUntX/F9dg.*^qleRPJG"46/mO,gOO(7S^993Roh!\9:VDc+uH>+q/J&ERB*M[%pVolnW<>L-0(RoXLL;KF]'MoN+o-XJQ)T#P&Qa=jFBAq-ZtF9\8K*_qKlF,=o3GLPC(CF5Ilm*IQqTm<1(Ol/CDuk+?;KE,\1EmQqRR-tY;)[VT$S?QSXTpJ[I)a*5ue4L#d9A,U]q!c",U'd'FjeD%+VZEJJ":[4OK0Ya0,S6h7bnh@\*(oe<`e10IL3)Y14Zh\1ZGf_rIr!S`(58eFs;;=k+ba(Pl^-Z\VR8.Xgb,/b<$qHg/gM4+k]VKS5jY0Kj9rM8MdSfc/cVG'*]dLgHYrhOie7?`o4+_KSUN1cE-c0'd^.F[E-7cBoH$Ob$agXDtI4UWS@29`*r[FRN/`@%Q046L1&'24`@/~>endstream endobj 43 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 1642 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1675 >> stream -GatU3gMYb*&:O:Sb[Xg!1l$9=H?1OJ8<_VEMg`[),"mWIfM3G7$O$@s4/=Kk'[(ZDA&L.E1Ge+Ni=(FUl%ALf>lspYL[cYl$CL",MCFp"_8UfoCP3GNEor#M8_E/G,`)<;m]BD>F;X`d!t2p-.CoQ3Q)HC"O\,A@YaV;?W^\7,J&/m))rV9W\d?oZAsE:P=.,g1#9=attt:RHXui<7b+#q]oepZ,bra]_dfJTXB9(K$%Q@_+$qM_u3LD74^]*Zbe[Y07F\irYfqUFc`d@@+q_45P0mKIE8?_nJi5>sC!Kbo.?$4?fsW`?E)jc_:RNEr2("Iu]m2W"&"53[I@?b`NmPLY8R;M=^1>>g'T>VUbk)`W=rakFHMiL2.rU]-1ao#,kN4OSW,_e>`aEAuu)KPlp5U\`==$BiL5/`_YonRJNRrbI!qK6jIQV^c9jE_F`hP%0@3[.SW]Q30@8kY;W9"#MOh&O[g_?TZ!%P?dB%8Nhir$*alOUmuB<;Et!)N:-0Z=1Ei;@V]^t/RS."^,Vn>KYB%j#I(A)bs'"(5^HdG@"Ju(!gqQ(N@)0U4d2kU^HdTOubTpU4e-X;99,%:#6H_#?-Jr5#>D%]sRLCFQF6)B02NakF`Kl)*86kSApXaj5c7lB#^$LK]q-S)%E1G`A6*V(nr6PUQo-.kpjq9g[+SjJ\)SSQK(WoT'XQte_=6Dak_a.@3eA*W;(JPS7bX^VMOM#3q'Ma"5[(j;i-mP7`;\(-1-*mS(*fN=X8j;(CAeh3O;gu>e9gnSr8<'7D+O`WioI'.^f#dN8g]a#a0@sVE%Ig)DX?C2&YW=OC:LEa7*pDZq[J9L8)*#QB1>47ca#7O`B?^eQhp7(pF>37&2r1`_*!Aq>D?a"=GB&A^)nhcFgVcr=1O/Z+6Y%It3%Zrp+Xr:i,SKq8UXN(YespO.1ONY(:`Q;73rihHci4\ST]8)cZR^TI'iO5YYSpC9hX`eF]"K,KbuQ;lY?AAqUZ;NJZc2DY-2GK#c[QTVg*;%GhMheR9QYQSbb@^*uF\cKq79\5gI1EMU0`BCjU1nW\(tp]k2m]eJBWjg`#Y0cN'>:-Bm(B3J~>endstream +GatU3gMYb*&:O:Sb[Xg!1l$9=H?1OJ8<_&5Mg`[),0PZIgI`J4$O$@s*U4D3Z#"V',IU18RA%nGcHlie?(=&==#0C&4'K>Gkm+I7-9(#pWlmV@Wfj(Em;pE&-81an@#aXYO"S&4c',1ttFaAl"R]qn`fi\>J9:D(X:=6m9J`TDm)."%GX'H;!NO%=>I6&T(I?sj_,A@YaV:g9YJpII3TLDhm\%&bPGTcJ99=-![nnjkb(/AhnPgH.ZIu@@\2JHTF!N[O*^5,Aq/uG-129d7\Z?.40AVMTM(\"dND*b*%G+!62j*auuLm!$Hm+W5QlfWDr/N!.q]ZJViKU&,t$Pqgs2uWan0e6'>dM&T`P3SDZ3G8r0:EqnHs4615^ZChP/%@)FG^H$+VYM16L"PdIPhB65;8#6[CG!o3?6GZD(2-Z"TQfKBLIf[_MKIT;BVme'S7t9%M%86WJ?]RA:J8RDcf^*P8((Kb.p-HV^)AU.5n;=W#?hH]UpK.uUiB(Lkt@7/-Cj[-YoAZUZgIU]m"$`)>&['cV=_kR;VE[mf@EL3QV/nHE1RM9U4m$O$MBFB\i<9UKS&2\`W_nk@ceR@;rUI(q][r'0i><6,5WK,[#&g8Yt2BH&((Iq$Wi72(V/&ZX]/;/eW*3I3SY"[cOQ)l[NkqV0Ys=7BDb5%gNZ%:5NJYBHYZ)-Y9*R"(nn9IA1XhrRbGJC^\b:Poq*.4AS%6=Z^TG)_K4j=p?cD:C7o.Eh-;ob2Eq/PZC2uIkl$RM/S\Q88Yq+BgNM.*7[B4EGhQHu5N,4::4eTEsCT*C@SS0Ph!!41a?!Tu&TonA7U,0=rlWY^a"4M$p]T]rjGLTeJK5h$.=/0fl3!3kH^7QdrFHbkO93)IF13rZ:LQ@.05'2\=PCJG'1Jfb0gIW6@IKendstream endobj 44 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 1652 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1237 >> stream -GatU3gMZ%0&:O:Sb[YgI0HAs&[ksGg75igEhF3!m&$dH6['6C.j(*_6+5\5Q.?\Q$BcA:_8IfAmB+>G$"AU%thrt4#f*RsP,+sJ.$rAY^P:O/1N.-_)D.u"O`h3BmRX)%nc(e^D-.>K/BI0`f.*UE2kiB$Q0)hfHbSlMsqoh^4VoVS-^RQ"KGGqBD-#d1MDX#W,At!BQ440FSJ$A`RIN),gfHs&1?Vj'%>g,]kCliG0]s]a[al)Bgpr5S7K+JeNM\Y;KO&_U7Y=14mIt>60Z!+;<>\;<_[1VXqu5SK/i)h<*:ph"nlrk4T>G,9>a19P_(Y4C[I17qX0'p'c#a.b&I7:*-sXn?QH65$MnF]b?&VtfSUfkiiLQOnm^\;dXUm0D4`hM%gNZHOT+'B>O(fh9kCr8]\!!?"?!>K(uI$(6/.AA57:9fPZji:IHM'MfDn4()7O#OUacc:I>a;%Ss]r/Vlr$g>?K@Ib3mW-mc4;Y"^aaIU;*Y8>sSlE`F*2X*-%9a"EJ@GP_>'@TK-[6mq!$,gJ,7CsX6kIN+CRs(o3QGUkMVk&;CIGdj=>](qh$a'uLs,%bJ<>0R&0Y;8GGAq4"7)5("nJDSg:LIc8l*GJ=[Uf'm%O+Va$"h"X8M9dV_E8[9VH;j!`tPquR/F6TRDP`*aCCtaH?i)EB;%#mU71d_ln]#GS9Fo^(L9U\3N@2kS^P?Y,7P>CH(%0cRR,1r'g,<+c?B8MW3P??'_EGM@=00`mYR`>7dIFYLTfM59HDS;[g+-Q_m[;0I$r6:PV-.'4=uJuJkpZ\-K3SE*NTtrDcGSb%oao]T*R&Cn$F&uHib$VUr(lUUEl[W,4$UMQmhAaI=Vb&ch7Wg8DLVVVqi#aI=Dl'PF#Hs^>.V]pmMc_eS`]afs#$ANZdb)<3@endstream +GasaoD/\/e&H;*)E?EX2Tm7oE0Djn>n_bQb)Fl:bD#<-MEhU@91<2t;@R#<3b*"'cAMIY^jRG7eF3bk\+SgZSHbKRV21sj)!>T,Q5U-\Jf5QuarYaYFdRiE"70A2gJgB?(]PL+H10Q%Ujci#A\#=r<\6?)M33SqH&uVB+033uIlcG&j%X"'S'^C1p7LYh"-*B9T_S:4%S24JnYd968eMiZnT+=/(ZXME!!Rj$j^;>0+Fej?b.RXTba/&X0[65io`cc)j3)%5X`LrK'2]((G$%#Z+qQm:r=6.%OM-Fm5!2bf+s>p:E*DKCd+pF*%IFQ`@[%]\K&C\gihs65GnVDTH(X5$Rg`QmJ5=)GS9m1D.GA-S=i:>F(uh21C`rq^*rAShiqN:_7p[kYUHXb/iDXkLl;lfrVg0FR0_-gF,sZq3TctoA6b.(Yosi7O!N*U@\-N%I['eVaQq'fZ:CFHi072/gB@jCJ%`?0M/F]T@@.A@TGgn:KauTnmWY[Aa3p,Y**Gdm0C^8Z25npQf#==UJS.C2**j9%H;-RbN$IX;oDRMklM?P2G3lnb(00&,%7=mGZ//m#UQC=(6elp/?Q<8;;D>A>$!s1\Q/1)gUS0nIMJaG-jY0%'Y%_4,8ZZUd7)T5\GC5m4h@&s,TC#b7W:#Xi`bsX(JE!Z9#-4dMBp5<\rSqa@CZ1@A675UP7JlThbJ*-pL2Si=MroM8#?eYbq:7#V3D8T0CU:X.R;,dE76[u91`a+ZhhB&F:DIOFMa[/8Fj'e/,#%CU6p!8ams^[bU`IQcf_Y0lZcQqnU`a64Ua/78OFehm9L'sRspTR9iBWW'ktKfiWd\+?quXhS[g/&o+tQ(3sP--=0HN)C#9Aa+@ZZ[kkDP?\REL)\N=k02/5/98$R4DNUQa)Ok01%A%jA6@T0p?Bm>la[j++C(<2-^,53;]4QCWEJg%X1_I2jT'N8;"~>endstream endobj 45 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 1266 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1610 >> stream -Gat%"gMYb8&:N/3bbH,mURf):hpfRO<&f%Q1IZl+%l?]Y$nTf6R04r7nXWsJ%&mH-&JE4A\a>e@1EmBX;>Mk&!5E%uSJ.*KnD.=5q!Os*Tek%gT/7Zg1b@Jf*)aH?0Np0)$)0c"tmuk[#Dog:QU!ZlqNFUTL7S2-E"jU&(7``$>iQg.RE9PU9W_4qR+GS9aRj-RWA")&!Vj*W;crg.:dDC#TX7A^u]*I=boCIVlX4,+4!1q"TrIe8APT@5r"rq5[pP\+A^,R!0$"-^>r'io:WI@>Fbm-T6g.o`3*PBcopUk-o4RM'c1B#CfOQ?.h@2/!67RD=`)K<`?[I4R)<;OYE@pEk`5S=cudE'GZL@<7l#/74q:/rtu3JGqm";7]")aB"Y5E51a-[_7]'ZPLAog.tr,a#F1CXOh;1l@]1JjIE#11O0-\D&>`6VKY9fju.o@@GSp4qU0DNBbdNmPGH0cApbb;rYr-dgeKag7W_ACqqa\8T<>\>%DYEl^$(G,aeaL!!Z^V+LZJ"n[#5>XGCE3)G3//EAAGFNQj>k/k;Id>F)`DoTJF%%H@I\LFo@rBOmCl_K`iNe=)'_:&]?Dn&`Ch?[i*Tm3HpnTU?oX0+7[J1ZP0?(N>GATZM/%5u*VqQ/$/Ti^ckdeU>c:X3=]oQN`I94n,*,O?41NZZ%B"D\KCi-1W>*d@$9^;0h>[RVmC`rn;Sa\0oF6=DT"-+V#;qHs(1FE_WGoQp-+N!OIK/2;&9[G19/LHr2g7IBhnnB-&Kg-&<6X5C54(iqG7A7Np2_F[l1nVqY-q>/IBCua;'^X=o$_0DI>Drcn)V7Fgo)bt_2T'3PQ(Vfn3%`~>endstream +GatU3gMYb:%"7kOn1cMVa`&l&R=4\h;L"-.s5N%)MR`GZoabI>a1`.TB/D<9N/MrQC,5$.CWQX+^=$aWmi6sb2B?@L$NnUg'HrMM>d\Zf`I*g_?I>W`$oI'1XTO26$*eY=[t7eG_*MW@l6L!)NN4_-AU]0FrXjNTYWA03$EotY(_d!`^p6GH;]d,9uPUK0ESqoB"rsa]^FJ-n6.CN6Cg]u8u7kla,>/di]6\_#E(/e^mVr?7Kj[79*2YGeO>7PNjgaePcDire`A-3#A'kMU)pmJG%nT=G+`4Y_YqM\P0DYk4eiNks6e]o[XSTO(Ic((V*`?Z[t%bD1L@O'CJ]s%.!0C\Su]c*oO1*ao54!\1Pbb*q#-5XuuGE]6cV9=+YdlmbSH'E=;Z7OGp'm80tM@/qA,<)"_;is3'^VOdd=DfUUXg9*L(#,L<^CYZ1M[%,TC#NIspPuB9U%=W3Fkb;MKK(frW>3j-YP>b=]-.n:(qZ7O>TdH4/(b'LXhYS8[fkhAeo,j3oLTg,l+]\gA9tY+4[*=H(M2!RJiMNBbEYDh@ZjJELkQ?n:B^ig(PbI%?C;aBf\k;C+46NJBoKV8]<`*R1gf4mp;6qiK@0h*B3Du?U+LO[[ZrTYjA4NA"W4m@lB]l!#/lVs$i!'L?aa_&#,L$~>endstream endobj 46 0 obj << @@ -396,22 +396,22 @@ xref 0000556584 00000 n 0000557049 00000 n 0000557465 00000 n -0000557832 00000 n +0000557735 00000 n 0000558200 00000 n 0000558406 00000 n 0000558476 00000 n 0000558757 00000 n 0000558860 00000 n 0000560146 00000 n -0000562420 00000 n -0000564194 00000 n -0000565928 00000 n -0000567672 00000 n -0000569030 00000 n +0000562389 00000 n +0000564160 00000 n +0000565927 00000 n +0000567256 00000 n +0000568958 00000 n trailer << /ID -[] +[<6a733c0353e5c361a78e61cad9aa83ac><6a733c0353e5c361a78e61cad9aa83ac>] % ReportLab generated PDF document -- digest (opensource) /Info 38 0 R @@ -419,5 +419,5 @@ trailer /Size 47 >> startxref -570506 +570434 %%EOF diff --git a/report_completo.py b/report_completo.py index 55883d7..e71ea32 100644 --- a/report_completo.py +++ b/report_completo.py @@ -482,15 +482,17 @@ def generate_pdf(induttori: list[dict], t_inf: str): "Ogni tratto di acquisizione è interpolato con la legge di " "raffreddamento di Newton (convezione termica):", s["body"])) story.append(Spacer(1, 0.1 * cm)) - story.append(render_eq(r"T(t) = T_{\infty} + A\,e^{-(t-t_0)/\tau}", tmpdir)) - story.append(Spacer(1, 0.15 * cm)) - story.append(Table([ - ["Simbolo", "Significato", "Unità"], - [render_sym(r"T_{\infty}", tmpdir), "Temperatura ambiente — valore fisso", "°C"], - [render_sym(r"A", tmpdir), "Ampiezza iniziale — parametro libero", "°C"], - [render_sym(r"t_0", tmpdir), "Istante di riferimento — valore fisso", "s"], - [render_sym(r"\tau", tmpdir), "Costante di tempo — parametro libero", "s"], - ], colWidths=[2.5 * cm, 9.5 * cm, CW - 12 * cm], style=_ts())) + story.append(KeepTogether([ + render_eq(r"T(t) = T_{\infty} + A\,e^{-(t-t_0)/\tau}", tmpdir), + Spacer(1, 0.15 * cm), + Table([ + ["Simbolo", "Significato", "Unità"], + [render_sym(r"T_{\infty}", tmpdir), "Temperatura ambiente — valore fisso", "°C"], + [render_sym(r"A", tmpdir), "Ampiezza iniziale — parametro libero", "°C"], + [render_sym(r"t_0", tmpdir), "Istante di riferimento — valore fisso", "s"], + [render_sym(r"\tau", tmpdir), "Costante di tempo — parametro libero", "s"], + ], colWidths=[2.5 * cm, 9.5 * cm, CW - 12 * cm], style=_ts()), + ])) story.append(Spacer(1, 0.3 * cm)) story.append(Paragraph( "La regressione usa il metodo Trust Region Reflective (TRF) " @@ -506,26 +508,30 @@ def generate_pdf(induttori: list[dict], t_inf: str): story += _section_banner(f"{i}. {ind['nome']}", s["h1"]) # Campionamento - story.append(Paragraph("Intervallo di campionamento", s["h2"])) rows = [["Parametro", "Valore"], ["Inizio intervallo", f"{ind['t0']} s"], ["Fine intervallo", f"{ind['t_end']} s"], ["Numero di punti", ind["n_punti"]]] if ind["zona_exc"]: rows.append(["Zona esclusa (σ → ∞)", ind["zona_exc"]]) - story.append(Table(rows, colWidths=[7 * cm, CW - 7 * cm], style=_ts())) + story.append(KeepTogether([ + Paragraph("Intervallo di campionamento", s["h2"]), + Table(rows, colWidths=[7 * cm, CW - 7 * cm], style=_ts()), + ])) story.append(Spacer(1, 0.3 * cm)) # Equazione - story.append(Paragraph("Equazione del modello", s["h2"])) - story.append(render_eq(ind["eq_latex"], tmpdir)) - story.append(Spacer(1, 0.2 * cm)) - story.append(Table([ - ["Parametro", "Valore stimato", "Incertezza (1σ)", "Descrizione"], - [render_sym(r"A", tmpdir), f"{ind['A']} °C", f"± {ind['A_err']} °C", "Ampiezza"], - [render_sym(r"\tau", tmpdir), f"{ind['tau']} s", f"± {ind['tau_err']} s", "Costante di tempo"], - [render_sym(r"R^2", tmpdir), ind["r2"], "—", "Qualità del fit"], - ], colWidths=[2.2 * cm, 4.2 * cm, 4 * cm, CW - 10.4 * cm], style=_ts())) + story.append(KeepTogether([ + Paragraph("Equazione del modello", s["h2"]), + render_eq(ind["eq_latex"], tmpdir), + Spacer(1, 0.2 * cm), + Table([ + ["Parametro", "Valore stimato", "Incertezza (1σ)", "Descrizione"], + [render_sym(r"A", tmpdir), f"{ind['A']} °C", f"± {ind['A_err']} °C", "Ampiezza"], + [render_sym(r"\tau", tmpdir), f"{ind['tau']} s", f"± {ind['tau_err']} s", "Costante di tempo"], + [render_sym(r"R^2", tmpdir), ind["r2"], "—", "Qualità del fit"], + ], colWidths=[2.2 * cm, 4.2 * cm, 4 * cm, CW - 10.4 * cm], style=_ts()), + ])) story.append(Spacer(1, 0.3 * cm)) # Grafico @@ -543,17 +549,19 @@ def generate_pdf(induttori: list[dict], t_inf: str): story.append(PageBreak()) n_sec = len(induttori) + 2 story += _section_banner(f"{n_sec}. Riepilogo comparativo", s["h1"]) - story.append(Paragraph( - "Parametri ottimali dalla regressione non lineare per ciascun induttore. " - "R² calcolato escludendo i punti con peso nullo.", s["body"])) - story.append(Spacer(1, 0.2 * cm)) summary = [["Induttore", "Intervallo [s]", "A [°C]", "τ [s]", "R²"]] for ind in induttori: summary.append([ind["nome"], ind["intervallo"], ind["A"], ind["tau"], ind["r2"]]) - story.append(Table(summary, - colWidths=[3.5 * cm, 4.5 * cm, 3 * cm, 3 * cm, CW - 14 * cm], - style=_ts(C_DARK))) + story.append(KeepTogether([ + Paragraph( + "Parametri ottimali dalla regressione non lineare per ciascun induttore. " + "R² calcolato escludendo i punti con peso nullo.", s["body"]), + Spacer(1, 0.2 * cm), + Table(summary, + colWidths=[3.5 * cm, 4.5 * cm, 3 * cm, 3 * cm, CW - 14 * cm], + style=_ts(C_DARK)), + ])) doc.build(story, canvasmaker=ProfessionalCanvas) shutil.rmtree(tmpdir, ignore_errors=True)