nviz.py 138 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517
  1. """
  2. @package nviz.py
  3. @brief 2.5/3D visialization mode for Map Display Window
  4. List of classes:
  5. - GLWindow
  6. - NvizToolWindow
  7. - ViewPositionWindow
  8. - IsoSurfList
  9. (C) 2008 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)
  14. """
  15. import os
  16. import sys
  17. import time
  18. import copy
  19. from threading import Thread
  20. import wx
  21. import wx.lib.colourselect as csel
  22. import wx.lib.scrolledpanel as scrolled
  23. errorMsg = ''
  24. try:
  25. from wx import glcanvas
  26. haveGLCanvas = True
  27. except ImportError, e:
  28. haveGLCanvas = False
  29. errorMsg = e
  30. try:
  31. from OpenGL.GL import *
  32. from OpenGL.GLUT import *
  33. haveOpenGL = True
  34. except ImportError, e:
  35. haveOpenGL = False
  36. errorMsg = e
  37. import globalvar
  38. import gcmd
  39. import gselect
  40. from debug import Debug as Debug
  41. from mapdisp import MapWindow as MapWindow
  42. from preferences import globalSettings as UserSettings
  43. try:
  44. nvizPath = os.path.join(globalvar.ETCWXDIR, "nviz")
  45. sys.path.append(nvizPath)
  46. import grass7_wxnviz as wxnviz
  47. haveNviz = True
  48. except ImportError, e:
  49. haveNviz = False
  50. errorMsg = e
  51. class GLWindow(MapWindow, glcanvas.GLCanvas):
  52. """OpenGL canvas for Map Display Window"""
  53. def __init__(self, parent, id,
  54. pos=wx.DefaultPosition,
  55. size=wx.DefaultSize,
  56. style=wx.NO_FULL_REPAINT_ON_RESIZE,
  57. Map=None, tree=None, gismgr=None):
  58. self.parent = parent # MapFrame
  59. self.Map = Map
  60. self.tree = tree
  61. self.gismgr = gismgr
  62. glcanvas.GLCanvas.__init__(self, parent, id)
  63. MapWindow.__init__(self, parent, id, pos, size, style,
  64. Map, tree, gismgr)
  65. self.parent = parent # MapFrame
  66. self.init = False
  67. # render mode
  68. self.render = { 'quick' : False,
  69. # do not render vector lines in quick mode
  70. 'vlines' : False,
  71. 'vpoints' : False }
  72. # list of loaded map layers
  73. self.layers = {}
  74. for type in ('raster', 'vlines', 'vpoints', '3d-raster'):
  75. self.layers[type] = {}
  76. self.layers[type]['name'] = []
  77. self.layers[type]['id'] = []
  78. #
  79. # create nviz instance
  80. #
  81. self.nvizClass = wxnviz.Nviz(sys.stderr)
  82. #
  83. # set current display
  84. #
  85. self.nvizClass.SetDisplay(self)
  86. #
  87. # initialize mouse position
  88. #
  89. self.lastX = self.x = 30
  90. self.lastY = self.y = 30
  91. #
  92. # default values
  93. #
  94. self.view = copy.deepcopy(UserSettings.Get(group='nviz', key='view')) # copy
  95. self.iview = UserSettings.Get(group='nviz', key='view', internal=True)
  96. self.update = [] # list of properties to be updated
  97. self.size = None
  98. self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
  99. self.Bind(wx.EVT_SIZE, self.OnSize)
  100. self.Bind(wx.EVT_PAINT, self.OnPaint)
  101. self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
  102. self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
  103. self.Bind(wx.EVT_MOTION, self.OnMouseAction)
  104. self.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouseAction)
  105. def OnEraseBackground(self, event):
  106. pass # do nothing, to avoid flashing on MSW
  107. def OnSize(self, event):
  108. self.size = self.parent.GetClientSize()
  109. if self.GetContext():
  110. Debug.msg(3, "GLCanvas.OnPaint(): w=%d, h=%d" % \
  111. (self.size.width, self.size.height))
  112. self.SetCurrent()
  113. self.nvizClass.ResizeWindow(self.size.width,
  114. self.size.height)
  115. event.Skip()
  116. def OnPaint(self, event):
  117. Debug.msg(3, "GLCanvas.OnPaint()")
  118. dc = wx.PaintDC(self)
  119. self.SetCurrent()
  120. if not self.init:
  121. self.nvizClass.InitView()
  122. self.LoadDataLayers()
  123. self.ResetView()
  124. if hasattr(self.parent, "nvizToolWin"):
  125. self.parent.nvizToolWin.UpdatePage('view')
  126. layer = self.GetSelectedLayer()
  127. if layer:
  128. if layer.type == 'raster':
  129. self.parent.nvizToolWin.UpdatePage('surface')
  130. elif layer.type == 'vector':
  131. self.parent.nvizToolWin.UpdatePage('vector')
  132. self.parent.nvizToolWin.UpdateSettings()
  133. # update widgets
  134. win = self.parent.nvizToolWin.FindWindowById( \
  135. self.parent.nvizToolWin.win['vector']['lines']['surface'])
  136. win.SetItems(self.layers['raster']['name'])
  137. self.init = True
  138. self.UpdateMap()
  139. def OnMouseAction(self, event):
  140. # change position
  141. if event.Dragging() and event.LeftIsDown():
  142. self.lastX = self.lastY = self.x = self.y
  143. self.x, self.y = event.GetPosition()
  144. self.Refresh(False)
  145. # change perspective with mouse wheel
  146. wheel = event.GetWheelRotation()
  147. if wheel != 0:
  148. current = event.GetPositionTuple()[:]
  149. Debug.msg (5, "GLWindow.OnMouseMotion(): wheel=%d" % wheel)
  150. prev_value = self.view['persp']['value']
  151. if wheel > 0:
  152. value = -1 * self.view['persp']['step']
  153. else:
  154. value = self.view['persp']['step']
  155. self.view['persp']['value'] += value
  156. if self.view['persp']['value'] < 1:
  157. self.view['persp']['value'] = 1
  158. elif self.view['persp']['value'] > 100:
  159. self.view['persp']['value'] = 100
  160. if prev_value != self.view['persp']['value']:
  161. if hasattr(self.parent, "nvizToolWin"):
  162. self.parent.nvizToolWin.UpdateSettings()
  163. self.nvizClass.SetView(self.view['pos']['x'], self.view['pos']['y'],
  164. self.iview['height']['value'],
  165. self.view['persp']['value'],
  166. self.view['twist']['value'])
  167. # redraw map
  168. self.OnPaint(None)
  169. # update statusbar
  170. ### self.parent.StatusbarUpdate()
  171. def OnLeftDown(self, event):
  172. self.CaptureMouse()
  173. self.x, self.y = self.lastX, self.lastY = event.GetPosition()
  174. def OnLeftUp(self, event):
  175. self.ReleaseMouse()
  176. def UpdateMap(self, render=True):
  177. """
  178. Updates the canvas anytime there is a change to the
  179. underlaying images or to the geometry of the canvas.
  180. @param render re-render map composition
  181. """
  182. start = time.clock()
  183. self.resize = False
  184. # if self.size is None:
  185. # self.size = self.GetClientSize()
  186. # w, h = self.size
  187. # w = float(max(w, 1.0))
  188. # h = float(max(h, 1.0))
  189. # d = float(min(w, h))
  190. # xScale = d / w
  191. # yScale = d / h
  192. # print w, h, d, xScale, yScale
  193. # print self.y, self.lastY, self.x, self.lastX
  194. # print (self.y - self.lastY) * yScale, (self.x - self.lastX) * xScale
  195. # print self.x * xScale
  196. #glRotatef((self.y - self.lastY) * yScale, 1.0, 0.0, 0.0);
  197. #glRotatef((self.x - self.lastX) * xScale, 0.0, 1.0, 0.0);
  198. if self.render['quick'] is False:
  199. self.parent.onRenderGauge.Show()
  200. self.parent.onRenderGauge.SetRange(2)
  201. self.parent.onRenderGauge.SetValue(0)
  202. if 'view' in self.update:
  203. if 'z-exag' in self.update:
  204. self.nvizClass.SetZExag(self.view['z-exag']['value'])
  205. self.update.remove('z-exag')
  206. self.nvizClass.SetView(self.view['pos']['x'], self.view['pos']['y'],
  207. self.iview['height']['value'],
  208. self.view['persp']['value'],
  209. self.view['twist']['value'])
  210. self.update.remove('view')
  211. if self.render['quick'] is False:
  212. self.parent.onRenderGauge.SetValue(1)
  213. wx.Yield()
  214. self.nvizClass.Draw(False, -1)
  215. elif self.render['quick'] is True:
  216. # quick
  217. mode = wxnviz.DRAW_QUICK_SURFACE | wxnviz.DRAW_QUICK_VOLUME
  218. if self.render['vlines']:
  219. mode |= wxnviz.DRAW_QUICK_VLINES
  220. if self.render['vpoints']:
  221. mode |= wxnviz.DRAW_QUICK_VPOINTS
  222. self.nvizClass.Draw(True, mode)
  223. else: # None -> reuse last rendered image
  224. pass # TODO
  225. self.SwapBuffers()
  226. stop = time.clock()
  227. if self.render['quick'] is False:
  228. self.parent.onRenderGauge.SetValue(2)
  229. # hide process bar
  230. self.parent.onRenderGauge.Hide()
  231. #
  232. # update statusbar
  233. #
  234. # self.parent.StatusbarUpdate()
  235. Debug.msg(3, "GLWindow.UpdateMap(): quick=%d, -> time=%g" % \
  236. (self.render['quick'], (stop-start)))
  237. # print stop-start
  238. def EraseMap(self):
  239. """
  240. Erase the canvas
  241. """
  242. self.nvizClass.EraseMap()
  243. self.SwapBuffers()
  244. def IsLoaded(self, item):
  245. """Check if layer (item) is already loaded
  246. @param item layer item
  247. """
  248. layer = self.tree.GetPyData(item)[0]['maplayer']
  249. data = self.tree.GetPyData(item)[0]['nviz']
  250. if not data:
  251. return 0
  252. if layer.type == 'raster':
  253. if not data['surface'].has_key('object'):
  254. return 0
  255. elif layer.type == 'vector':
  256. if not data['vlines'].has_key('object') and \
  257. not data['points'].has_key('object'):
  258. return 0
  259. return 1
  260. def LoadDataLayers(self):
  261. """Load raster/vector from current layer tree
  262. @todo volumes
  263. """
  264. listOfItems = []
  265. # load raster & vector maps
  266. item = self.tree.GetFirstChild(self.tree.root)[0]
  267. while item and item.IsOk():
  268. type = self.tree.GetPyData(item)[0]['type']
  269. if not item.IsChecked() or \
  270. type not in ('raster', 'vector', '3d-raster'):
  271. item = self.tree.GetNextSibling(item)
  272. continue
  273. listOfItems.append(item)
  274. item = self.tree.GetNextSibling(item)
  275. start = time.time()
  276. while(len(listOfItems) > 0):
  277. item = listOfItems.pop()
  278. type = self.tree.GetPyData(item)[0]['type']
  279. try:
  280. if type == 'raster':
  281. self.LoadRaster(item)
  282. elif type == '3d-raster':
  283. self.LoadRaster3d(item)
  284. except gcmd.NvizError, e:
  285. print >> sys.stderr, "Nviz:" + e.message
  286. try:
  287. if type == 'vector':
  288. data = self.tree.GetPyData(item)[0]['nviz']
  289. vecType = []
  290. if data and data.has_key('vector'):
  291. for v in ('lines', 'points'):
  292. if data['vector'][v]:
  293. vecType.append(v)
  294. self.LoadVector(item, vecType)
  295. except gcmd.NvizError, e:
  296. print >> sys.stderr, "Nviz:" + e.message
  297. stop = time.time()
  298. Debug.msg(3, "GLWindow.LoadDataLayers(): time=%f" % (stop-start))
  299. # print stop - start
  300. def SetLayerData(self, item, id, nvizType):
  301. """Set map object properties
  302. @param item layer item
  303. @param id nviz layer id (or -1)
  304. @param nvizType nviz data type (surface, points, vector)
  305. """
  306. type = self.tree.GetPyData(item)[0]['maplayer'].type
  307. # reference to original layer properties (can be None)
  308. data = self.tree.GetPyData(item)[0]['nviz']
  309. if data is None:
  310. # init data structure
  311. self.tree.GetPyData(item)[0]['nviz'] = {}
  312. data = self.tree.GetPyData(item)[0]['nviz']
  313. if type == 'raster':
  314. data[nvizType] = {}
  315. for sec in ('attribute', 'draw', 'mask', 'position'):
  316. data[nvizType][sec] = {}
  317. # reset to default properties
  318. self.SetSurfaceDefaultProp(data[nvizType])
  319. elif type == 'vector':
  320. data['vector'] = {}
  321. for sec in ('lines', 'points'):
  322. data['vector'][sec] = {}
  323. # reset to default properties (lines/points)
  324. self.SetVectorDefaultProp(data['vector'])
  325. elif type == '3d-raster':
  326. data[nvizType] = {}
  327. for sec in ('attribute', 'draw', 'position',
  328. 'isosurface', 'slice'):
  329. data[nvizType][sec] = {}
  330. # reset to default properties
  331. self.SetVolumeDefaultProp(data[nvizType])
  332. else:
  333. # check data
  334. if type == 'vector':
  335. if not data['vector']['lines']:
  336. self.SetVectorLinesDefaultProp(data['vector']['lines'])
  337. if not data['vector']['points']:
  338. self.SetVectorPointsDefaultProp(data['vector']['points'])
  339. # set updates
  340. for sec in data.keys():
  341. for sec1 in data[sec].keys():
  342. for sec2 in data[sec][sec1].keys():
  343. if sec2 not in ('object'):
  344. self.update.append('%s:%s:%s' % (sec, sec1, sec2))
  345. # set id
  346. if id > 0:
  347. if type in ('raster', '3d-raster'):
  348. data[nvizType]['object'] = { 'id' : id,
  349. 'init' : False }
  350. elif type == 'vector':
  351. data['vector'][nvizType]['object'] = { 'id' : id,
  352. 'init' : False }
  353. return data
  354. def LoadRaster(self, item):
  355. """Load 2d raster map and set surface attributes
  356. @param layer item
  357. """
  358. return self._loadRaster(item)
  359. def LoadRaster3d(self, item):
  360. """Load 3d raster map and set surface attributes
  361. @param layer item
  362. """
  363. return self._loadRaster(item)
  364. def _loadRaster(self, item):
  365. """Load 2d/3d raster map and set its attributes
  366. @param layer item
  367. """
  368. layer = self.tree.GetPyData(item)[0]['maplayer']
  369. if layer.type not in ('raster', '3d-raster'):
  370. return
  371. if layer.type == 'raster':
  372. id = self.nvizClass.LoadSurface(str(layer.name), None, None)
  373. nvizType = 'surface'
  374. errorMsg = _("Loading raster map")
  375. elif layer.type == '3d-raster':
  376. id = self.nvizClass.LoadVolume(str(layer.name), None, None)
  377. nvizType = 'volume'
  378. errorMsg = _("Loading 3d raster map")
  379. else:
  380. id = -1
  381. if id < 0:
  382. if layer.type in ('raster', '3d-raster'):
  383. print >> sys.stderr, "Nviz:" + "%s <%s> %s" % (errorMsg, layer.name, _("failed"))
  384. else:
  385. print >> sys.stderr, "Nviz:" + _("Unsupported layer type '%s'") % layer.type
  386. self.layers[layer.type]['name'].append(layer.name)
  387. self.layers[layer.type]['id'].append(id)
  388. # set default/workspace layer properties
  389. data = self.SetLayerData(item, id, nvizType)
  390. print data
  391. # update properties
  392. self.UpdateLayerProperties(item)
  393. # update tools window
  394. if hasattr(self.parent, "nvizToolWin") and \
  395. item == self.GetSelectedLayer(type='item'):
  396. toolWin = self.parent.nvizToolWin
  397. if layer.type == 'raster':
  398. win = toolWin.FindWindowById( \
  399. toolWin.win['vector']['lines']['surface'])
  400. win.SetItems(self.layers[layer.type]['name'])
  401. toolWin.UpdatePage(nvizType)
  402. toolWin.SetPage(nvizType)
  403. return id
  404. def UnloadRaster(self, item):
  405. """Unload 2d raster map
  406. @param layer item
  407. """
  408. return self._unloadRaster(item)
  409. def UnloadRaster3d(self, item):
  410. """Unload 3d raster map
  411. @param layer item
  412. """
  413. return self._unloadRaster(item)
  414. def _unloadRaster(self, item):
  415. """Unload 2d/3d raster map
  416. @param item layer item
  417. """
  418. layer = self.tree.GetPyData(item)[0]['maplayer']
  419. if layer.type not in ('raster', '3d-raster'):
  420. return
  421. data = self.tree.GetPyData(item)[0]['nviz']
  422. if layer.type == 'raster':
  423. nvizType = 'surface'
  424. unloadFn = self.nvizClass.UnloadSurface
  425. errorMsg = _("Unable to unload raster map")
  426. successMsg = _("Raster map")
  427. else:
  428. nvizType = 'volume'
  429. unloadFn = self.nvizClass.UnloadVolume
  430. errorMsg = _("Unable to unload 3d raster map")
  431. successMsg = _("3d raster map")
  432. id = data[nvizType]['object']['id']
  433. if unloadFn(id) == 0:
  434. print >> sys.stderr, "Nviz:" + "%s <%s>" % (errorMsg, layer.name)
  435. else:
  436. print "Nviz:" + "%s <%s> %s" % (successMsg, layer.name, _("unloaded successfully"))
  437. data[nvizType].pop('object')
  438. idx = self.layers[layer.type]['id'].index(id)
  439. del self.layers[layer.type]['name'][idx]
  440. del self.layers[layer.type]['id'][idx]
  441. # update tools window
  442. if hasattr(self.parent, "nvizToolWin") and \
  443. layer.type == 'raster':
  444. toolWin = self.parent.nvizToolWin
  445. win = toolWin.FindWindowById( \
  446. toolWin.win['vector']['lines']['surface'])
  447. win.SetItems(self.layers[layer.type]['name'])
  448. # remove surface page
  449. if toolWin.notebook.GetSelection() == toolWin.page[nvizType]['id']:
  450. toolWin.notebook.RemovePage(toolWin.page[nvizType]['id'])
  451. toolWin.page[nvizType]['id'] = -1
  452. toolWin.page['settings']['id'] = 1
  453. def GetSurfaceMode(self, mode, style, shade, string=False):
  454. """Determine surface draw mode"""
  455. value = 0
  456. desc = {}
  457. if string:
  458. if mode == 'coarse':
  459. value |= wxnviz.DM_WIRE
  460. elif mode == 'fine':
  461. value |= wxnviz.DM_POLY
  462. else: # both
  463. value |= wxnviz.DM_WIRE_POLY
  464. if style == 'wire':
  465. value |= wxnviz.DM_GRID_WIRE
  466. else: # surface
  467. value |= wxnviz.DM_GRID_SURF
  468. if shade == 'flat':
  469. value |= wxnviz.DM_FLAT
  470. else: # surface
  471. value |= wxnviz.DM_GOURAUD
  472. return value
  473. # -> string is False
  474. if mode == 0: # coarse
  475. value |= wxnviz.DM_WIRE
  476. desc['mode'] = 'coarse'
  477. elif mode == 1: # fine
  478. value |= wxnviz.DM_POLY
  479. desc['mode'] = 'fine'
  480. else: # both
  481. value |= wxnviz.DM_WIRE_POLY
  482. desc['mode'] = 'both'
  483. if style == 0: # wire
  484. value |= wxnviz.DM_GRID_WIRE
  485. desc['style'] = 'wire'
  486. else: # surface
  487. value |= wxnviz.DM_GRID_SURF
  488. desc['style'] = 'surface'
  489. if shade == 0:
  490. value |= wxnviz.DM_FLAT
  491. desc['shading'] = 'flat'
  492. else: # surface
  493. value |= wxnviz.DM_GOURAUD
  494. desc['shading'] = 'gouraud'
  495. return (value, desc)
  496. def SetSurfaceDefaultProp(self, data):
  497. """Set default surface properties"""
  498. #
  499. # attributes
  500. #
  501. for attrb in ('shine', ):
  502. data['attribute'][attrb] = {}
  503. for key, value in UserSettings.Get(group='nviz', key='volume',
  504. subkey=attrb).iteritems():
  505. data['attribute'][attrb][key] = value
  506. self.update.append('surface:attribute:%s' % value)#
  507. #
  508. # draw
  509. #
  510. data['draw']['all'] = False # apply only for current surface
  511. for control, value in UserSettings.Get(group='nviz', key='surface', subkey='draw').iteritems():
  512. if control[:3] == 'res':
  513. if 'surface:draw:%s' % 'resolution' not in self.update:
  514. self.update.append('surface:draw:%s' % 'resolution')
  515. data['draw']['resolution'][control[4:]] = value
  516. continue
  517. elif control not in ('style', 'shading'):
  518. self.update.append('surface:draw:%s' % control)
  519. if control == 'wire-color':
  520. value = str(value[0]) + ':' + str(value[1]) + ':' + str(value[2])
  521. elif control in ('mode', 'style', 'shading'):
  522. if not data['draw'].has_key('mode'):
  523. data['draw']['mode'] = {}
  524. continue
  525. data['draw'][control] = { 'value' : value }
  526. value, desc = self.GetSurfaceMode(UserSettings.Get(group='nviz', key='surface', subkey=['draw', 'mode']),
  527. UserSettings.Get(group='nviz', key='surface', subkey=['draw', 'style']),
  528. UserSettings.Get(group='nviz', key='surface', subkey=['draw', 'shading']))
  529. data['draw']['mode'] = { 'value' : value,
  530. 'desc' : desc, }
  531. def LoadVector(self, item, vecType=None):
  532. """Load 2D or 3D vector map overlay
  533. @param item layer item
  534. @param vecType vector type (lines / points)
  535. """
  536. layer = self.tree.GetPyData(item)[0]['maplayer']
  537. if layer.type != 'vector':
  538. return
  539. if vecType is None:
  540. # load data type by default
  541. vecType = []
  542. for v in ('lines', 'points'):
  543. if UserSettings.Get(group='nviz', key='vector',
  544. subkey=[v, 'show']):
  545. vecType.append(v)
  546. # set default properties
  547. self.SetLayerData(item, -1, 'lines')
  548. self.SetLayerData(item, -1, 'points')
  549. id = -1
  550. for type in vecType:
  551. if type == 'lines':
  552. id = self.nvizClass.LoadVector(str(layer.name), False)
  553. else:
  554. id = self.nvizClass.LoadVector(str(layer.name), True)
  555. if id < 0:
  556. print >> sys.stderr, "Nviz:" + _("Loading vector map <%(name)s> (%(type)s) failed") % \
  557. { 'name' : layer.name, 'type' : type }
  558. continue
  559. # update layer properties
  560. self.SetLayerData(item, id, type)
  561. self.layers['v' + type]['name'].append(layer.name)
  562. self.layers['v' + type]['id'].append(id)
  563. # update properties
  564. self.UpdateLayerProperties(item)
  565. # update tools window
  566. if hasattr(self.parent, "nvizToolWin") and \
  567. item == self.GetSelectedLayer(type='item'):
  568. toolWin = self.parent.nvizToolWin
  569. toolWin.UpdatePage('vector')
  570. toolWin.SetPage('vector')
  571. return id
  572. def UnloadVector(self, item, vecType=None):
  573. """Unload vector map overlay
  574. @param item layer item
  575. @param vecType vector type (lines, points)
  576. """
  577. layer = self.tree.GetPyData(item)[0]['maplayer']
  578. data = self.tree.GetPyData(item)[0]['nviz']['vector']
  579. if vecType is None:
  580. vecType = []
  581. for v in ('lines', 'points'):
  582. if UserSettings.Get(group='nviz', key='vector',
  583. subkey=[v, 'show']):
  584. vecType.append(v)
  585. for vtype in vecType:
  586. if not data[vtype].has_key('object'):
  587. continue
  588. id = data[vtype]['object']['id']
  589. if vtype == 'lines':
  590. ret = self.nvizClass.UnloadVector(id, False)
  591. else:
  592. ret = self.nvizClass.UnloadVector(id, True)
  593. if ret == 0:
  594. print >> sys.stderr, "Nviz:" + _("Unable to unload vector map <%(name)s> (%(type)s)") % \
  595. { 'name': layer.name, 'type' : vtype }
  596. else:
  597. print "Nviz:" + _("Vector map <%(name)s> (%(type)s) unloaded successfully") % \
  598. { 'name' : layer.name, 'type' : vtype }
  599. data[vtype].pop('object')
  600. idx = self.layers['v' + vtype]['id'].index(id)
  601. del self.layers['v' + vtype]['name'][idx]
  602. del self.layers['v' + vtype]['id'][idx]
  603. # update tools window
  604. if hasattr(self.parent, "nvizToolWin") and \
  605. vecType is None:
  606. toolWin = self.parent.nvizToolWin
  607. # remove surface page
  608. if toolWin.notebook.GetSelection() == toolWin.page['surface']['id']:
  609. toolWin.notebook.RemovePage(toolWin.page['surface']['id'])
  610. toolWin.page['surface']['id'] = -1
  611. toolWin.page['settings']['id'] = 1
  612. def SetVectorDefaultProp(self, data):
  613. """Set default vector properties"""
  614. self.SetVectorLinesDefaultProp(data['lines'])
  615. self.SetVectorPointsDefaultProp(data['points'])
  616. def SetVectorLinesDefaultProp(self, data):
  617. """Set default vector properties -- lines"""
  618. # width
  619. data['width'] = UserSettings.Get(group='nviz', key='vector',
  620. subkey=['lines', 'width'])
  621. # color
  622. value = UserSettings.Get(group='nviz', key='vector',
  623. subkey=['lines', 'color'])
  624. color = str(value[0]) + ':' + str(value[1]) + ':' + str(value[2])
  625. data['color'] = color
  626. # mode
  627. if UserSettings.Get(group='nviz', key='vector',
  628. subkey=['lines', 'flat']):
  629. type = 'flat'
  630. map = None
  631. else:
  632. if len(self.layers['raster']['name']) > 0:
  633. type = 'surface'
  634. map = self.layers['raster']['name'][0]
  635. else:
  636. type = 'flat'
  637. map = None
  638. data['mode'] = {}
  639. data['mode']['type'] = type
  640. if map:
  641. data['mode']['surface'] = map
  642. # height
  643. data['height'] = UserSettings.Get(group='nviz', key='vector',
  644. subkey=['lines', 'height'])
  645. if data.has_key('object'):
  646. self.update.append('vector:lines:color')
  647. self.update.append('vector:lines:width')
  648. self.update.append('vector:lines:mode')
  649. self.update.append('vector:lines:height')
  650. def SetVectorPointsDefaultProp(self, data):
  651. """Set default vector properties -- points"""
  652. # size
  653. data['size'] = UserSettings.Get(group='nviz', key='vector',
  654. subkey=['points', 'size'])
  655. # width
  656. data['width'] = UserSettings.Get(group='nviz', key='vector',
  657. subkey=['points', 'width'])
  658. # marker
  659. data['marker'] = UserSettings.Get(group='nviz', key='vector',
  660. subkey=['points', 'marker'])
  661. # color
  662. value = UserSettings.Get(group='nviz', key='vector',
  663. subkey=['points', 'color'])
  664. color = str(value[0]) + ':' + str(value[1]) + ':' + str(value[2])
  665. data['color'] = color
  666. # mode
  667. data['mode'] = { 'type' : 'surface',
  668. 'surface' : '' }
  669. if len(self.layers['raster']['name']) > 0:
  670. data['mode']['surface'] = self.layers['raster']['name'][0]
  671. # height
  672. data['height'] = UserSettings.Get(group='nviz', key='vector',
  673. subkey=['points', 'height'])
  674. if data.has_key('object'):
  675. self.update.append('vector:points:size')
  676. self.update.append('vector:points:width')
  677. self.update.append('vector:points:marker')
  678. self.update.append('vector:points:color')
  679. self.update.append('vector:points:surface')
  680. self.update.append('vector:points:height')
  681. def SetVolumeDefaultProp(self, data):
  682. """Set default volume properties"""
  683. #
  684. # draw
  685. #
  686. data['draw']['all'] = False # apply only for current volume set
  687. for control, value in UserSettings.Get(group='nviz', key='volume', subkey='draw').iteritems():
  688. if 'volume:draw:%s' % control not in self.update:
  689. self.update.append('volume:draw:%s' % control)
  690. data['draw'][control] = { 'value' : value }
  691. #
  692. # isosurface attributes
  693. #
  694. for attrb in ('shine', ):
  695. data['attribute'][attrb] = {}
  696. for key, value in UserSettings.Get(group='nviz', key='volume',
  697. subkey=attrb).iteritems():
  698. data['attribute'][attrb][key] = value
  699. ### self.update.append('volume:attribute:%s' % value)
  700. def Reset(self):
  701. """Reset (unload data)"""
  702. self.nvizClass.Reset()
  703. self.init = False
  704. def OnZoomToMap(self, event):
  705. """
  706. Set display extents to match selected raster
  707. or vector map or volume.
  708. @todo vector, volume
  709. """
  710. layer = self.GetSelectedLayer()
  711. if layer is None:
  712. return
  713. Debug.msg (3, "GLWindow.OnZoomToMap(): layer=%s, type=%s" % \
  714. (layer.name, layer.type))
  715. self.nvizClass.SetViewportDefault()
  716. def ResetView(self):
  717. """Reset to default view"""
  718. self.view['z-exag']['value'], \
  719. self.iview['height']['value'], \
  720. self.iview['height']['min'], \
  721. self.iview['height']['max'] = self.nvizClass.SetViewDefault()
  722. self.view['pos']['x'] = UserSettings.Get(group='nviz', key='view',
  723. subkey=('pos', 'x'))
  724. self.view['pos']['y'] = UserSettings.Get(group='nviz', key='view',
  725. subkey=('pos', 'x'))
  726. self.view['persp']['value'] = UserSettings.Get(group='nviz', key='view',
  727. subkey=('persp', 'value'))
  728. self.view['twist']['value'] = UserSettings.Get(group='nviz', key='view',
  729. subkey=('twist', 'value'))
  730. self.update.append('view')
  731. def UpdateLayerProperties(self, layer=None):
  732. """Update data layer properties
  733. @param layer layer item or None (for selected item)
  734. """
  735. if not layer:
  736. mapLayer = self.GetSelectedLayer()
  737. data = self.GetSelectedLayer(type='nviz')
  738. else:
  739. mapLayer = self.tree.GetPyData(layer)[0]['maplayer']
  740. data = self.tree.GetPyData(layer)[0]['nviz']
  741. if mapLayer.type == 'raster':
  742. id = data['surface']['object']['id']
  743. self.UpdateRasterProperties(id, data['surface'])
  744. # -> initialized
  745. data['surface']['object']['init'] = True
  746. elif mapLayer.type == 'vector':
  747. for type in ('lines', 'points'):
  748. if data['vector'][type].has_key('object'):
  749. id = data['vector'][type]['object']['id']
  750. self.UpdateVectorProperties(id, data['vector'], type)
  751. # -> initialized
  752. data['vector'][type]['object']['init'] = True
  753. def UpdateRasterProperties(self, id, data):
  754. """Apply changes for surfaces"""
  755. # surface attributes
  756. for attrb in ('topo', 'color', 'mask',
  757. 'transp', 'shine', 'emit'):
  758. if 'surface:attribute:%s' % attrb in self.update:
  759. map = data['attribute'][attrb]['map']
  760. value = data['attribute'][attrb]['value']
  761. if map is None: # unset
  762. # only optional attributes
  763. if attrb == 'mask':
  764. # TODO: invert mask
  765. # TODO: broken in NVIZ
  766. self.nvizClass.UnsetSurfaceMask(id)
  767. elif attrb == 'transp':
  768. self.nvizClass.UnsetSurfaceTransp(id)
  769. elif attrb == 'emit':
  770. self.nvizClass.UnsetSurfaceEmit(id)
  771. else:
  772. if type(value) == type('') and \
  773. len(value) <= 0: # ignore empty values (TODO: warning)
  774. continue
  775. if attrb == 'topo':
  776. self.nvizClass.SetSurfaceTopo(id, map, str(value))
  777. elif attrb == 'color':
  778. self.nvizClass.SetSurfaceColor(id, map, str(value))
  779. elif attrb == 'mask':
  780. # TODO: invert mask
  781. # TODO: broken in NVIZ
  782. self.nvizClass.SetSurfaceMask(id, False, str(value))
  783. elif attrb == 'transp':
  784. self.nvizClass.SetSurfaceTransp(id, map, str(value))
  785. elif attrb == 'shine':
  786. self.nvizClass.SetSurfaceShine(id, map, str(value))
  787. elif attrb == 'emit':
  788. self.nvizClass.SetSurfaceEmit(id, map, str(value))
  789. self.update.remove('surface:attribute:%s' % attrb)
  790. # draw res
  791. if 'surface:draw:resolution' in self.update:
  792. coarse = data['draw']['resolution']['coarse']
  793. fine = data['draw']['resolution']['fine']
  794. if data['draw']['all']:
  795. self.nvizClass.SetSurfaceRes(-1, fine, coarse)
  796. else:
  797. self.nvizClass.SetSurfaceRes(id, fine, coarse)
  798. self.update.remove('surface:draw:resolution')
  799. # draw style
  800. if 'surface:draw:mode' in self.update:
  801. if data['draw']['mode']['value'] < 0: # need to calculate
  802. data['draw']['mode']['value'] = \
  803. self.GetSurfaceMode(mode=data['draw']['mode']['desc']['mode'],
  804. style=data['draw']['mode']['desc']['style'],
  805. shade=data['draw']['mode']['desc']['shading'],
  806. string=True)
  807. style = data['draw']['mode']['value']
  808. if data['draw']['all']:
  809. self.nvizClass.SetSurfaceStyle(-1, style)
  810. else:
  811. self.nvizClass.SetSurfaceStyle(id, style)
  812. self.update.remove('surface:draw:mode')
  813. # wire color
  814. if 'surface:draw:wire-color' in self.update:
  815. color = data['draw']['wire-color']['value']
  816. if data['draw']['all']:
  817. self.nvizClass.SetWireColor(-1, str(color))
  818. else:
  819. self.nvizClass.SetWireColor(id, str(color))
  820. self.update.remove('surface:draw:wire-color')
  821. # position
  822. if 'surface:position' in self.update:
  823. x = data['position']['x']
  824. y = data['position']['y']
  825. z = data['position']['z']
  826. self.nvizClass.SetSurfacePosition(id, x, y, z)
  827. self.update.remove('surface:position')
  828. def UpdateVectorProperties(self, id, data, type):
  829. """Update vector layer properties
  830. @param id layer id
  831. @param data properties
  832. @param type lines/points
  833. """
  834. if type == 'points':
  835. self.UpdateVectorPointsProperties(id, data[type])
  836. else:
  837. self.UpdateVectorLinesProperties(id, data[type])
  838. def UpdateVectorLinesProperties(self, id, data):
  839. """Apply changes for vector line layer"""
  840. # mode
  841. if 'vector:lines:color' in self.update or \
  842. 'vector:lines:width' in self.update or \
  843. 'vector:lines:mode' in self.update:
  844. width = data['width']
  845. color = data['color']
  846. if data['mode']['type'] == 'flat':
  847. flat = True
  848. if data.has_key('surface'):
  849. data.pop('surface')
  850. else:
  851. flat = False
  852. if not 'vector:lines:surface' in self.update:
  853. self.update.append('vector:lines:surface')
  854. self.nvizClass.SetVectorLineMode(id, color,
  855. width, flat)
  856. if 'vector:lines:color' in self.update:
  857. self.update.remove('vector:lines:color')
  858. if 'vector:lines:width' in self.update:
  859. self.update.remove('vector:lines:width')
  860. if 'vector:lines:mode' in self.update:
  861. self.update.remove('vector:lines:mode')
  862. # height
  863. if 'vector:lines:height' in self.update:
  864. self.nvizClass.SetVectorLineHeight(id,
  865. data['height'])
  866. self.update.remove('vector:lines:height')
  867. # surface
  868. if 'vector:lines:surface' in self.update:
  869. idx = self.layers['raster']['name'].index(data['mode']['surface'])
  870. if idx > -1:
  871. self.nvizClass.SetVectorLineSurface(id,
  872. self.layers['raster']['id'][idx])
  873. self.update.remove('vector:lines:surface')
  874. def UpdateVectorPointsProperties(self, id, data):
  875. """Apply changes for vector point layer"""
  876. if 'vector:points:size' in self.update or \
  877. 'vector:points:width' in self.update or \
  878. 'vector:points:marker' in self.update or \
  879. 'vector:points:color' in self.update:
  880. ret = self.nvizClass.SetVectorPointMode(id, data['color'],
  881. data['width'], float(data['size']),
  882. data['marker'] + 1)
  883. error = None
  884. if ret == -1:
  885. error = _("Vector point layer not found (id=%d)") % id
  886. elif ret == -2:
  887. error = _("Unable to set data layer properties (id=%d)") % id
  888. if error:
  889. raise gcmd.NvizError(parent=self.parent,
  890. message=_("Setting data layer properties failed.\n\n%s") % error)
  891. for prop in ('size', 'width', 'marker', 'color'):
  892. if 'vector:points:%s' % prop in self.update:
  893. self.update.remove('vector:points:%s' % prop)
  894. # height
  895. if 'vector:points:height' in self.update:
  896. self.nvizClass.SetVectorPointHeight(id,
  897. data['height'])
  898. self.update.remove('vector:points:height')
  899. # surface
  900. if 'vector:points:surface' in self.update:
  901. idx = self.layers['raster']['name'].index(data['mode']['surface'])
  902. if idx > -1:
  903. self.nvizClass.SetVectorPointSurface(id,
  904. self.layers['raster']['id'][idx])
  905. self.update.remove('vector:points:surface')
  906. class NvizToolWindow(wx.Frame):
  907. """Experimental window for Nviz tools
  908. @todo integrate with Map display
  909. """
  910. def __init__(self, parent=None, id=wx.ID_ANY, title=_("Nviz tools"),
  911. pos=wx.DefaultPosition, size=wx.DefaultSize,
  912. style=wx.DEFAULT_FRAME_STYLE, mapWindow=None):
  913. self.parent = parent # MapFrame
  914. self.lmgr = self.parent.gismanager # GMFrame
  915. self.mapWindow = mapWindow
  916. wx.Frame.__init__(self, parent, id, title, pos, size, style)
  917. #
  918. # icon
  919. #
  920. self.SetIcon(wx.Icon(os.path.join(globalvar.ETCDIR, 'grass_nviz.ico'), wx.BITMAP_TYPE_ICO))
  921. #
  922. # dialog body
  923. #
  924. mainSizer = wx.BoxSizer(wx.VERTICAL)
  925. self.win = {} # window ids
  926. #
  927. # notebook
  928. #
  929. self.notebook = wx.Notebook(parent=self, id=wx.ID_ANY, style=wx.BK_DEFAULT)
  930. self.page = {}
  931. # view page
  932. self.__createViewPage()
  933. self.page['view'] = { 'id' : 0 }
  934. # surface page
  935. size = self.__createSurfacePage()
  936. size = (size[0] + 25, size[0] + 20)
  937. # vector page
  938. self.__createVectorPage()
  939. # volume page
  940. self.__createVolumePage()
  941. # settings page
  942. self.__createSettingsPage()
  943. self.page['settings'] = { 'id' : 1 }
  944. self.UpdatePage('settings')
  945. self.pageChanging = False
  946. mainSizer.Add(item=self.notebook, proportion=1,
  947. flag=wx.EXPAND | wx.ALL, border=5)
  948. #
  949. # bindings
  950. #
  951. self.Bind(wx.EVT_CLOSE, self.OnClose)
  952. #
  953. # layout
  954. #
  955. self.SetSizer(mainSizer)
  956. mainSizer.Fit(self)
  957. self.SetSize(size)
  958. def __createViewPage(self):
  959. """Create view settings page"""
  960. panel = wx.Panel(parent=self.notebook, id=wx.ID_ANY)
  961. self.notebook.AddPage(page=panel,
  962. text=" %s " % _("View"))
  963. pageSizer = wx.BoxSizer(wx.VERTICAL)
  964. gridSizer = wx.GridBagSizer(vgap=3, hgap=3)
  965. self.win['view'] = {}
  966. # position
  967. posSizer = wx.GridBagSizer(vgap=3, hgap=3)
  968. posSizer.Add(item=wx.StaticText(panel, id=wx.ID_ANY, label=_("W")),
  969. pos=(1, 0), flag=wx.ALIGN_CENTER)
  970. posSizer.Add(item=wx.StaticText(panel, id=wx.ID_ANY, label=_("N")),
  971. pos=(0, 1), flag=wx.ALIGN_CENTER | wx.ALIGN_BOTTOM)
  972. viewPos = ViewPositionWindow(panel, id=wx.ID_ANY, size=(175, 175),
  973. mapwindow=self.mapWindow)
  974. self.win['view']['pos'] = viewPos.GetId()
  975. posSizer.Add(item=viewPos,
  976. pos=(1, 1), flag=wx.ALIGN_CENTER | wx.ALIGN_CENTER_VERTICAL)
  977. posSizer.Add(item=wx.StaticText(panel, id=wx.ID_ANY, label=_("S")),
  978. pos=(2, 1), flag=wx.ALIGN_CENTER | wx.ALIGN_TOP)
  979. posSizer.Add(item=wx.StaticText(panel, id=wx.ID_ANY, label=_("E")),
  980. pos=(1, 2), flag=wx.ALIGN_CENTER)
  981. gridSizer.Add(item=posSizer, pos=(0, 0))
  982. # perspective
  983. range = UserSettings.Get(group='nviz', key='view', subkey='persp', internal=True)
  984. self.CreateControl(panel, dict=self.win['view'], name='persp',
  985. range=(range['min'], range['max']),
  986. bind=(self.OnViewChange, self.OnViewChanged, self.OnViewChangedSpin))
  987. gridSizer.Add(item=wx.StaticText(panel, id=wx.ID_ANY, label=_("Perspective:")),
  988. pos=(1, 0), flag=wx.ALIGN_CENTER)
  989. gridSizer.Add(item=self.FindWindowById(self.win['view']['persp']['slider']), pos=(2, 0))
  990. gridSizer.Add(item=self.FindWindowById(self.win['view']['persp']['spin']), pos=(3, 0),
  991. flag=wx.ALIGN_CENTER)
  992. # twist
  993. range = UserSettings.Get(group='nviz', key='view', subkey='twist', internal=True)
  994. self.CreateControl(panel, dict=self.win['view'], name='twist',
  995. range=(range['min'], range['max']),
  996. bind=(self.OnViewChange, self.OnViewChanged, self.OnViewChangedSpin))
  997. gridSizer.Add(item=wx.StaticText(panel, id=wx.ID_ANY, label=_("Twist:")),
  998. pos=(1, 1), flag=wx.ALIGN_CENTER)
  999. gridSizer.Add(item=self.FindWindowById(self.win['view']['twist']['slider']), pos=(2, 1))
  1000. gridSizer.Add(item=self.FindWindowById(self.win['view']['twist']['spin']), pos=(3, 1),
  1001. flag=wx.ALIGN_CENTER)
  1002. # height + z-exag
  1003. self.CreateControl(panel, dict=self.win['view'], name='height', sliderHor=False,
  1004. range=(0, 1),
  1005. bind=(self.OnViewChange, self.OnViewChanged, self.OnViewChangedSpin))
  1006. self.CreateControl(panel, dict=self.win['view'], name='z-exag', sliderHor=False,
  1007. range=(0, 1),
  1008. bind=(self.OnViewChange, self.OnViewChanged, self.OnViewChangedSpin))
  1009. heightSizer = wx.GridBagSizer(vgap=3, hgap=3)
  1010. heightSizer.Add(item=wx.StaticText(panel, id=wx.ID_ANY, label=_("Height:")),
  1011. pos=(0, 0), flag=wx.ALIGN_LEFT, span=(1, 2))
  1012. heightSizer.Add(item=self.FindWindowById(self.win['view']['height']['slider']),
  1013. flag=wx.ALIGN_RIGHT, pos=(1, 0))
  1014. heightSizer.Add(item=self.FindWindowById(self.win['view']['height']['spin']),
  1015. flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT | wx.TOP |
  1016. wx.BOTTOM | wx.RIGHT, pos=(1, 1))
  1017. heightSizer.Add(item=wx.StaticText(panel, id=wx.ID_ANY, label=_("Z-exag:")),
  1018. pos=(0, 2), flag=wx.ALIGN_LEFT, span=(1, 2))
  1019. heightSizer.Add(item=self.FindWindowById(self.win['view']['z-exag']['slider']),
  1020. flag=wx.ALIGN_RIGHT, pos=(1, 2))
  1021. heightSizer.Add(item=self.FindWindowById(self.win['view']['z-exag']['spin']),
  1022. flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT | wx.TOP |
  1023. wx.BOTTOM | wx.RIGHT, pos=(1, 3))
  1024. gridSizer.Add(item=heightSizer, pos=(0, 1), flag=wx.ALIGN_RIGHT)
  1025. # view setup + reset
  1026. viewSizer = wx.BoxSizer(wx.HORIZONTAL)
  1027. viewSizer.Add(item=wx.StaticText(panel, id=wx.ID_ANY,
  1028. label=_("Look at:")),
  1029. flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=5)
  1030. viewType = wx.Choice (parent=panel, id=wx.ID_ANY, size=(125, -1),
  1031. choices = [_("top"),
  1032. _("north"),
  1033. _("south"),
  1034. _("east"),
  1035. _("west"),
  1036. _("north-west"),
  1037. _("north-east"),
  1038. _("south-east"),
  1039. _("south-west")])
  1040. viewType.SetSelection(0)
  1041. viewType.Bind(wx.EVT_CHOICE, self.OnLookAt)
  1042. # self.win['lookAt'] = viewType.GetId()
  1043. viewSizer.Add(item=viewType, flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL,
  1044. border=5)
  1045. reset = wx.Button(panel, id=wx.ID_ANY, label=_("Reset"))
  1046. reset.SetToolTipString(_("Reset to default view"))
  1047. # self.win['reset'] = reset.GetId()
  1048. reset.Bind(wx.EVT_BUTTON, self.OnResetView)
  1049. viewSizer.Add(item=reset, proportion=1,
  1050. flag=wx.EXPAND | wx.ALL | wx.ALIGN_RIGHT,
  1051. border=5)
  1052. gridSizer.AddGrowableCol(3)
  1053. gridSizer.Add(item=viewSizer, pos=(4, 0), span=(1, 2),
  1054. flag=wx.EXPAND)
  1055. # body
  1056. pageSizer.Add(item=gridSizer, proportion=1,
  1057. flag=wx.EXPAND | wx.ALL,
  1058. border=5)
  1059. panel.SetSizer(pageSizer)
  1060. return panel.GetBestSize()
  1061. def __createSurfacePage(self):
  1062. """Create view settings page"""
  1063. panel = wx.Panel(parent=self.notebook, id=wx.ID_ANY)
  1064. self.page['surface'] = {}
  1065. self.page['surface']['id'] = -1
  1066. self.page['surface']['panel'] = panel.GetId()
  1067. # panel = scrolled.ScrolledPanel(parent=self.notebook, id=wx.ID_ANY)
  1068. # panel.SetupScrolling(scroll_x=True, scroll_y=True)
  1069. pageSizer = wx.BoxSizer(wx.VERTICAL)
  1070. self.win['surface'] = {}
  1071. #
  1072. # surface attributes
  1073. #
  1074. box = wx.StaticBox (parent=panel, id=wx.ID_ANY,
  1075. label=" %s " % (_("Surface attributes")))
  1076. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  1077. gridSizer = wx.GridBagSizer(vgap=3, hgap=3)
  1078. # type
  1079. self.win['surface']['attr'] = {}
  1080. row = 0
  1081. for code, attrb in (('topo', _("Topography")),
  1082. ('color', _("Color")),
  1083. ('mask', _("Mask")),
  1084. ('transp', _("Transparency")),
  1085. ('shine', _("Shininess")),
  1086. ('emit', _("Emission"))):
  1087. self.win['surface'][code] = {}
  1088. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1089. label=attrb + ':'),
  1090. pos=(row, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  1091. use = wx.Choice (parent=panel, id=wx.ID_ANY, size=(100, -1),
  1092. choices = [_("map")])
  1093. if code not in ('topo', 'color', 'shine'):
  1094. use.Insert(item=_("unset"), pos=0)
  1095. self.win['surface'][code]['required'] = False
  1096. else:
  1097. self.win['surface'][code]['required'] = True
  1098. if code != 'mask':
  1099. use.Append(item=_('constant'))
  1100. self.win['surface'][code]['use'] = use.GetId()
  1101. use.Bind(wx.EVT_CHOICE, self.OnMapObjUse)
  1102. gridSizer.Add(item=use, flag=wx.ALIGN_CENTER_VERTICAL,
  1103. pos=(row, 1))
  1104. map = gselect.Select(parent=panel, id=wx.ID_ANY,
  1105. # size=globalvar.DIALOG_GSELECT_SIZE,
  1106. size=(200, -1),
  1107. type="raster")
  1108. self.win['surface'][code]['map'] = map.GetId() - 1 # FIXME
  1109. map.Bind(wx.EVT_TEXT, self.OnSurfaceMap)
  1110. # changing map topography not allowed
  1111. if code == 'topo':
  1112. map.Enable(False)
  1113. gridSizer.Add(item=map, flag=wx.ALIGN_CENTER_VERTICAL,
  1114. pos=(row, 2))
  1115. if code == 'color':
  1116. value = csel.ColourSelect(panel, id=wx.ID_ANY,
  1117. colour=UserSettings.Get(group='nviz', key='surface',
  1118. subkey=['color', 'value']))
  1119. value.Bind(csel.EVT_COLOURSELECT, self.OnSurfaceMap)
  1120. elif code == 'mask':
  1121. value = None
  1122. else:
  1123. value = wx.SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  1124. initial=0)
  1125. if code == 'topo':
  1126. value.SetRange(minVal=-1e9, maxVal=1e9)
  1127. elif code in ('shine', 'transp', 'emit'):
  1128. value.SetRange(minVal=0, maxVal=255)
  1129. else:
  1130. value.SetRange(minVal=0, maxVal=100)
  1131. value.Bind(wx.EVT_TEXT, self.OnSurfaceMap)
  1132. if value:
  1133. self.win['surface'][code]['const'] = value.GetId()
  1134. value.Enable(False)
  1135. gridSizer.Add(item=value, flag=wx.ALIGN_CENTER_VERTICAL,
  1136. pos=(row, 3))
  1137. else:
  1138. self.win['surface'][code]['const'] = None
  1139. self.SetMapObjUseMap(nvizType='surface',
  1140. attrb=code) # -> enable map / disable constant
  1141. row += 1
  1142. boxSizer.Add(item=gridSizer, proportion=1,
  1143. flag=wx.ALL | wx.EXPAND, border=3)
  1144. pageSizer.Add(item=boxSizer, proportion=0,
  1145. flag=wx.EXPAND | wx.ALL,
  1146. border=5)
  1147. #
  1148. # draw
  1149. #
  1150. self.win['surface']['draw'] = {}
  1151. box = wx.StaticBox (parent=panel, id=wx.ID_ANY,
  1152. label=" %s " % (_("Draw")))
  1153. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  1154. gridSizer = wx.GridBagSizer(vgap=5, hgap=5)
  1155. gridSizer.AddGrowableCol(4)
  1156. # mode
  1157. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1158. label=_("Mode:")),
  1159. pos=(0, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  1160. mode = wx.Choice (parent=panel, id=wx.ID_ANY, size=(100, -1),
  1161. choices = [_("coarse"),
  1162. _("fine"),
  1163. _("both")])
  1164. mode.SetSelection(0)
  1165. mode.SetName("selection")
  1166. mode.Bind(wx.EVT_CHOICE, self.OnSurfaceMode)
  1167. self.win['surface']['draw']['mode'] = mode.GetId()
  1168. gridSizer.Add(item=mode, flag=wx.ALIGN_CENTER_VERTICAL,
  1169. pos=(0, 1))
  1170. # resolution (mode)
  1171. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1172. label=_("Resolution:")),
  1173. pos=(0, 2), flag=wx.ALIGN_CENTER_VERTICAL)
  1174. resSizer = wx.BoxSizer(wx.HORIZONTAL)
  1175. resSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1176. label=_("coarse:")),
  1177. flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=3)
  1178. resC = wx.SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  1179. initial=1,
  1180. min=1,
  1181. max=100)
  1182. resC.SetName("value")
  1183. self.win['surface']['draw']['res-coarse'] = resC.GetId()
  1184. resC.Bind(wx.EVT_SPINCTRL, self.OnSurfaceResolution)
  1185. resSizer.Add(item=resC, flag=wx.ALL, border=3)
  1186. resSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1187. label=_("fine:")),
  1188. flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=3)
  1189. resF = wx.SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  1190. initial=1,
  1191. min=1,
  1192. max=100)
  1193. resF.SetName("value")
  1194. self.win['surface']['draw']['res-fine'] = resF.GetId()
  1195. resF.Bind(wx.EVT_SPINCTRL, self.OnSurfaceResolution)
  1196. resSizer.Add(item=resF, flag=wx.ALL, border=3)
  1197. gridSizer.Add(item=resSizer, pos=(0, 3), span=(1, 2))
  1198. # style
  1199. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1200. label=_("Coarse style:")),
  1201. pos=(1, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  1202. style = wx.Choice (parent=panel, id=wx.ID_ANY, size=(100, -1),
  1203. choices = [_("wire"),
  1204. _("surface")])
  1205. style.SetName("selection")
  1206. self.win['surface']['draw']['style'] = style.GetId()
  1207. style.Bind(wx.EVT_CHOICE, self.OnSurfaceMode)
  1208. gridSizer.Add(item=style, flag=wx.ALIGN_CENTER_VERTICAL,
  1209. pos=(1, 1))
  1210. # shading
  1211. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1212. label=_("Shading:")),
  1213. pos=(1, 2), flag=wx.ALIGN_CENTER_VERTICAL)
  1214. shade = wx.Choice (parent=panel, id=wx.ID_ANY, size=(100, -1),
  1215. choices = [_("flat"),
  1216. _("gouraud")])
  1217. shade.SetName("selection")
  1218. self.win['surface']['draw']['shading'] = shade.GetId()
  1219. shade.Bind(wx.EVT_CHOICE, self.OnSurfaceMode)
  1220. gridSizer.Add(item=shade, flag=wx.ALIGN_CENTER_VERTICAL,
  1221. pos=(1, 3))
  1222. # color
  1223. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1224. label=_("Wire color:")),
  1225. pos=(2, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  1226. color = csel.ColourSelect(panel, id=wx.ID_ANY)
  1227. color.SetName("colour")
  1228. color.Bind(csel.EVT_COLOURSELECT, self.OnSurfaceWireColor)
  1229. self.win['surface']['draw']['wire-color'] = color.GetId()
  1230. gridSizer.Add(item=color, flag=wx.ALIGN_CENTER_VERTICAL,
  1231. pos=(2, 1))
  1232. boxSizer.Add(item=gridSizer, proportion=1,
  1233. flag=wx.ALL | wx.EXPAND, border=3)
  1234. pageSizer.Add(item=boxSizer, proportion=0,
  1235. flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1236. border=5)
  1237. all = wx.Button(panel, id=wx.ID_ANY, label=_("All"))
  1238. all.SetToolTipString(_("Use for all loaded surfaces"))
  1239. # self.win['reset'] = reset.GetId()
  1240. all.Bind(wx.EVT_BUTTON, self.OnSurfaceModeAll)
  1241. gridSizer.Add(item=all, flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
  1242. pos=(2, 4))
  1243. #
  1244. # mask
  1245. #
  1246. box = wx.StaticBox (parent=panel, id=wx.ID_ANY,
  1247. label=" %s " % (_("Mask")))
  1248. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  1249. gridSizer = wx.GridBagSizer(vgap=5, hgap=5)
  1250. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1251. label=_("Mask zeros:")),
  1252. pos=(0, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  1253. elev = wx.CheckBox(parent=panel, id=wx.ID_ANY,
  1254. label=_("by elevation"))
  1255. elev.Enable(False) # TODO: not implemented yet
  1256. gridSizer.Add(item=elev, pos=(0, 1))
  1257. color = wx.CheckBox(parent=panel, id=wx.ID_ANY,
  1258. label=_("by color"))
  1259. color.Enable(False) # TODO: not implemented yet
  1260. gridSizer.Add(item=color, pos=(0, 2))
  1261. boxSizer.Add(item=gridSizer, proportion=1,
  1262. flag=wx.ALL | wx.EXPAND, border=3)
  1263. pageSizer.Add(item=boxSizer, proportion=0,
  1264. flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1265. border=5)
  1266. #
  1267. # position
  1268. #
  1269. self.win['surface']['position'] = {}
  1270. box = wx.StaticBox (parent=panel, id=wx.ID_ANY,
  1271. label=" %s " % (_("Position")))
  1272. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  1273. gridSizer = wx.GridBagSizer(vgap=5, hgap=5)
  1274. # position
  1275. axis = wx.Choice (parent=panel, id=wx.ID_ANY, size=(75, -1),
  1276. choices = ["X",
  1277. "Y",
  1278. "Z"])
  1279. axis.SetSelection(0)
  1280. self.win['surface']['position']['axis'] = axis.GetId()
  1281. axis.Bind(wx.EVT_CHOICE, self.OnSurfaceAxis)
  1282. gridSizer.Add(item=axis, flag=wx.ALIGN_CENTER_VERTICAL,
  1283. pos=(0, 0))
  1284. value = wx.Slider(parent=panel, id=wx.ID_ANY,
  1285. value=0,
  1286. minValue=-1e4,
  1287. maxValue=1e4,
  1288. style=wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | \
  1289. wx.SL_TOP | wx.SL_LABELS,
  1290. size=(350, -1))
  1291. self.win['surface']['position']['pos'] = value.GetId()
  1292. value.Bind(wx.EVT_SCROLL, self.OnSurfacePosition)
  1293. gridSizer.Add(item=value, flag=wx.ALIGN_CENTER_VERTICAL,
  1294. pos=(0, 1))
  1295. boxSizer.Add(item=gridSizer, proportion=1,
  1296. flag=wx.ALL | wx.EXPAND, border=3)
  1297. pageSizer.Add(item=boxSizer, proportion=0,
  1298. flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1299. border=5)
  1300. panel.SetSizer(pageSizer)
  1301. return panel.GetBestSize()
  1302. def __createVectorPage(self):
  1303. """Create view settings page"""
  1304. panel = wx.Panel(parent=self.notebook, id=wx.ID_ANY)
  1305. self.page['vector'] = {}
  1306. self.page['vector']['id'] = -1
  1307. self.page['vector']['panel'] = panel.GetId()
  1308. pageSizer = wx.BoxSizer(wx.VERTICAL)
  1309. self.win['vector'] = {}
  1310. #
  1311. # desc
  1312. #
  1313. desc = wx.StaticText(parent=panel, id=wx.ID_ANY,
  1314. label="")
  1315. self.win['vector']['desc'] = desc.GetId()
  1316. pageSizer.Add(item=desc, proportion=0,
  1317. flag=wx.EXPAND | wx.ALL,
  1318. border=10)
  1319. #
  1320. # vector lines
  1321. #
  1322. self.win['vector']['lines'] = {}
  1323. showLines = wx.CheckBox(parent=panel, id=wx.ID_ANY,
  1324. label=_("Show vector lines"))
  1325. self.win['vector']['lines']['show'] = showLines.GetId()
  1326. showLines.Bind(wx.EVT_CHECKBOX, self.OnVectorShow)
  1327. pageSizer.Add(item=showLines, proportion=0,
  1328. flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=5)
  1329. box = wx.StaticBox (parent=panel, id=wx.ID_ANY,
  1330. label=" %s " % (_("Vector lines")))
  1331. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  1332. gridSizer = wx.GridBagSizer(vgap=5, hgap=5)
  1333. # width
  1334. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1335. label=_("Width:")),
  1336. pos=(0, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  1337. width = wx.SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  1338. initial=1,
  1339. min=1,
  1340. max=100)
  1341. self.win['vector']['lines']['width'] = width.GetId()
  1342. width.Bind(wx.EVT_SPINCTRL, self.OnVectorLines)
  1343. gridSizer.Add(item=width, pos=(0, 1),
  1344. flag=wx.ALIGN_CENTER_VERTICAL)
  1345. gridSizer.AddGrowableCol(2)
  1346. # color
  1347. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1348. label=_("Color:")),
  1349. pos=(0, 3), flag=wx.ALIGN_CENTER_VERTICAL)
  1350. color = csel.ColourSelect(panel, id=wx.ID_ANY,
  1351. colour=UserSettings.Get(group='nviz', key='vector',
  1352. subkey=['lines', 'color']))
  1353. self.win['vector']['lines']['color'] = color.GetId()
  1354. color.Bind(csel.EVT_COLOURSELECT, self.OnVectorLines)
  1355. gridSizer.Add(item=color, pos=(0, 4))
  1356. gridSizer.AddGrowableCol(5)
  1357. # display
  1358. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1359. label=_("Display:")),
  1360. pos=(0, 6), flag=wx.ALIGN_CENTER_VERTICAL)
  1361. display = wx.Choice (parent=panel, id=wx.ID_ANY, size=(100, -1),
  1362. choices = [_("on surface"),
  1363. _("flat")])
  1364. self.win['vector']['lines']['flat'] = display.GetId()
  1365. display.Bind(wx.EVT_CHOICE, self.OnVectorDisplay)
  1366. gridSizer.Add(item=display, flag=wx.ALIGN_CENTER_VERTICAL,
  1367. pos=(0, 7))
  1368. # hight
  1369. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1370. label=_("Hight above surface:")),
  1371. pos=(1, 0), flag=wx.ALIGN_CENTER_VERTICAL,
  1372. span=(1, 2))
  1373. surface = wx.ComboBox(parent=panel, id=wx.ID_ANY, size=(250, -1),
  1374. style=wx.CB_SIMPLE | wx.CB_READONLY,
  1375. choices=[])
  1376. surface.Bind(wx.EVT_COMBOBOX, self.OnVectorSurface)
  1377. self.win['vector']['lines']['surface'] = surface.GetId()
  1378. gridSizer.Add(item=surface,
  1379. pos=(1, 2), span=(1, 6),
  1380. flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
  1381. self.CreateControl(panel, dict=self.win['vector']['lines'], name='height', size=300,
  1382. range=(0, 1000),
  1383. bind=(self.OnVectorHeight, self.OnVectorHeightFull, self.OnVectorHeightSpin))
  1384. gridSizer.Add(item=self.FindWindowById(self.win['vector']['lines']['height']['slider']),
  1385. pos=(2, 2), span=(1, 6))
  1386. gridSizer.Add(item=self.FindWindowById(self.win['vector']['lines']['height']['spin']),
  1387. pos=(3, 4),
  1388. flag=wx.ALIGN_CENTER)
  1389. boxSizer.Add(item=gridSizer, proportion=1,
  1390. flag=wx.ALL | wx.EXPAND, border=3)
  1391. pageSizer.Add(item=boxSizer, proportion=0,
  1392. flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1393. border=5)
  1394. #
  1395. # vector points
  1396. #
  1397. self.win['vector']['points'] = {}
  1398. showPoints = wx.CheckBox(parent=panel, id=wx.ID_ANY,
  1399. label=_("Show vector points"))
  1400. self.win['vector']['points']['show'] = showPoints.GetId()
  1401. showPoints.Bind(wx.EVT_CHECKBOX, self.OnVectorShow)
  1402. pageSizer.Add(item=showPoints, proportion=0,
  1403. flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=5)
  1404. box = wx.StaticBox (parent=panel, id=wx.ID_ANY,
  1405. label=" %s " % (_("Vector points")))
  1406. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  1407. gridSizer = wx.GridBagSizer(vgap=5, hgap=5)
  1408. # icon size
  1409. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1410. label=_("Icon size:")),
  1411. pos=(0, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  1412. isize = wx.SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  1413. initial=1,
  1414. min=1,
  1415. max=1e6)
  1416. isize.SetName('value')
  1417. self.win['vector']['points']['size'] = isize.GetId()
  1418. isize.Bind(wx.EVT_SPINCTRL, self.OnVectorPoints)
  1419. gridSizer.Add(item=isize, pos=(0, 1),
  1420. flag=wx.ALIGN_CENTER_VERTICAL)
  1421. # icon width
  1422. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1423. label=_("width:")),
  1424. pos=(0, 2), flag=wx.ALIGN_CENTER_VERTICAL)
  1425. iwidth = wx.SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  1426. initial=1,
  1427. min=1,
  1428. max=1e6)
  1429. iwidth.SetName('value')
  1430. self.win['vector']['points']['width'] = iwidth.GetId()
  1431. iwidth.Bind(wx.EVT_SPINCTRL, self.OnVectorPoints)
  1432. gridSizer.Add(item=iwidth, pos=(0, 3),
  1433. flag=wx.ALIGN_CENTER_VERTICAL)
  1434. # icon symbol
  1435. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1436. label=_("symbol:")),
  1437. pos=(0, 4), flag=wx.ALIGN_CENTER_VERTICAL)
  1438. isym = wx.Choice (parent=panel, id=wx.ID_ANY, size=(100, -1),
  1439. choices=UserSettings.Get(group='nviz', key='vector',
  1440. subkey=['points', 'marker'], internal=True))
  1441. isym.SetName("selection")
  1442. self.win['vector']['points']['marker'] = isym.GetId()
  1443. isym.Bind(wx.EVT_CHOICE, self.OnVectorPoints)
  1444. gridSizer.Add(item=isym, flag=wx.ALIGN_CENTER_VERTICAL,
  1445. pos=(0, 5))
  1446. # icon color
  1447. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1448. label=_("color:")),
  1449. pos=(0, 6), flag=wx.ALIGN_CENTER_VERTICAL)
  1450. icolor = csel.ColourSelect(panel, id=wx.ID_ANY)
  1451. icolor.SetName("color")
  1452. self.win['vector']['points']['color'] = icolor.GetId()
  1453. icolor.Bind(csel.EVT_COLOURSELECT, self.OnVectorPoints)
  1454. gridSizer.Add(item=icolor, flag=wx.ALIGN_CENTER_VERTICAL,
  1455. pos=(0, 7))
  1456. # high
  1457. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1458. label=_("Hight above surface:")),
  1459. pos=(1, 0), flag=wx.ALIGN_CENTER_VERTICAL,
  1460. span=(1, 2))
  1461. surface = wx.ComboBox(parent=panel, id=wx.ID_ANY, size=(250, -1),
  1462. style=wx.CB_SIMPLE | wx.CB_READONLY,
  1463. choices=[])
  1464. surface.Bind(wx.EVT_COMBOBOX, self.OnVectorSurface)
  1465. self.win['vector']['points']['surface'] = surface.GetId()
  1466. gridSizer.Add(item=surface,
  1467. pos=(1, 2), span=(1, 6),
  1468. flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
  1469. self.CreateControl(panel, dict=self.win['vector']['points'], name='height', size=300,
  1470. range=(0, 1000),
  1471. bind=(self.OnVectorHeight, self.OnVectorHeightFull, self.OnVectorHeightSpin))
  1472. gridSizer.Add(item=self.FindWindowById(self.win['vector']['points']['height']['slider']),
  1473. pos=(2, 2), span=(1, 6))
  1474. gridSizer.Add(item=self.FindWindowById(self.win['vector']['points']['height']['spin']),
  1475. pos=(3, 4),
  1476. flag=wx.ALIGN_CENTER)
  1477. boxSizer.Add(item=gridSizer, proportion=1,
  1478. flag=wx.ALL | wx.EXPAND, border=3)
  1479. pageSizer.Add(item=boxSizer, proportion=0,
  1480. flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1481. border=5)
  1482. panel.SetSizer(pageSizer)
  1483. return panel.GetBestSize()
  1484. def __createVolumePage(self):
  1485. """Create view settings page"""
  1486. panel = wx.Panel(parent=self.notebook, id=wx.ID_ANY)
  1487. self.page['volume'] = {}
  1488. self.page['volume']['id'] = -1
  1489. self.page['volume']['panel'] = panel.GetId()
  1490. pageSizer = wx.BoxSizer(wx.VERTICAL)
  1491. self.win['volume'] = {}
  1492. #
  1493. # draw
  1494. #
  1495. self.win['volume']['draw'] = {}
  1496. box = wx.StaticBox (parent=panel, id=wx.ID_ANY,
  1497. label=" %s " % (_("Draw")))
  1498. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  1499. gridSizer = wx.GridBagSizer(vgap=5, hgap=5)
  1500. gridSizer.AddGrowableCol(4)
  1501. # mode
  1502. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1503. label=_("Mode:")),
  1504. pos=(0, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  1505. mode = wx.Choice (parent=panel, id=wx.ID_ANY, size=(150, -1),
  1506. choices = [_("isosurfaces"),
  1507. _("slides")])
  1508. mode.SetSelection(0)
  1509. mode.SetName("selection")
  1510. # mode.Bind(wx.EVT_CHOICE, self.OnSurfaceMode)
  1511. self.win['volume']['draw']['mode'] = mode.GetId()
  1512. gridSizer.Add(item=mode, flag=wx.ALIGN_CENTER_VERTICAL,
  1513. pos=(0, 1))
  1514. # shading
  1515. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1516. label=_("Shading:")),
  1517. pos=(0, 2), flag=wx.ALIGN_CENTER_VERTICAL)
  1518. shade = wx.Choice (parent=panel, id=wx.ID_ANY, size=(100, -1),
  1519. choices = [_("flat"),
  1520. _("gouraud")])
  1521. shade.SetName("selection")
  1522. self.win['volume']['draw']['shading'] = shade.GetId()
  1523. # shade.Bind(wx.EVT_CHOICE, self.OnSurfaceMode)
  1524. gridSizer.Add(item=shade, flag=wx.ALIGN_CENTER_VERTICAL,
  1525. pos=(0, 3))
  1526. # resolution (mode)
  1527. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1528. label=_("Resolution:")),
  1529. pos=(0, 4), flag=wx.ALIGN_CENTER_VERTICAL)
  1530. resol = wx.SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  1531. initial=1,
  1532. min=1,
  1533. max=100)
  1534. resol.SetName("value")
  1535. self.win['volume']['draw']['resolution'] = resol.GetId()
  1536. # resC.Bind(wx.EVT_SPINCTRL, self.OnSurfaceResolution)
  1537. gridSizer.Add(item=resol, pos=(0, 5))
  1538. boxSizer.Add(item=gridSizer, proportion=1,
  1539. flag=wx.ALL | wx.EXPAND, border=3)
  1540. pageSizer.Add(item=boxSizer, proportion=0,
  1541. flag=wx.EXPAND | wx.ALL,
  1542. border=5)
  1543. #
  1544. # manage isosurfaces
  1545. #
  1546. box = wx.StaticBox (parent=panel, id=wx.ID_ANY,
  1547. label=" %s " % (_("List of isosurfaces")))
  1548. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  1549. gridSizer = wx.GridBagSizer(vgap=3, hgap=3)
  1550. # list
  1551. isolevel = IsoSurfList(parent=panel, win=self.win['volume'],
  1552. size=(300, 150))
  1553. self.win['volume']['isosurfs'] = isolevel.GetId()
  1554. gridSizer.Add(item=isolevel, pos=(0, 0), span=(4, 1))
  1555. # buttons (add, delete, move up, move down)
  1556. btnAdd = wx.Button(parent=panel, id=wx.ID_ADD)
  1557. self.win['volume']['btnIsoSurfAdd'] = btnAdd.GetId()
  1558. btnAdd.Bind(wx.EVT_BUTTON, self.OnVolumeIsosurfAdd)
  1559. gridSizer.Add(item=btnAdd,
  1560. pos=(0, 1))
  1561. btnDelete = wx.Button(parent=panel, id=wx.ID_DELETE)
  1562. self.win['volume']['btnIsosurfDelete'] = btnDelete.GetId()
  1563. btnDelete.Bind(wx.EVT_BUTTON, self.OnVolumeIsosurfDelete)
  1564. btnDelete.Enable(False)
  1565. gridSizer.Add(item=btnDelete,
  1566. pos=(1, 1))
  1567. btnMoveUp = wx.Button(parent=panel, id=wx.ID_UP)
  1568. self.win['volume']['btnIsosurfMoveUp'] = btnMoveUp.GetId()
  1569. btnMoveUp.Bind(wx.EVT_BUTTON, self.OnVolumeIsosurfMoveUp)
  1570. btnMoveUp.Enable(False)
  1571. gridSizer.Add(item=btnMoveUp,
  1572. pos=(2, 1))
  1573. btnMoveDown = wx.Button(parent=panel, id=wx.ID_DOWN)
  1574. self.win['volume']['btnIsosurfMoveDown'] = btnMoveDown.GetId()
  1575. btnMoveDown.Bind(wx.EVT_BUTTON, self.OnVolumeIsosurfMoveDown)
  1576. btnMoveDown.Enable(False)
  1577. gridSizer.Add(item=btnMoveDown,
  1578. pos=(3, 1))
  1579. boxSizer.Add(item=gridSizer, proportion=1,
  1580. flag=wx.ALL | wx.EXPAND, border=3)
  1581. pageSizer.Add(item=boxSizer, proportion=0,
  1582. flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1583. border=5)
  1584. #
  1585. # isosurface attributes
  1586. #
  1587. box = wx.StaticBox (parent=panel, id=wx.ID_ANY,
  1588. label=" %s " % (_("Isosurface attributes")))
  1589. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  1590. gridSizer = wx.GridBagSizer(vgap=3, hgap=3)
  1591. self.win['volume']['attr'] = {}
  1592. row = 0
  1593. for code, attrb in (('topo', _("Topography level")),
  1594. ('color', _("Color")),
  1595. ('mask', _("Mask")),
  1596. ('transp', _("Transparency")),
  1597. ('shine', _("Shininess")),
  1598. ('emit', _("Emission"))):
  1599. self.win['volume'][code] = {}
  1600. # label
  1601. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1602. label=attrb + ':'),
  1603. pos=(row, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  1604. if code != 'topo':
  1605. use = wx.Choice (parent=panel, id=wx.ID_ANY, size=(100, -1),
  1606. choices = [_("map")])
  1607. else:
  1608. use = None
  1609. # check for required properties
  1610. if code not in ('topo', 'color'):
  1611. use.Insert(item=_("unset"), pos=0)
  1612. self.win['volume'][code]['required'] = False
  1613. else:
  1614. self.win['volume'][code]['required'] = True
  1615. if use and code != 'mask':
  1616. use.Append(item=_('constant'))
  1617. if use:
  1618. self.win['volume'][code]['use'] = use.GetId()
  1619. use.Bind(wx.EVT_CHOICE, self.OnMapObjUse)
  1620. gridSizer.Add(item=use, flag=wx.ALIGN_CENTER_VERTICAL,
  1621. pos=(row, 1))
  1622. if code != 'topo':
  1623. map = gselect.Select(parent=panel, id=wx.ID_ANY,
  1624. # size=globalvar.DIALOG_GSELECT_SIZE,
  1625. size=(200, -1),
  1626. type="grid3")
  1627. self.win['volume'][code]['map'] = map.GetId() - 1 # FIXME
  1628. map.Bind(wx.EVT_TEXT, self.OnSurfaceMap)
  1629. gridSizer.Add(item=map, flag=wx.ALIGN_CENTER_VERTICAL,
  1630. pos=(row, 2))
  1631. else:
  1632. map = None
  1633. if code == 'color':
  1634. value = csel.ColourSelect(panel, id=wx.ID_ANY,
  1635. colour=UserSettings.Get(group='nviz', key='volume',
  1636. subkey=['color', 'value']))
  1637. value.Bind(csel.EVT_COLOURSELECT, self.OnSurfaceMap)
  1638. elif code == 'mask':
  1639. value = None
  1640. else:
  1641. if code == 'topo':
  1642. size = (200, -1)
  1643. else:
  1644. size = (65, -1)
  1645. value = wx.SpinCtrl(parent=panel, id=wx.ID_ANY, size=size,
  1646. initial=0)
  1647. if code == 'topo':
  1648. value.SetRange(minVal=-1e9, maxVal=1e9)
  1649. elif code in ('shine', 'transp', 'emit'):
  1650. value.SetRange(minVal=0, maxVal=255)
  1651. else:
  1652. value.SetRange(minVal=0, maxVal=100)
  1653. value.Bind(wx.EVT_TEXT, self.OnSurfaceMap)
  1654. if value:
  1655. self.win['volume'][code]['const'] = value.GetId()
  1656. if code == 'topo':
  1657. gridSizer.Add(item=value, flag=wx.ALIGN_CENTER_VERTICAL,
  1658. pos=(row, 2))
  1659. else:
  1660. value.Enable(False)
  1661. gridSizer.Add(item=value, flag=wx.ALIGN_CENTER_VERTICAL,
  1662. pos=(row, 3))
  1663. else:
  1664. self.win['volume'][code]['const'] = None
  1665. if code != 'topo':
  1666. self.SetMapObjUseMap(nvizType='volume',
  1667. attrb=code) # -> enable map / disable constant
  1668. row += 1
  1669. boxSizer.Add(item=gridSizer, proportion=1,
  1670. flag=wx.ALL | wx.EXPAND, border=3)
  1671. pageSizer.Add(item=boxSizer, proportion=0,
  1672. flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1673. border=5)
  1674. panel.SetSizer(pageSizer)
  1675. return panel.GetBestSize()
  1676. def __createSettingsPage(self):
  1677. """Create settings page"""
  1678. panel = wx.Panel(parent=self.notebook, id=wx.ID_ANY)
  1679. self.notebook.AddPage(page=panel,
  1680. text=" %s " % _("Settings"))
  1681. pageSizer = wx.BoxSizer(wx.VERTICAL)
  1682. self.win['settings'] = {}
  1683. #
  1684. # general
  1685. #
  1686. self.win['settings']['general'] = {}
  1687. box = wx.StaticBox (parent=panel, id=wx.ID_ANY,
  1688. label=" %s " % (_("General")))
  1689. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  1690. gridSizer = wx.GridBagSizer(vgap=3, hgap=3)
  1691. # background color
  1692. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1693. label=_("Background color:")),
  1694. pos=(0, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  1695. color = csel.ColourSelect(panel, id=wx.ID_ANY,
  1696. colour=UserSettings.Get(group='nviz', key='settings',
  1697. subkey=['general', 'bgcolor']))
  1698. self.win['settings']['general']['bgcolor'] = color.GetId()
  1699. color.Bind(csel.EVT_COLOURSELECT, self.OnBgColor)
  1700. gridSizer.Add(item=color, pos=(0, 1))
  1701. boxSizer.Add(item=gridSizer, proportion=1,
  1702. flag=wx.ALL | wx.EXPAND, border=3)
  1703. pageSizer.Add(item=boxSizer, proportion=0,
  1704. flag=wx.EXPAND | wx.ALL,
  1705. border=5)
  1706. #
  1707. # view
  1708. #
  1709. self.win['settings']['view'] = {}
  1710. box = wx.StaticBox (parent=panel, id=wx.ID_ANY,
  1711. label=" %s " % (_("View")))
  1712. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  1713. gridSizer = wx.GridBagSizer(vgap=3, hgap=3)
  1714. # perspective
  1715. self.win['settings']['view']['persp'] = {}
  1716. pvals = UserSettings.Get(group='nviz', key='view', subkey='persp')
  1717. ipvals = UserSettings.Get(group='nviz', key='view', subkey='persp', internal=True)
  1718. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1719. label=_("Perspective:")),
  1720. pos=(0, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  1721. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1722. label=_("(value)")),
  1723. pos=(0, 1), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
  1724. pval = wx.SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  1725. initial=pvals['value'],
  1726. min=ipvals['min'],
  1727. max=ipvals['max'])
  1728. self.win['settings']['view']['persp']['value'] = pval.GetId()
  1729. gridSizer.Add(item=pval, pos=(0, 2),
  1730. flag=wx.ALIGN_CENTER_VERTICAL)
  1731. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1732. label=_("(step)")),
  1733. pos=(0, 3), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
  1734. pstep = wx.SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  1735. initial=pvals['step'],
  1736. min=ipvals['min'],
  1737. max=ipvals['max']-1)
  1738. self.win['settings']['view']['persp']['step'] = pstep.GetId()
  1739. gridSizer.Add(item=pstep, pos=(0, 4),
  1740. flag=wx.ALIGN_CENTER_VERTICAL)
  1741. # position
  1742. self.win['settings']['view']['pos'] = {}
  1743. posvals = UserSettings.Get(group='nviz', key='view', subkey='pos')
  1744. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1745. label=_("Position:")),
  1746. pos=(1, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  1747. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1748. label=_("(x)")),
  1749. pos=(1, 1), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
  1750. px = wx.SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  1751. initial=posvals['x'] * 100,
  1752. min=0,
  1753. max=100)
  1754. self.win['settings']['view']['pos']['x'] = px.GetId()
  1755. gridSizer.Add(item=px, pos=(1, 2),
  1756. flag=wx.ALIGN_CENTER_VERTICAL)
  1757. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1758. label="(y)"),
  1759. pos=(1, 3), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
  1760. py = wx.SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  1761. initial=posvals['y'] * 100,
  1762. min=0,
  1763. max=100)
  1764. self.win['settings']['view']['pos']['y'] = py.GetId()
  1765. gridSizer.Add(item=py, pos=(1, 4),
  1766. flag=wx.ALIGN_CENTER_VERTICAL)
  1767. # height
  1768. self.win['settings']['view']['height'] = {}
  1769. hvals = UserSettings.Get(group='nviz', key='view', subkey='height')
  1770. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1771. label=_("Height")),
  1772. pos=(2, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  1773. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1774. label=_("(step)")),
  1775. pos=(2, 1), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
  1776. hstep = wx.SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  1777. initial=hvals['step'],
  1778. min=1,
  1779. max=1e6)
  1780. self.win['settings']['view']['height']['step'] = hstep.GetId()
  1781. gridSizer.Add(item=hstep, pos=(2, 2),
  1782. flag=wx.ALIGN_CENTER_VERTICAL)
  1783. # twist
  1784. self.win['settings']['view']['twist'] = {}
  1785. tvals = UserSettings.Get(group='nviz', key='view', subkey='twist')
  1786. itvals = UserSettings.Get(group='nviz', key='view', subkey='twist', internal=True)
  1787. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1788. label=_("Twist")),
  1789. pos=(3, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  1790. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1791. label=_("(value)")),
  1792. pos=(3, 1), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
  1793. tval = wx.SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  1794. initial=tvals['value'],
  1795. min=itvals['min'],
  1796. max=itvals['max'])
  1797. self.win['settings']['view']['twist']['value'] = tval.GetId()
  1798. gridSizer.Add(item=tval, pos=(3, 2),
  1799. flag=wx.ALIGN_CENTER_VERTICAL)
  1800. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1801. label=_("(step)")),
  1802. pos=(3, 3), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
  1803. tstep = wx.SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  1804. initial=tvals['step'],
  1805. min=itvals['min'],
  1806. max=itvals['max']-1)
  1807. self.win['settings']['view']['twist']['step'] = tstep.GetId()
  1808. gridSizer.Add(item=tstep, pos=(3, 4),
  1809. flag=wx.ALIGN_CENTER_VERTICAL)
  1810. # z-exag
  1811. self.win['settings']['view']['z-exag'] = {}
  1812. zvals = UserSettings.Get(group='nviz', key='view', subkey='z-exag')
  1813. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1814. label=_("Z-exag")),
  1815. pos=(4, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  1816. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1817. label=_("(value)")),
  1818. pos=(4, 1), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
  1819. zval = wx.SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  1820. initial=zvals['value'],
  1821. min=-1e6,
  1822. max=1e6)
  1823. self.win['settings']['view']['z-exag']['value'] = zval.GetId()
  1824. gridSizer.Add(item=zval, pos=(4, 2),
  1825. flag=wx.ALIGN_CENTER_VERTICAL)
  1826. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1827. label=_("(step):")),
  1828. pos=(4, 3), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
  1829. zstep = wx.SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  1830. initial=zvals['step'],
  1831. min=-1e6,
  1832. max=1e6)
  1833. self.win['settings']['view']['z-exag']['step'] = zstep.GetId()
  1834. gridSizer.Add(item=zstep, pos=(4, 4),
  1835. flag=wx.ALIGN_CENTER_VERTICAL)
  1836. boxSizer.Add(item=gridSizer, proportion=1,
  1837. flag=wx.ALL | wx.EXPAND, border=3)
  1838. pageSizer.Add(item=boxSizer, proportion=0,
  1839. flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1840. border=5)
  1841. #
  1842. # surface
  1843. #
  1844. self.win['settings']['surface'] = {}
  1845. box = wx.StaticBox (parent=panel, id=wx.ID_ANY,
  1846. label=" %s " % (_("Surface")))
  1847. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  1848. gridSizer = wx.GridBagSizer(vgap=3, hgap=3)
  1849. boxSizer.Add(item=gridSizer, proportion=1,
  1850. flag=wx.ALL | wx.EXPAND, border=3)
  1851. pageSizer.Add(item=boxSizer, proportion=0,
  1852. flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1853. border=5)
  1854. #
  1855. # vector lines
  1856. #
  1857. self.win['settings']['vector'] = {}
  1858. self.win['settings']['vector']['lines'] = {}
  1859. box = wx.StaticBox (parent=panel, id=wx.ID_ANY,
  1860. label=" %s " % (_("Vector lines")))
  1861. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  1862. gridSizer = wx.GridBagSizer(vgap=3, hgap=3)
  1863. # show
  1864. row = 0
  1865. showLines = wx.CheckBox(parent=panel, id=wx.ID_ANY,
  1866. label=_("Show lines"))
  1867. self.win['settings']['vector']['lines']['show'] = showLines.GetId()
  1868. showLines.SetValue(UserSettings.Get(group='nviz', key='vector',
  1869. subkey=['lines', 'show']))
  1870. gridSizer.Add(item=showLines, pos=(row, 0))
  1871. boxSizer.Add(item=gridSizer, proportion=1,
  1872. flag=wx.ALL | wx.EXPAND, border=3)
  1873. pageSizer.Add(item=boxSizer, proportion=0,
  1874. flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1875. border=5)
  1876. #
  1877. # vector points
  1878. #
  1879. self.win['settings']['vector']['points'] = {}
  1880. box = wx.StaticBox (parent=panel, id=wx.ID_ANY,
  1881. label=" %s " % (_("Vector points")))
  1882. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  1883. gridSizer = wx.GridBagSizer(vgap=3, hgap=5)
  1884. # show
  1885. row = 0
  1886. showPoints = wx.CheckBox(parent=panel, id=wx.ID_ANY,
  1887. label=_("Show points"))
  1888. showPoints.SetValue(UserSettings.Get(group='nviz', key='vector',
  1889. subkey=['points', 'show']))
  1890. self.win['settings']['vector']['points']['show'] = showPoints.GetId()
  1891. gridSizer.Add(item=showPoints, pos=(row, 0), span=(1, 8))
  1892. # icon size
  1893. row += 1
  1894. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1895. label=_("Size:")),
  1896. pos=(row, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  1897. isize = wx.SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  1898. initial=100,
  1899. min=1,
  1900. max=1e6)
  1901. self.win['settings']['vector']['points']['size'] = isize.GetId()
  1902. isize.SetValue(UserSettings.Get(group='nviz', key='vector',
  1903. subkey=['points', 'size']))
  1904. gridSizer.Add(item=isize, pos=(row, 1),
  1905. flag=wx.ALIGN_CENTER_VERTICAL)
  1906. # icon width
  1907. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1908. label=_("Witdh:")),
  1909. pos=(row, 2), flag=wx.ALIGN_CENTER_VERTICAL)
  1910. iwidth = wx.SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  1911. initial=2,
  1912. min=1,
  1913. max=1e6)
  1914. self.win['settings']['vector']['points']['width'] = isize.GetId()
  1915. iwidth.SetValue(UserSettings.Get(group='nviz', key='vector',
  1916. subkey=['points', 'width']))
  1917. gridSizer.Add(item=iwidth, pos=(row, 3),
  1918. flag=wx.ALIGN_CENTER_VERTICAL)
  1919. # icon symbol
  1920. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1921. label=_("Marker:")),
  1922. pos=(row, 4), flag=wx.ALIGN_CENTER_VERTICAL)
  1923. isym = wx.Choice (parent=panel, id=wx.ID_ANY, size=(100, -1),
  1924. choices=UserSettings.Get(group='nviz', key='vector',
  1925. subkey=['points', 'marker'], internal=True))
  1926. isym.SetName("selection")
  1927. self.win['settings']['vector']['points']['marker'] = isym.GetId()
  1928. isym.SetSelection(UserSettings.Get(group='nviz', key='vector',
  1929. subkey=['points', 'marker']))
  1930. gridSizer.Add(item=isym, flag=wx.ALIGN_CENTER_VERTICAL,
  1931. pos=(row, 5))
  1932. # icon color
  1933. gridSizer.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
  1934. label=_("Color:")),
  1935. pos=(row, 6), flag=wx.ALIGN_CENTER_VERTICAL)
  1936. icolor = csel.ColourSelect(panel, id=wx.ID_ANY)
  1937. icolor.SetName("color")
  1938. self.win['settings']['vector']['points']['color'] = icolor.GetId()
  1939. icolor.SetColour(UserSettings.Get(group='nviz', key='vector',
  1940. subkey=['points', 'color']))
  1941. gridSizer.Add(item=icolor, flag=wx.ALIGN_CENTER_VERTICAL,
  1942. pos=(row, 7))
  1943. boxSizer.Add(item=gridSizer, proportion=1,
  1944. flag=wx.ALL | wx.EXPAND, border=3)
  1945. pageSizer.Add(item=boxSizer, proportion=0,
  1946. flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  1947. border=5)
  1948. #
  1949. # buttons
  1950. #
  1951. btnDefault = wx.Button(panel, wx.ID_CANCEL, label=_("Default"))
  1952. btnSave = wx.Button(panel, wx.ID_SAVE)
  1953. btnApply = wx.Button(panel, wx.ID_APPLY)
  1954. btnDefault.Bind(wx.EVT_BUTTON, self.OnDefault)
  1955. btnDefault.SetToolTipString(_("Restore default settings"))
  1956. btnApply.Bind(wx.EVT_BUTTON, self.OnApply)
  1957. btnApply.SetToolTipString(_("Apply changes for the current session"))
  1958. btnSave.Bind(wx.EVT_BUTTON, self.OnSave)
  1959. btnSave.SetToolTipString(_("Apply and save changes to user settings file (default for next sessions)"))
  1960. btnSave.SetDefault()
  1961. btnSizer = wx.StdDialogButtonSizer()
  1962. btnSizer.AddButton(btnDefault)
  1963. btnSizer.AddButton(btnApply)
  1964. btnSizer.AddButton(btnSave)
  1965. btnSizer.Realize()
  1966. pageSizer.Add(item=btnSizer, proportion=1,
  1967. flag=wx.EXPAND | wx.ALL | wx.ALIGN_RIGHT | wx.ALIGN_BOTTOM,
  1968. border=5)
  1969. panel.SetSizer(pageSizer)
  1970. return panel.GetBestSize()
  1971. def CreateControl(self, parent, dict, name, range, bind, sliderHor=True, size=200):
  1972. """Add control (Slider + SpinCtrl)"""
  1973. dict[name] = {}
  1974. if sliderHor:
  1975. style = wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | \
  1976. wx.SL_BOTTOM
  1977. sizeW = (size, -1)
  1978. else:
  1979. style = wx.SL_VERTICAL | wx.SL_AUTOTICKS | \
  1980. wx.SL_BOTTOM | wx.SL_INVERSE
  1981. sizeW = (-1, size)
  1982. try:
  1983. val = self.mapWindow.view[name]['value']
  1984. except KeyError:
  1985. val=-1
  1986. slider = wx.Slider(parent=parent, id=wx.ID_ANY,
  1987. value=val,
  1988. minValue=range[0],
  1989. maxValue=range[1],
  1990. style=style,
  1991. size=sizeW)
  1992. slider.SetName('slider')
  1993. slider.Bind(wx.EVT_SCROLL, bind[0])
  1994. slider.Bind(wx.EVT_SCROLL_CHANGED, bind[1])
  1995. dict[name]['slider'] = slider.GetId()
  1996. spin = wx.SpinCtrl(parent=parent, id=wx.ID_ANY, size=(65, -1),
  1997. initial=val,
  1998. min=range[0],
  1999. max=range[1])
  2000. # spin = wx.SpinButton(parent=parent, id=wx.ID_ANY)
  2001. # spin.SetValue (self.mapWindow.view[name]['value'])
  2002. # spin.SetRange(self.mapWindow.view[name]['min'],
  2003. # self.mapWindow.view[name]['max'])
  2004. # no 'changed' event ... (FIXME)
  2005. spin.SetName('spin')
  2006. spin.Bind(wx.EVT_SPINCTRL, bind[2])
  2007. dict[name]['spin'] = spin.GetId()
  2008. def UpdateSettings(self):
  2009. """Update dialog settings"""
  2010. for control in ('height',
  2011. 'persp',
  2012. 'twist',
  2013. 'z-exag'):
  2014. for win in self.win['view'][control].itervalues():
  2015. if control == 'height':
  2016. value = UserSettings.Get(group='nviz', key='view',
  2017. subkey=['height', 'value'], internal=True)
  2018. else:
  2019. value = self.mapWindow.view[control]['value']
  2020. self.FindWindowById(win).SetValue(value)
  2021. self.FindWindowById(self.win['view']['pos']).Draw()
  2022. self.FindWindowById(self.win['view']['pos']).Refresh(False)
  2023. self.Refresh(False)
  2024. def __GetWindowName(self, dict, id):
  2025. for name in dict.iterkeys():
  2026. if type(dict[name]) is type({}):
  2027. for win in dict[name].itervalues():
  2028. if win == id:
  2029. return name
  2030. else:
  2031. if dict[name] == id:
  2032. return name
  2033. return None
  2034. def OnViewChange(self, event):
  2035. """Change view, render in quick mode"""
  2036. # find control
  2037. winName = self.__GetWindowName(self.win['view'], event.GetId())
  2038. if not winName:
  2039. return
  2040. if winName == 'height':
  2041. view = self.mapWindow.iview # internal
  2042. else:
  2043. view = self.mapWindow.view
  2044. view[winName]['value'] = event.GetInt()
  2045. for win in self.win['view'][winName].itervalues():
  2046. self.FindWindowById(win).SetValue(view[winName]['value'])
  2047. self.mapWindow.update.append('view')
  2048. if winName == 'z-exag':
  2049. self.mapWindow.update.append('z-exag')
  2050. self.mapWindow.render['quick'] = True
  2051. self.mapWindow.Refresh(False)
  2052. def OnViewChanged(self, event):
  2053. """View changed, render in full resolution"""
  2054. self.mapWindow.render['quick'] = False
  2055. self.mapWindow.Refresh(False)
  2056. def OnViewChangedSpin(self, event):
  2057. """View changed, render in full resolution"""
  2058. # TODO: use step value instead
  2059. self.OnViewChange(event)
  2060. self.OnViewChanged(None)
  2061. def OnResetView(self, event):
  2062. """Reset to default view (view page)"""
  2063. self.mapWindow.ResetView()
  2064. self.UpdateSettings()
  2065. self.mapWindow.Refresh(False)
  2066. def OnLookAt(self, event):
  2067. """Look at (view page)"""
  2068. sel = event.GetSelection()
  2069. if sel == 0: # top
  2070. self.mapWindow.view['pos']['x'] = 0.5
  2071. self.mapWindow.view['pos']['y'] = 0.5
  2072. elif sel == 1: # north
  2073. self.mapWindow.view['pos']['x'] = 0.5
  2074. self.mapWindow.view['pos']['y'] = 0.0
  2075. elif sel == 2: # south
  2076. self.mapWindow.view['pos']['x'] = 0.5
  2077. self.mapWindow.view['pos']['y'] = 1.0
  2078. elif sel == 3: # east
  2079. self.mapWindow.view['pos']['x'] = 1.0
  2080. self.mapWindow.view['pos']['y'] = 0.5
  2081. elif sel == 4: # west
  2082. self.mapWindow.view['pos']['x'] = 0.0
  2083. self.mapWindow.view['pos']['y'] = 0.5
  2084. elif sel == 5: # north-west
  2085. self.mapWindow.view['pos']['x'] = 0.0
  2086. self.mapWindow.view['pos']['y'] = 0.0
  2087. elif sel == 6: # north-east
  2088. self.mapWindow.view['pos']['x'] = 1.0
  2089. self.mapWindow.view['pos']['y'] = 0.0
  2090. elif sel == 7: # south-east
  2091. self.mapWindow.view['pos']['x'] = 1.0
  2092. self.mapWindow.view['pos']['y'] = 1.0
  2093. elif sel == 8: # south-west
  2094. self.mapWindow.view['pos']['x'] = 0.0
  2095. self.mapWindow.view['pos']['y'] = 1.0
  2096. self.mapWindow.update.append('view')
  2097. self.UpdateSettings()
  2098. self.mapWindow.Refresh(False)
  2099. def OnDefault(self, event):
  2100. """Restore default settings"""
  2101. settings = copy.deepcopy(UserSettings.GetDefaultSettings()['nviz'])
  2102. UserSettings.Set(group='nviz',
  2103. value=settings)
  2104. for subgroup, key in settings.iteritems(): # view, surface, vector...
  2105. if subgroup != 'view':
  2106. continue
  2107. for subkey, value in key.iteritems():
  2108. for subvalue in value.keys():
  2109. win = self.FindWindowById(self.win['settings'][subgroup][subkey][subvalue])
  2110. val = settings[subgroup][subkey][subvalue]
  2111. if subkey == 'pos':
  2112. val = int(val * 100)
  2113. win.SetValue(val)
  2114. event.Skip()
  2115. def OnApply(self, event):
  2116. """Apply button pressed"""
  2117. if self.notebook.GetSelection() == self.page['settings']['id']:
  2118. self.ApplySettings()
  2119. if event:
  2120. event.Skip()
  2121. def ApplySettings(self):
  2122. """Apply Nviz settings for current session"""
  2123. settings = UserSettings.Get(group='nviz')
  2124. for subgroup, key in settings.iteritems(): # view, surface, vector...
  2125. for subkey, value in key.iteritems():
  2126. for subvalue in value.keys():
  2127. try: # TODO
  2128. win = self.FindWindowById(self.win['settings'][subgroup][subkey][subvalue])
  2129. except:
  2130. # print 'e', subgroup, subkey, subvalue
  2131. continue
  2132. if win.GetName() == "selection":
  2133. value = win.GetSelection()
  2134. elif win.GetName() == "color":
  2135. value = tuple(win.GetColour())
  2136. else:
  2137. value = win.GetValue()
  2138. if subkey == 'pos':
  2139. value = float(value) / 100
  2140. settings[subgroup][subkey][subvalue] = value
  2141. def OnSave(self, event):
  2142. """OK button pressed
  2143. Apply changes, update map and save settings of selected layer
  2144. """
  2145. #
  2146. # apply changes
  2147. #
  2148. self.OnApply(None)
  2149. if self.notebook.GetSelection() == self.page['settings']['id']:
  2150. fileSettings = {}
  2151. UserSettings.ReadSettingsFile(settings=fileSettings)
  2152. fileSettings['nviz'] = UserSettings.Get(group='nviz')
  2153. file = UserSettings.SaveToFile(fileSettings)
  2154. self.lmgr.goutput.WriteLog(_('Nviz settings saved to file <%s>.') % file)
  2155. def OnBgColor(self, event):
  2156. """Background color changed"""
  2157. color = event.GetValue()
  2158. color = str(color[0]) + ':' + str(color[1]) + ':' + str(color[2])
  2159. self.mapWindow.nvizClass.SetBgColor(str(color))
  2160. if self.parent.autoRender.IsChecked():
  2161. self.mapWindow.Refresh(False)
  2162. def OnClose(self, event):
  2163. """Close button pressed
  2164. Close dialog
  2165. """
  2166. self.Hide()
  2167. def OnMapObjUse(self, event):
  2168. """Surface attribute -- use -- map/constant"""
  2169. if not self.mapWindow.init:
  2170. return
  2171. wx.Yield()
  2172. # find attribute row
  2173. attrb = self.__GetWindowName(self.win['surface'], event.GetId())
  2174. if not attrb:
  2175. attrb = self.__GetWindowName(self.win['volume'], event.GetId())
  2176. nvizType = 'volume'
  2177. else:
  2178. nvizType = 'surface'
  2179. selection = event.GetSelection()
  2180. if self.win[nvizType][attrb]['required']: # no 'unset'
  2181. selection += 1
  2182. if selection == 0: # unset
  2183. useMap = None
  2184. value = ''
  2185. elif selection == 1: # map
  2186. useMap = True
  2187. value = self.FindWindowById(self.win[nvizType][attrb]['map']).GetValue()
  2188. elif selection == 2: # constant
  2189. useMap = False
  2190. if attrb == 'color':
  2191. value = self.FindWindowById(self.win[nvizType][attrb]['const']).GetColour()
  2192. value = str(value[0]) + ':' + str(value[1]) + ':' + str(value[2])
  2193. else:
  2194. value = self.FindWindowById(self.win[nvizType][attrb]['const']).GetValue()
  2195. self.SetMapObjUseMap(nvizType=nvizType,
  2196. attrb=attrb, map=useMap)
  2197. self.mapWindow.update.append('surface:attribute:%s' % attrb)
  2198. data = self.mapWindow.GetSelectedLayer(type='nviz')
  2199. data[nvizType]['attribute'][attrb] = { 'map' : useMap,
  2200. 'value' : str(value),
  2201. }
  2202. self.mapWindow.UpdateLayerProperties()
  2203. if self.parent.autoRender.IsChecked():
  2204. self.mapWindow.Refresh(False)
  2205. def SetMapObjUseMap(self, nvizType, attrb, map=None):
  2206. if attrb in ('topo', 'color', 'shine'):
  2207. incSel = -1 # decrement selection (no 'unset')
  2208. else:
  2209. incSel = 0
  2210. if map is True: # map
  2211. if attrb != 'topo': # changing map topography not allowed
  2212. # not sure why, but here must be disabled both ids, should be fixed!
  2213. self.FindWindowById(self.win[nvizType][attrb]['map'] + 1).Enable(True)
  2214. if self.win[nvizType][attrb]['const']:
  2215. self.FindWindowById(self.win[nvizType][attrb]['const']).Enable(False)
  2216. self.FindWindowById(self.win[nvizType][attrb]['use']).SetSelection(1 + incSel)
  2217. elif map is False: # const
  2218. self.FindWindowById(self.win[nvizType][attrb]['map'] + 1).Enable(False)
  2219. if self.win[nvizType][attrb]['const']:
  2220. self.FindWindowById(self.win[nvizType][attrb]['const']).Enable(True)
  2221. self.FindWindowById(self.win[nvizType][attrb]['use']).SetSelection(2 + incSel)
  2222. else: # unset
  2223. self.FindWindowById(self.win[nvizType][attrb]['map'] + 1).Enable(False)
  2224. if self.win[nvizType][attrb]['const']:
  2225. self.FindWindowById(self.win[nvizType][attrb]['const']).Enable(False)
  2226. self.FindWindowById(self.win[nvizType][attrb]['use']).SetSelection(0)
  2227. def OnSurfaceMap(self, event):
  2228. """Set surface attribute"""
  2229. if not self.mapWindow.init:
  2230. return
  2231. attrb = self.__GetWindowName(self.win['surface'], event.GetId())
  2232. if not attrb:
  2233. return
  2234. selection = self.FindWindowById(self.win['surface'][attrb]['use']).GetSelection()
  2235. if self.win['surface'][attrb]['required']:
  2236. selection += 1
  2237. if selection == 0: # unset
  2238. map = None
  2239. value = ''
  2240. elif selection == 1: # map
  2241. value = self.FindWindowById(self.win['surface'][attrb]['map']).GetValue()
  2242. map = True
  2243. else: # constant
  2244. if attrb == 'color':
  2245. value = self.FindWindowById(self.win['surface'][attrb]['const']).GetColour()
  2246. # tuple to string
  2247. value = str(value[0]) + ':' + str(value[1]) + ':' + str(value[2])
  2248. else:
  2249. value = self.FindWindowById(self.win['surface'][attrb]['const']).GetValue()
  2250. map = False
  2251. if not self.pageChanging:
  2252. self.mapWindow.update.append('surface:attribute:%s' % attrb)
  2253. data = self.mapWindow.GetSelectedLayer(type='nviz')
  2254. data['surface']['attribute'][attrb] = { 'map' : map,
  2255. 'value' : str(value),
  2256. }
  2257. self.mapWindow.UpdateLayerProperties()
  2258. if self.parent.autoRender.IsChecked():
  2259. self.mapWindow.Refresh(False)
  2260. def OnSurfaceResolution(self, event):
  2261. """Draw resolution changed"""
  2262. self.SetSurfaceResolution()
  2263. if apply and self.parent.autoRender.IsChecked():
  2264. self.mapWindow.Refresh(False)
  2265. def SetSurfaceResolution(self):
  2266. """Set draw resolution"""
  2267. coarse = self.FindWindowById(self.win['surface']['draw']['res-coarse']).GetValue()
  2268. fine = self.FindWindowById(self.win['surface']['draw']['res-fine']).GetValue()
  2269. self.mapWindow.update.append('surface:draw:resolution')
  2270. data = self.mapWindow.GetSelectedLayer(type='nviz')
  2271. data['surface']['draw']['resolution'] = { 'coarse' : coarse,
  2272. 'fine' : fine }
  2273. self.mapWindow.UpdateLayerProperties()
  2274. def SetSurfaceMode(self):
  2275. """Set draw mode
  2276. @param apply allow auto-rendering
  2277. """
  2278. mode = self.FindWindowById(self.win['surface']['draw']['mode']).GetSelection()
  2279. if mode == 0: # coarse
  2280. self.FindWindowById(self.win['surface']['draw']['res-coarse']).Enable(True)
  2281. self.FindWindowById(self.win['surface']['draw']['res-fine']).Enable(False)
  2282. elif mode == 1: # fine
  2283. self.FindWindowById(self.win['surface']['draw']['res-coarse']).Enable(False)
  2284. self.FindWindowById(self.win['surface']['draw']['res-fine']).Enable(True)
  2285. else: # both
  2286. self.FindWindowById(self.win['surface']['draw']['res-coarse']).Enable(True)
  2287. self.FindWindowById(self.win['surface']['draw']['res-fine']).Enable(True)
  2288. style = self.FindWindowById(self.win['surface']['draw']['style']).GetSelection()
  2289. shade = self.FindWindowById(self.win['surface']['draw']['shading']).GetSelection()
  2290. value, desc = self.mapWindow.GetSurfaceMode(mode, style, shade)
  2291. return value, desc
  2292. def OnSurfaceMode(self, event):
  2293. """Set draw mode"""
  2294. value, desc = self.SetSurfaceMode()
  2295. self.mapWindow.update.append('surface:draw:mode')
  2296. data = self.mapWindow.GetSelectedLayer(type='nviz')
  2297. data['surface']['draw']['mode'] = { 'value' : value,
  2298. 'desc' : desc }
  2299. self.mapWindow.UpdateLayerProperties()
  2300. if apply and self.parent.autoRender.IsChecked():
  2301. self.mapWindow.Refresh(False)
  2302. def OnSurfaceModeAll(self, event):
  2303. """Set draw mode (including wire color) for all loaded surfaces"""
  2304. self.SetSurfaceMode(all=True)
  2305. self.SetSurfaceResolution(all=True)
  2306. color = self.FindWindowById(self.win['surface']['draw']['wire-color']).GetColour()
  2307. self.SetSurfaceWireColor(color, all=True)
  2308. if apply and self.parent.autoRender.IsChecked():
  2309. self.mapWindow.Refresh(False)
  2310. def SetSurfaceWireColor(self, color, all=False, apply=True):
  2311. """Set wire color"""
  2312. value = str(color[0]) + ':' + str(color[1]) + ':' + str(color[2])
  2313. def OnSurfaceWireColor(self, event):
  2314. """Set wire color"""
  2315. self.SetSurfaceWireColor(event.GetValue())
  2316. self.mapWindow.update.append('surface:draw:wire-color')
  2317. data = self.mapWindow.GetSelectedLayer(type='nviz')
  2318. data['surface']['draw']['wire-color'] = { 'value' : value }
  2319. self.mapWindow.UpdateLayerProperties()
  2320. if self.parent.autoRender.IsChecked():
  2321. self.mapWindow.Refresh(False)
  2322. def OnSurfaceAxis(self, event):
  2323. """Surface position, axis changed"""
  2324. mapLayer = self.mapWindow.GetSelectedLayer()
  2325. data = self.mapWindow.GetSelectedLayer(type='nviz')
  2326. id = data['object']['id']
  2327. axis = self.FindWindowById(self.win['surface']['position']['axis']).GetSelection()
  2328. win = self.FindWindowById(self.win['surface']['position']['pos'])
  2329. x, y, z = self.mapWindow.nvizClass.GetSurfacePosition(id)
  2330. if axis == 0: # x
  2331. win.SetRange(-1e4, 1e4)
  2332. win.SetValue(x)
  2333. elif axis == 1: # y
  2334. win.SetRange(-1e4, 1e4)
  2335. win.SetValue(y)
  2336. else: # z
  2337. win.SetRange(-1e3, 1e3)
  2338. win.SetValue(z)
  2339. def OnSurfacePosition(self, event):
  2340. """Surface position"""
  2341. axis = self.FindWindowById(self.win['surface']['position']['axis']).GetSelection()
  2342. value = event.GetInt()
  2343. mapLayer = self.mapWindow.GetSelectedLayer()
  2344. data = self.mapWindow.GetSelectedLayer(type='nviz')
  2345. id = data['object']['id']
  2346. x, y, z = self.mapWindow.nvizClass.GetSurfacePosition(id)
  2347. if axis == 0: # x
  2348. x = value
  2349. elif axis == 1: # y
  2350. y = value
  2351. else: # z
  2352. z = value
  2353. self.mapWindow.update.append('surface:position')
  2354. data = self.mapWindow.GetSelectedLayer(type='nviz')
  2355. data['surface']['position']['x'] = x
  2356. data['surface']['position']['y'] = y
  2357. data['surface']['position']['z'] = z
  2358. self.mapWindow.UpdateLayerProperties()
  2359. if self.parent.autoRender.IsChecked():
  2360. self.mapWindow.Refresh(False)
  2361. def UpdateVectorShow(self, vecType, enabled):
  2362. """Enable/disable lines/points widgets
  2363. @param vecType vector type (lines, points)
  2364. """
  2365. if vecType != 'lines' and vecType != 'points':
  2366. return False
  2367. for win in self.win['vector'][vecType].keys():
  2368. if win == 'show':
  2369. continue
  2370. if type(self.win['vector'][vecType][win]) == type({}):
  2371. for swin in self.win['vector'][vecType][win].keys():
  2372. if enabled:
  2373. self.FindWindowById(self.win['vector'][vecType][win][swin]).Enable(True)
  2374. else:
  2375. self.FindWindowById(self.win['vector'][vecType][win][swin]).Enable(False)
  2376. else:
  2377. if enabled:
  2378. self.FindWindowById(self.win['vector'][vecType][win]).Enable(True)
  2379. else:
  2380. self.FindWindowById(self.win['vector'][vecType][win]).Enable(False)
  2381. return True
  2382. def OnVectorShow(self, event):
  2383. """Show vector lines/points"""
  2384. winId = event.GetId()
  2385. if winId == self.win['vector']['lines']['show']:
  2386. vecType = 'lines'
  2387. else: # points
  2388. vecType = 'points'
  2389. checked = event.IsChecked()
  2390. item = self.mapWindow.GetSelectedLayer(type='item')
  2391. data = self.mapWindow.GetSelectedLayer(type='nviz')['vector']
  2392. if checked:
  2393. self.mapWindow.LoadVector(item, (vecType,))
  2394. else:
  2395. self.mapWindow.UnloadVector(item, (vecType,))
  2396. self.UpdateVectorShow(vecType, checked)
  2397. if checked:
  2398. try:
  2399. id = data[vecType]['object']['id']
  2400. except KeyError:
  2401. id = -1
  2402. if id > 0:
  2403. self.mapWindow.SetLayerData(item, id, vecType)
  2404. # update properties
  2405. self.mapWindow.UpdateLayerProperties(item)
  2406. if self.parent.autoRender.IsChecked():
  2407. self.mapWindow.Refresh(False)
  2408. event.Skip()
  2409. def OnVectorDisplay(self, event):
  2410. """Display vector lines on surface/flat"""
  2411. if event.GetSelection() == 0: # surface
  2412. if len(self.mapWindow.layers['raster']['name']) < 1:
  2413. event.Veto()
  2414. return
  2415. self.FindWindowById(self.win['vector']['lines']['surface']).Enable(True)
  2416. # set first found surface
  2417. data = self.mapWindow.GetSelectedLayer(type='nviz')
  2418. data['vector']['lines']['mode']['surface'] = self.mapWindow.layers['raster']['name'][0]
  2419. self.FindWindowById(self.win['vector']['lines']['surface']).SetStringSelection( \
  2420. self.mapWindow.layers['raster']['name'][0])
  2421. else: # flat
  2422. self.FindWindowById(self.win['vector']['lines']['surface']).Enable(False)
  2423. self.OnVectorLines(event)
  2424. event.Skip()
  2425. def OnVectorLines(self, event):
  2426. """Set vector lines mode, apply changes if auto-rendering is enabled"""
  2427. width = self.FindWindowById(self.win['vector']['lines']['width']).GetValue()
  2428. color = self.FindWindowById(self.win['vector']['lines']['color']).GetColour()
  2429. color = str(color[0]) + ':' + str(color[1]) + ':' + str(color[2])
  2430. mode = {}
  2431. if self.FindWindowById(self.win['vector']['lines']['flat']).GetSelection() == 0:
  2432. mode['type'] = 'surface'
  2433. mode['surface'] = self.FindWindowById(self.win['vector']['lines']['surface']).GetValue()
  2434. self.mapWindow.update.append('vector:lines:surface')
  2435. else:
  2436. mode['type'] = 'flat'
  2437. self.mapWindow.update.append('vector:lines:width')
  2438. self.mapWindow.update.append('vector:lines:color')
  2439. self.mapWindow.update.append('vector:lines:mode')
  2440. data = self.mapWindow.GetSelectedLayer(type='nviz')
  2441. data['vector']['lines']['width'] = width
  2442. data['vector']['lines']['color'] = color
  2443. data['vector']['lines']['mode'] = mode
  2444. self.mapWindow.UpdateLayerProperties()
  2445. if self.parent.autoRender.IsChecked():
  2446. self.mapWindow.Refresh(False)
  2447. def OnVectorHeight(self, event):
  2448. value = event.GetInt()
  2449. id = event.GetId()
  2450. if id == self.win['vector']['lines']['height']['spin'] or \
  2451. id == self.win['vector']['lines']['height']['slider']:
  2452. vtype = 'lines'
  2453. else:
  2454. vtype = 'points'
  2455. if type(event) == type(wx.ScrollEvent()):
  2456. # slider
  2457. win = self.FindWindowById(self.win['vector'][vtype]['height']['spin'])
  2458. else:
  2459. # spin
  2460. win = self.FindWindowById(self.win['vector'][vtype]['height']['slider'])
  2461. win.SetValue(value)
  2462. self.mapWindow.update.append('vector:%s:height' % vtype)
  2463. data = self.mapWindow.GetSelectedLayer(type='nviz')
  2464. data['vector'][vtype]['height'] = value
  2465. self.mapWindow.UpdateLayerProperties()
  2466. self.mapWindow.render['quick'] = True
  2467. self.mapWindow.render['v' + vtype] = True
  2468. self.mapWindow.Refresh(False)
  2469. def OnVectorHeightFull(self, event):
  2470. """Vector height changed, render in full resolution"""
  2471. id = event.GetId()
  2472. if id == self.win['vector']['lines']['height']['spin'] or \
  2473. id == self.win['vector']['lines']['height']['slider']:
  2474. vtype = 'lines'
  2475. else:
  2476. vtype = 'points'
  2477. self.mapWindow.render['quick'] = False
  2478. self.mapWindow.render['v' + vtype] = False
  2479. self.mapWindow.Refresh(False)
  2480. def OnVectorHeightSpin(self, event):
  2481. """Vector height changed, render in full resolution"""
  2482. # TODO: use step value instead
  2483. self.OnVectorHeight(event)
  2484. self.OnVectorHeightFull(event)
  2485. def OnVectorSurface(self, event):
  2486. """Reference surface for vector map (lines/points)"""
  2487. id = event.GetId()
  2488. if id == self.win['vector']['lines']['surface']:
  2489. vtype = 'lines'
  2490. else:
  2491. vtype = 'points'
  2492. self.mapWindow.update.append('vector:%s:surface' % vtype)
  2493. data['vector'][vtype]['mode']['surface'] = event.GetValue()
  2494. self.mapWindow.UpdateLayerProperties()
  2495. if self.parent.autoRender.IsChecked():
  2496. self.mapWindow.Refresh(False)
  2497. def OnVectorPoints(self, event):
  2498. """Set vector points mode, apply changes if auto-rendering is enabled"""
  2499. size = self.FindWindowById(self.win['vector']['points']['size']).GetValue()
  2500. width = self.FindWindowById(self.win['vector']['points']['width']).GetValue()
  2501. color = self.FindWindowById(self.win['vector']['points']['color']).GetColour()
  2502. color = str(color[0]) + ':' + str(color[1]) + ':' + str(color[2])
  2503. marker = self.FindWindowById(self.win['vector']['points']['marker']).GetSelection()
  2504. self.mapWindow.update.append('vector:points:size')
  2505. self.mapWindow.update.append('vector:points:width')
  2506. self.mapWindow.update.append('vector:points:color')
  2507. self.mapWindow.update.append('vector:points:marker')
  2508. data = self.mapWindow.GetSelectedLayer(type='nviz')['vector']['points']
  2509. data['size'] = size
  2510. data['width'] = width
  2511. data['color'] = color
  2512. data['marker'] = marker
  2513. self.mapWindow.UpdateLayerProperties()
  2514. if self.parent.autoRender.IsChecked():
  2515. self.mapWindow.Refresh(False)
  2516. def OnVolumeIsosurfAdd(self, event):
  2517. """Add new isosurface to the list"""
  2518. list = self.FindWindowById(self.win['volume']['isosurfs'])
  2519. level = self.FindWindowById(self.win['volume']['topo']['const']).GetValue()
  2520. list.Append("%s %s" % (_("Level"), str(level)))
  2521. list.Check(list.GetCount()-1)
  2522. list.SetSelection(list.GetCount()-1)
  2523. # add isosurface
  2524. layer = self.mapWindow.GetSelectedLayer()
  2525. data = self.mapWindow.GetSelectedLayer(type='nviz')['volume']
  2526. id = data['object']['id']
  2527. self.mapWindow.nvizClass.AddIsosurface(id, level)
  2528. self.mapWindow.nvizClass.SetIsosurfaceColor(id, 0, True, str(layer.name))
  2529. # disable add button on max
  2530. if list.GetCount() >= wxnviz.MAX_ISOSURFS:
  2531. self.FindWindowById(event.GetId()).Enable(False)
  2532. # disable 'move-down'
  2533. moveDown = self.parent.FindWindowById(self.win['volume']['btnIsosurfMoveDown'])
  2534. if not moveDown.IsEnabled():
  2535. moveDown.Enable(False)
  2536. # enable delete & move buttons
  2537. btnDelete = self.FindWindowById(self.win['volume']['btnIsosurfDelete'])
  2538. if not btnDelete.IsEnabled():
  2539. btnDelete.Enable(True)
  2540. if list.GetCount() > 1:
  2541. btnMoveUp = self.FindWindowById(self.win['volume']['btnIsosurfMoveUp'])
  2542. if not btnMoveUp.IsEnabled():
  2543. btnMoveUp.Enable(True)
  2544. if self.parent.autoRender.IsChecked():
  2545. self.mapWindow.Refresh(False)
  2546. event.Skip()
  2547. def OnVolumeIsosurfDelete(self, event):
  2548. """Remove isosurface from list"""
  2549. list = self.FindWindowById(self.win['volume']['isosurfs'])
  2550. btn = self.FindWindowById(event.GetId())
  2551. # remove item from list
  2552. isosurfId = list.GetSelection()
  2553. list.Delete(isosurfId)
  2554. # select last item
  2555. if list.GetCount() > 0:
  2556. list.SetSelection(list.GetCount()-1)
  2557. # delete isosurface
  2558. layer = self.mapWindow.GetSelectedLayer()
  2559. data = self.mapWindow.GetSelectedLayer(type='nviz')['volume']
  2560. id = data['object']['id']
  2561. self.mapWindow.nvizClass.DeleteIsosurface(id, isosurfId)
  2562. # update buttons
  2563. if list.GetCount() < 1:
  2564. btn.Enable(False)
  2565. elif list.GetCount() < 2:
  2566. self.FindWindowById(self.win['volume']['btnIsosurfMoveUp']).Enable(False)
  2567. self.FindWindowById(self.win['volume']['btnIsosurfMoveDown']).Enable(False)
  2568. if self.parent.autoRender.IsChecked():
  2569. self.mapWindow.Refresh(False)
  2570. event.Skip()
  2571. def OnVolumeIsosurfMoveUp(self, event):
  2572. """Move isosurface up in the list"""
  2573. pass
  2574. def OnVolumeIsosurfMoveDown(self, event):
  2575. """Move isosurface dowm in the list"""
  2576. pass
  2577. def UpdatePage(self, pageId):
  2578. """Update dialog (selected page)"""
  2579. self.pageChanging = True
  2580. layer = self.mapWindow.GetSelectedLayer()
  2581. data = self.mapWindow.GetSelectedLayer(type='nviz')
  2582. if pageId == 'view':
  2583. max = self.mapWindow.view['z-exag']['value'] * 10
  2584. hmin = self.mapWindow.iview['height']['min']
  2585. hmax = self.mapWindow.iview['height']['max']
  2586. for control in ('spin', 'slider'):
  2587. self.FindWindowById(self.win['view']['z-exag'][control]).SetRange(1,
  2588. max)
  2589. self.FindWindowById(self.win['view']['height'][control]).SetRange(hmin,
  2590. hmax)
  2591. elif pageId == 'surface':
  2592. if self.notebook.GetSelection() != self.page['surface']['id']:
  2593. for page in ('vector', 'volume'):
  2594. if self.page[page]['id'] > -1:
  2595. self.notebook.RemovePage(self.page[page]['id'])
  2596. self.page[page]['id'] = -1
  2597. self.page['surface']['id'] = 1
  2598. self.page['settings']['id'] = 2
  2599. panel = wx.FindWindowById(self.page['surface']['panel'])
  2600. self.notebook.InsertPage(n=self.page['surface']['id'],
  2601. page=panel,
  2602. text=" %s " % _("Layer properties"),
  2603. select=True)
  2604. self.UpdateSurfacePage(layer, data['surface'])
  2605. elif pageId == 'vector':
  2606. if self.notebook.GetSelection() != self.page['vector']['id']:
  2607. for page in ('surface', 'volume'):
  2608. if self.page[page]['id'] > -1:
  2609. self.notebook.RemovePage(self.page[page]['id'])
  2610. self.page[page]['id'] = -1
  2611. self.page['vector']['id'] = 1
  2612. self.page['settings']['id'] = 2
  2613. panel = wx.FindWindowById(self.page['vector']['panel'])
  2614. self.notebook.InsertPage(n=self.page['vector']['id'],
  2615. page=panel,
  2616. text=" %s " % _("Layer properties"),
  2617. select=True)
  2618. self.UpdateVectorPage(layer, data['vector'])
  2619. elif pageId == 'volume':
  2620. if self.notebook.GetSelection() != self.page['volume']['id']:
  2621. for page in ('surface', 'vector'):
  2622. if self.page[page]['id'] > -1:
  2623. self.notebook.RemovePage(self.page[page]['id'])
  2624. self.page[page]['id'] = -1
  2625. self.page['volume']['id'] = 1
  2626. self.page['settings']['id'] = 2
  2627. panel = wx.FindWindowById(self.page['volume']['panel'])
  2628. self.notebook.InsertPage(n=self.page['volume']['id'],
  2629. page=panel,
  2630. text=" %s " % _("Layer properties"),
  2631. select=True)
  2632. self.UpdateVolumePage(layer, data['volume'])
  2633. self.pageChanging = False
  2634. def UpdateSurfacePage(self, layer, data):
  2635. #
  2636. # attributes
  2637. #
  2638. for attr in ('topo', 'color'): # required
  2639. if layer and layer.type == 'raster':
  2640. self.FindWindowById(self.win['surface'][attr]['map']).SetValue(layer.name)
  2641. else:
  2642. self.FindWindowById(self.win['surface'][attr]['map']).SetValue('')
  2643. self.SetMapObjUseMap(nvizType='surface',
  2644. attrb=attr, map=True) # -> map
  2645. if data['attribute'].has_key('color'):
  2646. value = data['attribute']['color']['value']
  2647. if data['attribute']['color']['map']:
  2648. self.FindWindowById(self.win['surface']['color']['map']).SetValue(value)
  2649. else: # constant
  2650. color = map(int, value.split(':'))
  2651. self.FindWindowById(self.win['surface']['color']['const']).SetColour(color)
  2652. self.SetMapObjUseMap(nvizType='surface',
  2653. attrb=attr, map=data['attribute']['color']['map'])
  2654. self.SetMapObjUseMap(nvizType='surface',
  2655. attrb='shine', map=data['attribute']['shine']['map'])
  2656. value = data['attribute']['shine']['value']
  2657. if data['attribute']['shine']['map']:
  2658. self.FindWindowById(self.win['surface']['shine']['map']).SetValue(value)
  2659. else:
  2660. self.FindWindowById(self.win['surface']['shine']['const']).SetValue(value)
  2661. #
  2662. # draw
  2663. #
  2664. for control, dict in data['draw'].iteritems():
  2665. if control == 'all': # skip 'all' property
  2666. continue
  2667. if control == 'resolution':
  2668. self.FindWindowById(self.win['surface']['draw']['res-coarse']).SetValue(dict['coarse'])
  2669. self.FindWindowById(self.win['surface']['draw']['res-fine']).SetValue(dict['fine'])
  2670. continue
  2671. if control == 'mode':
  2672. if dict['desc']['mode'] == 'coarse':
  2673. self.FindWindowById(self.win['surface']['draw']['mode']).SetSelection(0)
  2674. elif dict['desc']['mode'] == 'fine':
  2675. self.FindWindowById(self.win['surface']['draw']['mode']).SetSelection(1)
  2676. else: # both
  2677. self.FindWindowById(self.win['surface']['draw']['mode']).SetSelection(2)
  2678. if dict['desc']['style'] == 'wire':
  2679. self.FindWindowById(self.win['surface']['draw']['style']).SetSelection(0)
  2680. else: # surface
  2681. self.FindWindowById(self.win['surface']['draw']['style']).SetSelection(1)
  2682. if dict['desc']['shading'] == 'flat':
  2683. self.FindWindowById(self.win['surface']['draw']['shading']).SetSelection(0)
  2684. else: # gouraud
  2685. self.FindWindowById(self.win['surface']['draw']['shading']).SetSelection(1)
  2686. continue
  2687. value = dict['value']
  2688. win = self.FindWindowById(self.win['surface']['draw'][control])
  2689. name = win.GetName()
  2690. if name == "selection":
  2691. win.SetSelection(value)
  2692. elif name == "colour":
  2693. color = map(int, value.split(':'))
  2694. win.SetColour(color)
  2695. else:
  2696. win.SetValue(value)
  2697. # enable/disable res widget + set draw mode
  2698. self.SetSurfaceMode()
  2699. color = self.FindWindowById(self.win['surface']['draw']['wire-color'])
  2700. self.SetSurfaceWireColor(color.GetColour())
  2701. def UpdateVectorPage(self, layer, data):
  2702. vInfo = gcmd.Command(['v.info',
  2703. 'map=%s' % layer.name])
  2704. npoints = nprimitives = 0
  2705. for line in vInfo.ReadStdOutput():
  2706. if 'Map is 3D' in line:
  2707. mapIs3D = int(line.replace('|', '').split(':')[1].strip())
  2708. elif 'Number of points' in line:
  2709. npoints = int(line.replace('|', '').split(':')[1].strip().split(' ')[0])
  2710. nprimitives = npoints
  2711. elif 'Number of lines' in line:
  2712. nprimitives += int(line.replace('|', '').split(':')[1].strip().split(' ')[0])
  2713. elif 'Number of boundaries' in line:
  2714. nprimitives += int(line.replace('|', '').split(':')[1].strip().split(' ')[0]) # boundaries
  2715. nprimitives += int(line.replace('|', '').split(':')[2].strip()) # faces
  2716. elif 'Number of centroids' in line:
  2717. nprimitives += int(line.replace('|', '').split(':')[1].strip().split(' ')[0]) # centroids
  2718. nprimitives += int(line.replace('|', '').split(':')[2].strip()) # kernels
  2719. if mapIs3D:
  2720. desc = _("Vector map <%s> is 3D") % layer.name
  2721. enable = False
  2722. else:
  2723. desc = _("Vector map <%s> is 2D") % layer.name
  2724. enable = True
  2725. desc += " - " + _("%d primitives (%d points)") % (nprimitives, npoints)
  2726. self.FindWindowById(self.win['vector']['lines']['flat']).Enable(enable)
  2727. for v in ('lines', 'points'):
  2728. self.FindWindowById(self.win['vector'][v]['surface']).Enable(enable)
  2729. self.FindWindowById(self.win['vector'][v]['height']['slider']).Enable(enable)
  2730. self.FindWindowById(self.win['vector'][v]['height']['spin']).Enable(enable)
  2731. self.FindWindowById(self.win['vector']['desc']).SetLabel(desc)
  2732. #
  2733. # lines
  2734. #
  2735. showLines = self.FindWindowById(self.win['vector']['lines']['show'])
  2736. if data['lines'].has_key('object'):
  2737. showLines.SetValue(True)
  2738. else:
  2739. showLines.SetValue(False)
  2740. if nprimitives - npoints > 0:
  2741. showLines.Enable(True)
  2742. else:
  2743. showLines.Enable(False)
  2744. self.UpdateVectorShow('lines',
  2745. showLines.IsChecked())
  2746. width = self.FindWindowById(self.win['vector']['lines']['width'])
  2747. width.SetValue(data['lines']['width'])
  2748. color = self.FindWindowById(self.win['vector']['lines']['color'])
  2749. color.SetValue(map(int, data['lines']['color'].split(':')))
  2750. for vtype in ('lines', 'points'):
  2751. if vtype == 'lines':
  2752. display = self.FindWindowById(self.win['vector']['lines']['flat'])
  2753. if data[vtype]['mode']['type'] == 'flat':
  2754. display.SetSelection(1)
  2755. else:
  2756. display.SetSelection(0)
  2757. if data[vtype]['mode']['type'] == 'surface' and \
  2758. len(self.mapWindow.layers['raster']['name']) > 0:
  2759. surface = self.FindWindowById(self.win['vector'][vtype]['surface'])
  2760. surface.SetItems(self.mapWindow.layers['raster']['name'])
  2761. surface.SetStringSelection(data[vtype]['mode']['surface'])
  2762. for type in ('slider', 'spin'):
  2763. win = self.FindWindowById(self.win['vector']['lines']['height'][type])
  2764. win.SetValue(data['lines']['height'])
  2765. #
  2766. # points
  2767. #
  2768. showPoints = self.FindWindowById(self.win['vector']['points']['show'])
  2769. if data['points'].has_key('object'):
  2770. showPoints.SetValue(True)
  2771. else:
  2772. showPoints.SetValue(False)
  2773. if npoints > 0:
  2774. showPoints.Enable(True)
  2775. else:
  2776. showPoints.Enable(False)
  2777. self.UpdateVectorShow('points',
  2778. showPoints.IsChecked())
  2779. # size, width, marker, color
  2780. for prop in ('size', 'width', 'marker', 'color'):
  2781. win = self.FindWindowById(self.win['vector']['points'][prop])
  2782. name = win.GetName()
  2783. if name == 'selection':
  2784. win.SetSelection(data['points'][prop])
  2785. elif name == 'color':
  2786. color = map(int, data['points'][prop].split(':'))
  2787. win.SetValue(color)
  2788. else:
  2789. win.SetValue(data['points'][prop])
  2790. # height
  2791. for type in ('slider', 'spin'):
  2792. win = self.FindWindowById(self.win['vector']['points']['height'][type])
  2793. win.SetValue(data['points']['height'])
  2794. def UpdateVolumePage(self, layer, data):
  2795. """Update volume layer properties page"""
  2796. #
  2797. # draw
  2798. #
  2799. for control, dict in data['draw'].iteritems():
  2800. if control == 'all': # skip 'all' property
  2801. continue
  2802. win = self.FindWindowById(self.win['volume']['draw'][control])
  2803. if win.GetName() == "selection":
  2804. win.SetSelection(dict['value'])
  2805. else:
  2806. win.SetValue(dict['value'])
  2807. #
  2808. # isosurface attributes
  2809. #
  2810. for attr in ('color', ): # required
  2811. if layer and layer.type == '3d-raster':
  2812. self.FindWindowById(self.win['volume'][attr]['map']).SetValue(layer.name)
  2813. else:
  2814. self.FindWindowById(self.win['volume'][attr]['map']).SetValue('')
  2815. self.SetMapObjUseMap(nvizType='volume',
  2816. attrb=attr, map=True) # -> map
  2817. if data['attribute'].has_key('color'):
  2818. value = data['attribute']['color']['value']
  2819. if data['attribute']['color']['map']:
  2820. self.FindWindowById(self.win['volume']['color']['map']).SetValue(value)
  2821. else: # constant
  2822. color = map(int, value.split(':'))
  2823. self.FindWindowById(self.win['volume']['color']['const']).SetColour(color)
  2824. self.SetMapObjUseMap(nvizType='volume',
  2825. attrb=attr, map=data['attribute']['color']['map'])
  2826. self.SetMapObjUseMap(nvizType='volume',
  2827. attrb='shine', map=data['attribute']['shine']['map'])
  2828. value = data['attribute']['shine']['value']
  2829. if data['attribute']['shine']['map']:
  2830. self.FindWindowById(self.win['volume']['shine']['map']).SetValue(value)
  2831. else:
  2832. self.FindWindowById(self.win['volume']['shine']['const']).SetValue(value)
  2833. def SetPage(self, name):
  2834. """Get named page"""
  2835. self.notebook.SetSelection(self.page[name]['id'])
  2836. class ViewPositionWindow(wx.Window):
  2837. """Position control window (for NvizToolWindow)"""
  2838. def __init__(self, parent, id, mapwindow,
  2839. pos=wx.DefaultPosition,
  2840. size=wx.DefaultSize):
  2841. self.mapWindow = mapwindow
  2842. wx.Window.__init__(self, parent, id, pos, size)
  2843. self.SetBackgroundColour("WHITE")
  2844. self.pdc = wx.PseudoDC()
  2845. self.pdc.SetBrush(wx.Brush(colour='dark green', style=wx.SOLID))
  2846. self.pdc.SetPen(wx.Pen(colour='dark green', width=2, style=wx.SOLID))
  2847. self.Draw()
  2848. self.Bind(wx.EVT_ERASE_BACKGROUND, lambda x: None)
  2849. self.Bind(wx.EVT_PAINT, self.OnPaint)
  2850. # self.Bind(wx.EVT_MOTION, self.OnMouse)
  2851. self.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouse)
  2852. def Draw(self, pos=None):
  2853. w, h = self.GetClientSize()
  2854. if pos is None:
  2855. x = self.mapWindow.view['pos']['x']
  2856. y = self.mapWindow.view['pos']['y']
  2857. x = x * w
  2858. y = y * h
  2859. else:
  2860. x, y = pos
  2861. self.pdc.Clear()
  2862. self.pdc.BeginDrawing()
  2863. self.pdc.DrawLine(w / 2, h / 2, x, y)
  2864. self.pdc.DrawCircle(x, y, 5)
  2865. self.pdc.EndDrawing()
  2866. def OnPaint(self, event):
  2867. dc = wx.BufferedPaintDC(self)
  2868. dc.SetBackground(wx.Brush("White"))
  2869. dc.Clear()
  2870. self.PrepareDC(dc)
  2871. self.pdc.DrawToDC(dc)
  2872. def OnMouse(self, event):
  2873. if event.LeftIsDown():
  2874. x, y = event.GetPosition()
  2875. self.Draw(pos=(x, y))
  2876. self.Refresh(False)
  2877. w, h = self.GetClientSize()
  2878. x = float(x) / w
  2879. y = float(y) / h
  2880. if x >= 0 and x <= 1.0:
  2881. self.mapWindow.view['pos']['x'] = x
  2882. if y >= 0 and y <= 1.0:
  2883. self.mapWindow.view['pos']['y'] = y
  2884. self.mapWindow.update.append('view')
  2885. self.mapWindow.render['quick'] = True
  2886. self.mapWindow.Refresh(eraseBackground=False)
  2887. elif event.LeftUp():
  2888. self.mapWindow.render['quick'] = False
  2889. self.mapWindow.Refresh(eraseBackground=False)
  2890. event.Skip()
  2891. class IsoSurfList(wx.CheckListBox):
  2892. """List of loaded volume isosurfaces (volume properties page)"""
  2893. def __init__(self, parent, win, id=wx.ID_ANY, size=wx.DefaultSize):
  2894. self.parent = parent
  2895. self.win = win
  2896. wx.CheckListBox.__init__(self, parent, id, size=size)
  2897. self.Bind(wx.EVT_CHECKLISTBOX, self.OnCheck)
  2898. self.Bind(wx.EVT_LISTBOX, self.OnSelect)
  2899. def OnCheck(self, event):
  2900. """Item checked/unchecked -> load/delete surface"""
  2901. print event.IsChecked()
  2902. def OnSelect(self, event):
  2903. """Item selected"""
  2904. winUp = self.parent.FindWindowById(self.win['btnIsosurfMoveUp'])
  2905. winDown = self.parent.FindWindowById(self.win['btnIsosurfMoveDown'])
  2906. selection = event.GetSelection()
  2907. if selection == 0:
  2908. winUp.Enable(False)
  2909. if not winDown.IsEnabled():
  2910. winDown.Enable()
  2911. elif selection == self.GetCount() - 1:
  2912. winDown.Enable(False)
  2913. if not winUp.IsEnabled():
  2914. winUp.Enable()
  2915. else:
  2916. if not winDown.IsEnabled():
  2917. winDown.Enable()
  2918. if not winUp.IsEnabled():
  2919. winUp.Enable()