12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959 |
- """
- @package psmap.dialogs
- @brief dialogs for wxPsMap
- Classes:
- - dialogs::TCValidator
- - dialogs::PenStyleComboBox
- - dialogs::CheckListCtrl
- - dialogs::PsmapDialog
- - dialogs::PageSetupDialog
- - dialogs::MapDialog
- - dialogs::MapFramePanel
- - dialogs::RasterPanel
- - dialogs::VectorPanel
- - dialogs::RasterDialog
- - dialogs::MainVectorDialog
- - dialogs::VPropertiesDialog
- - dialogs::LegendDialog
- - dialogs::MapinfoDialog
- - dialogs::ScalebarDialog
- - dialogs::TextDialog
- - dialogs::ImageDialog
- - dialogs::NorthArrowDialog
- - dialogs::PointDialog
- - dialogs::RectangleDialog
- (C) 2011-2012 by Anna Kratochvilova, and the GRASS Development Team
- This program is free software under the GNU General Public License
- (>=v2). Read the file COPYING that comes with GRASS for details.
- @author Anna Kratochvilova <kratochanna gmail.com> (bachelor's project)
- @author Martin Landa <landa.martin gmail.com> (mentor)
- """
- import os
- import sys
- import string
- from copy import deepcopy
- import wx
- import wx.lib.scrolledpanel as scrolled
- import wx.lib.filebrowsebutton as filebrowse
- from wx.lib.mixins.listctrl import CheckListCtrlMixin, ListCtrlAutoWidthMixin
- from wx.lib.expando import ExpandoTextCtrl, EVT_ETC_LAYOUT_NEEDED
- try:
- import wx.lib.agw.floatspin as fs
- except ImportError:
- fs = None
- import grass.script as grass
- from core import globalvar
- from core.utils import _, PilImageToWxImage
- from dbmgr.vinfo import VectorDBInfo
- from gui_core.gselect import Select
- from core.gcmd import RunCommand, GError, GMessage
- from gui_core.dialogs import SymbolDialog
- from psmap.utils import *
- from psmap.instructions import *
- # grass.set_raise_on_error(True)
- PSMAP_COLORS = [
- 'aqua',
- 'black',
- 'blue',
- 'brown',
- 'cyan',
- 'gray',
- 'grey',
- 'green',
- 'indigo',
- 'magenta',
- 'orange',
- 'purple',
- 'red',
- 'violet',
- 'white',
- 'yellow']
- class TCValidator(wx.PyValidator):
- """validates input in textctrls, combobox, taken from wxpython demo"""
- def __init__(self, flag=None):
- wx.PyValidator.__init__(self)
- self.flag = flag
- self.Bind(wx.EVT_CHAR, self.OnChar)
- def Clone(self):
- return TCValidator(self.flag)
- def Validate(self, win):
- tc = self.GetWindow()
- val = tc.GetValue()
- if self.flag == 'DIGIT_ONLY':
- for x in val:
- if x not in string.digits:
- return False
- return True
- def OnChar(self, event):
- key = event.GetKeyCode()
- if key < wx.WXK_SPACE or key == wx.WXK_DELETE or key > 255:
- event.Skip()
- return
- if self.flag == 'DIGIT_ONLY' and chr(key) in string.digits + '.-':
- event.Skip()
- return
- # if self.flag == 'SCALE' and chr(key) in string.digits + ':':
- # event.Skip()
- # return
- if self.flag == 'ZERO_AND_ONE_ONLY' and chr(key) in '01':
- event.Skip()
- return
- if not wx.Validator_IsSilent():
- wx.Bell()
- # Returning without calling even.Skip eats the event before it
- # gets to the text control
- return
- class PenStyleComboBox(wx.combo.OwnerDrawnComboBox):
- """Combo for selecting line style, taken from wxpython demo"""
- # Overridden from OwnerDrawnComboBox, called to draw each
- # item in the list
- def OnDrawItem(self, dc, rect, item, flags):
- if item == wx.NOT_FOUND:
- # painting the control, but there is no valid item selected yet
- return
- r = wx.Rect(*rect) # make a copy
- r.Deflate(3, 5)
- penStyle = wx.SOLID
- if item == 1:
- penStyle = wx.LONG_DASH
- elif item == 2:
- penStyle = wx.DOT
- elif item == 3:
- penStyle = wx.DOT_DASH
- pen = wx.Pen(dc.GetTextForeground(), 3, penStyle)
- dc.SetPen(pen)
- # for painting the items in the popup
- dc.DrawText(self.GetString(item),
- r.x + 3,
- (r.y + 0) + ((r.height / 2) - dc.GetCharHeight()) / 2
- )
- dc.DrawLine(r.x + 5, r.y + ((r.height / 4) * 3) + 1,
- r.x + r.width - 5, r.y + ((r.height / 4) * 3) + 1)
- def OnDrawBackground(self, dc, rect, item, flags):
- """Overridden from OwnerDrawnComboBox, called for drawing the
- background area of each item."""
- # If the item is selected, or its item # iseven, or we are painting the
- # combo control itself, then use the default rendering.
- if (item & 1 == 0 or flags & (wx.combo.ODCB_PAINTING_CONTROL |
- wx.combo.ODCB_PAINTING_SELECTED)):
- wx.combo.OwnerDrawnComboBox.OnDrawBackground(
- self, dc, rect, item, flags)
- return
- # Otherwise, draw every other background with different colour.
- bgCol = wx.Colour(240, 240, 250)
- dc.SetBrush(wx.Brush(bgCol))
- dc.SetPen(wx.Pen(bgCol))
- dc.DrawRectangleRect(rect)
- def OnMeasureItem(self, item):
- """Overridden from OwnerDrawnComboBox, should return the height
- needed to display an item in the popup, or -1 for default"""
- return 30
- def OnMeasureItemWidth(self, item):
- """Overridden from OwnerDrawnComboBox. Callback for item width, or
- -1 for default/undetermined"""
- return -1 # default - will be measured from text width
- class CheckListCtrl(wx.ListCtrl, CheckListCtrlMixin, ListCtrlAutoWidthMixin):
- """List control for managing order and labels of vector maps in legend"""
- def __init__(self, parent):
- wx.ListCtrl.__init__(
- self, parent, id=wx.ID_ANY, style=wx.LC_REPORT | wx.LC_SINGLE_SEL |
- wx.BORDER_SUNKEN | wx.LC_VRULES | wx.LC_HRULES)
- CheckListCtrlMixin.__init__(self)
- ListCtrlAutoWidthMixin.__init__(self)
- class PsmapDialog(wx.Dialog):
- def __init__(self, parent, id, title, settings, apply=True):
- wx.Dialog.__init__(self, parent=parent, id=wx.ID_ANY,
- title=title, size=wx.DefaultSize,
- style=wx.CAPTION | wx.MINIMIZE_BOX | wx.CLOSE_BOX)
- self.apply = apply
- self.id = id
- self.parent = parent
- self.instruction = settings
- self.objectType = None
- self.unitConv = UnitConversion(self)
- self.spinCtrlSize = (65, -1)
- self.Bind(wx.EVT_CLOSE, self.OnClose)
- def AddUnits(self, parent, dialogDict):
- parent.units = dict()
- parent.units['unitsLabel'] = wx.StaticText(
- parent, id=wx.ID_ANY, label=_("Units:"))
- choices = self.unitConv.getPageUnitsNames()
- parent.units['unitsCtrl'] = wx.Choice(
- parent, id=wx.ID_ANY, choices=choices)
- parent.units['unitsCtrl'].SetStringSelection(
- self.unitConv.findName(dialogDict['unit']))
- def AddPosition(self, parent, dialogDict):
- if not hasattr(parent, "position"):
- parent.position = dict()
- parent.position['comment'] = wx.StaticText(parent, id=wx.ID_ANY, label=_(
- "Position of the top left corner\nfrom the top left edge of the paper"))
- parent.position['xLabel'] = wx.StaticText(
- parent, id=wx.ID_ANY, label=_("X:"))
- parent.position['yLabel'] = wx.StaticText(
- parent, id=wx.ID_ANY, label=_("Y:"))
- parent.position['xCtrl'] = wx.TextCtrl(
- parent, id=wx.ID_ANY, value=str(
- dialogDict['where'][0]), validator=TCValidator(
- flag='DIGIT_ONLY'))
- parent.position['yCtrl'] = wx.TextCtrl(
- parent, id=wx.ID_ANY, value=str(
- dialogDict['where'][1]), validator=TCValidator(
- flag='DIGIT_ONLY'))
- if 'unit' in dialogDict:
- x = self.unitConv.convert(
- value=dialogDict['where'][0],
- fromUnit='inch',
- toUnit=dialogDict['unit'])
- y = self.unitConv.convert(
- value=dialogDict['where'][1],
- fromUnit='inch',
- toUnit=dialogDict['unit'])
- parent.position['xCtrl'].SetValue("%5.3f" % x)
- parent.position['yCtrl'].SetValue("%5.3f" % y)
- def AddExtendedPosition(self, panel, gridBagSizer, dialogDict):
- """Add widgets for setting position relative to paper and to map"""
- panel.position = dict()
- positionLabel = wx.StaticText(
- panel, id=wx.ID_ANY, label=_("Position is given:"))
- panel.position['toPaper'] = wx.RadioButton(
- panel, id=wx.ID_ANY, label=_("relative to paper"), style=wx.RB_GROUP)
- panel.position['toMap'] = wx.RadioButton(
- panel, id=wx.ID_ANY, label=_("by map coordinates"))
- panel.position['toPaper'].SetValue(dialogDict['XY'])
- panel.position['toMap'].SetValue(not dialogDict['XY'])
- gridBagSizer.Add(
- positionLabel, pos=(
- 0, 0), span=(
- 1, 3), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT, border=0)
- gridBagSizer.Add(
- panel.position['toPaper'],
- pos=(
- 1,
- 0),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT,
- border=0)
- gridBagSizer.Add(
- panel.position['toMap'],
- pos=(
- 1,
- 1),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT,
- border=0)
- # first box - paper coordinates
- box1 = wx.StaticBox(parent=panel, id=wx.ID_ANY, label="")
- sizerP = wx.StaticBoxSizer(box1, wx.VERTICAL)
- self.gridBagSizerP = wx.GridBagSizer(hgap=5, vgap=5)
- self.AddPosition(parent=panel, dialogDict=dialogDict)
- panel.position['comment'].SetLabel(
- _("Position from the top left\nedge of the paper"))
- self.AddUnits(parent=panel, dialogDict=dialogDict)
- self.gridBagSizerP.Add(
- panel.units['unitsLabel'], pos=(
- 0, 0), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerP.Add(
- panel.units['unitsCtrl'], pos=(
- 0, 1), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerP.Add(
- panel.position['xLabel'], pos=(
- 1, 0), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerP.Add(panel.position['xCtrl'], pos=(
- 1, 1), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerP.Add(
- panel.position['yLabel'], pos=(
- 2, 0), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerP.Add(panel.position['yCtrl'], pos=(
- 2, 1), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerP.Add(
- panel.position['comment'], pos=(
- 3, 0), span=(
- 1, 2), flag=wx.ALIGN_BOTTOM, border=0)
- self.gridBagSizerP.AddGrowableCol(1)
- self.gridBagSizerP.AddGrowableRow(3)
- sizerP.Add(
- self.gridBagSizerP,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- gridBagSizer.Add(
- sizerP, pos=(
- 2, 0), span=(
- 1, 1), flag=wx.ALIGN_CENTER_HORIZONTAL | wx.EXPAND, border=0)
- # second box - map coordinates
- box2 = wx.StaticBox(parent=panel, id=wx.ID_ANY, label="")
- sizerM = wx.StaticBoxSizer(box2, wx.VERTICAL)
- self.gridBagSizerM = wx.GridBagSizer(hgap=5, vgap=5)
- eastingLabel = wx.StaticText(panel, id=wx.ID_ANY, label="E:")
- northingLabel = wx.StaticText(panel, id=wx.ID_ANY, label="N:")
- panel.position['eCtrl'] = wx.TextCtrl(panel, id=wx.ID_ANY, value="")
- panel.position['nCtrl'] = wx.TextCtrl(panel, id=wx.ID_ANY, value="")
- east, north = PaperMapCoordinates(
- mapInstr=self.instruction[self.mapId],
- x=dialogDict['where'][0],
- y=dialogDict['where'][1],
- paperToMap=True)
- panel.position['eCtrl'].SetValue(str(east))
- panel.position['nCtrl'].SetValue(str(north))
- self.gridBagSizerM.Add(
- eastingLabel, pos=(0, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerM.Add(
- northingLabel, pos=(1, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerM.Add(panel.position['eCtrl'], pos=(
- 0, 1), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerM.Add(panel.position['nCtrl'], pos=(
- 1, 1), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerM.AddGrowableCol(0)
- self.gridBagSizerM.AddGrowableCol(1)
- sizerM.Add(
- self.gridBagSizerM,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- gridBagSizer.Add(
- sizerM, pos=(2, 1),
- flag=wx.ALIGN_LEFT | wx.EXPAND, border=0)
- def AddFont(self, parent, dialogDict, color=True):
- parent.font = dict()
- ## parent.font['fontLabel'] = wx.StaticText(parent, id = wx.ID_ANY, label = _("Choose font:"))
- ## parent.font['fontCtrl'] = wx.FontPickerCtrl(parent, id = wx.ID_ANY)
- ##
- # parent.font['fontCtrl'].SetSelectedFont(
- # wx.FontFromNativeInfoString(dialogDict['font'] + " " + str(dialogDict['fontsize'])))
- # parent.font['fontCtrl'].SetMaxPointSize(50)
- ##
- # if color:
- ## parent.font['colorLabel'] = wx.StaticText(parent, id = wx.ID_ANY, label = _("Choose color:"))
- ## parent.font['colorCtrl'] = wx.ColourPickerCtrl(parent, id = wx.ID_ANY, style=wx.FNTP_FONTDESC_AS_LABEL)
- # parent.font['colorCtrl'].SetColour(dialogDict['color'])
- # parent.font['colorCtrl'].SetColour(convertRGB(dialogDict['color']))
- parent.font['fontLabel'] = wx.StaticText(
- parent, id=wx.ID_ANY, label=_("Font:"))
- parent.font['fontSizeLabel'] = wx.StaticText(
- parent, id=wx.ID_ANY, label=_("Font size:"))
- fontChoices = [
- 'Times-Roman',
- 'Times-Italic',
- 'Times-Bold',
- 'Times-BoldItalic',
- 'Helvetica',
- 'Helvetica-Oblique',
- 'Helvetica-Bold',
- 'Helvetica-BoldOblique',
- 'Courier',
- 'Courier-Oblique',
- 'Courier-Bold',
- 'Courier-BoldOblique']
- parent.font['fontCtrl'] = wx.Choice(
- parent, id=wx.ID_ANY, choices=fontChoices)
- if dialogDict['font'] in fontChoices:
- parent.font['fontCtrl'].SetStringSelection(dialogDict['font'])
- else:
- parent.font['fontCtrl'].SetStringSelection('Helvetica')
- parent.font['fontSizeCtrl'] = wx.SpinCtrl(
- parent, id=wx.ID_ANY, min=4, max=50, initial=10)
- parent.font['fontSizeCtrl'].SetValue(dialogDict['fontsize'])
- if color:
- parent.font['colorLabel'] = wx.StaticText(
- parent, id=wx.ID_ANY, label=_("Choose color:"))
- parent.font['colorCtrl'] = wx.ColourPickerCtrl(
- parent, id=wx.ID_ANY)
- parent.font['colorCtrl'].SetColour(convertRGB(dialogDict['color']))
- ## parent.font['colorLabel'] = wx.StaticText(parent, id = wx.ID_ANY, label = _("Color:"))
- # colorChoices = [ 'aqua', 'black', 'blue', 'brown', 'cyan', 'gray', 'green', 'indigo', 'magenta',\
- # 'orange', 'purple', 'red', 'violet', 'white', 'yellow']
- ## parent.colorCtrl = wx.Choice(parent, id = wx.ID_ANY, choices = colorChoices)
- # parent.colorCtrl.SetStringSelection(parent.rLegendDict['color'])
- ## parent.font['colorCtrl'] = wx.ColourPickerCtrl(parent, id = wx.ID_ANY)
- # parent.font['colorCtrl'].SetColour(dialogDict['color'])
- def OnApply(self, event):
- ok = self.update()
- if ok:
- self.parent.DialogDataChanged(id=self.id)
- return True
- else:
- return False
- def OnOK(self, event):
- """Apply changes, close dialog"""
- ok = self.OnApply(event)
- if ok:
- self.Close()
- def OnCancel(self, event):
- """Close dialog"""
- self.Close()
- def OnClose(self, event):
- """Destroy dialog and delete it from open dialogs"""
- if self.objectType:
- for each in self.objectType:
- if each in self.parent.openDialogs:
- del self.parent.openDialogs[each]
- event.Skip()
- self.Destroy()
- def _layout(self, panel):
- # buttons
- btnCancel = wx.Button(self, wx.ID_CANCEL)
- btnOK = wx.Button(self, wx.ID_OK)
- btnOK.SetDefault()
- if self.apply:
- btnApply = wx.Button(self, wx.ID_APPLY)
- # bindigs
- btnOK.Bind(wx.EVT_BUTTON, self.OnOK)
- btnOK.SetToolTipString(_("Close dialog and apply changes"))
- #btnCancel.Bind(wx.EVT_BUTTON, self.OnCancel)
- btnCancel.SetToolTipString(_("Close dialog and ignore changes"))
- btnCancel.Bind(wx.EVT_BUTTON, self.OnCancel)
- if self.apply:
- btnApply.Bind(wx.EVT_BUTTON, self.OnApply)
- btnApply.SetToolTipString(_("Apply changes"))
- # sizers
- btnSizer = wx.StdDialogButtonSizer()
- btnSizer.AddButton(btnCancel)
- if self.apply:
- btnSizer.AddButton(btnApply)
- btnSizer.AddButton(btnOK)
- btnSizer.Realize()
- mainSizer = wx.BoxSizer(wx.VERTICAL)
- mainSizer.Add(
- item=panel,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- mainSizer.Add(item=btnSizer, proportion=0,
- flag=wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border=5)
- self.SetSizer(mainSizer)
- mainSizer.Layout()
- mainSizer.Fit(self)
- class PageSetupDialog(PsmapDialog):
- def __init__(self, parent, id, settings):
- PsmapDialog.__init__(
- self,
- parent=parent,
- id=id,
- title="Page setup",
- settings=settings)
- self.cat = [
- 'Units',
- 'Format',
- 'Orientation',
- 'Width',
- 'Height',
- 'Left',
- 'Right',
- 'Top',
- 'Bottom']
- labels = [
- _('Units'),
- _('Format'),
- _('Orientation'),
- _('Width'),
- _('Height'),
- _('Left'),
- _('Right'),
- _('Top'),
- _('Bottom')]
- self.catsLabels = dict(zip(self.cat, labels))
- paperString = RunCommand('ps.map', flags='p', read=True, quiet=True)
- self.paperTable = self._toList(paperString)
- self.unitsList = self.unitConv.getPageUnitsNames()
- self.pageSetupDict = settings[id].GetInstruction()
- self._layout()
- if self.pageSetupDict:
- self.getCtrl('Units').SetStringSelection(
- self.unitConv.findName(self.pageSetupDict['Units']))
- if self.pageSetupDict['Format'] == 'custom':
- self.getCtrl('Format').SetSelection(
- self.getCtrl('Format').GetCount() - 1)
- else:
- self.getCtrl('Format').SetStringSelection(
- self.pageSetupDict['Format'])
- if self.pageSetupDict['Orientation'] == 'Portrait':
- self.getCtrl('Orientation').SetSelection(0)
- else:
- self.getCtrl('Orientation').SetSelection(1)
- for item in self.cat[3:]:
- val = self.unitConv.convert(
- value=self.pageSetupDict[item],
- fromUnit='inch',
- toUnit=self.pageSetupDict['Units'])
- self.getCtrl(item).SetValue("%4.3f" % val)
- if self.getCtrl('Format').GetSelection() != self.getCtrl(
- 'Format').GetCount() - 1: # custom
- self.getCtrl('Width').Disable()
- self.getCtrl('Height').Disable()
- else:
- self.getCtrl('Orientation').Disable()
- # events
- self.getCtrl('Units').Bind(wx.EVT_CHOICE, self.OnChoice)
- self.getCtrl('Format').Bind(wx.EVT_CHOICE, self.OnChoice)
- self.getCtrl('Orientation').Bind(wx.EVT_CHOICE, self.OnChoice)
- self.btnOk.Bind(wx.EVT_BUTTON, self.OnOK)
- def update(self):
- self.pageSetupDict['Units'] = self.unitConv.findUnit(
- self.getCtrl('Units').GetStringSelection())
- self.pageSetupDict['Format'] = self.paperTable[
- self.getCtrl('Format').GetSelection()]['Format']
- if self.getCtrl('Orientation').GetSelection() == 0:
- self.pageSetupDict['Orientation'] = 'Portrait'
- else:
- self.pageSetupDict['Orientation'] = 'Landscape'
- for item in self.cat[3:]:
- self.pageSetupDict[item] = self.unitConv.convert(
- value=float(self.getCtrl(item).GetValue()),
- fromUnit=self.pageSetupDict['Units'],
- toUnit='inch')
- def OnOK(self, event):
- try:
- self.update()
- except ValueError:
- wx.MessageBox(
- message=_("Literal is not allowed!"),
- caption=_('Invalid input'),
- style=wx.OK | wx.ICON_ERROR)
- else:
- event.Skip()
- def _layout(self):
- size = (110, -1)
- # sizers
- mainSizer = wx.BoxSizer(wx.VERTICAL)
- pageBox = wx.StaticBox(
- self,
- id=wx.ID_ANY,
- label=" %s " %
- _("Page size"))
- pageSizer = wx.StaticBoxSizer(pageBox, wx.VERTICAL)
- marginBox = wx.StaticBox(
- self, id=wx.ID_ANY, label=" %s " %
- _("Margins"))
- marginSizer = wx.StaticBoxSizer(marginBox, wx.VERTICAL)
- horSizer = wx.BoxSizer(wx.HORIZONTAL)
- #staticText + choice
- choices = [
- self.unitsList, [
- item['Format'] for item in self.paperTable], [
- _('Portrait'), _('Landscape')]]
- propor = [0, 1, 1]
- border = [5, 3, 3]
- self.hBoxDict = {}
- for i, item in enumerate(self.cat[:3]):
- hBox = wx.BoxSizer(wx.HORIZONTAL)
- stText = wx.StaticText(
- self, id=wx.ID_ANY, label=self.catsLabels[item] + ':')
- choice = wx.Choice(
- self,
- id=wx.ID_ANY,
- choices=choices[i],
- size=size)
- hBox.Add(
- stText,
- proportion=propor[i],
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- border=border[i])
- hBox.Add(choice, proportion=0, flag=wx.ALL, border=border[i])
- if item == 'Units':
- hBox.Add(size, 1)
- self.hBoxDict[item] = hBox
- #staticText + TextCtrl
- for item in self.cat[3:]:
- hBox = wx.BoxSizer(wx.HORIZONTAL)
- label = wx.StaticText(
- self, id=wx.ID_ANY, label=self.catsLabels[item] + ':')
- textctrl = wx.TextCtrl(self, id=wx.ID_ANY, size=size, value='')
- hBox.Add(
- label,
- proportion=1,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- border=3)
- hBox.Add(
- textctrl,
- proportion=0,
- flag=wx.ALIGN_CENTRE | wx.ALL,
- border=3)
- self.hBoxDict[item] = hBox
- sizer = list([mainSizer] + [pageSizer] * 4 + [marginSizer] * 4)
- for i, item in enumerate(self.cat):
- sizer[i].Add(
- self.hBoxDict[item],
- 0, wx.GROW | wx.RIGHT | wx.LEFT, 5)
- # OK button
- btnSizer = wx.StdDialogButtonSizer()
- self.btnOk = wx.Button(self, wx.ID_OK)
- self.btnOk.SetDefault()
- btnSizer.AddButton(self.btnOk)
- btn = wx.Button(self, wx.ID_CANCEL)
- btnSizer.AddButton(btn)
- btnSizer.Realize()
- horSizer.Add(
- pageSizer,
- proportion=0,
- flag=wx.LEFT | wx.RIGHT | wx.BOTTOM,
- border=10)
- horSizer.Add(marginSizer, proportion=0, flag=wx.LEFT |
- wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=10)
- mainSizer.Add(horSizer, proportion=0, border=10)
- mainSizer.Add(
- btnSizer,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx.ALL,
- border=10)
- self.SetSizer(mainSizer)
- mainSizer.Fit(self)
- def OnChoice(self, event):
- currPaper = self.paperTable[self.getCtrl('Format').GetSelection()]
- currUnit = self.unitConv.findUnit(
- self.getCtrl('Units').GetStringSelection())
- currOrientIdx = self.getCtrl('Orientation').GetSelection()
- newSize = dict()
- for item in self.cat[3:]:
- newSize[item] = self.unitConv.convert(
- float(currPaper[item]),
- fromUnit='inch', toUnit=currUnit)
- enable = True
- if currPaper['Format'] != _('custom'):
- if currOrientIdx == 1: # portrait
- newSize['Width'], newSize['Height'] = newSize[
- 'Height'], newSize['Width']
- for item in self.cat[3:]:
- self.getCtrl(item).ChangeValue("%4.3f" % newSize[item])
- enable = False
- self.getCtrl('Width').Enable(enable)
- self.getCtrl('Height').Enable(enable)
- self.getCtrl('Orientation').Enable(not enable)
- def getCtrl(self, item):
- return self.hBoxDict[item].GetItem(1).GetWindow()
- def _toList(self, paperStr):
- sizeList = list()
- for line in paperStr.strip().split('\n'):
- d = dict(zip([self.cat[1]] + self.cat[3:], line.split()))
- sizeList.append(d)
- d = {}.fromkeys([self.cat[1]] + self.cat[3:], 100)
- d.update(Format=_('custom'))
- sizeList.append(d)
- return sizeList
- class MapDialog(PsmapDialog):
- """Dialog for map frame settings and optionally raster and vector map selection"""
- def __init__(self, parent, id, settings, rect=None, notebook=False):
- PsmapDialog.__init__(
- self,
- parent=parent,
- id=id,
- title="",
- settings=settings)
- self.isNotebook = notebook
- if self.isNotebook:
- self.objectType = ('mapNotebook',)
- else:
- self.objectType = ('map',)
- # notebook
- if self.isNotebook:
- self.notebook = wx.Notebook(
- parent=self, id=wx.ID_ANY, style=wx.BK_DEFAULT)
- self.mPanel = MapFramePanel(
- parent=self.notebook,
- id=self.id[0],
- settings=self.instruction,
- rect=rect,
- notebook=True)
- self.id[0] = self.mPanel.getId()
- self.rPanel = RasterPanel(
- parent=self.notebook, id=self.id[1],
- settings=self.instruction, notebook=True)
- self.id[1] = self.rPanel.getId()
- self.vPanel = VectorPanel(
- parent=self.notebook, id=self.id[2],
- settings=self.instruction, notebook=True)
- self.id[2] = self.vPanel.getId()
- self._layout(self.notebook)
- self.SetTitle(_("Map settings"))
- else:
- self.mPanel = MapFramePanel(
- parent=self,
- id=self.id[0],
- settings=self.instruction,
- rect=rect,
- notebook=False)
- self.id[0] = self.mPanel.getId()
- self._layout(self.mPanel)
- self.SetTitle(_("Map frame settings"))
- def OnApply(self, event):
- """Apply changes"""
- if self.isNotebook:
- okV = self.vPanel.update()
- okR = self.rPanel.update()
- if okV and self.id[2] in self.instruction:
- self.parent.DialogDataChanged(id=self.id[2])
- if okR and self.id[1] in self.instruction:
- self.parent.DialogDataChanged(id=self.id[1])
- if not okR or not okV:
- return False
- ok = self.mPanel.update()
- if ok:
- self.parent.DialogDataChanged(id=self.id[0])
- return True
- return False
- def OnCancel(self, event):
- """Close dialog and remove tmp red box"""
- self.parent.canvas.pdcTmp.RemoveId(self.parent.canvas.idZoomBoxTmp)
- self.parent.canvas.Refresh()
- self.Close()
- def updateDialog(self):
- """Update raster and vector information"""
- if self.mPanel.scaleChoice.GetSelection() == 0:
- if self.mPanel.rasterTypeRadio.GetValue():
- if 'raster' in self.parent.openDialogs:
- if self.parent.openDialogs['raster'].rPanel.rasterYesRadio.GetValue() and \
- self.parent.openDialogs['raster'].rPanel.rasterSelect.GetValue() == self.mPanel.select.GetValue():
- self.mPanel.drawMap.SetValue(True)
- else:
- self.mPanel.drawMap.SetValue(False)
- else:
- if 'vector' in self.parent.openDialogs:
- found = False
- for each in self.parent.openDialogs[
- 'vector'].vPanel.vectorList:
- if each[0] == self.mPanel.select.GetValue():
- found = True
- self.mPanel.drawMap.SetValue(found)
- class MapFramePanel(wx.Panel):
- """wx.Panel with map (scale, region, border) settings"""
- def __init__(self, parent, id, settings, rect, notebook=True):
- wx.Panel.__init__(self, parent, id=wx.ID_ANY, style=wx.TAB_TRAVERSAL)
- self.id = id
- self.instruction = settings
- if notebook:
- self.book = parent
- self.book.AddPage(page=self, text=_("Map frame"))
- self.mapDialog = self.book.GetParent()
- else:
- self.mapDialog = parent
- if self.id is not None:
- self.mapFrameDict = self.instruction[self.id].GetInstruction()
- else:
- self.id = wx.NewId()
- mapFrame = MapFrame(self.id)
- self.mapFrameDict = mapFrame.GetInstruction()
- self.mapFrameDict['rect'] = rect
- self._layout()
- self.scale = [None] * 4
- self.center = [None] * 4
- self.selectedMap = self.mapFrameDict['map']
- self.selectedRegion = self.mapFrameDict['region']
- self.scaleType = self.mapFrameDict['scaleType']
- self.mapType = self.mapFrameDict['mapType']
- self.scaleChoice.SetSelection(self.mapFrameDict['scaleType'])
- if self.instruction[self.id]:
- self.drawMap.SetValue(self.mapFrameDict['drawMap'])
- else:
- self.drawMap.SetValue(True)
- if self.mapFrameDict['scaleType'] == 0 and self.mapFrameDict['map']:
- self.select.SetValue(self.mapFrameDict['map'])
- if self.mapFrameDict['mapType'] == 'raster':
- self.rasterTypeRadio.SetValue(True)
- self.vectorTypeRadio.SetValue(False)
- else:
- self.rasterTypeRadio.SetValue(False)
- self.vectorTypeRadio.SetValue(True)
- elif self.mapFrameDict['scaleType'] == 1 and self.mapFrameDict['region']:
- self.select.SetValue(self.mapFrameDict['region'])
- self.OnMap(None)
- self.scale[self.mapFrameDict['scaleType']] = self.mapFrameDict['scale']
- self.center[self.mapFrameDict['scaleType']
- ] = self.mapFrameDict['center']
- self.OnScaleChoice(None)
- self.OnElementType(None)
- self.OnBorder(None)
- def _layout(self):
- """Do layout"""
- border = wx.BoxSizer(wx.VERTICAL)
- box = wx.StaticBox(
- parent=self,
- id=wx.ID_ANY,
- label=" %s " %
- _("Map frame"))
- sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- # scale options
- frameText = wx.StaticText(
- self, id=wx.ID_ANY, label=_("Map frame options:"))
- scaleChoices = [_("fit frame to match selected map"),
- _("fit frame to match saved region"),
- _("fit frame to match current computational region"),
- _("fixed scale and map center")]
- self.scaleChoice = wx.Choice(self, id=wx.ID_ANY, choices=scaleChoices)
- gridBagSizer.Add(
- frameText, pos=(0, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.scaleChoice,
- pos=(
- 1,
- 0),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
- border=0)
- # map and region selection
- self.staticBox = wx.StaticBox(
- parent=self, id=wx.ID_ANY, label=" %s " %
- _("Map selection"))
- sizerM = wx.StaticBoxSizer(self.staticBox, wx.HORIZONTAL)
- self.mapSizer = wx.GridBagSizer(hgap=5, vgap=5)
- self.rasterTypeRadio = wx.RadioButton(
- self, id=wx.ID_ANY, label=" %s " %
- _("raster"), style=wx.RB_GROUP)
- self.vectorTypeRadio = wx.RadioButton(
- self, id=wx.ID_ANY, label=" %s " %
- _("vector"))
- self.drawMap = wx.CheckBox(
- self, id=wx.ID_ANY, label="add selected map")
- self.mapOrRegionText = [_("Map:"), _("Region:")]
- dc = wx.ClientDC(self) # determine size of labels
- width = max(
- dc.GetTextExtent(
- self.mapOrRegionText[0])[0], dc.GetTextExtent(
- self.mapOrRegionText[1])[0])
- self.mapText = wx.StaticText(
- self, id=wx.ID_ANY, label=self.mapOrRegionText[0],
- size=(width, -1))
- self.select = Select(
- self,
- id=wx.ID_ANY,
- size=globalvar.DIALOG_GSELECT_SIZE,
- type='raster',
- multiple=False,
- updateOnPopup=True,
- onPopup=None)
- self.mapSizer.Add(
- self.rasterTypeRadio, pos=(0, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.mapSizer.Add(
- self.vectorTypeRadio, pos=(0, 2),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.mapSizer.Add(
- self.drawMap,
- pos=(
- 0,
- 3),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT,
- border=0)
- self.mapSizer.Add(
- self.mapText, pos=(1, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.mapSizer.Add(
- self.select, pos=(
- 1, 1), span=(
- 1, 3), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- sizerM.Add(
- self.mapSizer,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- gridBagSizer.Add(
- sizerM,
- pos=(
- 2,
- 0),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
- border=0)
- # map scale and center
- boxC = wx.StaticBox(
- parent=self,
- id=wx.ID_ANY,
- label=" %s " %
- _("Map scale and center"))
- sizerC = wx.StaticBoxSizer(boxC, wx.HORIZONTAL)
- self.centerSizer = wx.FlexGridSizer(rows=2, cols=5, hgap=5, vgap=5)
- centerText = wx.StaticText(self, id=wx.ID_ANY, label=_("Center:"))
- self.eastingText = wx.StaticText(self, id=wx.ID_ANY, label=_("E:"))
- self.northingText = wx.StaticText(self, id=wx.ID_ANY, label=_("N:"))
- self.eastingTextCtrl = wx.TextCtrl(
- self, id=wx.ID_ANY, style=wx.TE_RIGHT,
- validator=TCValidator(flag='DIGIT_ONLY'))
- self.northingTextCtrl = wx.TextCtrl(
- self, id=wx.ID_ANY, style=wx.TE_RIGHT,
- validator=TCValidator(flag='DIGIT_ONLY'))
- scaleText = wx.StaticText(self, id=wx.ID_ANY, label=_("Scale:"))
- scalePrefixText = wx.StaticText(self, id=wx.ID_ANY, label=_("1 :"))
- self.scaleTextCtrl = wx.TextCtrl(
- self, id=wx.ID_ANY, value="", style=wx.TE_RIGHT,
- validator=TCValidator('DIGIT_ONLY'))
- self.centerSizer.Add(
- centerText,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT,
- border=10)
- self.centerSizer.Add(
- self.eastingText,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT,
- border=0)
- self.centerSizer.Add(
- self.eastingTextCtrl,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- self.centerSizer.Add(
- self.northingText,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT,
- border=0)
- self.centerSizer.Add(
- self.northingTextCtrl,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- self.centerSizer.Add(
- scaleText,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT,
- border=10)
- self.centerSizer.Add(
- scalePrefixText,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT,
- border=0)
- self.centerSizer.Add(
- self.scaleTextCtrl,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- sizerC.Add(
- self.centerSizer,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- gridBagSizer.Add(
- sizerC,
- pos=(
- 3,
- 0),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
- border=0)
- # resolution
- flexSizer = wx.FlexGridSizer(rows=1, cols=2, hgap=5, vgap=5)
- resolutionText = wx.StaticText(
- self, id=wx.ID_ANY, label=_("Map max resolution (dpi):"))
- self.resolutionSpin = wx.SpinCtrl(
- self, id=wx.ID_ANY, min=1, max=1000, initial=300)
- flexSizer.Add(
- resolutionText,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- flexSizer.Add(
- self.resolutionSpin,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- self.resolutionSpin.SetValue(self.mapFrameDict['resolution'])
- gridBagSizer.Add(
- flexSizer,
- pos=(
- 4,
- 0),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
- border=0)
- sizer.Add(
- gridBagSizer,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- # border
- # GTC Line around legend or map frame
- box = wx.StaticBox(
- parent=self,
- id=wx.ID_ANY,
- label=" %s " %
- _("Border"))
- sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- self.borderCheck = wx.CheckBox(
- self, id=wx.ID_ANY, label=(
- _("draw border around map frame")))
- if self.mapFrameDict['border'] == 'y':
- self.borderCheck.SetValue(True)
- else:
- self.borderCheck.SetValue(False)
- self.borderColorText = wx.StaticText(
- self, id=wx.ID_ANY, label=_("border color:"))
- self.borderWidthText = wx.StaticText(
- self, id=wx.ID_ANY, label=_("border width (pts):"))
- self.borderColourPicker = wx.ColourPickerCtrl(self, id=wx.ID_ANY)
- self.borderWidthCtrl = wx.SpinCtrl(
- self, id=wx.ID_ANY, min=1, max=100, initial=1)
- if self.mapFrameDict['border'] == 'y':
- self.borderWidthCtrl.SetValue(int(self.mapFrameDict['width']))
- self.borderColourPicker.SetColour(
- convertRGB(self.mapFrameDict['color']))
- gridBagSizer.Add(
- self.borderCheck, pos=(
- 0, 0), span=(
- 1, 2), flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, border=0)
- gridBagSizer.Add(
- self.borderColorText, pos=(1, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.borderWidthText, pos=(2, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.borderColourPicker,
- pos=(
- 1,
- 2),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
- border=0)
- gridBagSizer.Add(
- self.borderWidthCtrl,
- pos=(
- 2,
- 2),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
- border=0)
- sizer.Add(
- gridBagSizer,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- self.SetSizer(border)
- self.Fit()
- if projInfo()['proj'] == 'll':
- self.scaleChoice.SetItems(self.scaleChoice.GetItems()[0:3])
- boxC.Hide()
- for each in self.centerSizer.GetChildren():
- each.GetWindow().Hide()
- # bindings
- self.scaleChoice.Bind(wx.EVT_CHOICE, self.OnScaleChoice)
- self.select.GetTextCtrl().Bind(wx.EVT_TEXT, self.OnMap)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnElementType, self.vectorTypeRadio)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnElementType, self.rasterTypeRadio)
- self.Bind(wx.EVT_CHECKBOX, self.OnBorder, self.borderCheck)
- def OnMap(self, event):
- """Selected map or region changing"""
- if self.select.GetValue():
- self.selected = self.select.GetValue()
- else:
- self.selected = None
- if self.scaleChoice.GetSelection() == 0:
- self.selectedMap = self.selected
- if self.rasterTypeRadio.GetValue():
- mapType = 'raster'
- else:
- mapType = 'vector'
- self.scale[0], self.center[0], foo = AutoAdjust(
- self, scaleType=0, map=self.selected, mapType=mapType,
- rect=self.mapFrameDict['rect'])
- #self.center[0] = self.RegionCenter(self.RegionDict(scaleType = 0))
- elif self.scaleChoice.GetSelection() == 1:
- self.selectedRegion = self.selected
- self.scale[1], self.center[1], foo = AutoAdjust(
- self, scaleType=1, region=self.selected,
- rect=self.mapFrameDict['rect'])
- #self.center[1] = self.RegionCenter(self.RegionDict(scaleType = 1))
- elif self.scaleChoice.GetSelection() == 2:
- self.scale[2], self.center[2], foo = AutoAdjust(
- self, scaleType=2, rect=self.mapFrameDict['rect'])
- #self.center[2] = self.RegionCenter(self.RegionDict(scaleType = 2))
- else:
- self.scale[3] = None
- self.center[3] = None
- self.OnScaleChoice(None)
- def OnScaleChoice(self, event):
- """Selected scale type changing"""
- scaleType = self.scaleChoice.GetSelection()
- if self.scaleType != scaleType:
- self.scaleType = scaleType
- self.select.SetValue("")
- if scaleType in (
- 0, 1): # automatic - region from raster map, saved region
- if scaleType == 0:
- # set map selection
- self.rasterTypeRadio.Show()
- self.vectorTypeRadio.Show()
- self.drawMap.Show()
- self.staticBox.SetLabel(" %s " % _("Map selection"))
- if self.rasterTypeRadio.GetValue():
- stype = 'raster'
- else:
- stype = 'vector'
- self.select.SetElementList(type=stype)
- self.mapText.SetLabel(self.mapOrRegionText[0])
- self.select.SetToolTipString(
- _("Region is set to match this map,\nraster or vector map must be added later"))
- if scaleType == 1:
- # set region selection
- self.rasterTypeRadio.Hide()
- self.vectorTypeRadio.Hide()
- self.drawMap.Hide()
- self.staticBox.SetLabel(" %s " % _("Region selection"))
- stype = 'region'
- self.select.SetElementList(type=stype)
- self.mapText.SetLabel(self.mapOrRegionText[1])
- self.select.SetToolTipString("")
- for each in self.mapSizer.GetChildren():
- each.GetWindow().Enable()
- for each in self.centerSizer.GetChildren():
- each.GetWindow().Disable()
- if self.scale[scaleType]:
- self.scaleTextCtrl.SetValue(
- "%.0f" % (1 / self.scale[scaleType]))
- if self.center[scaleType]:
- self.eastingTextCtrl.SetValue(str(self.center[scaleType][0]))
- self.northingTextCtrl.SetValue(str(self.center[scaleType][1]))
- elif scaleType == 2:
- for each in self.mapSizer.GetChildren():
- each.GetWindow().Disable()
- for each in self.centerSizer.GetChildren():
- each.GetWindow().Disable()
- if self.scale[scaleType]:
- self.scaleTextCtrl.SetValue(
- "%.0f" % (1 / self.scale[scaleType]))
- if self.center[scaleType]:
- self.eastingTextCtrl.SetValue(str(self.center[scaleType][0]))
- self.northingTextCtrl.SetValue(str(self.center[scaleType][1]))
- else: # fixed
- for each in self.mapSizer.GetChildren():
- each.GetWindow().Disable()
- for each in self.centerSizer.GetChildren():
- each.GetWindow().Enable()
- if self.scale[scaleType]:
- self.scaleTextCtrl.SetValue(
- "%.0f" % (1 / self.scale[scaleType]))
- if self.center[scaleType]:
- self.eastingTextCtrl.SetValue(str(self.center[scaleType][0]))
- self.northingTextCtrl.SetValue(str(self.center[scaleType][1]))
- def OnElementType(self, event):
- """Changes data in map selection tree ctrl popup"""
- if self.rasterTypeRadio.GetValue():
- mapType = 'raster'
- else:
- mapType = 'vector'
- self.select.SetElementList(type=mapType)
- if self.mapType != mapType and event is not None:
- self.mapType = mapType
- self.select.SetValue('')
- self.mapType = mapType
- def OnBorder(self, event):
- """Enables/disable the part relating to border of map frame"""
- for each in (self.borderColorText, self.borderWidthText,
- self.borderColourPicker, self.borderWidthCtrl):
- each.Enable(self.borderCheck.GetValue())
- def getId(self):
- """Returns id of raster map"""
- return self.id
- def update(self):
- """Save changes"""
- mapFrameDict = dict(self.mapFrameDict)
- # resolution
- mapFrameDict['resolution'] = self.resolutionSpin.GetValue()
- # scale
- scaleType = self.scaleType
- mapFrameDict['scaleType'] = scaleType
- if mapFrameDict['scaleType'] == 0:
- if self.select.GetValue():
- mapFrameDict['drawMap'] = self.drawMap.GetValue()
- mapFrameDict['map'] = self.select.GetValue()
- mapFrameDict['mapType'] = self.mapType
- mapFrameDict['region'] = None
- if mapFrameDict['drawMap']:
- if mapFrameDict['mapType'] == 'raster':
- mapFile = grass.find_file(
- mapFrameDict['map'],
- element='cell')
- if mapFile['file'] == '':
- GMessage(
- "Raster %s not found" %
- mapFrameDict['map'])
- return False
- raster = self.instruction.FindInstructionByType(
- 'raster')
- if raster:
- raster['raster'] = mapFrameDict['map']
- else:
- raster = Raster(wx.NewId())
- raster['raster'] = mapFrameDict['map']
- raster['isRaster'] = True
- self.instruction.AddInstruction(raster)
- elif mapFrameDict['mapType'] == 'vector':
- mapFile = grass.find_file(
- mapFrameDict['map'],
- element='vector')
- if mapFile['file'] == '':
- GMessage(
- "Vector %s not found" %
- mapFrameDict['map'])
- return False
- vector = self.instruction.FindInstructionByType(
- 'vector')
- isAdded = False
- if vector:
- for each in vector['list']:
- if each[0] == mapFrameDict['map']:
- isAdded = True
- if not isAdded:
- topoInfo = grass.vector_info_topo(
- map=mapFrameDict['map'])
- if topoInfo:
- if bool(topoInfo['areas']):
- topoType = 'areas'
- elif bool(topoInfo['lines']):
- topoType = 'lines'
- else:
- topoType = 'points'
- label = '('.join(
- mapFrameDict['map'].split('@')) + ')'
- if not vector:
- vector = Vector(wx.NewId())
- vector['list'] = []
- self.instruction.AddInstruction(vector)
- id = wx.NewId()
- vector['list'].insert(
- 0, [mapFrameDict['map'], topoType, id, 1, label])
- vProp = VProperties(id, topoType)
- vProp['name'], vProp['label'], vProp[
- 'lpos'] = mapFrameDict['map'], label, 1
- self.instruction.AddInstruction(vProp)
- else:
- return False
- self.scale[0], self.center[0], self.rectAdjusted = AutoAdjust(
- self, scaleType=0, map=mapFrameDict['map'],
- mapType=self.mapType, rect=self.mapFrameDict['rect'])
- if self.rectAdjusted:
- mapFrameDict['rect'] = self.rectAdjusted
- else:
- mapFrameDict['rect'] = self.mapFrameDict['rect']
- mapFrameDict['scale'] = self.scale[0]
- mapFrameDict['center'] = self.center[0]
- # set region
- if self.mapType == 'raster':
- RunCommand('g.region', raster=mapFrameDict['map'])
- if self.mapType == 'vector':
- raster = self.instruction.FindInstructionByType('raster')
- if raster:
- rasterId = raster.id
- else:
- rasterId = None
- if rasterId:
- RunCommand(
- 'g.region',
- vector=mapFrameDict['map'],
- raster=self.instruction[rasterId]['raster'])
- else:
- RunCommand('g.region', vector=mapFrameDict['map'])
- else:
- wx.MessageBox(
- message=_("No map selected!"),
- caption=_('Invalid input'),
- style=wx.OK | wx.ICON_ERROR)
- return False
- elif mapFrameDict['scaleType'] == 1:
- if self.select.GetValue():
- mapFrameDict['drawMap'] = False
- mapFrameDict['map'] = None
- mapFrameDict['mapType'] = None
- mapFrameDict['region'] = self.select.GetValue()
- self.scale[1], self.center[1], self.rectAdjusted = AutoAdjust(
- self, scaleType=1, region=mapFrameDict['region'], rect=self.mapFrameDict['rect'])
- if self.rectAdjusted:
- mapFrameDict['rect'] = self.rectAdjusted
- else:
- mapFrameDict['rect'] = self.mapFrameDict['rect']
- mapFrameDict['scale'] = self.scale[1]
- mapFrameDict['center'] = self.center[1]
- # set region
- RunCommand('g.region', region=mapFrameDict['region'])
- else:
- wx.MessageBox(
- message=_("No region selected!"),
- caption=_('Invalid input'),
- style=wx.OK | wx.ICON_ERROR)
- return False
- elif scaleType == 2:
- mapFrameDict['drawMap'] = False
- mapFrameDict['map'] = None
- mapFrameDict['mapType'] = None
- mapFrameDict['region'] = None
- self.scale[2], self.center[2], self.rectAdjusted = AutoAdjust(
- self, scaleType=2, rect=self.mapFrameDict['rect'])
- if self.rectAdjusted:
- mapFrameDict['rect'] = self.rectAdjusted
- else:
- mapFrameDict['rect'] = self.mapFrameDict['rect']
- mapFrameDict['scale'] = self.scale[2]
- mapFrameDict['center'] = self.center[2]
- region = grass.region()
- raster = self.instruction.FindInstructionByType('raster')
- if raster:
- rasterId = raster.id
- else:
- rasterId = None
- if rasterId: # because of resolution
- RunCommand(
- 'g.region',
- n=region['n'],
- s=region['s'],
- e=region['e'],
- w=region['w'],
- rast=self.instruction[rasterId]['raster'])
- else:
- RunCommand('g.region', n=region['n'], s=region['s'],
- e=region['e'], w=region['w'])
- elif scaleType == 3:
- mapFrameDict['drawMap'] = False
- mapFrameDict['map'] = None
- mapFrameDict['mapType'] = None
- mapFrameDict['region'] = None
- mapFrameDict['rect'] = self.mapFrameDict['rect']
- try:
- scaleNumber = float(self.scaleTextCtrl.GetValue())
- centerE = float(self.eastingTextCtrl.GetValue())
- centerN = float(self.northingTextCtrl.GetValue())
- except (ValueError, SyntaxError):
- wx.MessageBox(
- message=_("Invalid scale or map center!"),
- caption=_('Invalid input'),
- style=wx.OK | wx.ICON_ERROR)
- return False
- mapFrameDict['scale'] = 1 / scaleNumber
- mapFrameDict['center'] = centerE, centerN
- ComputeSetRegion(self, mapDict=mapFrameDict)
- # check resolution
- SetResolution(
- dpi=mapFrameDict['resolution'],
- width=mapFrameDict['rect'].width,
- height=mapFrameDict['rect'].height)
- # border
- if self.borderCheck.GetValue():
- mapFrameDict['border'] = 'y'
- else:
- mapFrameDict['border'] = 'n'
- if mapFrameDict['border'] == 'y':
- mapFrameDict['width'] = self.borderWidthCtrl.GetValue()
- mapFrameDict['color'] = convertRGB(
- self.borderColourPicker.GetColour())
- if self.id not in self.instruction:
- mapFrame = MapFrame(self.id)
- self.instruction.AddInstruction(mapFrame)
- self.instruction[self.id].SetInstruction(mapFrameDict)
- if self.id not in self.mapDialog.parent.objectId:
- self.mapDialog.parent.objectId.insert(
- 0, self.id) # map frame is drawn first
- return True
- class RasterPanel(wx.Panel):
- """Panel for raster map settings"""
- def __init__(self, parent, id, settings, notebook=True):
- wx.Panel.__init__(self, parent, id=wx.ID_ANY, style=wx.TAB_TRAVERSAL)
- self.instruction = settings
- if notebook:
- self.book = parent
- self.book.AddPage(page=self, text=_("Raster map"))
- self.mainDialog = self.book.GetParent()
- else:
- self.mainDialog = parent
- if id:
- self.id = id
- self.rasterDict = self.instruction[self.id].GetInstruction()
- else:
- self.id = wx.NewId()
- raster = Raster(self.id)
- self.rasterDict = raster.GetInstruction()
- self._layout()
- self.OnRaster(None)
- def _layout(self):
- """Do layout"""
- border = wx.BoxSizer(wx.VERTICAL)
- # choose raster map
- box = wx.StaticBox(
- parent=self,
- id=wx.ID_ANY,
- label=" %s " %
- _("Choose raster map"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- self.rasterNoRadio = wx.RadioButton(
- self, id=wx.ID_ANY, label=_("no raster map"),
- style=wx.RB_GROUP)
- self.rasterYesRadio = wx.RadioButton(
- self, id=wx.ID_ANY, label=_("raster:"))
- self.rasterSelect = Select(
- self,
- id=wx.ID_ANY,
- size=globalvar.DIALOG_GSELECT_SIZE,
- type='raster',
- multiple=False,
- updateOnPopup=True,
- onPopup=None)
- if self.rasterDict['isRaster']:
- self.rasterYesRadio.SetValue(True)
- self.rasterNoRadio.SetValue(False)
- self.rasterSelect.SetValue(self.rasterDict['raster'])
- else:
- self.rasterYesRadio.SetValue(False)
- self.rasterNoRadio.SetValue(True)
- mapId = self.instruction.FindInstructionByType('map').id
- if self.instruction[mapId]['map'] and self.instruction[
- mapId]['mapType'] == 'raster':
- # raster map from map frame dialog if possible
- self.rasterSelect.SetValue(self.instruction[mapId]['map'])
- else:
- self.rasterSelect.SetValue('')
- gridBagSizer.Add(
- self.rasterNoRadio, pos=(
- 0, 0), span=(
- 1, 2), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.rasterYesRadio, pos=(1, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.rasterSelect,
- pos=(
- 1,
- 1),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
- border=0)
- sizer.Add(
- gridBagSizer,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- #self.rasterSelect.GetTextCtrl().Bind(wx.EVT_TEXT, self.OnRaster)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnRaster, self.rasterNoRadio)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnRaster, self.rasterYesRadio)
- self.SetSizer(border)
- self.Fit()
- def OnRaster(self, event):
- """Enable/disable raster selection"""
- self.rasterSelect.Enable(self.rasterYesRadio.GetValue())
- def update(self):
- # draw raster
- mapInstr = self.instruction.FindInstructionByType('map')
- if not mapInstr: # no map frame
- GMessage(message=_("Please, create map frame first."))
- return
- if self.rasterNoRadio.GetValue() or not self.rasterSelect.GetValue():
- self.rasterDict['isRaster'] = False
- self.rasterDict['raster'] = None
- mapInstr['drawMap'] = False
- if self.id in self.instruction:
- del self.instruction[self.id]
- else:
- self.rasterDict['isRaster'] = True
- self.rasterDict['raster'] = self.rasterSelect.GetValue()
- if self.rasterDict['raster'] != mapInstr['drawMap']:
- mapInstr['drawMap'] = False
- raster = self.instruction.FindInstructionByType('raster')
- if not raster:
- raster = Raster(self.id)
- self.instruction.AddInstruction(raster)
- self.instruction[self.id].SetInstruction(self.rasterDict)
- else:
- self.instruction[raster.id].SetInstruction(self.rasterDict)
- if 'map' in self.mainDialog.parent.openDialogs:
- self.mainDialog.parent.openDialogs['map'].updateDialog()
- return True
- def getId(self):
- return self.id
- class VectorPanel(wx.Panel):
- """Panel for vector maps settings"""
- def __init__(self, parent, id, settings, notebook=True):
- wx.Panel.__init__(self, parent, id=wx.ID_ANY, style=wx.TAB_TRAVERSAL)
- self.parent = parent
- self.instruction = settings
- self.tmpDialogDict = {}
- vectors = self.instruction.FindInstructionByType(
- 'vProperties', list=True)
- for vector in vectors:
- self.tmpDialogDict[vector.id] = dict(
- self.instruction[vector.id].GetInstruction())
- if id:
- self.id = id
- self.vectorList = deepcopy(self.instruction[id]['list'])
- else:
- self.id = wx.NewId()
- self.vectorList = []
- vLegend = self.instruction.FindInstructionByType('vectorLegend')
- if vLegend:
- self.vLegendId = vLegend.id
- else:
- self.vLegendId = None
- self._layout()
- if notebook:
- self.parent.AddPage(page=self, text=_("Vector maps"))
- self.parent = self.parent.GetParent()
- def _layout(self):
- """Do layout"""
- border = wx.BoxSizer(wx.VERTICAL)
- # choose vector map
- box = wx.StaticBox(
- parent=self,
- id=wx.ID_ANY,
- label=" %s " %
- _("Add map"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- text = wx.StaticText(self, id=wx.ID_ANY, label=_("Map:"))
- self.select = Select(self, id=wx.ID_ANY, # size = globalvar.DIALOG_GSELECT_SIZE,
- type='vector', multiple=False,
- updateOnPopup=True, onPopup=None)
- topologyTypeTr = [_("points"), _("lines"), _("areas")]
- self.topologyTypeList = ["points", "lines", "areas"]
- self.vectorType = wx.RadioBox(
- self,
- id=wx.ID_ANY,
- label=" %s " %
- _("Data Type"),
- choices=topologyTypeTr,
- majorDimension=3,
- style=wx.RA_SPECIFY_COLS)
- self.AddVector = wx.Button(self, id=wx.ID_ANY, label=_("Add"))
- gridBagSizer.Add(
- text, pos=(0, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.select, pos=(
- 0, 1), span=(
- 1, 2), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.vectorType, pos=(1, 1),
- flag=wx.ALIGN_CENTER, border=0)
- gridBagSizer.Add(
- self.AddVector, pos=(1, 2),
- flag=wx.ALIGN_BOTTOM | wx.ALIGN_RIGHT, border=0)
- sizer.Add(
- gridBagSizer,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- # manage vector layers
- box = wx.StaticBox(
- parent=self,
- id=wx.ID_ANY,
- label=" %s " %
- _("Manage vector maps"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- text = wx.StaticText(self, id=wx.ID_ANY, label=_(
- "The topmost vector map overlaps the others"))
- self.listbox = wx.ListBox(
- self, id=wx.ID_ANY, choices=[],
- style=wx.LB_SINGLE | wx.LB_NEEDED_SB)
- self.btnUp = wx.Button(self, id=wx.ID_ANY, label=_("Up"))
- self.btnDown = wx.Button(self, id=wx.ID_ANY, label=_("Down"))
- self.btnDel = wx.Button(self, id=wx.ID_ANY, label=_("Delete"))
- self.btnProp = wx.Button(self, id=wx.ID_ANY, label=_("Properties..."))
- self.updateListBox(selected=0)
- gridBagSizer.Add(
- text, pos=(0, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.listbox, pos=(
- 1, 0), span=(
- 4, 1), flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, border=0)
- gridBagSizer.Add(
- self.btnUp,
- pos=(
- 1,
- 1),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
- border=0)
- gridBagSizer.Add(
- self.btnDown,
- pos=(
- 2,
- 1),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
- border=0)
- gridBagSizer.Add(
- self.btnDel,
- pos=(
- 3,
- 1),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
- border=0)
- gridBagSizer.Add(
- self.btnProp,
- pos=(
- 4,
- 1),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
- border=0)
- gridBagSizer.AddGrowableCol(0, 2)
- gridBagSizer.AddGrowableCol(1, 1)
- sizer.Add(gridBagSizer, proportion=0, flag=wx.ALL, border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- self.Bind(wx.EVT_BUTTON, self.OnAddVector, self.AddVector)
- self.Bind(wx.EVT_BUTTON, self.OnDelete, self.btnDel)
- self.Bind(wx.EVT_BUTTON, self.OnUp, self.btnUp)
- self.Bind(wx.EVT_BUTTON, self.OnDown, self.btnDown)
- self.Bind(wx.EVT_BUTTON, self.OnProperties, self.btnProp)
- self.select.GetTextCtrl().Bind(wx.EVT_TEXT, self.OnVector)
- self.SetSizer(border)
- self.Fit()
- self.Bind(wx.EVT_LISTBOX_DCLICK, self.OnProperties, self.listbox)
- def OnVector(self, event):
- """Gets info about toplogy and enables/disables choices point/line/area"""
- vmap = self.select.GetValue()
- try:
- topoInfo = grass.vector_info_topo(map=vmap)
- except grass.ScriptError:
- return
- if topoInfo:
- self.vectorType.EnableItem(2, bool(topoInfo['areas']))
- self.vectorType.EnableItem(
- 1, bool(
- topoInfo['boundaries']) or bool(
- topoInfo['lines']))
- self.vectorType.EnableItem(
- 0, bool(
- topoInfo['centroids'] or bool(
- topoInfo['points'])))
- for item in range(2, -1, -1):
- if self.vectorType.IsItemEnabled(item):
- self.vectorType.SetSelection(item)
- break
- self.AddVector.SetFocus()
- def OnAddVector(self, event):
- """Adds vector map to list"""
- vmap = self.select.GetValue()
- if vmap:
- mapname = vmap.split('@')[0]
- try:
- mapset = '(' + vmap.split('@')[1] + ')'
- except IndexError:
- mapset = ''
- idx = self.vectorType.GetSelection()
- ttype = self.topologyTypeList[idx]
- record = "%s - %s" % (vmap, ttype)
- id = wx.NewId()
- lpos = 1
- label = mapname + mapset
- self.vectorList.insert(0, [vmap, ttype, id, lpos, label])
- self.reposition()
- self.listbox.InsertItems([record], 0)
- vector = VProperties(id, ttype)
- self.tmpDialogDict[id] = vector.GetInstruction()
- self.tmpDialogDict[id]['name'] = vmap
- self.listbox.SetSelection(0)
- self.listbox.EnsureVisible(0)
- self.btnProp.SetFocus()
- self.enableButtons()
- def OnDelete(self, event):
- """Deletes vector map from the list"""
- if self.listbox.GetSelections():
- pos = self.listbox.GetSelection()
- id = self.vectorList[pos][2]
- del self.vectorList[pos]
- del self.tmpDialogDict[id]
- for i in range(pos, len(self.vectorList)):
- if self.vectorList[i][3]: # can be 0
- self.vectorList[i][3] -= 1
- if pos < len(self.vectorList) - 1:
- selected = pos
- else:
- selected = len(self.vectorList) - 1
- self.updateListBox(selected=selected)
- if self.listbox.IsEmpty():
- self.enableButtons(False)
- def OnUp(self, event):
- """Moves selected map to top"""
- if self.listbox.GetSelections():
- pos = self.listbox.GetSelection()
- if pos:
- self.vectorList.insert(pos - 1, self.vectorList.pop(pos))
- if not self.vLegendId:
- self.reposition()
- if pos > 0:
- self.updateListBox(selected=(pos - 1))
- else:
- self.updateListBox(selected=0)
- def OnDown(self, event):
- """Moves selected map to bottom"""
- if self.listbox.GetSelections():
- pos = self.listbox.GetSelection()
- if pos != len(self.vectorList) - 1:
- self.vectorList.insert(pos + 1, self.vectorList.pop(pos))
- if not self.vLegendId:
- self.reposition()
- if pos < len(self.vectorList) - 1:
- self.updateListBox(selected=(pos + 1))
- else:
- self.updateListBox(selected=len(self.vectorList) - 1)
- def OnProperties(self, event):
- """Opens vector map properties dialog"""
- if self.listbox.GetSelections():
- pos = self.listbox.GetSelection()
- id = self.vectorList[pos][2]
- dlg = VPropertiesDialog(
- self,
- id=id,
- settings=self.instruction,
- vectors=self.vectorList,
- tmpSettings=self.tmpDialogDict[id])
- dlg.ShowModal()
- self.parent.FindWindowById(wx.ID_OK).SetFocus()
- def enableButtons(self, enable=True):
- """Enable/disable up, down, properties, delete buttons"""
- self.btnUp.Enable(enable)
- self.btnDown.Enable(enable)
- self.btnProp.Enable(enable)
- self.btnDel.Enable(enable)
- def updateListBox(self, selected=None):
- mapList = ["%s - %s" % (item[0], item[1]) for item in self.vectorList]
- self.listbox.Set(mapList)
- if self.listbox.IsEmpty():
- self.enableButtons(False)
- else:
- self.enableButtons(True)
- if selected is not None:
- self.listbox.SetSelection(selected)
- self.listbox.EnsureVisible(selected)
- def reposition(self):
- """Update position in legend, used only if there is no vlegend yet"""
- for i in range(len(self.vectorList)):
- if self.vectorList[i][3]:
- self.vectorList[i][3] = i + 1
- def getId(self):
- return self.id
- def update(self):
- vectors = self.instruction.FindInstructionByType(
- 'vProperties', list=True)
- for vector in vectors:
- del self.instruction[vector.id]
- if self.id in self.instruction:
- del self.instruction[self.id]
- if len(self.vectorList) > 0:
- vector = Vector(self.id)
- self.instruction.AddInstruction(vector)
- vector.SetInstruction({'list': deepcopy(self.vectorList)})
- # save new vectors
- for item in self.vectorList:
- id = item[2]
- vLayer = VProperties(id, item[1])
- self.instruction.AddInstruction(vLayer)
- vLayer.SetInstruction(self.tmpDialogDict[id])
- vLayer['name'] = item[0]
- vLayer['label'] = item[4]
- vLayer['lpos'] = item[3]
- else:
- if self.id in self.instruction:
- del self.instruction[self.id]
- if 'map' in self.parent.parent.openDialogs:
- self.parent.parent.openDialogs['map'].updateDialog()
- return True
- class RasterDialog(PsmapDialog):
- def __init__(self, parent, id, settings):
- PsmapDialog.__init__(
- self,
- parent=parent,
- id=id,
- title=_("Raster map settings"),
- settings=settings)
- self.objectType = ('raster',)
- self.rPanel = RasterPanel(
- parent=self,
- id=self.id,
- settings=self.instruction,
- notebook=False)
- self.id = self.rPanel.getId()
- self._layout(self.rPanel)
- def update(self):
- ok = self.rPanel.update()
- if ok:
- return True
- return False
- def OnApply(self, event):
- ok = self.update()
- if not ok:
- return False
- if self.id in self.instruction:
- self.parent.DialogDataChanged(id=self.id)
- else:
- mapId = self.instruction.FindInstructionByType('map').id
- self.parent.DialogDataChanged(id=mapId)
- return True
- def updateDialog(self):
- """Update information (not used)"""
- pass
- # if 'map' in self.parent.openDialogs:
- # if self.parent.openDialogs['map'].mPanel.rasterTypeRadio.GetValue()\
- # and self.parent.openDialogs['map'].mPanel.select.GetValue():
- # if self.parent.openDialogs['map'].mPanel.drawMap.IsChecked():
- # self.rPanel.rasterSelect.SetValue(self.parent.openDialogs['map'].mPanel.select.GetValue())
- class MainVectorDialog(PsmapDialog):
- def __init__(self, parent, id, settings):
- PsmapDialog.__init__(
- self,
- parent=parent,
- id=id,
- title=_("Vector maps settings"),
- settings=settings)
- self.objectType = ('vector',)
- self.vPanel = VectorPanel(
- parent=self,
- id=self.id,
- settings=self.instruction,
- notebook=False)
- self.id = self.vPanel.getId()
- self._layout(self.vPanel)
- def update(self):
- self.vPanel.update()
- def OnApply(self, event):
- self.update()
- if self.id in self.instruction:
- self.parent.DialogDataChanged(id=self.id)
- else:
- mapId = self.instruction.FindInstructionByType('map').id
- self.parent.DialogDataChanged(id=mapId)
- return True
- def updateDialog(self):
- """Update information (not used)"""
- pass
- class VPropertiesDialog(PsmapDialog):
- def __init__(self, parent, id, settings, vectors, tmpSettings):
- PsmapDialog.__init__(
- self,
- parent=parent,
- id=id,
- title="",
- settings=settings,
- apply=False)
- vectorList = vectors
- self.vPropertiesDict = tmpSettings
- # determine map and its type
- for item in vectorList:
- if id == item[2]:
- self.vectorName = item[0]
- self.type = item[1]
- self.SetTitle(_("%s properties") % self.vectorName)
- # vector map info
- self.connection = True
- try:
- self.mapDBInfo = VectorDBInfo(self.vectorName)
- self.layers = self.mapDBInfo.layers.keys()
- except grass.ScriptError:
- self.connection = False
- self.layers = []
- if not self.layers:
- self.connection = False
- self.layers = []
- self.currLayer = self.vPropertiesDict['layer']
- # path to symbols, patterns
- gisbase = os.getenv("GISBASE")
- self.symbolPath = os.path.join(gisbase, 'etc', 'symbol')
- self.symbols = []
- for dir in os.listdir(self.symbolPath):
- for symbol in os.listdir(os.path.join(self.symbolPath, dir)):
- self.symbols.append(os.path.join(dir, symbol))
- self.patternPath = os.path.join(gisbase, 'etc', 'paint', 'patterns')
- # notebook
- notebook = wx.Notebook(parent=self, id=wx.ID_ANY, style=wx.BK_DEFAULT)
- self.DSpanel = self._DataSelectionPanel(notebook)
- self.EnableLayerSelection(enable=self.connection)
- selectPanel = {
- 'points': [
- self._ColorsPointAreaPanel, self._StylePointPanel], 'lines': [
- self._ColorsLinePanel, self._StyleLinePanel], 'areas': [
- self._ColorsPointAreaPanel, self._StyleAreaPanel]}
- self.ColorsPanel = selectPanel[self.type][0](notebook)
- self.OnOutline(None)
- if self.type in ('points', 'areas'):
- self.OnFill(None)
- self.OnColor(None)
- self.StylePanel = selectPanel[self.type][1](notebook)
- if self.type == 'points':
- self.OnSize(None)
- self.OnRotation(None)
- self.OnSymbology(None)
- if self.type == 'areas':
- self.OnPattern(None)
- self._layout(notebook)
- def _DataSelectionPanel(self, notebook):
- panel = wx.Panel(
- parent=notebook, id=wx.ID_ANY, size=(-1, -1),
- style=wx.TAB_TRAVERSAL)
- notebook.AddPage(page=panel, text=_("Data selection"))
- border = wx.BoxSizer(wx.VERTICAL)
- # data type
- self.checkType1 = self.checkType2 = None
- if self.type in ('lines', 'points'):
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Feature type"))
- sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- if self.type == 'points':
- label = (_("points"), _("centroids"))
- else:
- label = (_("lines"), _("boundaries"))
- if self.type == 'points':
- name = ("point", "centroid")
- else:
- name = ("line", "boundary")
- self.checkType1 = wx.CheckBox(
- panel, id=wx.ID_ANY, label=label[0], name=name[0])
- self.checkType2 = wx.CheckBox(
- panel, id=wx.ID_ANY, label=label[1], name=name[1])
- self.checkType1.SetValue(
- self.vPropertiesDict['type'].find(
- name[0]) >= 0)
- self.checkType2.SetValue(
- self.vPropertiesDict['type'].find(
- name[1]) >= 0)
- gridBagSizer.Add(
- self.checkType1, pos=(0, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.checkType2, pos=(0, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- sizer.Add(
- gridBagSizer,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(
- item=sizer,
- proportion=0,
- flag=wx.ALL | wx.EXPAND,
- border=5)
- # layer selection
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Layer selection"))
- sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
- self.gridBagSizerL = wx.GridBagSizer(hgap=5, vgap=5)
- self.warning = wx.StaticText(panel, id=wx.ID_ANY, label="")
- if not self.connection:
- self.warning = wx.StaticText(panel, id=wx.ID_ANY, label=_(
- "Database connection is not defined in DB file."))
- text = wx.StaticText(panel, id=wx.ID_ANY, label=_("Select layer:"))
- self.layerChoice = wx.Choice(
- panel, id=wx.ID_ANY, choices=map(
- str, self.layers), size=self.spinCtrlSize)
- self.layerChoice.SetStringSelection(self.currLayer)
- if self.connection:
- table = self.mapDBInfo.layers[int(self.currLayer)]['table']
- else:
- table = ""
- self.radioWhere = wx.RadioButton(
- panel, id=wx.ID_ANY, label="SELECT * FROM %s WHERE" %
- table, style=wx.RB_GROUP)
- self.textCtrlWhere = wx.TextCtrl(panel, id=wx.ID_ANY, value="")
- if self.connection:
- cols = self.mapDBInfo.GetColumns(
- self.mapDBInfo.layers[int(self.currLayer)]['table'])
- else:
- cols = []
- self.choiceColumns = wx.Choice(panel, id=wx.ID_ANY, choices=cols)
- self.radioCats = wx.RadioButton(
- panel, id=wx.ID_ANY, label="Choose categories ")
- self.textCtrlCats = wx.TextCtrl(panel, id=wx.ID_ANY, value="")
- self.textCtrlCats.SetToolTipString(
- _("list of categories (e.g. 1,3,5-7)"))
- if 'cats' in self.vPropertiesDict:
- self.radioCats.SetValue(True)
- self.textCtrlCats.SetValue(self.vPropertiesDict['cats'])
- if 'where' in self.vPropertiesDict:
- self.radioWhere.SetValue(True)
- where = self.vPropertiesDict['where'].strip().split(" ", 1)
- self.choiceColumns.SetStringSelection(where[0])
- self.textCtrlWhere.SetValue(where[1])
- row = 0
- if not self.connection:
- self.gridBagSizerL.Add(
- self.warning, pos=(
- 0, 0), span=(
- 1, 3), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- row = 1
- self.gridBagSizerL.Add(
- text, pos=(0 + row, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerL.Add(
- self.layerChoice, pos=(0 + row, 1),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, border=0)
- self.gridBagSizerL.Add(
- self.radioWhere, pos=(1 + row, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerL.Add(
- self.choiceColumns, pos=(1 + row, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerL.Add(
- self.textCtrlWhere, pos=(1 + row, 2),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerL.Add(
- self.radioCats, pos=(2 + row, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerL.Add(
- self.textCtrlCats, pos=(2 + row, 1),
- span=(1, 2),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, border=0)
- sizer.Add(
- self.gridBagSizerL,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- # mask
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Mask"))
- sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
- self.mask = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_("Use current mask"))
- if self.vPropertiesDict['masked'] == 'y':
- self.mask.SetValue(True)
- else:
- self.mask.SetValue(False)
- sizer.Add(self.mask, proportion=1, flag=wx.EXPAND | wx.ALL, border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- self.Bind(wx.EVT_CHOICE, self.OnLayer, self.layerChoice)
- panel.SetSizer(border)
- panel.Fit()
- return panel
- def _ColorsPointAreaPanel(self, notebook):
- panel = wx.Panel(
- parent=notebook, id=wx.ID_ANY, size=(-1, -1),
- style=wx.TAB_TRAVERSAL)
- notebook.AddPage(page=panel, text=_("Colors"))
- border = wx.BoxSizer(wx.VERTICAL)
- #colors - outline
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Outline"))
- sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
- self.gridBagSizerO = wx.GridBagSizer(hgap=5, vgap=2)
- self.outlineCheck = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_("draw outline"))
- self.outlineCheck.SetValue(self.vPropertiesDict['color'] != 'none')
- widthText = wx.StaticText(panel, id=wx.ID_ANY, label=_("Width (pts):"))
- if fs:
- self.widthSpin = fs.FloatSpin(
- panel,
- id=wx.ID_ANY,
- min_val=0,
- max_val=30,
- increment=0.5,
- value=1,
- style=fs.FS_RIGHT)
- self.widthSpin.SetFormat("%f")
- self.widthSpin.SetDigits(2)
- else:
- self.widthSpin = wx.SpinCtrl(
- panel, id=wx.ID_ANY, min=1, max=25, initial=1,
- size=self.spinCtrlSize)
- if self.vPropertiesDict['color'] is None:
- self.vPropertiesDict['color'] = 'none'
- if self.vPropertiesDict['color'] != 'none':
- self.widthSpin.SetValue(self.vPropertiesDict['width'])
- else:
- self.widthSpin.SetValue(1)
- colorText = wx.StaticText(panel, id=wx.ID_ANY, label=_("Color:"))
- self.colorPicker = wx.ColourPickerCtrl(panel, id=wx.ID_ANY)
- if self.vPropertiesDict['color'] != 'none':
- self.colorPicker.SetColour(
- convertRGB(self.vPropertiesDict['color']))
- else:
- self.colorPicker.SetColour(convertRGB('black'))
- self.gridBagSizerO.Add(
- self.outlineCheck, pos=(
- 0, 0), span=(
- 1, 2), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerO.Add(
- widthText, pos=(1, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerO.Add(
- self.widthSpin, pos=(1, 2),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, border=0)
- self.gridBagSizerO.Add(
- colorText, pos=(2, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerO.Add(
- self.colorPicker, pos=(2, 2),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- sizer.Add(
- self.gridBagSizerO,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- self.Bind(wx.EVT_CHECKBOX, self.OnOutline, self.outlineCheck)
- #colors - fill
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Fill"))
- sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
- self.gridBagSizerF = wx.GridBagSizer(hgap=5, vgap=2)
- self.fillCheck = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_("fill color"))
- self.fillCheck.SetValue(
- self.vPropertiesDict['fcolor'] !=
- 'none' or self.vPropertiesDict['rgbcolumn'] is not None)
- self.colorPickerRadio = wx.RadioButton(
- panel, id=wx.ID_ANY, label=_("choose color:"), style=wx.RB_GROUP)
- # set choose color option if there is no db connection
- if self.connection:
- self.colorPickerRadio.SetValue(
- not self.vPropertiesDict['rgbcolumn'])
- else:
- self.colorPickerRadio.SetValue(False)
- self.fillColorPicker = wx.ColourPickerCtrl(panel, id=wx.ID_ANY)
- if self.vPropertiesDict['fcolor'] != 'none':
- self.fillColorPicker.SetColour(
- convertRGB(self.vPropertiesDict['fcolor']))
- else:
- self.fillColorPicker.SetColour(convertRGB('red'))
- self.colorColRadio = wx.RadioButton(
- panel, id=wx.ID_ANY, label=_("color from map table column:"))
- self.colorColChoice = self.getColsChoice(parent=panel)
- if self.connection:
- if self.vPropertiesDict['rgbcolumn']:
- self.colorColRadio.SetValue(True)
- self.colorColChoice.SetStringSelection(
- self.vPropertiesDict['rgbcolumn'])
- else:
- self.colorColRadio.SetValue(False)
- self.colorColChoice.SetSelection(0)
- self.colorColChoice.Enable(self.connection)
- self.colorColRadio.Enable(self.connection)
- self.gridBagSizerF.Add(
- self.fillCheck, pos=(
- 0, 0), span=(
- 1, 2), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerF.Add(
- self.colorPickerRadio, pos=(1, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerF.Add(
- self.fillColorPicker, pos=(1, 2),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerF.Add(
- self.colorColRadio, pos=(2, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerF.Add(
- self.colorColChoice, pos=(2, 2),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, border=0)
- sizer.Add(
- self.gridBagSizerF,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- self.Bind(wx.EVT_CHECKBOX, self.OnFill, self.fillCheck)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnColor, self.colorColRadio)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnColor, self.colorPickerRadio)
- panel.SetSizer(border)
- panel.Fit()
- return panel
- def _ColorsLinePanel(self, notebook):
- panel = wx.Panel(
- parent=notebook, id=wx.ID_ANY, size=(-1, -1),
- style=wx.TAB_TRAVERSAL)
- notebook.AddPage(page=panel, text=_("Colors"))
- border = wx.BoxSizer(wx.VERTICAL)
- #colors - outline
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Outline"))
- sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
- self.gridBagSizerO = wx.GridBagSizer(hgap=5, vgap=2)
- if self.vPropertiesDict['hcolor'] is None:
- self.vPropertiesDict['hcolor'] = 'none'
- if self.vPropertiesDict['color'] is None:
- self.vPropertiesDict['color'] = 'none'
- self.outlineCheck = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_("draw outline"))
- self.outlineCheck.SetValue(self.vPropertiesDict['hcolor'] != 'none')
- self.outlineCheck.SetToolTipString(
- _("No effect for fill color from table column"))
- widthText = wx.StaticText(panel, id=wx.ID_ANY, label=_("Width (pts):"))
- if fs:
- self.outWidthSpin = fs.FloatSpin(
- panel,
- id=wx.ID_ANY,
- min_val=0,
- max_val=30,
- increment=0.5,
- value=1,
- style=fs.FS_RIGHT)
- self.outWidthSpin.SetFormat("%f")
- self.outWidthSpin.SetDigits(1)
- else:
- self.outWidthSpin = wx.SpinCtrl(
- panel, id=wx.ID_ANY, min=1, max=30, initial=1,
- size=self.spinCtrlSize)
- if self.vPropertiesDict['hcolor'] != 'none':
- self.outWidthSpin.SetValue(self.vPropertiesDict['hwidth'])
- else:
- self.outWidthSpin.SetValue(1)
- colorText = wx.StaticText(panel, id=wx.ID_ANY, label=_("Color:"))
- self.colorPicker = wx.ColourPickerCtrl(panel, id=wx.ID_ANY)
- if self.vPropertiesDict['hcolor'] != 'none':
- self.colorPicker.SetColour(
- convertRGB(self.vPropertiesDict['hcolor']))
- else:
- self.colorPicker.SetColour(convertRGB('black'))
- self.gridBagSizerO.Add(
- self.outlineCheck, pos=(
- 0, 0), span=(
- 1, 2), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerO.Add(
- widthText, pos=(1, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerO.Add(
- self.outWidthSpin, pos=(1, 2),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, border=0)
- self.gridBagSizerO.Add(
- colorText, pos=(2, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerO.Add(
- self.colorPicker, pos=(2, 2),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- sizer.Add(
- self.gridBagSizerO,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- self.Bind(wx.EVT_CHECKBOX, self.OnOutline, self.outlineCheck)
- #colors - fill
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Fill"))
- sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
- self.gridBagSizerF = wx.GridBagSizer(hgap=5, vgap=2)
- fillText = wx.StaticText(
- panel, id=wx.ID_ANY, label=_("Color of lines:"))
- self.colorPickerRadio = wx.RadioButton(
- panel, id=wx.ID_ANY, label=_("choose color:"), style=wx.RB_GROUP)
- # set choose color option if there is no db connection
- if self.connection:
- self.colorPickerRadio.SetValue(
- not self.vPropertiesDict['rgbcolumn'])
- else:
- self.colorPickerRadio.SetValue(False)
- self.fillColorPicker = wx.ColourPickerCtrl(panel, id=wx.ID_ANY)
- if self.vPropertiesDict['color'] != 'none':
- self.fillColorPicker.SetColour(
- convertRGB(self.vPropertiesDict['color']))
- else:
- self.fillColorPicker.SetColour(convertRGB('black'))
- self.colorColRadio = wx.RadioButton(
- panel, id=wx.ID_ANY, label=_("color from map table column:"))
- self.colorColChoice = self.getColsChoice(parent=panel)
- if self.connection:
- if self.vPropertiesDict['rgbcolumn']:
- self.colorColRadio.SetValue(True)
- self.colorColChoice.SetStringSelection(
- self.vPropertiesDict['rgbcolumn'])
- else:
- self.colorColRadio.SetValue(False)
- self.colorColChoice.SetSelection(0)
- self.colorColChoice.Enable(self.connection)
- self.colorColRadio.Enable(self.connection)
- self.gridBagSizerF.Add(
- fillText, pos=(
- 0, 0), span=(
- 1, 2), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerF.Add(
- self.colorPickerRadio, pos=(1, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerF.Add(
- self.fillColorPicker, pos=(1, 2),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerF.Add(
- self.colorColRadio, pos=(2, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.gridBagSizerF.Add(
- self.colorColChoice, pos=(2, 2),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, border=0)
- sizer.Add(
- self.gridBagSizerF,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnColor, self.colorColRadio)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnColor, self.colorPickerRadio)
- panel.SetSizer(border)
- panel.Fit()
- return panel
- def _StylePointPanel(self, notebook):
- panel = wx.Panel(
- parent=notebook, id=wx.ID_ANY, size=(-1, -1),
- style=wx.TAB_TRAVERSAL)
- notebook.AddPage(page=panel, text=_("Size and style"))
- border = wx.BoxSizer(wx.VERTICAL)
- # symbology
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Symbology"))
- sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- self.symbolRadio = wx.RadioButton(
- panel, id=wx.ID_ANY, label=_("symbol:"),
- style=wx.RB_GROUP)
- self.symbolRadio.SetValue(bool(self.vPropertiesDict['symbol']))
- self.symbolName = wx.StaticText(panel, id=wx.ID_ANY)
- self.symbolName.SetLabel(self.vPropertiesDict['symbol'])
- bitmap = wx.Bitmap(
- os.path.join(
- globalvar.SYMBDIR,
- self.vPropertiesDict['symbol']) +
- '.png')
- self.symbolButton = wx.BitmapButton(panel, id=wx.ID_ANY, bitmap=bitmap)
- self.epsRadio = wx.RadioButton(
- panel, id=wx.ID_ANY, label=_("eps file:"))
- self.epsRadio.SetValue(bool(self.vPropertiesDict['eps']))
- self.epsFileCtrl = filebrowse.FileBrowseButton(
- panel, id=wx.ID_ANY, labelText='', buttonText=_("Browse"),
- toolTip=_("Type filename or click browse to choose file"),
- dialogTitle=_("Choose a file"),
- startDirectory='', initialValue='',
- fileMask="Encapsulated PostScript (*.eps)|*.eps|All files (*.*)|*.*",
- fileMode=wx.FD_OPEN)
- if not self.vPropertiesDict['eps']:
- self.epsFileCtrl.SetValue('')
- else: # eps chosen
- self.epsFileCtrl.SetValue(self.vPropertiesDict['eps'])
- gridBagSizer.Add(
- self.symbolRadio, pos=(0, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.symbolName,
- pos=(
- 0,
- 1),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT,
- border=10)
- gridBagSizer.Add(
- self.symbolButton, pos=(0, 2),
- flag=wx.ALIGN_RIGHT, border=0)
- gridBagSizer.Add(
- self.epsRadio, pos=(1, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.epsFileCtrl, pos=(
- 1, 1), span=(
- 1, 2), flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, border=0)
- gridBagSizer.AddGrowableCol(1)
- gridBagSizer.AddGrowableCol(2)
- sizer.Add(
- gridBagSizer,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- self.Bind(wx.EVT_BUTTON, self.OnSymbolSelection, self.symbolButton)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnSymbology, self.symbolRadio)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnSymbology, self.epsRadio)
- # size
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Size"))
- sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- self.sizeRadio = wx.RadioButton(
- panel, id=wx.ID_ANY, label=_("size:"),
- style=wx.RB_GROUP)
- self.sizeSpin = wx.SpinCtrl(
- panel, id=wx.ID_ANY, min=1, max=50, initial=1)
- self.sizecolumnRadio = wx.RadioButton(
- panel, id=wx.ID_ANY, label=_("size from map table column:"))
- self.sizeColChoice = self.getColsChoice(panel)
- self.scaleText = wx.StaticText(panel, id=wx.ID_ANY, label=_("scale:"))
- self.scaleSpin = wx.SpinCtrl(
- panel, id=wx.ID_ANY, min=1, max=25, initial=1)
- self.sizeRadio.SetValue(self.vPropertiesDict['size'] is not None)
- self.sizecolumnRadio.SetValue(bool(self.vPropertiesDict['sizecolumn']))
- if self.vPropertiesDict['size']:
- self.sizeSpin.SetValue(self.vPropertiesDict['size'])
- else:
- self.sizeSpin.SetValue(5)
- if self.vPropertiesDict['sizecolumn']:
- self.scaleSpin.SetValue(self.vPropertiesDict['scale'])
- self.sizeColChoice.SetStringSelection(
- self.vPropertiesDict['sizecolumn'])
- else:
- self.scaleSpin.SetValue(1)
- self.sizeColChoice.SetSelection(0)
- if not self.connection:
- for each in (self.sizecolumnRadio, self.sizeColChoice,
- self.scaleSpin, self.scaleText):
- each.Disable()
- gridBagSizer.Add(
- self.sizeRadio, pos=(0, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.sizeSpin, pos=(0, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.sizecolumnRadio, pos=(1, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.sizeColChoice,
- pos=(
- 1,
- 1),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
- border=0)
- gridBagSizer.Add(
- self.scaleText,
- pos=(
- 2,
- 0),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT,
- border=0)
- gridBagSizer.Add(
- self.scaleSpin, pos=(2, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.AddGrowableCol(0)
- sizer.Add(
- gridBagSizer,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnSize, self.sizeRadio)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnSize, self.sizecolumnRadio)
- # rotation
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Rotation"))
- sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- self.rotateCheck = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_("rotate symbols:"))
- self.rotateRadio = wx.RadioButton(panel, id=wx.ID_ANY, label=_(
- "counterclockwise in degrees:"), style=wx.RB_GROUP)
- self.rotateSpin = wx.SpinCtrl(
- panel, id=wx.ID_ANY, min=0, max=360, initial=0)
- self.rotatecolumnRadio = wx.RadioButton(
- panel, id=wx.ID_ANY, label=_("from map table column:"))
- self.rotateColChoice = self.getColsChoice(panel)
- self.rotateCheck.SetValue(self.vPropertiesDict['rotation'])
- self.rotateRadio.SetValue(self.vPropertiesDict['rotate'] is not None)
- self.rotatecolumnRadio.SetValue(
- bool(self.vPropertiesDict['rotatecolumn']))
- if self.vPropertiesDict['rotate']:
- self.rotateSpin.SetValue(self.vPropertiesDict['rotate'])
- else:
- self.rotateSpin.SetValue(0)
- if self.vPropertiesDict['rotatecolumn']:
- self.rotateColChoice.SetStringSelection(
- self.vPropertiesDict['rotatecolumn'])
- else:
- self.rotateColChoice.SetSelection(0)
- gridBagSizer.Add(
- self.rotateCheck, pos=(
- 0, 0), span=(
- 1, 2), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.rotateRadio, pos=(1, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.rotateSpin, pos=(1, 2),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.rotatecolumnRadio, pos=(2, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.rotateColChoice,
- pos=(
- 2,
- 2),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
- border=0)
- gridBagSizer.AddGrowableCol(1)
- sizer.Add(
- gridBagSizer,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- self.Bind(wx.EVT_CHECKBOX, self.OnRotation, self.rotateCheck)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnRotationType, self.rotateRadio)
- self.Bind(
- wx.EVT_RADIOBUTTON,
- self.OnRotationType,
- self.rotatecolumnRadio)
- panel.SetSizer(border)
- panel.Fit()
- return panel
- def _StyleLinePanel(self, notebook):
- panel = wx.Panel(
- parent=notebook, id=wx.ID_ANY, size=(-1, -1),
- style=wx.TAB_TRAVERSAL)
- notebook.AddPage(page=panel, text=_("Size and style"))
- border = wx.BoxSizer(wx.VERTICAL)
- # width
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Width"))
- sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- widthText = wx.StaticText(
- panel, id=wx.ID_ANY, label=_("Set width (pts):"))
- if fs:
- self.widthSpin = fs.FloatSpin(
- panel,
- id=wx.ID_ANY,
- min_val=0,
- max_val=30,
- increment=0.5,
- value=1,
- style=fs.FS_RIGHT)
- self.widthSpin.SetFormat("%f")
- self.widthSpin.SetDigits(1)
- else:
- self.widthSpin = wx.SpinCtrl(
- panel, id=wx.ID_ANY, min=1, max=30, initial=1)
- self.cwidthCheck = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_("multiply width by category value"))
- if self.vPropertiesDict['width']:
- self.widthSpin.SetValue(self.vPropertiesDict['width'])
- self.cwidthCheck.SetValue(False)
- else:
- self.widthSpin.SetValue(self.vPropertiesDict['cwidth'])
- self.cwidthCheck.SetValue(True)
- gridBagSizer.Add(
- widthText, pos=(0, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.widthSpin, pos=(0, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.cwidthCheck, pos=(
- 1, 0), span=(
- 1, 2), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- sizer.Add(
- gridBagSizer,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- # style
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Line style"))
- sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- styleText = wx.StaticText(
- panel, id=wx.ID_ANY, label=_("Choose line style:"))
- penStyles = ["solid", "dashed", "dotted", "dashdotted"]
- self.styleCombo = PenStyleComboBox(
- panel, choices=penStyles, validator=TCValidator(
- flag='ZERO_AND_ONE_ONLY'))
- # self.styleCombo = wx.ComboBox(panel, id = wx.ID_ANY,
- ## choices = ["solid", "dashed", "dotted", "dashdotted"],
- # validator = TCValidator(flag = 'ZERO_AND_ONE_ONLY'))
- # self.styleCombo.SetToolTipString(_("It's possible to enter a series of 0's and 1's too. "\
- ## "The first block of repeated zeros or ones represents 'draw', "\
- ## "the second block represents 'blank'. An even number of blocks "\
- # "will repeat the pattern, an odd number of blocks will alternate the pattern."))
- linecapText = wx.StaticText(
- panel, id=wx.ID_ANY, label=_("Choose linecap:"))
- self.linecapChoice = wx.Choice(
- panel, id=wx.ID_ANY, choices=[
- "butt", "round", "extended_butt"])
- self.styleCombo.SetValue(self.vPropertiesDict['style'])
- self.linecapChoice.SetStringSelection(self.vPropertiesDict['linecap'])
- gridBagSizer.Add(
- styleText, pos=(0, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.styleCombo,
- pos=(
- 0,
- 1),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
- border=0)
- gridBagSizer.Add(
- linecapText, pos=(1, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.linecapChoice,
- pos=(
- 1,
- 1),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
- border=0)
- sizer.Add(
- gridBagSizer,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- panel.SetSizer(border)
- panel.Fit()
- return panel
- def _StyleAreaPanel(self, notebook):
- panel = wx.Panel(
- parent=notebook, id=wx.ID_ANY, size=(-1, -1),
- style=wx.TAB_TRAVERSAL)
- notebook.AddPage(page=panel, text=_("Size and style"))
- border = wx.BoxSizer(wx.VERTICAL)
- # pattern
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Pattern"))
- sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- self.patternCheck = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_("use pattern:"))
- self.patFileCtrl = filebrowse.FileBrowseButton(
- panel, id=wx.ID_ANY, labelText=_("Choose pattern file:"),
- buttonText=_("Browse"),
- toolTip=_("Type filename or click browse to choose file"),
- dialogTitle=_("Choose a file"),
- startDirectory=self.patternPath, initialValue='',
- fileMask="Encapsulated PostScript (*.eps)|*.eps|All files (*.*)|*.*",
- fileMode=wx.FD_OPEN)
- self.patWidthText = wx.StaticText(
- panel, id=wx.ID_ANY, label=_("pattern line width (pts):"))
- self.patWidthSpin = wx.SpinCtrl(
- panel, id=wx.ID_ANY, min=1, max=25, initial=1)
- self.patScaleText = wx.StaticText(
- panel, id=wx.ID_ANY, label=_("pattern scale factor:"))
- self.patScaleSpin = wx.SpinCtrl(
- panel, id=wx.ID_ANY, min=1, max=25, initial=1)
- self.patternCheck.SetValue(bool(self.vPropertiesDict['pat']))
- if self.patternCheck.GetValue():
- self.patFileCtrl.SetValue(self.vPropertiesDict['pat'])
- self.patWidthSpin.SetValue(self.vPropertiesDict['pwidth'])
- self.patScaleSpin.SetValue(self.vPropertiesDict['scale'])
- gridBagSizer.Add(
- self.patternCheck, pos=(0, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.patFileCtrl, pos=(
- 1, 0), span=(
- 1, 2), flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, border=0)
- gridBagSizer.Add(
- self.patWidthText, pos=(2, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.patWidthSpin, pos=(2, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.patScaleText, pos=(3, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.patScaleSpin, pos=(3, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.AddGrowableCol(1)
- sizer.Add(
- gridBagSizer,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- self.Bind(wx.EVT_CHECKBOX, self.OnPattern, self.patternCheck)
- panel.SetSizer(border)
- panel.Fit()
- return panel
- def OnLayer(self, event):
- """Change columns on layer change """
- if self.layerChoice.GetStringSelection() == self.currLayer:
- return
- self.currLayer = self.layerChoice.GetStringSelection()
- if self.connection:
- cols = self.mapDBInfo.GetColumns(
- self.mapDBInfo.layers[int(self.currLayer)]['table'])
- else:
- cols = []
- self.choiceColumns.SetItems(cols)
- self.choiceColumns.SetSelection(0)
- if self.type in ('points', 'lines'):
- self.colorColChoice.SetItems(cols)
- self.colorColChoice.SetSelection(0)
- def OnOutline(self, event):
- for widget in self.gridBagSizerO.GetChildren():
- if widget.GetWindow() != self.outlineCheck:
- widget.GetWindow().Enable(self.outlineCheck.GetValue())
- def OnFill(self, event):
- enable = self.fillCheck.GetValue()
- self.colorColChoice.Enable(enable)
- self.colorColRadio.Enable(enable)
- self.fillColorPicker.Enable(enable)
- self.colorPickerRadio.Enable(enable)
- if enable:
- self.OnColor(None)
- if not self.connection:
- self.colorColChoice.Disable()
- self.colorColRadio.Disable()
- def OnColor(self, event):
- self.colorColChoice.Enable(self.colorColRadio.GetValue())
- self.fillColorPicker.Enable(self.colorPickerRadio.GetValue())
- def OnSize(self, event):
- self.sizeSpin.Enable(self.sizeRadio.GetValue())
- self.sizeColChoice.Enable(self.sizecolumnRadio.GetValue())
- self.scaleText.Enable(self.sizecolumnRadio.GetValue())
- self.scaleSpin.Enable(self.sizecolumnRadio.GetValue())
- def OnRotation(self, event):
- for each in (self.rotateRadio, self.rotatecolumnRadio,
- self.rotateColChoice, self.rotateSpin):
- if self.rotateCheck.GetValue():
- each.Enable()
- self.OnRotationType(event=None)
- else:
- each.Disable()
- def OnRotationType(self, event):
- self.rotateSpin.Enable(self.rotateRadio.GetValue())
- self.rotateColChoice.Enable(self.rotatecolumnRadio.GetValue())
- def OnPattern(self, event):
- for each in (self.patFileCtrl, self.patWidthText,
- self.patWidthSpin, self.patScaleText, self.patScaleSpin):
- each.Enable(self.patternCheck.GetValue())
- def OnSymbology(self, event):
- useSymbol = self.symbolRadio.GetValue()
- self.symbolButton.Enable(useSymbol)
- self.symbolName.Enable(useSymbol)
- self.epsFileCtrl.Enable(not useSymbol)
- def OnSymbolSelection(self, event):
- dlg = SymbolDialog(self, symbolPath=globalvar.SYMBDIR,
- currentSymbol=self.symbolName.GetLabel())
- if dlg.ShowModal() == wx.ID_OK:
- img = dlg.GetSelectedSymbolPath()
- name = dlg.GetSelectedSymbolName()
- self.symbolButton.SetBitmapLabel(wx.Bitmap(img + '.png'))
- self.symbolName.SetLabel(name)
- dlg.Destroy()
- def EnableLayerSelection(self, enable=True):
- for widget in self.gridBagSizerL.GetChildren():
- if widget.GetWindow() != self.warning:
- widget.GetWindow().Enable(enable)
- def getColsChoice(self, parent):
- """Returns a wx.Choice with table columns"""
- if self.connection:
- cols = self.mapDBInfo.GetColumns(
- self.mapDBInfo.layers[int(self.currLayer)]['table'])
- else:
- cols = []
- choice = wx.Choice(parent=parent, id=wx.ID_ANY, choices=cols)
- return choice
- def update(self):
- # feature type
- if self.type in ('lines', 'points'):
- featureType = None
- if self.checkType1.GetValue():
- featureType = self.checkType1.GetName()
- if self.checkType2.GetValue():
- featureType += " or " + self.checkType2.GetName()
- elif self.checkType2.GetValue():
- featureType = self.checkType2.GetName()
- if featureType:
- self.vPropertiesDict['type'] = featureType
- # is connection
- self.vPropertiesDict['connection'] = self.connection
- if self.connection:
- self.vPropertiesDict[
- 'layer'] = self.layerChoice.GetStringSelection()
- if self.radioCats.GetValue() and not self.textCtrlCats.IsEmpty():
- self.vPropertiesDict['cats'] = self.textCtrlCats.GetValue()
- elif self.radioWhere.GetValue() and not self.textCtrlWhere.IsEmpty():
- self.vPropertiesDict['where'] = self.choiceColumns.GetStringSelection(
- ) + " " + self.textCtrlWhere.GetValue()
- # mask
- if self.mask.GetValue():
- self.vPropertiesDict['masked'] = 'y'
- else:
- self.vPropertiesDict['masked'] = 'n'
- # colors
- if self.type in ('points', 'areas'):
- if self.outlineCheck.GetValue():
- self.vPropertiesDict['color'] = convertRGB(
- self.colorPicker.GetColour())
- self.vPropertiesDict['width'] = self.widthSpin.GetValue()
- else:
- self.vPropertiesDict['color'] = 'none'
- if self.fillCheck.GetValue():
- if self.colorPickerRadio.GetValue():
- self.vPropertiesDict['fcolor'] = convertRGB(
- self.fillColorPicker.GetColour())
- self.vPropertiesDict['rgbcolumn'] = None
- if self.colorColRadio.GetValue():
- # this color is taken in case of no record in rgb column
- self.vPropertiesDict['fcolor'] = 'none'
- self.vPropertiesDict[
- 'rgbcolumn'] = self.colorColChoice.GetStringSelection()
- else:
- self.vPropertiesDict['fcolor'] = 'none'
- if self.type == 'lines':
- # hcolor only when no rgbcolumn
- # and self.fillCheck.GetValue() and self.colorColRadio.GetValue():
- if self.outlineCheck.GetValue():
- self.vPropertiesDict['hcolor'] = convertRGB(
- self.colorPicker.GetColour())
- self.vPropertiesDict['hwidth'] = self.outWidthSpin.GetValue()
- else:
- self.vPropertiesDict['hcolor'] = 'none'
- if self.colorPickerRadio.GetValue():
- self.vPropertiesDict['color'] = convertRGB(
- self.fillColorPicker.GetColour())
- self.vPropertiesDict['rgbcolumn'] = None
- if self.colorColRadio.GetValue():
- # this color is taken in case of no record in rgb column
- self.vPropertiesDict['color'] = 'none'
- self.vPropertiesDict[
- 'rgbcolumn'] = self.colorColChoice.GetStringSelection()
- #
- #size and style
- #
- if self.type == 'points':
- # symbols
- if self.symbolRadio.GetValue():
- self.vPropertiesDict['symbol'] = self.symbolName.GetLabel()
- self.vPropertiesDict['eps'] = None
- else:
- self.vPropertiesDict['eps'] = self.epsFileCtrl.GetValue()
- # size
- if self.sizeRadio.GetValue():
- self.vPropertiesDict['size'] = self.sizeSpin.GetValue()
- self.vPropertiesDict['sizecolumn'] = None
- self.vPropertiesDict['scale'] = None
- else:
- self.vPropertiesDict[
- 'sizecolumn'] = self.sizeColChoice.GetStringSelection()
- self.vPropertiesDict['scale'] = self.scaleSpin.GetValue()
- self.vPropertiesDict['size'] = None
- # rotation
- self.vPropertiesDict['rotate'] = None
- self.vPropertiesDict['rotatecolumn'] = None
- self.vPropertiesDict['rotation'] = False
- if self.rotateCheck.GetValue():
- self.vPropertiesDict['rotation'] = True
- if self.rotateRadio.GetValue():
- self.vPropertiesDict['rotate'] = self.rotateSpin.GetValue()
- else:
- self.vPropertiesDict[
- 'rotatecolumn'] = self.rotateColChoice.GetStringSelection()
- if self.type == 'areas':
- # pattern
- self.vPropertiesDict['pat'] = None
- if self.patternCheck.GetValue() and bool(self.patFileCtrl.GetValue()):
- self.vPropertiesDict['pat'] = self.patFileCtrl.GetValue()
- self.vPropertiesDict['pwidth'] = self.patWidthSpin.GetValue()
- self.vPropertiesDict['scale'] = self.patScaleSpin.GetValue()
- if self.type == 'lines':
- # width
- if self.cwidthCheck.GetValue():
- self.vPropertiesDict['cwidth'] = self.widthSpin.GetValue()
- self.vPropertiesDict['width'] = None
- else:
- self.vPropertiesDict['width'] = self.widthSpin.GetValue()
- self.vPropertiesDict['cwidth'] = None
- # line style
- if self.styleCombo.GetValue():
- self.vPropertiesDict['style'] = self.styleCombo.GetValue()
- else:
- self.vPropertiesDict['style'] = 'solid'
- self.vPropertiesDict[
- 'linecap'] = self.linecapChoice.GetStringSelection()
- def OnOK(self, event):
- self.update()
- event.Skip()
- class LegendDialog(PsmapDialog):
- def __init__(self, parent, id, settings, page):
- PsmapDialog.__init__(
- self,
- parent=parent,
- id=id,
- title="Legend settings",
- settings=settings)
- self.objectType = ('rasterLegend', 'vectorLegend')
- self.instruction = settings
- map = self.instruction.FindInstructionByType('map')
- if map:
- self.mapId = map.id
- else:
- self.mapId = None
- vector = self.instruction.FindInstructionByType('vector')
- if vector:
- self.vectorId = vector.id
- else:
- self.vectorId = None
- raster = self.instruction.FindInstructionByType('raster')
- if raster:
- self.rasterId = raster.id
- else:
- self.rasterId = None
- self.pageId = self.instruction.FindInstructionByType('page').id
- currPage = self.instruction[self.pageId].GetInstruction()
- # raster legend
- if self.id[0] is not None:
- self.rasterLegend = self.instruction[self.id[0]]
- self.rLegendDict = self.rasterLegend.GetInstruction()
- else:
- self.id[0] = wx.NewId()
- self.rasterLegend = RasterLegend(self.id[0])
- self.rLegendDict = self.rasterLegend.GetInstruction()
- self.rLegendDict['where'] = currPage['Left'], currPage['Top']
- # vector legend
- if self.id[1] is not None:
- self.vLegendDict = self.instruction[self.id[1]].GetInstruction()
- else:
- self.id[1] = wx.NewId()
- vectorLegend = VectorLegend(self.id[1])
- self.vLegendDict = vectorLegend.GetInstruction()
- self.vLegendDict['where'] = currPage['Left'], currPage['Top']
- if self.rasterId:
- self.currRaster = self.instruction[self.rasterId]['raster']
- else:
- self.currRaster = None
- # notebook
- self.notebook = wx.Notebook(
- parent=self, id=wx.ID_ANY, style=wx.BK_DEFAULT)
- self.panelRaster = self._rasterLegend(self.notebook)
- self.panelVector = self._vectorLegend(self.notebook)
- self.OnRaster(None)
- self.OnRange(None)
- self.OnIsLegend(None)
- self.OnSpan(None)
- self.OnBorder(None)
- self._layout(self.notebook)
- self.notebook.ChangeSelection(page)
- self.notebook.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGING, self.OnPageChanging)
- def OnPageChanging(self, event):
- """Workaround to scroll up to see the checkbox"""
- wx.CallAfter(self.FindWindowByName('rasterPanel').ScrollChildIntoView,
- self.FindWindowByName('showRLegend'))
- wx.CallAfter(self.FindWindowByName('vectorPanel').ScrollChildIntoView,
- self.FindWindowByName('showVLegend'))
- def _rasterLegend(self, notebook):
- panel = scrolled.ScrolledPanel(
- parent=notebook, id=wx.ID_ANY, size=(-1, 500),
- style=wx.TAB_TRAVERSAL)
- panel.SetupScrolling(scroll_x=False, scroll_y=True)
- panel.SetName('rasterPanel')
- notebook.AddPage(page=panel, text=_("Raster legend"))
- border = wx.BoxSizer(wx.VERTICAL)
- # is legend
- self.isRLegend = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_("Show raster legend"))
- self.isRLegend.SetValue(self.rLegendDict['rLegend'])
- self.isRLegend.SetName("showRLegend")
- border.Add(
- item=self.isRLegend,
- proportion=0,
- flag=wx.ALL | wx.EXPAND,
- border=5)
- # choose raster
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Source raster"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- flexSizer = wx.FlexGridSizer(cols=2, hgap=5, vgap=5)
- self.rasterDefault = wx.RadioButton(
- panel, id=wx.ID_ANY, label=_("current raster"),
- style=wx.RB_GROUP)
- self.rasterOther = wx.RadioButton(
- panel, id=wx.ID_ANY, label=_("select raster"))
- self.rasterDefault.SetValue(self.rLegendDict['rasterDefault'])
- self.rasterOther.SetValue(not self.rLegendDict['rasterDefault'])
- rasterType = getRasterType(map=self.currRaster)
- self.rasterCurrent = wx.StaticText(
- panel, id=wx.ID_ANY, label=_("%(rast)s: type %(type)s") %
- {'rast': self.currRaster, 'type': rasterType})
- self.rasterSelect = Select(
- panel,
- id=wx.ID_ANY,
- size=globalvar.DIALOG_GSELECT_SIZE,
- type='raster',
- multiple=False,
- updateOnPopup=True,
- onPopup=None)
- if not self.rLegendDict['rasterDefault']:
- self.rasterSelect.SetValue(self.rLegendDict['raster'])
- else:
- self.rasterSelect.SetValue('')
- flexSizer.Add(
- self.rasterDefault,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- flexSizer.Add(
- self.rasterCurrent,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT,
- border=10)
- flexSizer.Add(
- self.rasterOther,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- flexSizer.Add(
- self.rasterSelect,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT,
- border=0)
- flexSizer.AddGrowableCol(1)
- sizer.Add(
- item=flexSizer,
- proportion=1,
- flag=wx.ALL | wx.EXPAND,
- border=1)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- # type of legend
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Type of legend"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- vbox = wx.BoxSizer(wx.VERTICAL)
- self.discrete = wx.RadioButton(
- parent=panel, id=wx.ID_ANY, label=" %s " %
- _("discrete legend (categorical maps)"),
- style=wx.RB_GROUP)
- self.continuous = wx.RadioButton(
- parent=panel, id=wx.ID_ANY, label=" %s " %
- _("continuous color gradient legend (floating point map)"))
- vbox.Add(
- self.discrete,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=0)
- vbox.Add(
- self.continuous,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=0)
- sizer.Add(item=vbox, proportion=1, flag=wx.ALL | wx.EXPAND, border=1)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- # size, position and font
- self.sizePositionFont(
- legendType='raster',
- parent=panel,
- mainSizer=border)
- # advanced settings
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Advanced legend settings"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- # no data
- self.nodata = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_('draw "no data" box'))
- if self.rLegendDict['nodata'] == 'y':
- self.nodata.SetValue(True)
- else:
- self.nodata.SetValue(False)
- # tickbar
- self.ticks = wx.CheckBox(
- panel,
- id=wx.ID_ANY,
- label=_("draw ticks across color table"))
- if self.rLegendDict['tickbar'] == 'y':
- self.ticks.SetValue(True)
- else:
- self.ticks.SetValue(False)
- # range
- if self.rasterId and self.instruction[self.rasterId]['raster']:
- rinfo = grass.raster_info(
- self.instruction[
- self.rasterId]['raster'])
- self.minim, self.maxim = rinfo['min'], rinfo['max']
- else:
- self.minim, self.maxim = 0, 0
- self.range = wx.CheckBox(panel, id=wx.ID_ANY, label=_("range"))
- self.range.SetValue(self.rLegendDict['range'])
- self.minText = wx.StaticText(
- panel,
- id=wx.ID_ANY,
- label="min (%s)" %
- self.minim)
- self.maxText = wx.StaticText(
- panel,
- id=wx.ID_ANY,
- label="max (%s)" %
- self.maxim)
- self.min = wx.TextCtrl(
- panel, id=wx.ID_ANY, value=str(
- self.rLegendDict['min']))
- self.max = wx.TextCtrl(
- panel, id=wx.ID_ANY, value=str(
- self.rLegendDict['max']))
- gridBagSizer.Add(
- self.nodata, pos=(
- 0, 0), span=(
- 1, 5), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.ticks, pos=(
- 1, 0), span=(
- 1, 5), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.range, pos=(2, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.minText,
- pos=(
- 2,
- 1),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT,
- border=0)
- gridBagSizer.Add(
- self.min, pos=(2, 2),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.maxText,
- pos=(
- 2,
- 3),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT,
- border=0)
- gridBagSizer.Add(
- self.max, pos=(2, 4),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- sizer.Add(
- gridBagSizer,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- panel.SetSizer(border)
- panel.Fit()
- # bindings
- self.Bind(wx.EVT_RADIOBUTTON, self.OnRaster, self.rasterDefault)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnRaster, self.rasterOther)
- self.Bind(wx.EVT_CHECKBOX, self.OnIsLegend, self.isRLegend)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnDiscrete, self.discrete)
- self.Bind(wx.EVT_RADIOBUTTON, self.OnDiscrete, self.continuous)
- ## self.Bind(wx.EVT_CHECKBOX, self.OnDefaultSize, panel.defaultSize)
- self.Bind(wx.EVT_CHECKBOX, self.OnRange, self.range)
- self.rasterSelect.GetTextCtrl().Bind(wx.EVT_TEXT, self.OnRaster)
- return panel
- def _vectorLegend(self, notebook):
- panel = scrolled.ScrolledPanel(
- parent=notebook, id=wx.ID_ANY, size=(-1, 500),
- style=wx.TAB_TRAVERSAL)
- panel.SetupScrolling(scroll_x=False, scroll_y=True)
- panel.SetName('vectorPanel')
- notebook.AddPage(page=panel, text=_("Vector legend"))
- border = wx.BoxSizer(wx.VERTICAL)
- # is legend
- self.isVLegend = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_("Show vector legend"))
- self.isVLegend.SetValue(self.vLegendDict['vLegend'])
- self.isVLegend.SetName("showVLegend")
- border.Add(
- item=self.isVLegend,
- proportion=0,
- flag=wx.ALL | wx.EXPAND,
- border=5)
- # vector maps, their order, labels
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Source vector maps"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- vectorText = wx.StaticText(panel, id=wx.ID_ANY, label=_(
- "Choose vector maps and their order in legend"))
- self.vectorListCtrl = CheckListCtrl(panel)
- self.vectorListCtrl.InsertColumn(0, _("Vector map"))
- self.vectorListCtrl.InsertColumn(1, _("Label"))
- if self.vectorId:
- vectors = sorted(
- self.instruction[
- self.vectorId]['list'],
- key=lambda x: x[3])
- for vector in vectors:
- index = self.vectorListCtrl.InsertStringItem(
- sys.maxsize, vector[0].split('@')[0])
- self.vectorListCtrl.SetStringItem(index, 1, vector[4])
- self.vectorListCtrl.SetItemData(index, index)
- self.vectorListCtrl.CheckItem(index, True)
- if vector[3] == 0:
- self.vectorListCtrl.CheckItem(index, False)
- if not self.vectorId:
- self.vectorListCtrl.SetColumnWidth(0, 100)
- else:
- self.vectorListCtrl.SetColumnWidth(0, wx.LIST_AUTOSIZE)
- self.vectorListCtrl.SetColumnWidth(1, wx.LIST_AUTOSIZE)
- self.btnUp = wx.Button(panel, id=wx.ID_ANY, label=_("Up"))
- self.btnDown = wx.Button(panel, id=wx.ID_ANY, label=_("Down"))
- self.btnLabel = wx.Button(panel, id=wx.ID_ANY, label=_("Edit label"))
- gridBagSizer.Add(
- vectorText, pos=(
- 0, 0), span=(
- 1, 2), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.vectorListCtrl, pos=(
- 1, 0), span=(
- 3, 1), flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, border=0)
- gridBagSizer.Add(
- self.btnUp, pos=(1, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.btnDown, pos=(2, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.btnLabel, pos=(3, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.AddGrowableCol(0, 3)
- gridBagSizer.AddGrowableCol(1, 1)
- sizer.Add(
- gridBagSizer,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
- border=0)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- # size, position and font
- self.sizePositionFont(
- legendType='vector',
- parent=panel,
- mainSizer=border)
- # border
- # GTC Line around legend or map frame
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Border"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- flexGridSizer = wx.FlexGridSizer(cols=2, hgap=5, vgap=5)
- self.borderCheck = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_("draw border around legend"))
- self.borderColorCtrl = wx.ColourPickerCtrl(
- panel, id=wx.ID_ANY, style=wx.FNTP_FONTDESC_AS_LABEL)
- if self.vLegendDict['border'] == 'none':
- self.borderColorCtrl.SetColour(wx.BLACK)
- self.borderCheck.SetValue(False)
- else:
- self.borderColorCtrl.SetColour(
- convertRGB(self.vLegendDict['border']))
- self.borderCheck.SetValue(True)
- flexGridSizer.Add(
- self.borderCheck,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- flexGridSizer.Add(
- self.borderColorCtrl,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- sizer.Add(
- item=flexGridSizer,
- proportion=1,
- flag=wx.ALL | wx.EXPAND,
- border=1)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- self.Bind(wx.EVT_BUTTON, self.OnUp, self.btnUp)
- self.Bind(wx.EVT_BUTTON, self.OnDown, self.btnDown)
- self.Bind(wx.EVT_BUTTON, self.OnEditLabel, self.btnLabel)
- self.Bind(wx.EVT_CHECKBOX, self.OnIsLegend, self.isVLegend)
- self.Bind(wx.EVT_CHECKBOX, self.OnSpan, panel.spanRadio)
- self.Bind(wx.EVT_CHECKBOX, self.OnBorder, self.borderCheck)
- self.Bind(
- wx.EVT_FONTPICKER_CHANGED,
- self.OnFont,
- panel.font['fontCtrl'])
- panel.SetSizer(border)
- panel.Fit()
- return panel
- def sizePositionFont(self, legendType, parent, mainSizer):
- """Insert widgets for size, position and font control"""
- if legendType == 'raster':
- legendDict = self.rLegendDict
- else:
- legendDict = self.vLegendDict
- panel = parent
- border = mainSizer
- # size and position
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Size and position"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- # unit
- self.AddUnits(parent=panel, dialogDict=legendDict)
- unitBox = wx.BoxSizer(wx.HORIZONTAL)
- unitBox.Add(
- panel.units['unitsLabel'],
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT,
- border=10)
- unitBox.Add(
- panel.units['unitsCtrl'],
- proportion=1,
- flag=wx.ALL,
- border=5)
- sizer.Add(
- unitBox,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- hBox = wx.BoxSizer(wx.HORIZONTAL)
- posBox = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Position"))
- posSizer = wx.StaticBoxSizer(posBox, wx.VERTICAL)
- sizeBox = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Size"))
- sizeSizer = wx.StaticBoxSizer(sizeBox, wx.VERTICAL)
- posGridBagSizer = wx.GridBagSizer(hgap=10, vgap=5)
- # position
- self.AddPosition(parent=panel, dialogDict=legendDict)
- posGridBagSizer.Add(panel.position['xLabel'], pos=(
- 0, 0), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- posGridBagSizer.Add(panel.position['xCtrl'], pos=(
- 0, 1), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- posGridBagSizer.Add(panel.position['yLabel'], pos=(
- 1, 0), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- posGridBagSizer.Add(panel.position['yCtrl'], pos=(
- 1, 1), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- posGridBagSizer.Add(
- panel.position['comment'], pos=(
- 2, 0), span=(
- 1, 2), flag=wx.ALIGN_BOTTOM, border=0)
- posGridBagSizer.AddGrowableRow(2)
- posSizer.Add(
- posGridBagSizer,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- # size
- width = wx.StaticText(panel, id=wx.ID_ANY, label=_("Width:"))
- if legendDict['width']:
- w = self.unitConv.convert(
- value=float(legendDict['width']),
- fromUnit='inch', toUnit=legendDict['unit'])
- else:
- w = ''
- panel.widthCtrl = wx.TextCtrl(
- panel, id=wx.ID_ANY, value=str(w),
- validator=TCValidator("DIGIT_ONLY"))
- panel.widthCtrl.SetToolTipString(
- _("Leave the edit field empty, to use default values."))
- if legendType == 'raster':
- ## panel.defaultSize = wx.CheckBox(panel, id = wx.ID_ANY, label = _("Use default size"))
- # panel.defaultSize.SetValue(legendDict['defaultSize'])
- panel.heightOrColumnsLabel = wx.StaticText(
- panel, id=wx.ID_ANY, label=_("Height:"))
- if legendDict['height']:
- h = self.unitConv.convert(
- value=float(legendDict['height']),
- fromUnit='inch', toUnit=legendDict['unit'])
- else:
- h = ''
- panel.heightOrColumnsCtrl = wx.TextCtrl(
- panel, id=wx.ID_ANY, value=str(h),
- validator=TCValidator("DIGIT_ONLY"))
- self.rSizeGBSizer = wx.GridBagSizer(hgap=5, vgap=5)
- ## self.rSizeGBSizer.Add(panel.defaultSize, pos = (0,0), span = (1,2), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
- self.rSizeGBSizer.Add(
- width, pos=(0, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.rSizeGBSizer.Add(
- panel.widthCtrl, pos=(0, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.rSizeGBSizer.Add(
- panel.heightOrColumnsLabel, pos=(
- 1, 0), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.rSizeGBSizer.Add(
- panel.heightOrColumnsCtrl, pos=(
- 1, 1), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- sizeSizer.Add(
- self.rSizeGBSizer,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- if legendType == 'vector':
- panel.widthCtrl.SetToolTipString(
- _("Width of the color symbol (for lines)\nin front of the legend text"))
- # columns
- minVect, maxVect = 0, 0
- if self.vectorId:
- minVect = 1
- maxVect = min(10, len(self.instruction[self.vectorId]['list']))
- cols = wx.StaticText(panel, id=wx.ID_ANY, label=_("Columns:"))
- panel.colsCtrl = wx.SpinCtrl(
- panel,
- id=wx.ID_ANY,
- value="",
- min=minVect,
- max=maxVect,
- initial=legendDict['cols'])
- # span
- panel.spanRadio = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_("column span:"))
- panel.spanTextCtrl = wx.TextCtrl(panel, id=wx.ID_ANY, value='')
- panel.spanTextCtrl.SetToolTipString(_("Column separation distance between the left edges\n"
- "of two columns in a multicolumn legend"))
- if legendDict['span']:
- panel.spanRadio.SetValue(True)
- s = self.unitConv.convert(
- value=float(legendDict['span']),
- fromUnit='inch', toUnit=legendDict['unit'])
- panel.spanTextCtrl.SetValue(str(s))
- else:
- panel.spanRadio.SetValue(False)
- self.vSizeGBSizer = wx.GridBagSizer(hgap=5, vgap=5)
- self.vSizeGBSizer.Add(
- width, pos=(0, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.vSizeGBSizer.Add(
- panel.widthCtrl, pos=(0, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.vSizeGBSizer.Add(
- cols, pos=(1, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.vSizeGBSizer.Add(
- panel.colsCtrl, pos=(1, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.vSizeGBSizer.Add(
- panel.spanRadio, pos=(2, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.vSizeGBSizer.Add(
- panel.spanTextCtrl, pos=(2, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.vSizeGBSizer.AddGrowableCol(1)
- sizeSizer.Add(
- self.vSizeGBSizer,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- hBox.Add(posSizer, proportion=1, flag=wx.EXPAND | wx.ALL, border=3)
- hBox.Add(sizeSizer, proportion=1, flag=wx.EXPAND | wx.ALL, border=3)
- sizer.Add(hBox, proportion=0, flag=wx.EXPAND, border=0)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- # font
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Font settings"))
- fontSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- flexSizer = wx.FlexGridSizer(cols=2, hgap=5, vgap=5)
- if legendType == 'raster':
- self.AddFont(parent=panel, dialogDict=legendDict, color=True)
- else:
- self.AddFont(parent=panel, dialogDict=legendDict, color=False)
- flexSizer.Add(
- panel.font['fontLabel'],
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- flexSizer.Add(
- panel.font['fontCtrl'],
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- flexSizer.Add(
- panel.font['fontSizeLabel'],
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- flexSizer.Add(
- panel.font['fontSizeCtrl'],
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- if legendType == 'raster':
- flexSizer.Add(
- panel.font['colorLabel'],
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- flexSizer.Add(
- panel.font['colorCtrl'],
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- flexSizer.AddGrowableCol(1)
- fontSizer.Add(
- item=flexSizer,
- proportion=1,
- flag=wx.ALL | wx.EXPAND,
- border=1)
- border.Add(
- item=fontSizer,
- proportion=0,
- flag=wx.ALL | wx.EXPAND,
- border=5)
- # some enable/disable methods
- def OnIsLegend(self, event):
- """Enables and disables controls, it depends if raster or vector legend is checked"""
- page = self.notebook.GetSelection()
- if page == 0 or event is None:
- children = self.panelRaster.GetChildren()
- if self.isRLegend.GetValue():
- for i, widget in enumerate(children):
- widget.Enable()
- self.OnRaster(None)
- self.OnRange(None)
- self.OnDiscrete(None)
- else:
- for widget in children:
- if widget.GetName() != 'showRLegend':
- widget.Disable()
- if page == 1 or event is None:
- children = self.panelVector.GetChildren()
- if self.isVLegend.GetValue():
- for i, widget in enumerate(children):
- widget.Enable()
- self.OnSpan(None)
- self.OnBorder(None)
- else:
- for widget in children:
- if widget.GetName() != 'showVLegend':
- widget.Disable()
- def OnRaster(self, event):
- if self.rasterDefault.GetValue(): # default
- self.rasterSelect.Disable()
- type = getRasterType(self.currRaster)
- else: # select raster
- self.rasterSelect.Enable()
- map = self.rasterSelect.GetValue()
- type = getRasterType(map)
- if type == 'CELL':
- self.discrete.SetValue(True)
- elif type in ('FCELL', 'DCELL'):
- self.continuous.SetValue(True)
- if event is None:
- if self.rLegendDict['discrete'] == 'y':
- self.discrete.SetValue(True)
- elif self.rLegendDict['discrete'] == 'n':
- self.continuous.SetValue(True)
- self.OnDiscrete(None)
- def OnDiscrete(self, event):
- """Change control according to the type of legend"""
- enabledSize = self.panelRaster.heightOrColumnsCtrl.IsEnabled()
- self.panelRaster.heightOrColumnsCtrl.Destroy()
- if self.discrete.GetValue():
- self.panelRaster.heightOrColumnsLabel.SetLabel(_("Columns:"))
- self.panelRaster.heightOrColumnsCtrl = wx.SpinCtrl(
- self.panelRaster, id=wx.ID_ANY, value="", min=1, max=10,
- initial=self.rLegendDict['cols'])
- self.panelRaster.heightOrColumnsCtrl.Enable(enabledSize)
- self.nodata.Enable()
- self.range.Disable()
- self.min.Disable()
- self.max.Disable()
- self.minText.Disable()
- self.maxText.Disable()
- self.ticks.Disable()
- else:
- self.panelRaster.heightOrColumnsLabel.SetLabel(_("Height:"))
- if self.rLegendDict['height']:
- h = self.unitConv.convert(
- value=float(
- self.rLegendDict['height']),
- fromUnit='inch',
- toUnit=self.rLegendDict['unit'])
- else:
- h = ''
- self.panelRaster.heightOrColumnsCtrl = wx.TextCtrl(
- self.panelRaster, id=wx.ID_ANY, value=str(h),
- validator=TCValidator("DIGIT_ONLY"))
- self.panelRaster.heightOrColumnsCtrl.Enable(enabledSize)
- self.nodata.Disable()
- self.range.Enable()
- if self.range.GetValue():
- self.minText.Enable()
- self.maxText.Enable()
- self.min.Enable()
- self.max.Enable()
- self.ticks.Enable()
- self.rSizeGBSizer.Add(
- self.panelRaster.heightOrColumnsCtrl, pos=(
- 1, 1), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- self.panelRaster.Layout()
- self.panelRaster.Fit()
- def OnRange(self, event):
- if not self.range.GetValue():
- self.min.Disable()
- self.max.Disable()
- self.minText.Disable()
- self.maxText.Disable()
- else:
- self.min.Enable()
- self.max.Enable()
- self.minText.Enable()
- self.maxText.Enable()
- def OnUp(self, event):
- """Moves selected map up, changes order in vector legend"""
- if self.vectorListCtrl.GetFirstSelected() != -1:
- pos = self.vectorListCtrl.GetFirstSelected()
- if pos:
- idx1 = self.vectorListCtrl.GetItemData(pos) - 1
- idx2 = self.vectorListCtrl.GetItemData(pos - 1) + 1
- self.vectorListCtrl.SetItemData(pos, idx1)
- self.vectorListCtrl.SetItemData(pos - 1, idx2)
- self.vectorListCtrl.SortItems(cmp)
- if pos > 0:
- selected = (pos - 1)
- else:
- selected = 0
- self.vectorListCtrl.Select(selected)
- def OnDown(self, event):
- """Moves selected map down, changes order in vector legend"""
- if self.vectorListCtrl.GetFirstSelected() != -1:
- pos = self.vectorListCtrl.GetFirstSelected()
- if pos != self.vectorListCtrl.GetItemCount() - 1:
- idx1 = self.vectorListCtrl.GetItemData(pos) + 1
- idx2 = self.vectorListCtrl.GetItemData(pos + 1) - 1
- self.vectorListCtrl.SetItemData(pos, idx1)
- self.vectorListCtrl.SetItemData(pos + 1, idx2)
- self.vectorListCtrl.SortItems(cmp)
- if pos < self.vectorListCtrl.GetItemCount() - 1:
- selected = (pos + 1)
- else:
- selected = self.vectorListCtrl.GetItemCount() - 1
- self.vectorListCtrl.Select(selected)
- def OnEditLabel(self, event):
- """Change legend label of vector map"""
- if self.vectorListCtrl.GetFirstSelected() != -1:
- idx = self.vectorListCtrl.GetFirstSelected()
- default = self.vectorListCtrl.GetItem(idx, 1).GetText()
- dlg = wx.TextEntryDialog(
- self,
- message=_("Edit legend label:"),
- caption=_("Edit label"),
- defaultValue=default,
- style=wx.OK | wx.CANCEL | wx.CENTRE)
- if dlg.ShowModal() == wx.ID_OK:
- new = dlg.GetValue()
- self.vectorListCtrl.SetStringItem(idx, 1, new)
- dlg.Destroy()
- def OnSpan(self, event):
- self.panelVector.spanTextCtrl.Enable(
- self.panelVector.spanRadio.GetValue())
- def OnFont(self, event):
- """Changes default width according to fontsize, width [inch] = fontsize[pt]/24"""
- ## fontsize = self.panelVector.font['fontCtrl'].GetSelectedFont().GetPointSize()
- fontsize = self.panelVector.font['fontSizeCtrl'].GetValue()
- unit = self.unitConv.findUnit(
- self.panelVector.units['unitsCtrl'].GetStringSelection())
- w = fontsize / 24.
- width = self.unitConv.convert(value=w, fromUnit='inch', toUnit=unit)
- self.panelVector.widthCtrl.SetValue("%3.2f" % width)
- def OnBorder(self, event):
- """Enables/disables colorPickerCtrl for border"""
- self.borderColorCtrl.Enable(self.borderCheck.GetValue())
- def updateRasterLegend(self):
- """Save information from raster legend dialog to dictionary"""
- # is raster legend
- if not self.isRLegend.GetValue():
- self.rLegendDict['rLegend'] = False
- else:
- self.rLegendDict['rLegend'] = True
- # units
- currUnit = self.unitConv.findUnit(
- self.panelRaster.units['unitsCtrl'].GetStringSelection())
- self.rLegendDict['unit'] = currUnit
- # raster
- if self.rasterDefault.GetValue():
- self.rLegendDict['rasterDefault'] = True
- self.rLegendDict['raster'] = self.currRaster
- else:
- self.rLegendDict['rasterDefault'] = False
- self.rLegendDict['raster'] = self.rasterSelect.GetValue()
- if self.rLegendDict['rLegend'] and not self.rLegendDict['raster']:
- wx.MessageBox(message=_("No raster map selected!"),
- caption=_('No raster'), style=wx.OK | wx.ICON_ERROR)
- return False
- if self.rLegendDict['raster']:
- # type and range of map
- rasterType = getRasterType(self.rLegendDict['raster'])
- if rasterType is None:
- return False
- self.rLegendDict['type'] = rasterType
- # discrete
- if self.discrete.GetValue():
- self.rLegendDict['discrete'] = 'y'
- else:
- self.rLegendDict['discrete'] = 'n'
- # font
- self.rLegendDict['font'] = self.panelRaster.font[
- 'fontCtrl'].GetStringSelection()
- self.rLegendDict['fontsize'] = self.panelRaster.font[
- 'fontSizeCtrl'].GetValue()
- color = self.panelRaster.font['colorCtrl'].GetColour()
- self.rLegendDict['color'] = convertRGB(color)
- # position
- x = self.unitConv.convert(
- value=float(
- self.panelRaster.position
- ['xCtrl'].GetValue()),
- fromUnit=currUnit, toUnit='inch')
- y = self.unitConv.convert(
- value=float(
- self.panelRaster.position
- ['yCtrl'].GetValue()),
- fromUnit=currUnit, toUnit='inch')
- self.rLegendDict['where'] = (x, y)
- # estimated size
- width = self.panelRaster.widthCtrl.GetValue()
- try:
- width = float(width)
- width = self.unitConv.convert(
- value=width, fromUnit=currUnit, toUnit='inch')
- except ValueError:
- width = None
- self.rLegendDict['width'] = width
- if self.rLegendDict['discrete'] == 'n':
- height = self.panelRaster.heightOrColumnsCtrl.GetValue()
- try:
- height = float(height)
- height = self.unitConv.convert(
- value=height, fromUnit=currUnit, toUnit='inch')
- except ValueError:
- height = None
- self.rLegendDict['height'] = height
- else:
- cols = self.panelRaster.heightOrColumnsCtrl.GetValue()
- self.rLegendDict['cols'] = cols
- drawHeight = self.rasterLegend.EstimateHeight(
- raster=self.rLegendDict['raster'],
- discrete=self.rLegendDict['discrete'],
- fontsize=self.rLegendDict['fontsize'],
- cols=self.rLegendDict['cols'],
- height=self.rLegendDict['height'])
- drawWidth = self.rasterLegend.EstimateWidth(
- raster=self.rLegendDict['raster'],
- discrete=self.rLegendDict['discrete'],
- fontsize=self.rLegendDict['fontsize'],
- cols=self.rLegendDict['cols'],
- width=self.rLegendDict['width'],
- paperInstr=self.instruction[self.pageId])
- self.rLegendDict['rect'] = Rect2D(
- x=x, y=y, width=drawWidth, height=drawHeight)
- # no data
- if self.rLegendDict['discrete'] == 'y':
- if self.nodata.GetValue():
- self.rLegendDict['nodata'] = 'y'
- else:
- self.rLegendDict['nodata'] = 'n'
- # tickbar
- elif self.rLegendDict['discrete'] == 'n':
- if self.ticks.GetValue():
- self.rLegendDict['tickbar'] = 'y'
- else:
- self.rLegendDict['tickbar'] = 'n'
- # range
- if self.range.GetValue():
- self.rLegendDict['range'] = True
- self.rLegendDict['min'] = self.min.GetValue()
- self.rLegendDict['max'] = self.max.GetValue()
- else:
- self.rLegendDict['range'] = False
- if not self.id[0] in self.instruction:
- rasterLegend = RasterLegend(self.id[0])
- self.instruction.AddInstruction(rasterLegend)
- self.instruction[self.id[0]].SetInstruction(self.rLegendDict)
- if self.id[0] not in self.parent.objectId:
- self.parent.objectId.append(self.id[0])
- return True
- def updateVectorLegend(self):
- """Save information from vector legend dialog to dictionary"""
- vector = self.instruction.FindInstructionByType('vector')
- if vector:
- self.vectorId = vector.id
- else:
- self.vectorId = None
- # is vector legend
- if not self.isVLegend.GetValue():
- self.vLegendDict['vLegend'] = False
- else:
- self.vLegendDict['vLegend'] = True
- if self.vLegendDict['vLegend'] == True and self.vectorId is not None:
- # labels
- # reindex order
- idx = 1
- for item in range(self.vectorListCtrl.GetItemCount()):
- if self.vectorListCtrl.IsChecked(item):
- self.vectorListCtrl.SetItemData(item, idx)
- idx += 1
- else:
- self.vectorListCtrl.SetItemData(item, 0)
- if idx == 1:
- self.vLegendDict['vLegend'] = False
- else:
- vList = self.instruction[self.vectorId]['list']
- for i, vector in enumerate(vList):
- item = self.vectorListCtrl.FindItem(
- start=-1, str=vector[0].split('@')[0])
- vList[i][3] = self.vectorListCtrl.GetItemData(item)
- vList[i][4] = self.vectorListCtrl.GetItem(
- item, 1).GetText()
- vmaps = self.instruction.FindInstructionByType(
- 'vProperties', list=True)
- for vmap, vector in zip(vmaps, vList):
- self.instruction[vmap.id]['lpos'] = vector[3]
- self.instruction[vmap.id]['label'] = vector[4]
- # units
- currUnit = self.unitConv.findUnit(
- self.panelVector.units['unitsCtrl'].GetStringSelection())
- self.vLegendDict['unit'] = currUnit
- # position
- x = self.unitConv.convert(
- value=float(
- self.panelVector.position['xCtrl'].GetValue()),
- fromUnit=currUnit,
- toUnit='inch')
- y = self.unitConv.convert(
- value=float(
- self.panelVector.position['yCtrl'].GetValue()),
- fromUnit=currUnit,
- toUnit='inch')
- self.vLegendDict['where'] = (x, y)
- # font
- self.vLegendDict['font'] = self.panelVector.font[
- 'fontCtrl'].GetStringSelection()
- self.vLegendDict['fontsize'] = self.panelVector.font[
- 'fontSizeCtrl'].GetValue()
- dc = wx.ClientDC(self)
- dc.SetFont(
- wx.Font(
- pointSize=self.vLegendDict['fontsize'],
- family=wx.FONTFAMILY_DEFAULT,
- style=wx.FONTSTYLE_NORMAL,
- weight=wx.FONTWEIGHT_NORMAL))
- # size
- width = self.unitConv.convert(
- value=float(self.panelVector.widthCtrl.GetValue()),
- fromUnit=currUnit, toUnit='inch')
- self.vLegendDict['width'] = width
- self.vLegendDict['cols'] = self.panelVector.colsCtrl.GetValue()
- if self.panelVector.spanRadio.GetValue() and self.panelVector.spanTextCtrl.GetValue():
- self.vLegendDict[
- 'span'] = self.panelVector.spanTextCtrl.GetValue()
- else:
- self.vLegendDict['span'] = None
- # size estimation
- vectors = self.instruction[self.vectorId]['list']
- labels = [vector[4] for vector in vectors if vector[3] != 0]
- extent = dc.GetTextExtent(max(labels, key=len))
- wExtent = self.unitConv.convert(
- value=extent[0], fromUnit='pixel', toUnit='inch')
- hExtent = self.unitConv.convert(
- value=extent[1], fromUnit='pixel', toUnit='inch')
- w = (width + wExtent) * self.vLegendDict['cols']
- h = len(labels) * hExtent / self.vLegendDict['cols']
- h *= 1.1
- self.vLegendDict['rect'] = Rect2D(x, y, w, h)
- # border
- if self.borderCheck.GetValue():
- color = self.borderColorCtrl.GetColour()
- self.vLegendDict['border'] = convertRGB(color)
- else:
- self.vLegendDict['border'] = 'none'
- if not self.id[1] in self.instruction:
- vectorLegend = VectorLegend(self.id[1])
- self.instruction.AddInstruction(vectorLegend)
- self.instruction[self.id[1]].SetInstruction(self.vLegendDict)
- if self.id[1] not in self.parent.objectId:
- self.parent.objectId.append(self.id[1])
- return True
- def update(self):
- okR = self.updateRasterLegend()
- okV = self.updateVectorLegend()
- if okR and okV:
- return True
- return False
- def updateDialog(self):
- """Update legend coordinates after moving"""
- # raster legend
- if 'rect' in self.rLegendDict:
- x, y = self.rLegendDict['rect'][:2]
- currUnit = self.unitConv.findUnit(
- self.panelRaster.units['unitsCtrl'].GetStringSelection())
- x = self.unitConv.convert(
- value=x, fromUnit='inch', toUnit=currUnit)
- y = self.unitConv.convert(
- value=y, fromUnit='inch', toUnit=currUnit)
- self.panelRaster.position['xCtrl'].SetValue("%5.3f" % x)
- self.panelRaster.position['yCtrl'].SetValue("%5.3f" % y)
- # update name and type of raster
- raster = self.instruction.FindInstructionByType('raster')
- if raster:
- self.rasterId = raster.id
- else:
- self.rasterId = None
- if raster:
- currRaster = raster['raster']
- else:
- currRaster = None
- rasterType = getRasterType(map=currRaster)
- self.rasterCurrent.SetLabel(
- _("%(rast)s: type %(type)s") %
- {'rast': currRaster, 'type': str(rasterType)})
- # vector legend
- if 'rect' in self.vLegendDict:
- x, y = self.vLegendDict['rect'][:2]
- currUnit = self.unitConv.findUnit(
- self.panelVector.units['unitsCtrl'].GetStringSelection())
- x = self.unitConv.convert(
- value=x, fromUnit='inch', toUnit=currUnit)
- y = self.unitConv.convert(
- value=y, fromUnit='inch', toUnit=currUnit)
- self.panelVector.position['xCtrl'].SetValue("%5.3f" % x)
- self.panelVector.position['yCtrl'].SetValue("%5.3f" % y)
- # update vector maps
- if self.instruction.FindInstructionByType('vector'):
- vectors = sorted(
- self.instruction.FindInstructionByType('vector')['list'],
- key=lambda x: x[3])
- self.vectorListCtrl.DeleteAllItems()
- for vector in vectors:
- index = self.vectorListCtrl.InsertStringItem(
- sys.maxsize, vector[0].split('@')[0])
- self.vectorListCtrl.SetStringItem(index, 1, vector[4])
- self.vectorListCtrl.SetItemData(index, index)
- self.vectorListCtrl.CheckItem(index, True)
- if vector[3] == 0:
- self.vectorListCtrl.CheckItem(index, False)
- self.panelVector.colsCtrl.SetRange(
- 1, min(10, len(self.instruction.FindInstructionByType('vector')['list'])))
- self.panelVector.colsCtrl.SetValue(1)
- else:
- self.vectorListCtrl.DeleteAllItems()
- self.panelVector.colsCtrl.SetRange(0, 0)
- self.panelVector.colsCtrl.SetValue(0)
- class MapinfoDialog(PsmapDialog):
- def __init__(self, parent, id, settings):
- PsmapDialog.__init__(
- self,
- parent=parent,
- id=id,
- title=_("Mapinfo settings"),
- settings=settings)
- self.objectType = ('mapinfo',)
- if self.id is not None:
- self.mapinfo = self.instruction[self.id]
- self.mapinfoDict = self.mapinfo.GetInstruction()
- else:
- self.id = wx.NewId()
- self.mapinfo = Mapinfo(self.id)
- self.mapinfoDict = self.mapinfo.GetInstruction()
- page = self.instruction.FindInstructionByType(
- 'page').GetInstruction()
- self.mapinfoDict['where'] = page['Left'], page['Top']
- self.panel = self._mapinfoPanel()
- self._layout(self.panel)
- self.OnIsBackground(None)
- self.OnIsBorder(None)
- def _mapinfoPanel(self):
- panel = wx.Panel(
- parent=self, id=wx.ID_ANY, size=(-1, -1),
- style=wx.TAB_TRAVERSAL)
- #panel.SetupScrolling(scroll_x = False, scroll_y = True)
- border = wx.BoxSizer(wx.VERTICAL)
- # position
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Position"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- self.AddPosition(parent=panel, dialogDict=self.mapinfoDict)
- self.AddUnits(parent=panel, dialogDict=self.mapinfoDict)
- gridBagSizer.Add(panel.units['unitsLabel'], pos=(
- 0, 0), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(panel.units['unitsCtrl'], pos=(
- 0, 1), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(panel.position['xLabel'], pos=(
- 1, 0), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(panel.position['xCtrl'], pos=(
- 1, 1), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(panel.position['yLabel'], pos=(
- 2, 0), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(panel.position['yCtrl'], pos=(
- 2, 1), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- panel.position['comment'], pos=(
- 3, 0), span=(
- 1, 2), flag=wx.ALIGN_BOTTOM, border=0)
- gridBagSizer.AddGrowableCol(1)
- sizer.Add(
- gridBagSizer,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- # font
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Font settings"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- # creates font color too, used below
- self.AddFont(parent=panel, dialogDict=self.mapinfoDict)
- gridBagSizer.Add(panel.font['fontLabel'], pos=(
- 0, 0), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- panel.font['fontCtrl'],
- pos=(0, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(panel.font['fontSizeLabel'], pos=(
- 1, 0), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(panel.font['fontSizeCtrl'], pos=(
- 1, 1), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(panel.font['colorLabel'], pos=(
- 2, 0), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(panel.font['colorCtrl'], pos=(
- 2, 1), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.AddGrowableCol(1)
- sizer.Add(
- item=gridBagSizer,
- proportion=1,
- flag=wx.ALL | wx.EXPAND,
- border=1)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- # colors
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Color settings"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- flexSizer = wx.FlexGridSizer(cols=2, hgap=5, vgap=5)
- self.colors = {}
- self.colors['borderCtrl'] = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_("use border color:"))
- self.colors['backgroundCtrl'] = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_("use background color:"))
- self.colors['borderColor'] = wx.ColourPickerCtrl(panel, id=wx.ID_ANY)
- self.colors['backgroundColor'] = wx.ColourPickerCtrl(
- panel, id=wx.ID_ANY)
- if self.mapinfoDict['border'] is None:
- self.mapinfoDict['border'] = 'none'
- if self.mapinfoDict['border'] != 'none':
- self.colors['borderCtrl'].SetValue(True)
- self.colors['borderColor'].SetColour(
- convertRGB(self.mapinfoDict['border']))
- else:
- self.colors['borderCtrl'].SetValue(False)
- self.colors['borderColor'].SetColour(convertRGB('black'))
- if self.mapinfoDict['background'] is None:
- self.mapinfoDict['background'] == 'none'
- if self.mapinfoDict['background'] != 'none':
- self.colors['backgroundCtrl'].SetValue(True)
- self.colors['backgroundColor'].SetColour(
- convertRGB(self.mapinfoDict['background']))
- else:
- self.colors['backgroundCtrl'].SetValue(False)
- self.colors['backgroundColor'].SetColour(convertRGB('white'))
- flexSizer.Add(
- self.colors['borderCtrl'],
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- flexSizer.Add(
- self.colors['borderColor'],
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- flexSizer.Add(
- self.colors['backgroundCtrl'],
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- flexSizer.Add(
- self.colors['backgroundColor'],
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- flexSizer.AddGrowableCol(1)
- sizer.Add(
- item=flexSizer,
- proportion=1,
- flag=wx.ALL | wx.EXPAND,
- border=1)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- panel.SetSizer(border)
- self.Bind(wx.EVT_CHECKBOX, self.OnIsBorder, self.colors['borderCtrl'])
- self.Bind(
- wx.EVT_CHECKBOX,
- self.OnIsBackground,
- self.colors['backgroundCtrl'])
- return panel
- def OnIsBackground(self, event):
- if self.colors['backgroundCtrl'].GetValue():
- self.colors['backgroundColor'].Enable()
- self.update()
- else:
- self.colors['backgroundColor'].Disable()
- def OnIsBorder(self, event):
- if self.colors['borderCtrl'].GetValue():
- self.colors['borderColor'].Enable()
- self.update()
- else:
- self.colors['borderColor'].Disable()
- def update(self):
- # units
- currUnit = self.unitConv.findUnit(
- self.panel.units['unitsCtrl'].GetStringSelection())
- self.mapinfoDict['unit'] = currUnit
- # position
- if self.panel.position['xCtrl'].GetValue():
- x = self.panel.position['xCtrl'].GetValue()
- else:
- x = self.mapinfoDict['where'][0]
- if self.panel.position['yCtrl'].GetValue():
- y = self.panel.position['yCtrl'].GetValue()
- else:
- y = self.mapinfoDict['where'][1]
- x = self.unitConv.convert(
- value=float(
- self.panel.position['xCtrl'].GetValue()),
- fromUnit=currUnit,
- toUnit='inch')
- y = self.unitConv.convert(
- value=float(
- self.panel.position['yCtrl'].GetValue()),
- fromUnit=currUnit,
- toUnit='inch')
- self.mapinfoDict['where'] = (x, y)
- # font
- self.mapinfoDict['font'] = self.panel.font[
- 'fontCtrl'].GetStringSelection()
- self.mapinfoDict['fontsize'] = self.panel.font[
- 'fontSizeCtrl'].GetValue()
- # colors
- color = self.panel.font['colorCtrl'].GetColour()
- self.mapinfoDict['color'] = convertRGB(color)
- if self.colors['backgroundCtrl'].GetValue():
- background = self.colors['backgroundColor'].GetColour()
- self.mapinfoDict['background'] = convertRGB(background)
- else:
- self.mapinfoDict['background'] = 'none'
- if self.colors['borderCtrl'].GetValue():
- border = self.colors['borderColor'].GetColour()
- self.mapinfoDict['border'] = convertRGB(border)
- else:
- self.mapinfoDict['border'] = 'none'
- # estimation of size
- self.mapinfoDict['rect'] = self.mapinfo.EstimateRect(self.mapinfoDict)
- if self.id not in self.instruction:
- mapinfo = Mapinfo(self.id)
- self.instruction.AddInstruction(mapinfo)
- self.instruction[self.id].SetInstruction(self.mapinfoDict)
- if self.id not in self.parent.objectId:
- self.parent.objectId.append(self.id)
- self.updateDialog()
- return True
- def updateDialog(self):
- """Update mapinfo coordinates, after moving"""
- x, y = self.mapinfoDict['where']
- currUnit = self.unitConv.findUnit(
- self.panel.units['unitsCtrl'].GetStringSelection())
- x = self.unitConv.convert(value=x, fromUnit='inch', toUnit=currUnit)
- y = self.unitConv.convert(value=y, fromUnit='inch', toUnit=currUnit)
- self.panel.position['xCtrl'].SetValue("%5.3f" % x)
- self.panel.position['yCtrl'].SetValue("%5.3f" % y)
- class ScalebarDialog(PsmapDialog):
- """Dialog for scale bar"""
- def __init__(self, parent, id, settings):
- PsmapDialog.__init__(
- self,
- parent=parent,
- id=id,
- title="Scale bar settings",
- settings=settings)
- self.objectType = ('scalebar',)
- if self.id is not None:
- self.scalebar = self.instruction[id]
- self.scalebarDict = self.scalebar.GetInstruction()
- else:
- self.id = wx.NewId()
- self.scalebar = Scalebar(self.id)
- self.scalebarDict = self.scalebar.GetInstruction()
- page = self.instruction.FindInstructionByType(
- 'page').GetInstruction()
- self.scalebarDict['where'] = page['Left'], page['Top']
- self.panel = self._scalebarPanel()
- self._layout(self.panel)
- self.mapUnit = projInfo()['units'].lower()
- if projInfo()['proj'] == 'xy':
- self.mapUnit = 'meters'
- if self.mapUnit not in self.unitConv.getAllUnits():
- self.mapUnit = 'meters'
- def _scalebarPanel(self):
- panel = wx.Panel(parent=self, id=wx.ID_ANY, style=wx.TAB_TRAVERSAL)
- border = wx.BoxSizer(wx.VERTICAL)
- #
- # position
- #
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Position"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- self.AddUnits(parent=panel, dialogDict=self.scalebarDict)
- self.AddPosition(parent=panel, dialogDict=self.scalebarDict)
- if self.scalebarDict[
- 'rect']: # set position, ref point is center and not left top corner
- x = self.unitConv.convert(
- value=self.scalebarDict['where'][0] -
- self.scalebarDict['rect'].Get()[2] /
- 2,
- fromUnit='inch',
- toUnit=self.scalebarDict['unit'])
- y = self.unitConv.convert(
- value=self.scalebarDict['where'][1] -
- self.scalebarDict['rect'].Get()[3] /
- 2,
- fromUnit='inch',
- toUnit=self.scalebarDict['unit'])
- panel.position['xCtrl'].SetValue("%5.3f" % x)
- panel.position['yCtrl'].SetValue("%5.3f" % y)
- gridBagSizer.Add(panel.units['unitsLabel'], pos=(
- 0, 0), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(panel.units['unitsCtrl'], pos=(
- 0, 1), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(panel.position['xLabel'], pos=(
- 1, 0), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(panel.position['xCtrl'], pos=(
- 1, 1), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(panel.position['yLabel'], pos=(
- 2, 0), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(panel.position['yCtrl'], pos=(
- 2, 1), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- panel.position['comment'], pos=(
- 3, 0), span=(
- 1, 2), flag=wx.ALIGN_BOTTOM, border=0)
- gridBagSizer.AddGrowableCol(1)
- sizer.Add(
- gridBagSizer,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- #
- # size
- #
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Size"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- lengthText = wx.StaticText(panel, id=wx.ID_ANY, label=_("Length:"))
- heightText = wx.StaticText(panel, id=wx.ID_ANY, label=_("Height:"))
- self.lengthTextCtrl = wx.TextCtrl(
- panel, id=wx.ID_ANY, validator=TCValidator('DIGIT_ONLY'))
- self.lengthTextCtrl.SetToolTipString(
- _("Scalebar length is given in map units"))
- self.heightTextCtrl = wx.TextCtrl(
- panel, id=wx.ID_ANY, validator=TCValidator('DIGIT_ONLY'))
- self.heightTextCtrl.SetToolTipString(
- _("Scalebar height is real height on paper"))
- choices = [_('default')] + self.unitConv.getMapUnitsNames()
- self.unitsLength = wx.Choice(panel, id=wx.ID_ANY, choices=choices)
- choices = self.unitConv.getPageUnitsNames()
- self.unitsHeight = wx.Choice(panel, id=wx.ID_ANY, choices=choices)
- # set values
- unitName = self.unitConv.findName(self.scalebarDict['unitsLength'])
- if unitName:
- self.unitsLength.SetStringSelection(unitName)
- else:
- if self.scalebarDict['unitsLength'] == 'auto':
- self.unitsLength.SetSelection(0)
- elif self.scalebarDict['unitsLength'] == 'nautmiles':
- self.unitsLength.SetStringSelection(
- self.unitConv.findName("nautical miles"))
- self.unitsHeight.SetStringSelection(
- self.unitConv.findName(
- self.scalebarDict['unitsHeight']))
- if self.scalebarDict['length']:
- self.lengthTextCtrl.SetValue(str(self.scalebarDict['length']))
- else: # estimate default
- reg = grass.region()
- w = int((reg['e'] - reg['w']) / 3)
- w = round(w, -len(str(w)) + 2) # 12345 -> 12000
- self.lengthTextCtrl.SetValue(str(w))
- h = self.unitConv.convert(
- value=self.scalebarDict['height'],
- fromUnit='inch',
- toUnit=self.scalebarDict['unitsHeight'])
- self.heightTextCtrl.SetValue(str(h))
- gridBagSizer.Add(
- lengthText, pos=(0, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.lengthTextCtrl, pos=(0, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.unitsLength,
- pos=(
- 0,
- 2),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
- border=0)
- gridBagSizer.Add(
- heightText, pos=(1, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.heightTextCtrl, pos=(1, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.unitsHeight,
- pos=(
- 1,
- 2),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
- border=0)
- gridBagSizer.AddGrowableCol(1)
- sizer.Add(
- gridBagSizer,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- #
- # style
- #
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Style"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- sbTypeText = wx.StaticText(panel, id=wx.ID_ANY, label=_("Type:"))
- self.sbCombo = wx.combo.BitmapComboBox(panel, style=wx.CB_READONLY)
- # only temporary, images must be moved away
- imagePath = os.path.join(
- globalvar.IMGDIR, "scalebar-fancy.png"), os.path.join(
- globalvar.IMGDIR, "scalebar-simple.png")
- for item, path in zip(['fancy', 'simple'], imagePath):
- if not os.path.exists(path):
- bitmap = wx.EmptyBitmap(0, 0)
- else:
- bitmap = wx.Bitmap(path)
- self.sbCombo.Append(item='', bitmap=bitmap, clientData=item[0])
- #self.sbCombo.Append(item = 'simple', bitmap = wx.Bitmap("./images/scalebar-simple.png"), clientData = 's')
- if self.scalebarDict['scalebar'] == 'f':
- self.sbCombo.SetSelection(0)
- elif self.scalebarDict['scalebar'] == 's':
- self.sbCombo.SetSelection(1)
- sbSegmentsText = wx.StaticText(
- panel, id=wx.ID_ANY, label=_("Number of segments:"))
- self.sbSegmentsCtrl = wx.SpinCtrl(
- panel, id=wx.ID_ANY, min=1, max=30, initial=4)
- self.sbSegmentsCtrl.SetValue(self.scalebarDict['segment'])
- sbLabelsText1 = wx.StaticText(
- panel, id=wx.ID_ANY, label=_("Label every "))
- sbLabelsText2 = wx.StaticText(panel, id=wx.ID_ANY, label=_("segments"))
- self.sbLabelsCtrl = wx.SpinCtrl(
- panel, id=wx.ID_ANY, min=1, max=30, initial=1)
- self.sbLabelsCtrl.SetValue(self.scalebarDict['numbers'])
- # font
- fontsizeText = wx.StaticText(
- panel, id=wx.ID_ANY, label=_("Font size:"))
- self.fontsizeCtrl = wx.SpinCtrl(
- panel, id=wx.ID_ANY, min=4, max=30, initial=10)
- self.fontsizeCtrl.SetValue(self.scalebarDict['fontsize'])
- self.backgroundCheck = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_("transparent text background"))
- if self.scalebarDict['background'] == 'y':
- self.backgroundCheck.SetValue(False)
- else:
- self.backgroundCheck.SetValue(True)
- gridBagSizer.Add(
- sbTypeText, pos=(0, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.sbCombo, pos=(
- 0, 1), span=(
- 1, 2), flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, border=0)
- gridBagSizer.Add(
- sbSegmentsText, pos=(1, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.sbSegmentsCtrl, pos=(1, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- sbLabelsText1, pos=(2, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.sbLabelsCtrl, pos=(2, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- sbLabelsText2, pos=(2, 2),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- fontsizeText, pos=(3, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.fontsizeCtrl, pos=(3, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.backgroundCheck, pos=(
- 4, 0), span=(
- 1, 3), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- sizer.Add(
- gridBagSizer,
- proportion=1,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- panel.SetSizer(border)
- return panel
- def update(self):
- """Save information from dialog"""
- # units
- currUnit = self.unitConv.findUnit(
- self.panel.units['unitsCtrl'].GetStringSelection())
- self.scalebarDict['unit'] = currUnit
- # position
- if self.panel.position['xCtrl'].GetValue():
- x = self.panel.position['xCtrl'].GetValue()
- else:
- x = self.scalebarDict['where'][0]
- if self.panel.position['yCtrl'].GetValue():
- y = self.panel.position['yCtrl'].GetValue()
- else:
- y = self.scalebarDict['where'][1]
- x = self.unitConv.convert(
- value=float(
- self.panel.position['xCtrl'].GetValue()),
- fromUnit=currUnit,
- toUnit='inch')
- y = self.unitConv.convert(
- value=float(
- self.panel.position['yCtrl'].GetValue()),
- fromUnit=currUnit,
- toUnit='inch')
- # style
- self.scalebarDict['scalebar'] = self.sbCombo.GetClientData(
- self.sbCombo.GetSelection())
- self.scalebarDict['segment'] = self.sbSegmentsCtrl.GetValue()
- self.scalebarDict['numbers'] = self.sbLabelsCtrl.GetValue()
- self.scalebarDict['fontsize'] = self.fontsizeCtrl.GetValue()
- if self.backgroundCheck.GetValue():
- self.scalebarDict['background'] = 'n'
- else:
- self.scalebarDict['background'] = 'y'
- # size
- # height
- self.scalebarDict['unitsHeight'] = self.unitConv.findUnit(
- self.unitsHeight.GetStringSelection())
- try:
- height = float(self.heightTextCtrl.GetValue())
- height = self.unitConv.convert(
- value=height,
- fromUnit=self.scalebarDict['unitsHeight'],
- toUnit='inch')
- except (ValueError, SyntaxError):
- height = 0.1 # default in inch
- self.scalebarDict['height'] = height
- # length
- if self.unitsLength.GetSelection() == 0:
- selected = 'auto'
- else:
- selected = self.unitConv.findUnit(
- self.unitsLength.GetStringSelection())
- if selected == 'nautical miles':
- selected = 'nautmiles'
- self.scalebarDict['unitsLength'] = selected
- try:
- length = float(self.lengthTextCtrl.GetValue())
- except (ValueError, SyntaxError):
- wx.MessageBox(
- message=_("Length of scale bar is not defined"),
- caption=_('Invalid input'),
- style=wx.OK | wx.ICON_ERROR)
- return False
- self.scalebarDict['length'] = length
- # estimation of size
- map = self.instruction.FindInstructionByType('map')
- if not map:
- map = self.instruction.FindInstructionByType('initMap')
- mapId = map.id
- rectSize = self.scalebar.EstimateSize(
- scalebarDict=self.scalebarDict,
- scale=self.instruction[mapId]['scale'])
- self.scalebarDict['rect'] = Rect2D(
- x=x, y=y, width=rectSize[0], height=rectSize[1])
- self.scalebarDict['where'] = self.scalebarDict['rect'].GetCentre()
- if self.id not in self.instruction:
- scalebar = Scalebar(self.id)
- self.instruction.AddInstruction(scalebar)
- self.instruction[self.id].SetInstruction(self.scalebarDict)
- if self.id not in self.parent.objectId:
- self.parent.objectId.append(self.id)
- return True
- def updateDialog(self):
- """Update scalebar coordinates, after moving"""
- x, y = self.scalebarDict['rect'][:2]
- currUnit = self.unitConv.findUnit(
- self.panel.units['unitsCtrl'].GetStringSelection())
- x = self.unitConv.convert(value=x, fromUnit='inch', toUnit=currUnit)
- y = self.unitConv.convert(value=y, fromUnit='inch', toUnit=currUnit)
- self.panel.position['xCtrl'].SetValue("%5.3f" % x)
- self.panel.position['yCtrl'].SetValue("%5.3f" % y)
- class TextDialog(PsmapDialog):
- def __init__(self, parent, id, settings):
- PsmapDialog.__init__(
- self,
- parent=parent,
- id=id,
- title="Text settings",
- settings=settings)
- self.objectType = ('text',)
- if self.id is not None:
- self.textDict = self.instruction[id].GetInstruction()
- else:
- self.id = wx.NewId()
- text = Text(self.id)
- self.textDict = text.GetInstruction()
- page = self.instruction.FindInstructionByType(
- 'page').GetInstruction()
- self.textDict['where'] = page['Left'], page['Top']
- map = self.instruction.FindInstructionByType('map')
- if not map:
- map = self.instruction.FindInstructionByType('initMap')
- self.mapId = map.id
- self.textDict['east'], self.textDict['north'] = PaperMapCoordinates(
- mapInstr=map, x=self.textDict['where'][0],
- y=self.textDict['where'][1],
- paperToMap=True)
- notebook = wx.Notebook(parent=self, id=wx.ID_ANY, style=wx.BK_DEFAULT)
- self.textPanel = self._textPanel(notebook)
- self.positionPanel = self._positionPanel(notebook)
- self.OnBackground(None)
- self.OnHighlight(None)
- self.OnBorder(None)
- self.OnPositionType(None)
- self.OnRotation(None)
- self._layout(notebook)
- def _textPanel(self, notebook):
- panel = wx.Panel(parent=notebook, id=wx.ID_ANY, style=wx.TAB_TRAVERSAL)
- notebook.AddPage(page=panel, text=_("Text"))
- border = wx.BoxSizer(wx.VERTICAL)
- # text entry
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Text"))
- sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
- textLabel = wx.StaticText(panel, id=wx.ID_ANY, label=_("Enter text:"))
- self.textCtrl = ExpandoTextCtrl(
- panel, id=wx.ID_ANY, value=self.textDict['text'])
- sizer.Add(
- textLabel,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- border=5)
- sizer.Add(
- self.textCtrl,
- proportion=1,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- # font
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Font settings"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- flexGridSizer = wx.FlexGridSizer(rows=3, cols=2, hgap=5, vgap=5)
- self.AddFont(parent=panel, dialogDict=self.textDict)
- flexGridSizer.Add(
- panel.font['fontLabel'],
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- flexGridSizer.Add(
- panel.font['fontCtrl'],
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- flexGridSizer.Add(
- panel.font['fontSizeLabel'],
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- flexGridSizer.Add(
- panel.font['fontSizeCtrl'],
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- flexGridSizer.Add(
- panel.font['colorLabel'],
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- flexGridSizer.Add(
- panel.font['colorCtrl'],
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- flexGridSizer.AddGrowableCol(1)
- sizer.Add(
- item=flexGridSizer,
- proportion=1,
- flag=wx.ALL | wx.EXPAND,
- border=1)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- # text effects
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Text effects"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- self.effect = {}
- self.effect['backgroundCtrl'] = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_("text background"))
- self.effect['backgroundColor'] = wx.ColourPickerCtrl(
- panel, id=wx.ID_ANY)
- self.effect['highlightCtrl'] = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_("highlight"))
- self.effect['highlightColor'] = wx.ColourPickerCtrl(
- panel, id=wx.ID_ANY)
- self.effect['highlightWidth'] = wx.SpinCtrl(
- panel, id=wx.ID_ANY, size=self.spinCtrlSize, min=0, max=5, initial=1)
- self.effect['highlightWidthLabel'] = wx.StaticText(
- panel, id=wx.ID_ANY, label=_("Width (pts):"))
- self.effect['borderCtrl'] = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_("text border"))
- self.effect['borderColor'] = wx.ColourPickerCtrl(panel, id=wx.ID_ANY)
- self.effect['borderWidth'] = wx.SpinCtrl(
- panel, id=wx.ID_ANY, size=self.spinCtrlSize, min=1, max=25, initial=1)
- self.effect['borderWidthLabel'] = wx.StaticText(
- panel, id=wx.ID_ANY, label=_("Width (pts):"))
- # set values
- if self.textDict['background'] is None:
- self.textDict['background'] = 'none'
- if self.textDict['background'] != 'none':
- self.effect['backgroundCtrl'].SetValue(True)
- self.effect['backgroundColor'].SetColour(
- convertRGB(self.textDict['background']))
- else:
- self.effect['backgroundCtrl'].SetValue(False)
- self.effect['backgroundColor'].SetColour(convertRGB('white'))
- if self.textDict['hcolor'] is None:
- self.textDict['hcolor'] = 'none'
- if self.textDict['hcolor'] != 'none':
- self.effect['highlightCtrl'].SetValue(True)
- self.effect['highlightColor'].SetColour(
- convertRGB(self.textDict['hcolor']))
- else:
- self.effect['highlightCtrl'].SetValue(False)
- self.effect['highlightColor'].SetColour(convertRGB('grey'))
- self.effect['highlightWidth'].SetValue(float(self.textDict['hwidth']))
- if self.textDict['border'] is None:
- self.textDict['border'] = 'none'
- if self.textDict['border'] != 'none':
- self.effect['borderCtrl'].SetValue(True)
- self.effect['borderColor'].SetColour(
- convertRGB(self.textDict['border']))
- else:
- self.effect['borderCtrl'].SetValue(False)
- self.effect['borderColor'].SetColour(convertRGB('black'))
- self.effect['borderWidth'].SetValue(float(self.textDict['width']))
- gridBagSizer.Add(self.effect['backgroundCtrl'], pos=(
- 0, 0), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(self.effect['backgroundColor'], pos=(
- 0, 1), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(self.effect['highlightCtrl'], pos=(
- 1, 0), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(self.effect['highlightColor'], pos=(
- 1, 1), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(
- self.effect['highlightWidthLabel'], pos=(
- 1, 2), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(self.effect['highlightWidth'], pos=(
- 1, 3), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(self.effect['borderCtrl'], pos=(
- 2, 0), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(self.effect['borderColor'], pos=(
- 2, 1), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(self.effect['borderWidthLabel'], pos=(
- 2, 2), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizer.Add(self.effect['borderWidth'], pos=(
- 2, 3), flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- sizer.Add(
- item=gridBagSizer,
- proportion=1,
- flag=wx.ALL | wx.EXPAND,
- border=1)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- self.Bind(EVT_ETC_LAYOUT_NEEDED, self.OnRefit, self.textCtrl)
- self.Bind(
- wx.EVT_CHECKBOX,
- self.OnBackground,
- self.effect['backgroundCtrl'])
- self.Bind(
- wx.EVT_CHECKBOX,
- self.OnHighlight,
- self.effect['highlightCtrl'])
- self.Bind(wx.EVT_CHECKBOX, self.OnBorder, self.effect['borderCtrl'])
- panel.SetSizer(border)
- panel.Fit()
- return panel
- def _positionPanel(self, notebook):
- panel = wx.Panel(parent=notebook, id=wx.ID_ANY, style=wx.TAB_TRAVERSAL)
- notebook.AddPage(page=panel, text=_("Position"))
- border = wx.BoxSizer(wx.VERTICAL)
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Position"))
- sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- # Position
- self.AddExtendedPosition(panel, gridBagSizer, self.textDict)
- # offset
- box3 = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Offset"))
- sizerO = wx.StaticBoxSizer(box3, wx.VERTICAL)
- gridBagSizerO = wx.GridBagSizer(hgap=5, vgap=5)
- self.xoffLabel = wx.StaticText(
- panel, id=wx.ID_ANY, label=_("horizontal (pts):"))
- self.yoffLabel = wx.StaticText(
- panel, id=wx.ID_ANY, label=_("vertical (pts):"))
- self.xoffCtrl = wx.SpinCtrl(
- panel, id=wx.ID_ANY, size=(50, -1),
- min=-50, max=50, initial=0)
- self.yoffCtrl = wx.SpinCtrl(
- panel, id=wx.ID_ANY, size=(50, -1),
- min=-50, max=50, initial=0)
- self.xoffCtrl.SetValue(self.textDict['xoffset'])
- self.yoffCtrl.SetValue(self.textDict['yoffset'])
- gridBagSizerO.Add(
- self.xoffLabel, pos=(0, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizerO.Add(
- self.yoffLabel, pos=(1, 0),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizerO.Add(
- self.xoffCtrl, pos=(0, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- gridBagSizerO.Add(
- self.yoffCtrl, pos=(1, 1),
- flag=wx.ALIGN_CENTER_VERTICAL, border=0)
- sizerO.Add(
- gridBagSizerO,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- gridBagSizer.Add(
- sizerO,
- pos=(
- 3,
- 0),
- flag=wx.ALIGN_CENTER_HORIZONTAL | wx.EXPAND,
- border=0)
- # reference point
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _(" Reference point"))
- sizerR = wx.StaticBoxSizer(box, wx.VERTICAL)
- flexSizer = wx.FlexGridSizer(rows=3, cols=3, hgap=5, vgap=5)
- ref = []
- for row in ["upper", "center", "lower"]:
- for col in ["left", "center", "right"]:
- ref.append(row + " " + col)
- self.radio = [
- wx.RadioButton(
- panel,
- id=wx.ID_ANY,
- label='',
- style=wx.RB_GROUP,
- name=ref[0])]
- self.radio[0].SetValue(False)
- flexSizer.Add(
- self.radio[0],
- proportion=0,
- flag=wx.ALIGN_CENTER,
- border=0)
- for i in range(1, 9):
- self.radio.append(
- wx.RadioButton(
- panel,
- id=wx.ID_ANY,
- label='',
- name=ref[i]))
- self.radio[-1].SetValue(False)
- flexSizer.Add(self.radio[-1], proportion=0,
- flag=wx.ALIGN_CENTER, border=0)
- self.FindWindowByName(self.textDict['ref']).SetValue(True)
- flexSizer.AddGrowableCol(0)
- flexSizer.AddGrowableCol(1)
- flexSizer.AddGrowableCol(2)
- sizerR.Add(flexSizer, proportion=1, flag=wx.EXPAND, border=0)
- gridBagSizer.Add(
- sizerR, pos=(3, 1),
- flag=wx.ALIGN_LEFT | wx.EXPAND, border=0)
- gridBagSizer.AddGrowableCol(0)
- gridBagSizer.AddGrowableCol(1)
- sizer.Add(
- gridBagSizer,
- proportion=1,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- # rotation
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Text rotation"))
- sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
- self.rotCtrl = wx.CheckBox(
- panel,
- id=wx.ID_ANY,
- label=_("rotate text (counterclockwise)"))
- self.rotValue = wx.SpinCtrl(
- panel, wx.ID_ANY, size=(50, -1),
- min=0, max=360, initial=0)
- if self.textDict['rotate']:
- self.rotValue.SetValue(int(self.textDict['rotate']))
- self.rotCtrl.SetValue(True)
- else:
- self.rotValue.SetValue(0)
- self.rotCtrl.SetValue(False)
- sizer.Add(
- self.rotCtrl,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT | wx.ALL,
- border=5)
- sizer.Add(
- self.rotValue,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- panel.SetSizer(border)
- panel.Fit()
- self.Bind(
- wx.EVT_RADIOBUTTON,
- self.OnPositionType,
- panel.position['toPaper'])
- self.Bind(
- wx.EVT_RADIOBUTTON,
- self.OnPositionType,
- panel.position['toMap'])
- self.Bind(wx.EVT_CHECKBOX, self.OnRotation, self.rotCtrl)
- return panel
- def OnRefit(self, event):
- self.Fit()
- def OnRotation(self, event):
- if self.rotCtrl.GetValue():
- self.rotValue.Enable()
- else:
- self.rotValue.Disable()
- def OnPositionType(self, event):
- if self.positionPanel.position['toPaper'].GetValue():
- for widget in self.gridBagSizerP.GetChildren():
- widget.GetWindow().Enable()
- for widget in self.gridBagSizerM.GetChildren():
- widget.GetWindow().Disable()
- else:
- for widget in self.gridBagSizerM.GetChildren():
- widget.GetWindow().Enable()
- for widget in self.gridBagSizerP.GetChildren():
- widget.GetWindow().Disable()
- def OnBackground(self, event):
- if self.effect['backgroundCtrl'].GetValue():
- self.effect['backgroundColor'].Enable()
- self.update()
- else:
- self.effect['backgroundColor'].Disable()
- def OnHighlight(self, event):
- if self.effect['highlightCtrl'].GetValue():
- self.effect['highlightColor'].Enable()
- self.effect['highlightWidth'].Enable()
- self.effect['highlightWidthLabel'].Enable()
- self.update()
- else:
- self.effect['highlightColor'].Disable()
- self.effect['highlightWidth'].Disable()
- self.effect['highlightWidthLabel'].Disable()
- def OnBorder(self, event):
- if self.effect['borderCtrl'].GetValue():
- self.effect['borderColor'].Enable()
- self.effect['borderWidth'].Enable()
- self.effect['borderWidthLabel'].Enable()
- self.update()
- else:
- self.effect['borderColor'].Disable()
- self.effect['borderWidth'].Disable()
- self.effect['borderWidthLabel'].Disable()
- def update(self):
- # text
- self.textDict['text'] = self.textCtrl.GetValue()
- if not self.textDict['text']:
- wx.MessageBox(_("No text entered!"), _("Error"))
- return False
- # font
- self.textDict['font'] = self.textPanel.font[
- 'fontCtrl'].GetStringSelection()
- self.textDict['fontsize'] = self.textPanel.font[
- 'fontSizeCtrl'].GetValue()
- color = self.textPanel.font['colorCtrl'].GetColour()
- self.textDict['color'] = convertRGB(color)
- # effects
- if self.effect['backgroundCtrl'].GetValue():
- background = self.effect['backgroundColor'].GetColour()
- self.textDict['background'] = convertRGB(background)
- else:
- self.textDict['background'] = 'none'
- if self.effect['borderCtrl'].GetValue():
- border = self.effect['borderColor'].GetColour()
- self.textDict['border'] = convertRGB(border)
- else:
- self.textDict['border'] = 'none'
- self.textDict['width'] = self.effect['borderWidth'].GetValue()
- if self.effect['highlightCtrl'].GetValue():
- highlight = self.effect['highlightColor'].GetColour()
- self.textDict['hcolor'] = convertRGB(highlight)
- else:
- self.textDict['hcolor'] = 'none'
- self.textDict['hwidth'] = self.effect['highlightWidth'].GetValue()
- # offset
- self.textDict['xoffset'] = self.xoffCtrl.GetValue()
- self.textDict['yoffset'] = self.yoffCtrl.GetValue()
- # position
- if self.positionPanel.position['toPaper'].GetValue():
- self.textDict['XY'] = True
- currUnit = self.unitConv.findUnit(
- self.positionPanel.units['unitsCtrl'].GetStringSelection())
- self.textDict['unit'] = currUnit
- if self.positionPanel.position['xCtrl'].GetValue():
- x = self.positionPanel.position['xCtrl'].GetValue()
- else:
- x = self.textDict['where'][0]
- if self.positionPanel.position['yCtrl'].GetValue():
- y = self.positionPanel.position['yCtrl'].GetValue()
- else:
- y = self.textDict['where'][1]
- x = self.unitConv.convert(
- value=float(x), fromUnit=currUnit, toUnit='inch')
- y = self.unitConv.convert(
- value=float(y), fromUnit=currUnit, toUnit='inch')
- self.textDict['where'] = x, y
- self.textDict['east'], self.textDict['north'] = PaperMapCoordinates(
- self.instruction[self.mapId], x, y, paperToMap=True)
- else:
- self.textDict['XY'] = False
- if self.positionPanel.position['eCtrl'].GetValue():
- self.textDict['east'] = self.positionPanel.position[
- 'eCtrl'].GetValue()
- else:
- self.textDict['east'] = self.textDict['east']
- if self.positionPanel.position['nCtrl'].GetValue():
- self.textDict['north'] = self.positionPanel.position[
- 'nCtrl'].GetValue()
- else:
- self.textDict['north'] = self.textDict['north']
- self.textDict['where'] = PaperMapCoordinates(
- mapInstr=self.instruction[
- self.mapId], x=float(
- self.textDict['east']), y=float(
- self.textDict['north']), paperToMap=False)
- # rotation
- if self.rotCtrl.GetValue():
- self.textDict['rotate'] = self.rotValue.GetValue()
- else:
- self.textDict['rotate'] = None
- # reference point
- for radio in self.radio:
- if radio.GetValue() == True:
- self.textDict['ref'] = radio.GetName()
- if self.id not in self.instruction:
- text = Text(self.id)
- self.instruction.AddInstruction(text)
- self.instruction[self.id].SetInstruction(self.textDict)
- if self.id not in self.parent.objectId:
- self.parent.objectId.append(self.id)
- # self.updateDialog()
- return True
- def updateDialog(self):
- """Update text coordinates, after moving"""
- # XY coordinates
- x, y = self.textDict['where'][:2]
- currUnit = self.unitConv.findUnit(
- self.positionPanel.units['unitsCtrl'].GetStringSelection())
- x = self.unitConv.convert(value=x, fromUnit='inch', toUnit=currUnit)
- y = self.unitConv.convert(value=y, fromUnit='inch', toUnit=currUnit)
- self.positionPanel.position['xCtrl'].SetValue("%5.3f" % x)
- self.positionPanel.position['yCtrl'].SetValue("%5.3f" % y)
- # EN coordinates
- e, n = self.textDict['east'], self.textDict['north']
- self.positionPanel.position['eCtrl'].SetValue(
- str(self.textDict['east']))
- self.positionPanel.position['nCtrl'].SetValue(
- str(self.textDict['north']))
- class ImageDialog(PsmapDialog):
- """Dialog for setting image properties.
- It's base dialog for North Arrow dialog.
- """
- def __init__(self, parent, id, settings, imagePanelName=_("Image")):
- PsmapDialog.__init__(
- self,
- parent=parent,
- id=id,
- title="Image settings",
- settings=settings)
- self.objectType = ('image',)
- if self.id is not None:
- self.imageObj = self.instruction[self.id]
- self.imageDict = self.instruction[id].GetInstruction()
- else:
- self.id = wx.NewId()
- self.imageObj = self._newObject()
- self.imageDict = self.imageObj.GetInstruction()
- page = self.instruction.FindInstructionByType(
- 'page').GetInstruction()
- self.imageDict['where'] = page['Left'], page['Top']
- map = self.instruction.FindInstructionByType('map')
- if not map:
- map = self.instruction.FindInstructionByType('initMap')
- self.mapId = map.id
- self.imageDict['east'], self.imageDict['north'] = PaperMapCoordinates(
- mapInstr=map, x=self.imageDict['where'][0],
- y=self.imageDict['where'][1],
- paperToMap=True)
- notebook = wx.Notebook(parent=self, id=wx.ID_ANY, style=wx.BK_DEFAULT)
- self.imagePanelName = imagePanelName
- self.imagePanel = self._imagePanel(notebook)
- self.positionPanel = self._positionPanel(notebook)
- self.OnPositionType(None)
- if self.imageDict['epsfile']:
- self.imagePanel.image['dir'].SetValue(
- os.path.dirname(self.imageDict['epsfile']))
- else:
- self.imagePanel.image['dir'].SetValue(self._getImageDirectory())
- self.OnDirChanged(None)
- self._layout(notebook)
- def _newObject(self):
- """Create corresponding instruction object"""
- return Image(self.id, self.instruction)
- def _imagePanel(self, notebook):
- panel = wx.Panel(
- parent=notebook, id=wx.ID_ANY, size=(-1, -1),
- style=wx.TAB_TRAVERSAL)
- notebook.AddPage(page=panel, text=self.imagePanelName)
- border = wx.BoxSizer(wx.VERTICAL)
- #
- # choose image
- #
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Image"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- # choose directory
- panel.image = {}
- if self.imageDict['epsfile']:
- startDir = os.path.dirname(self.imageDict['epsfile'])
- else:
- startDir = self._getImageDirectory()
- dir = filebrowse.DirBrowseButton(
- parent=panel,
- id=wx.ID_ANY,
- labelText=_("Choose a directory:"),
- dialogTitle=_("Choose a directory with images"),
- buttonText=_('Browse'),
- startDirectory=startDir,
- changeCallback=self.OnDirChanged)
- panel.image['dir'] = dir
- sizer.Add(item=dir, proportion=0, flag=wx.EXPAND, border=0)
- # image list
- hSizer = wx.BoxSizer(wx.HORIZONTAL)
- imageList = wx.ListBox(parent=panel, id=wx.ID_ANY)
- panel.image['list'] = imageList
- imageList.Bind(wx.EVT_LISTBOX, self.OnImageSelectionChanged)
- hSizer.Add(
- item=imageList,
- proportion=1,
- flag=wx.EXPAND | wx.RIGHT,
- border=10)
- # image preview
- vSizer = wx.BoxSizer(wx.VERTICAL)
- self.previewSize = (150, 150)
- img = wx.EmptyImage(*self.previewSize)
- panel.image['preview'] = wx.StaticBitmap(
- parent=panel, id=wx.ID_ANY, bitmap=wx.BitmapFromImage(img))
- vSizer.Add(
- item=panel.image['preview'],
- proportion=0,
- flag=wx.EXPAND | wx.BOTTOM,
- border=5)
- panel.image['sizeInfo'] = wx.StaticText(parent=panel, id=wx.ID_ANY)
- vSizer.Add(
- item=panel.image['sizeInfo'],
- proportion=0,
- flag=wx.ALIGN_CENTER,
- border=0)
- hSizer.Add(item=vSizer, proportion=0, flag=wx.EXPAND, border=0)
- sizer.Add(item=hSizer, proportion=1, flag=wx.EXPAND | wx.ALL, border=3)
- epsInfo = wx.StaticText(parent=panel, id=wx.ID_ANY,
- label=_("Note: only EPS format supported"))
- sizer.Add(
- item=epsInfo,
- proportion=0,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- border=3)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- #
- # rotation
- #
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Scale And Rotation"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- gridSizer = wx.GridBagSizer(hgap=5, vgap=5)
- scaleLabel = wx.StaticText(
- parent=panel, id=wx.ID_ANY, label=_("Scale:"))
- if fs:
- panel.image['scale'] = fs.FloatSpin(
- panel, id=wx.ID_ANY, min_val=0, max_val=50, increment=0.5,
- value=1, style=fs.FS_RIGHT, size=self.spinCtrlSize)
- panel.image['scale'].SetFormat("%f")
- panel.image['scale'].SetDigits(1)
- else:
- panel.image['scale'] = wx.TextCtrl(
- panel, id=wx.ID_ANY, size=self.spinCtrlSize,
- validator=TCValidator(flag='DIGIT_ONLY'))
- if self.imageDict['scale']:
- if fs:
- value = float(self.imageDict['scale'])
- else:
- value = str(self.imageDict['scale'])
- else:
- if fs:
- value = 0
- else:
- value = '0'
- panel.image['scale'].SetValue(value)
- gridSizer.Add(
- item=scaleLabel, pos=(0, 0),
- flag=wx.ALIGN_CENTER_VERTICAL)
- gridSizer.Add(
- item=panel.image['scale'],
- pos=(0, 1),
- flag=wx.ALIGN_CENTER_VERTICAL)
- rotLabel = wx.StaticText(
- parent=panel,
- id=wx.ID_ANY,
- label=_("Rotation angle (deg):"))
- if fs:
- panel.image['rotate'] = fs.FloatSpin(
- panel, id=wx.ID_ANY, min_val=0, max_val=360, increment=0.5,
- value=0, style=fs.FS_RIGHT, size=self.spinCtrlSize)
- panel.image['rotate'].SetFormat("%f")
- panel.image['rotate'].SetDigits(1)
- else:
- panel.image['rotate'] = wx.SpinCtrl(
- parent=panel,
- id=wx.ID_ANY,
- size=self.spinCtrlSize,
- min=0,
- max=359,
- initial=0)
- panel.image['rotate'].SetToolTipString(
- _("Counterclockwise rotation in degrees"))
- if self.imageDict['rotate']:
- panel.image['rotate'].SetValue(int(self.imageDict['rotate']))
- else:
- panel.image['rotate'].SetValue(0)
- gridSizer.Add(
- item=rotLabel,
- pos=(
- 1,
- 0),
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- gridSizer.Add(
- item=panel.image['rotate'], pos=(
- 1, 1), flag=wx.ALIGN_CENTER_VERTICAL)
- self._addConvergence(panel=panel, gridBagSizer=gridSizer)
- sizer.Add(
- item=gridSizer,
- proportion=0,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- panel.SetSizer(border)
- panel.Fit()
- return panel
- def _positionPanel(self, notebook):
- panel = wx.Panel(
- parent=notebook, id=wx.ID_ANY, size=(-1, -1),
- style=wx.TAB_TRAVERSAL)
- notebook.AddPage(page=panel, text=_("Position"))
- border = wx.BoxSizer(wx.VERTICAL)
- #
- # set position
- #
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Position"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- self.AddExtendedPosition(panel, gridBagSizer, self.imageDict)
- self.Bind(
- wx.EVT_RADIOBUTTON,
- self.OnPositionType,
- panel.position['toPaper'])
- self.Bind(
- wx.EVT_RADIOBUTTON,
- self.OnPositionType,
- panel.position['toMap'])
- gridBagSizer.AddGrowableCol(0)
- gridBagSizer.AddGrowableCol(1)
- sizer.Add(
- gridBagSizer,
- proportion=1,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- panel.SetSizer(border)
- panel.Fit()
- return panel
- def OnDirChanged(self, event):
- """Image directory changed"""
- path = self.imagePanel.image['dir'].GetValue()
- try:
- files = os.listdir(path)
- except OSError: # no such directory
- files = []
- imageList = []
- # no setter for startDirectory?
- try:
- self.imagePanel.image['dir'].startDirectory = path
- except AttributeError: # for sure
- pass
- for file in files:
- if os.path.splitext(file)[1].lower() == '.eps':
- imageList.append(file)
- imageList.sort()
- self.imagePanel.image['list'].SetItems(imageList)
- if self.imageDict['epsfile']:
- file = os.path.basename(self.imageDict['epsfile'])
- self.imagePanel.image['list'].SetStringSelection(file)
- elif imageList:
- self.imagePanel.image['list'].SetSelection(0)
- self.OnImageSelectionChanged(None)
- def OnPositionType(self, event):
- if self.positionPanel.position['toPaper'].GetValue():
- for widget in self.gridBagSizerP.GetChildren():
- widget.GetWindow().Enable()
- for widget in self.gridBagSizerM.GetChildren():
- widget.GetWindow().Disable()
- else:
- for widget in self.gridBagSizerM.GetChildren():
- widget.GetWindow().Enable()
- for widget in self.gridBagSizerP.GetChildren():
- widget.GetWindow().Disable()
- def _getImageDirectory(self):
- """Default image directory"""
- return os.getcwd()
- def _addConvergence(self, panel, gridBagSizer):
- pass
- def OnImageSelectionChanged(self, event):
- """Image selected, show preview and size"""
- if not self.imagePanel.image[
- 'dir']: # event is emitted when closing dialog an it causes error
- return
- if not havePILImage:
- self.DrawWarningText(_("PIL\nmissing"))
- return
- imageName = self.imagePanel.image['list'].GetStringSelection()
- if not imageName:
- self.ClearPreview()
- return
- basePath = self.imagePanel.image['dir'].GetValue()
- file = os.path.join(basePath, imageName)
- if not os.path.exists(file):
- return
- if os.path.splitext(file)[1].lower() == '.eps':
- try:
- pImg = PILImage.open(file)
- if sys.platform == 'win32':
- import types
- pImg.load = types.MethodType(loadPSForWindows, pImg)
- img = PilImageToWxImage(pImg)
- except IOError as e:
- GError(message=_("Unable to read file %s") % file)
- self.ClearPreview()
- return
- self.SetSizeInfoLabel(img)
- img = self.ScaleToPreview(img)
- bitmap = img.ConvertToBitmap()
- self.DrawBitmap(bitmap)
- else:
- # TODO: read other formats and convert by PIL to eps
- pass
- def ScaleToPreview(self, img):
- """Scale image to preview size"""
- w = img.GetWidth()
- h = img.GetHeight()
- if w <= self.previewSize[0] and h <= self.previewSize[1]:
- return img
- if w > h:
- newW = self.previewSize[0]
- newH = self.previewSize[0] * h / w
- else:
- newH = self.previewSize[0]
- newW = self.previewSize[0] * w / h
- return img.Scale(newW, newH, wx.IMAGE_QUALITY_HIGH)
- def DrawWarningText(self, warning):
- """Draw text on preview window"""
- buffer = wx.EmptyBitmap(*self.previewSize)
- dc = wx.MemoryDC()
- dc.SelectObject(buffer)
- dc.SetBrush(wx.Brush(wx.Colour(250, 250, 250)))
- dc.Clear()
- extent = dc.GetTextExtent(warning)
- posX = self.previewSize[0] / 2 - extent[0] / 2
- posY = self.previewSize[1] / 2 - extent[1] / 2
- dc.DrawText(warning, posX, posY)
- self.imagePanel.image['preview'].SetBitmap(buffer)
- dc.SelectObject(wx.NullBitmap)
- def DrawBitmap(self, bitmap):
- """Draw bitmap, center it if smaller than preview size"""
- if bitmap.GetWidth() <= self.previewSize[
- 0] and bitmap.GetHeight() <= self.previewSize[1]:
- buffer = wx.EmptyBitmap(*self.previewSize)
- dc = wx.MemoryDC()
- dc.SelectObject(buffer)
- dc.SetBrush(dc.GetBrush())
- dc.Clear()
- posX = self.previewSize[0] / 2 - bitmap.GetWidth() / 2
- posY = self.previewSize[1] / 2 - bitmap.GetHeight() / 2
- dc.DrawBitmap(bitmap, posX, posY)
- self.imagePanel.image['preview'].SetBitmap(buffer)
- dc.SelectObject(wx.NullBitmap)
- else:
- self.imagePanel.image['preview'].SetBitmap(bitmap)
- self.imagePanel.Refresh()
- def SetSizeInfoLabel(self, image):
- """Update image size label"""
- self.imagePanel.image['sizeInfo'].SetLabel(
- _("size: %(width)s x %(height)s pts") %
- {'width': image.GetWidth(),
- 'height': image.GetHeight()})
- self.imagePanel.image['sizeInfo'].GetContainingSizer().Layout()
- def ClearPreview(self):
- """Clear preview window"""
- buffer = wx.EmptyBitmap(*self.previewSize)
- dc = wx.MemoryDC()
- dc.SelectObject(buffer)
- dc.SetBrush(wx.WHITE_BRUSH)
- dc.Clear()
- dc.SelectObject(wx.NullBitmap)
- mask = wx.Mask(buffer, wx.WHITE)
- buffer.SetMask(mask)
- self.imagePanel.image['preview'].SetBitmap(buffer)
- def update(self):
- # epsfile
- selected = self.imagePanel.image['list'].GetStringSelection()
- basePath = self.imagePanel.image['dir'].GetValue()
- if not selected:
- GMessage(parent=self, message=_("No image selected."))
- return False
- self.imageDict['epsfile'] = os.path.join(basePath, selected)
- # position
- if self.positionPanel.position['toPaper'].GetValue():
- self.imageDict['XY'] = True
- currUnit = self.unitConv.findUnit(
- self.positionPanel.units['unitsCtrl'].GetStringSelection())
- self.imageDict['unit'] = currUnit
- if self.positionPanel.position['xCtrl'].GetValue():
- x = self.positionPanel.position['xCtrl'].GetValue()
- else:
- x = self.imageDict['where'][0]
- if self.positionPanel.position['yCtrl'].GetValue():
- y = self.positionPanel.position['yCtrl'].GetValue()
- else:
- y = self.imageDict['where'][1]
- x = self.unitConv.convert(
- value=float(x), fromUnit=currUnit, toUnit='inch')
- y = self.unitConv.convert(
- value=float(y), fromUnit=currUnit, toUnit='inch')
- self.imageDict['where'] = x, y
- else:
- self.imageDict['XY'] = False
- if self.positionPanel.position['eCtrl'].GetValue():
- e = self.positionPanel.position['eCtrl'].GetValue()
- else:
- self.imageDict['east'] = self.imageDict['east']
- if self.positionPanel.position['nCtrl'].GetValue():
- n = self.positionPanel.position['nCtrl'].GetValue()
- else:
- self.imageDict['north'] = self.imageDict['north']
- x, y = PaperMapCoordinates(
- mapInstr=self.instruction[
- self.mapId], x=float(
- self.imageDict['east']), y=float(
- self.imageDict['north']), paperToMap=False)
- # rotation
- rot = self.imagePanel.image['rotate'].GetValue()
- if rot == 0:
- self.imageDict['rotate'] = None
- else:
- self.imageDict['rotate'] = rot
- # scale
- self.imageDict['scale'] = self.imagePanel.image['scale'].GetValue()
- # scale
- w, h = self.imageObj.GetImageOrigSize(self.imageDict['epsfile'])
- if self.imageDict['rotate']:
- self.imageDict['size'] = BBoxAfterRotation(
- w, h, self.imageDict['rotate'])
- else:
- self.imageDict['size'] = w, h
- w = self.unitConv.convert(value=self.imageDict['size'][0],
- fromUnit='point', toUnit='inch')
- h = self.unitConv.convert(value=self.imageDict['size'][1],
- fromUnit='point', toUnit='inch')
- self.imageDict['rect'] = Rect2D(x=x, y=y,
- width=w * self.imageDict['scale'],
- height=h * self.imageDict['scale'])
- if self.id not in self.instruction:
- image = self._newObject()
- self.instruction.AddInstruction(image)
- self.instruction[self.id].SetInstruction(self.imageDict)
- if self.id not in self.parent.objectId:
- self.parent.objectId.append(self.id)
- return True
- def updateDialog(self):
- """Update text coordinates, after moving"""
- # XY coordinates
- x, y = self.imageDict['where'][:2]
- currUnit = self.unitConv.findUnit(
- self.positionPanel.units['unitsCtrl'].GetStringSelection())
- x = self.unitConv.convert(value=x, fromUnit='inch', toUnit=currUnit)
- y = self.unitConv.convert(value=y, fromUnit='inch', toUnit=currUnit)
- self.positionPanel.position['xCtrl'].SetValue("%5.3f" % x)
- self.positionPanel.position['yCtrl'].SetValue("%5.3f" % y)
- # EN coordinates
- e, n = self.imageDict['east'], self.imageDict['north']
- self.positionPanel.position['eCtrl'].SetValue(
- str(self.imageDict['east']))
- self.positionPanel.position['nCtrl'].SetValue(
- str(self.imageDict['north']))
- class NorthArrowDialog(ImageDialog):
- def __init__(self, parent, id, settings):
- ImageDialog.__init__(self, parent=parent, id=id, settings=settings,
- imagePanelName=_("North Arrow"))
- self.objectType = ('northArrow',)
- self.SetTitle(_("North Arrow settings"))
- def _newObject(self):
- return NorthArrow(self.id, self.instruction)
- def _getImageDirectory(self):
- gisbase = os.getenv("GISBASE")
- return os.path.join(gisbase, 'etc', 'paint', 'decorations')
- def _addConvergence(self, panel, gridBagSizer):
- convergence = wx.Button(parent=panel, id=wx.ID_ANY,
- label=_("Compute convergence"))
- gridBagSizer.Add(item=convergence, pos=(1, 2),
- flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND)
- convergence.Bind(wx.EVT_BUTTON, self.OnConvergence)
- panel.image['convergence'] = convergence
- def OnConvergence(self, event):
- ret = RunCommand('g.region', read=True, flags='ng')
- if ret:
- convergence = float(ret.strip().split('=')[1])
- if convergence < 0:
- self.imagePanel.image['rotate'].SetValue(abs(convergence))
- else:
- self.imagePanel.image['rotate'].SetValue(360 - convergence)
- class PointDialog(PsmapDialog):
- """Dialog for setting point properties."""
- def __init__(
- self, parent, id, settings, coordinates=None,
- pointPanelName=_("Point")):
- PsmapDialog.__init__(
- self,
- parent=parent,
- id=id,
- title="Point settings",
- settings=settings)
- self.objectType = ('point',)
- if self.id is not None:
- self.pointObj = self.instruction[self.id]
- self.pointDict = self.instruction[id].GetInstruction()
- else:
- self.id = wx.NewId()
- self.pointObj = Point(self.id)
- self.pointDict = self.pointObj.GetInstruction()
- self.pointDict['where'] = coordinates
- self.defaultDict = self.pointObj.defaultInstruction
- mapObj = self.instruction.FindInstructionByType('map')
- if not mapObj:
- mapObj = self.instruction.FindInstructionByType('initMap')
- self.mapId = mapObj.id
- self.pointDict['east'], self.pointDict['north'] = PaperMapCoordinates(
- mapInstr=mapObj, x=self.pointDict['where'][0],
- y=self.pointDict['where'][1],
- paperToMap=True)
- notebook = wx.Notebook(parent=self, id=wx.ID_ANY, style=wx.BK_DEFAULT)
- self.pointPanelName = pointPanelName
- self.pointPanel = self._pointPanel(notebook)
- self.positionPanel = self._positionPanel(notebook)
- self.OnPositionType(None)
- self._layout(notebook)
- def _pointPanel(self, notebook):
- panel = wx.Panel(
- parent=notebook, id=wx.ID_ANY, size=(-1, -1),
- style=wx.TAB_TRAVERSAL)
- notebook.AddPage(page=panel, text=self.pointPanelName)
- border = wx.BoxSizer(wx.VERTICAL)
- #
- # choose image
- #
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Symbol"))
- sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
- gridSizer = wx.GridBagSizer(hgap=5, vgap=5)
- gridSizer.Add(
- item=wx.StaticText(
- parent=panel, id=wx.ID_ANY, label=_("Select symbol:")), pos=(
- 0, 0), flag=wx.ALIGN_CENTER_VERTICAL)
- self.symbolLabel = wx.StaticText(parent=panel, id=wx.ID_ANY,
- label=self.pointDict['symbol'])
- gridSizer.Add(item=self.symbolLabel, pos=(0, 1),
- flag=wx.ALIGN_CENTER_VERTICAL)
- bitmap = wx.Bitmap(os.path.join(globalvar.SYMBDIR,
- self.pointDict['symbol']) + '.png')
- self.symbolButton = wx.BitmapButton(panel, id=wx.ID_ANY, bitmap=bitmap)
- self.symbolButton.Bind(wx.EVT_BUTTON, self.OnSymbolSelection)
- gridSizer.Add(
- self.symbolButton, pos=(0, 2),
- flag=wx.ALIGN_CENTER_VERTICAL)
- self.noteLabel = wx.StaticText(
- parent=panel, id=wx.ID_ANY, label=_(
- "Note: Selected symbol is not displayed\n"
- "in draft mode (only in preview mode)"))
- gridSizer.Add(
- self.noteLabel, pos=(
- 1, 0), span=(
- 1, 2), flag=wx.ALIGN_CENTER_VERTICAL)
- gridSizer.AddGrowableCol(1)
- sizer.Add(
- item=gridSizer,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- #
- # outline/fill color
- #
- # outline
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Color"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- gridSizer = wx.GridBagSizer(hgap=5, vgap=5)
- outlineLabel = wx.StaticText(
- parent=panel,
- id=wx.ID_ANY,
- label=_("Outline color:"))
- self.outlineColorCtrl = wx.ColourPickerCtrl(panel, id=wx.ID_ANY)
- self.outlineTranspCtrl = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_("transparent"))
- if self.pointDict['color'] != 'none':
- self.outlineTranspCtrl.SetValue(False)
- self.outlineColorCtrl.SetColour(
- convertRGB(self.pointDict['color']))
- else:
- self.outlineTranspCtrl.SetValue(True)
- self.outlineColorCtrl.SetColour(
- convertRGB(self.defaultDict['color']))
- gridSizer.Add(
- item=outlineLabel, pos=(0, 0),
- flag=wx.ALIGN_CENTER_VERTICAL)
- gridSizer.Add(
- item=self.outlineColorCtrl, pos=(
- 0, 1), flag=wx.ALIGN_CENTER_VERTICAL)
- gridSizer.Add(
- item=self.outlineTranspCtrl, pos=(
- 0, 2), flag=wx.ALIGN_CENTER_VERTICAL)
- fillLabel = wx.StaticText(
- parent=panel,
- id=wx.ID_ANY,
- label=_("Fill color:"))
- self.fillColorCtrl = wx.ColourPickerCtrl(panel, id=wx.ID_ANY)
- self.fillTranspCtrl = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_("transparent"))
- if self.pointDict['fcolor'] != 'none':
- self.fillTranspCtrl.SetValue(False)
- self.fillColorCtrl.SetColour(convertRGB(self.pointDict['fcolor']))
- else:
- self.fillTranspCtrl.SetValue(True)
- self.fillColorCtrl.SetColour(
- convertRGB(self.defaultDict['fcolor']))
- gridSizer.Add(
- item=fillLabel, pos=(1, 0),
- flag=wx.ALIGN_CENTER_VERTICAL)
- gridSizer.Add(
- item=self.fillColorCtrl, pos=(
- 1, 1), flag=wx.ALIGN_CENTER_VERTICAL)
- gridSizer.Add(
- item=self.fillTranspCtrl, pos=(
- 1, 2), flag=wx.ALIGN_CENTER_VERTICAL)
- sizer.Add(
- item=gridSizer,
- proportion=0,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- #
- # size and rotation
- #
- # size
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Size and Rotation"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- gridSizer = wx.GridBagSizer(hgap=5, vgap=5)
- sizeLabel = wx.StaticText(
- parent=panel,
- id=wx.ID_ANY,
- label=_("Size (pt):"))
- self.sizeCtrl = wx.SpinCtrl(
- panel, id=wx.ID_ANY, size=self.spinCtrlSize)
- self.sizeCtrl.SetToolTipString(_("Symbol size in points"))
- self.sizeCtrl.SetValue(self.pointDict['size'])
- gridSizer.Add(
- item=sizeLabel, pos=(0, 0),
- flag=wx.ALIGN_CENTER_VERTICAL)
- gridSizer.Add(
- item=self.sizeCtrl, pos=(
- 0, 1), flag=wx.ALIGN_CENTER_VERTICAL)
- # rotation
- rotLabel = wx.StaticText(
- parent=panel,
- id=wx.ID_ANY,
- label=_("Rotation angle (deg):"))
- if fs:
- self.rotCtrl = fs.FloatSpin(
- panel,
- id=wx.ID_ANY,
- min_val=-360,
- max_val=360,
- increment=1,
- value=0,
- style=fs.FS_RIGHT,
- size=self.spinCtrlSize)
- self.rotCtrl.SetFormat("%f")
- self.rotCtrl.SetDigits(1)
- else:
- self.rotCtrl = wx.SpinCtrl(
- parent=panel,
- id=wx.ID_ANY,
- size=self.spinCtrlSize,
- min=-360,
- max=360,
- initial=0)
- self.rotCtrl.SetToolTipString(
- _("Counterclockwise rotation in degrees"))
- self.rotCtrl.SetValue(float(self.pointDict['rotate']))
- gridSizer.Add(
- item=rotLabel,
- pos=(
- 1,
- 0),
- flag=wx.ALIGN_CENTER_VERTICAL,
- border=0)
- gridSizer.Add(
- item=self.rotCtrl, pos=(1, 1),
- flag=wx.ALIGN_CENTER_VERTICAL)
- sizer.Add(
- item=gridSizer,
- proportion=0,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- panel.SetSizer(border)
- panel.Fit()
- return panel
- def _positionPanel(self, notebook):
- panel = wx.Panel(
- parent=notebook, id=wx.ID_ANY, size=(-1, -1),
- style=wx.TAB_TRAVERSAL)
- notebook.AddPage(page=panel, text=_("Position"))
- border = wx.BoxSizer(wx.VERTICAL)
- #
- # set position
- #
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Position"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- gridBagSizer = wx.GridBagSizer(hgap=5, vgap=5)
- self.AddExtendedPosition(panel, gridBagSizer, self.pointDict)
- self.Bind(
- wx.EVT_RADIOBUTTON,
- self.OnPositionType,
- panel.position['toPaper'])
- self.Bind(
- wx.EVT_RADIOBUTTON,
- self.OnPositionType,
- panel.position['toMap'])
- gridBagSizer.AddGrowableCol(0)
- gridBagSizer.AddGrowableCol(1)
- sizer.Add(
- gridBagSizer,
- proportion=1,
- flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- panel.SetSizer(border)
- panel.Fit()
- return panel
- def OnPositionType(self, event):
- if self.positionPanel.position['toPaper'].GetValue():
- for widget in self.gridBagSizerP.GetChildren():
- widget.GetWindow().Enable()
- for widget in self.gridBagSizerM.GetChildren():
- widget.GetWindow().Disable()
- else:
- for widget in self.gridBagSizerM.GetChildren():
- widget.GetWindow().Enable()
- for widget in self.gridBagSizerP.GetChildren():
- widget.GetWindow().Disable()
- def OnSymbolSelection(self, event):
- dlg = SymbolDialog(self, symbolPath=globalvar.SYMBDIR,
- currentSymbol=self.symbolLabel.GetLabel())
- if dlg.ShowModal() == wx.ID_OK:
- img = dlg.GetSelectedSymbolPath()
- name = dlg.GetSelectedSymbolName()
- self.symbolButton.SetBitmapLabel(wx.Bitmap(img + '.png'))
- self.symbolLabel.SetLabel(name)
- dlg.Destroy()
- def update(self):
- # symbol
- self.pointDict['symbol'] = self.symbolLabel.GetLabel()
- # position
- if self.positionPanel.position['toPaper'].GetValue():
- self.pointDict['XY'] = True
- currUnit = self.unitConv.findUnit(
- self.positionPanel.units['unitsCtrl'].GetStringSelection())
- self.pointDict['unit'] = currUnit
- if self.positionPanel.position['xCtrl'].GetValue():
- x = self.positionPanel.position['xCtrl'].GetValue()
- else:
- x = self.pointDict['where'][0]
- if self.positionPanel.position['yCtrl'].GetValue():
- y = self.positionPanel.position['yCtrl'].GetValue()
- else:
- y = self.pointDict['where'][1]
- x = self.unitConv.convert(
- value=float(x), fromUnit=currUnit, toUnit='inch')
- y = self.unitConv.convert(
- value=float(y), fromUnit=currUnit, toUnit='inch')
- self.pointDict['where'] = x, y
- else:
- self.pointDict['XY'] = False
- if self.positionPanel.position['eCtrl'].GetValue():
- e = self.positionPanel.position['eCtrl'].GetValue()
- else:
- self.pointDict['east'] = self.pointDict['east']
- if self.positionPanel.position['nCtrl'].GetValue():
- n = self.positionPanel.position['nCtrl'].GetValue()
- else:
- self.pointDict['north'] = self.pointDict['north']
- x, y = PaperMapCoordinates(
- mapInstr=self.instruction[
- self.mapId], x=float(
- self.pointDict['east']), y=float(
- self.pointDict['north']), paperToMap=False)
- # rotation
- self.pointDict['rotate'] = self.rotCtrl.GetValue()
- # size
- self.pointDict['size'] = self.sizeCtrl.GetValue()
- w = h = self.unitConv.convert(value=self.pointDict['size'],
- fromUnit='point', toUnit='inch')
- # outline color
- if self.outlineTranspCtrl.GetValue():
- self.pointDict['color'] = 'none'
- else:
- self.pointDict['color'] = convertRGB(
- self.outlineColorCtrl.GetColour())
- # fill color
- if self.fillTranspCtrl.GetValue():
- self.pointDict['fcolor'] = 'none'
- else:
- self.pointDict['fcolor'] = convertRGB(
- self.fillColorCtrl.GetColour())
- self.pointDict['rect'] = Rect2D(
- x=x - w / 2, y=y - h / 2, width=w, height=h)
- if self.id not in self.instruction:
- point = Point(self.id)
- self.instruction.AddInstruction(point)
- self.instruction[self.id].SetInstruction(self.pointDict)
- if self.id not in self.parent.objectId:
- self.parent.objectId.append(self.id)
- return True
- def updateDialog(self):
- """Update text coordinates, after moving"""
- # XY coordinates
- x, y = self.pointDict['where'][:2]
- currUnit = self.unitConv.findUnit(
- self.positionPanel.units['unitsCtrl'].GetStringSelection())
- x = self.unitConv.convert(value=x, fromUnit='inch', toUnit=currUnit)
- y = self.unitConv.convert(value=y, fromUnit='inch', toUnit=currUnit)
- self.positionPanel.position['xCtrl'].SetValue("%5.3f" % x)
- self.positionPanel.position['yCtrl'].SetValue("%5.3f" % y)
- # EN coordinates
- e, n = self.pointDict['east'], self.pointDict['north']
- self.positionPanel.position['eCtrl'].SetValue(
- str(self.pointDict['east']))
- self.positionPanel.position['nCtrl'].SetValue(
- str(self.pointDict['north']))
- class RectangleDialog(PsmapDialog):
- def __init__(self, parent, id, settings,
- type='rectangle', coordinates=None):
- """
- :param coordinates: begin and end point coordinate (wx.Point, wx.Point)
- """
- if type == 'rectangle':
- title = _("Rectangle settings")
- else:
- title = _("Line settings")
- PsmapDialog.__init__(
- self,
- parent=parent,
- id=id,
- title=title,
- settings=settings)
- self.objectType = (type,)
- if self.id is not None:
- self.rectObj = self.instruction[self.id]
- self.rectDict = self.rectObj.GetInstruction()
- else:
- self.id = wx.NewId()
- if type == 'rectangle':
- self.rectObj = Rectangle(self.id)
- else:
- self.rectObj = Line(self.id)
- self.rectDict = self.rectObj.GetInstruction()
- self.rectDict['rect'] = Rect2DPP(coordinates[0], coordinates[1])
- self.rectDict['where'] = coordinates
- self.defaultDict = self.rectObj.defaultInstruction
- self.panel = self._rectPanel()
- self._layout(self.panel)
- def _rectPanel(self):
- panel = wx.Panel(parent=self, id=wx.ID_ANY, style=wx.TAB_TRAVERSAL)
- border = wx.BoxSizer(wx.VERTICAL)
- # color
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Color"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- gridSizer = wx.GridBagSizer(hgap=5, vgap=5)
- outlineLabel = wx.StaticText(
- parent=panel,
- id=wx.ID_ANY,
- label=_("Outline color:"))
- self.outlineColorCtrl = wx.ColourPickerCtrl(panel, id=wx.ID_ANY)
- self.outlineTranspCtrl = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_("transparent"))
- if self.rectDict['color'] != 'none':
- self.outlineTranspCtrl.SetValue(False)
- self.outlineColorCtrl.SetColour(convertRGB(self.rectDict['color']))
- else:
- self.outlineTranspCtrl.SetValue(True)
- self.outlineColorCtrl.SetColour(
- convertRGB(self.defaultDict['color']))
- # transparent outline makes sense only for rectangle
- if self.objectType == ('line',):
- self.outlineTranspCtrl.Hide()
- gridSizer.Add(
- item=outlineLabel, pos=(0, 0),
- flag=wx.ALIGN_CENTER_VERTICAL)
- gridSizer.Add(
- item=self.outlineColorCtrl, pos=(
- 0, 1), flag=wx.ALIGN_CENTER_VERTICAL)
- gridSizer.Add(
- item=self.outlineTranspCtrl, pos=(
- 0, 2), flag=wx.ALIGN_CENTER_VERTICAL)
- # fill color only in rectangle
- if self.objectType == ('rectangle',):
- fillLabel = wx.StaticText(
- parent=panel, id=wx.ID_ANY, label=_("Fill color:"))
- self.fillColorCtrl = wx.ColourPickerCtrl(panel, id=wx.ID_ANY)
- self.fillTranspCtrl = wx.CheckBox(
- panel, id=wx.ID_ANY, label=_("transparent"))
- if self.rectDict['fcolor'] != 'none':
- self.fillTranspCtrl.SetValue(False)
- self.fillColorCtrl.SetColour(
- convertRGB(self.rectDict['fcolor']))
- else:
- self.fillTranspCtrl.SetValue(True)
- self.fillColorCtrl.SetColour(wx.WHITE)
- gridSizer.Add(
- item=fillLabel, pos=(1, 0),
- flag=wx.ALIGN_CENTER_VERTICAL)
- gridSizer.Add(
- item=self.fillColorCtrl, pos=(
- 1, 1), flag=wx.ALIGN_CENTER_VERTICAL)
- gridSizer.Add(
- item=self.fillTranspCtrl, pos=(
- 1, 2), flag=wx.ALIGN_CENTER_VERTICAL)
- sizer.Add(gridSizer, proportion=1, flag=wx.EXPAND | wx.ALL, border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- gridSizer = wx.GridBagSizer(hgap=5, vgap=5)
- # width
- box = wx.StaticBox(
- parent=panel,
- id=wx.ID_ANY,
- label=" %s " %
- _("Line style"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- widthLabel = wx.StaticText(
- parent=panel,
- id=wx.ID_ANY,
- label=_("Line width:"))
- if fs:
- self.widthCtrl = fs.FloatSpin(
- panel,
- id=wx.ID_ANY,
- min_val=0,
- max_val=50,
- increment=1,
- value=0,
- style=fs.FS_RIGHT,
- size=self.spinCtrlSize)
- self.widthCtrl.SetFormat("%f")
- self.widthCtrl.SetDigits(1)
- else:
- self.widthCtrl = wx.SpinCtrl(
- parent=panel,
- id=wx.ID_ANY,
- size=self.spinCtrlSize,
- min=-360,
- max=360,
- initial=0)
- self.widthCtrl.SetToolTipString(_("Line width in points"))
- self.widthCtrl.SetValue(float(self.rectDict['width']))
- gridSizer.Add(
- item=widthLabel, pos=(0, 0),
- flag=wx.ALIGN_CENTER_VERTICAL)
- gridSizer.Add(
- item=self.widthCtrl, pos=(
- 0, 1), flag=wx.ALIGN_CENTER_VERTICAL)
- sizer.Add(gridSizer, proportion=1, flag=wx.EXPAND | wx.ALL, border=5)
- border.Add(item=sizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- panel.SetSizer(border)
- return panel
- def update(self):
- mapInstr = self.instruction.FindInstructionByType('map')
- if not mapInstr:
- mapInstr = self.instruction.FindInstructionByType('initMap')
- self.mapId = mapInstr.id
- point1 = self.rectDict['where'][0]
- point2 = self.rectDict['where'][1]
- self.rectDict['east1'], self.rectDict['north1'] = PaperMapCoordinates(
- mapInstr=mapInstr, x=point1[0], y=point1[1], paperToMap=True)
- self.rectDict['east2'], self.rectDict['north2'] = PaperMapCoordinates(
- mapInstr=mapInstr, x=point2[0], y=point2[1], paperToMap=True)
- # width
- self.rectDict['width'] = self.widthCtrl.GetValue()
- # outline color
- if self.outlineTranspCtrl.GetValue():
- self.rectDict['color'] = 'none'
- else:
- self.rectDict['color'] = convertRGB(
- self.outlineColorCtrl.GetColour())
- # fill color
- if self.objectType == ('rectangle',):
- if self.fillTranspCtrl.GetValue():
- self.rectDict['fcolor'] = 'none'
- else:
- self.rectDict['fcolor'] = convertRGB(
- self.fillColorCtrl.GetColour())
- if self.id not in self.instruction:
- if self.objectType == ('rectangle',):
- rect = Rectangle(self.id)
- else:
- rect = Line(self.id)
- self.instruction.AddInstruction(rect)
- self.instruction[self.id].SetInstruction(self.rectDict)
- if self.id not in self.parent.objectId:
- self.parent.objectId.append(self.id)
- self.updateDialog()
- return True
- def updateDialog(self):
- """Update text coordinates, after moving"""
- pass
- class LabelsDialog(PsmapDialog):
- def __init__(self, parent, id, settings):
- PsmapDialog.__init__(
- self,
- parent=parent,
- id=id,
- title=_("Vector labels"),
- settings=settings)
- self.objectType = ('labels',)
- if self.id is not None:
- self.labels = self.instruction[self.id]
- else:
- self.id = wx.NewId()
- self.labels = Labels(self.id)
- self.labelsDict = self.labels.GetInstruction()
- self.panel = self._labelPanel()
- self._layout(self.panel)
- def _labelPanel(self):
- panel = wx.Panel(parent=self, id=wx.ID_ANY, style=wx.TAB_TRAVERSAL)
- border = wx.BoxSizer(wx.VERTICAL)
- box = wx.StaticBox(
- parent=panel, id=wx.ID_ANY, label=" %s " %
- _("Vector label files created beforehand by v.label module"))
- sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
- self.select = Select(
- parent=panel,
- multiple=True,
- type='labels',
- fullyQualified=False)
- self.select.SetValue(','.join(self.labelsDict['labels']))
- self.select.SetFocus()
- sizer.Add(
- item=self.select,
- proportion=1,
- flag=wx.EXPAND | wx.ALL,
- border=5)
- helpText = wx.StaticText(
- panel, id=wx.ID_ANY,
- label=_("You can select multiple label files."))
- helpText.SetForegroundColour(
- wx.SystemSettings_GetColour(
- wx.SYS_COLOUR_GRAYTEXT))
- sizer.Add(
- item=helpText,
- proportion=0,
- flag=wx.EXPAND | wx.LEFT | wx.RIGHT,
- border=5)
- border.Add(sizer, proportion=1, flag=wx.EXPAND | wx.ALL, border=5)
- panel.SetSizer(border)
- return panel
- def update(self):
- value = self.select.GetValue()
- if not value:
- self.labelsDict['labels'] = []
- else:
- self.labelsDict['labels'] = value.split(',')
- if self.id not in self.instruction:
- labels = Labels(self.id)
- self.instruction.AddInstruction(labels)
- self.instruction[self.id].SetInstruction(self.labelsDict)
- return True
|