preferences.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728
  1. """
  2. @package nviz.preferences
  3. @brief Nviz (3D view) preferences window
  4. Classes:
  5. - preferences::NvizPreferencesDialog
  6. (C) 2008-2011 by the GRASS Development Team
  7. This program is free software under the GNU General Public License
  8. (>=v2). Read the file COPYING that comes with GRASS for details.
  9. @author Martin Landa <landa.martin gmail.com> (Google SoC 2008/2010)
  10. @author Enhancements by Michael Barton <michael.barton asu.edu>
  11. @author Anna Kratochvilova <KratochAnna seznam.cz> (Google SoC 2011)
  12. """
  13. import os
  14. import copy
  15. import wx
  16. import wx.lib.colourselect as csel
  17. from core import globalvar
  18. from core.settings import UserSettings
  19. from core.utils import _
  20. from gui_core.preferences import PreferencesBaseDialog
  21. from gui_core.wrap import SpinCtrl, Button, CheckBox, StaticText, \
  22. StaticBox
  23. class NvizPreferencesDialog(PreferencesBaseDialog):
  24. """Nviz preferences dialog"""
  25. def __init__(self, parent, giface, title=_("3D view default settings"),
  26. settings=UserSettings):
  27. PreferencesBaseDialog.__init__(
  28. self,
  29. parent=parent,
  30. title=title,
  31. giface=giface,
  32. settings=settings)
  33. self.SetIcon(
  34. wx.Icon(
  35. os.path.join(
  36. globalvar.ICONDIR,
  37. 'grass_nviz.ico'),
  38. wx.BITMAP_TYPE_ICO))
  39. self.toolWin = self.parent.nviz
  40. # create notebook pages
  41. self._createViewPage(self.notebook)
  42. self._createFlyPage(self.notebook)
  43. self._createLightPage(self.notebook)
  44. self._createSurfacePage(self.notebook)
  45. self._createVectorPage(self.notebook)
  46. self.SetMinSize(self.GetBestSize())
  47. self.SetSize(self.size)
  48. self.btnDefault.SetToolTip(
  49. _("Revert settings to default, changes are not applied"))
  50. def _createViewPage(self, notebook):
  51. """Create notebook page for view settings"""
  52. panel = wx.Panel(parent=notebook, id=wx.ID_ANY)
  53. notebook.AddPage(page=panel,
  54. text=" %s " % _("View"))
  55. pageSizer = wx.BoxSizer(wx.VERTICAL)
  56. box = StaticBox(parent=panel, id=wx.ID_ANY,
  57. label=" %s " % (_("View")))
  58. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  59. gridSizer = wx.GridBagSizer(vgap=3, hgap=3)
  60. row = 0
  61. # perspective
  62. pvals = UserSettings.Get(group='nviz', key='view', subkey='persp')
  63. ipvals = UserSettings.Get(
  64. group='nviz',
  65. key='view',
  66. subkey='persp',
  67. settings_type='internal')
  68. gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
  69. label=_("Perspective:")),
  70. pos=(row, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  71. gridSizer.Add(
  72. StaticText(
  73. parent=panel, id=wx.ID_ANY, label=_("value:")), pos=(
  74. row, 1), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
  75. pval = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  76. initial=pvals['value'],
  77. min=ipvals['min'],
  78. max=ipvals['max'])
  79. self.winId['nviz:view:persp:value'] = pval.GetId()
  80. gridSizer.Add(pval, pos=(row, 2),
  81. flag=wx.ALIGN_CENTER_VERTICAL)
  82. gridSizer.Add(
  83. StaticText(
  84. parent=panel, id=wx.ID_ANY, label=_("step:")), pos=(
  85. row, 3), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
  86. pstep = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  87. initial=pvals['step'],
  88. min=ipvals['min'],
  89. max=ipvals['max'] - 1)
  90. self.winId['nviz:view:persp:step'] = pstep.GetId()
  91. gridSizer.Add(pstep, pos=(row, 4),
  92. flag=wx.ALIGN_CENTER_VERTICAL)
  93. row += 1
  94. # position
  95. posvals = UserSettings.Get(group='nviz', key='view', subkey='position')
  96. gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
  97. label=_("Position:")),
  98. pos=(row, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  99. gridSizer.Add(
  100. StaticText(
  101. parent=panel, id=wx.ID_ANY, label=_("x:")), pos=(
  102. row, 1), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
  103. px = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  104. initial=posvals['x'] * 100,
  105. min=0,
  106. max=100)
  107. self.winId['nviz:view:position:x'] = px.GetId()
  108. gridSizer.Add(px, pos=(row, 2),
  109. flag=wx.ALIGN_CENTER_VERTICAL)
  110. gridSizer.Add(
  111. StaticText(
  112. parent=panel, id=wx.ID_ANY, label="y:"), pos=(
  113. row, 3), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
  114. py = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  115. initial=posvals['y'] * 100,
  116. min=0,
  117. max=100)
  118. self.winId['nviz:view:position:y'] = py.GetId()
  119. gridSizer.Add(py, pos=(row, 4),
  120. flag=wx.ALIGN_CENTER_VERTICAL)
  121. row += 1
  122. # height is computed dynamically
  123. # twist
  124. tvals = UserSettings.Get(group='nviz', key='view', subkey='twist')
  125. itvals = UserSettings.Get(
  126. group='nviz',
  127. key='view',
  128. subkey='twist',
  129. settings_type='internal')
  130. gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
  131. label=_("Twist:")),
  132. pos=(row, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  133. gridSizer.Add(
  134. StaticText(
  135. parent=panel, id=wx.ID_ANY, label=_("value:")), pos=(
  136. row, 1), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
  137. tval = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  138. initial=tvals['value'],
  139. min=itvals['min'],
  140. max=itvals['max'])
  141. self.winId['nviz:view:twist:value'] = tval.GetId()
  142. gridSizer.Add(tval, pos=(row, 2),
  143. flag=wx.ALIGN_CENTER_VERTICAL)
  144. row += 1
  145. # z-exag
  146. zvals = UserSettings.Get(group='nviz', key='view', subkey='z-exag')
  147. gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
  148. label=_("Z-exag:")),
  149. pos=(row, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  150. gridSizer.Add(
  151. StaticText(
  152. parent=panel, id=wx.ID_ANY, label=_("value:")), pos=(
  153. row, 1), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
  154. zval = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  155. initial=zvals['value'],
  156. min=-1e6,
  157. max=1e6)
  158. self.winId['nviz:view:z-exag:value'] = zval.GetId()
  159. gridSizer.Add(zval, pos=(row, 2),
  160. flag=wx.ALIGN_CENTER_VERTICAL)
  161. boxSizer.Add(gridSizer, proportion=1,
  162. flag=wx.ALL | wx.EXPAND, border=3)
  163. pageSizer.Add(boxSizer, proportion=0,
  164. flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  165. border=3)
  166. box = StaticBox(parent=panel, id=wx.ID_ANY,
  167. label=" %s " % (_("Image Appearance")))
  168. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  169. gridSizer = wx.GridBagSizer(vgap=3, hgap=3)
  170. # background color
  171. gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
  172. label=_("Background color:")),
  173. pos=(0, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  174. color = csel.ColourSelect(
  175. panel,
  176. id=wx.ID_ANY,
  177. colour=UserSettings.Get(
  178. group='nviz',
  179. key='view',
  180. subkey=[
  181. 'background',
  182. 'color']),
  183. size=globalvar.DIALOG_COLOR_SIZE)
  184. color.SetName('GetColour')
  185. self.winId['nviz:view:background:color'] = color.GetId()
  186. gridSizer.Add(color, pos=(0, 1))
  187. gridSizer.AddGrowableCol(0)
  188. boxSizer.Add(gridSizer, proportion=1,
  189. flag=wx.ALL | wx.EXPAND, border=5)
  190. pageSizer.Add(boxSizer, proportion=0,
  191. flag=wx.EXPAND | wx.ALL,
  192. border=5)
  193. panel.SetSizer(pageSizer)
  194. return panel
  195. def _createFlyPage(self, notebook):
  196. """Create notebook page for view settings"""
  197. panel = wx.Panel(parent=notebook, id=wx.ID_ANY)
  198. notebook.AddPage(page=panel,
  199. text=" %s " % _("Fly-through"))
  200. pageSizer = wx.BoxSizer(wx.VERTICAL)
  201. # fly throuhg mode
  202. box = StaticBox(parent=panel, id=wx.ID_ANY,
  203. label=" %s " % (_("Fly-through mode")))
  204. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  205. gridSizer = wx.GridBagSizer(vgap=3, hgap=3)
  206. # move exag
  207. gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
  208. label=_("Move exag:")),
  209. pos=(0, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  210. moveExag = SpinCtrl(
  211. panel, id=wx.ID_ANY, min=1, max=20, initial=UserSettings.Get(
  212. group='nviz', key='fly', subkey=[
  213. 'exag', 'move']), size=(
  214. 65, -1))
  215. self.winId['nviz:fly:exag:move'] = moveExag.GetId()
  216. gridSizer.Add(moveExag, pos=(0, 1))
  217. # turn exag
  218. gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
  219. label=_("Turn exag:")),
  220. pos=(1, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  221. turnExag = SpinCtrl(
  222. panel, id=wx.ID_ANY, min=1, max=20, initial=UserSettings.Get(
  223. group='nviz', key='fly', subkey=[
  224. 'exag', 'turn']), size=(
  225. 65, -1))
  226. self.winId['nviz:fly:exag:turn'] = turnExag.GetId()
  227. gridSizer.Add(turnExag, pos=(1, 1))
  228. gridSizer.AddGrowableCol(0)
  229. boxSizer.Add(gridSizer, proportion=1,
  230. flag=wx.ALL | wx.EXPAND, border=5)
  231. pageSizer.Add(boxSizer, proportion=0,
  232. flag=wx.EXPAND | wx.ALL,
  233. border=5)
  234. panel.SetSizer(pageSizer)
  235. return panel
  236. def _createLightPage(self, notebook):
  237. """Create notebook page for light settings"""
  238. panel = wx.Panel(parent=notebook, id=wx.ID_ANY)
  239. notebook.AddPage(page=panel,
  240. text=" %s " % _("Lighting"))
  241. pageSizer = wx.BoxSizer(wx.VERTICAL)
  242. box = StaticBox(parent=panel, id=wx.ID_ANY,
  243. label=" %s " % (_("Light")))
  244. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  245. gridSizer = wx.GridBagSizer(vgap=3, hgap=3)
  246. # position
  247. posvals = UserSettings.Get(
  248. group='nviz', key='light', subkey='position')
  249. gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
  250. label=_("Position:")),
  251. pos=(0, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  252. gridSizer.Add(
  253. StaticText(
  254. parent=panel, id=wx.ID_ANY, label=_("x:")), pos=(
  255. 0, 1), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
  256. px = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  257. initial=posvals['x'] * 100,
  258. min=-100,
  259. max=100)
  260. self.winId['nviz:light:position:x'] = px.GetId()
  261. gridSizer.Add(px, pos=(0, 2),
  262. flag=wx.ALIGN_CENTER_VERTICAL)
  263. gridSizer.Add(
  264. StaticText(
  265. parent=panel, id=wx.ID_ANY, label="y:"), pos=(
  266. 0, 3), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
  267. py = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  268. initial=posvals['y'] * 100,
  269. min=-100,
  270. max=100)
  271. self.winId['nviz:light:position:y'] = py.GetId()
  272. gridSizer.Add(py, pos=(0, 4),
  273. flag=wx.ALIGN_CENTER_VERTICAL)
  274. gridSizer.Add(
  275. StaticText(
  276. parent=panel, id=wx.ID_ANY, label=_("z:")), pos=(
  277. 0, 5), flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
  278. pz = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  279. initial=posvals['z'],
  280. min=0,
  281. max=100)
  282. self.winId['nviz:light:position:z'] = pz.GetId()
  283. gridSizer.Add(pz, pos=(0, 6),
  284. flag=wx.ALIGN_CENTER_VERTICAL)
  285. # brightness
  286. brightval = UserSettings.Get(
  287. group='nviz', key='light', subkey='bright')
  288. gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
  289. label=_("Brightness:")),
  290. pos=(1, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  291. bright = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  292. initial=brightval,
  293. min=0,
  294. max=100)
  295. self.winId['nviz:light:bright'] = bright.GetId()
  296. gridSizer.Add(bright, pos=(1, 2),
  297. flag=wx.ALIGN_CENTER_VERTICAL)
  298. # ambient
  299. ambval = UserSettings.Get(group='nviz', key='light', subkey='ambient')
  300. gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
  301. label=_("Ambient:")),
  302. pos=(2, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  303. amb = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  304. initial=ambval,
  305. min=0,
  306. max=100)
  307. self.winId['nviz:light:ambient'] = amb.GetId()
  308. gridSizer.Add(amb, pos=(2, 2),
  309. flag=wx.ALIGN_CENTER_VERTICAL)
  310. # light color
  311. gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
  312. label=_("Color:")),
  313. pos=(3, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  314. color = csel.ColourSelect(
  315. panel, id=wx.ID_ANY, colour=UserSettings.Get(
  316. group='nviz', key='light', subkey='color'),
  317. size=globalvar.DIALOG_COLOR_SIZE)
  318. color.SetName('GetColour')
  319. self.winId['nviz:light:color'] = color.GetId()
  320. gridSizer.Add(color, pos=(3, 2))
  321. boxSizer.Add(gridSizer, proportion=1,
  322. flag=wx.ALL | wx.EXPAND, border=5)
  323. pageSizer.Add(boxSizer, proportion=0,
  324. flag=wx.EXPAND | wx.ALL,
  325. border=5)
  326. panel.SetSizer(pageSizer)
  327. return panel
  328. def _createSurfacePage(self, notebook):
  329. """Create notebook page for surface settings"""
  330. panel = wx.Panel(parent=notebook, id=wx.ID_ANY)
  331. notebook.AddPage(page=panel,
  332. text=" %s " % _("Surface"))
  333. pageSizer = wx.BoxSizer(wx.VERTICAL)
  334. # draw
  335. box = StaticBox(parent=panel, id=wx.ID_ANY,
  336. label=" %s " % (_("Draw")))
  337. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  338. gridSizer = wx.GridBagSizer(vgap=3, hgap=3)
  339. # mode
  340. gridSizer.Add(
  341. StaticText(
  342. parent=panel,
  343. id=wx.ID_ANY,
  344. label=_("Mode:")),
  345. flag=wx.ALIGN_CENTER_VERTICAL,
  346. pos=(
  347. 0,
  348. 0))
  349. mode = wx.Choice(parent=panel, id=wx.ID_ANY, size=(-1, -1),
  350. choices=[_("coarse"),
  351. _("fine"),
  352. _("both")])
  353. self.winId['nviz:surface:draw:mode'] = mode.GetId()
  354. mode.SetName('GetSelection')
  355. mode.SetSelection(UserSettings.Get(group='nviz', key='surface',
  356. subkey=['draw', 'mode']))
  357. gridSizer.Add(mode, flag=wx.ALIGN_CENTER_VERTICAL,
  358. pos=(0, 1))
  359. # fine
  360. gridSizer.Add(
  361. StaticText(
  362. parent=panel,
  363. id=wx.ID_ANY,
  364. label=_("Fine mode:")),
  365. flag=wx.ALIGN_CENTER_VERTICAL,
  366. pos=(
  367. 1,
  368. 0))
  369. res = UserSettings.Get(
  370. group='nviz', key='surface', subkey=[
  371. 'draw', 'res-fine'])
  372. gridSizer.Add(
  373. StaticText(
  374. parent=panel,
  375. id=wx.ID_ANY,
  376. label=_("resolution:")),
  377. flag=wx.ALIGN_CENTER_VERTICAL,
  378. pos=(
  379. 1,
  380. 1))
  381. fine = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  382. initial=res,
  383. min=1,
  384. max=100)
  385. self.winId['nviz:surface:draw:res-fine'] = fine.GetId()
  386. gridSizer.Add(fine, flag=wx.ALIGN_CENTER_VERTICAL,
  387. pos=(1, 2))
  388. # coarse
  389. gridSizer.Add(
  390. StaticText(
  391. parent=panel,
  392. id=wx.ID_ANY,
  393. label=_("Coarse mode:")),
  394. flag=wx.ALIGN_CENTER_VERTICAL,
  395. pos=(
  396. 2,
  397. 0))
  398. res = UserSettings.Get(
  399. group='nviz', key='surface', subkey=[
  400. 'draw', 'res-coarse'])
  401. gridSizer.Add(
  402. StaticText(
  403. parent=panel,
  404. id=wx.ID_ANY,
  405. label=_("resolution:")),
  406. flag=wx.ALIGN_CENTER_VERTICAL,
  407. pos=(
  408. 2,
  409. 1))
  410. coarse = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  411. initial=res,
  412. min=1,
  413. max=100)
  414. self.winId['nviz:surface:draw:res-coarse'] = coarse.GetId()
  415. gridSizer.Add(coarse, flag=wx.ALIGN_CENTER_VERTICAL,
  416. pos=(2, 2))
  417. # style
  418. gridSizer.Add(
  419. StaticText(
  420. parent=panel,
  421. id=wx.ID_ANY,
  422. label=_("style:")),
  423. flag=wx.ALIGN_CENTER_VERTICAL,
  424. pos=(
  425. 3,
  426. 1))
  427. style = wx.Choice(parent=panel, id=wx.ID_ANY, size=(-1, -1),
  428. choices=[_("wire"),
  429. _("surface")])
  430. self.winId['nviz:surface:draw:style'] = style.GetId()
  431. style.SetName('GetSelection')
  432. style.SetSelection(UserSettings.Get(group='nviz', key='surface',
  433. subkey=['draw', 'style']))
  434. self.winId['nviz:surface:draw:style'] = style.GetId()
  435. gridSizer.Add(style, flag=wx.ALIGN_CENTER_VERTICAL,
  436. pos=(3, 2))
  437. # wire color
  438. gridSizer.Add(
  439. StaticText(
  440. parent=panel,
  441. id=wx.ID_ANY,
  442. label=_("wire color:")),
  443. flag=wx.ALIGN_CENTER_VERTICAL,
  444. pos=(
  445. 4,
  446. 1))
  447. color = csel.ColourSelect(
  448. panel, id=wx.ID_ANY, colour=UserSettings.Get(
  449. group='nviz', key='surface', subkey=[
  450. 'draw', 'wire-color']), size=globalvar.DIALOG_COLOR_SIZE)
  451. color.SetName('GetColour')
  452. self.winId['nviz:surface:draw:wire-color'] = color.GetId()
  453. gridSizer.Add(color, flag=wx.ALIGN_CENTER_VERTICAL,
  454. pos=(4, 2))
  455. boxSizer.Add(gridSizer, proportion=1,
  456. flag=wx.ALL | wx.EXPAND, border=5)
  457. pageSizer.Add(boxSizer, proportion=0,
  458. flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  459. border=5)
  460. panel.SetSizer(pageSizer)
  461. return panel
  462. def _createVectorPage(self, notebook):
  463. """Create notebook page for vector settings"""
  464. panel = wx.Panel(parent=notebook, id=wx.ID_ANY)
  465. notebook.AddPage(page=panel,
  466. text=" %s " % _("Vector"))
  467. pageSizer = wx.BoxSizer(wx.VERTICAL)
  468. # vector lines
  469. box = StaticBox(parent=panel, id=wx.ID_ANY,
  470. label=" %s " % (_("Vector lines")))
  471. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  472. gridSizer = wx.GridBagSizer(vgap=3, hgap=3)
  473. row = 0
  474. # icon size
  475. gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
  476. label=_("Width:")),
  477. pos=(row, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  478. iwidth = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  479. initial=12,
  480. min=1,
  481. max=100)
  482. self.winId['nviz:vector:lines:width'] = iwidth.GetId()
  483. iwidth.SetValue(UserSettings.Get(group='nviz', key='vector',
  484. subkey=['lines', 'width']))
  485. gridSizer.Add(iwidth, pos=(row, 1),
  486. flag=wx.ALIGN_CENTER_VERTICAL)
  487. # icon color
  488. gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
  489. label=_("Color:")),
  490. pos=(row, 4), flag=wx.ALIGN_CENTER_VERTICAL)
  491. icolor = csel.ColourSelect(panel, id=wx.ID_ANY,
  492. size=globalvar.DIALOG_COLOR_SIZE)
  493. icolor.SetName('GetColour')
  494. self.winId['nviz:vector:lines:color'] = icolor.GetId()
  495. icolor.SetColour(UserSettings.Get(group='nviz', key='vector',
  496. subkey=['lines', 'color']))
  497. gridSizer.Add(icolor, flag=wx.ALIGN_CENTER_VERTICAL,
  498. pos=(row, 5))
  499. boxSizer.Add(gridSizer, proportion=1,
  500. flag=wx.ALL | wx.EXPAND, border=5)
  501. pageSizer.Add(boxSizer, proportion=0,
  502. flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  503. border=5)
  504. # vector points
  505. box = StaticBox(parent=panel, id=wx.ID_ANY,
  506. label=" %s " % (_("Vector points")))
  507. boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
  508. gridSizer = wx.GridBagSizer(vgap=3, hgap=5)
  509. row = 0
  510. # icon size
  511. autosize = CheckBox(parent=panel, label=_("Automatic size"))
  512. autosize.SetToolTip(_("Icon size is set automatically based on landscape dimensions."))
  513. gridSizer.Add(autosize, pos=(row, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  514. self.winId['nviz:vector:points:autosize'] = autosize.GetId()
  515. autosize.SetValue(UserSettings.Get(group='nviz', key='vector',
  516. subkey=['points', 'autosize']))
  517. row += 1
  518. gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
  519. label=_("Size:")),
  520. pos=(row, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  521. isize = SpinCtrl(parent=panel, id=wx.ID_ANY, size=(65, -1),
  522. initial=100,
  523. min=1,
  524. max=1e6)
  525. self.winId['nviz:vector:points:size'] = isize.GetId()
  526. isize.SetValue(UserSettings.Get(group='nviz', key='vector',
  527. subkey=['points', 'size']))
  528. gridSizer.Add(isize, pos=(row, 1),
  529. flag=wx.ALIGN_CENTER_VERTICAL)
  530. # icon symbol
  531. row += 1
  532. gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
  533. label=_("Marker:")),
  534. pos=(row, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  535. isym = wx.Choice(
  536. parent=panel, id=wx.ID_ANY, size=(100, -1),
  537. choices=UserSettings.Get(
  538. group='nviz', key='vector', subkey=['points', 'marker'],
  539. settings_type='internal'))
  540. isym.SetName("GetSelection")
  541. self.winId['nviz:vector:points:marker'] = isym.GetId()
  542. isym.SetSelection(UserSettings.Get(group='nviz', key='vector',
  543. subkey=['points', 'marker']))
  544. gridSizer.Add(isym, flag=wx.ALIGN_CENTER_VERTICAL,
  545. pos=(row, 1))
  546. # icon color
  547. row += 1
  548. gridSizer.Add(StaticText(parent=panel, id=wx.ID_ANY,
  549. label=_("Color:")),
  550. pos=(row, 0), flag=wx.ALIGN_CENTER_VERTICAL)
  551. icolor = csel.ColourSelect(panel, id=wx.ID_ANY,
  552. size=globalvar.DIALOG_COLOR_SIZE)
  553. icolor.SetName('GetColour')
  554. self.winId['nviz:vector:points:color'] = icolor.GetId()
  555. icolor.SetColour(UserSettings.Get(group='nviz', key='vector',
  556. subkey=['points', 'color']))
  557. gridSizer.Add(icolor, flag=wx.ALIGN_CENTER_VERTICAL,
  558. pos=(row, 1))
  559. boxSizer.Add(gridSizer, proportion=1,
  560. flag=wx.ALL | wx.EXPAND, border=5)
  561. pageSizer.Add(boxSizer, proportion=0,
  562. flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
  563. border=5)
  564. panel.SetSizer(pageSizer)
  565. return panel
  566. def OnDefault(self, event):
  567. """Button 'Set to default' pressed"""
  568. self.settings.userSettings = copy.deepcopy(
  569. self.settings.defaultSettings)
  570. # update widgets
  571. for gks in self.winId.keys():
  572. subkey1 = None
  573. try:
  574. group, key, subkey = gks.split(':')
  575. value = self.settings.Get(group, key, subkey)
  576. except ValueError:
  577. group, key, subkey, subkey1 = gks.split(':')
  578. value = self.settings.Get(group, key, [subkey, subkey1])
  579. if subkey == 'position':
  580. if subkey1 in ('x', 'y'):
  581. value = float(value) * 100
  582. win = self.FindWindowById(self.winId[gks])
  583. if win.GetName() == 'GetSelection':
  584. value = win.SetSelection(value)
  585. else:
  586. value = win.SetValue(value)
  587. def OnApply(self, event):
  588. """Apply Nviz settings for current session"""
  589. for item in self.winId.keys():
  590. try:
  591. group, key, subkey = item.split(':')
  592. subkey1 = None
  593. except ValueError:
  594. group, key, subkey, subkey1 = item.split(':')
  595. id = self.winId[item]
  596. win = self.FindWindowById(id)
  597. if win.GetName() == 'GetSelection':
  598. value = win.GetSelection()
  599. elif win.GetName() == 'GetColour':
  600. value = tuple(win.GetValue())
  601. else:
  602. value = win.GetValue()
  603. if subkey == 'position':
  604. if subkey1 in ('x', 'y'):
  605. value = float(value) / 100
  606. if subkey1:
  607. self.settings.Set(group, value, key, [subkey, subkey1])
  608. else:
  609. self.settings.Set(group, value, key, subkey)
  610. self.toolWin.LoadSettings()
  611. def OnSave(self, event):
  612. """Save button pressed
  613. Apply changes and save settings to configuration file
  614. """
  615. self.OnApply(None)
  616. fileSettings = {}
  617. UserSettings.ReadSettingsFile(settings=fileSettings)
  618. fileSettings['nviz'] = UserSettings.Get(group='nviz')
  619. UserSettings.SaveToFile(fileSettings)
  620. self.parent._gconsole.WriteLog(
  621. _('3D view settings saved to file <%s>.') % UserSettings.filePath)
  622. self.Destroy()