nviz.py 134 KB

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