From 30ceccbd49657b9170809c4502445e4459669af4 Mon Sep 17 00:00:00 2001 From: copper Date: Thu, 12 May 2022 18:57:30 +0800 Subject: [PATCH] add icon --- icons/change_detect.png | Bin 0 -> 997 bytes icons/create.png | Bin 0 -> 878 bytes icons/data_load.png | Bin 0 -> 2965 bytes icons/delete.png | Bin 0 -> 829 bytes icons/document.png | Bin 0 -> 2258 bytes icons/exit.png | Bin 0 -> 1548 bytes icons/filter.png | Bin 0 -> 3058 bytes icons/grid.png | Bin 0 -> 814 bytes icons/grid_close.png | Bin 0 -> 1252 bytes icons/layer.png | Bin 0 -> 3267 bytes icons/open.png | Bin 0 -> 2480 bytes icons/pan.png | Bin 0 -> 9603 bytes icons/pan_1.png | Bin 0 -> 1778 bytes icons/save.png | Bin 0 -> 1066 bytes icons/select.png | Bin 0 -> 1247 bytes icons/toolbox.png | Bin 0 -> 1973 bytes icons/tools.png | Bin 0 -> 2613 bytes icons/view.png | Bin 0 -> 483 bytes icons/zoom_in.png | Bin 0 -> 4571 bytes icons/zoom_out.png | Bin 0 -> 4634 bytes icons/zoom_to.png | Bin 0 -> 3862 bytes plugins/basic_change/otsu.py | 42 +++++++++++++++++++++++++++++ res.qrc | 45 +++++++++++++++++++++++++++++++ rscder/gui/actions.py | 50 ++++++++++++++++++----------------- rscder/gui/layercombox.py | 6 ++++- rscder/gui/layertree.py | 11 ++++++-- rscder/gui/mainwindow.py | 2 +- rscder/gui/result.py | 9 ++++++- rscder/res.qrc | 26 ------------------ rscder/utils/project.py | 24 ++++++++++++----- 30 files changed, 154 insertions(+), 61 deletions(-) create mode 100644 icons/change_detect.png create mode 100644 icons/create.png create mode 100644 icons/data_load.png create mode 100644 icons/delete.png create mode 100644 icons/document.png create mode 100644 icons/exit.png create mode 100644 icons/filter.png create mode 100644 icons/grid.png create mode 100644 icons/grid_close.png create mode 100644 icons/layer.png create mode 100644 icons/open.png create mode 100644 icons/pan.png create mode 100644 icons/pan_1.png create mode 100644 icons/save.png create mode 100644 icons/select.png create mode 100644 icons/toolbox.png create mode 100644 icons/tools.png create mode 100644 icons/view.png create mode 100644 icons/zoom_in.png create mode 100644 icons/zoom_out.png create mode 100644 icons/zoom_to.png create mode 100644 plugins/basic_change/otsu.py create mode 100644 res.qrc delete mode 100644 rscder/res.qrc diff --git a/icons/change_detect.png b/icons/change_detect.png new file mode 100644 index 0000000000000000000000000000000000000000..79985f33e5e4b28b90994c0e17004de109879a60 GIT binary patch literal 997 zcmeAS@N?(olHy`uVBq!ia0vp^DIm2BR01_tKo zo-U3d6?5Lsb<7ralxRy|D(97~DVpQT&-H5Ur7EqaXODEn^W|9d<-W52VAiU*R3%_? zVX;$w*Nn-RLR!Ct7&_UwMDx1}ALQD&u$@a=c-DkvXJ_60oAzw(C%X*-yG%aUR+gnd zyFE9j$$&@n;6s7f1V_b$01gS}yAN3$4>%rGN|a!myY?dwW3$tN8<$f{FWIW@`}l9$ zub}wmQwu)sSmmW3K5PBvn`^Yhy5H8WzZSoG_fmGg#kc1#jam47Uqt$et-;~FEE!#Q zPHJb>e3%h#cwFdFa+6is{0`f;AJZ1ttu|(MW|;WJJx6h$>I_SpC3^k-%r2MYH?{&L zpFO+znj!Fu`=ZSC{+wBT{Cz9Elj~$$I$M5BN#Kr8>*(ZmzQ62%c%R=2qYh3WyZMD}saV%bLD54_hPIDZ`$cFhbB^KQK3d|U$L!^#eelpP=@}~j+t)4L z_4usGwyQg@?wa^*+M=>oTf^th{uiA6xiQD=c3=2@vE)R@dMUSU>&{nPe|~;yHz+Vg znAlnyAmNIi*>V4ntwB%E3wP%kC({ZyKG)-VdGyJWAld$x0;(KU`=od47-+EYaDgIY zfdG)%b0YKo+Nai?i>}@m{rEOJPs4@l=Z24(fir&nU*>k+{OFA*uRGtrN>ZG@;^@kY zoL@73&AVFh{cyx|)89WkS8g|Jvg^2aO=-Gg^uZYde>a@@xmEm}aL?f!%k^g4rTvl( ztX7;4ooD55z;|`+{H%Ysir7I0LXR(I@^4=~>{ Nc)I$ztaD0e0sv-HwGjXS literal 0 HcmV?d00001 diff --git a/icons/create.png b/icons/create.png new file mode 100644 index 0000000000000000000000000000000000000000..ba3d7d12a5f76c7b0df915183d3911476a46d30a GIT binary patch literal 878 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 LNkvXXu0mjfA-SY0 literal 0 HcmV?d00001 diff --git a/icons/delete.png b/icons/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..75aa8fd8b01755b3ad4b5fcddf1372da5feccd27 GIT binary patch literal 829 zcmV-D1H$}?P)$)UY;Y(| z5eQ0?`~TVgEJeH!#rCf$$%Wj77^5(7;)xbmK@hMY2v`sVEC>P?=^!C&C4{5#zLdw* zqp4S^FQNHPx`P}J&v!70 zvWziro6Y;RhgCrCpBY41i;;My)W9IhGRA6@S{Qy&)?=(fd34$PDk8hYi?+Rla2j^0 z**oT1_lZZ{-FkaJD(m|>QyTSV*nx?W3qq8xy?{xC7^xuMQ99KQo0vz8JP>avooiK- zs0WNP5bG#|YEzrIMT|Ni)=&o5Vx|x)HJB?%d+ufn)0(sS0=4Dprcf<8x+@qxHf0gzDL1~17zia(KMmI#sm0w?wQH@b_8QveHcY~DOsEz^Y)hLCd2ID|l zH%#fc+E|cQjZ-|xIUb~T1C>7pzyPV$NCVGgux4_|`{(5;&bOa=`^NZ^v0szGn_43u zB`2UT1oE}$xk2X@zgZe^7y|pAdV3T|41u0FpdAViUg!WRzc*3yb}&9jy&FXpDA*wN@7m!}a6#G)p+KWxg0vscfZE* zU?@THg`oh&9|m}CJ~4oE^os$St8WazoQVOJJ2Aj&AO=`1!~m;_7+|##1FS}3fYnM2 zu$qYhRy#4kP>2DBLJTkzVt}DMI^dBQ%}|axAY6L24a&o%SC* zH9Hd#!qlHPiSZ+)9K0$1oChbL0SkhF1wp`qAYefdq!5u$bNTa6EpPwy00000NkvXX Hu0mjfA|+{c literal 0 HcmV?d00001 diff --git a/icons/document.png b/icons/document.png new file mode 100644 index 0000000000000000000000000000000000000000..9f9e9e7b50c34ea7888901f7f8a56f17cba02272 GIT binary patch literal 2258 zcmV;@2rc)CP)#Bb2tn=U!T= zr%FiBL(g1$YdH1>?WrfC{sr86#5uLSImZGA5FjBcC}{yFv3I9(ylcOCJ2N{byR$Da zpS0Tb#*ruU`MvkeH!pS|ga8jd*y6e11y2YwctV)L6T%Fh5N7a%FoP$A89X7(;0a*{ zPY5%3LYQG|I-DQ~sx-B}6+$dLi=A{Gh<@-DE?Q;Oo41!?1x{+0f%2QU4l<@xci75hAQ(MT!o%C3@zWz%ZVy!3wIqFQD)l9Vm>=c&mCD{cwC=A_QZ^lg5Wy&8 zX6A3hJR!{B31J3L2s3y>n86dm44x2X@PsgfCxjV1Aj zFAfX8Tm|U1`#X=_^jLx6d9{Cz(7CreIXEXrkI41wj)7biks8t@QV>xk;7U{4=V>`j zSvWe*eg0{G0@F#1@X;lc+8It}I=L~8jtEUIo@C9DMus4hPmdDG=)FPl_OuYfEg`)< z@)Y5zlgWgmcR4;H#XFp)F)3xCG}XI~aTLVzTCB1DuN9groY1uhA}FFtkTFpTfnfuaMYEG;R72$j;ZQCF%% zD&F8EI(k^VEu}2Cgk;l|DOGjlG(}UEvY^L?!Y+nV7eqEvXi;|%9nD)S_~Eh;;tsea zWH^9+x>}Rf6;)MKt`3OMMTR0>fvRrA7KOZgwC;DL=}9k~5rV_BarU$@0k-Iou zQDtQ-bA_RPxG3lkvh@R85rU&*?9Dw;o7k_Je3R5Ak&=>;QC1PD9U7SnSY0J>kgA4r zBGnJK5rV^WsIKVRLsL5>nHy;y>lT2*AaixmQ9gQ#6FU~}Bjh%!AD_$)(^Ev(94f0r zwGfPxh2TbHE;yIDDTv%%!v9a{C}pAgaVC_bBGN>N$s$oID;+r^o4zWNxvKfV(E%<9 z>Af4UUlX3FS){5+eyk)zM*>Mpm<&)DhmK^fG$)#Z4o(PpFsvWv&dj2fxh_=^izHT9 zBzfi`#90z5@~c$P6?AYxh_wDVQ#VJ4(nM55MjRuV8>#C?MrBpwS5c@OUi=gXgrNE{ zcgk*c9#aAc8M#qHA|oSn-52r{WI?z{e_kpfRNjThr}U{xRXZ}on3NT+8+kGpDv1ur zS|%;}^HK@H(NRA!4dc7F6NQymJMdyKRwygOsvKzjfJzH_3YEi)Q8FQ@eypb}gK?;` z)|F{WLj?7!l!~j&zt#@K;ce1iauy+tk53}sO4rDsYGSad85+N;f^At7NOTMwUW`%+ z!5dQHu_Fe1J(5$FR$1k&JLsyMiOfx5S`elvjS!r!rY817?a?Rx&pQ ziH;@Ha|Tv&HM!(+B{hx=@JmlMbXaiLbuMQ;;g4Q2tx-zZIjmnC5_n|HFEO(5; z3BlnR&K$}v{Bm1CEw*JT5fybG+CtUCt3#oLWIEhuYX*x%W3y9LMeByjR#z5s9;_%F zUU!7x(5%l)!1&H>`4)*pgs%Hg5gClOWlg|M9(mCLg%ffU*NW}kpoM=N(F4PIwu52NTWWfw@9p%RhphQpUlOu*|Mc5gpk&~ zl|jGi*seDqoZhFGy01X@p$%x)rpe*OD1?ya%@>2~@aWrWi^OCgf`XhuRPf!FHG#-o zqr;0)OoZG=^`ky1*9|E$R8FqJuTt40e1k$lUdyNs%1;BD|MBPKJ3?Oczb9nyNjWUI35e-^>=J@ix&qx7x_A_h**sIx z6XFn~e9I0_S(jgOh_&SKP-CR8lO05e2M_qq?PUf}2s3y>n86dm44x2X@PsgfCxjV1 gA;M1& literal 0 HcmV?d00001 diff --git a/icons/exit.png b/icons/exit.png new file mode 100644 index 0000000000000000000000000000000000000000..51bf7cf19500d066b6a745fbd665efae4df0a629 GIT binary patch literal 1548 zcmV+n2J`ueP)PGI}|~?d`;f8tj0X^ z$JLrNprVkRZj8O&-YInl!``%LlT%U1Eklo$%D9$aMqkeVi^j9_4R_^!*z<7B+fa2< z=OOF0whr_~*B&&`+=Bds=n;u#5JH1I=GN<0=)u%Pq3hjWHhZ@Hf>pt_%zzoLR^9kvfF4>hNsp1j3m)JfF*ga8{n0 zPA)pqN7ff2|{dA zlwu(EN>Wz7wp$(uae$(fup}L{D+Po&1eY?lz00-~Q=6?f3wHPO28pyH<#c-DV3f+2 zvby#hV{DQ+)FhVfK z%*($@?cq|+ZF>Mc9Sn6=Bc-8ohzPsa*TNUqMs7}aUdb(SDTf(jzn1$vge(u>Quv*s zVEiM-cwf01L5N3iDaYbTpAVCt%1Hqs9>RCjyxh7~DJKPlcnsf7QzGTQH5Cw21Gtpl za75v2Dr@(ffsh)&&uCs+%oY$ry^OKHN?QO^Cmu6$a}s^OxR5U}_SAY^U=ZRFIYUPy zQfXg_Yp3rABHM6AakCvNoY$zdKKYhW>%m6>ve{L$HFY5ZY zi<)-0(&rmSh}UP$&CF+U8K=_M^(I0-pHtNnX3B+-TK?*<=Z zENE)4T^R_3*n^KTD8_HhsD+9HKC?g$v4NFtZ6!d6b$Vx2^|I52LddcRW6W_G2!x0S z2oVerA{ZbzVARd@J3mBeW^-D-Q#V5R z+O>#>I-LeWmSEIX$g0(=?7YO(9l|$&@f{YmgoiAzUpOYJkR3nY%AFtj`&#}~dP2L{ zfUnCF3I3m8syY185OGS6pODb=@dV|E7kMc00v@hJdcB=nm=;nBKhB$^^5~MG z?>rQV)BafV%9{<`1caFRGRCQPS@~#6E%fb=#L$6oY~|tkZU926DFowalFDyob?sz_ z;-g1m35ka@CjlWA;g3vRHjJ}dh!i;#iP8Re!jU`!LhKfN_Z{pDy7pL4C_)FDTWsYS z5aLt?7^f0czObb0eNO~}N`EY2DbIiqrz^rZ8X(dz!RVwPlhBDoE2$>WfDkt;#dshh z(X%QuwjGHjh?zVCLcFLPZ$TI~e}o zXFx~|;CUu2Nka^wSACcSUP!dk?ojyNOfLwjAw16{sXUxB^j$||3F*_>X%Hd;{Mm%< yvNFo^3c`$Y65-0000LnWU5K%w{r~AB1Gy{K@3~=KJ%$?|Uy1#u$b04~~Ug_zNK+K0`=|&oE`Zok%1S z8kHjiV=N+mo2L>|BchZ~e)zb+Q$nId6c1E)d5j>@=!aH4*1Q>Q~hlDtSyDE!Ih}{^(s<UFAp@dYWXtLE#7 zgy32eI;tOj9AYH|+uTmTut%e$C<+yC+)#pxE*<+k597#$vG!!66|I3Bi+$ z{rs3_Qzd9)W238+uW_Z1S-hY)m9qoJxMz2g=ZSW|rZ zoq)T_9I#7UTdGu;9D~(W54-2+;VvPXrfXa12Js!GRi^+P`~OZ?63NuaWy06g&WFhj^T# zv$ItC>o0xh?(Qya2RxZI5FyH!UsCC-uk@yZEO%x|c@+p$6iQ1HtqV>0x8L^WyLn**~m=^aD@*CX-Zp;t7)G=G24tfBK1v0iKcNj1Wi% z5p4UO74)fhrbW zt%A>~6cv}3_1(HH8HfD4!%EHj5>k5iUHx-xYKpRNzInJC8wBD&5&8O5iqcO%P15n> zY7=Zp1vOoMADiHzaauZiKb0lT%$PHIM+q^M0`&y3FBDiomW{M8R4CHPeg^tdQ1wHr zEIfVfzyDT0OOizCmtS_{d2tR=LNNG*#}$uLer`^^A5u%c_GugLvEPB(GzZ>RUqZw% zMLM0P=+&#E`_()efRM`1Kdbk{p*p~Rt)}NBU^al0d+evOe3`k^JT63j#rtc1^pOv4 z&IY{x04f)mRyU%(7zifCs>D%3^SI*bLubrEDSi6sXz#0^I>J3e!W~G6BSO;FF!`u~ zheJ_J;rL3uKH6}KwH{gfto-r|0Pc(~Kt}(8oM`DcH6~ zqd_%ZIqw5Pw%>oB_BEGW9X14(5Ew~qA%ghn)0D|%^j&JMWE2yAtfO&7q0;s1`ldQ; z=$9eo7)u+%w9zkga=ENVpG_|Cg$vykEnWiwM7Xyantg^1?$>4c0SHC#@I3lsaZ$hT z%)<{KeX+JUJ)_lP8L_TRAc_UjsFRST)JE{d7hlwOZT|i{DPMm*n)^a_b!Ue*g{JK5 zuRA_{dfq@jG2k|%+ zPn^&<@q{WjZge(|q9{Vk|0~#e)*xC@-4l!e>rF_NNSu&p}gx}(IEDqnX zvB5GcD@JNycGeVjHx3P=4S{r6Bm^i5uI27`-%*WAiI-s&Tsx7V`usd?3RRuOQ>O;5 z$Qf^yWgTcG5|nB*NJd9!$ma9j-wW(VG)nnTJ~3`(WreaYyfE;kg0%>yCLNW}KGU1_ zfBm(i$E{%vm$CiZZ?t>smVQw+jKh;^10Yz0X!GRb@i^r!Ueucr;ZnpCcAf0i zt46B(!3U}G)Ki^fhR7iWix5FYAZ}DyS?GM!1P!hA?I z-+@XQEmhkK!Hi|~f>>Uf%c;wJB!oHin54SLDebQ-r6rl9)V+IDE|>LP?LYri1Co`U9piYrmGHC@Rv2*9 zso|W)_uuP>l#d^$Eau6$RFxBKLeNPLbUY)MjIH@Laioh9lE4YWm4Y@3{y;ooDTEc@*wJ6NYuBmlSQ`o9cxNOtz7NF6miZWLs~&)wvkXY+@t? zwgghb)eA355auxI+x!@@4|vhExPM555<)gpx4D$SrG+|TV3WI%oOicfjGh}z^3B1C?B!cHQr@OXOPWT~uXv-dtb&&kPr4wn(pM&~*r zk%-=4-8V4+IUY`ni$o&&XU14W+!y{^bT5oRI>_}umJABGgp2@vRo0|}`%webHx3P} z$_fb?F+v;Sb96~ah|waH5T79=#AgTz@e_#Xe`j!vcgrp}!2kdN07*qoM6N<$g3E@h A(*OVf literal 0 HcmV?d00001 diff --git a/icons/grid.png b/icons/grid.png new file mode 100644 index 0000000000000000000000000000000000000000..1a2cd39c522f82d83e1184704be2a58530629e63 GIT binary patch literal 814 zcmeAS@N?(olHy`uVBq!ia0vp^DIm2BR01_q`F zo-U3d6?5L+G3-)u6gl?smFoqE4a&iL8}BVJ{VF6?-FfWD7G7STvo=i^R&;hW&YZX) zAxW*NgX3Eet61N;5CgmG`44|LUNCqQ{Hx!T+wQpcBp1Ox`<%vB#{&i&Gp;;7{n4g> zf5^XuDxQ0Or$4r4;c0FtWV`rZbz0SrefiIi73!Fob1+$(^EhwZ87Ojd=Pyf@_pRLb z6%!;tDiZ|^c$nHiCP}a{9#+65c;@o6M}M!K{Cj-e`djb6mpPfu4qbWW@}bk~W%$@j z_r{&we>TPFnc~9|tCgRB=BT~AzAFB+^}C~wuXP%8?3KUXaKQ3B?_OD@rD3aQCOce~ zmVH_jnNqa*X2|KMmtwBJF1?yz;_~d<@7k-czn&>w84@(t&pl;b*xIoAKQoOzmIet{ z3%)G5#dgtfN!s(zmC{Qhbh^&Q>WF=d`mZ;2kGP)ACPJ=9@~6dgnRolA{9ko4C270! z7xzU$(z>62#>n=&7sqOdoLSx`bnW%lTRCQFL3-1Lf1iky?sfY%D_T8aM=8^}olh40 zFYB06wtKDK^zNCkdxi`5Sgt)0yO_!_6h^NC;Wbxxg4 zGp?5L(mS;_OuIN_rMdno+lSXqe&12*#71=V104d?(_Z+RMW(r-(rVL-%|G}csiiaM amHzRPK!XtX;9tNDz~JfX=d#Wzp$P!?NoAq{ literal 0 HcmV?d00001 diff --git a/icons/grid_close.png b/icons/grid_close.png new file mode 100644 index 0000000000000000000000000000000000000000..df6da86ac6725b1a9efccdbee37f1cd65a4fcc93 GIT binary patch literal 1252 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 B8BYKJ literal 0 HcmV?d00001 diff --git a/icons/open.png b/icons/open.png new file mode 100644 index 0000000000000000000000000000000000000000..5103f236267c63f511c7b7c9e513e4ea9b934700 GIT binary patch literal 2480 zcmaLZXEYlM8wYS&S5YG($~7A?Dn{)+gQC<3u^QB<5^7gziy|S^NUUm0Ym1m|RneMp zZCdM6JF$wlv8y!Vy5HaT{qTQ&=RD{6`akDMwy`qhU=v_tU|`@dH#3Hx>-}$7n9pZ0 zCCC08)?hQ|Fb0Opz<wlmP|zR3jJ_IR}6TnIVI%vUx`Ejj$TC!apvsMz45m zbGkg9qTh?~X^n{J9gooSYuI`qma)EnbaqDD->xR{Ctx(E?=&l1&IOR}uqv|uKLkst z8tLQ1rGK0EOgH!?jC14_=6fYMS8!-Bw)<5t>nrT&wUZ>Axe)54s9luye)vbGR$ zaj!Y9wVpD#%`O^U7iF{w6}ngWSa(aLCGgz^_(jpg~R9K8UQG6;xK zno7NOEoM(DH&@Vh_S@Gd^A4kYUIE1g?c1p7S+><*LgX34_85TalLKQU!pCVu*!}4`9Q(=OXa6#AClY#FBp7dv66m({I z;Vn%w8u}qL4$x2b3o#PNC87#ni+5Vo({09T0TEsD_o=$cbc*Kk7j9wF)(1$JSETUO zsr}9aYxR)THz=>j1|aYk*B&{K{)CMnKjkP=WqaFjzsW`a(F%XHm0G&TWo&hUBd{-r zyYgxp1Ov#qC}}aLW$j$mU%aWYH(+tdn94j_QUhg2m1*XUE}ax>=_oaY<9OxZ%skBQ z0h*cIG=q&j6)(%{;7)-krlS`XU5rxgp))%D*O4k-`Tb%(P>rKXwkI(=l|TU~7E7){ zy#AR&Hy{CBTK54nag@PJe<(wgRe9;ERX~YIAe`Xh9n;Mfon*#&$Y&2ej;9+WkmIai z@m(kvdsiKrkRk%%*#`QlUk-d>XRUxJTvr+w2jJgp0i;UV3(#M=L>Jx*UX0c?7Vh?z zHs{9TOkDhmWt^Au)f)(qjv_!@{snbB|I7{UP*yLzzkSJS%HgCck&?ei> z7CSM` zuPGl;7tCnPPh~Fi=F=!#poKHuWp_8Ds6d2&o*)>j;nxFehskrF?NXe^b)qQwM!B1~ zTTG|HVtHyqtK38B?HaMdUZO*tr*}lg*Msit=GLWwz;gvNa}?1e>Q-~tgD+QTZ zHarrIXNXJ9g%*t>)VS>(h}@EBWyM{vsC$TTA=$R=dv#D}mAdh!rdQ7b{b(YKS^eH12%{*}Sk#oN`fGS|t%tYb6Wp&h2W zijVr0bQwmyz4xw zvr(ltbd#f|N4!7wDi@5PGmlTAs3PPn4DDnGeVn56J_vZ@CU=N9Y4BUNqqneuO{0vA z>P*@V=E1p1P^W^NwB#~`9!s65Jhs~vSVQUU_K1UG-*OQ(;lBgJgIM0_&94b-oi!}8qxQK61WX0`zuou3GO zlDw=og*OFs&3Ch3H&J7I0ik<^V~+&$m0UnKpB+P;Uv?vHgMAT7#Q1Pejor}-vN9}i z@(s_}bmhIA#bl}Qne~BT;rsILuHD_w_1Q+Wq@%8R2bO8?8Eoa6I~!b+x^=g<@KND2 zlQn+-9Qy{eud%lEw<5_c%OqD>^e`;FQABFi28;Q#{`XG-W(%xGJ(~Z&k;lYvc2TW_ Wva#TwRdN1;F_@cJ8P~$@#Qy^ppRGaw literal 0 HcmV?d00001 diff --git a/icons/pan.png b/icons/pan.png new file mode 100644 index 0000000000000000000000000000000000000000..f9e27c0ff5fa5488e68b2add2660451fef0b0e2e GIT binary patch literal 9603 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 literal 0 HcmV?d00001 diff --git a/icons/pan_1.png b/icons/pan_1.png new file mode 100644 index 0000000000000000000000000000000000000000..7750700bbaf180809498ceccb987061276446660 GIT binary patch literal 1778 zcmVdHh@kCxpUjcoiO<0t3+s$Ad?K=^Mx=}Au#7eX)s z4}XvrxFA80L4qKI1VM)Lf^g2;2$Eq9=LF%LS2^cH&iRUS4pqb%yvqGC=e&*}nW=HA z+RHh=WQ-)TM>kAwF4MZ|Xt`PpW>u~OeT}aYnRKVdi}g;L5eCvf&$|5GP+R~oV+Zo z*XzhnYvHp5&BAy#=Lsq{JI<>e*Gc`ruG0knrL@(QLX zy&(7Z_estN1xmNuWwY6ATNQ=ZUazNKSCPJyeG2kJQu`H2uixc(f)}rQ_R#BS0(=_n z+ICs|5VW*fE!OY%jmh&oPtPgVBU?xija`nacD`x*_o%YRT zJ2^RFolfVU=jZ1iPft%jZKs0-k$il7u=#w>4h|0fjB5IaII!7lb|5PNp~9twOqS&R z{eAo9^YgRNC>0V!Ufe}V;J+MkO4bM#|&Zu zIIS7b;K))5{HzbpyN29mxkGSgbZj- z6dH;NZHS%qA#iELsK*)MxfM`H4U)tniLtB zPAK!AUPPGUwTx(;ZPuriwfkkiB2Z$_29S*Zd;7BJ%&+uY9W7hb;YLB^29V~ z|0SP(1nXIjv8p}+ep$?yX0E(Ea)|XW3=;(=5{sH)8avwLWx1HE+yn^|1)ea7+HjFt zt)>bxc1{pQlqu6ff5Il;$BJQUzq*rxD8hL9qAieHT&RV?gQJxl(_HV>J_HfJ1MKE{ zZfP_csLhzRdICID)lvwe2-7z$aRh%Hn=pp;OLD1M6)K2`C|msU1(uLNC`PWPs!%}` zVT@)Bwr;muNRELr!yv{YZ&QUr5Ji}Fm@r_mD@1o5JQfshZX)gZqqy+KPPjDj$9gID0?UK2%mqH=4o2=h+!uLQIY1XDRYlM zRwd4Aq2HDF3+W3j2BR01_tIk zo-U3d6?5Lsz3VL!DA9gjv-5_>AFchS8}u#(b=nn7zpz_RmE%gD&aPK_KHqQM4(oZL z&(WmAA+o!}POqtCug5Q^4x^Q2-B*m3IPkP|CUf07x5lbE?c4P;?;Bm`+_imf`+3Ln zuX8M`j~Vy|bMW1M!NkqQsQmnX0ngzbYD&G1_J+|9mS)bHULrb8DaF-ov-HH@Q_>C_ zeDb+$vwU%7nA4VkfC!C+0Vl+{#Kgp&9KRE@YkG-Po1)c{C8C$AlIBkleNz z%aSKELc&5VdwH8uloW-}&-c9janh6mxqTj|u6#LvHGZpyr?$(<6`E&DLq5DXe*e<7 zi;BJzJ1*ZaO3EoQS^PabBuwwW;mV?W`=qwp@QZuDe)8?|cO$!>xnBd01;xDHwCU{3 zYu9>|UUa!VEi&2l@bxYKck%yLdUO4Md$nOw(U$}Bwz6t!n$MZyqd4n=YO9mUBImCB z;to;YhZ~-LOfk}&KiN~a^u`kr({0&?zQuKmzq5Otxce~i^y9x9XT544!F@T)(|bP%pMhG4WH)wZ+qKt<*Wd4-JV*B6 zF211M=I&8^(=)aGS5G){-IDV8C4U0h@ zYFmA};n8~WrzPiou0`FsGC|vU=~b=v4vX6yR?$1OTzG}j%6r>N|Hzp?Ub7A5vrE*;)Rd5N;} zur*J*zG_HLyyd$6u#e&g&%Mvzl$D+qYw-97(#+nLz*3jc!M0lm6zE)x%}xg{%)4^= z?7UwSX9=Zm7v18#TVVCf;Qfo1#i+^My>!b8;&7Ch#1fiP%QDwhulT)r)!~|oZ!co2 r|NZ0y8Ep`@OOuJo9uy%$N}t%dJi}F$+ny8wGe3i;tDnm{r-UW||2Wzx literal 0 HcmV?d00001 diff --git a/icons/select.png b/icons/select.png new file mode 100644 index 0000000000000000000000000000000000000000..71c01d6f8455a20468feabbdee9e4117aa41c25e GIT binary patch literal 1247 zcmV<51R(o~P)@(zuT+xS2*Gn2hUQ?pGsHZnHQ$iTo< zQ@KEsLpecQP?qJAUBO`4NR8CUzj!Db7@P(Q$DK<{W50D+_THPBuAW!j(?1wCcyDLw z%{SH6Q(fIH&N-^=XkTSvOBIMQRUpPxff!Q-VoVi?G5s$P5m^+G_absbM3zNlVXQZ4 zNKJhY5s{C;&%ieD1Mmh|1=gH%n%<%>dt(mzj5qS&z5@FXQ z{yYUXYW$h5Hb8CwCls&wFW@iwD8!$ewR!ulHb9nv+uTpx+=xGGV{YEs0P*i1 z9|p2#(tF#9KhC+efv#;rt;Rz{bh)<(D56wa;^4xkjK zM0U(e+m>L^1IS9~&6FSynXkYN0~bmj~qvoPpcb#fD3p7uY)49E1A_=4e<<6LN?E}m0?2v>aU?q! z^o=3dPse8ogUDj*M~Zf6Dq9#t0=c4ShnBL2K_rk(V|lIYVGt8Tu$7K40tN~bcD9u4 zh?OtmTPmTzE*8jDL(SG!36qLqn=EVTct4@&NY0)T%M)cFP&4Vm{8O&}{u=V>MiF9N4W1;sa68V7JFl>5gV zUqS)JLenPTRQN3R{LSO_?(0}MRE+@s)`l@QDB9~~t@r%Dnd2GGxyz$yzLY&=xyMsH z)icKCDcV35QoVxwJGjTxoKlw|vd zgsR4$fEPno6y_XLQZ6;VH4hkM-h8F>5a0cMIM2bL96hD@Est`8QvB`+xiw#-*sdZc zD5KdwBo`>7+R!BjD5Kk9$2yczZh2%G%4qkXvI=F?n}S({GWuQGtU(z)5R5^oK!U75 zsX!XC0Hp%irFlcCK=x2VD8JA8Qt|2c7%8XjTczx)hfI;8r?ehFsX%5(0ZOOAtO}%s zBA|30S*$=>st1%_!@Lzp2X%nbd(6E8>8KV^q6#1?kRF->CAu1=0_mweps17v)fdA^ zg_p;(z^@v0S`~;f)h5fBDiC9;K#ZvZF{TQ{m?{ussz59W_zD1cuj-I$hj#z~002ov JPDHLkV1h=PHN5}; literal 0 HcmV?d00001 diff --git a/icons/toolbox.png b/icons/toolbox.png new file mode 100644 index 0000000000000000000000000000000000000000..30773e03b44047de44f187895dfebfe631a3913d GIT binary patch literal 1973 zcmb7_X*3&%8iu2mh>#jrMJ>IdxD1UbwUxG%DXnGfYi%j2ilCM-6>|�DVo33~VFu8~Dv2QDgD0 z!d!Y_bp)LpaS}{_!{p8KfuAdVFow@3@o0^Q$ zG4=ITvrYO+i!W+dDlb$}INgD! zH=f7ayB!y{iz_Op~Sx1j-1W}pI%aI%cp|LlEB?(m6 zGSX%%ycy!Ijn;~=#2+0;kyjD^7@pO_DQnknbXRw6d3NtwQ4(v4y>^pGh#sf)DGA-_>$x z;Z~Q*t)AP9EpLqVEs@{s{stR=@t2vC&D_hO)1wuMuLY;O}ws)`9!<-$fzyD(5Lz{&a&qCpEWhU}?sl%Y%cgcpja zzY=%|S5~TCs=FmEBS!VCGs{<3GYbSIdWycy?%YfDg%2z%hWo8xL5Dw%8M$v()^4U~ z{f$ZYrci2$9iP#25kcj!_0*u-Fkk@xJxC}dt?g-BIoq!u`X4`?O48XQ=HJASy59~^ zgTpxHGo8_rxG^oYOL3kv<+Nc&XKRe3^CB<9E_$A2V^C{%zT&Uc#QMo1Qg4mC zU?!a1-QqHzp?X)C=LCtBY>U|J^w4(b?7K~^6Lp*Tl$S+tK5nP5KIvqjUAnzx{-j%K zXy;SE17^7&HQa7ctJ_Z8|NJ5UW_A~H?JnI-RpXVbT~KGAw;%d6(iQCcDBI3yWaJvz zZk+0MQ3E14M!rW{BuUz2tx;5XiIqZK>r-<5Vw8Brq}lzWA$W8Xm4)085#*B*74Uw% z424!X!hK-b3IFOgl}Vg3I#ww2aIMXZK(f~~8%-gGuBu}{3NpnYC=a#L_Z}}!%|lVf zo83ZTje-z}VQhQl4Vj99Z2y5YluaW?wDM|4HTz2vx(FWmso)Bi!aKjjlO1Oz03Dxv z4Kj8(#plu^b$tXxpxlae*51aIi!3=i2DS@%HVn1SvipJi?|VLow%@l8Yo;~AX*gpD z;z<|BA*i%OQ}v}(PUH-^l2#*rI5l!nHAH-)S>MO0D&XD=yx|`zI)vOUBYWZFaC}bG zB#di$dkedx3-y6R$dV>#)~M{wR2gfkLv zV`-}XcuyxxKjmNptn}3U*IkdC3ath8rWWg7q;5)ZOl;QG^d0#gUbLP$$uu@S{x|0k z9|^%sXc+1xddEd_H~~796F3%fum=%FZw)B6OlLGw_L@{=_i??3{|}n}3A2wpfMXzz XOXF&PVD1@v0RU5D3!^GS56nLRX_uw% literal 0 HcmV?d00001 diff --git a/icons/tools.png b/icons/tools.png new file mode 100644 index 0000000000000000000000000000000000000000..e73e9f070f641aebd55a777ae902987ed0adaecb GIT binary patch literal 2613 zcmV-53d;3~P)R%gNqOpqVIYYA za$dFx01KvR<{R+`$6eB)6T>jDVbcPaBAAS6nx&}Qs8}o}Iy*ZvXw`&}Bq5|5+kp^* z$2uXTObA&SA0JV@e0bohNE#x)A zz$3T3ysX7iw5}LRSjvEe1L;gIG{W#6Gqba^N-ZVSLa;Gq%~HZrvVtEOB@D+>9zJ}i z)KY47Src@iZ3L7FfsdMq7zX_K@dIqz&fUL%Um28IKvMKyRZ#A7T+(eAMvCD)ud)q* z0hVRqk-L5Swh}0TKn%l3(gD_$6cocSdIX;OB+tpkVzKOjfj+~l-QC^0gpf%>$X}N) zU+x$i8|xS!AMco)ob14#;TS*&`CAf(bD*VUvsq~i3moHypT&ibyc$mw1d;a`+0z)K(khCBS@Be3>Jb5Dg@P>6+VNWNq-I!c)CnxUAlCs%nJi`_3G71I-SlCLI!AXQ51$_Dbv%_!j=*Sq*jCf$pS?ZMniP{ z`t|aS8#mC(3W6})pXH{erhY;h85zkA4-Ydz3IkHFOR5Q_8DV&J^XAPA9bZIXxUX}g zqodi8k&(P@+m8{_`Sa)NLJ0%H;*eTxjB5gCoRjW3cv_^o$KrC3xyII zIx!4m+c)*CrFA;3T~XLg$%Ie1G(Xns5Ak4-Gqt$7;e7s`J9m^M-my1Mp22?avK9h%UZE*dq@=wU|ccG&_-#Lx~Zjb z1sj8;3I@uutb}dbNdXu*G59M82C%Le3T7y(mXxIkz`)O&SX|xsZMHc&I*K5EPJ=mN z;KU&GZ(v$eH%)UzBAY~&Tub2&Its!_1;Iesww=)d19;ceX=AK#IE=b9!6(@@tc>G|tiZ6xNdz zL_e2BQNcjHd-o2zqJjz-pgS+CmK69mfz}Zv46ja}Jel9w*-29vg>T=!39TARS5QeP zB@wER6%5qY)>fvcr^m4nQ5euj3xQt~gbL@ZEp{+es-Z=nGW_0)) zQ45Sltx#-pNlfoq7{fj7~rqd@Qdzdrz_tpvQUe*E=w^CuWCkdHP^G~-mFuPg=mBU zw6SY-A*qlIN)^IQc(jIElmpQW188H1jwPPdB3)3l#=n$ySrNftT67Xj!sEUd)$uQ7 z77`~IAeMy3E9^SUs=az877{lYUP**eSfw=nB@HCbFkDe6|5JWvzoZO`RF~BZFn}#H zQdY|1U&27<$9hxE0K=8UmbI)>68{ncLYG(9ngxcd2%vy06z(xZu=t)w+ViPozFOnU zmoM=7^Jn<_^(!1YbO;U~J`5*LoPZ-oj`&Z-oMi487#EOMfZ>W43RXtFdGiK7e*6g6 zu3dvwjw7x4c5d-(L} zllQG|-hJ#@2X&om%#F^$tsD3H@ZkgQDi;XDRU(may0WdUE&p3w13VLu#nla6YYh!g zh-L{!Zf{jNtQF;9Ex(y2-)vB^%4Anv6e2&jb;yHbIAP;f?7 zPk0XQc@iMzuW;ga3>83$ZQX{aB6ts!{{DVgTB`3-|{9 XR$)eym;o9000000NkvXXu0mjfpt!h( literal 0 HcmV?d00001 diff --git a/icons/view.png b/icons/view.png new file mode 100644 index 0000000000000000000000000000000000000000..21c0b4b531855fd81418685089fd8ad142ba8a51 GIT binary patch literal 483 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 Qu>b%707*qoM6N<$f`+ck^#A|> literal 0 HcmV?d00001 diff --git a/icons/zoom_to.png b/icons/zoom_to.png new file mode 100644 index 0000000000000000000000000000000000000000..ef0e28b4473a48042b5df793d6ebe5ae3e883ef5 GIT binary patch literal 3862 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 Y1M>$QVzFZ+rT_o{07*qoM6N<$f+9v;y8r+H literal 0 HcmV?d00001 diff --git a/plugins/basic_change/otsu.py b/plugins/basic_change/otsu.py new file mode 100644 index 0000000..962075f --- /dev/null +++ b/plugins/basic_change/otsu.py @@ -0,0 +1,42 @@ +import numpy as np + +def OTSU(hist): + + u1=0.0#背景像素的平均灰度值 + u2=0.0#前景像素的平均灰度值 + th=0.0 + + #总的像素数目 + PixSum= np.sum(hist) + #各灰度值所占总像素数的比例 + PixRate=hist / PixSum + #统计各个灰度值的像素个数 + Max_var = 0 + #确定最大类间方差对应的阈值 + GrayScale = len(hist) + for i in range(1,len(hist)):#从1开始是为了避免w1为0. + u1_tem=0.0 + u2_tem=0.0 + #背景像素的比列 + w1=np.sum(PixRate[:i]) + #前景像素的比例 + w2=1.0-w1 + if w1==0 or w2==0: + pass + else:#背景像素的平均灰度值 + for m in range(i): + u1_tem=u1_tem+PixRate[m]*m + u1 = u1_tem * 1.0 / w1 + #前景像素的平均灰度值 + for n in range(i,GrayScale): + u2_tem = u2_tem + PixRate[n]*n + u2 = u2_tem / w2 + #print(u1) + #类间方差公式:G=w1*w2*(u1-u2)**2 + tem_var=w1*w2*np.power((u1-u2),2) + #print(tem_var) + #判断当前类间方差是否为最大值。 + if Max_var + + icons\change_detect.png + icons\cancel.svg + icons\clear.svg + icons\edit.svg + icons\exit.png + icons\export.svg + icons\font.svg + icons\full.svg + icons\create.png + icons\data_load.png + icons\delete.png + icons\document.png + icons\filter.png + icons\grid_close.png + icons\grid.png + icons\layer.png + icons\open.png + icons\pan.png + icons\pan_1.png + icons\save.png + icons\select.png + icons\toolbox.png + icons\tools.png + icons\view.png + icons\zoom_in.png + icons\zoom_out.png + icons\zoom_to.png + icons\load.svg + icons\logo.svg + icons\model.svg + icons\ok.svg + icons\outline.svg + icons\paint.svg + icons\pan.svg + icons\qt.svg + icons\settings.svg + icons\splash.png + icons\start.svg + icons\vector.svg + icons\zoomin.svg + icons\zoomout.svg + + diff --git a/rscder/gui/actions.py b/rscder/gui/actions.py index d264543..99b2e9a 100644 --- a/rscder/gui/actions.py +++ b/rscder/gui/actions.py @@ -2,7 +2,7 @@ import logging import os from pathlib import Path from PyQt5 import QtCore, QtGui, QtWidgets -from PyQt5.QtWidgets import QAction, QActionGroup, QLabel, QFileDialog +from PyQt5.QtWidgets import QAction, QActionGroup, QLabel, QFileDialog, QMenuBar from rscder.gui.project import Create from rscder.utils.project import Project from rscder.utils.misc import singleton @@ -44,19 +44,20 @@ class ActionManager(QtCore.QObject): self.menubar = None self.status_bar = None - def set_menus(self, menubar): + def set_menus(self, menubar:QMenuBar): self.menubar = menubar - self.file_menu = menubar.addMenu('&文件') - self.basic_menu = menubar.addMenu('&基本工具') - self.change_detection_menu = menubar.addMenu('&通用变化检测') - self.special_chagne_detec_menu = menubar.addMenu('&专题变化检测') + self.file_menu = menubar.addMenu( '&文件') + self.basic_menu = menubar.addMenu( '&基本工具') + self.change_detection_menu = menubar.addMenu( '&通用变化检测') + self.special_chagne_detec_menu = menubar.addMenu( '&专题变化检测') self.seg_chagne_detec_menu = menubar.addMenu('&分类后变化检测') - self.postop_menu = menubar.addMenu('&检测后处理') + self.postop_menu = menubar.addMenu( '&检测后处理') self.view_menu = menubar.addMenu('&视图') self.plugin_menu = menubar.addMenu('&插件') - self.help_menu = menubar.addMenu('&帮助') + self.help_menu = menubar.addMenu( '&帮助') + @property def menus(self): return { @@ -83,16 +84,17 @@ class ActionManager(QtCore.QObject): ''' File menu ''' - project_create = self.add_action(QAction('&工程创建', self.w_parent), 'File') - project_open = self.add_action(QAction('&打开工程', self.w_parent), 'File') - project_save = self.add_action(QAction('&保存工程', self.w_parent), 'File') - data_load = self.add_action(QAction('&数据加载', self.w_parent), 'File') - view_setting = self.add_action(QAction('&界面定制', self.w_parent), 'File') - exit_app = self.add_action(QAction('&退出', self.w_parent), 'File') + project_create = self.add_action(QAction(QtGui.QIcon( ':/icons/create.png' ), '&工程创建', self.w_parent), 'File') + project_open = self.add_action(QAction(QtGui.QIcon( ':/icons/open.png' ), '&打开工程', self.w_parent), 'File') + project_save = self.add_action(QAction(QtGui.QIcon( ':/icons/save.png' ),'&保存工程', self.w_parent), 'File') + data_load = self.add_action(QAction(QtGui.QIcon( ':/icons/data_load.png' ),'&数据加载', self.w_parent), 'File') + view_setting = self.add_action(QAction(QtGui.QIcon( ':/icons/view.png' ),'&界面定制', self.w_parent), 'File') + exit_app = self.add_action(QAction(QtGui.QIcon( ':/icons/exit.png' ),'&退出', self.w_parent), 'File') project_create.triggered.connect(self.project_create) project_open.triggered.connect(self.project_open) project_save.triggered.connect(self.project_save) data_load.triggered.connect(self.data_load) + view_setting.triggered.connect(self.view_setting) exit_app.triggered.connect(self.w_parent.close) @@ -103,9 +105,9 @@ class ActionManager(QtCore.QObject): self.file_menu.addAction(project_open) self.file_menu.addAction(project_save) self.file_menu.addAction(data_load) - self.file_menu.addAction(view_setting) + # self.file_menu.addAction(view_setting) self.file_menu.addAction(exit_app) - + self.view_menu.addAction(view_setting) if self.toolbar is not None: self.toolbar.addAction(project_create) self.toolbar.addAction(project_open) @@ -114,14 +116,14 @@ class ActionManager(QtCore.QObject): ''' Basic menu ''' - grid_line = self.add_action(QAction('&网格线', self.w_parent), 'Basic Line') + grid_line = self.add_action(QAction(QtGui.QIcon( ':/icons/grid.png' ),'&网格线', self.w_parent), 'Basic Line') grid_line.setCheckable(True) grid_line.setChecked(True) - zomm_in = self.add_action(QAction('&放大', self.w_parent), 'Basic') - zomm_out = self.add_action(QAction('&缩小', self.w_parent), 'Basic') - pan = self.add_action(QAction('&漫游', self.w_parent), 'Basic') - locate = self.add_action(QAction('&定位', self.w_parent), 'Basic') + zomm_in = self.add_action(QAction(QtGui.QIcon( ':/icons/zoom_out.png' ),'&放大', self.w_parent), 'Basic') + zomm_out = self.add_action(QAction(QtGui.QIcon( ':/icons/zoom_in.png' ),'&缩小', self.w_parent), 'Basic') + pan = self.add_action(QAction(QtGui.QIcon( ':/icons/pan_1.png' ),'&漫游', self.w_parent), 'Basic') + locate = self.add_action(QAction(QtGui.QIcon( ':/icons/zoom_to.png' ),'&定位', self.w_parent), 'Basic') pan.setCheckable(True) pan.setChecked(True) @@ -143,7 +145,7 @@ class ActionManager(QtCore.QObject): ''' Plugin menu ''' - plugin_list = self.add_action(QAction('&插件列表', self.w_parent), 'Plugin') + plugin_list = self.add_action(QAction(QtGui.QIcon( ':/icons/toolbox.png' ),'&插件列表', self.w_parent), 'Plugin') plugin_list.triggered.connect(self.plugin_list) self.plugin_menu.addAction(plugin_list) @@ -163,10 +165,10 @@ class ActionManager(QtCore.QObject): if self.status_bar is not None: corr_widget = QLabel(self.status_bar) # corr_widget.setLineWidth(200) - corr_widget.setFixedWidth(200) + corr_widget.setFixedWidth(250) self.status_bar.addWidget(corr_widget) scale_widget = QLabel(self.status_bar) - scale_widget.setFixedWidth(200) + scale_widget.setFixedWidth(250) self.status_bar.addWidget(scale_widget) self.double_map.corr_changed.connect(corr_widget.setText) self.double_map.scale_changed.connect(scale_widget.setText) diff --git a/rscder/gui/layercombox.py b/rscder/gui/layercombox.py index 8e6b2a6..6fbfbf7 100644 --- a/rscder/gui/layercombox.py +++ b/rscder/gui/layercombox.py @@ -1,15 +1,19 @@ from PyQt5.QtWidgets import QComboBox +from PyQt5.QtGui import QIcon from rscder.utils.project import Project class LayerCombox(QComboBox): def __init__(self, parent=None): super().__init__(parent) - self.addItem('---', None) for layer in Project().layers.values(): self.addItem(layer.name, layer.id) + for i in range(self.count() - 1): + self.setItemIcon(i + 1, QIcon(':/icons/layer.png')) + + self.currentIndexChanged.connect(self.on_changed) self.current_layer = None diff --git a/rscder/gui/layertree.py b/rscder/gui/layertree.py index 4e7a0d4..eec75d7 100644 --- a/rscder/gui/layertree.py +++ b/rscder/gui/layertree.py @@ -32,6 +32,7 @@ class LayerTree(QtWidgets.QWidget): self.tree.setHeaderHidden(True) # self.tree.setHeaderLabels(['图层']) self.root.setText(0,'图层') + self.root.setIcon(0,QtGui.QIcon(':/icons/layer.png')) # child1=QTreeWidgetItem() # child1.setText(0,'child1') @@ -98,6 +99,7 @@ class LayerTree(QtWidgets.QWidget): layer:PairLayer = Project().layers[layer] item_root = QtWidgets.QTreeWidgetItem(self.root) item_root.setText(0,layer.name) + item_root.setIcon(0, QtGui.QIcon(':/icons/document.png')) item_root.setData(0, Qt.UserRole, LayerTree.LAYER_TOOT) item_root.setData(0, Qt.UserRole + 1, layer.id) item_root.setCheckState(0, Qt.Checked if layer.enable else Qt.Unchecked) @@ -112,18 +114,21 @@ class LayerTree(QtWidgets.QWidget): grid_item.setText(0,'格网') grid_item.setData(0, Qt.UserRole, LayerTree.GRID) grid_item.setCheckState(0, Qt.Checked if layer.grid_enable else Qt.Unchecked) + grid_item.setIcon(0, QtGui.QIcon(':/icons/grid.png')) item1 = QtWidgets.QTreeWidgetItem(item_root) item1.setText(0, layer.l1_name) item1.setCheckState(0, Qt.Checked if layer.l1_enable else Qt.Unchecked) item1.setData(0, Qt.UserRole, LayerTree.SUB_RASTER) item1.setData(0, Qt.UserRole + 1, LayerTree.LEFT_RASTER) + item1.setIcon(0, QtGui.QIcon(':/icons/layer.png')) item2 = QtWidgets.QTreeWidgetItem(item_root) item2.setText(0, layer.l2_name) item2.setCheckState(0, Qt.Checked if layer.l2_enable else Qt.Unchecked) - item1.setData(0, Qt.UserRole, LayerTree.SUB_RASTER) - item1.setData(0, Qt.UserRole + 1, LayerTree.RIGHT_RASTER) + item2.setData(0, Qt.UserRole, LayerTree.SUB_RASTER) + item2.setData(0, Qt.UserRole + 1, LayerTree.RIGHT_RASTER) + item2.setIcon(0, QtGui.QIcon(':/icons/layer.png')) for ri, item in enumerate(layer.results): item_result = QtWidgets.QTreeWidgetItem(item_root) @@ -131,6 +136,8 @@ class LayerTree(QtWidgets.QWidget): item_result.setCheckState(0, Qt.Checked if item.enable else Qt.Unchecked) item_result.setData(0, Qt.UserRole, LayerTree.RESULT) item_result.setData(0, Qt.UserRole + 1, ri) + + item_result.setIcon(0, QtGui.QIcon(':/icons/vector.svg')) self.tree.expandAll() diff --git a/rscder/gui/mainwindow.py b/rscder/gui/mainwindow.py index b90a2ae..598f43e 100644 --- a/rscder/gui/mainwindow.py +++ b/rscder/gui/mainwindow.py @@ -22,7 +22,7 @@ class MainWindow(QMainWindow): self.setWindowTitle(QApplication.applicationName() + ' ' + str(self.current_instance)) else: self.setWindowTitle(QApplication.applicationName()) - self.setWindowIcon(QIcon(":/icons/logo.svg")) + self.setWindowIcon(QIcon(":/icons/change_detect.png")) self.setAcceptDrops(True) self.setContextMenuPolicy(Qt.CustomContextMenu) diff --git a/rscder/gui/result.py b/rscder/gui/result.py index c977156..8464cf1 100644 --- a/rscder/gui/result.py +++ b/rscder/gui/result.py @@ -2,7 +2,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import Qt,QModelIndex, pyqtSignal from PyQt5.QtGui import QStandardItemModel, QStandardItem -from PyQt5.QtWidgets import (QTableWidgetItem, QTableWidget, QAbstractItemView, QHeaderView, QStyleFactory) +from PyQt5.QtWidgets import (QTableWidgetItem, QTableWidget, QMessageBox, QAbstractItemView, QHeaderView, QStyleFactory) from rscder.utils.project import PairLayer, Project, ResultLayer @@ -56,9 +56,16 @@ class ResultTable(QtWidgets.QWidget): y = self.tablewidget.item(row, 1).text() self.on_item_click.emit({'x':float(x), 'y':float(y)}) + def save(self): + if self.result is None: + return + self.result.save() + def on_result(self, layer_id, result_id): self.is_in_set_data = True result = Project().layers[layer_id].results[result_id] + if result != self.result: + self.save() self.result = result self.clear() self.set_data(result) diff --git a/rscder/res.qrc b/rscder/res.qrc deleted file mode 100644 index 76b52ba..0000000 --- a/rscder/res.qrc +++ /dev/null @@ -1,26 +0,0 @@ - - - icons\assessment.svg - icons\cancel.svg - icons\clear.svg - icons\edit.svg - icons\exit.svg - icons\export.svg - icons\font.svg - icons\full.svg - icons\load.svg - icons\logo.svg - icons\model.svg - icons\ok.svg - icons\outline.svg - icons\paint.svg - icons\pan.svg - icons\qt.svg - icons\settings.svg - icons\splash.png - icons\start.svg - icons\vector.svg - icons\zoomin.svg - icons\zoomout.svg - - diff --git a/rscder/utils/project.py b/rscder/utils/project.py index 761af95..506bfda 100644 --- a/rscder/utils/project.py +++ b/rscder/utils/project.py @@ -83,6 +83,8 @@ class Project(QObject): 'root': self.root, 'layers': [ layer.to_dict(None if self.file_mode == Project.ABSOLUTE_MODE else self.root) for layer in self.layers.values() ], } + for layer in self.layers.values(): + layer.save() with open(self.file, 'w') as f: yaml.safe_dump(data_dict, f) # yaml.safe_dump(data_dict, open(self.file, 'w')) @@ -129,19 +131,16 @@ class Project(QObject): else: self.message_box.error(player.msg) -class VectorLayer: - pass - class GridLayer: def set_render(self): symbol_layer = QgsSimpleLineSymbolLayer() - symbol_layer.setWidth(1) - symbol_layer.setColor(QColor.fromRgb(255,255,255, 100)) + symbol_layer.setWidth(1 * self.x_res) + symbol_layer.setColor(QColor.fromRgb(255,255,255, 200)) symbol = QgsLineSymbol() symbol.changeSymbolLayer(0, symbol_layer) - + symbol.setWidthUnit(QgsUnitTypes.RenderMapUnits) render = QgsSingleSymbolRenderer(symbol) self.lines_layer.setRenderer(render) @@ -228,6 +227,14 @@ class ResultLayer: self.enable = False self.parent = parent + def save(self): + if self.layer_type == ResultLayer.POINT: + with open(self.path, 'w') as f: + f.write('x,y,diff,status\n') + for i in range(len(self.data)): + f.write('{},{},{},{}\n'.format(self.data[i][0], self.data[i][1], self.data[i][2], int(self.data[i][3]))) + + def update(self, data): if self.layer_type == ResultLayer.POINT: row = data['row'] @@ -403,6 +410,11 @@ class PairLayer: layer.results.append(ResultLayer.from_dict(r, layer, root)) # layer.grid_layer = GridLayer.from_dict(data['grid_layer']) return layer + + def save(self): + for r in self.results: + r.save() + def __init__(self, pth1, pth2, cell_size) -> None: self.pth1 = pth1 self.pth2 = pth2