preferences.py 28 KB

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