nviz_tools.py 174 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017
  1. """!
  2. @package nviz_tools.py
  3. @brief Nviz (3D view) tools window
  4. Classes:
  5. - NvizToolWindow
  6. - PositionWindow
  7. - ViewPositionWindow
  8. - LightPositionWindow
  9. (C) 2008-2011 by the GRASS Development Team
  10. This program is free software under the GNU General Public
  11. License (>=v2). Read the file COPYING that comes with GRASS
  12. for details.
  13. @author Martin Landa <landa.martin gmail.com> (Google SoC 2008/2010)
  14. @author Enhancements by Michael Barton <michael.barton asu.edu>
  15. @author Anna Kratochvilova <KratochAnna seznam.cz> (Google SoC 2011)
  16. """
  17. import os
  18. import sys
  19. import copy
  20. import types
  21. import string
  22. import wx
  23. import wx.lib.colourselect as csel
  24. import wx.lib.scrolledpanel as SP
  25. try:
  26. import wx.lib.agw.flatnotebook as FN
  27. except ImportError:
  28. import wx.lib.flatnotebook as FN
  29. try:
  30. from agw import foldpanelbar as fpb
  31. except ImportError: # if it's not there locally, try the wxPython lib.
  32. try:
  33. import wx.lib.agw.foldpanelbar as fpb
  34. except ImportError:
  35. import wx.lib.foldpanelbar as fpb # versions <=2.5.5.1
  36. try:
  37. import wx.lib.agw.floatspin as fs
  38. except ImportError:
  39. fs = None
  40. import grass.script as grass
  41. import globalvar
  42. import gselect
  43. import gcmd
  44. from preferences import globalSettings as UserSettings
  45. try:
  46. from nviz_mapdisp import wxUpdateView, wxUpdateLight, wxUpdateProperties,\
  47. wxUpdateCPlane
  48. import wxnviz
  49. except ImportError:
  50. pass
  51. from debug import Debug
  52. class ScrolledPanel(SP.ScrolledPanel):
  53. """!Custom ScrolledPanel to avoid strange behaviour concerning focus"""
  54. def __init__(self, parent):
  55. SP.ScrolledPanel.__init__(self, parent = parent, id = wx.ID_ANY)
  56. def OnChildFocus(self, event):
  57. pass
  58. class NTCValidator(wx.PyValidator):
  59. """!validates input in textctrls, taken from wxpython demo"""
  60. def __init__(self, flag = None):
  61. wx.PyValidator.__init__(self)
  62. self.flag = flag
  63. self.Bind(wx.EVT_CHAR, self.OnChar)
  64. def Clone(self):
  65. return NTCValidator(self.flag)
  66. def OnChar(self, event):
  67. key = event.GetKeyCode()
  68. if key < wx.WXK_SPACE or key == wx.WXK_DELETE or key > 255:
  69. event.Skip()
  70. return
  71. if self.flag == 'DIGIT_ONLY' and chr(key) in string.digits + '.-':
  72. event.Skip()
  73. return
  74. if not wx.Validator_IsSilent():
  75. wx.Bell()
  76. # Returning without calling even.Skip eats the event before it
  77. # gets to the text control
  78. return
  79. class NumTextCtrl(wx.TextCtrl):
  80. """!Class derived from wx.TextCtrl for numerical values only"""
  81. def __init__(self, parent, **kwargs):
  82. wx.TextCtrl.__init__(self, parent = parent,
  83. validator = NTCValidator(flag = 'DIGIT_ONLY'), **kwargs)
  84. def SetValue(self, value):
  85. super(NumTextCtrl, self).SetValue(str(int(value)))
  86. def GetValue(self):
  87. val = super(NumTextCtrl, self).GetValue()
  88. if val == '':
  89. val = '0'
  90. try:
  91. return int(float(val))
  92. except ValueError:
  93. val = ''.join(''.join(val.split('-')).split('.'))
  94. return int(float(val))
  95. def SetRange(self, min, max):
  96. pass
  97. class NvizToolWindow(FN.FlatNotebook):
  98. """!Nviz (3D view) tools panel
  99. """
  100. def __init__(self, parent, display, id = wx.ID_ANY,
  101. style = globalvar.FNPageStyle|FN.FNB_NO_X_BUTTON|FN.FNB_NO_NAV_BUTTONS,
  102. **kwargs):
  103. Debug.msg(5, "NvizToolWindow.__init__()")
  104. self.parent = parent # GMFrame
  105. self.mapDisplay = display
  106. self.mapWindow = display.GetWindow()
  107. self._display = self.mapWindow.GetDisplay()
  108. if globalvar.hasAgw:
  109. kwargs['agwStyle'] = style
  110. else:
  111. kwargs['style'] = style
  112. FN.FlatNotebook.__init__(self, parent, id, **kwargs)
  113. self.SetTabAreaColour(globalvar.FNPageColor)
  114. self.win = {} # window ids
  115. self.page = {} # page ids
  116. # view page
  117. self.AddPage(page = self._createViewPage(),
  118. text = " %s " % _("View"))
  119. # data page
  120. self.AddPage(page = self._createDataPage(),
  121. text = " %s " % _("Data"))
  122. # appearance page
  123. self.AddPage(page = self._createAppearancePage(),
  124. text = " %s " % _("Appearance"))
  125. # analysis page
  126. self.AddPage(page = self._createAnalysisPage(),
  127. text = " %s " % _("Analysis"))
  128. self.UpdateSettings()
  129. self.pageChanging = False
  130. self.vetoGSelectEvt = False #when setting map, event is invoked
  131. self.mapWindow.render['quick'] = False
  132. self.mapWindow.Refresh(False)
  133. # bindings
  134. self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
  135. self.Bind(wx.EVT_SIZE, self.OnSize)
  136. Debug.msg(3, "NvizToolWindow.__init__()")
  137. self.Update()
  138. wx.CallAfter(self.SetPage, 'view')
  139. wx.CallAfter(self.UpdateScrolling, (self.foldpanelData, self.foldpanelAppear,
  140. self.foldpanelAnalysis))
  141. wx.CallAfter(self.SetInitialMaps)
  142. def SetInitialMaps(self):
  143. """!Set initial raster and vector map"""
  144. for l_type in ('raster', 'vector', '3d-raster'):
  145. selectedLayer = self.mapWindow.GetSelectedLayer()
  146. layers = self.mapWindow.Map.GetListOfLayers(l_type = l_type, l_active = True)
  147. if selectedLayer in layers:
  148. selection = selectedLayer.GetName()
  149. else:
  150. try:
  151. selection = layers[0].GetName()
  152. except:
  153. continue
  154. if l_type == 'raster':
  155. self.FindWindowById(self.win['surface']['map']).SetValue(selection)
  156. self.FindWindowById(self.win['fringe']['map']).SetValue(selection)
  157. elif l_type == 'vector':
  158. self.FindWindowById(self.win['vector']['map']).SetValue(selection)
  159. elif l_type == '3d-raster':
  160. self.FindWindowById(self.win['volume']['map']).SetValue(selection)
  161. def UpdateState(self, **kwargs):
  162. if 'view' in kwargs:
  163. self.mapWindow.view = kwargs['view']
  164. self.FindWindowById(self.win['view']['position']).data = kwargs['view']
  165. if 'iview' in kwargs:
  166. self.mapWindow.iview = kwargs['iview']
  167. if 'light' in kwargs:
  168. self.mapWindow.light = kwargs['light']
  169. self.FindWindowById(self.win['light']['position']).data = kwargs['light']
  170. def OnPageChanged(self, event):
  171. new = event.GetSelection()
  172. # self.ChangeSelection(new)
  173. def PostViewEvent(self, zExag = False):
  174. """!Change view settings"""
  175. event = wxUpdateView(zExag = zExag)
  176. wx.PostEvent(self.mapWindow, event)
  177. def OnSize(self, event):
  178. """!After window is resized, update scrolling"""
  179. # workaround to resize captionbars of foldpanelbar
  180. wx.CallAfter(self.UpdateScrolling, (self.foldpanelData, self.foldpanelAppear,
  181. self.foldpanelAnalysis))
  182. event.Skip()
  183. def OnPressCaption(self, event):
  184. """!When foldpanel item collapsed/expanded, update scrollbars"""
  185. foldpanel = event.GetBar().GetGrandParent().GetParent()
  186. wx.CallAfter(self.UpdateScrolling, (foldpanel,))
  187. event.Skip()
  188. def UpdateScrolling(self, foldpanels):
  189. """!Update scrollbars in foldpanel"""
  190. for foldpanel in foldpanels:
  191. length = foldpanel.GetPanelsLength(collapsed = 0, expanded = 0)
  192. # virtual width is set to fixed value to suppress GTK warning
  193. foldpanel.GetParent().SetVirtualSize((100, length[2]))
  194. foldpanel.GetParent().Layout()
  195. def _createViewPage(self):
  196. """!Create view settings page"""
  197. panel = SP.ScrolledPanel(parent = self, id = wx.ID_ANY)
  198. panel.SetupScrolling(scroll_x = False)
  199. self.page['view'] = { 'id' : 0,
  200. 'notebook' : self.GetId()}
  201. pageSizer = wx.BoxSizer(wx.VERTICAL)
  202. box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  203. label = " %s " % (_("Control View")))
  204. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  205. gridSizer = wx.GridBagSizer(vgap = 5, hgap = 10)
  206. self.win['view'] = {}
  207. # position
  208. posSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
  209. self._createCompass(panel = panel, sizer = posSizer, type = 'view')
  210. view = ViewPositionWindow(panel, size = (175, 175),
  211. mapwindow = self.mapWindow)
  212. self.win['view']['position'] = view.GetId()
  213. posSizer.Add(item = view,
  214. pos = (1, 1), flag = wx.ALIGN_CENTER | wx.ALIGN_CENTER_VERTICAL)
  215. gridSizer.Add(item = posSizer, pos = (0, 0))
  216. # perspective
  217. # set initial defaults here (or perhaps in a default values file), not in user settings
  218. self._createControl(panel, data = self.win['view'], name = 'persp',
  219. range = (1,100),
  220. bind = (self.OnViewChange, self.OnViewChanged, self.OnViewChangedText))
  221. gridSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Perspective:")),
  222. pos = (1, 0), flag = wx.ALIGN_CENTER)
  223. gridSizer.Add(item = self.FindWindowById(self.win['view']['persp']['slider']), pos = (2, 0),
  224. flag = wx.ALIGN_CENTER)
  225. gridSizer.Add(item = self.FindWindowById(self.win['view']['persp']['text']), pos = (3, 0),
  226. flag = wx.ALIGN_CENTER)
  227. # twist
  228. self._createControl(panel, data = self.win['view'], name = 'twist',
  229. range = (-180,180),
  230. bind = (self.OnViewChange, self.OnViewChanged, self.OnViewChangedText))
  231. gridSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Twist:")),
  232. pos = (1, 1), flag = wx.ALIGN_CENTER)
  233. gridSizer.Add(item = self.FindWindowById(self.win['view']['twist']['slider']), pos = (2, 1))
  234. gridSizer.Add(item = self.FindWindowById(self.win['view']['twist']['text']), pos = (3, 1),
  235. flag = wx.ALIGN_CENTER)
  236. # height + z-exag
  237. self._createControl(panel, data = self.win['view'], name = 'height', sliderHor = False,
  238. range = (0, 1),
  239. bind = (self.OnViewChange, self.OnViewChanged, self.OnViewChangedText))
  240. self._createControl(panel, data = self.win['view'], name = 'z-exag', sliderHor = False,
  241. range = (0, 5),
  242. bind = (self.OnViewChange, self.OnViewChanged, self.OnViewChangedText))
  243. self.FindWindowById(self.win['view']['z-exag']['slider']).SetValue(1)
  244. self.FindWindowById(self.win['view']['z-exag']['text']).SetValue(1)
  245. heightSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
  246. heightSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Height:")),
  247. pos = (0, 0), flag = wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL, span = (1, 2))
  248. heightSizer.Add(item = self.FindWindowById(self.win['view']['height']['slider']),
  249. flag = wx.ALIGN_RIGHT, pos = (1, 0))
  250. heightSizer.Add(item = self.FindWindowById(self.win['view']['height']['text']),
  251. flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT, pos = (1, 1))
  252. heightSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Z-exag:")),
  253. pos = (0, 2), flag = wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL, span = (1, 2))
  254. heightSizer.Add(item = self.FindWindowById(self.win['view']['z-exag']['slider']),
  255. flag = wx.ALIGN_RIGHT, pos = (1, 2))
  256. heightSizer.Add(item = self.FindWindowById(self.win['view']['z-exag']['text']),
  257. flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT | wx.TOP |
  258. wx.BOTTOM | wx.RIGHT, pos = (1, 3))
  259. gridSizer.Add(item = heightSizer, pos = (0, 1), flag = wx.ALIGN_CENTER)
  260. # view setup + reset
  261. viewSizer = wx.BoxSizer(wx.HORIZONTAL)
  262. viewSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY,
  263. label = _("Look:")),
  264. flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL,
  265. border = 5)
  266. here = wx.ToggleButton(panel, id = wx.ID_ANY, label = _("here"))
  267. here.Bind(wx.EVT_TOGGLEBUTTON, self.OnLookAt)
  268. here.SetName('here')
  269. viewSizer.Add(item = here, flag = wx.TOP|wx.BOTTOM|wx.LEFT|wx.ALIGN_CENTER_VERTICAL,
  270. border = 5)
  271. center = wx.Button(panel, id = wx.ID_ANY, label = _("center"))
  272. center.Bind(wx.EVT_BUTTON, self.OnLookAt)
  273. center.SetName('center')
  274. viewSizer.Add(item = center, flag = wx.TOP|wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL,
  275. border = 5)
  276. top = wx.Button(panel, id = wx.ID_ANY, label = _("top"))
  277. top.Bind(wx.EVT_BUTTON, self.OnLookAt)
  278. top.SetName('top')
  279. viewSizer.Add(item = top, flag = wx.TOP|wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL,
  280. border = 5)
  281. reset = wx.Button(panel, id = wx.ID_ANY, label = _("reset"))
  282. reset.SetToolTipString(_("Reset to default view"))
  283. reset.Bind(wx.EVT_BUTTON, self.OnResetView)
  284. viewSizer.Add(item = reset, proportion = 0,
  285. flag = wx.TOP|wx.BOTTOM|wx.RIGHT| wx.ALIGN_RIGHT,
  286. border = 5)
  287. gridSizer.AddGrowableCol(2)
  288. gridSizer.Add(item = viewSizer, pos = (4, 0), span = (1, 3),
  289. flag = wx.EXPAND)
  290. # body
  291. boxSizer.Add(item = gridSizer, proportion = 1,
  292. flag = wx.ALL | wx.EXPAND, border = 2)
  293. pageSizer.Add(item = boxSizer, proportion = 0,
  294. flag = wx.EXPAND | wx.ALL,
  295. border = 3)
  296. box = wx.StaticBox(parent = panel, id = wx.ID_ANY,
  297. label = " %s " % (_("Image Appearance")))
  298. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  299. gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
  300. gridSizer.AddGrowableCol(0)
  301. # background color
  302. self.win['view']['background'] = {}
  303. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  304. label = _("Background color:")),
  305. pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
  306. color = csel.ColourSelect(panel, id = wx.ID_ANY,
  307. colour = UserSettings.Get(group = 'nviz', key = 'view',
  308. subkey = ['background', 'color']),
  309. size = globalvar.DIALOG_COLOR_SIZE)
  310. self.win['view']['background']['color'] = color.GetId()
  311. color.Bind(csel.EVT_COLOURSELECT, self.OnBgColor)
  312. gridSizer.Add(item = color, pos = (0, 1))
  313. boxSizer.Add(item = gridSizer, proportion = 1,
  314. flag = wx.ALL | wx.EXPAND, border = 3)
  315. pageSizer.Add(item = boxSizer, proportion = 0,
  316. flag = wx.EXPAND | wx.LEFT | wx.RIGHT,
  317. border = 3)
  318. panel.SetSizer(pageSizer)
  319. return panel
  320. def _createDataPage(self):
  321. """!Create data (surface, vector, volume) settings page"""
  322. self.mainPanelData = ScrolledPanel(parent = self)
  323. self.mainPanelData.SetupScrolling(scroll_x = False)
  324. ## style = fpb.CaptionBarStyle()
  325. ## style.SetCaptionStyle(fpb.CAPTIONBAR_FILLED_RECTANGLE)
  326. ## style.SetFirstColour(wx.Color(250,250,250))
  327. self.foldpanelData = fpb.FoldPanelBar(parent = self.mainPanelData, id = wx.ID_ANY,
  328. style = fpb.FPB_SINGLE_FOLD)
  329. self.foldpanelData.Bind(fpb.EVT_CAPTIONBAR, self.OnPressCaption)
  330. # surface page
  331. self.surfacePanel = self.foldpanelData.AddFoldPanel(_("Surface"), collapsed = False)
  332. self.foldpanelData.AddFoldPanelWindow(self.surfacePanel,
  333. window = self._createSurfacePage(parent = self.surfacePanel), flags = fpb.FPB_ALIGN_WIDTH)
  334. self.EnablePage("surface", enabled = False)
  335. # constant page
  336. constantPanel = self.foldpanelData.AddFoldPanel(_("Constant surface"), collapsed = True)
  337. self.foldpanelData.AddFoldPanelWindow(constantPanel,
  338. window = self._createConstantPage(parent = constantPanel), flags = fpb.FPB_ALIGN_WIDTH)
  339. self.EnablePage("constant", enabled = False)
  340. # vector page
  341. vectorPanel = self.foldpanelData.AddFoldPanel(_("Vector"), collapsed = True)
  342. self.foldpanelData.AddFoldPanelWindow(vectorPanel,
  343. window = self._createVectorPage(parent = vectorPanel), flags = fpb.FPB_ALIGN_WIDTH)
  344. self.EnablePage("vector", enabled = False)
  345. # volume page
  346. volumePanel = self.foldpanelData.AddFoldPanel(_("Volume"), collapsed = True)
  347. self.foldpanelData.AddFoldPanelWindow(volumePanel,
  348. window = self._createVolumePage(parent = volumePanel), flags = fpb.FPB_ALIGN_WIDTH)
  349. self.EnablePage("volume", enabled = False)
  350. ## self.foldpanelData.ApplyCaptionStyleAll(style)
  351. sizer = wx.BoxSizer(wx.VERTICAL)
  352. sizer.Add(self.foldpanelData, proportion = 1, flag = wx.EXPAND)
  353. self.mainPanelData.SetSizer(sizer)
  354. self.mainPanelData.Layout()
  355. self.mainPanelData.Fit()
  356. return self.mainPanelData
  357. def _createAppearancePage(self):
  358. """!Create data (surface, vector, volume) settings page"""
  359. self.mainPanelAppear = ScrolledPanel(parent = self)
  360. self.mainPanelAppear.SetupScrolling(scroll_x = False)
  361. self.foldpanelAppear = fpb.FoldPanelBar(parent = self.mainPanelAppear, id = wx.ID_ANY,
  362. style = fpb.FPB_SINGLE_FOLD)
  363. self.foldpanelAppear.Bind(fpb.EVT_CAPTIONBAR, self.OnPressCaption)
  364. # light page
  365. lightPanel = self.foldpanelAppear.AddFoldPanel(_("Lighting"), collapsed = False)
  366. self.foldpanelAppear.AddFoldPanelWindow(lightPanel,
  367. window = self._createLightPage(parent = lightPanel), flags = fpb.FPB_ALIGN_WIDTH)
  368. # fringe page
  369. fringePanel = self.foldpanelAppear.AddFoldPanel(_("Fringe"), collapsed = True)
  370. self.foldpanelAppear.AddFoldPanelWindow(fringePanel,
  371. window = self._createFringePage(parent = fringePanel), flags = fpb.FPB_ALIGN_WIDTH)
  372. self.EnablePage('fringe', False)
  373. # decoration page
  374. decorationPanel = self.foldpanelAppear.AddFoldPanel(_("Decorations"), collapsed = True)
  375. self.foldpanelAppear.AddFoldPanelWindow(decorationPanel,
  376. window = self._createDecorationPage(parent = decorationPanel), flags = fpb.FPB_ALIGN_WIDTH)
  377. sizer = wx.BoxSizer(wx.VERTICAL)
  378. sizer.Add(self.foldpanelAppear, proportion = 1, flag = wx.EXPAND)
  379. self.mainPanelAppear.SetSizer(sizer)
  380. self.mainPanelAppear.Layout()
  381. self.mainPanelAppear.Fit()
  382. return self.mainPanelAppear
  383. def _createAnalysisPage(self):
  384. """!Create data analysis (cutting planes, ...) page"""
  385. self.mainPanelAnalysis = ScrolledPanel(parent = self)
  386. self.mainPanelAnalysis.SetupScrolling(scroll_x = False)
  387. self.foldpanelAnalysis = fpb.FoldPanelBar(parent = self.mainPanelAnalysis, id = wx.ID_ANY,
  388. style = fpb.FPB_SINGLE_FOLD)
  389. self.foldpanelAnalysis.Bind(fpb.EVT_CAPTIONBAR, self.OnPressCaption)
  390. # cutting planes page
  391. cplanePanel = self.foldpanelAnalysis.AddFoldPanel(_("Cutting planes"), collapsed = False)
  392. self.foldpanelAnalysis.AddFoldPanelWindow(cplanePanel,
  393. window = self._createCPlanePage(parent = cplanePanel), flags = fpb.FPB_ALIGN_WIDTH)
  394. sizer = wx.BoxSizer(wx.VERTICAL)
  395. sizer.Add(self.foldpanelAnalysis, proportion = 1, flag = wx.EXPAND)
  396. self.mainPanelAnalysis.SetSizer(sizer)
  397. self.mainPanelAnalysis.Layout()
  398. self.mainPanelAnalysis.Fit()
  399. return self.mainPanelAnalysis
  400. def _createSurfacePage(self, parent):
  401. """!Create view settings page"""
  402. panel = wx.Panel(parent = parent, id = wx.ID_ANY)
  403. self.page['surface'] = { 'id' : 0,
  404. 'notebook' : self.foldpanelData.GetId() }
  405. pageSizer = wx.BoxSizer(wx.VERTICAL)
  406. self.win['surface'] = {}
  407. # selection
  408. box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  409. label = " %s " % (_("Raster map")))
  410. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  411. rmaps = gselect.Select(parent = panel, type = 'raster',
  412. onPopup = self.GselectOnPopup)
  413. rmaps.GetChildren()[0].Bind(wx.EVT_TEXT, self.OnSetRaster)
  414. self.win['surface']['map'] = rmaps.GetId()
  415. desc = wx.StaticText(parent = panel, id = wx.ID_ANY)
  416. self.win['surface']['desc'] = desc.GetId()
  417. boxSizer.Add(item = rmaps, proportion = 0,
  418. flag = wx.ALL,
  419. border = 3)
  420. boxSizer.Add(item = desc, proportion = 0,
  421. flag = wx.ALL,
  422. border = 3)
  423. pageSizer.Add(item = boxSizer, proportion = 0,
  424. flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  425. border = 3)
  426. #
  427. # draw
  428. #
  429. self.win['surface']['draw'] = {}
  430. box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  431. label = " %s " % (_("Draw")))
  432. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  433. gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
  434. gridSizer.AddGrowableCol(3)
  435. # mode
  436. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  437. label = _("Mode:")),
  438. pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
  439. mode = wx.Choice (parent = panel, id = wx.ID_ANY, size = (-1, -1),
  440. choices = [_("coarse"),
  441. _("fine"),
  442. _("both")])
  443. mode.SetName("selection")
  444. mode.Bind(wx.EVT_CHOICE, self.OnSurfaceMode)
  445. self.win['surface']['draw']['mode'] = mode.GetId()
  446. gridSizer.Add(item = mode, flag = wx.ALIGN_CENTER_VERTICAL|wx.EXPAND,
  447. pos = (0, 1),span = (1, 2))
  448. # shading
  449. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  450. label = _("Shading:")),
  451. pos = (0, 3), flag = wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT)
  452. shade = wx.Choice (parent = panel, id = wx.ID_ANY, size = (-1, -1),
  453. choices = [_("flat"),
  454. _("gouraud")])
  455. shade.SetName("selection")
  456. self.win['surface']['draw']['shading'] = shade.GetId()
  457. shade.Bind(wx.EVT_CHOICE, self.OnSurfaceMode)
  458. gridSizer.Add(item = shade, flag = wx.ALIGN_CENTER_VERTICAL,
  459. pos = (0, 4))
  460. # set to all
  461. all = wx.Button(panel, id = wx.ID_ANY, label = _("Set to all"))
  462. all.SetToolTipString(_("Use draw settings for all loaded surfaces"))
  463. all.Bind(wx.EVT_BUTTON, self.OnSurfaceModeAll)
  464. gridSizer.Add(item = all, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
  465. pos = (3, 4))
  466. self.win['surface']['all'] = all.GetId()
  467. # resolution coarse
  468. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  469. label = _("Coarse mode:")),
  470. pos = (2, 0), flag = wx.ALIGN_CENTER_VERTICAL)
  471. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  472. label = _("resolution:")),
  473. pos = (2, 1), flag = wx.ALIGN_CENTER_VERTICAL)
  474. resC = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
  475. initial = 6,
  476. min = 1,
  477. max = 100)
  478. resC.SetName("value")
  479. self.win['surface']['draw']['res-coarse'] = resC.GetId()
  480. resC.Bind(wx.EVT_SPINCTRL, self.OnSurfaceResolution)
  481. gridSizer.Add(item = resC, pos = (2, 2), flag = wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT)
  482. # Coarse style
  483. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  484. label = _("style:")),
  485. pos = (3, 1), flag = wx.ALIGN_CENTER_VERTICAL)
  486. style = wx.Choice (parent = panel, id = wx.ID_ANY, size = (100, -1),
  487. choices = [_("wire"),
  488. _("surface")])
  489. style.SetName("selection")
  490. self.win['surface']['draw']['style'] = style.GetId()
  491. style.Bind(wx.EVT_CHOICE, self.OnSurfaceMode)
  492. gridSizer.Add(item = style, flag = wx.ALIGN_CENTER_VERTICAL,
  493. pos = (3, 2))
  494. # color
  495. color = csel.ColourSelect(panel, id = wx.ID_ANY,
  496. size = globalvar.DIALOG_COLOR_SIZE)
  497. color.SetName("colour")
  498. color.Bind(csel.EVT_COLOURSELECT, self.OnSurfaceWireColor)
  499. color.SetToolTipString(_("Change wire color"))
  500. self.win['surface']['draw']['wire-color'] = color.GetId()
  501. gridSizer.Add(item = color, flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT,
  502. pos = (3, 3))
  503. # resolution fine
  504. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  505. label = _("Fine mode:")),
  506. pos = (1, 0), flag = wx.ALIGN_CENTER_VERTICAL)
  507. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  508. label = _("resolution:")),
  509. pos = (1, 1), flag = wx.ALIGN_CENTER_VERTICAL)
  510. resF = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
  511. initial = 3,
  512. min = 1,
  513. max = 100)
  514. resF.SetName("value")
  515. self.win['surface']['draw']['res-fine'] = resF.GetId()
  516. resF.Bind(wx.EVT_SPINCTRL, self.OnSurfaceResolution)
  517. gridSizer.Add(item = resF, pos = (1, 2), flag = wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT)
  518. boxSizer.Add(item = gridSizer, proportion = 1,
  519. flag = wx.ALL | wx.EXPAND, border = 3)
  520. pageSizer.Add(item = boxSizer, proportion = 0,
  521. flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  522. border = 3)
  523. #
  524. # surface attributes
  525. #
  526. box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  527. label = " %s " % (_("Surface attributes")))
  528. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  529. gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
  530. gridSizer.AddGrowableCol(2)
  531. # type
  532. self.win['surface']['attr'] = {}
  533. row = 0
  534. for code, attrb in (('color', _("Color")),
  535. ('mask', _("Mask")),
  536. ('transp', _("Transparency")),
  537. ('shine', _("Shininess"))):
  538. self.win['surface'][code] = {}
  539. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  540. label = attrb + ':'),
  541. pos = (row, 0), flag = wx.ALIGN_CENTER_VERTICAL)
  542. use = wx.Choice (parent = panel, id = wx.ID_ANY, size = (100, -1),
  543. choices = [_("map")])
  544. if code not in ('color', 'shine'):
  545. use.Insert(item = _("unset"), pos = 0)
  546. self.win['surface'][code]['required'] = False
  547. else:
  548. self.win['surface'][code]['required'] = True
  549. if code != 'mask':
  550. use.Append(item = _('constant'))
  551. self.win['surface'][code]['use'] = use.GetId()
  552. use.Bind(wx.EVT_CHOICE, self.OnMapObjUse)
  553. gridSizer.Add(item = use, flag = wx.ALIGN_CENTER_VERTICAL,
  554. pos = (row, 1))
  555. map = gselect.Select(parent = panel, id = wx.ID_ANY,
  556. # size = globalvar.DIALOG_GSELECT_SIZE,
  557. size = (-1, -1),
  558. type = "raster")
  559. self.win['surface'][code]['map'] = map.GetId() - 1 # FIXME
  560. map.Bind(wx.EVT_TEXT, self.OnSurfaceMap)
  561. gridSizer.Add(item = map, flag = wx.ALIGN_CENTER_VERTICAL|wx.EXPAND,
  562. pos = (row, 2))
  563. if code == 'color':
  564. value = csel.ColourSelect(panel, id = wx.ID_ANY,
  565. colour = (0,0,0),
  566. size = globalvar.DIALOG_COLOR_SIZE)
  567. value.Bind(csel.EVT_COLOURSELECT, self.OnSurfaceMap)
  568. elif code == 'mask':
  569. value = None
  570. else:
  571. value = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
  572. initial = 0)
  573. if code in ('shine', 'transp'):
  574. value.SetRange(minVal = 0, maxVal = 255)
  575. else:
  576. value.SetRange(minVal = 0, maxVal = 100)
  577. value.Bind(wx.EVT_TEXT, self.OnSurfaceMap)
  578. if value:
  579. self.win['surface'][code]['const'] = value.GetId()
  580. value.Enable(False)
  581. gridSizer.Add(item = value, flag = wx.ALIGN_CENTER_VERTICAL,
  582. pos = (row, 3))
  583. else:
  584. self.win['surface'][code]['const'] = None
  585. self.SetMapObjUseMap(nvizType = 'surface',
  586. attrb = code) # -> enable map / disable constant
  587. row += 1
  588. boxSizer.Add(item = gridSizer, proportion = 0,
  589. flag = wx.ALL | wx.EXPAND, border = 3)
  590. pageSizer.Add(item = boxSizer, proportion = 0,
  591. flag = wx.EXPAND | wx.ALL,
  592. border = 3)
  593. #
  594. # position
  595. #
  596. self.win['surface']['position'] = {}
  597. box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  598. label = " %s " % (_("Position")))
  599. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  600. gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
  601. gridSizer.AddGrowableCol(3)
  602. # position
  603. self._createControl(panel, data = self.win['surface'], name = 'position',
  604. range = (-10000, 10000),
  605. bind = (self.OnSurfacePosition, self.OnSurfacePositionChanged, self.OnSurfacePositionText))
  606. axis = wx.Choice (parent = panel, id = wx.ID_ANY, size = (75, -1),
  607. choices = ["X",
  608. "Y",
  609. "Z"])
  610. reset = wx.Button(panel, id = wx.ID_ANY, label = _("Reset"))
  611. reset.SetToolTipString(_("Reset to default position"))
  612. reset.Bind(wx.EVT_BUTTON, self.OnResetSurfacePosition)
  613. self.win['surface']['position']['reset'] = reset.GetId()
  614. self.win['surface']['position']['axis'] = axis.GetId()
  615. axis.SetSelection(0)
  616. axis.Bind(wx.EVT_CHOICE, self.OnSurfaceAxis)
  617. pslide = self.FindWindowById(self.win['surface']['position']['slider'])
  618. ptext = self.FindWindowById(self.win['surface']['position']['text'])
  619. ptext.SetValue('0')
  620. gridSizer.Add(item = axis, flag = wx.ALIGN_CENTER_VERTICAL, pos = (0, 0))
  621. gridSizer.Add(item = pslide, flag = wx.ALIGN_CENTER_VERTICAL, pos = (0, 1))
  622. gridSizer.Add(item = ptext, flag = wx.ALIGN_CENTER_VERTICAL, pos = (0, 2))
  623. gridSizer.Add(item = reset, flag = wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT, pos = (0, 3))
  624. boxSizer.Add(item = gridSizer, proportion = 1,
  625. flag = wx.ALL | wx.EXPAND, border = 3)
  626. box.SetSizer(boxSizer)
  627. box.Layout()
  628. pageSizer.Add(item = boxSizer, proportion = 1,
  629. flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  630. border = 3)
  631. #
  632. # mask
  633. #
  634. ## box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  635. ## label = " %s " % (_("Mask")))
  636. ## boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  637. ## gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
  638. ##
  639. ## gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  640. ## label = _("Mask zeros:")),
  641. ## pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
  642. ##
  643. ## elev = wx.CheckBox(parent = panel, id = wx.ID_ANY,
  644. ## label = _("by elevation"))
  645. ## elev.Enable(False) # TODO: not implemented yet
  646. ## gridSizer.Add(item = elev, pos = (0, 1))
  647. ##
  648. ## color = wx.CheckBox(parent = panel, id = wx.ID_ANY,
  649. ## label = _("by color"))
  650. ## color.Enable(False) # TODO: not implemented yet
  651. ## gridSizer.Add(item = color, pos = (0, 2))
  652. ##
  653. ## boxSizer.Add(item = gridSizer, proportion = 1,
  654. ## flag = wx.ALL | wx.EXPAND, border = 3)
  655. ## pageSizer.Add(item = boxSizer, proportion = 0,
  656. ## flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  657. ## border = 3)
  658. panel.SetSizer(pageSizer)
  659. panel.Layout()
  660. panel.Fit()
  661. return panel
  662. def _createCPlanePage(self, parent):
  663. """!Create cutting planes page"""
  664. panel = wx.Panel(parent = parent, id = wx.ID_ANY)
  665. self.page['cplane'] = { 'id' : 4,
  666. 'notebook' : self.foldpanelData.GetId() }
  667. self.win['cplane'] = {}
  668. pageSizer = wx.BoxSizer(wx.VERTICAL)
  669. box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  670. label = " %s " % (_("Cutting planes")))
  671. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  672. horSizer = wx.BoxSizer(wx.HORIZONTAL)
  673. # planes
  674. horSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  675. label = _("Active cutting plane:")),
  676. flag = wx.ALIGN_CENTER_VERTICAL|wx.ALL, border = 5)
  677. choice = wx.Choice(parent = panel, id = wx.ID_ANY, choices = [])
  678. self.win['cplane']['planes'] = choice.GetId()
  679. choice.Bind(wx.EVT_CHOICE, self.OnCPlaneSelection)
  680. horSizer.Add(item = choice, flag = wx.ALL, border = 5)
  681. # shading
  682. horSizer.Add(item = wx.Size(-1, -1), proportion = 1)
  683. horSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  684. label = _("Shading:")),
  685. flag = wx.ALIGN_CENTER_VERTICAL|wx.ALL, border = 5)
  686. choices = [_("clear"),
  687. _("top color"),
  688. _("bottom color"),
  689. _("blend"),
  690. _("shaded")]
  691. choice = wx.Choice(parent = panel, id = wx.ID_ANY, choices = choices)
  692. self.win['cplane']['shading'] = choice.GetId()
  693. choice.Bind(wx.EVT_CHOICE, self.OnCPlaneShading)
  694. horSizer.Add(item = choice, flag = wx.ALL, border = 5)
  695. boxSizer.Add(item = horSizer, flag = wx.EXPAND)
  696. gridSizer = wx.GridBagSizer(hgap = 5, vgap = 5)
  697. # XYZ position
  698. self.win['cplane']['position'] = {}
  699. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  700. label = _("X:")),
  701. pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
  702. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  703. label = _("Y:")),
  704. pos = (1, 0), flag = wx.ALIGN_CENTER_VERTICAL)
  705. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  706. label = _("Height:")),
  707. pos = (2, 0), flag = wx.ALIGN_CENTER_VERTICAL)
  708. self._createControl(panel, data = self.win['cplane']['position'], name = 'x', size = 250,
  709. range = (-1000, 1000), sliderHor = True,
  710. bind = (self.OnCPlaneChanging, self.OnCPlaneChangeDone, self.OnCPlaneChangeText))
  711. self.FindWindowById(self.win['cplane']['position']['x']['slider']).SetValue(0)
  712. self.FindWindowById(self.win['cplane']['position']['x']['text']).SetValue(0)
  713. gridSizer.Add(item = self.FindWindowById(self.win['cplane']['position']['x']['slider']),
  714. pos = (0, 1), flag = wx.EXPAND|wx.ALIGN_RIGHT)
  715. gridSizer.Add(item = self.FindWindowById(self.win['cplane']['position']['x']['text']),
  716. pos = (0, 2),
  717. flag = wx.ALIGN_CENTER)
  718. self._createControl(panel, data = self.win['cplane']['position'], name = 'y', size = 250,
  719. range = (-1000, 1000), sliderHor = True,
  720. bind = (self.OnCPlaneChanging, self.OnCPlaneChangeDone, self.OnCPlaneChangeText))
  721. self.FindWindowById(self.win['cplane']['position']['y']['slider']).SetValue(0)
  722. self.FindWindowById(self.win['cplane']['position']['y']['text']).SetValue(0)
  723. gridSizer.Add(item = self.FindWindowById(self.win['cplane']['position']['y']['slider']),
  724. pos = (1, 1), flag = wx.EXPAND|wx.ALIGN_RIGHT)
  725. gridSizer.Add(item = self.FindWindowById(self.win['cplane']['position']['y']['text']),
  726. pos = (1, 2),
  727. flag = wx.ALIGN_CENTER)
  728. posButton = wx.ToggleButton(parent = panel, id = wx.ID_ANY, label = _("On display"))
  729. posButton.Bind(wx.EVT_TOGGLEBUTTON, self.OnCPlanePos)
  730. posButton.SetName('cplaneHere')
  731. self.win['cplane']['cplaneHere'] = posButton.GetId()
  732. gridSizer.Add(item = posButton, pos = (0, 3), span = (2, 1), flag = wx.EXPAND)
  733. self._createControl(panel, data = self.win['cplane']['position'], name = 'z', size = 250,
  734. range = (-1000, 1000), sliderHor = True,
  735. bind = (self.OnCPlaneChanging, self.OnCPlaneChangeDone, self.OnCPlaneChangeText))
  736. self.FindWindowById(self.win['cplane']['position']['z']['slider']).SetValue(0)
  737. self.FindWindowById(self.win['cplane']['position']['z']['text']).SetValue(0)
  738. gridSizer.Add(item = self.FindWindowById(self.win['cplane']['position']['z']['slider']),
  739. pos = (2, 1), flag = wx.EXPAND|wx.ALIGN_RIGHT)
  740. gridSizer.Add(item = self.FindWindowById(self.win['cplane']['position']['z']['text']),
  741. pos = (2, 2),
  742. flag = wx.ALIGN_CENTER)
  743. # rotation
  744. self.win['cplane']['rotation'] = {}
  745. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  746. label = _("Rotation:")),
  747. pos = (3, 0), flag = wx.ALIGN_CENTER_VERTICAL)
  748. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  749. label = _("Tilt:")),
  750. pos = (4, 0), flag = wx.ALIGN_CENTER_VERTICAL)
  751. self._createControl(panel, data = self.win['cplane']['rotation'], name = 'rot', size = 250,
  752. range = (0, 360), sliderHor = True,
  753. bind = (self.OnCPlaneChanging, self.OnCPlaneChangeDone, self.OnCPlaneChangeText))
  754. self.FindWindowById(self.win['cplane']['rotation']['rot']['slider']).SetValue(0)
  755. self.FindWindowById(self.win['cplane']['rotation']['rot']['text']).SetValue(0)
  756. gridSizer.Add(item = self.FindWindowById(self.win['cplane']['rotation']['rot']['slider']),
  757. pos = (3, 1), flag = wx.EXPAND|wx.ALIGN_RIGHT)
  758. gridSizer.Add(item = self.FindWindowById(self.win['cplane']['rotation']['rot']['text']),
  759. pos = (3, 2),
  760. flag = wx.ALIGN_CENTER)
  761. self._createControl(panel, data = self.win['cplane']['rotation'], name = 'tilt', size = 250,
  762. range = (0, 360), sliderHor = True,
  763. bind = (self.OnCPlaneChanging, self.OnCPlaneChangeDone, self.OnCPlaneChangeText))
  764. self.FindWindowById(self.win['cplane']['rotation']['tilt']['slider']).SetValue(0)
  765. self.FindWindowById(self.win['cplane']['rotation']['tilt']['text']).SetValue(0)
  766. gridSizer.Add(item = self.FindWindowById(self.win['cplane']['rotation']['tilt']['slider']),
  767. pos = (4, 1), flag = wx.EXPAND|wx.ALIGN_RIGHT)
  768. gridSizer.Add(item = self.FindWindowById(self.win['cplane']['rotation']['tilt']['text']),
  769. pos = (4, 2),
  770. flag = wx.ALIGN_CENTER)
  771. boxSizer.Add(gridSizer, proportion = 0, flag = wx.EXPAND|wx.ALL, border = 5)
  772. horSizer = wx.BoxSizer(wx.HORIZONTAL)
  773. horSizer.Add(item = wx.Size(-1, -1), proportion = 1, flag = wx.ALL, border = 5)
  774. # reset
  775. reset = wx.Button(parent = panel, id = wx.ID_ANY, label = _("Reset"))
  776. self.win['cplane']['reset'] = reset.GetId()
  777. reset.Bind(wx.EVT_BUTTON, self.OnCPlaneReset)
  778. horSizer.Add(item = reset, flag = wx.ALL, border = 5)
  779. boxSizer.Add(horSizer, proportion = 0, flag = wx.EXPAND)
  780. pageSizer.Add(boxSizer, proportion = 0, flag = wx.EXPAND)
  781. panel.SetSizer(pageSizer)
  782. panel.Fit()
  783. return panel
  784. def _createConstantPage(self, parent):
  785. """!Create constant page"""
  786. panel = wx.Panel(parent = parent, id = wx.ID_ANY)
  787. self.page['constant'] = { 'id' : 1,
  788. 'notebook' : self.foldpanelData.GetId() }
  789. self.win['constant'] = {}
  790. pageSizer = wx.BoxSizer(wx.VERTICAL)
  791. box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  792. label = " %s " % (_("Constant surface")))
  793. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  794. horsizer = wx.BoxSizer(wx.HORIZONTAL)
  795. surface = wx.ComboBox(parent = panel, id = wx.ID_ANY,
  796. style = wx.CB_SIMPLE | wx.CB_READONLY,
  797. choices = [])
  798. self.win['constant']['surface'] = surface.GetId()
  799. surface.Bind(wx.EVT_COMBOBOX, self.OnConstantSelection)
  800. horsizer.Add(surface, proportion = 1, flag = wx.EXPAND|wx.RIGHT, border = 20)
  801. addNew = wx.Button(panel, id = wx.ID_ANY, label = _("New"))
  802. addNew.Bind(wx.EVT_BUTTON, self.OnNewConstant)
  803. self.win['constant']['new'] = addNew.GetId()
  804. delete = wx.Button(panel, id = wx.ID_ANY, label = _("Delete"))
  805. delete.Bind(wx.EVT_BUTTON, self.OnDeleteConstant)
  806. self.win['constant']['delete'] = delete.GetId()
  807. horsizer.Add(item = addNew, proportion = 0, flag = wx.RIGHT|wx.LEFT, border = 3)
  808. horsizer.Add(item = delete, proportion = 0, flag = wx.RIGHT|wx.LEFT, border = 3)
  809. boxSizer.Add(item = horsizer, proportion = 0, flag = wx.ALL|wx.EXPAND,
  810. border = 5)
  811. gridSizer = wx.GridBagSizer(hgap = 5, vgap = 5)
  812. # fine resolution
  813. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  814. label = _("Fine resolution:")),
  815. pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
  816. resF = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
  817. initial = 3,
  818. min = 1,
  819. max = 100)
  820. resF.SetName("value")
  821. self.win['constant']['resolution'] = resF.GetId()
  822. resF.Bind(wx.EVT_SPINCTRL, self.OnSetConstantProp)
  823. gridSizer.Add(item = resF, pos = (0, 1), flag = wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT)
  824. # value
  825. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  826. label = _("Value:")), pos = (1, 0),
  827. flag = wx.ALIGN_CENTER_VERTICAL)
  828. value = wx.SpinCtrl(panel, id = wx.ID_ANY,
  829. min = -1e9, max = 1e9,
  830. size = (65, -1))
  831. self.win['constant']['value'] = value.GetId()
  832. value.Bind(wx.EVT_SPINCTRL, self.OnSetConstantProp)
  833. gridSizer.Add(item = value, pos = (1, 1))
  834. # color
  835. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  836. label = _("Color:")), pos = (2, 0),
  837. flag = wx.ALIGN_CENTER_VERTICAL)
  838. color = csel.ColourSelect(panel, id = wx.ID_ANY,
  839. colour = (0,0,0),
  840. size = globalvar.DIALOG_COLOR_SIZE)
  841. self.win['constant']['color'] = color.GetId()
  842. color.Bind(csel.EVT_COLOURSELECT, self.OnSetConstantProp)
  843. gridSizer.Add(item = color, pos = (2, 1))
  844. boxSizer.Add(item = gridSizer, proportion = 0, flag = wx.ALL,
  845. border = 5)
  846. pageSizer.Add(item = boxSizer, proportion = 0,
  847. flag = wx.EXPAND | wx.ALL,
  848. border = 3)
  849. panel.SetSizer(pageSizer)
  850. panel.Fit()
  851. return panel
  852. def _createVectorPage(self, parent):
  853. """!Create view settings page"""
  854. panel = wx.Panel(parent = parent, id = wx.ID_ANY)
  855. self.page['vector'] = { 'id' : 2,
  856. 'notebook' : self.foldpanelData.GetId() }
  857. pageSizer = wx.BoxSizer(wx.VERTICAL)
  858. self.win['vector'] = {}
  859. # selection
  860. box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  861. label = " %s " % (_("Vector map")))
  862. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  863. vmaps = gselect.Select(parent = panel, type = 'vector',
  864. onPopup = self.GselectOnPopup)
  865. vmaps.GetChildren()[0].Bind(wx.EVT_TEXT, self.OnSetVector)
  866. self.win['vector']['map'] = vmaps.GetId()
  867. desc = wx.StaticText(parent = panel, id = wx.ID_ANY)
  868. self.win['vector']['desc'] = desc.GetId()
  869. boxSizer.Add(item = vmaps, proportion = 0,
  870. flag = wx.ALL,
  871. border = 3)
  872. boxSizer.Add(item = desc, proportion = 0,
  873. flag = wx.ALL,
  874. border = 3)
  875. pageSizer.Add(item = boxSizer, proportion = 0,
  876. flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  877. border = 3)
  878. #
  879. # vector lines
  880. #
  881. self.win['vector']['lines'] = {}
  882. showLines = wx.CheckBox(parent = panel, id = wx.ID_ANY,
  883. label = _("Show vector lines"))
  884. showLines.SetValue(True)
  885. self.win['vector']['lines']['show'] = showLines.GetId()
  886. showLines.Bind(wx.EVT_CHECKBOX, self.OnVectorShow)
  887. pageSizer.Add(item = showLines, proportion = 0,
  888. flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 5)
  889. box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  890. label = " %s " % (_("Vector lines")))
  891. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  892. gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
  893. gridSizer.AddGrowableCol(5)
  894. # width
  895. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  896. label = _("Line:")),
  897. pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
  898. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  899. label = _("width:")),
  900. pos = (0, 1), flag = wx.ALIGN_CENTER_VERTICAL |
  901. wx.ALIGN_RIGHT)
  902. width = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
  903. initial = 1,
  904. min = 0,
  905. max = 100)
  906. width.SetValue(1)
  907. self.win['vector']['lines']['width'] = width.GetId()
  908. width.Bind(wx.EVT_SPINCTRL, self.OnVectorLines)
  909. gridSizer.Add(item = width, pos = (0, 2),
  910. flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT)
  911. # color
  912. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  913. label = _("color:")),
  914. pos = (0, 3), flag = wx.ALIGN_CENTER_VERTICAL |
  915. wx.ALIGN_RIGHT)
  916. color = csel.ColourSelect(panel, id = wx.ID_ANY,
  917. colour = (0,0,0),
  918. size = globalvar.DIALOG_COLOR_SIZE)
  919. self.win['vector']['lines']['color'] = color.GetId()
  920. color.Bind(csel.EVT_COLOURSELECT, self.OnVectorLines)
  921. gridSizer.Add(item = color, pos = (0, 4), flag = wx.ALIGN_CENTER_VERTICAL |
  922. wx.ALIGN_LEFT)
  923. # display
  924. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  925. label = _("Display")),
  926. pos = (1, 0), flag = wx.ALIGN_CENTER_VERTICAL |
  927. wx.ALIGN_LEFT)
  928. display = wx.Choice (parent = panel, id = wx.ID_ANY, size = (-1, -1),
  929. choices = [_("on surface(s):"),
  930. _("flat")])
  931. self.win['vector']['lines']['flat'] = display.GetId()
  932. display.Bind(wx.EVT_CHOICE, self.OnVectorDisplay)
  933. gridSizer.Add(item = display, flag = wx.ALIGN_CENTER_VERTICAL |
  934. wx.ALIGN_LEFT|wx.EXPAND, pos = (1, 1), span = (1,4))
  935. # height
  936. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  937. label = _("Height above surface:")),
  938. pos = (2, 5), flag = wx.ALIGN_BOTTOM|wx.EXPAND)
  939. surface = wx.CheckListBox(parent = panel, id = wx.ID_ANY, size = (-1, 60),
  940. choices = [], style = wx.LB_NEEDED_SB)
  941. surface.Bind(wx.EVT_CHECKLISTBOX, self.OnVectorSurface)
  942. self.win['vector']['lines']['surface'] = surface.GetId()
  943. gridSizer.Add(item = surface,
  944. pos = (2, 0), span = (3, 5),
  945. flag = wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
  946. self._createControl(panel, data = self.win['vector']['lines'], name = 'height', size = -1,
  947. range = (0, 500), sliderHor = True,
  948. bind = (self.OnVectorHeight, self.OnVectorHeightFull, self.OnVectorHeightText))
  949. self.FindWindowById(self.win['vector']['lines']['height']['slider']).SetValue(0)
  950. self.FindWindowById(self.win['vector']['lines']['height']['text']).SetValue(0)
  951. gridSizer.Add(item = self.FindWindowById(self.win['vector']['lines']['height']['slider']),
  952. pos = (3, 5), flag = wx.EXPAND|wx.ALIGN_RIGHT)
  953. gridSizer.Add(item = self.FindWindowById(self.win['vector']['lines']['height']['text']),
  954. pos = (4, 5),
  955. flag = wx.ALIGN_CENTER)
  956. boxSizer.Add(item = gridSizer, proportion = 1,
  957. flag = wx.ALL | wx.EXPAND, border = 3)
  958. pageSizer.Add(item = boxSizer, proportion = 0,
  959. flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  960. border = 3)
  961. #
  962. # vector points
  963. #
  964. self.win['vector']['points'] = {}
  965. showPoints = wx.CheckBox(parent = panel, id = wx.ID_ANY,
  966. label = _("Show vector points"))
  967. showPoints.SetValue(True)
  968. self.win['vector']['points']['show'] = showPoints.GetId()
  969. showPoints.Bind(wx.EVT_CHECKBOX, self.OnVectorShow)
  970. pageSizer.Add(item = showPoints, proportion = 0,
  971. flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 5)
  972. box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  973. label = " %s " % (_("Vector points")))
  974. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  975. gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
  976. gridSizer.AddGrowableCol(5)
  977. # icon size
  978. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  979. label = _("Icon:")),
  980. pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
  981. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  982. label = _("size:")),
  983. pos = (0, 1), flag = wx.ALIGN_CENTER_VERTICAL |
  984. wx.ALIGN_RIGHT)
  985. isize = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
  986. initial = 1,
  987. min = 1,
  988. max = 1e6)
  989. isize.SetName('value')
  990. isize.SetValue(100)
  991. self.win['vector']['points']['size'] = isize.GetId()
  992. isize.Bind(wx.EVT_SPINCTRL, self.OnVectorPoints)
  993. isize.Bind(wx.EVT_TEXT, self.OnVectorPoints)
  994. gridSizer.Add(item = isize, pos = (0, 2),
  995. flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT)
  996. # icon color
  997. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  998. label = _("color:")),
  999. pos = (0, 3), flag = wx.ALIGN_CENTER_VERTICAL |
  1000. wx.ALIGN_RIGHT)
  1001. icolor = csel.ColourSelect(panel, id = wx.ID_ANY,
  1002. size = globalvar.DIALOG_COLOR_SIZE)
  1003. icolor.SetName("color")
  1004. icolor.SetColour((0,0,255))
  1005. self.win['vector']['points']['color'] = icolor.GetId()
  1006. icolor.Bind(csel.EVT_COLOURSELECT, self.OnVectorPoints)
  1007. gridSizer.Add(item = icolor, flag = wx.ALIGN_CENTER_VERTICAL |
  1008. wx.ALIGN_LEFT,
  1009. pos = (0, 4))
  1010. # icon width
  1011. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  1012. label = _("width")),
  1013. pos = (1, 1), flag = wx.ALIGN_CENTER_VERTICAL |
  1014. wx.ALIGN_RIGHT)
  1015. iwidth = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
  1016. initial = 1,
  1017. min = 1,
  1018. max = 1e6)
  1019. iwidth.SetName('value')
  1020. iwidth.SetValue(100)
  1021. self.win['vector']['points']['width'] = iwidth.GetId()
  1022. iwidth.Bind(wx.EVT_SPINCTRL, self.OnVectorPoints)
  1023. iwidth.Bind(wx.EVT_TEXT, self.OnVectorPoints)
  1024. gridSizer.Add(item = iwidth, pos = (1, 2),
  1025. flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT)
  1026. # icon symbol
  1027. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  1028. label = _("symbol:")),
  1029. pos = (1, 3), flag = wx.ALIGN_CENTER_VERTICAL)
  1030. isym = wx.Choice (parent = panel, id = wx.ID_ANY, size = (100, -1),
  1031. choices = UserSettings.Get(group = 'nviz', key = 'vector',
  1032. subkey = ['points', 'marker'], internal = True))
  1033. isym.SetName("selection")
  1034. self.win['vector']['points']['marker'] = isym.GetId()
  1035. isym.Bind(wx.EVT_CHOICE, self.OnVectorPoints)
  1036. gridSizer.Add(item = isym, flag = wx.ALIGN_CENTER_VERTICAL,
  1037. pos = (1, 4))
  1038. # high
  1039. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  1040. label = _("Display on surface(s):")),
  1041. pos = (2, 0), flag = wx.ALIGN_CENTER_VERTICAL,
  1042. span = (1, 5))
  1043. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  1044. label = _("Height above surface:")),
  1045. pos = (3, 5), flag = wx.ALIGN_CENTER_VERTICAL)
  1046. surface = wx.CheckListBox(parent = panel, id = wx.ID_ANY, size = (-1, 60),
  1047. choices = [], style = wx.LB_NEEDED_SB)
  1048. surface.Bind(wx.EVT_CHECKLISTBOX, self.OnVectorSurface)
  1049. self.win['vector']['points']['surface'] = surface.GetId()
  1050. gridSizer.Add(item = surface,
  1051. pos = (3, 0), span = (3, 5),
  1052. flag = wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
  1053. self._createControl(panel, data = self.win['vector']['points'], name = 'height', size = -1,
  1054. range = (0, 500),
  1055. bind = (self.OnVectorHeight, self.OnVectorHeightFull, self.OnVectorHeightText))
  1056. self.FindWindowById(self.win['vector']['points']['height']['slider']).SetValue(0)
  1057. self.FindWindowById(self.win['vector']['points']['height']['text']).SetValue(0)
  1058. gridSizer.Add(item = self.FindWindowById(self.win['vector']['points']['height']['slider']),
  1059. pos = (4, 5),flag = wx.EXPAND|wx.ALIGN_CENTER_VERTICAL)
  1060. gridSizer.Add(item = self.FindWindowById(self.win['vector']['points']['height']['text']),
  1061. pos = (5, 5),
  1062. flag = wx.ALIGN_CENTER)
  1063. boxSizer.Add(item = gridSizer, proportion = 1,
  1064. flag = wx.ALL | wx.EXPAND, border = 3)
  1065. pageSizer.Add(item = boxSizer, proportion = 0,
  1066. flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1067. border = 3)
  1068. panel.SetSizer(pageSizer)
  1069. panel.Fit()
  1070. return panel
  1071. def GselectOnPopup(self, ltype, exclude = False):
  1072. """Update gselect.Select() items"""
  1073. maps = list()
  1074. for layer in self.mapWindow.Map.GetListOfLayers(l_type = ltype, l_active = True):
  1075. maps.append(layer.GetName())
  1076. return maps, exclude
  1077. def _createVolumePage(self, parent):
  1078. """!Create view settings page"""
  1079. panel = wx.Panel(parent = parent, id = wx.ID_ANY)
  1080. self.page['volume'] = { 'id' : 3,
  1081. 'notebook' : self.foldpanelData.GetId() }
  1082. pageSizer = wx.BoxSizer(wx.VERTICAL)
  1083. self.win['volume'] = {}
  1084. # selection
  1085. box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  1086. label = " %s " % (_("3D raster map")))
  1087. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  1088. rmaps = gselect.Select(parent = panel, type = '3d-raster',
  1089. onPopup = self.GselectOnPopup)
  1090. rmaps.GetChildren()[0].Bind(wx.EVT_TEXT, self.OnSetRaster3D)
  1091. self.win['volume']['map'] = rmaps.GetId()
  1092. desc = wx.StaticText(parent = panel, id = wx.ID_ANY)
  1093. self.win['volume']['desc'] = desc.GetId()
  1094. boxSizer.Add(item = rmaps, proportion = 0,
  1095. flag = wx.ALL,
  1096. border = 3)
  1097. boxSizer.Add(item = desc, proportion = 0,
  1098. flag = wx.ALL,
  1099. border = 3)
  1100. pageSizer.Add(item = boxSizer, proportion = 0,
  1101. flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1102. border = 3)
  1103. #
  1104. # draw
  1105. #
  1106. self.win['volume']['draw'] = {}
  1107. box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  1108. label = " %s " % (_("Draw")))
  1109. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  1110. gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
  1111. ## gridSizer.AddGrowableCol(4)
  1112. # mode
  1113. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  1114. label = _("Mode:")),
  1115. pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
  1116. mode = wx.Choice (parent = panel, id = wx.ID_ANY, size = (-1, -1),
  1117. choices = [_("isosurfaces"),
  1118. _("slides")])
  1119. mode.SetSelection(0)
  1120. mode.SetName("selection")
  1121. # mode.Bind(wx.EVT_CHOICE, self.OnSurfaceMode)
  1122. self.win['volume']['draw']['mode'] = mode.GetId()
  1123. gridSizer.Add(item = mode, flag = wx.ALIGN_CENTER_VERTICAL,
  1124. pos = (0, 1))
  1125. # shading
  1126. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  1127. label = _("Shading:")),
  1128. pos = (0, 2), flag = wx.ALIGN_CENTER_VERTICAL)
  1129. shade = wx.Choice (parent = panel, id = wx.ID_ANY, size = (100, -1),
  1130. choices = [_("flat"),
  1131. _("gouraud")])
  1132. shade.SetName("selection")
  1133. self.win['volume']['draw']['shading'] = shade.GetId()
  1134. shade.Bind(wx.EVT_CHOICE, self.OnVolumeIsosurfMode)
  1135. gridSizer.Add(item = shade, flag = wx.ALIGN_CENTER_VERTICAL,
  1136. pos = (0, 3))
  1137. # resolution (mode)
  1138. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  1139. label = _("Resolution:")),
  1140. pos = (0, 4), flag = wx.ALIGN_CENTER_VERTICAL)
  1141. resol = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
  1142. initial = 1,
  1143. min = 1,
  1144. max = 100)
  1145. resol.SetName("value")
  1146. self.win['volume']['draw']['resolution'] = resol.GetId()
  1147. resol.Bind(wx.EVT_SPINCTRL, self.OnVolumeIsosurfResolution)
  1148. resol.Bind(wx.EVT_TEXT, self.OnVolumeIsosurfResolution)
  1149. gridSizer.Add(item = resol, pos = (0, 5))
  1150. boxSizer.Add(item = gridSizer, proportion = 1,
  1151. flag = wx.ALL | wx.EXPAND, border = 3)
  1152. pageSizer.Add(item = boxSizer, proportion = 0,
  1153. flag = wx.EXPAND | wx.ALL,
  1154. border = 3)
  1155. #
  1156. # manage isosurfaces
  1157. #
  1158. box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  1159. label = " %s " % (_("List of isosurfaces")))
  1160. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  1161. gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
  1162. # list
  1163. isolevel = wx.CheckListBox(parent = panel, id = wx.ID_ANY,
  1164. size = (300, 150))
  1165. self.Bind(wx.EVT_CHECKLISTBOX, self.OnVolumeIsosurfCheck, isolevel)
  1166. self.Bind(wx.EVT_LISTBOX, self.OnVolumeIsosurfSelect, isolevel)
  1167. self.win['volume']['isosurfs'] = isolevel.GetId()
  1168. gridSizer.Add(item = isolevel, pos = (0, 0), span = (4, 1))
  1169. # buttons (add, delete, move up, move down)
  1170. btnAdd = wx.Button(parent = panel, id = wx.ID_ADD)
  1171. self.win['volume']['btnIsosurfAdd'] = btnAdd.GetId()
  1172. btnAdd.Bind(wx.EVT_BUTTON, self.OnVolumeIsosurfAdd)
  1173. gridSizer.Add(item = btnAdd,
  1174. pos = (0, 1))
  1175. btnDelete = wx.Button(parent = panel, id = wx.ID_DELETE)
  1176. self.win['volume']['btnIsosurfDelete'] = btnDelete.GetId()
  1177. btnDelete.Bind(wx.EVT_BUTTON, self.OnVolumeIsosurfDelete)
  1178. btnDelete.Enable(False)
  1179. gridSizer.Add(item = btnDelete,
  1180. pos = (1, 1))
  1181. btnMoveUp = wx.Button(parent = panel, id = wx.ID_UP)
  1182. self.win['volume']['btnIsosurfMoveUp'] = btnMoveUp.GetId()
  1183. btnMoveUp.Bind(wx.EVT_BUTTON, self.OnVolumeIsosurfMoveUp)
  1184. btnMoveUp.Enable(False)
  1185. gridSizer.Add(item = btnMoveUp,
  1186. pos = (2, 1))
  1187. btnMoveDown = wx.Button(parent = panel, id = wx.ID_DOWN)
  1188. self.win['volume']['btnIsosurfMoveDown'] = btnMoveDown.GetId()
  1189. btnMoveDown.Bind(wx.EVT_BUTTON, self.OnVolumeIsosurfMoveDown)
  1190. btnMoveDown.Enable(False)
  1191. gridSizer.Add(item = btnMoveDown,
  1192. pos = (3, 1))
  1193. boxSizer.Add(item = gridSizer, proportion = 1,
  1194. flag = wx.ALL | wx.EXPAND, border = 3)
  1195. pageSizer.Add(item = boxSizer, proportion = 0,
  1196. flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1197. border = 3)
  1198. #
  1199. # isosurface attributes
  1200. #
  1201. box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  1202. label = " %s " % (_("Isosurface attributes")))
  1203. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  1204. gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
  1205. self.win['volume']['attr'] = {}
  1206. inout = wx.CheckBox(parent = panel, id = wx.ID_ANY,
  1207. label = _("toggle normal direction"))
  1208. gridSizer.Add(item = inout, pos = (0,0), span = (1,2), flag = wx.ALIGN_CENTER_VERTICAL)
  1209. inout.Bind(wx.EVT_CHECKBOX, self.OnInOutMode)
  1210. self.win['volume']['inout'] = inout.GetId()
  1211. row = 1
  1212. for code, attrb in (('topo', _("Topography level")),
  1213. ('color', _("Color")),
  1214. ('mask', _("Mask")),
  1215. ('transp', _("Transparency")),
  1216. ('shine', _("Shininess"))):
  1217. self.win['volume'][code] = {}
  1218. # label
  1219. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  1220. label = attrb + ':'),
  1221. pos = (row, 0), flag = wx.ALIGN_CENTER_VERTICAL)
  1222. if code != 'topo':
  1223. use = wx.Choice (parent = panel, id = wx.ID_ANY, size = (100, -1),
  1224. choices = [_("map")])
  1225. else:
  1226. use = None
  1227. # check for required properties
  1228. if code not in ('topo', 'color', 'shine'):
  1229. use.Insert(item = _("unset"), pos = 0)
  1230. self.win['volume'][code]['required'] = False
  1231. else:
  1232. self.win['volume'][code]['required'] = True
  1233. if use and code != 'mask':
  1234. use.Append(item = _('constant'))
  1235. if use:
  1236. self.win['volume'][code]['use'] = use.GetId()
  1237. use.Bind(wx.EVT_CHOICE, self.OnMapObjUse)
  1238. gridSizer.Add(item = use, flag = wx.ALIGN_CENTER_VERTICAL,
  1239. pos = (row, 1))
  1240. if code != 'topo':
  1241. map = gselect.Select(parent = panel, id = wx.ID_ANY,
  1242. # size = globalvar.DIALOG_GSELECT_SIZE,
  1243. size = (200, -1),
  1244. type = "grid3")
  1245. self.win['volume'][code]['map'] = map.GetId() - 1 # FIXME
  1246. map.Bind(wx.EVT_TEXT, self.OnVolumeIsosurfMap)
  1247. gridSizer.Add(item = map, flag = wx.ALIGN_CENTER_VERTICAL,
  1248. pos = (row, 2))
  1249. else:
  1250. map = None
  1251. if code == 'color':
  1252. value = csel.ColourSelect(panel, id = wx.ID_ANY,
  1253. colour = (0,0,0),
  1254. size = globalvar.DIALOG_COLOR_SIZE)
  1255. value.Bind(csel.EVT_COLOURSELECT, self.OnVolumeIsosurfMap)
  1256. value.SetName('color')
  1257. elif code == 'mask':
  1258. value = None
  1259. else:
  1260. if code == 'topo':
  1261. size = (200, -1)
  1262. else:
  1263. size = (65, -1)
  1264. if fs:
  1265. value = fs.FloatSpin(parent = panel, id = wx.ID_ANY,
  1266. size = size, increment = 1, value = 0)
  1267. value.SetFormat("%f")
  1268. value.SetDigits(1)
  1269. else:
  1270. value = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = size,
  1271. initial = 0)
  1272. if code == 'topo':
  1273. if fs:
  1274. value.SetRange(min_val = -1e9, max_val = 1e9)
  1275. else:
  1276. value.SetRange(minVal = -1e9, maxVal = 1e9)
  1277. elif code in ('shine', 'transp'):
  1278. if fs:
  1279. value.SetRange(min_val = 0, max_val = 255)
  1280. else:
  1281. value.SetRange(minVal = 0, maxVal = 255)
  1282. if fs:
  1283. value.Bind(fs.EVT_FLOATSPIN, self.OnVolumeIsosurfMap)
  1284. else:
  1285. value.Bind(wx.EVT_SPINCTRL, self.OnVolumeIsosurfMap)
  1286. value.Bind(wx.EVT_TEXT, self.OnVolumeIsosurfMap)
  1287. if value:
  1288. self.win['volume'][code]['const'] = value.GetId()
  1289. if code == 'topo':
  1290. gridSizer.Add(item = value, flag = wx.ALIGN_CENTER_VERTICAL,
  1291. pos = (row, 2))
  1292. else:
  1293. value.Enable(False)
  1294. gridSizer.Add(item = value, flag = wx.ALIGN_CENTER_VERTICAL,
  1295. pos = (row, 3))
  1296. else:
  1297. self.win['volume'][code]['const'] = None
  1298. if code != 'topo':
  1299. self.SetMapObjUseMap(nvizType = 'volume',
  1300. attrb = code) # -> enable map / disable constant
  1301. row += 1
  1302. boxSizer.Add(item = gridSizer, proportion = 1,
  1303. flag = wx.ALL | wx.EXPAND, border = 3)
  1304. pageSizer.Add(item = boxSizer, proportion = 0,
  1305. flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1306. border = 3)
  1307. #
  1308. # position
  1309. #
  1310. self.win['volume']['position'] = {}
  1311. box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  1312. label = " %s " % (_("Position")))
  1313. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  1314. gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
  1315. gridSizer.AddGrowableCol(3)
  1316. # position
  1317. self._createControl(panel, data = self.win['volume'], name = 'position',
  1318. range = (-10000, 10000),
  1319. bind = (self.OnVolumePosition, self.OnVolumePositionChanged, self.OnVolumePositionText))
  1320. axis = wx.Choice (parent = panel, id = wx.ID_ANY, size = (75, -1),
  1321. choices = ["X",
  1322. "Y",
  1323. "Z"])
  1324. reset = wx.Button(panel, id = wx.ID_ANY, label = _("Reset"))
  1325. reset.SetToolTipString(_("Reset to default position"))
  1326. reset.Bind(wx.EVT_BUTTON, self.OnResetVolumePosition)
  1327. self.win['volume']['position']['reset'] = reset.GetId()
  1328. self.win['volume']['position']['axis'] = axis.GetId()
  1329. axis.SetSelection(0)
  1330. axis.Bind(wx.EVT_CHOICE, self.OnVolumeAxis)
  1331. pslide = self.FindWindowById(self.win['volume']['position']['slider'])
  1332. ptext = self.FindWindowById(self.win['volume']['position']['text'])
  1333. ptext.SetValue('0')
  1334. gridSizer.Add(item = axis, flag = wx.ALIGN_CENTER_VERTICAL, pos = (0, 0))
  1335. gridSizer.Add(item = pslide, flag = wx.ALIGN_CENTER_VERTICAL, pos = (0, 1))
  1336. gridSizer.Add(item = ptext, flag = wx.ALIGN_CENTER_VERTICAL, pos = (0, 2))
  1337. gridSizer.Add(item = reset, flag = wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT, pos = (0, 3))
  1338. boxSizer.Add(item = gridSizer, proportion = 1,
  1339. flag = wx.ALL | wx.EXPAND, border = 3)
  1340. pageSizer.Add(item = boxSizer, proportion = 1,
  1341. flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1342. border = 3)
  1343. panel.SetSizer(pageSizer)
  1344. panel.Fit()
  1345. return panel
  1346. def _createLightPage(self, parent):
  1347. """!Create light page"""
  1348. panel = wx.Panel(parent = parent, id = wx.ID_ANY)
  1349. self.page['light'] = { 'id' : 0,
  1350. 'notebook' : self.foldpanelAppear.GetId() }
  1351. self.win['light'] = {}
  1352. pageSizer = wx.BoxSizer(wx.VERTICAL)
  1353. show = wx.CheckBox(parent = panel, id = wx.ID_ANY,
  1354. label = _("Show light model"))
  1355. show.Bind(wx.EVT_CHECKBOX, self.OnShowLightModel)
  1356. show.SetValue(True)
  1357. self._display.showLight = True
  1358. pageSizer.Add(item = show, proportion = 0,
  1359. flag = wx.ALL, border = 3)
  1360. ## surface = wx.CheckBox(parent = panel, id = wx.ID_ANY,
  1361. ## label = _("Follow source viewpoint"))
  1362. ## pageSizer.Add(item = surface, proportion = 0,
  1363. ## flag = wx.ALL, border = 3)
  1364. # position
  1365. box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  1366. label = " %s " % (_("Light source position")))
  1367. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  1368. gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
  1369. posSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
  1370. self._createCompass(panel = panel, sizer = posSizer, type = 'light')
  1371. pos = LightPositionWindow(panel, id = wx.ID_ANY, size = (175, 175),
  1372. mapwindow = self.mapWindow)
  1373. self.win['light']['position'] = pos.GetId()
  1374. posSizer.Add(item = pos,
  1375. pos = (1, 1), flag = wx.ALIGN_CENTER | wx.ALIGN_CENTER_VERTICAL)
  1376. gridSizer.Add(item = posSizer, pos = (0, 0))
  1377. # height
  1378. self._createControl(panel, data = self.win['light'], name = 'z', sliderHor = False,
  1379. range = (0, 100),
  1380. bind = (self.OnLightChange, self.OnLightChanged, self.OnLightChange))
  1381. heightSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
  1382. heightSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Height:")),
  1383. pos = (0, 0), flag = wx.ALIGN_LEFT, span = (1, 2))
  1384. heightSizer.Add(item = self.FindWindowById(self.win['light']['z']['slider']),
  1385. flag = wx.ALIGN_RIGHT, pos = (1, 0))
  1386. heightSizer.Add(item = self.FindWindowById(self.win['light']['z']['text']),
  1387. flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT | wx.TOP |
  1388. wx.BOTTOM | wx.RIGHT, pos = (1, 1))
  1389. gridSizer.Add(item = heightSizer, pos = (0, 2), flag = wx.ALIGN_RIGHT)
  1390. boxSizer.Add(item = gridSizer, proportion = 1,
  1391. flag = wx.ALL | wx.EXPAND, border = 2)
  1392. pageSizer.Add(item = boxSizer, proportion = 0,
  1393. flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1394. border = 3)
  1395. # position
  1396. box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  1397. label = " %s " % (_("Light color and intensity")))
  1398. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  1399. gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
  1400. gridSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Color:")),
  1401. pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
  1402. color = csel.ColourSelect(panel, id = wx.ID_ANY,
  1403. colour = UserSettings.Get(group = 'nviz', key = 'light',
  1404. subkey = 'color'),
  1405. size = globalvar.DIALOG_COLOR_SIZE)
  1406. self.win['light']['color'] = color.GetId()
  1407. color.Bind(csel.EVT_COLOURSELECT, self.OnLightColor)
  1408. gridSizer.Add(item = color, pos = (0, 2))
  1409. gridSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Brightness:")),
  1410. pos = (1, 0), flag = wx.ALIGN_CENTER_VERTICAL)
  1411. self._createControl(panel, data = self.win['light'], name = 'bright', size = 300,
  1412. range = (0, 100),
  1413. bind = (self.OnLightValue, self.OnLightChanged, self.OnLightValue))
  1414. gridSizer.Add(item = self.FindWindowById(self.win['light']['bright']['slider']),
  1415. pos = (1, 1), flag = wx.ALIGN_CENTER_VERTICAL)
  1416. gridSizer.Add(item = self.FindWindowById(self.win['light']['bright']['text']),
  1417. pos = (1, 2),
  1418. flag = wx.ALIGN_CENTER)
  1419. gridSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Ambient:")),
  1420. pos = (2, 0), flag = wx.ALIGN_CENTER_VERTICAL)
  1421. self._createControl(panel, data = self.win['light'], name = 'ambient', size = 300,
  1422. range = (0, 100),
  1423. bind = (self.OnLightValue, self.OnLightChanged, self.OnLightValue))
  1424. gridSizer.Add(item = self.FindWindowById(self.win['light']['ambient']['slider']),
  1425. pos = (2, 1), flag = wx.ALIGN_CENTER_VERTICAL)
  1426. gridSizer.Add(item = self.FindWindowById(self.win['light']['ambient']['text']),
  1427. pos = (2, 2),
  1428. flag = wx.ALIGN_CENTER)
  1429. boxSizer.Add(item = gridSizer, proportion = 1,
  1430. flag = wx.ALL | wx.EXPAND, border = 2)
  1431. pageSizer.Add(item = boxSizer, proportion = 0,
  1432. flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1433. border = 3)
  1434. # reset = wx.Button(panel, id = wx.ID_ANY, label = _("Reset"))
  1435. # reset.SetToolTipString(_("Reset to default view"))
  1436. # # self.win['reset'] = reset.GetId()
  1437. # reset.Bind(wx.EVT_BUTTON, self.OnResetView)
  1438. # viewSizer.Add(item = reset, proportion = 1,
  1439. # flag = wx.EXPAND | wx.ALL | wx.ALIGN_RIGHT,
  1440. # border = 5)
  1441. # gridSizer.AddGrowableCol(3)
  1442. # gridSizer.Add(item = viewSizer, pos = (4, 0), span = (1, 2),
  1443. # flag = wx.EXPAND)
  1444. panel.SetSizer(pageSizer)
  1445. panel.Layout()
  1446. panel.Fit()
  1447. return panel
  1448. def _createFringePage(self, parent):
  1449. """!Create fringe page"""
  1450. panel = wx.Panel(parent = parent, id = wx.ID_ANY)
  1451. self.page['fringe'] = { 'id' : 1,
  1452. 'notebook' : self.foldpanelAppear.GetId() }
  1453. self.win['fringe'] = {}
  1454. pageSizer = wx.BoxSizer(wx.VERTICAL)
  1455. # selection
  1456. rbox = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  1457. label = " %s " % (_("Surface")))
  1458. rboxSizer = wx.StaticBoxSizer(rbox, wx.VERTICAL)
  1459. rmaps = gselect.Select(parent = panel, type = 'raster',
  1460. onPopup = self.GselectOnPopup)
  1461. rmaps.GetChildren()[0].Bind(wx.EVT_TEXT, self.OnSetSurface)
  1462. self.win['fringe']['map'] = rmaps.GetId()
  1463. rboxSizer.Add(item = rmaps, proportion = 0,
  1464. flag = wx.ALL,
  1465. border = 3)
  1466. pageSizer.Add(item = rboxSizer, proportion = 0,
  1467. flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1468. border = 3)
  1469. ebox = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  1470. label = " %s " % (_("Edges with fringe")))
  1471. eboxSizer = wx.StaticBoxSizer(ebox, wx.HORIZONTAL)
  1472. for edge in [(_("N && W"), "nw"),
  1473. (_("N && E"), "ne"),
  1474. (_("S && W"), "sw"),
  1475. (_("S && E"), "se")]:
  1476. chkbox = wx.CheckBox(parent = panel,
  1477. label = edge[0],
  1478. name = edge[1])
  1479. self.win['fringe'][edge[1]] = chkbox.GetId()
  1480. eboxSizer.Add(item = chkbox, proportion = 0,
  1481. flag = wx.ADJUST_MINSIZE | wx.LEFT | wx.RIGHT, border = 5)
  1482. chkbox.Bind(wx.EVT_CHECKBOX, self.OnFringe)
  1483. pageSizer.Add(item = eboxSizer, proportion = 0,
  1484. flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1485. border = 3)
  1486. sbox = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  1487. label = " %s " % (_("Settings")))
  1488. sboxSizer = wx.StaticBoxSizer(sbox, wx.HORIZONTAL)
  1489. gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
  1490. # elevation
  1491. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  1492. label = _("Elevation of fringe from bottom:")),
  1493. pos = (0, 0),
  1494. flag = wx.ALIGN_CENTER_VERTICAL)
  1495. spin = wx.SpinCtrl(parent = panel, id = wx.ID_ANY,
  1496. size = (65, -1), min = -1e6, max = 1e6)
  1497. spin.SetValue(UserSettings.Get(group = 'nviz', key = 'fringe', subkey = 'elev'))
  1498. spin.Bind(wx.EVT_SPINCTRL, self.OnFringe)
  1499. self.win['fringe']['elev'] = spin.GetId()
  1500. gridSizer.Add(item = spin, pos = (0, 1))
  1501. # color
  1502. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  1503. label = _("Color:")),
  1504. pos = (1, 0),
  1505. flag = wx.ALIGN_CENTER_VERTICAL)
  1506. color = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
  1507. size = globalvar.DIALOG_COLOR_SIZE)
  1508. color.SetColour(UserSettings.Get(group = 'nviz', key = 'fringe',
  1509. subkey = 'color'))
  1510. color.Bind(csel.EVT_COLOURSELECT, self.OnFringe)
  1511. self.win['fringe']['color'] = color.GetId()
  1512. gridSizer.Add(item = color, pos = (1, 1))
  1513. sboxSizer.Add(item = gridSizer, proportion = 1,
  1514. flag = wx.ALL | wx.EXPAND, border = 3)
  1515. pageSizer.Add(item = sboxSizer, proportion = 0,
  1516. flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1517. border = 3)
  1518. panel.SetSizer(pageSizer)
  1519. panel.Layout()
  1520. panel.Fit()
  1521. return panel
  1522. def _createDecorationPage(self, parent):
  1523. """!Create decoration (north arrow, scalebar, legend) page"""
  1524. panel = wx.Panel(parent = parent, id = wx.ID_ANY)
  1525. self.page['decoration'] = { 'id' : 2,
  1526. 'notebook' : self.foldpanelAppear.GetId()}
  1527. self.win['decoration'] = {}
  1528. pageSizer = wx.BoxSizer(wx.VERTICAL)
  1529. #
  1530. # north arrow
  1531. #
  1532. self.win['decoration']['arrow'] = {}
  1533. nabox = wx.StaticBox (parent = panel, id = wx.ID_ANY,
  1534. label = " %s " % (_("North Arrow")))
  1535. naboxSizer = wx.StaticBoxSizer(nabox, wx.VERTICAL)
  1536. gridSizer = wx.GridBagSizer(hgap = 5, vgap = 5)
  1537. # size
  1538. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  1539. label = _("Arrow size (in map units):")),
  1540. pos = (0,0), span = (1, 2), flag = wx.ALIGN_CENTER_VERTICAL)
  1541. sizeSpin = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
  1542. min = 0, max = 1e6, initial = 1000)
  1543. gridSizer.Add(sizeSpin, pos = (0, 2))
  1544. self.win['decoration']['arrow']['size'] = sizeSpin.GetId()
  1545. sizeSpin.Bind(wx.EVT_SPINCTRL, self.OnArrowProp)
  1546. # color
  1547. gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
  1548. label = _("Arrow color:")),
  1549. pos = (1,0), span = (1, 2), flag = wx.ALIGN_CENTER_VERTICAL)
  1550. color = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
  1551. size = globalvar.DIALOG_COLOR_SIZE)
  1552. gridSizer.Add(color, pos = (1, 2))
  1553. self.win['decoration']['arrow']['color'] = color.GetId()
  1554. color.Bind(csel.EVT_COLOURSELECT, self.OnArrowProp)
  1555. # control
  1556. toggle = wx.ToggleButton(parent = panel, id = wx.ID_ANY, label = _("Place arrow"))
  1557. gridSizer.Add(item = toggle, pos = (2, 0))
  1558. toggle.Bind(wx.EVT_TOGGLEBUTTON, self.OnArrowPlacement)
  1559. toggle.SetName('placeArrow')
  1560. delete = wx.Button(parent = panel, id = wx.ID_ANY, label = _("Delete"))
  1561. gridSizer.Add(item = delete, pos = (2, 1))
  1562. delete.Bind(wx.EVT_BUTTON, self.OnArrowDelete)
  1563. naboxSizer.Add(item = gridSizer, proportion = 0, flag = wx.EXPAND, border = 3)
  1564. pageSizer.Add(item = naboxSizer, proportion = 0,
  1565. flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1566. border = 3)
  1567. panel.SetSizer(pageSizer)
  1568. panel.Layout()
  1569. panel.Fit()
  1570. return panel
  1571. def GetLayerData(self, nvizType):
  1572. """!Get nviz data"""
  1573. name = self.FindWindowById(self.win[nvizType]['map']).GetValue()
  1574. if nvizType == 'surface' or nvizType == 'fringe':
  1575. return self.mapWindow.GetLayerByName(name, mapType = 'raster', dataType = 'nviz')
  1576. elif nvizType == 'vector':
  1577. return self.mapWindow.GetLayerByName(name, mapType = 'vector', dataType = 'nviz')
  1578. elif nvizType == 'volume':
  1579. return self.mapWindow.GetLayerByName(name, mapType = '3d-raster', dataType = 'nviz')
  1580. return None
  1581. def OnNewConstant(self, event):
  1582. """!Create new surface with constant value"""
  1583. #TODO settings
  1584. name = self.mapWindow.NewConstant()
  1585. win = self.FindWindowById(self.win['constant']['surface'])
  1586. name = _("constant#") + str(name)
  1587. win.Append(name)
  1588. win.SetStringSelection(name)
  1589. self.OnConstantSelection(None)
  1590. self.EnablePage(name = 'constant', enabled = True)
  1591. self.mapWindow.Refresh(eraseBackground = False)
  1592. # need to update list of surfaces in vector page
  1593. for vtype in ('points', 'lines'):
  1594. checklist = self.FindWindowById(self.win['vector'][vtype]['surface'])
  1595. checklist.Append(name)
  1596. win = self.FindWindowById(self.win['vector']['map'])
  1597. win.SetValue(win.GetValue())
  1598. def OnDeleteConstant(self, event):
  1599. """!Delete selected constant surface"""
  1600. layerIdx = self.FindWindowById(self.win['constant']['surface']).GetSelection()
  1601. if layerIdx == wx.NOT_FOUND:
  1602. return
  1603. name = self.FindWindowById(self.win['constant']['surface']).GetStringSelection()
  1604. self.mapWindow.DeleteConstant(layerIdx)
  1605. win = self.FindWindowById(self.win['constant']['surface'])
  1606. win.Delete(layerIdx)
  1607. if win.IsEmpty():
  1608. win.SetValue("")
  1609. self.EnablePage(name = 'constant', enabled = False)
  1610. else:
  1611. win.SetSelection(0)
  1612. self.OnConstantSelection(None)
  1613. # need to update list of surfaces in vector page
  1614. for vtype in ('points', 'lines'):
  1615. checklist = self.FindWindowById(self.win['vector'][vtype]['surface'])
  1616. checklist.Delete(checklist.FindString(name))
  1617. if self.mapDisplay.statusbarWin['render'].IsChecked():
  1618. self.mapWindow.Refresh(False)
  1619. def OnConstantSelection(self, event):
  1620. """!Constant selected"""
  1621. layerIdx = self.FindWindowById(self.win['constant']['surface']).GetSelection()
  1622. if layerIdx == wx.NOT_FOUND:
  1623. return
  1624. name = _("constant#") + str(layerIdx + 1)
  1625. data = self.mapWindow.constants[layerIdx]
  1626. for attr, value in data['constant'].iteritems():
  1627. if attr == 'color':
  1628. value = self._getColorFromString(value)
  1629. if attr in ('color', 'value', 'resolution'):
  1630. self.FindWindowById(self.win['constant'][attr]).SetValue(value)
  1631. def OnSetConstantProp(self, event):
  1632. """!Change properties (color, value, resolution)
  1633. of currently selected constant surface"""
  1634. layerIdx = self.FindWindowById(self.win['constant']['surface']).GetSelection()
  1635. if layerIdx == wx.NOT_FOUND:
  1636. return
  1637. data = self.mapWindow.constants[layerIdx]
  1638. for attr in ('resolution', 'value'):
  1639. data['constant'][attr] = self.FindWindowById(self.win['constant'][attr]).GetValue()
  1640. data['constant']['color'] = self._getColorString(
  1641. self.FindWindowById(self.win['constant']['color']).GetValue())
  1642. # update properties
  1643. event = wxUpdateProperties(data = data)
  1644. wx.PostEvent(self.mapWindow, event)
  1645. if self.mapDisplay.statusbarWin['render'].IsChecked():
  1646. self.mapWindow.Refresh(False)
  1647. def OnFringe(self, event):
  1648. """!Show/hide fringe"""
  1649. data = self.GetLayerData('fringe')['surface']
  1650. sid = data['object']['id']
  1651. elev = self.FindWindowById(self.win['fringe']['elev']).GetValue()
  1652. color = self.FindWindowById(self.win['fringe']['color']).GetValue()
  1653. self._display.SetFringe(sid, color, elev,
  1654. self.FindWindowById(self.win['fringe']['nw']).IsChecked(),
  1655. self.FindWindowById(self.win['fringe']['ne']).IsChecked(),
  1656. self.FindWindowById(self.win['fringe']['sw']).IsChecked(),
  1657. self.FindWindowById(self.win['fringe']['se']).IsChecked())
  1658. self.mapWindow.Refresh(False)
  1659. def OnScroll(self, event, win, data):
  1660. """!Generic scrolling handler"""
  1661. winName = self.__GetWindowName(win, event.GetId())
  1662. if not winName:
  1663. return
  1664. data[winName] = self.FindWindowById(event.GetId()).GetValue()
  1665. for w in win[winName].itervalues():
  1666. self.FindWindowById(w).SetValue(data[winName])
  1667. event.Skip()
  1668. def AdjustSliderRange(self, slider, value):
  1669. minim, maxim = slider.GetRange()
  1670. if not (minim <= value <= maxim):
  1671. slider.SetRange(min(minim, value), max(maxim, value))
  1672. def _createControl(self, parent, data, name, range, bind = (None, None, None),
  1673. sliderHor = True, size = 200):
  1674. """!Add control (Slider + TextCtrl)"""
  1675. data[name] = dict()
  1676. if sliderHor:
  1677. style = wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | \
  1678. wx.SL_BOTTOM
  1679. sizeW = (size, -1)
  1680. else:
  1681. style = wx.SL_VERTICAL | wx.SL_AUTOTICKS | \
  1682. wx.SL_INVERSE
  1683. sizeW = (-1, size)
  1684. slider = wx.Slider(parent = parent, id = wx.ID_ANY,
  1685. minValue = range[0],
  1686. maxValue = range[1],
  1687. style = style,
  1688. size = sizeW)
  1689. slider.SetName('slider')
  1690. if bind[0]:
  1691. #EVT_SCROLL emits event after slider is released, EVT_SPIN not
  1692. slider.Bind(wx.EVT_SPIN, bind[0])
  1693. if bind[1]:
  1694. slider.Bind(wx.EVT_SCROLL_THUMBRELEASE, bind[1])
  1695. data[name]['slider'] = slider.GetId()
  1696. text = NumTextCtrl(parent = parent, id = wx.ID_ANY, size = (65, -1),
  1697. style = wx.TE_PROCESS_ENTER)
  1698. text.SetName('text')
  1699. if bind[2]:
  1700. text.Bind(wx.EVT_TEXT_ENTER, bind[2])
  1701. text.Bind(wx.EVT_KILL_FOCUS, bind[2])
  1702. data[name]['text'] = text.GetId()
  1703. def _createCompass(self, panel, sizer, type):
  1704. """!Create 'compass' widget for light and view page"""
  1705. w = wx.Button(panel, id = wx.ID_ANY, label = _("W"))
  1706. n = wx.Button(panel, id = wx.ID_ANY, label = _("N"))
  1707. s = wx.Button(panel, id = wx.ID_ANY, label = _("S"))
  1708. e = wx.Button(panel, id = wx.ID_ANY, label = _("E"))
  1709. nw = wx.Button(panel, id = wx.ID_ANY, label = _("NW"))
  1710. ne = wx.Button(panel, id = wx.ID_ANY, label = _("NE"))
  1711. se = wx.Button(panel, id = wx.ID_ANY, label = _("SE"))
  1712. sw = wx.Button(panel, id = wx.ID_ANY, label = _("SW"))
  1713. minWidth = sw.GetTextExtent(sw.GetLabel())[0] + 15
  1714. for win, name in zip((w, n, s, e, nw, ne, se, sw),
  1715. ('w', 'n', 's', 'e', 'nw', 'ne', 'se', 'sw')):
  1716. win.SetMinSize((minWidth, -1))
  1717. win.Bind(wx.EVT_BUTTON, self.OnLookFrom)
  1718. win.SetName(type + '_' + name)
  1719. sizer.Add(item = nw, pos = (0, 0), flag = wx.ALIGN_CENTER)
  1720. sizer.Add(item = n, pos = (0, 1), flag = wx.ALIGN_CENTER)
  1721. sizer.Add(item = ne, pos = (0, 2), flag = wx.ALIGN_CENTER)
  1722. sizer.Add(item = e, pos = (1, 2), flag = wx.ALIGN_CENTER)
  1723. sizer.Add(item = se, pos = (2, 2), flag = wx.ALIGN_CENTER)
  1724. sizer.Add(item = s, pos = (2, 1), flag = wx.ALIGN_CENTER)
  1725. sizer.Add(item = sw, pos = (2, 0), flag = wx.ALIGN_CENTER)
  1726. sizer.Add(item = w, pos = (1, 0), flag = wx.ALIGN_CENTER)
  1727. def __GetWindowName(self, data, id):
  1728. for name in data.iterkeys():
  1729. if type(data[name]) is type({}):
  1730. for win in data[name].itervalues():
  1731. if win == id:
  1732. return name
  1733. else:
  1734. if data[name] == id:
  1735. return name
  1736. return None
  1737. def UpdateSettings(self):
  1738. """!Update view from settings values
  1739. stored in self.mapWindow.view dictionary"""
  1740. for control in ('height',
  1741. 'persp',
  1742. 'twist',
  1743. 'z-exag'):
  1744. for win in self.win['view'][control].itervalues():
  1745. try:
  1746. if control == 'height':
  1747. value = self.mapWindow.iview[control]['value']
  1748. else:
  1749. value = self.mapWindow.view[control]['value']
  1750. except KeyError:
  1751. value = -1
  1752. self.FindWindowById(win).SetValue(value)
  1753. viewWin = self.FindWindowById(self.win['view']['position'])
  1754. x, y = viewWin.UpdatePos(self.mapWindow.view['position']['x'],
  1755. self.mapWindow.view['position']['y'])
  1756. viewWin.Draw(pos = (x, y), scale = True)
  1757. viewWin.Refresh(False)
  1758. color = self._getColorString(self.mapWindow.view['background']['color'])
  1759. self._display.SetBgColor(str(color))
  1760. self.Update()
  1761. self.mapWindow.Refresh(eraseBackground = False)
  1762. self.mapWindow.render['quick'] = False
  1763. self.mapWindow.Refresh(True)
  1764. def OnShowLightModel(self, event):
  1765. """!Show light model"""
  1766. self._display.showLight = event.IsChecked()
  1767. self._display.DrawLightingModel()
  1768. def OnLightChange(self, event):
  1769. """!Position of the light changed"""
  1770. winName = self.__GetWindowName(self.win['light'], event.GetId())
  1771. if not winName:
  1772. return
  1773. value = self.FindWindowById(event.GetId()).GetValue()
  1774. self.mapWindow.light['position']['z'] = value
  1775. for win in self.win['light'][winName].itervalues():
  1776. self.FindWindowById(win).SetValue(value)
  1777. event = wxUpdateLight()
  1778. wx.PostEvent(self.mapWindow, event)
  1779. event.Skip()
  1780. def OnLightChanged(self, event):
  1781. """!Light"""
  1782. self.mapWindow.Refresh(False)
  1783. def OnLightColor(self, event):
  1784. """!Color of the light changed"""
  1785. self.mapWindow.light['color'] = tuple(event.GetValue())
  1786. event = wxUpdateLight(refresh = True)
  1787. wx.PostEvent(self.mapWindow, event)
  1788. event.Skip()
  1789. def OnLightValue(self, event):
  1790. """!Light brightness changed"""
  1791. data = self.mapWindow.light
  1792. self.OnScroll(event, self.win['light'], data)
  1793. event = wxUpdateLight()
  1794. wx.PostEvent(self.mapWindow, event)
  1795. event.Skip()
  1796. def OnBgColor(self, event):
  1797. """!Background color changed"""
  1798. color = event.GetValue()
  1799. self.mapWindow.view['background']['color'] = tuple(color)
  1800. color = str(color[0]) + ':' + str(color[1]) + ':' + str(color[2])
  1801. self._display.SetBgColor(str(color))
  1802. if self.mapDisplay.statusbarWin['render'].IsChecked():
  1803. self.mapWindow.Refresh(False)
  1804. def OnSetSurface(self, event):
  1805. """!Surface selected, currently used for fringes"""
  1806. name = event.GetString()
  1807. try:
  1808. data = self.mapWindow.GetLayerByName(name, mapType = 'raster', dataType = 'nviz')['surface']
  1809. except:
  1810. self.EnablePage('fringe', False)
  1811. return
  1812. layer = self.mapWindow.GetLayerByName(name, mapType = 'raster')
  1813. self.EnablePage('fringe', True)
  1814. def OnSetRaster(self, event):
  1815. """!Raster map selected, update surface page"""
  1816. name = event.GetString()
  1817. try:
  1818. data = self.mapWindow.GetLayerByName(name, mapType = 'raster', dataType = 'nviz')['surface']
  1819. except:
  1820. self.EnablePage('surface', False)
  1821. return
  1822. layer = self.mapWindow.GetLayerByName(name, mapType = 'raster')
  1823. self.EnablePage('surface', True)
  1824. self.UpdateSurfacePage(layer, data, updateName = False)
  1825. def OnSetVector(self, event):
  1826. """!Vector map selected, update properties page"""
  1827. name = event.GetString()
  1828. try:
  1829. data = self.mapWindow.GetLayerByName(name, mapType = 'vector', dataType = 'nviz')['vector']
  1830. except:
  1831. self.EnablePage('vector', False)
  1832. return
  1833. layer = self.mapWindow.GetLayerByName(name, mapType = 'vector')
  1834. self.EnablePage('vector', True)
  1835. self.UpdateVectorPage(layer, data, updateName = False)
  1836. def OnSetRaster3D(self, event):
  1837. """!3D Raster map selected, update surface page"""
  1838. name = event.GetString()
  1839. try:
  1840. data = self.mapWindow.GetLayerByName(name, mapType = '3d-raster', dataType = 'nviz')['volume']
  1841. except:
  1842. self.EnablePage('volume', False)
  1843. return
  1844. layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
  1845. self.EnablePage('volume', True)
  1846. self.UpdateVolumePage(layer, data, updateName = False)
  1847. def OnViewChange(self, event):
  1848. """!Change view, render in quick mode"""
  1849. # find control
  1850. winName = self.__GetWindowName(self.win['view'], event.GetId())
  1851. if not winName:
  1852. return
  1853. value = self.FindWindowById(event.GetId()).GetValue()
  1854. slider = self.FindWindowById(self.win['view'][winName]['slider'])
  1855. self.AdjustSliderRange(slider = slider, value = value)
  1856. if winName == 'height':
  1857. view = self.mapWindow.iview # internal
  1858. else:
  1859. view = self.mapWindow.view
  1860. if winName == 'z-exag' and value >= 0:
  1861. self.PostViewEvent(zExag = True)
  1862. else:
  1863. self.PostViewEvent(zExag = False)
  1864. view[winName]['value'] = value
  1865. for win in self.win['view'][winName].itervalues():
  1866. self.FindWindowById(win).SetValue(value)
  1867. self.mapWindow.render['quick'] = True
  1868. if self.mapDisplay.statusbarWin['render'].IsChecked():
  1869. self.mapWindow.Refresh(False)
  1870. event.Skip()
  1871. def OnViewChanged(self, event):
  1872. """!View changed, render in full resolution"""
  1873. self.mapWindow.render['quick'] = False
  1874. self.mapWindow.Refresh(False)
  1875. self.UpdateSettings()
  1876. try:# when calling event = None
  1877. event.Skip()
  1878. except AttributeError:
  1879. pass
  1880. def OnViewChangedText(self, event):
  1881. """!View changed, render in full resolution"""
  1882. self.mapWindow.render['quick'] = False
  1883. self.OnViewChange(event)
  1884. self.OnViewChanged(None)
  1885. self.Update()
  1886. event.Skip()
  1887. def OnLookAt(self, event):
  1888. """!Look here/center"""
  1889. name = self.FindWindowById(event.GetId()).GetName()
  1890. if name == 'center':
  1891. self._display.LookAtCenter()
  1892. focus = self.mapWindow.iview['focus']
  1893. focus['x'], focus['y'], focus['z'] = self._display.GetFocus()
  1894. self.mapWindow.Refresh(False)
  1895. elif name == 'top':
  1896. self.mapWindow.view['position']['x'] = 0.5
  1897. self.mapWindow.view['position']['y'] = 0.5
  1898. self.PostViewEvent(zExag = True)
  1899. self.UpdateSettings()
  1900. self.mapWindow.Refresh(False)
  1901. else: # here
  1902. if self.FindWindowById(event.GetId()).GetValue():
  1903. self.mapWindow.mouse['use'] = 'lookHere'
  1904. self.mapWindow.SetCursor(self.mapWindow.cursors["cross"])
  1905. else:
  1906. self.mapWindow.mouse['use'] = 'default'
  1907. self.mapWindow.SetCursor(self.mapWindow.cursors['default'])
  1908. def OnResetView(self, event):
  1909. """!Reset to default view (view page)"""
  1910. self.mapWindow.ResetView()
  1911. self.UpdateSettings()
  1912. self.mapWindow.Refresh(False)
  1913. def OnResetSurfacePosition(self, event):
  1914. """!Reset position of surface"""
  1915. for win in self.win['surface']['position'].itervalues():
  1916. if win == self.win['surface']['position']['axis']:
  1917. self.FindWindowById(win).SetSelection(0)
  1918. elif win == self.win['surface']['position']['reset']:
  1919. continue
  1920. else:
  1921. self.FindWindowById(win).SetValue(0)
  1922. data = self.GetLayerData('surface')
  1923. data['surface']['position']['x'] = 0
  1924. data['surface']['position']['y'] = 0
  1925. data['surface']['position']['z'] = 0
  1926. data['surface']['position']['update'] = None
  1927. # update properties
  1928. event = wxUpdateProperties(data = data)
  1929. wx.PostEvent(self.mapWindow, event)
  1930. if self.mapDisplay.statusbarWin['render'].IsChecked():
  1931. self.mapWindow.Refresh(False)
  1932. def OnLookFrom(self, event):
  1933. """!Position of view/light changed by buttons"""
  1934. name = self.FindWindowById(event.GetId()).GetName()
  1935. buttonName = name.split('_')[1]
  1936. if name.split('_')[0] == 'view':
  1937. type = 'view'
  1938. data = self.mapWindow.view
  1939. else:
  1940. type = 'light'
  1941. data = self.mapWindow.light
  1942. if buttonName == 'n': # north
  1943. data['position']['x'] = 0.5
  1944. data['position']['y'] = 0.0
  1945. elif buttonName == 's': # south
  1946. data['position']['x'] = 0.5
  1947. data['position']['y'] = 1.0
  1948. elif buttonName == 'e': # east
  1949. data['position']['x'] = 1.0
  1950. data['position']['y'] = 0.5
  1951. elif buttonName =='w': # west
  1952. data['position']['x'] = 0.0
  1953. data['position']['y'] = 0.5
  1954. elif buttonName == 'nw': # north-west
  1955. data['position']['x'] = 0.0
  1956. data['position']['y'] = 0.0
  1957. elif buttonName == 'ne': # north-east
  1958. data['position']['x'] = 1.0
  1959. data['position']['y'] = 0.0
  1960. elif buttonName == 'se': # south-east
  1961. data['position']['x'] = 1.0
  1962. data['position']['y'] = 1.0
  1963. elif buttonName == 'sw': # south-west
  1964. data['position']['x'] = 0.0
  1965. data['position']['y'] = 1.0
  1966. if type == 'view':
  1967. self.PostViewEvent(zExag = True)
  1968. self.UpdateSettings()
  1969. else:
  1970. event = wxUpdateLight()
  1971. wx.PostEvent(self.mapWindow, event)
  1972. lightWin = self.FindWindowById(self.win['light']['position'])
  1973. x, y = lightWin.UpdatePos(self.mapWindow.light['position']['x'],
  1974. self.mapWindow.light['position']['y'])
  1975. lightWin.Draw(pos = (x, y), scale = True)
  1976. lightWin.Refresh(False)
  1977. self.mapWindow.render['quick'] = False
  1978. self.mapWindow.Refresh(False)
  1979. def OnMapObjUse(self, event):
  1980. """!Set surface attribute -- use -- map/constant"""
  1981. if not self.mapWindow.init:
  1982. return
  1983. wx.Yield()
  1984. # find attribute row
  1985. attrb = self.__GetWindowName(self.win['surface'], event.GetId())
  1986. if not attrb:
  1987. attrb = self.__GetWindowName(self.win['volume'], event.GetId())
  1988. nvizType = 'volume'
  1989. else:
  1990. nvizType = 'surface'
  1991. selection = event.GetSelection()
  1992. if self.win[nvizType][attrb]['required']: # no 'unset'
  1993. selection += 1
  1994. if selection == 0: # unset
  1995. useMap = None
  1996. value = ''
  1997. elif selection == 1: # map
  1998. useMap = True
  1999. value = self.FindWindowById(self.win[nvizType][attrb]['map']).GetValue()
  2000. elif selection == 2: # constant
  2001. useMap = False
  2002. if attrb == 'color':
  2003. value = self.FindWindowById(self.win[nvizType][attrb]['const']).GetColour()
  2004. value = self._getColorString(value)
  2005. else:
  2006. value = self.FindWindowById(self.win[nvizType][attrb]['const']).GetValue()
  2007. self.SetMapObjUseMap(nvizType = nvizType,
  2008. attrb = attrb, map = useMap)
  2009. name = self.FindWindowById(self.win[nvizType]['map']).GetValue()
  2010. if nvizType == 'surface':
  2011. data = self.mapWindow.GetLayerByName(name, mapType = 'raster', dataType = 'nviz')
  2012. data[nvizType]['attribute'][attrb] = { 'map' : useMap,
  2013. 'value' : str(value),
  2014. 'update' : None }
  2015. else: # volume / isosurface
  2016. data = self.mapWindow.GetLayerByName(name, mapType = '3d-raster', dataType = 'nviz')
  2017. list = self.FindWindowById(self.win['volume']['isosurfs'])
  2018. id = list.GetSelection()
  2019. if id != -1:
  2020. data[nvizType]['isosurface'][id][attrb] = { 'map' : useMap,
  2021. 'value' : str(value),
  2022. 'update' : None }
  2023. # update properties
  2024. event = wxUpdateProperties(data = data)
  2025. wx.PostEvent(self.mapWindow, event)
  2026. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2027. self.mapWindow.Refresh(False)
  2028. def EnablePage(self, name, enabled = True):
  2029. """!Enable/disable all widgets on page"""
  2030. for key, item in self.win[name].iteritems():
  2031. if key in ('map', 'surface', 'new','planes'):
  2032. continue
  2033. if type(item) == types.DictType:
  2034. for skey, sitem in self.win[name][key].iteritems():
  2035. if type(sitem) == types.DictType:
  2036. for ssitem in self.win[name][key][skey].itervalues():
  2037. if type(ssitem) == types.IntType:
  2038. self.FindWindowById(ssitem).Enable(enabled)
  2039. else:
  2040. if type(sitem) == types.IntType:
  2041. self.FindWindowById(sitem).Enable(enabled)
  2042. else:
  2043. if type(item) == types.IntType:
  2044. self.FindWindowById(item).Enable(enabled)
  2045. def SetMapObjUseMap(self, nvizType, attrb, map = None):
  2046. """!Update dialog widgets when attribute type changed"""
  2047. if attrb in ('topo', 'color', 'shine'):
  2048. incSel = -1 # decrement selection (no 'unset')
  2049. else:
  2050. incSel = 0
  2051. if nvizType == 'volume' and attrb == 'topo':
  2052. return
  2053. if map is True: # map
  2054. if attrb != 'topo': # changing map topography not allowed
  2055. # not sure why, but here must be disabled both ids, should be fixed!
  2056. self.FindWindowById(self.win[nvizType][attrb]['map'] + 1).Enable(True)
  2057. if self.win[nvizType][attrb]['const']:
  2058. self.FindWindowById(self.win[nvizType][attrb]['const']).Enable(False)
  2059. self.FindWindowById(self.win[nvizType][attrb]['use']).SetSelection(1 + incSel)
  2060. elif map is False: # const
  2061. self.FindWindowById(self.win[nvizType][attrb]['map'] + 1).Enable(False)
  2062. if self.win[nvizType][attrb]['const']:
  2063. self.FindWindowById(self.win[nvizType][attrb]['const']).Enable(True)
  2064. self.FindWindowById(self.win[nvizType][attrb]['use']).SetSelection(2 + incSel)
  2065. else: # unset
  2066. self.FindWindowById(self.win[nvizType][attrb]['use']).SetSelection(0)
  2067. self.FindWindowById(self.win[nvizType][attrb]['map'] + 1).Enable(False)
  2068. if self.win[nvizType][attrb]['const']:
  2069. self.FindWindowById(self.win[nvizType][attrb]['const']).Enable(False)
  2070. def OnSurfaceMap(self, event):
  2071. """!Set surface attribute"""
  2072. if self.vetoGSelectEvt:
  2073. self.vetoGSelectEvt = False
  2074. return
  2075. self.SetMapObjAttrb(nvizType = 'surface', winId = event.GetId())
  2076. def SetMapObjAttrb(self, nvizType, winId):
  2077. """!Set map object (surface/isosurface) attribute (map/constant)"""
  2078. if not self.mapWindow.init:
  2079. return
  2080. attrb = self.__GetWindowName(self.win[nvizType], winId)
  2081. if not attrb:
  2082. return
  2083. if not (nvizType == 'volume' and attrb == 'topo'):
  2084. selection = self.FindWindowById(self.win[nvizType][attrb]['use']).GetSelection()
  2085. if self.win[nvizType][attrb]['required']:
  2086. selection += 1
  2087. if selection == 0: # unset
  2088. useMap = None
  2089. value = ''
  2090. elif selection == 1: # map
  2091. value = self.FindWindowById(self.win[nvizType][attrb]['map']).GetValue()
  2092. useMap = True
  2093. else: # constant
  2094. if attrb == 'color':
  2095. value = self.FindWindowById(self.win[nvizType][attrb]['const']).GetColour()
  2096. # tuple to string
  2097. value = self._getColorString(value)
  2098. else:
  2099. value = self.FindWindowById(self.win[nvizType][attrb]['const']).GetValue()
  2100. useMap = False
  2101. else:
  2102. useMap = None
  2103. value = self.FindWindowById(self.win[nvizType][attrb]['const']).GetValue()
  2104. if not self.pageChanging:
  2105. name = self.FindWindowById(self.win[nvizType]['map']).GetValue()
  2106. if nvizType == 'surface':
  2107. data = self.mapWindow.GetLayerByName(name, mapType = 'raster', dataType = 'nviz')
  2108. data[nvizType]['attribute'][attrb] = { 'map' : useMap,
  2109. 'value' : str(value),
  2110. 'update' : None }
  2111. else:
  2112. data = self.mapWindow.GetLayerByName(name, mapType = '3d-raster', dataType = 'nviz')
  2113. list = self.FindWindowById(self.win['volume']['isosurfs'])
  2114. id = list.GetSelection()
  2115. if id > -1:
  2116. data[nvizType]['isosurface'][id][attrb] = { 'map' : useMap,
  2117. 'value' : str(value),
  2118. 'update' : None }
  2119. if attrb == 'topo':
  2120. list = self.FindWindowById(self.win['volume']['isosurfs'])
  2121. sel = list.GetSelection()
  2122. list.SetString(sel, "%s %.1f" % (_("Level"), value))
  2123. list.Check(sel)
  2124. # update properties
  2125. event = wxUpdateProperties(data = data)
  2126. wx.PostEvent(self.mapWindow, event)
  2127. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2128. self.mapWindow.Refresh(False)
  2129. def OnSurfaceResolution(self, event):
  2130. """!Draw resolution changed"""
  2131. self.SetSurfaceResolution()
  2132. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2133. self.mapWindow.Refresh(False)
  2134. def SetSurfaceResolution(self):
  2135. """!Set draw resolution"""
  2136. coarse = self.FindWindowById(self.win['surface']['draw']['res-coarse']).GetValue()
  2137. fine = self.FindWindowById(self.win['surface']['draw']['res-fine']).GetValue()
  2138. data = self.GetLayerData('surface')
  2139. data['surface']['draw']['resolution'] = { 'coarse' : coarse,
  2140. 'fine' : fine,
  2141. 'update' : None }
  2142. # update properties
  2143. event = wxUpdateProperties(data = data)
  2144. wx.PostEvent(self.mapWindow, event)
  2145. def SetSurfaceMode(self):
  2146. """!Set draw mode"""
  2147. mode = self.FindWindowById(self.win['surface']['draw']['mode']).GetSelection()
  2148. style = self.FindWindowById(self.win['surface']['draw']['style']).GetSelection()
  2149. if style == 0: # wire
  2150. self.FindWindowById(self.win['surface']['draw']['wire-color']).Enable(True)
  2151. elif style == 1: # surface
  2152. self.FindWindowById(self.win['surface']['draw']['wire-color']).Enable(False)
  2153. shade = self.FindWindowById(self.win['surface']['draw']['shading']).GetSelection()
  2154. value, desc = self.mapWindow.nvizDefault.GetDrawMode(mode, style, shade)
  2155. return value, desc
  2156. def OnSurfaceMode(self, event):
  2157. """!Set draw mode"""
  2158. value, desc = self.SetSurfaceMode()
  2159. data = self.GetLayerData('surface')
  2160. data['surface']['draw']['mode'] = { 'value' : value,
  2161. 'desc' : desc,
  2162. 'update' : None }
  2163. # update properties
  2164. event = wxUpdateProperties(data = data)
  2165. wx.PostEvent(self.mapWindow, event)
  2166. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2167. self.mapWindow.Refresh(False)
  2168. def OnSurfaceModeAll(self, event):
  2169. """!Set draw mode (including wire color) for all loaded surfaces"""
  2170. value, desc = self.SetSurfaceMode()
  2171. coarse = self.FindWindowById(self.win['surface']['draw']['res-coarse']).GetValue()
  2172. fine = self.FindWindowById(self.win['surface']['draw']['res-fine']).GetValue()
  2173. color = self.FindWindowById(self.win['surface']['draw']['wire-color']).GetColour()
  2174. cvalue = self._getColorString(color)
  2175. for name in self.mapWindow.GetLayerNames(type = 'raster'):
  2176. data = self.mapWindow.GetLayerByName(name, mapType = 'raster', dataType = 'nviz')
  2177. if not data:
  2178. continue # shouldy no happen
  2179. data['surface']['draw']['all'] = True
  2180. data['surface']['draw']['mode'] = { 'value' : value,
  2181. 'desc' : desc,
  2182. 'update' : None }
  2183. data['surface']['draw']['resolution'] = { 'coarse' : coarse,
  2184. 'fine' : fine,
  2185. 'update' : None }
  2186. data['surface']['draw']['wire-color'] = { 'value' : cvalue,
  2187. 'update' : None }
  2188. # update properties
  2189. event = wxUpdateProperties(data = data)
  2190. wx.PostEvent(self.mapWindow, event)
  2191. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2192. self.mapWindow.Refresh(False)
  2193. def _getColorString(self, color):
  2194. """!change color to R:G:B format"""
  2195. return str(color[0]) + ':' + str(color[1]) + ':' + str(color[2])
  2196. def _getColorFromString(self, color, delim = ':'):
  2197. """!change color from R:G:B format to wx.Color"""
  2198. return wx.Color(*map(int, color.split(delim)))
  2199. def OnSurfaceWireColor(self, event):
  2200. """!Set wire color"""
  2201. data = self.GetLayerData('surface')
  2202. value = self._getColorString(event.GetValue())
  2203. data['surface']['draw']['wire-color'] = { 'value' : value,
  2204. 'update' : None }
  2205. # update properties
  2206. event = wxUpdateProperties(data = data)
  2207. wx.PostEvent(self.mapWindow, event)
  2208. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2209. self.mapWindow.Refresh(False)
  2210. def OnSurfaceAxis(self, event):
  2211. """!Surface position, axis changed"""
  2212. data = self.GetLayerData('surface')
  2213. id = data['surface']['object']['id']
  2214. axis = self.FindWindowById(self.win['surface']['position']['axis']).GetSelection()
  2215. slider = self.FindWindowById(self.win['surface']['position']['slider'])
  2216. text = self.FindWindowById(self.win['surface']['position']['text'])
  2217. x, y, z = self._display.GetSurfacePosition(id)
  2218. if axis == 0: # x
  2219. slider.SetValue(x)
  2220. text.SetValue(x)
  2221. elif axis == 1: # y
  2222. slider.SetValue(y)
  2223. text.SetValue(y)
  2224. else: # z
  2225. slider.SetValue(z)
  2226. text.SetValue(z)
  2227. def OnSurfacePosition(self, event):
  2228. """!Surface position"""
  2229. winName = self.__GetWindowName(self.win['surface'], event.GetId())
  2230. if not winName:
  2231. return
  2232. axis = self.FindWindowById(self.win['surface']['position']['axis']).GetSelection()
  2233. value = self.FindWindowById(event.GetId()).GetValue()
  2234. slider = self.FindWindowById(self.win['surface'][winName]['slider'])
  2235. self.AdjustSliderRange(slider = slider, value = value)
  2236. for win in self.win['surface']['position'].itervalues():
  2237. if win in (self.win['surface']['position']['axis'],
  2238. self.win['surface']['position']['reset']):
  2239. continue
  2240. else:
  2241. self.FindWindowById(win).SetValue(value)
  2242. data = self.GetLayerData('surface')
  2243. id = data['surface']['object']['id']
  2244. x, y, z = self._display.GetSurfacePosition(id)
  2245. if axis == 0: # x
  2246. x = value
  2247. elif axis == 1: # y
  2248. y = value
  2249. else: # z
  2250. z = value
  2251. data['surface']['position']['x'] = x
  2252. data['surface']['position']['y'] = y
  2253. data['surface']['position']['z'] = z
  2254. data['surface']['position']['update'] = None
  2255. # update properties
  2256. event = wxUpdateProperties(data = data)
  2257. wx.PostEvent(self.mapWindow, event)
  2258. self.mapWindow.render['quick'] = True
  2259. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2260. self.mapWindow.Refresh(False)
  2261. # self.UpdatePage('surface')
  2262. def OnSurfacePositionChanged(self, event):
  2263. """!Surface position changed"""
  2264. self.mapWindow.render['quick'] = False
  2265. self.mapWindow.Refresh(False)
  2266. def OnSurfacePositionText(self, event):
  2267. """!Surface position changed by textctrl"""
  2268. self.OnSurfacePosition(event)
  2269. self.OnSurfacePositionChanged(None)
  2270. def UpdateVectorShow(self, vecType, enabled):
  2271. """!Enable/disable lines/points widgets
  2272. @param vecType vector type (lines, points)
  2273. """
  2274. if vecType != 'lines' and vecType != 'points':
  2275. return False
  2276. for win in self.win['vector'][vecType].keys():
  2277. if win == 'show':
  2278. continue
  2279. if type(self.win['vector'][vecType][win]) == type({}):
  2280. for swin in self.win['vector'][vecType][win].keys():
  2281. if enabled:
  2282. self.FindWindowById(self.win['vector'][vecType][win][swin]).Enable(True)
  2283. else:
  2284. self.FindWindowById(self.win['vector'][vecType][win][swin]).Enable(False)
  2285. else:
  2286. if enabled:
  2287. self.FindWindowById(self.win['vector'][vecType][win]).Enable(True)
  2288. else:
  2289. self.FindWindowById(self.win['vector'][vecType][win]).Enable(False)
  2290. return True
  2291. def OnVectorShow(self, event):
  2292. """!Show vector lines/points"""
  2293. winId = event.GetId()
  2294. if winId == self.win['vector']['lines']['show']:
  2295. vecType = 'lines'
  2296. points = False
  2297. else: # points
  2298. vecType = 'points'
  2299. points = True
  2300. checked = event.IsChecked()
  2301. name = self.FindWindowById(self.win['vector']['map']).GetValue()
  2302. item = self.mapWindow.GetLayerByName(name, mapType = 'vector', dataType = 'item')
  2303. data = self.GetLayerData('vector')['vector']
  2304. if checked:
  2305. self.mapWindow.LoadVector(item, points = points)
  2306. else:
  2307. self.mapWindow.UnloadVector(item, points = points)
  2308. self.UpdateVectorShow(vecType, checked)
  2309. if checked:
  2310. try:
  2311. id = data[vecType]['object']['id']
  2312. except KeyError:
  2313. id = -1
  2314. if id > 0:
  2315. self.mapWindow.SetMapObjProperties(item, id, vecType)
  2316. # update properties
  2317. event = wxUpdateProperties(data = data)
  2318. wx.PostEvent(self.mapWindow, event)
  2319. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2320. self.mapWindow.Refresh(False)
  2321. event.Skip()
  2322. def OnVectorDisplay(self, event):
  2323. """!Display vector lines on surface/flat"""
  2324. rasters = self.mapWindow.GetLayerNames('raster')
  2325. if event.GetSelection() == 0: # surface
  2326. if len(rasters) < 1:
  2327. self.FindWindowById(self.win['vector']['lines']['surface']).Enable(False)
  2328. self.FindWindowById(self.win['vector']['lines']['flat']).SetSelection(1)
  2329. return
  2330. self.FindWindowById(self.win['vector']['lines']['surface']).Enable(True)
  2331. # set first found surface
  2332. data = self.GetLayerData('vector')
  2333. data['vector']['lines']['mode']['surface'] = rasters[0]
  2334. self.FindWindowById(self.win['vector']['lines']['surface']).SetStringSelection( \
  2335. rasters[0])
  2336. else: # flat
  2337. self.FindWindowById(self.win['vector']['lines']['surface']).Enable(False)
  2338. self.OnVectorLines(event)
  2339. event.Skip()
  2340. def OnVectorLines(self, event):
  2341. """!Set vector lines mode, apply changes if auto-rendering is enabled"""
  2342. data = self.GetLayerData('vector')
  2343. width = self.FindWindowById(self.win['vector']['lines']['width']).GetValue()
  2344. mode = {}
  2345. if self.FindWindowById(self.win['vector']['lines']['flat']).GetSelection() == 0:
  2346. mode['type'] = 'surface'
  2347. mode['surface'] = {}
  2348. checklist = self.FindWindowById(self.win['vector']['lines']['surface'])
  2349. value = list()
  2350. checked = list()
  2351. for surface in range(checklist.GetCount()):
  2352. value.append(checklist.GetString(surface))
  2353. checked.append(checklist.IsChecked(surface))
  2354. mode['surface']['value'] = value
  2355. mode['surface']['show'] = checked
  2356. else:
  2357. mode['type'] = 'flat'
  2358. for attrb in ('width', 'mode'):
  2359. data['vector']['lines'][attrb]['update'] = None
  2360. data['vector']['lines']['width']['value'] = width
  2361. data['vector']['lines']['mode'] = mode
  2362. color = self.FindWindowById(self.win['vector']['lines']['color']).GetColour()
  2363. if isinstance(color, csel.ColourSelect):
  2364. pass #color picker not yet instantiated
  2365. else:
  2366. color = str(color[0]) + ':' + str(color[1]) + ':' + str(color[2])
  2367. data['vector']['lines']['color']['update'] = None
  2368. data['vector']['lines']['color']['value'] = color
  2369. # update properties
  2370. event = wxUpdateProperties(data = data)
  2371. wx.PostEvent(self.mapWindow, event)
  2372. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2373. self.mapWindow.Refresh(False)
  2374. def OnVectorHeight(self, event):
  2375. id = event.GetId()
  2376. if id in self.win['vector']['lines']['height'].values():
  2377. vtype = 'lines'
  2378. else:
  2379. vtype = 'points'
  2380. value = self.FindWindowById(id).GetValue()
  2381. slider = self.FindWindowById(self.win['vector'][vtype]['height']['slider'])
  2382. self.AdjustSliderRange(slider = slider, value = value)
  2383. for win in self.win['vector'][vtype]['height'].itervalues():
  2384. self.FindWindowById(win).SetValue(value)
  2385. data = self.GetLayerData('vector')
  2386. data['vector'][vtype]['height'] = { 'value' : value,
  2387. 'update' : None }
  2388. # update properties
  2389. event = wxUpdateProperties(data = data)
  2390. wx.PostEvent(self.mapWindow, event)
  2391. self.mapWindow.render['quick'] = True
  2392. self.mapWindow.render['v' + vtype] = True
  2393. self.mapWindow.Refresh(False)
  2394. event.Skip()
  2395. def OnVectorHeightFull(self, event):
  2396. """!Vector height changed, render in full resolution"""
  2397. self.OnVectorHeight(event)
  2398. ## self.OnVectorSurface(event)
  2399. id = event.GetId()
  2400. if id in self.win['vector']['lines']['height'].values():
  2401. vtype = 'lines'
  2402. else:
  2403. vtype = 'points'
  2404. self.mapWindow.render['quick'] = False
  2405. self.mapWindow.render['v' + vtype] = False
  2406. self.mapWindow.Refresh(False)
  2407. def OnVectorHeightText(self, event):
  2408. """!Vector height changed, render in full resolution"""
  2409. # self.OnVectorHeight(event)
  2410. self.OnVectorHeightFull(event)
  2411. def OnVectorSurface(self, event):
  2412. """!Reference surface for vector map (lines/points)"""
  2413. id = event.GetId()
  2414. if id == self.win['vector']['lines']['surface']:
  2415. vtype = 'lines'
  2416. else:
  2417. vtype = 'points'
  2418. checkList = self.FindWindowById(self.win['vector'][vtype]['surface'])
  2419. checked = []
  2420. surfaces = []
  2421. for items in range(checkList.GetCount()):
  2422. checked.append(checkList.IsChecked(items))
  2423. surfaces.append(checkList.GetString(items))
  2424. data = self.GetLayerData('vector')
  2425. data['vector'][vtype]['mode']['surface'] = { 'value' : surfaces,
  2426. 'show' : checked}
  2427. data['vector'][vtype]['mode']['update'] = None
  2428. # update properties
  2429. event = wxUpdateProperties(data = data)
  2430. wx.PostEvent(self.mapWindow, event)
  2431. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2432. self.mapWindow.Refresh(False)
  2433. def OnVectorPoints(self, event):
  2434. """!Set vector points mode, apply changes if auto-rendering is enabled"""
  2435. data = self.GetLayerData('vector')
  2436. size = self.FindWindowById(self.win['vector']['points']['size']).GetValue()
  2437. marker = self.FindWindowById(self.win['vector']['points']['marker']).GetSelection()
  2438. # width = self.FindWindowById(self.win['vector']['points']['width']).GetValue()
  2439. for attrb in ('size', 'marker'):
  2440. data['vector']['points'][attrb]['update'] = None
  2441. data['vector']['points']['size']['value'] = size
  2442. # data['vector']['points']['width']['value'] = width
  2443. data['vector']['points']['marker']['value'] = marker
  2444. color = self.FindWindowById(self.win['vector']['points']['color']).GetColour()
  2445. if isinstance(color, csel.ColourSelect):
  2446. pass #color picker not yet instantiated
  2447. else:
  2448. color = str(color[0]) + ':' + str(color[1]) + ':' + str(color[2])
  2449. data['vector']['points']['color']['update'] = None
  2450. data['vector']['points']['color']['value'] = color
  2451. # update properties
  2452. event = wxUpdateProperties(data = data)
  2453. wx.PostEvent(self.mapWindow, event)
  2454. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2455. self.mapWindow.Refresh(False)
  2456. def UpdateIsosurfButtons(self, list):
  2457. """!Enable/disable buttons 'add', 'delete',
  2458. 'move up', 'move down'"""
  2459. nitems = list.GetCount()
  2460. add = self.parent.FindWindowById(self.win['volume']['btnIsosurfAdd'])
  2461. delete = self.parent.FindWindowById(self.win['volume']['btnIsosurfDelete'])
  2462. moveDown = self.parent.FindWindowById(self.win['volume']['btnIsosurfMoveDown'])
  2463. moveUp = self.parent.FindWindowById(self.win['volume']['btnIsosurfMoveUp'])
  2464. if nitems >= wxnviz.MAX_ISOSURFS:
  2465. # disable add button on max
  2466. add.Enable(False)
  2467. else:
  2468. add.Enable(True)
  2469. if nitems < 1:
  2470. # disable 'delete' if only one item in the lis
  2471. delete.Enable(False)
  2472. else:
  2473. delete.Enable(True)
  2474. if list.GetSelection() >= nitems - 1:
  2475. # disable 'move-down' if last
  2476. moveDown.Enable(False)
  2477. else:
  2478. moveDown.Enable(True)
  2479. if list.GetSelection() < 1:
  2480. # disable 'move-up' if first
  2481. moveUp.Enable(False)
  2482. else:
  2483. moveUp.Enable(True)
  2484. def OnVolumeIsosurfMode(self, event):
  2485. """!Set isosurface draw mode"""
  2486. self.SetIsosurfaceMode(event.GetSelection())
  2487. def SetIsosurfaceMode(self, selection):
  2488. """!Set isosurface draw mode"""
  2489. data = self.GetLayerData('volume')['volume']
  2490. id = data['object']['id']
  2491. mode = 0
  2492. if selection == 0:
  2493. mode |= wxnviz.DM_FLAT
  2494. else:
  2495. mode |= wxnviz.DM_GOURAUD
  2496. self._display.SetIsosurfaceMode(id, mode)
  2497. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2498. self.mapWindow.Refresh(False)
  2499. def OnVolumeIsosurfResolution(self, event):
  2500. """!Set isosurface draw resolution"""
  2501. self.SetIsosurfaceResolution(event.GetInt())
  2502. def SetIsosurfaceResolution(self, res):
  2503. """!Set isosurface draw resolution"""
  2504. data = self.GetLayerData('volume')['volume']
  2505. id = data['object']['id']
  2506. self._display.SetIsosurfaceRes(id, res)
  2507. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2508. self.mapWindow.Refresh(False)
  2509. def OnInOutMode(self, event):
  2510. """!Change isosurfaces mode inout"""
  2511. data = self.GetLayerData('volume')['volume']
  2512. id = data['object']['id']
  2513. isosurfId = self.FindWindowById(self.win['volume']['isosurfs']).GetSelection()
  2514. ret = self._display.SetIsosurfaceInOut(id, isosurfId, event.GetInt())
  2515. if ret == 1:
  2516. data['isosurface'][isosurfId]['inout'] = event.GetInt()
  2517. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2518. self.mapWindow.Refresh(False)
  2519. def OnVolumeIsosurfMap(self, event):
  2520. """!Set surface attribute"""
  2521. if self.vetoGSelectEvt:
  2522. self.vetoGSelectEvt = False
  2523. return
  2524. self.SetMapObjAttrb(nvizType = 'volume', winId = event.GetId())
  2525. def OnVolumeIsosurfCheck(self, event):
  2526. """!Isosurface checked (->load) or unchecked (->unload)"""
  2527. index = event.GetSelection()
  2528. list = self.FindWindowById(self.win['volume']['isosurfs'])
  2529. data = self.GetLayerData('volume')['volume']
  2530. id = data['object']['id']
  2531. isosurfId = event.GetSelection()
  2532. if list.IsChecked(index):
  2533. if 'transp' in data['isosurface'][isosurfId] and\
  2534. data['isosurface'][isosurfId]['transp']['map'] is not None:
  2535. if data['isosurface'][isosurfId]['transp']['map']:
  2536. map = True
  2537. value = data['isosurface'][isosurfId]['transp']['value']
  2538. elif data['isosurface'][isosurfId]['transp']['map'] is not None:
  2539. map = False
  2540. value = data['isosurface'][isosurfId]['transp']['value']
  2541. self._display.SetIsosurfaceTransp(id, isosurfId, map, value)
  2542. else:
  2543. self._display.SetIsosurfaceTransp(id, isosurfId, False, "0")
  2544. else:
  2545. # disable -> make transparent
  2546. self._display.SetIsosurfaceTransp(id, isosurfId, False, "255")
  2547. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2548. self.mapWindow.Refresh(False)
  2549. def OnVolumeIsosurfSelect(self, event):
  2550. """!Isosurface item selected"""
  2551. winUp = self.FindWindowById(self.win['volume']['btnIsosurfMoveUp'])
  2552. winDown = self.FindWindowById(self.win['volume']['btnIsosurfMoveDown'])
  2553. selection = event.GetSelection()
  2554. if selection == -1:
  2555. return
  2556. elif selection == 0:
  2557. winUp.Enable(False)
  2558. if not winDown.IsEnabled():
  2559. winDown.Enable()
  2560. elif selection == self.FindWindowById(event.GetId()).GetCount() - 1:
  2561. winDown.Enable(False)
  2562. if not winUp.IsEnabled():
  2563. winUp.Enable()
  2564. else:
  2565. if not winDown.IsEnabled():
  2566. winDown.Enable()
  2567. if not winUp.IsEnabled():
  2568. winUp.Enable()
  2569. # update dialog
  2570. name = self.FindWindowById(self.win['volume']['map']).GetValue()
  2571. layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
  2572. data = self.GetLayerData('volume')['volume']['isosurface'][selection]
  2573. self.UpdateVolumeIsosurfPage(layer, data)
  2574. def OnVolumeIsosurfAdd(self, event):
  2575. """!Add new isosurface to the list"""
  2576. list = self.FindWindowById(self.win['volume']['isosurfs'])
  2577. level = self.FindWindowById(self.win['volume']['topo']['const']).GetValue()
  2578. sel = list.GetSelection()
  2579. if sel < 0 or sel >= list.GetCount() - 1:
  2580. item = list.Append(item = "%s %s" % (_("Level"), str(level)))
  2581. else:
  2582. list.Insert(item = "%s %s" % (_("Level"), str(level)),
  2583. pos = sel+1) # append
  2584. item = sel + 1
  2585. list.Check(item)
  2586. list.SetSelection(item)
  2587. name = self.FindWindowById(self.win['volume']['map']).GetValue()
  2588. layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
  2589. data = self.GetLayerData('volume')['volume']
  2590. id = data['object']['id']
  2591. # collect properties
  2592. isosurfData = {}
  2593. for attrb in ('topo', 'color', 'mask',
  2594. 'transp', 'shine'):
  2595. if attrb == 'topo':
  2596. isosurfData[attrb] = {}
  2597. win = self.FindWindowById(self.win['volume'][attrb]['const'])
  2598. isosurfData[attrb]['value'] = win.GetValue()
  2599. isosurfData[attrb]['map'] = None
  2600. else:
  2601. uwin = self.FindWindowById(self.win['volume'][attrb]['use'])
  2602. sel = uwin.GetSelection()
  2603. if self.win['volume'][attrb]['required']:
  2604. sel += 1
  2605. if sel == 0: # unset
  2606. continue
  2607. isosurfData[attrb] = {}
  2608. if sel == 1: # map
  2609. isosurfData[attrb]['map'] = True
  2610. vwin = self.FindWindowById(self.win['volume'][attrb]['map'])
  2611. value = vwin.GetValue()
  2612. else: # const
  2613. isosurfData[attrb]['map'] = False
  2614. vwin = self.FindWindowById(self.win['volume'][attrb]['const'])
  2615. if vwin.GetName() == "color":
  2616. value = self._getColorString(vwin.GetValue())
  2617. else:
  2618. value = vwin.GetValue()
  2619. isosurfData[attrb]['value'] = value
  2620. data['isosurface'].insert(item, isosurfData)
  2621. # add isosurface
  2622. self._display.AddIsosurface(id, level)
  2623. # use by default 3d raster map for color
  2624. self._display.SetIsosurfaceColor(id, item, True, str(layer.name))
  2625. # update buttons
  2626. self.UpdateIsosurfButtons(list)
  2627. self.UpdateVolumeIsosurfPage(layer, isosurfData)
  2628. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2629. self.mapWindow.Refresh(False)
  2630. event.Skip()
  2631. def OnVolumeIsosurfDelete(self, event):
  2632. """!Remove isosurface from list"""
  2633. list = self.FindWindowById(self.win['volume']['isosurfs'])
  2634. # remove item from list
  2635. isosurfId = list.GetSelection()
  2636. list.Delete(isosurfId)
  2637. # select last item
  2638. if list.GetCount() > 0:
  2639. list.SetSelection(list.GetCount()-1)
  2640. name = self.FindWindowById(self.win['volume']['map']).GetValue()
  2641. layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
  2642. data = self.GetLayerData('volume')['volume']
  2643. id = data['object']['id']
  2644. # delete isosurface
  2645. del data['isosurface'][isosurfId]
  2646. self._display.DeleteIsosurface(id, isosurfId)
  2647. # update buttons
  2648. self.UpdateIsosurfButtons(list)
  2649. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2650. self.mapWindow.Refresh(False)
  2651. event.Skip()
  2652. def OnVolumeIsosurfMoveUp(self, event):
  2653. """!Move isosurface up in the list"""
  2654. list = self.FindWindowById(self.win['volume']['isosurfs'])
  2655. sel = list.GetSelection()
  2656. if sel < 1:
  2657. return # this should not happen
  2658. name = self.FindWindowById(self.win['volume']['map']).GetValue()
  2659. layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
  2660. data = self.GetLayerData('volume')['volume']
  2661. id = data['object']['id']
  2662. # move item up
  2663. text = list.GetStringSelection()
  2664. list.Insert(item = text, pos = sel-1)
  2665. list.Check(sel-1)
  2666. list.SetSelection(sel-1)
  2667. list.Delete(sel+1)
  2668. data['isosurface'].insert(sel-1, data['isosurface'][sel])
  2669. del data['isosurface'][sel+1]
  2670. self._display.MoveIsosurface(id, sel, True)
  2671. # update buttons
  2672. self.UpdateIsosurfButtons(list)
  2673. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2674. self.mapWindow.Refresh(False)
  2675. event.Skip()
  2676. def OnVolumeIsosurfMoveDown(self, event):
  2677. """!Move isosurface dowm in the list"""
  2678. list = self.FindWindowById(self.win['volume']['isosurfs'])
  2679. sel = list.GetSelection()
  2680. if sel >= list.GetCount() - 1:
  2681. return # this should not happen
  2682. name = self.FindWindowById(self.win['volume']['map']).GetValue()
  2683. layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
  2684. data = self.GetLayerData('volume')['volume']
  2685. id = data['object']['id']
  2686. # move item up
  2687. text = list.GetStringSelection()
  2688. list.Insert(item = text, pos = sel+2)
  2689. list.Check(sel+2)
  2690. list.SetSelection(sel+2)
  2691. list.Delete(sel)
  2692. data['isosurface'].insert(sel+2, data['isosurface'][sel])
  2693. del data['isosurface'][sel]
  2694. self._display.MoveIsosurface(id, sel, False)
  2695. # update buttons
  2696. self.UpdateIsosurfButtons(list)
  2697. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2698. self.mapWindow.Refresh(False)
  2699. event.Skip()
  2700. def OnVolumePositionChanged(self, event):
  2701. """!Volume position changed"""
  2702. self.mapWindow.render['quick'] = False
  2703. self.mapWindow.Refresh(False)
  2704. def OnVolumePosition(self, event):
  2705. """!Volume position"""
  2706. winName = self.__GetWindowName(self.win['volume'], event.GetId())
  2707. if not winName:
  2708. return
  2709. axis = self.FindWindowById(self.win['volume']['position']['axis']).GetSelection()
  2710. value = self.FindWindowById(event.GetId()).GetValue()
  2711. slider = self.FindWindowById(self.win['volume'][winName]['slider'])
  2712. self.AdjustSliderRange(slider = slider, value = value)
  2713. for win in self.win['volume']['position'].itervalues():
  2714. if win in (self.win['volume']['position']['axis'],
  2715. self.win['volume']['position']['reset']):
  2716. continue
  2717. else:
  2718. self.FindWindowById(win).SetValue(value)
  2719. data = self.GetLayerData('volume')
  2720. id = data['volume']['object']['id']
  2721. x, y, z = self._display.GetVolumePosition(id)
  2722. if axis == 0: # x
  2723. x = value
  2724. elif axis == 1: # y
  2725. y = value
  2726. else: # z
  2727. z = value
  2728. data['volume']['position']['x'] = x
  2729. data['volume']['position']['y'] = y
  2730. data['volume']['position']['z'] = z
  2731. data['volume']['position']['update'] = None
  2732. # update properties
  2733. event = wxUpdateProperties(data = data)
  2734. wx.PostEvent(self.mapWindow, event)
  2735. self.mapWindow.render['quick'] = True
  2736. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2737. self.mapWindow.Refresh(False)
  2738. def OnVolumeAxis(self, event):
  2739. """!Volume position, axis changed"""
  2740. data = self.GetLayerData('volume')
  2741. id = data['volume']['object']['id']
  2742. axis = self.FindWindowById(self.win['volume']['position']['axis']).GetSelection()
  2743. slider = self.FindWindowById(self.win['volume']['position']['slider'])
  2744. text = self.FindWindowById(self.win['volume']['position']['text'])
  2745. x, y, z = self._display.GetVolumePosition(id)
  2746. if axis == 0: # x
  2747. slider.SetValue(x)
  2748. text.SetValue(x)
  2749. elif axis == 1: # y
  2750. slider.SetValue(y)
  2751. text.SetValue(y)
  2752. else: # z
  2753. slider.SetValue(z)
  2754. text.SetValue(z)
  2755. def OnVolumePositionText(self, event):
  2756. """!Volume position changed by textctrl"""
  2757. self.OnVolumePosition(event)
  2758. self.OnVolumePositionChanged(None)
  2759. def OnResetVolumePosition(self, event):
  2760. """!Reset position of volume"""
  2761. for win in self.win['volume']['position'].itervalues():
  2762. if win == self.win['volume']['position']['axis']:
  2763. self.FindWindowById(win).SetSelection(0)
  2764. elif win == self.win['volume']['position']['reset']:
  2765. continue
  2766. else:
  2767. self.FindWindowById(win).SetValue(0)
  2768. data = self.GetLayerData('volume')
  2769. data['volume']['position']['x'] = 0
  2770. data['volume']['position']['y'] = 0
  2771. data['volume']['position']['z'] = 0
  2772. data['volume']['position']['update'] = None
  2773. # update properties
  2774. event = wxUpdateProperties(data = data)
  2775. wx.PostEvent(self.mapWindow, event)
  2776. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2777. self.mapWindow.Refresh(False)
  2778. def OnCPlaneSelection(self, event):
  2779. """!Cutting plane selected"""
  2780. plane = self.FindWindowById(self.win['cplane']['planes']).GetStringSelection()
  2781. try:
  2782. planeIndex = int(plane.split()[1])
  2783. self.EnablePage("cplane", enabled = True)
  2784. except:
  2785. planeIndex = -1
  2786. self.EnablePage("cplane", enabled = False)
  2787. self.mapWindow.SelectCPlane(planeIndex)
  2788. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2789. self.mapWindow.Refresh(False)
  2790. self.UpdateCPlanePage(planeIndex)
  2791. def OnCPlaneChanging(self, event):
  2792. """!Cutting plane is changing"""
  2793. plane = self.FindWindowById(self.win['cplane']['planes']).GetStringSelection()
  2794. try:
  2795. planeIndex = int(plane.split()[1])
  2796. except:#TODO disabled page
  2797. planeIndex = -1
  2798. if event.GetId() in (self.win['cplane']['rotation']['rot'].values() +
  2799. self.win['cplane']['rotation']['tilt'].values()):
  2800. action = 'rotation'
  2801. else:
  2802. action = 'position'
  2803. data = self.mapWindow.cplanes[planeIndex][action]
  2804. self.OnScroll(event, self.win['cplane'][action], data)
  2805. self.mapWindow.render['quick'] = True
  2806. event = wxUpdateCPlane(update = (action,), current = planeIndex)
  2807. wx.PostEvent(self.mapWindow, event)
  2808. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2809. self.mapWindow.Refresh(False)
  2810. def OnCPlaneChangeDone(self, event):
  2811. """!Cutting plane change done"""
  2812. self.mapWindow.render['quick'] = False
  2813. if self.mapDisplay.statusbarWin['render'].IsChecked():
  2814. self.mapWindow.Refresh(False)
  2815. def OnCPlaneChangeText(self, event):
  2816. """!Cutting plane changed by textctrl"""
  2817. for axis in ('x', 'y', 'z'):
  2818. if event.GetId() == self.win['cplane']['position'][axis]['text']:
  2819. value = self.FindWindowById(event.GetId()).GetValue()
  2820. slider = self.FindWindowById(self.win['cplane']['position'][axis]['slider'])
  2821. self.AdjustSliderRange(slider = slider, value = value)
  2822. self.OnCPlaneChanging(event = event)
  2823. self.OnCPlaneChangeDone(None)
  2824. def OnCPlaneShading(self, event):
  2825. """!Cutting plane shading changed"""
  2826. shading = self.FindWindowById(self.win['cplane']['shading']).GetSelection()
  2827. plane = self.FindWindowById(self.win['cplane']['planes']).GetStringSelection()
  2828. try:
  2829. planeIndex = int(plane.split()[1])
  2830. except:#TODO disabled page
  2831. planeIndex = -1
  2832. self.mapWindow.cplanes[planeIndex]['shading'] = shading
  2833. event = wxUpdateCPlane(update = ('shading',), current = planeIndex)
  2834. wx.PostEvent(self.mapWindow, event)
  2835. self.OnCPlaneChangeDone(None)
  2836. def OnCPlaneReset(self, event):
  2837. """!Reset current cutting plane"""
  2838. plane = self.FindWindowById(self.win['cplane']['planes']).GetStringSelection()
  2839. try:
  2840. planeIndex = int(plane.split()[1])
  2841. except:#TODO disabled page
  2842. planeIndex = -1
  2843. self.mapWindow.cplanes[planeIndex] = copy.deepcopy(UserSettings.Get(group = 'nviz',
  2844. key = 'cplane'))
  2845. event = wxUpdateCPlane(update = ('position','rotation','shading'), current = planeIndex)
  2846. wx.PostEvent(self.mapWindow, event)
  2847. self.OnCPlaneChangeDone(None)
  2848. self.UpdateCPlanePage(planeIndex)
  2849. def OnCPlanePos(self, event):
  2850. """!Place cutting plane rotation center interactively"""
  2851. self.mapWindow.mouse['use'] = 'cplane'
  2852. self.mapWindow.SetCursor(self.mapWindow.cursors["cross"])
  2853. self.parent.curr_page.maptree.mapdisplay.SetFocus()
  2854. self.parent.curr_page.maptree.mapdisplay.Raise()
  2855. def OnArrowPlacement(self, event):
  2856. """!Place an arrow by clicking on display"""
  2857. if event.GetInt():
  2858. self.mapWindow.mouse['use'] = 'arrow'
  2859. self.mapWindow.SetCursor(self.mapWindow.cursors["cross"])
  2860. else:
  2861. self.mapWindow.mouse['use'] = 'default'
  2862. self.mapWindow.SetCursor(self.mapWindow.cursors["default"])
  2863. def OnArrowDelete(self, event):
  2864. """!Delete arrow"""
  2865. self._display.DeleteArrow()
  2866. self.mapWindow.decoration['arrow']['show'] = False
  2867. self.mapWindow.Refresh(False)
  2868. def OnArrowProp(self, event):
  2869. """!Set arrow properties"""
  2870. color = self.FindWindowById(self.win['decoration']['arrow']['color']).GetValue()
  2871. self.mapWindow.decoration['arrow']['color'] = self._getColorString(color)
  2872. size = self.FindWindowById(self.win['decoration']['arrow']['size']).GetValue()
  2873. self.mapWindow.decoration['arrow']['size'] = size
  2874. if self.mapWindow.decoration['arrow']['show']:
  2875. self._display.SetArrow(self.mapWindow.decoration['arrow']['position']['x'],
  2876. self.mapWindow.decoration['arrow']['position']['y'],
  2877. self.mapWindow.decoration['arrow']['size'],
  2878. self.mapWindow.decoration['arrow']['color'])
  2879. self._display.DrawArrow()
  2880. self.mapWindow.Refresh(False)
  2881. def UpdatePage(self, pageId):
  2882. """!Update dialog (selected page)"""
  2883. self.pageChanging = True
  2884. Debug.msg(1, "NvizToolWindow.UpdatePage(): %s", pageId)
  2885. if pageId == 'view':
  2886. self.SetPage('view')
  2887. hmin = self.mapWindow.iview['height']['min']
  2888. hmax = self.mapWindow.iview['height']['max']
  2889. hval = self.mapWindow.iview['height']['value']
  2890. zmin = self.mapWindow.view['z-exag']['min']
  2891. zmax = self.mapWindow.view['z-exag']['max']
  2892. zval = self.mapWindow.view['z-exag']['value']
  2893. for control in ('slider','text'):
  2894. self.FindWindowById(self.win['view']['height'][control]).SetRange(
  2895. hmin,hmax)
  2896. self.FindWindowById(self.win['view']['z-exag'][control]).SetRange(
  2897. zmin, zmax)
  2898. self.FindWindowById(self.win['view']['height'][control]).SetValue(hval)
  2899. self.FindWindowById(self.win['view']['z-exag'][control]).SetValue(zval)
  2900. self.FindWindowById(self.win['view']['background']['color']).SetColour(\
  2901. self.mapWindow.view['background']['color'])
  2902. tval = self.mapWindow.view['twist']['value']
  2903. pval = self.mapWindow.view['persp']['value']
  2904. for control in ('slider','text'):
  2905. self.FindWindowById(self.win['view']['twist'][control]).SetValue(tval)
  2906. self.FindWindowById(self.win['view']['persp'][control]).SetValue(pval)
  2907. elif pageId in ('surface', 'vector', 'volume'):
  2908. name = self.FindWindowById(self.win[pageId]['map']).GetValue()
  2909. data = self.GetLayerData(pageId)
  2910. if data:
  2911. if pageId == 'surface':
  2912. layer = self.mapWindow.GetLayerByName(name, mapType = 'raster')
  2913. self.UpdateSurfacePage(layer, data['surface'])
  2914. elif pageId == 'vector':
  2915. layer = self.mapWindow.GetLayerByName(name, mapType = 'vector')
  2916. self.UpdateVectorPage(layer, data['vector'])
  2917. elif pageId == 'volume':
  2918. layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
  2919. self.UpdateVolumePage(layer, data['volume'])
  2920. elif pageId == 'light':
  2921. zval = self.mapWindow.light['position']['z']
  2922. bval = self.mapWindow.light['bright']
  2923. aval = self.mapWindow.light['ambient']
  2924. for control in ('slider','text'):
  2925. self.FindWindowById(self.win['light']['z'][control]).SetValue(zval)
  2926. self.FindWindowById(self.win['light']['bright'][control]).SetValue(bval)
  2927. self.FindWindowById(self.win['light']['ambient'][control]).SetValue(aval)
  2928. self.FindWindowById(self.win['light']['color']).SetColour(self.mapWindow.light['color'])
  2929. self.FindWindowById(self.win['light']['position']).PostDraw()
  2930. elif pageId == 'fringe':
  2931. win = self.FindWindowById(self.win['fringe']['map'])
  2932. win.SetValue(self.FindWindowById(self.win['surface']['map']).GetValue())
  2933. elif pageId == 'decoration':
  2934. win = self.FindWindowById(self.win['decoration']['arrow']['size'])
  2935. win.SetValue(self.mapWindow.decoration['arrow']['size'])
  2936. elif pageId == 'constant':
  2937. if self.mapWindow.constants:
  2938. surface = self.FindWindowById(self.win['constant']['surface'])
  2939. for item in self.mapWindow.constants:
  2940. surface.Append(_("constant#") + str(item['constant']['object']['name']))
  2941. surface.SetSelection(0)
  2942. self.OnConstantSelection(None)
  2943. self.EnablePage('constant', True)
  2944. elif pageId == 'cplane':
  2945. count = self._display.GetCPlanesCount()
  2946. choices = [_("None"),]
  2947. for plane in range(count):
  2948. choices.append("%s %i" % (_("Plane"), plane))
  2949. self.FindWindowById(self.win['cplane']['planes']).SetItems(choices)
  2950. self.FindWindowById(self.win['cplane']['planes']).SetSelection(0)
  2951. xyRange, zRange = self._display.GetXYRange(), self._display.GetZRange()
  2952. if xyRange > 0: # GTK warning
  2953. self.FindWindowById(self.win['cplane']['position']['x']['slider']).SetRange(-xyRange/2., xyRange/2.)
  2954. self.FindWindowById(self.win['cplane']['position']['y']['slider']).SetRange(-xyRange/2., xyRange/2.)
  2955. if zRange[0] - zRange[1] > 0:
  2956. self.FindWindowById(self.win['cplane']['position']['z']['slider']).SetRange(zRange[0], zRange[1])
  2957. self.FindWindowById(self.win['cplane']['position']['z']['slider']).SetValue(zRange[0])
  2958. self.FindWindowById(self.win['cplane']['position']['z']['text']).SetValue(zRange[0])
  2959. self.OnCPlaneSelection(None)
  2960. self.Update()
  2961. self.pageChanging = False
  2962. def UpdateCPlanePage(self, index):
  2963. """!Update widgets according to selected clip plane"""
  2964. if index == -1:
  2965. return
  2966. data = self.mapWindow.cplanes[index]
  2967. for widget in ('text', 'slider'):
  2968. for axes in ('x', 'y', 'z'):
  2969. self.FindWindowById(self.win['cplane']['position'][axes][widget]).SetValue(data['position'][axes])
  2970. for each in ('tilt', 'rot'):
  2971. self.FindWindowById(self.win['cplane']['rotation'][each][widget]).SetValue(data['rotation'][each])
  2972. self.FindWindowById(self.win['cplane']['shading']).SetSelection(data['shading'])
  2973. def UpdateSurfacePage(self, layer, data, updateName = True):
  2974. """!Update surface page"""
  2975. ret = gcmd.RunCommand('r.info',
  2976. read = True,
  2977. flags = 'm',
  2978. map = layer.name)
  2979. if ret:
  2980. desc = ret.split('=')[1].rstrip('\n')
  2981. else:
  2982. desc = None
  2983. if updateName:
  2984. self.FindWindowById(self.win['surface']['map']).SetValue(layer.name)
  2985. self.FindWindowById(self.win['surface']['desc']).SetLabel(desc)
  2986. # attributes
  2987. if layer and layer.type == 'raster':
  2988. self.vetoGSelectEvt = True
  2989. self.FindWindowById(self.win['surface']['color']['map']).SetValue(layer.name)
  2990. else:
  2991. self.FindWindowById(self.win['surface']['color']['map']).SetValue('')
  2992. self.SetMapObjUseMap(nvizType = 'surface',
  2993. attrb = 'color', map = True) # -> map
  2994. if 'color' in data['attribute']:
  2995. value = data['attribute']['color']['value']
  2996. if data['attribute']['color']['map']:
  2997. self.FindWindowById(self.win['surface']['color']['map']).SetValue(value)
  2998. else: # constant
  2999. color = map(int, value.split(':'))
  3000. self.FindWindowById(self.win['surface']['color']['const']).SetColour(color)
  3001. self.SetMapObjUseMap(nvizType = 'surface',
  3002. attrb = 'color', map = data['attribute']['color']['map'])
  3003. self.SetMapObjUseMap(nvizType = 'surface',
  3004. attrb = 'shine', map = data['attribute']['shine']['map'])
  3005. value = data['attribute']['shine']['value']
  3006. if data['attribute']['shine']['map']:
  3007. self.FindWindowById(self.win['surface']['shine']['map']).SetValue(value)
  3008. else:
  3009. self.FindWindowById(self.win['surface']['shine']['const']).SetValue(value)
  3010. if 'transp' in data['attribute']:
  3011. value = data['attribute']['transp']['value']
  3012. if data['attribute']['transp']['map']:
  3013. self.FindWindowById(self.win['surface']['color']['map']).SetValue(value)
  3014. else:
  3015. self.FindWindowById(self.win['surface']['transp']['const']).SetValue(value)
  3016. self.SetMapObjUseMap(nvizType = 'surface', attrb = 'transp', map = data['attribute']['transp']['map'])
  3017. else:
  3018. self.SetMapObjUseMap(nvizType = 'surface', attrb = 'transp', map = None)
  3019. #
  3020. # draw
  3021. #
  3022. for control, drawData in data['draw'].iteritems():
  3023. if control == 'all': # skip 'all' property
  3024. continue
  3025. if control == 'resolution':
  3026. self.FindWindowById(self.win['surface']['draw']['res-coarse']).SetValue(drawData['coarse'])
  3027. self.FindWindowById(self.win['surface']['draw']['res-fine']).SetValue(drawData['fine'])
  3028. continue
  3029. if control == 'mode':
  3030. if drawData['desc']['mode'] == 'coarse':
  3031. self.FindWindowById(self.win['surface']['draw']['mode']).SetSelection(0)
  3032. elif drawData['desc']['mode'] == 'fine':
  3033. self.FindWindowById(self.win['surface']['draw']['mode']).SetSelection(1)
  3034. else: # both
  3035. self.FindWindowById(self.win['surface']['draw']['mode']).SetSelection(2)
  3036. if drawData['desc']['style'] == 'wire':
  3037. self.FindWindowById(self.win['surface']['draw']['style']).SetSelection(0)
  3038. else: # surface
  3039. self.FindWindowById(self.win['surface']['draw']['style']).SetSelection(1)
  3040. if drawData['desc']['shading'] == 'flat':
  3041. self.FindWindowById(self.win['surface']['draw']['shading']).SetSelection(0)
  3042. else: # gouraud
  3043. self.FindWindowById(self.win['surface']['draw']['shading']).SetSelection(1)
  3044. continue
  3045. value = drawData['value']
  3046. win = self.FindWindowById(self.win['surface']['draw'][control])
  3047. name = win.GetName()
  3048. if name == "selection":
  3049. win.SetSelection(value)
  3050. elif name == "colour":
  3051. color = map(int, value.split(':'))
  3052. win.SetColour(color)
  3053. else:
  3054. win.SetValue(value)
  3055. #
  3056. # position
  3057. #
  3058. if 'x' in data['position']:
  3059. xval = data['position']['x']
  3060. self.FindWindowById(self.win['surface']['position']['axis']).SetSelection(0)
  3061. for control in ('slider','text'):
  3062. self.FindWindowById(self.win['surface']['position'][control]).SetValue(xval)
  3063. # enable/disable res widget + set draw mode
  3064. self.OnSurfaceMode(event = None)
  3065. def VectorInfo(self, layer):
  3066. """!Get number of points/lines
  3067. @param layer MapLayer instance
  3068. @return num of points/features (expect of points)
  3069. @return None
  3070. """
  3071. vInfo = grass.vector_info_topo(layer.GetName())
  3072. if not vInfo:
  3073. return None
  3074. nprimitives = 0
  3075. for key, value in vInfo.iteritems():
  3076. if key in ('points',
  3077. 'lines',
  3078. 'boundaries',
  3079. 'centroids',
  3080. 'faces',
  3081. 'kernels'):
  3082. nprimitives += value
  3083. return (vInfo['points'], vInfo['lines'], nprimitives, vInfo['map3d'])
  3084. def UpdateVectorPage(self, layer, data, updateName = True):
  3085. """!Update vector page"""
  3086. npoints, nlines, nfeatures, mapIs3D = self.VectorInfo(layer)
  3087. if mapIs3D:
  3088. desc = _("Vector map is 3D")
  3089. enable = False
  3090. else:
  3091. desc = _("Vector map is 2D")
  3092. enable = True
  3093. desc += " - " + _("%(features)d features (%(points)d points)") % \
  3094. { 'features' : nfeatures, 'points' : npoints }
  3095. if updateName:
  3096. self.FindWindowById(self.win['vector']['map']).SetValue(layer.name)
  3097. self.FindWindowById(self.win['vector']['desc']).SetLabel(desc)
  3098. self.FindWindowById(self.win['vector']['lines']['flat']).Enable(enable)
  3099. for v in ('lines', 'points'):
  3100. self.FindWindowById(self.win['vector'][v]['surface']).Enable(enable)
  3101. self.FindWindowById(self.win['vector'][v]['height']['slider']).Enable(enable)
  3102. self.FindWindowById(self.win['vector'][v]['height']['text']).Enable(enable)
  3103. #
  3104. # lines
  3105. #
  3106. showLines = self.FindWindowById(self.win['vector']['lines']['show'])
  3107. if 'object' in data['lines']:
  3108. showLines.SetValue(True)
  3109. else:
  3110. showLines.SetValue(False)
  3111. if nlines > 0:
  3112. showLines.Enable(True)
  3113. else:
  3114. showLines.Enable(False)
  3115. self.UpdateVectorShow('lines',
  3116. showLines.IsChecked())
  3117. width = self.FindWindowById(self.win['vector']['lines']['width'])
  3118. width.SetValue(data['lines']['width']['value'])
  3119. color = self.FindWindowById(self.win['vector']['lines']['color'])
  3120. color.SetValue(map(int, data['lines']['color']['value'].split(':')))
  3121. for vtype in ('lines', 'points'):
  3122. if vtype == 'lines':
  3123. display = self.FindWindowById(self.win['vector']['lines']['flat'])
  3124. if data[vtype]['mode']['type'] == 'flat':
  3125. display.SetSelection(1)
  3126. else:
  3127. display.SetSelection(0)
  3128. if data[vtype]['mode']['type'] == 'surface':
  3129. rasters = self.mapWindow.GetLayerNames('raster')
  3130. constants = self.mapWindow.GetLayerNames('constant')
  3131. surfaces = rasters + constants
  3132. surfaceWin = self.FindWindowById(self.win['vector'][vtype]['surface'])
  3133. surfaceWin.SetItems(surfaces)
  3134. for idx, surface in enumerate(surfaces):
  3135. try:# TODO fix this mess
  3136. selected = data[vtype]['mode']['surface']['show'][idx]
  3137. except (TypeError, IndexError, KeyError):
  3138. selected = False
  3139. surfaceWin.Check(idx, selected)
  3140. for type in ('slider', 'text'):
  3141. win = self.FindWindowById(self.win['vector']['lines']['height'][type])
  3142. win.SetValue(data['lines']['height']['value'])
  3143. #
  3144. # points
  3145. #
  3146. showPoints = self.FindWindowById(self.win['vector']['points']['show'])
  3147. if 'object' in data['points']:
  3148. showPoints.SetValue(True)
  3149. else:
  3150. showPoints.SetValue(False)
  3151. if npoints > 0:
  3152. showPoints.Enable(True)
  3153. else:
  3154. showPoints.Enable(False)
  3155. self.UpdateVectorShow('points',
  3156. showPoints.IsChecked())
  3157. # size, width, marker, color
  3158. for prop in ('size', 'marker', 'color'):
  3159. win = self.FindWindowById(self.win['vector']['points'][prop])
  3160. name = win.GetName()
  3161. if name == 'selection':
  3162. win.SetSelection(data['points'][prop]['value'])
  3163. elif name == 'color':
  3164. color = map(int, data['points'][prop]['value'].split(':'))
  3165. win.SetValue(color)
  3166. else:
  3167. win.SetValue(data['points'][prop]['value'])
  3168. # height
  3169. for type in ('slider', 'text'):
  3170. win = self.FindWindowById(self.win['vector']['points']['height'][type])
  3171. win.SetValue(data['points']['height']['value'])
  3172. def UpdateVolumePage(self, layer, data, updateName = True):
  3173. """!Update volume page"""
  3174. if updateName:
  3175. self.FindWindowById(self.win['volume']['map']).SetValue(layer.name)
  3176. # draw
  3177. for control, idata in data['draw'].iteritems():
  3178. if control == 'all': # skip 'all' property
  3179. continue
  3180. win = self.FindWindowById(self.win['volume']['draw'][control])
  3181. if control == 'shading':
  3182. if data['draw']['shading']['desc'] == 'flat':
  3183. value = 0
  3184. else:
  3185. value = 1
  3186. else:
  3187. value = idata['value']
  3188. if win.GetName() == "selection":
  3189. win.SetSelection(value)
  3190. else:
  3191. win.SetValue(value)
  3192. self.SetIsosurfaceMode(data['draw']['shading']['value'])
  3193. self.SetIsosurfaceResolution(data['draw']['resolution']['value'])
  3194. isobox = self.FindWindowById(self.win['volume']['isosurfs'])
  3195. isosurfaces = []
  3196. for iso in data['isosurface']:
  3197. level = iso['topo']['value']
  3198. isosurfaces.append("%s %s" % (_("Level"), level))
  3199. isobox.Set(isosurfaces)
  3200. isobox.SetChecked(range(len(isosurfaces)))
  3201. if data['isosurface']:
  3202. isobox.SetSelection(0)
  3203. self.UpdateVolumeIsosurfPage(layer, data['isosurface'][0])
  3204. else:
  3205. self.UpdateVolumeIsosurfPage(layer, data['attribute'])
  3206. #
  3207. # position
  3208. #
  3209. if 'x' in data['position']:
  3210. xval = data['position']['x']
  3211. self.FindWindowById(self.win['volume']['position']['axis']).SetSelection(0)
  3212. for control in ('slider','text'):
  3213. self.FindWindowById(self.win['volume']['position'][control]).SetValue(xval)
  3214. def UpdateVolumeIsosurfPage(self, layer, data):
  3215. """!Update dialog -- isosurface attributes"""
  3216. #
  3217. # isosurface attributes
  3218. #
  3219. for attrb in ('topo', 'color', 'mask',
  3220. 'transp', 'shine'):
  3221. # check required first
  3222. if attrb == 'color':
  3223. if layer and layer.type == '3d-raster':
  3224. self.vetoGSelectEvt = True
  3225. self.FindWindowById(self.win['volume'][attrb]['map']).SetValue(layer.name)
  3226. else:
  3227. self.FindWindowById(self.win['volume'][attrb]['map']).SetValue('')
  3228. self.SetMapObjUseMap(nvizType = 'volume',
  3229. attrb = attrb, map = True) # -> map
  3230. #continue
  3231. # skip empty attributes
  3232. if attrb not in data:
  3233. self.SetMapObjUseMap(nvizType = 'volume',
  3234. attrb = attrb, map = None)
  3235. continue
  3236. value = data[attrb]['value']
  3237. if attrb == 'color':
  3238. if data[attrb]['map']:
  3239. self.FindWindowById(self.win['volume'][attrb]['map']).SetValue(value)
  3240. else: # constant
  3241. color = map(int, value.split(':'))
  3242. self.FindWindowById(self.win['volume'][attrb]['const']).SetColour(color)
  3243. else:
  3244. if data[attrb]['map']:
  3245. self.vetoGSelectEvt = True
  3246. win = self.FindWindowById(self.win['volume'][attrb]['map'])
  3247. win.SetValue(value)
  3248. else:
  3249. if value:
  3250. win = self.FindWindowById(self.win['volume'][attrb]['const'])
  3251. win.SetValue(float(value))
  3252. self.SetMapObjUseMap(nvizType = 'volume',
  3253. attrb = attrb, map = data[attrb]['map'])
  3254. # set topo range
  3255. ret = gcmd.RunCommand('r3.info', read = True, flags = 'r', map = layer.name)
  3256. if ret:
  3257. range = []
  3258. for value in ret.strip('\n').split('\n'):
  3259. range.append(value.split('=')[1])
  3260. topo = self.FindWindowById(self.win['volume']['topo']['const'])
  3261. if fs:
  3262. topo.SetRange(min_val = float(range[0]), max_val = float(range[1]))
  3263. else:
  3264. topo.SetRange(minVal = int(range[0]), maxVal = int(range[1]))
  3265. # set inout
  3266. if 'inout' in data:
  3267. self.FindWindowById(self.win['volume']['inout']).SetValue(data['inout'])
  3268. def SetPage(self, name):
  3269. """!Get named page"""
  3270. if name == 'view':
  3271. self.SetSelection(0)
  3272. elif name in ('surface', 'vector', 'volume'):
  3273. self.SetSelection(1)
  3274. else:
  3275. self.SetSelection(2)
  3276. win = self.FindWindowById(self.page[name]['notebook'])
  3277. try:
  3278. win.Expand(win.GetFoldPanel(self.page[name]['id']))
  3279. except AttributeError:
  3280. win.SetSelection(self.page[name]['id'])
  3281. class PositionWindow(wx.Window):
  3282. """!Abstract position control window, see subclasses
  3283. ViewPostionWindow and LightPositionWindow"""
  3284. def __init__(self, parent, mapwindow, id = wx.ID_ANY,
  3285. **kwargs):
  3286. self.mapWindow = mapwindow
  3287. self.quick = True
  3288. wx.Window.__init__(self, parent, id, **kwargs)
  3289. self.SetBackgroundColour("WHITE")
  3290. self.pdc = wx.PseudoDC()
  3291. self.pdc.SetBrush(wx.Brush(colour = 'dark green', style = wx.SOLID))
  3292. self.pdc.SetPen(wx.Pen(colour = 'dark green', width = 2, style = wx.SOLID))
  3293. self.Bind(wx.EVT_ERASE_BACKGROUND, lambda x: None)
  3294. self.Bind(wx.EVT_PAINT, self.OnPaint)
  3295. # self.Bind(wx.EVT_MOTION, self.OnMouse)
  3296. self.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouse)
  3297. def Draw(self, pos, scale = False):
  3298. w, h = self.GetClientSize()
  3299. x, y = pos
  3300. if scale:
  3301. x = x * w
  3302. y = y * h
  3303. self.pdc.Clear()
  3304. self.pdc.BeginDrawing()
  3305. self.pdc.DrawLine(w / 2, h / 2, x, y)
  3306. self.pdc.DrawCircle(x, y, 5)
  3307. self.pdc.EndDrawing()
  3308. def OnPaint(self, event):
  3309. dc = wx.BufferedPaintDC(self)
  3310. dc.SetBackground(wx.Brush("White"))
  3311. dc.Clear()
  3312. self.PrepareDC(dc)
  3313. self.pdc.DrawToDC(dc)
  3314. def UpdatePos(self, xcoord, ycoord):
  3315. """!Update position coordinates (origin: UL)"""
  3316. if xcoord < 0.0:
  3317. xcoord = 0.0
  3318. elif xcoord > 1.0:
  3319. xcoord = 1.0
  3320. if ycoord < 0.0:
  3321. ycoord = 0.0
  3322. elif ycoord > 1.0:
  3323. ycoord = 1.0
  3324. x, y = self.TransformCoordinates(xcoord, ycoord)
  3325. self.data['position']['x'] = x
  3326. self.data['position']['y'] = y
  3327. return xcoord, ycoord
  3328. def OnMouse(self, event):
  3329. if event.LeftIsDown():
  3330. x, y = event.GetPosition()
  3331. self.Draw(pos = (x, y))
  3332. w, h = self.GetClientSize()
  3333. x = float(x) / w
  3334. y = float(y) / h
  3335. self.UpdatePos(x, y)
  3336. self.Refresh(False)
  3337. event.Skip()
  3338. def PostDraw(self):
  3339. x, y = self.UpdatePos(self.data['position']['x'],
  3340. self.data['position']['y'])
  3341. self.Draw(pos = (x,y), scale = True)
  3342. class ViewPositionWindow(PositionWindow):
  3343. """!View position control widget"""
  3344. def __init__(self, parent, mapwindow, id = wx.ID_ANY,
  3345. **kwargs):
  3346. PositionWindow.__init__(self, parent, mapwindow, id, **kwargs)
  3347. self.data = self.mapWindow.view
  3348. self.PostDraw()
  3349. def UpdatePos(self, xcoord, ycoord):
  3350. x, y = PositionWindow.UpdatePos(self, xcoord, ycoord)
  3351. event = wxUpdateView(zExag = True)
  3352. wx.PostEvent(self.mapWindow, event)
  3353. return x, y
  3354. def TransformCoordinates(self, x, y, toLight = True):
  3355. return x, y
  3356. def OnMouse(self, event):
  3357. PositionWindow.OnMouse(self, event)
  3358. if event.LeftIsDown():
  3359. self.mapWindow.render['quick'] = self.quick
  3360. self.mapWindow.Refresh(eraseBackground = False)
  3361. elif event.LeftUp():
  3362. self.mapWindow.render['quick'] = False
  3363. self.mapWindow.Refresh(eraseBackground = False)
  3364. event.Skip()
  3365. class LightPositionWindow(PositionWindow):
  3366. """!Light position control widget"""
  3367. def __init__(self, parent, mapwindow, id = wx.ID_ANY,
  3368. **kwargs):
  3369. PositionWindow.__init__(self, parent, mapwindow, id, **kwargs)
  3370. self.data = self.mapWindow.light
  3371. self.quick = False
  3372. self.PostDraw()
  3373. def UpdatePos(self, xcoord, ycoord):
  3374. x, y = PositionWindow.UpdatePos(self, xcoord, ycoord)
  3375. event = wxUpdateLight()
  3376. wx.PostEvent(self.mapWindow, event)
  3377. return x, y
  3378. def TransformCoordinates(self, x, y, toLight = True):
  3379. if toLight:
  3380. x = 2 * x - 1
  3381. y = -2 * y + 1
  3382. else:
  3383. x = (x + 1)/2
  3384. y = (1 - y)/2
  3385. return x, y
  3386. def PostDraw(self):
  3387. event = wxUpdateLight(refresh = True)
  3388. wx.PostEvent(self.mapWindow, event)
  3389. x, y = self.data['position']['x'], self.data['position']['y']
  3390. x, y = self.TransformCoordinates(x, y, toLight = False)
  3391. self.Draw(pos = (x,y), scale = True)
  3392. def OnMouse(self, event):
  3393. PositionWindow.OnMouse(self, event)
  3394. if event.LeftUp():
  3395. self.mapWindow.render['quick'] = False
  3396. self.mapWindow.Refresh(eraseBackground = False)