From 9cd46423483ab6b3d0a5713d609633964a2da61f Mon Sep 17 00:00:00 2001 From: harshgondal Date: Wed, 25 Jun 2025 12:51:54 +0530 Subject: [PATCH] Updated ss_beam image and its path, deleted commented code,changed c_beam jpeg image to png --- .../ResourceFiles/images/c_beam.jpeg | Bin .../data/ResourceFiles/images/c_beam.png | Bin 0 -> 21645 bytes .../data/ResourceFiles/images/ss_beam.png | Bin 8237 -> 5410 bytes .../design_type/flexural_member/flexure.py | 21 +- .../flexural_member/flexure_cantilever.py | 22 +- .../flexural_member/flexure_othersupp.py | 4 + .../flexural_member/plot_bmd_sfd.py | 188 ++++++++++++++++++ src/osdag/gui/ui_OsdagMainPage.py | 2 +- src/osdag/gui/ui_template.py | 30 ++- 9 files changed, 255 insertions(+), 12 deletions(-) rename src/{osdag/data => }/ResourceFiles/images/c_beam.jpeg (100%) create mode 100644 src/osdag/data/ResourceFiles/images/c_beam.png create mode 100644 src/osdag/design_type/flexural_member/plot_bmd_sfd.py diff --git a/src/osdag/data/ResourceFiles/images/c_beam.jpeg b/src/ResourceFiles/images/c_beam.jpeg similarity index 100% rename from src/osdag/data/ResourceFiles/images/c_beam.jpeg rename to src/ResourceFiles/images/c_beam.jpeg diff --git a/src/osdag/data/ResourceFiles/images/c_beam.png b/src/osdag/data/ResourceFiles/images/c_beam.png new file mode 100644 index 0000000000000000000000000000000000000000..609ee3e796a9082fab24f83712a65c5c9226ddba GIT binary patch literal 21645 zcmXVY1zc0#|NbSEQ8F5&k(QJi9nu0)13^N%yE~*~goJcS*N0R>KoBNUA|fRv!cbC? zlKLOMzyICK+GIQT-gDmPc|WlP9c@)&g1ZC|1QDyNDd|BFmKXSYJPaHB?u$6d0)H@D ztLbS$P!Iv1e<(pz7&bQZ18e$!_nn$ z4s?8HCiGrX{v{h3Mt3vm)2q1$xFXu`us}8kPfC~-}2);k=aK(|QN9*hBLxQrhD9)h< zOdu3NeH#k+fvYN(H_j2}VMYygxUVc<(c@zI$?do|ZK=(*(^waHubhClT7N0T5glI! z3#K?0-%(S9t(=T*JSaj5Q7P-faV=>&g7e_mXzV+1dIr34^%Q!$JrDYb;9mQ!+t9a@ z{Bso*6(6%%krep%KywR=6?M+SzuOkq3%*PGk7e3lSBb+|wS;M`GuS*QxGR#I4ePQ- zHx6v!ioBx(<>GgVho6+{ynOlcNncnfJ^H>;qX^Nx{Bf)2N87U`ckW1{^m(Z`IXOdD z_IGwnTWm&l=38YZ^^r*3OpS`qQ&U(_yUDnSme#aMgP~+$@5yqo%;eK{C!~=PwYBDS z8&@KQ@;hn)_0OeY9r)&|tM`wkCk2USeYq>T8u#a#ttSd3?%lg5Y&Ql)q^GC%_R1Ex zL@~pnm|u*jWqjFVJPI{TV21*Bn$ci3T;*T_3%n;JuGrp@CKJ<%K@bZrrs#NeV0q3(OlI<7V5wdW zjHQgrNi1IxHX)&>NspeRbX}xUENNqnhDFK4e!nMw49VNuS2b=!%<37nwSE6)n#?_E zJ?USEqY4dS&0ZTC(CPeSm|@c_$;32b$Dkuw7+MQJ*_yn4`}U~I`y)4Jy>TlC${OwI zV^I84=iZAEk^FI~y*D?v zEw7T#q-|@?I+ao}b9960a!WN|-2LhxPR_;HkRDxLUY=OyI@sY zuCLA+&@9n98qG$eifP7oj=Z%F{;?KnPv#0&nKzvr9bw5E8O?UME=Dn{Rp>o@_%KFM zA%jgl11#1FWPx|V+cb;BAyxBafn12mH{tYms;t6XWQ52x|YLZjdgODBTY@6KVKMy@WOV}r?4^&IjU4@+eh?j zaG>7f_9ipWArX+xxCdS%9l57#kPYjPosc|LwS)x0ThvNhr(v zjT{U9(LZRptKW@{jpeDbUFJ7+`%^YH?cgAt6t_pkCC$`Tb=w9xOljdJmI4DM3Lf@~ITKOR>7R^?-po^36>(}t_qZU^WAk)B&tnIH2 zgH_)gL>NO3-br|GLj9m34oNW4(!MM51m`uhK1ck zfiX`OW8jZ;?@5{0t*wU_hm+LZGkVXTKNsjdwF0H5(($qE*(*3J%6jt9gFBkS+r!*G z>S0Vm0>0LCP*9MF7EXjF$KkGf_@eL9Waysvoci*g?AOwNKRrBI@@IkyygqVIN*|6< z8kt(=ZQ{uuL?$F85c0o~&vDwA1nNT9tv#y#vX-=u*f`ajoh^Cr2oA1^Z4 zNEM-y1}0B>jDO!bLs;*@0O4cl-%1eTa7;J`&RO7r4TbzIX9_)@x5tv7ZVSJ{gv&ZS zUjOeYuB~vc$=i&{4cmkTKW`fwueAY*>m!S6c6Ghh`JJr~B&kG|dUiCi>+9vC*$o~p z?qBPT!IBmuTCZ=Nko>n*{@QJ+%Nl)0YufGY(bq+{Zr6YSM9!!ySjH|cnz|GdfgCT4 z-v%A^_k%?qYw0l&92}fKZU-j7M4{A_;@>a&kGT`A7X8HX`KXett*yaYExz2brxq~3 zSR)BP&FQ>^O2T7*$0^DY`0ueO6aO{o+?F{U7hDJ?D4fScs*?p`;84G@s-yb8B6F`;#R!{8&2SKq74Q3JD~poClwSzIW?adjy= z8>K`=!4hspGbX99ihR47(%@$P^!fM5;vaa=OH<`32dha2$+f8PC zWl-y0ontiK^yrrQ)X*L4Y}-PxQibg&=$V*QZ#{+MCYF`N-WsCv3^4vpP9Lx;^87(N zCa}6b%XYq{9u&)Y7n<1Uv}tXr6upJ1DbKTw9E?||Dq~=@_wve0I9T(uPVMWda#w#w z1;SS&@ruAqu6UG#9l<;5NuOWIJ?iD}?@x~g!=C6~x!eN?1oLs94&cD)+g1u!u*%3$`y)nY$Fi-R&!a6+Ms>m zQOCr@o{uDha(!#76byTXBxz`Z&g~S8CwiY~kO{z#*DGP&YybfJeExT|&8}WM<5b<{ zZ#LUfPY$Z&f^*Z1?@|kIn`WHl+|*RF(@d>E$QmKQyvbz_Gqp(Zl@MVbx9el~>*F`; zsQWpipbDgxZN*TVZ*6Zs?8C`?4r6)4sO@2cqim4LKs1 zziW$icrH%%Z|TkEETVM?ir(dyDp|_dH3t80o-;@zv*6wKS@U35fBzHFS<~kPMk^o-tjapme5lqG6iinHESzv@}KbD8u+qp+p+=g{wvRByLjD(DNHFA}LW$cC-L;k0cY z@H5-Jp?v2uhCAJRBjnCo!9S&g@|(UOY+2!okTYB_)N=aul>ANMx|kE&$oi zK0n|mr&lZ?w-d`}kIo#m)o?7;fg&_2GREy}jgLe7=3O=q1C@1kl3fK-EJA({-6EuV zc0FSA;7yoia%oB@pB3oWCIb0$oc%dhPNwp)QWNfTK=O4?`3nX}<;nWzgWLywKFjXj ziEviC=2E&?OI%C%kS@myQpM!tWSQgl`sLQ-H9o548~KJKZ5k~FlNh`4g10uq_0|Lo z!q4S1Y-C^o6rKufcd(&P#vKhO*|riy4+jN3V#*xvV!rt<0mx*)Geo10Y@c!RoS;;G z_ZnF@bFlCrm*|(2q@<)%dtMpWyo=wnXY#rf#@W+9MgAeyY1!35gA!mqDClGMxN2IL zLOnytA19YEka+M`S6A17VEybisDTo;k40Ts8!jYDW}J+(DPt{L=f`XweBjolU?Bv9 z|6eb#f35)k&>}4%k?`@2S7(pM+Cb1-RO4E8)9-wHnXY!*40A2nr;zFjUL?k5l6U(-Pf^~Y9Pp9p5e`I$2ckj`Iu!_u&E%eG$ zr>Cd=sCVSrh=gB3Ls;rs6)lA-wRJzgCS~JSG_As;sQkoPO^tNc2!Q)2_8^0*IA$k43gtwL`{>Fhau~3O2-231b5dHk{ zf0L(xHM)QAi&J|PGZ$47*c3BfEiapAhU=bEDz@b;b2*e`k}8vGFujSo9f3eeU@9HU zRN2Kw?OGjJ6g_D|E59RDns1>Awad;z%(FLWh3!f{6pYy1nV3G+cd&iTQt|c{wgSy+ zh^&~Hn6$J@-sUfI!#wV#gl8^g(vlLM23#U#!lg!cEx(RM>9C7daF@_B<0ru5bJHr! z2A^cG8D}4!Nmo!9F})dkHyitpa9ZTIr~yxw0Z&X2H*^rnbV-;rWJME;T8AKl$TwCG zw8(AY#@X!Ziner&w0^?aP_$({9xh~@?RhtyZA6f0vBPsJU%P5hu+6nwhYQU99!4ax z`33uwd^pE}Gznf{`IMlRaG`d7<-CiSrvfpATIWjCF6M}>S?{ypDac2}TQ%*fslXJlZ$qX@8X1682w6eDnM9y;=~^rYV^Ju8H$zrb zz0DS5XlGT=LKyFba#ig5KjwCAHvxMk&F4FYZY!j*j;nc{3@SemcRDmH^ek!0#NzZ4 ze^YZ+cFeSKU6ov4y$dYFzeD*c1{Z3X=hb)@4L8+!tgVe5VQV}W`1xm>tug3|KX8xR zwYIjB2Q%C*gt2_$ytTgCJpEu;da^vzBzq&!Tr7VmhH|1Q0IRn4V~a~3N9?^=%dIZA z)_GnEf~|wlPesF6!ib~ezjy8s%U=GSR*YXqNx8k#C4~BqTnE3f!Z*Bf@hi6y>z$)M zd%Z1vSy@Kg;#M8|>sCJm6I6bIh2Y86oL1taxI1^i>(DEzC7h+fvYm=T6$N}xn3O%= z0VITp$EPnjlbFyIceE-LQCrKUCzh`jauRF#%&7ka3))hMzziS=4Su(6P=6`qqepP^Y*ZCUx~eZ{~Rn<#Qt6`5$@~iy&=ar5v|1z zzR`~xUU&^m+Rpe+B=~cMEm+nSFIT(2a52N+&;bq;1bWTTm091nb#KDYC3-P%$R2&EEFnz^bHF4TJ7w;b4Dj_!Iz}QNlKlrQvWmCjwb#V#Kqx| z2Rh&mYm~%h_EWdcot9CZkr9!^NDBbGb8t89%c9q$kkl~iEMc$RZH zH6`DntVGUReb5QsbPq4dbjpj(%{D-W?sZ~J8oqj>8LAxf;8C8H9|(AiB`{s}y=~Us zGruc&6vh-aZY3$oeRnERW20gtW4o=06#-+$#nrs;006(Hre;YZ?)2I>uTeh8i5g(ht=JJdbktl{srdWW$eUjP}2EdLQr1dvA_eCWDPjv6OlAfn9)P zTaF}OL)+kwXW~PEr;64fTOa$BGE$>Xv}o34Q?o9aEMzuqO*KpBt2IrubP(c>MitJO zh|Vsl63slA&S0}0ucuFszeOep-BIdqTxBMRhO?yEUeP$rsCH}07WZBK+jj5zSvfK? zV!*>5EpPwcFZ;#Ab4@V5RrzUA4rJif83r_oyy~B;WRJN29%r)Q7m7{!ZtGa=$U5H2 zLLoF3BfUGepHv?G`I>_s9;V_qotv2-LbPfodB)z}G!>&(S=*X(XfRAF+p0c8+YnT& zagYlIpzODBwZxcNnG0ap@(K_v3mem|W+$LlHBI9b8My5BW-a!q``h;Na-5-Rzn+Ir zi8JH*@KJ2fkX_wRA@K4K=HmegqweX5p>r1sVhl_PpW@jkM4 z1cIXU_;H|(Xn2AL_B0}}t@ulSfB&zUy6a8%tId{C{)e|6?XA}f%H5<%pODd8%5&C$ z?Q(R3OrWNL@xIQ4cP8+fD$OilxS0}yVPLkn*a2QR@kxHnOQ|*)k zefY(1NFF9c{KE4#6lrVN9CUs7=Lo`#Z%ravv&kbWAf{uzJ)2)9_%!a%D~y@)-mx zo*%LSxV8B|*K<%&6#QSB^3U?0c~mp+v!=@2_RiOGnN;Td>ni03w&`Ws&?J11&+OyBBaBC2 z3aQC|XbiCUu_R+$KIQN&Gw81KC?XL4zDR!)cBGmL63;~qk zzE9cu#;~c~qydoNU=zB-uy)xm?lVXdGIlA0WTb8p6#@@Yb#LL%LFT#?NaVYdv{6B! zg1I5*=IyRrO%9?#uTE+2P0bJyU5Xi}b~>;aoGs2x9zQ10dn{Wl7vTGtj19qCTKfy! z$_~KEI82q9^80UO8FdW8G^ar;Gb_SZJXyZEQIa4y{aK@X6@s?98f)^PgNGKCWdDY& zuhKye$4xXydEc<4?8B!NF4V7-ApZPm(YLm*0eNUp7h!(5rGwZ1ocU9ggnPFd*=EkT z%>z$*IZ)X-i$neZ-t4BCvWylQ)@LusV2*@a0ZO{szL|IXS6x#!Ta8JBA2|H|t&Nq5 z%7?Ig;rxy!CQ}A{c0zdCkzNzdM|rP!xCeg-C9OZv&CIa~3&czmCQ%C%O^FX4zI72x z($#x8j|G_m>aG*h)!mJ}Ux?36B%rdbM-$uC`tcI)D+gUIKfe+dP8JOJ;HN=*&lb+%~bCDc-mwGS1(DdG8fS{2*s(F0Y+h;eP2T;}+Cdwtsk%VLdspZVS7NxH!#CPvj zZCw|<>}$2qu$bGoYR3iqy2pY(>LqE^Smi*rY81nEij zS=VY4;h!4=dySqg$d1|gq8a=_D||8e>E?igd4LK8qz%zvv_9EI?!81-w5N#H;Ac{B zLx* zFVTh;-CSGSYCj$ZIP)87@NcEKapjDIn4s~iS5K=8#fYAN@Jd!+t~AD7`$JL~9vd6W z-*@o`(5w%D$`vA>JyC5~msmzG@=Ggi^}m=hu9r0N-bES}etX|K{dN~7CMIt558X@v zH*Up|aY#rzxRsro;Kt~Fpb_@fkD#HWs}uXRR54M$IqvWBG z-M22&0pQL4qe5s3&^WdG6G^w)HV_j)d@JYr_YEVq9fsDtzRUhADFtv;0$KHd-v{Jz4ehMwF6m2rng}oQaD#rvJho` zV8tIXLiWsWrSD?24>tl3wcqpLhmRP4iN9oiM|azkK75^S#i8Bgh9&~MkdXB-(eM+V ztburY&1jy{mP$t{zn!i9eYyYai?a=VwD6$YJ!Y5W5YZq_G0i?Nm92WC_%CqdJn2u4 z!SQziRXA>g)qg0%f@=~V7aP~%wzMD>{0^}AODij>Svqg5O8l9vfz$vx0KHF?wOH)^ zSgSpU6X!=w;jW8fn>&La>D2!|17MNiEJPNy-tIh0MG$kt99r~+E%yWhes!x9^&`qS z_x${PDrFri3Nt|fp2dmsqdyRVt0=!r}o-7TH7rCO&R6%dHy3A_~ zp_1}XSP*I(kOV-y%ersGV;6M(3Ltt~bZjoMydS;l8*NpS6aYwD8Y9+KNK>&_mV3^I zfKOI)`iw#h3iD2+1|qSBNVVakR+NDM?#V%VgWoDx_xyL5B#>2fD4LaPP#t;QNP znBWPI0s?Go-iwU) z_V)Vl$cTzk4y9>V3Fi_S{;*8uPRtnH_*BNIoW75qZCky;A1eq2RdeYG{R4M@*D_wf2UHz{sLVk=+6kJ{X_xi&YPonAVARL$o5ud z0jZFKFea+;myDSVq*H^8MXTJCd(v#BELO-NZ#tR9#{FW#<6YH9{R%6`=}oN{FJ6GY zr_QM1c0~3Pnd0B$zbX(p`HensHqTZ#@+SG2Y@GqmtqvA-T_FMYCE34c&W+1mzRqu# zzxak)S+VAim+jqsPC~wxGB^S$DE?T4_bSpkyitsip}3+l+?KJ1eZ$REZQ(U_*9+Ci`T3P9HT^#ks zOl(N2SQsj&3uW~)MJ6s?D};xa8MS>QWZ%6XWt?qO@@mRKa2O@EhcH{AF_B`SE7VY3yxJC`bR zOvCb{ZCX1CfGcADH<-Y##yH)r^DxQ6u&`+k^~q<=QwS70t!Uq>RM=q6udY2jeyHFi z$Gr^dVEUDr{+1Nu6Lz09`L}MO+&7*U-s6t&F1{q|W;yhkw{v(&N8Dm4gWImf{_dv_ zTgc+x1;UFERREwC0bAN0Hu%pLEs!*CUh6ERSo5mOlU}HiTz!f?9tTRZb$qR}bN}P3mFe_q1z@MxyvIh=`bE7g$1oUU%vJZwk3`D8oycI8zk^2TEyju7+*v zybe{Y@D_>%kI4bpOH_PJRA1ze|?{BS>vfZbrNZ;A^N_DdzxLE10OeM9j1`seaqw29Q zN1>0N0@zBSnph8yU?vz4e3i-5Rr%42UX^|o=;Ix(!2p~8G*|#gkz+fEpXHTd-G)~u zN)bKru5fU05UfQz9@|RcGOQL}?+Ho`TlLL?x;(qZhLLyg8Vjg|o+Tsirub+u)qOb* zl9|3`p%Jau%(PoI=wnj%6LpCBdL_T+(cLuIaJfyO{j5cLW_C8`Bjs(*(bldm6^_dI zGC(_wn5?HR5=Qv&(tWdTIdd5!ie|M;L}?^ zVj)sTU+7Eu?`-Yu6)noml3WN9O_@LBZg-W+9~tIdZgV8B@Bw>GUZrv}sWB~=YPk1& zRo5opD3!hE2*DtHK>qe*9g!iry^8y}b00Gm(*zj;4cewu2iCAHHz-_+TY`>Q+wgH7kKB ztarQ7&r!@aAf=0PEKL!XUPDBIIM8@&c;Cn*WiyfTK37GS6MO#nue?1xSrvPG;rX@n zHE@8M+}Oy^g3C@3@ow+bx}Jav*n})qX1VS4I|@fPw9R}!C-1pXym|3ry~T-uIhKa04h=d*ORwPH{Cj5A;rKMiW9Ts~&Js&-mE4>qnR zotl}kT^t8il)c<4)7cc-RP5ANF6)YBHf{)7t8RC-wovD!wU@`m`W~R&Y1$!Ugxz8_ zl&I2BxgDfhdM{Z~#cxJUl=$#BCnKhy$+S~XUzE4_qePA$U97F~a54#vB_ON2B*%af zCbe;Ob@lPRJjI*Cf0%_vbfg|uL4VQH7>%a6=g!5^hIh2jabgB{d+)qHZW51Te&X>Z zVEO~{>Wx_x`Tm4Rw{NJmFH|+oI zhukml*1(5E?xuKk7V!PROcp(Dn&q8-ziNln?Oa7|!xh8MyI1(ld)^rEV#!meb~WC6 ze%dSWvxXTaxS~Oij;_tC97&Xxm35#hlDvLKYY30Eq`+4oh(TrA1~ro7rdRGHNgh|UfZfk-?Br6DV|sobKl8S3+T;ee zJpA?(l97{3jS9V{*~c@$uB(he~Z$Ub&eh3he|7|B*^Dc{{&Gl&x*)*3-no)D;pgZ7-V!uKTUKv(v2vH- zKpzY?p_a0<$j4YBTI&TQ#Kb8m)aKzCvd&OTQ}eIS2_#=WF9^hN;$hl#m-XS4+N?>N z2i5FX>194x1MN547y!@taBqt_$@cju_*rcSQI6oU~8Pku8xFd zvEPdDnkbJa)TT(#UVqvB*d*Q7xGZCCSD)^XhHJ<-#nGf_|Ly7bBwY&N-l|R$5S$3= z3U)fm;~kyXq~cRbQCSCW9cjDYRx(Sv9=LXKKJ;dI@SRyf}-#8C1hQIJcNbRw(KoI{5v}_a1Rd7*6F)n( z-`F#kmfnWUd&wQhOj;YDLtubn$s5N19om=H!o0jOHA!RbNf9SR__jW4UVu{K@k`)H zoxRO!&PV={DJpVDikE2p!=bb|>_QNwutaFz!+O_~>6VPV;BW+)h67Cu&=)o&r4wV| z!gdpy#z652d7N$g_hVHwnc|IQg)7mp(bVy-UF(cZvaRTOC40^sE)5mA?sAas5k3Oc- zdOjN!I)l#|4Y62Kh}}&wX`mu>t6mUNWtw&p?ZRVhSJw1vu$-XE(Iawx)~>3iol{Ap&F$M7qP`^L(MEK2qO){COwPgaL!XF#%e$$(jxEYuL5faH-gfO+B`9Z?1R9y!j;|GnAnTefm$yUuxhovV6C#4V*jBa{eS)(g5vGR|Mkv zK{&1g3>#Le>4d!-Lwp^s)_+2WX{qT6i6l@sP^BX(C1qyE!NX(hNSgUQA&vln*7V=q zE^d9rz|u71Hjk?d+Q1mW(Jyu5*~|xb`D~S7JTNS*C`i2{c%G~zcu4?3pLRTQOx#AP zU5zcV_?!^lTcebZs?tZKkqN1HTp_emp&yW1*j$st?qk0 zfrp7hRvbB5e4{9(3SB-EyD_?%Y;YSmPf4H60p?+E&*_1|1s=prO_}WYAow-7# z`aKadvdK%=;#Fc?g$S&J*>6SIALL>3aNJ}ejT$yxmbra>Q8JgA<-Mq${q%oi0GlM=MNDebtTNTRI_41xR(96^L4iNkDvR~CE#x%Nn_W{PafyI z_YPm=46u&uiGs`t0eC!G!iY_SI}12H z3J|fCOs{Od(09~`-BAwg9iu=N^U2XaV7pS`IV&o z=>E$rF)LkqG+0R`vV_hXABTx28%=wqb4G=ReYD)?8&t}tX69p%aLy_YRTUNJrfmi7 z71`bBNa{yVa&?h2%w?q3mNX`@D5Dzq(3eOLt*Vlr^Ma^jo`xMHOjRnR1-5`!xsCf| z?>u}(_8lE83R+>36JYHZ(S)-mvQl7s00w!5bPiBf%AQK>P7W&YTUi>n$nO;ZQ6dt9 z&qAT>IN#vIQ>a~`+eS;vKzsMD9?};8!FkPWLfHqBpXcWtb6Y4)Jn2EN&9~@E6I;eb zfqUy00;N6>AF0vrDb25VKWjw z%uZ|Jgruq>OQqG4CRURTs-E4RaY72GOz7D!XxQsJ4ja?NJ{ef*aGe%m3ce5;6#RF7 z-YwaU8}HOm%cWuAUc5V(SO4C#VBC&)P)DR;57^f}c2(ApVN8WZ)v;+Ks%y&}T=Ke$ z_}ydFUS)-{rW=yAv3v;Iawe^`+>>zip70NB+a;gQ@tgHU>RP`8PAA?`z)oeBIZy!V zMoSlv>1^CE91TY}E}(NSfIAwj6v_5Fd68iz$;OA=40KIyL5|fkPPXebWgmRa1_i$( z4E1ZvxM~S{N%HRW?$;#>F@%>a{i9S<$}$>ilZdD)O}$w(DYu%7vzf8`CD6%g(eO_=TVdn+maz!kGz6w`n+K?pChaER^z&_vs|vgl_s=)?ek|d}V}dPdoboyX z4>xtHyBg1Xi!~~C5ZYDK1>X4au8S?a!RDi%BJtHKcp?6&%k92|HSZNQqA~m{D7we* z5!`BWhkaM({A%Q{ZxoEUT+pf+V8t@e)i4ULcy{#%TKDaK1HUfN7y-)GGjw`}=^x7# z9u#DYe(#x#j7DHcWd42vHRE#(<1{7o$*G;KuG%qg9U)IHaZe%Y9{IG9D1|A~Kw0-5 zRbVL|lxO)to-QS*+>nlm>2ZY~nkhU4sInV160Mj35LQqbvoc+k?*2V**Lvf(1{7oF z%rjCJwnWz4odF-rl0}R9<|javNZpyRk>zVR?RCG)v7?>mp2q(6F*(Qso+FyS*Mt#k4s(%Re^Gw&)dQIG0;r#LG>obis=6Boi zKc^9nCh*%r_AR`0d03G3M#ArO-BH2ES4l6*5j;j8fsxYBK36I0m+*EGAdf(QS7|BP zI4F@*t;DUP;cJEmu_#d}xA6AuwTF=drZZlUuR+ZqQ3*^Mp1Kr6Yabtx_;STkLHo^} zpmH~3!{+j>Hz+u3{zy^puCrH=@9{6#%K#YZloK$Et2UM z-Q$~q#)R4~&x)Es9;?6?b#jTC_*`E^J8mePGd{%I__a1yQzhe-M*H``GTPJmBH&ZT;<*lfrCwvj0()2wV&98gi@z}`n1mALenBo8w|^*&pD|<~s?7G}D?pZ(^ z%QEWq1Cdw;En1)pK(wYu2wa1gv9v0dG^&YZIvRrr+=N<#%>rQZ-BM{cY?yHZ$&SO# z@$Kzh97tJrKrs1xyxuQ_Hcf1-rS$14h)0-&d{5x~<$q-gTRRUE%lD;M&8id%-RG3b zc+bMG5H(0N-PL{?DWINV`=o`pJfFduH$I9h(Z|ePgzn|j@UuS~fUXN$wcdN$cJ%D7 z2FrUK66yZ{s|`{l#@SP4(Q7liFDq^`K!Gop8BlulMUia^?E z_SW=gf?ujuj5rVhH49-V8qlB4{`U4DOyEax*^mAco7|i$Y`1`7z*PY4ZsO1VeKZ-9 z!OVaE9#j})+h}i<);br0_jw-S=y*%mY}6pTCfVHM$nb@#r@g(sg$2{5Q&O4Qtj}m0 zgj3D_6Oazaq2U`Jvuex4o@yn(GDK=++p1^KSTkeY*z4G4pG4uR@*G#J_baDCQ!Zk3 zDY36U6fz7=Sg8wczCkr^(>#r*`~bGv(TzW#uGvkz{D~LVZV2G$);($%1ZhpvSnJa0 zJtQ2|QMZZ$+MZ&wz!E_iY#;&-B0lL8wtO=VBEMo>w8b`n?vF%*Swj;G?DE`HNq|Dn zfLql{+veHH7W1bZhwG*v z3fsc8bUHNvyM)xELem3~H+qyI5`4U)SMvjb;vKE9!ha!cNm;7V{s*{O#a|LYiDjpx z?@ala$@)O@3#AE|$XGYv;A?)OOQEPn6Q`8zgA_3Oc;;f5y^-^}S6Wc;)9kGO*c2K9 zO>B)pB7{F64=Z)<+MNSFe!$ZtO+Mv1Xr>A@X$D$c(9+Dd2G2Y;J1}#RY8j$s6K_-!q_dm&Us%u z_=h}+G`{y0Grvnu2>ofuRS~T>(YcOj+`gMVKd;+HH0{YS+Ge0!Sda(YiQMve0z_-ui@#5qEs zOEl0fI04p?457D?#?z4gwRidhKJ^T%i9A33+hn*3H3qEFE+KB~0PBT^Uq_Wwtu_sC zDap1lH>~yf<*{#NHE4lqs6poL7Q1~v;@lZR>X#|{>z_0@$R^r z6%Fp5;@vslz8#3`7kiKKTq8Y&i3VIbvMeyMm5)@+{>QB$P&on?ja(Y-hJ2uJF$4)c zvsvOLhmJg;B8yb~6jXC2`sq8R9m$63iT81yx1;oa_HRQ849pX-!k!R~bV zRTry+rvAz(fYLh|US{Ss<5>{&)~&LBJYU@3&u?P4m~M#Fx;{-nQ&XEFNtuY3o{=`} zXGPAxfB&d>pR5K%rrAs=WY;LM%q7*# zy6^7I>ew=v7OJ&q{y_X0%zpn68_FPp(i2rss*=itLTtm$G&qtk17h?xK0daq#X!<;2xtR%{A zT=vD^S;WE5MhicJkQ7b-gm+t=BO50{95uoIF8%q>r8U1C5oJCwPtHPmyStx4$;qf! zdNnQ_i!Dzx*hX42~3QCLoI~IXyieHbZK#Zsy-RXi5`5Ztjk7< z?ODxjHSCEt75_ zZ9Kf-pdcXK+b(uE=C!buTdE-qZtJwuBH1<8&a|WqkTW9ptSh3J;}wgsQ?dKX({{Hf zl!bJ#`>nKO9=vrY$zpftx{RCfX7_iZvKw0iI9cHniiDd(+oW@<^ zzc(XIECafG-3$N_6l;@0-CC{l?<04++|EDr?ytug*2OR#yxzSI{r9sh@$ZsIC(cP;=3Ns6$=j^9E5wY|8x`Q8)1Gos;^ zG})uJJ@X?Y>aT7OKWR6iR0QTm7>nP|9194xwwVyK&|KY$oV^-* z@;;Ckm+;~BL#BTbWoonQK<6$Ex=g zctbd_Im%vM7wLb`e%APm-(GedtAi*PwsP7QW$gkaWM4Dr1Lm-4^|vX1oG*+qXsZ+i zT`+T<3}}T11J75rmFUq9tLP@6+k)dLhym~H;6U)|$2!wBqUifeYZP$gs%n6riVHg( zWLox}HM@y?{^kW%+z)QWXJht&*!$Y$%482>Uh}w3xN#MjKn3{fe;}mdZQfwGC`S}! zHt$D|&MhdQP;^=8HG?&SEZ+st_d+knPR!7bGutyN@(4S++R;{dT=ROa^NX zmSZ7`XO4ncqTq_S&`=XD9chGkuaz=#2Be1<7lX$|XIG6zTP8qreiJt?!nl5WbCZL9 zzrewCeToLQun}h1=bt_l$|oz~;lK%J^8hI0mNdO!t>ZzXEj%}s6l9|i8sgLzA)ci= zr^m1RmgeVcw*TFP`T!F%JA3l~gUN5oeurLD_nj((oDQvh!CD~W*WC9588o6!H-SJ; z`YJu{i8BymtrY14sXuDoCkJD~lRmz_W`6UwDJp}W1}2@(*{0em2xbo;1KvC{~jGJft)RfJWB%aIQZ^?mN`I40q-~dZ2OJP z0z{S0_xr*@Ko!gd32@pVA2;d=G5aMbL%`J!GUmVtbWUh-I&d^=k(%%|f1Km?*X=Ig z#0Q3hP4T{(?I7^Y0N^b_MI##&1XMTZQfmwbUeQ}z|C_}Ef%}VpvwemX8yS!Ie}~Ft zX$*NvBM_(8S1Z@8uHD_;|1*^VcmICx`5sWId?Z6bb_}pwAQ>wM2CM+T2~7eUd2MZ1 zW71%3Od&%W7%hwZnG0SxO8Rti?h zFW-V9BGjXv>Ybv?!+S^Loi|5vP4lnKoR+@`1&)ueSESVLeDQf#_9Y8BJ{Iwxk|D zf0U2e^?Od)DXKsa+A0IA_7$J`83+{%M1yZ?5YW`kObz*Q?+xZRn#nzt{mVCyVF4*v zLIENfqBL&cd5k)|SZH_lHG9pw4xBu1cUm5aXkkTwd8o}o!ykSyd9swm-zA^nw*>BW z34Gw>@}&3VEnpe^%L1Y@2DqyVqKu+6wm>w+Y<3@H&2FM7pk2O6@k9NB$>5s{1_kwM zGHYw2)4=2?Q9E6^zFYz3AYdl;`K%7iFPu9?53p8m@?QW?MikqRy~Kh*Xgf6qUW6%C zdTup(v(Ol>luR7;M~aG1H14yaZV`e9NhjdnFUf?{GE(GH_OKp_IIUCwAQH`mm{78jR~BS}J_xKNNwCJ8%ujzGo5#sd0~ zcTJ$@K#}D=s915DAk-5LZ!mNQy?cNq zNZYmE)ZLzShW-AG#~?y_V~7C;dIG?$n`9r|#B?obKmdA$EgC?pqM{<8v!7o9=OV~b zX-;3P;>mGE(=afYb@_1fC{QQ|f)R>=-bd^)_JBxwE7Fu=Q24nfS(9XsYp>MMM9C7u z;M+1}3nRD1)(sJru?%9Y*~<2Pe&)BG-yick$GQICbC=J3zhCdy@_an0(caX+bl>R) zIrALzM)im9G~7?9Syrkv0_a?YV*<6lzlrj`(7qPCy=8%OqXfbo zll8*;wpKZHG~_}+pCz}5-%6Szw(0gdSq}GGeo5LdG2e*^LxB>90$qvW6%>BPSr>o|!r-Z2EbGBj+scCkIo4$-P>Xz+$5=Q2Q()s@~g z17-`z2}b2hlx*JDf>y>Hhn=f2$B9jOkh^2|j%iE#Y6E$4+I#tz;Zi_TK zeK>ga^If4ZEDU0=mU@VaihANsyfIS^p1jnnr>))P{+pIZcY9Ayd_*hw%Lfn#3CRXz zK+}KK_v6K3s7(f-`Du{Pv(8_ro(#s5PeISr{ZugMDrDQ_*V$P`ip;RCNzF{7Zy4lm zy>8X?3HfW$%XNmAp3wf9+rOMRkq5^HZbg%h+_r530LrlLWfBF|ql(9%4}_A_N@5Ee zD6y52#M7DN5}CT6*Z(QxwCIa<=m7XK+)|@+5@la)9cJ@TdX5*w>7Cbh7#?&&dkYwK}Bq-=pPTdv!`t8!> z+UnmwEs&g2Mpy3Y}dW)1^LH3wA_7#sjBw*!)pT+LK{Xzsu z*q%d8w;WbRk8^kELDZ(J+l|8)J`Haz)xuDVfyuD8s`%7T#K_II**qTRUjM){YaG@NmO z5fR>FzUCtb4;j|$Woe~FG5TbB7dh?i?IocrV=zcr9#k~Em72<^d!^Bg29^Pi0ZcKZ zVhN0Zj>DC3O@MKUnnhdbxFukGH1=(%&wuJH-cWyy65$i)VmorbV_xL@*PPYDvpfon zZ$4>m45?5wqmWphzaGq8nc?u!o<024W|uMee{j~Uww<%)NVz5_CJdKNZsf9%%iU2q z5}k1mo%RP!j3n9oqwf^?7P)8+My`ELyV!{TJLgYKszPM_T5Ekj(5{}`{T!uzj!vh@^5zC zl#_6>XuilZSomhZL5d?SdJ@}+g-K12wfgv6r>Lu`(M$l+q349JhUmwY2=(}eX=J{%dJhzLG%e_bFzX-+hZ_Wfz_*N zy~{&!yNjP7#M>N0Px+Hys&(9}lkJ^ZqG*1hOfHc9iOzH2+q;U9$dJVt6BT2{1hoF- z2jfb?jRW?dB9$Ayyw|X>YcRL4fRGNp3(HA|Ww%hN`eVO7DlQ*NC8}Z~6K&K{jD&2d z6_F^HReG`r76un8iXGsgGs4=+?z{et+02(JCuyK~BQQt#0J96?bvyy(S?Y~HhV=`G zNROZ2WMQp0JrWK(QIQ0=rFSx$nKq4^jZ!(%~2}@B8+AFp!tXYv}YcN8CI^P#I2zn&nvQ-r<}}T+g-H zHMhD@gASX)%nSK(imZm0I_LGj@U0$yICr>o#d=m>=ADnIS%$pO@bKnNw0Z zp{p|fMvH`L7`hKl`8ZYQbl)R+*TXKviqZtyvwbaaG^q>|CX1ay@0QeO%2~vqhnjx z5i)b*F2Zw`@rOo`2^)}k^&KC*vqQjK_1u+QF_ijKLB}X6+y;!xNQ8|BE%FJn ztOwyLjl}*L92`VpaqV3qZY+)wSd0KFBa9d8%NzBG?YMrb8L; z2QU68&DMU7t?YlI79&l1-~lpPVGANs6vpDyt1Uk8Gb>5){U}?EjWBS!`%F`*hkiGZ zxs9dM)82mL&%J1Vqt9hTB1qYuQ)Rb5&$qcnkN%M~y?5#z$J-9x3vL4g1Iebq8)r6) zna5};mKt77NZ7stHOz*djON1N6-ca_akrXFJ*r%2kz*B?zWxDey1(<0{+hMtU6bS? z{*pNVpm9`jSTWq7uqCebCbpASn(?D31ryck**BQOc+H-+PJ@#eX1rR?yW)PAu5aJu z_8Pi#kq#>fft$>cqpJSVyg(>Q_ZW=}*E{w?d%y$&46}%QoAo7c7gp#ZRwz0)1d4+q zW#;uvw|P^uSEMy>YDc5p`8XR7c1qqYT%*JSYS*^#ZJ1+vwP;$@_efnbGLs+YB^79O zpPM;IX&;+InX>F)nor@~^DWLGrBF}~euj0??6QO(ec4Wgr=0b%&3q5hU?_0Zw1^*g z^6qT^T=wcIGB?BxQyg~qE%D%9#mI~=>yA5HNf=wT`;VH0eed=siSMvHds%Y50M$M< zw~x}mjCJrn8|@TxM?CsIh1bL6{&u5QvIbyIi+fiOWrwe3G`sEtS0J|a`~&Sh*`xfT zUAdP7t7VO?@QLe>q_~({C8YaEtLMQu13EGdXd{)coKZ>N1E(t)TTznqnE;2|zSMB| zvAOKyDCKCgc}N``a8bO8fz=SN2eZ>d!9p# z-Rm$pt^IG8%Gloj`ZMeQbFKV`C*!OMsqf>NRd?64g%{^He#R&KoSpn!bkF#>;1@}q zuCBR3?3qkLBUw a>*wU*_0QLYIqj>#H6#;brcp7&G2-7cJadWw literal 0 HcmV?d00001 diff --git a/src/osdag/data/ResourceFiles/images/ss_beam.png b/src/osdag/data/ResourceFiles/images/ss_beam.png index cd58b1419c67fc5e3b6a3e7c53a03da91eda5339..cb480ab21860a0aaf6d62592e883f5a9b3f88657 100644 GIT binary patch literal 5410 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 F{~vQ`3}*lU diff --git a/src/osdag/design_type/flexural_member/flexure.py b/src/osdag/design_type/flexural_member/flexure.py index 7f6093743..4fadf8b6b 100644 --- a/src/osdag/design_type/flexural_member/flexure.py +++ b/src/osdag/design_type/flexural_member/flexure.py @@ -35,6 +35,8 @@ from ...utils.common import is800_2007 from ...utils.common.component import * from osdag.cad.items.plate import Plate +from PyQt5.QtWidgets import QPushButton +from .plot_bmd_sfd import PlotInputWidget class Flexure(Member): @@ -256,11 +258,11 @@ def input_values(self): # options_list.append(t3) # - #t4 = (KEY_SUPPORT, KEY_DISP_SUPPORT, TYPE_NOTE,KEY_DISP_SUPPORT1, True, 'No Validator') - #options_list.append(t4) + t4 = (KEY_SUPPORT, KEY_DISP_SUPPORT, TYPE_NOTE,KEY_DISP_SUPPORT1, True, 'No Validator') + options_list.append(t4) - #t12 = (KEY_IMAGE, None, TYPE_IMAGE, Simply_Supported_img, True, 'No Validator') - #options_list.append(t12) + t12 = (KEY_IMAGE, None, TYPE_IMAGE, Simply_Supported_img, True, 'No Validator') + options_list.append(t12) # t3 = (KEY_BUCKLING_METHOD, KEY_WEB_BUCKLING, TYPE_COMBOBOX, KEY_WEB_BUCKLING_option, False, 'No Validator') @@ -286,10 +288,20 @@ def input_values(self): t8 = (KEY_MOMENT, KEY_DISP_MOMENT, TYPE_TEXTBOX, None, True, 'No Validator') options_list.append(t8) + bm_button = QPushButton("Plot BMD") + self.bmd_widget = PlotInputWidget("BM") + bm_button.clicked.connect(self.bmd_widget.show) + t8b = ("bm_plot_button", "", 'BUTTON', bm_button, True, "") + options_list.append(t8b) t8 = (KEY_SHEAR, KEY_DISP_SHEAR, TYPE_TEXTBOX, None, True, 'No Validator') options_list.append(t8) + sf_button = QPushButton("Plot SFD") + self.sfd_widget = PlotInputWidget("SFD") + sf_button.clicked.connect(self.sfd_widget.show) + t9b = ("sf_plot_button", "", 'BUTTON', sf_button, True, "") + options_list.append(t9b) return options_list @@ -3089,4 +3101,3 @@ def save_design(self, popup_summary): fname_no_ext = popup_summary['filename'] CreateLatex.save_latex(CreateLatex(), self.report_input, self.report_check, popup_summary, fname_no_ext, rel_path, Disp_2d_image, Disp_3D_image, module=self.module) # - diff --git a/src/osdag/design_type/flexural_member/flexure_cantilever.py b/src/osdag/design_type/flexural_member/flexure_cantilever.py index 312c5eff0..7eb2f0a31 100644 --- a/src/osdag/design_type/flexural_member/flexure_cantilever.py +++ b/src/osdag/design_type/flexural_member/flexure_cantilever.py @@ -34,6 +34,8 @@ from ...utils.common.Section_Properties_Calculator import BBAngle_Properties from ...utils.common import is800_2007 from ...utils.common.component import * +from PyQt5.QtWidgets import QPushButton +from .plot_bmd_sfd import PlotInputWidget # TODO DEBUG class Flexure_Cantilever(Member): @@ -256,11 +258,11 @@ def input_values(self): # options_list.append(t3) # # - #t4 = (KEY_SUPPORT, KEY_DISP_SUPPORT, TYPE_NOTE,KEY_DISP_SUPPORT2, True, 'No Validator') - #options_list.append(t4) + t4 = (KEY_SUPPORT, KEY_DISP_SUPPORT, TYPE_NOTE,KEY_DISP_SUPPORT2, True, 'No Validator') + options_list.append(t4) - #t12 = (KEY_IMAGE, None, TYPE_IMAGE, Cantilever_img, True, 'No Validator') - #options_list.append(t12) + t12 = (KEY_IMAGE, None, TYPE_IMAGE, Cantilever_img, True, 'No Validator') + options_list.append(t12) # # t10 = (KEY_TORSIONAL_RES, DISP_TORSIONAL_RES, TYPE_COMBOBOX, Torsion_Restraint_list, True, 'No Validator') # options_list.append(t10) @@ -282,11 +284,23 @@ def input_values(self): t8 = (KEY_MOMENT, KEY_DISP_MOMENT, TYPE_TEXTBOX, None, True, 'No Validator') options_list.append(t8) + bm_button = QPushButton("Plot BMD") + self.bmd_widget = PlotInputWidget("BM") + bm_button.clicked.connect(self.bmd_widget.show) + t8b = ("bm_plot_button", "", 'BUTTON', bm_button, True, "") + options_list.append(t8b) t8 = (KEY_SHEAR, KEY_DISP_SHEAR, TYPE_TEXTBOX, None, True, 'No Validator') options_list.append(t8) + sf_button = QPushButton("Plot SFD") + self.sfd_widget = PlotInputWidget("SFD") + sf_button.clicked.connect(self.sfd_widget.show) + t9b = ("sf_plot_button", "", 'BUTTON', sf_button, True, "") + options_list.append(t9b) + + return options_list diff --git a/src/osdag/design_type/flexural_member/flexure_othersupp.py b/src/osdag/design_type/flexural_member/flexure_othersupp.py index 09d662338..c33018c2f 100644 --- a/src/osdag/design_type/flexural_member/flexure_othersupp.py +++ b/src/osdag/design_type/flexural_member/flexure_othersupp.py @@ -293,6 +293,10 @@ def input_values(self): t8 = (KEY_SHEAR, KEY_DISP_SHEAR, TYPE_TEXTBOX, None, True, 'No Validator') options_list.append(t8) + t_support = (KEY_SUPPORT, "Support Type", TYPE_COMBOBOX, ["Simply Supported", "Cantilever"], True, "") + options_list.append(t_support) + + return options_list diff --git a/src/osdag/design_type/flexural_member/plot_bmd_sfd.py b/src/osdag/design_type/flexural_member/plot_bmd_sfd.py new file mode 100644 index 000000000..6fa5df7d3 --- /dev/null +++ b/src/osdag/design_type/flexural_member/plot_bmd_sfd.py @@ -0,0 +1,188 @@ + +from PyQt5.QtCore import Qt +from PyQt5.QtWidgets import QApplication +from PyQt5.QtGui import QKeySequence +from PyQt5.QtWidgets import QDialog + +from PyQt5.QtWidgets import ( + QWidget, QLabel, QPushButton, QVBoxLayout, QTableWidget, QTableWidgetItem, + QHBoxLayout, QFileDialog, QHeaderView, QMessageBox +) +import matplotlib.pyplot as plt + + +class PlotInputWidget(QWidget): + def __init__(self, plot_type="BM"): # "BM" or "SF" + super().__init__() + + self.plot_type = plot_type + self.setWindowTitle(f"{'BMD' if plot_type == 'BM' else 'SFD'} Plotter") + + self.layout = QVBoxLayout(self) + + # Setup Table + self.table = QTableWidget(5, 2) + self.table.setHorizontalHeaderLabels(["Distance (m)", "BM (kNm)" if plot_type == "BM" else "SF (kN)"]) + self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) + + self.layout.addWidget(QLabel(f"Enter Distance and {'Bending Moment' if plot_type == 'BM' else 'Shear Force'} values:")) + self.layout.addWidget(self.table) + + # Buttons + btn_layout = QHBoxLayout() + self.plot_btn = QPushButton(f"Plot {'BMD' if plot_type == 'BM' else 'SFD'}") + # self.save_btn = QPushButton("Save as PNG") + self.add_row_btn = QPushButton("Add Row") + btn_layout.addWidget(self.add_row_btn) + btn_layout.addWidget(self.plot_btn) + # btn_layout.addWidget(self.save_btn) + self.layout.addLayout(btn_layout) + + # Connections + self.add_row_btn.clicked.connect(self.add_row) + self.plot_btn.clicked.connect(self.plot_graph) + # self.save_btn.clicked.connect(self.save_plot) + + def add_row(self): + self.table.insertRow(self.table.rowCount()) + + def get_data(self): + x_vals = [] + y_vals = [] + + for row in range(self.table.rowCount()): + try: + xi = float(self.table.item(row, 0).text()) + yi = float(self.table.item(row, 1).text()) + x_vals.append(xi) + y_vals.append(yi) + except (ValueError, AttributeError): + continue + + if len(x_vals) < 2: + QMessageBox.warning(self, "Invalid Input", "Please enter at least two valid data points.") + return None, None + + # Sort by distance + return zip(*sorted(zip(x_vals, y_vals))) + + def plot_graph(self): + x, y = self.get_data() + if x is None: + return + + color = 'r' if self.plot_type == "BM" else 'b' + title = "Bending Moment Diagram" if self.plot_type == "BM" else "Shear Force Diagram" + ylabel = "BM (kNm)" if self.plot_type == "BM" else "SF (kN)" + # plt.rcParams['home'] = 'none' + fig, ax = plt.subplots(figsize=(8, 4)) + line, = ax.plot(x, y, color=color, linewidth=2, marker='o', label=title) + + # Draw vertical dashed lines from each point to X-axis + for xi, yi in zip(x, y): + ax.vlines(xi, 0, yi, colors=color, linestyles='dashed', alpha=0.6) + + ax.set_title(title) + ax.set_xlabel("Distance (m)") + ax.set_ylabel(ylabel) + ax.grid(True) + ax.axhline(0, color='black', linewidth=1) + + # Hover annotation + annot = ax.annotate("", xy=(0,0), xytext=(15,15), textcoords="offset points", + bbox=dict(boxstyle="round", fc="w"), + arrowprops=dict(arrowstyle="->")) + annot.set_visible(False) + + def update_annot(ind): + index = ind["ind"][0] + x_val = x[index] + y_val = y[index] + annot.xy = (x_val, y_val) + annot.set_text(f"x={x_val:.2f}\ny={y_val:.2f}") + annot.get_bbox_patch().set_alpha(0.9) + + def hover(event): + if event.inaxes == ax and event.xdata is not None: + x_mouse = event.xdata + + # Find two x-values around the mouse (for interpolation) + for i in range(len(x) - 1): + if x[i] <= x_mouse <= x[i + 1]: + # Linear interpolation + x1, x2 = x[i], x[i + 1] + y1, y2 = y[i], y[i + 1] + + # Interpolated y value + slope = (y2 - y1) / (x2 - x1) + y_interp = y1 + slope * (x_mouse - x1) + + # Update annotation + annot.xy = (x_mouse, y_interp) + annot.set_text(f"x={x_mouse:.2f}\ny={y_interp:.2f}") + annot.set_visible(True) + fig.canvas.draw_idle() + return + + annot.set_visible(False) + fig.canvas.draw_idle() + + + fig.canvas.mpl_connect("motion_notify_event", hover) + plt.tight_layout() + plt.legend() + plt.show() + + + def save_plot(self): + x, y = self.get_data() + if x is None: + return + + fname, _ = QFileDialog.getSaveFileName(self, "Save Plot", "", "PNG Files (*.png)") + if fname: + color = 'r' if self.plot_type == "BM" else 'b' + title = "Bending Moment Diagram" if self.plot_type == "BM" else "Shear Force Diagram" + ylabel = "BM (kNm)" if self.plot_type == "BM" else "SF (kN)" + + plt.figure(figsize=(8, 4)) + plt.plot(x, y, color=color, linewidth=2, marker='o') + for xi, yi in zip(x, y): + plt.vlines(xi, 0, yi, colors=color, linestyles='dashed', alpha=0.7) + plt.axhline(0, color='black', linewidth=1) + plt.title(title) + plt.xlabel("Distance (m)") + plt.ylabel(ylabel) + plt.grid(True) + plt.tight_layout() + plt.savefig(fname) + plt.close() + + def keyPressEvent(self, event): + if event.matches(QKeySequence.Paste): + clipboard = QApplication.clipboard() + text = clipboard.text() + rows = text.strip().split("\n") + current_row = self.table.currentRow() + current_col = self.table.currentColumn() + + for r_idx, row_data in enumerate(rows): + columns = row_data.split("\t") + for c_idx, cell in enumerate(columns): + target_row = current_row + r_idx + target_col = current_col + c_idx + # Expand if necessary + if target_row >= self.table.rowCount(): + self.table.insertRow(self.table.rowCount()) + item = QTableWidgetItem(cell.strip()) + self.table.setItem(target_row, target_col, item) + else: + super().keyPressEvent(event) + def showEvent(self, event): + # Clear table contents every time the widget is shown + self.table.clearContents() + self.table.setRowCount(5) # Reset to default number of rows + super().showEvent(event) + + + diff --git a/src/osdag/gui/ui_OsdagMainPage.py b/src/osdag/gui/ui_OsdagMainPage.py index 2811fdc46..8f4cae337 100644 --- a/src/osdag/gui/ui_OsdagMainPage.py +++ b/src/osdag/gui/ui_OsdagMainPage.py @@ -151,7 +151,7 @@ def setupUi(self, MainWindow): self.comboBox_help.setCurrentIndex(0) self.myStackedWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(MainWindow) - + def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Osdag")) diff --git a/src/osdag/gui/ui_template.py b/src/osdag/gui/ui_template.py index 305371666..bfbda8834 100644 --- a/src/osdag/gui/ui_template.py +++ b/src/osdag/gui/ui_template.py @@ -5,7 +5,7 @@ import pandas as pd from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtGui import * -from PyQt5.QtWidgets import * +from PyQt5.QtWidgets import * from PyQt5.QtCore import * from .ui_tutorial import Ui_Tutorial from .ui_aboutosdag import Ui_AboutOsdag @@ -60,7 +60,10 @@ from ..get_DPI_scale import scale,height,width from ..cad.cad3dconnection import cadconnection from pynput.mouse import Button, Controller - +from PyQt5.QtWidgets import QDialog +from PyQt5.QtCore import QThread +from PyQt5.QtCore import pyqtSignal, QObject, QEvent +from PyQt5.QtCore import * class MyTutorials(QDialog): def __init__(self, parent=None): QDialog.__init__(self, parent) @@ -582,6 +585,11 @@ def setupUi(self, MainWindow, main,folder): for option in option_list: lable = option[1] type = option[2] + if type == 'BUTTON': + b = option[3] + b.setObjectName(option[0]) + in_layout2.addWidget(b, j, 2, 1, 1) + if type not in [TYPE_TITLE, TYPE_IMAGE, TYPE_MODULE, TYPE_IMAGE_COMPRESSION]: l = QtWidgets.QLabel(self.dockWidgetContents) l.setObjectName(option[0] + "_label") @@ -865,6 +873,7 @@ def setupUi(self, MainWindow, main,folder): else: for t in updated_list: for key_name in t[0]: + key_changed = self.dockWidgetContents.findChild(QtWidgets.QWidget, key_name) self.on_change_connect(key_changed, updated_list, data, main) print(f"key_name{key_name} \n key_changed{key_changed} \n self.on_change_connect ") @@ -2133,7 +2142,24 @@ def common_function_for_save_and_design(self, main, data, trigger_type): action.setEnabled(True) fName = str('./ResourceFiles/images/3d.png') file_extension = fName.split(".")[-1] + + # if file_extension == 'png': + # self.display.ExportToImage(fName) + # im = Image.open('./ResourceFiles/images/3d.png') + # w,h=im.size + # if(w< 640 or h < 360): + # print('Re-taking Screenshot') + # self.resize(700,500) + # self.outputDock.hide() + # self.inputDock.hide() + # self.textEdit.hide() + # QTimer.singleShot(0, lambda:self.retakeScreenshot(fName)) + else: + for fName in ['3d.png', 'top.png', + 'front.png', 'side.png']: + with open("./ResourceFiles/images/"+fName, 'w'): + pass self.display.EraseAll() for chkbox in main.get_3d_components(main): self.frame.findChild(QtWidgets.QCheckBox, chkbox[0]).setEnabled(False)