nviz.py 143 KB

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