preferences.py 27 KB

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