nviz_tools.py 157 KB

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