12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234 |
- """
- @package rlisetup.py
- @brief GUI per r.li.setup module
- Classes:
- - RLiSetupFrame (first frame to show existing conf file and choose some
- operation)
- - RLIWizard (the main wizard)
- - FirstPage (first page of wizard, choose name of conf file, raster, vector,
- sampling region)
- - Keyboard (page to insert region areas from keyboard)
- - SamplingAreas (define sampling area)
- - SummaryPage (show chosen options)
- (C) 2011 by the GRASS Development Team
- This program is free software under the GNU General Public License
- (>=v2). Read the file COPYING that comes with GRASS for details.
- @author Luca Delucchi <lucadeluge gmail com>
- """
- import os
- import wx
- from core.globalvar import wxPythonPhoenix
- if wxPythonPhoenix:
- from wx import adv as wiz
- from wx.adv import Wizard
- else:
- from wx import wizard as wiz
- from wx.wizard import Wizard
- import wx.lib.scrolledpanel as scrolled
- from gui_core import gselect
- from gui_core.wrap import Button, StaticText, TextCtrl
- from location_wizard.wizard import GridBagSizerTitledPage as TitledPage
- from rlisetup.functions import checkValue, retRLiPath
- from rlisetup.sampling_frame import RLiSetupMapPanel
- from grass.script import core as grass
- from grass.script import raster as grast
- from grass.script import vector as gvect
- from grass.exceptions import CalledModuleError
- from .functions import (
- SamplingType,
- convertFeature,
- obtainAreaVector,
- obtainCategories,
- sampleAreaVector,
- )
- from core.gcmd import GError, GMessage, RunCommand
- class RLIWizard(object):
- """
- !Start wizard here and finish wizard here
- """
- def __init__(self, parent):
- self.parent = parent
- self.wizard = Wizard(
- parent=parent,
- id=wx.ID_ANY,
- title=_("Create new configuration file for " "r.li modules"),
- )
- self.rlipath = retRLiPath()
- self.msAreaList = []
- # pages
- self.startpage = FirstPage(self.wizard, self)
- self.drawsampleframepage = DrawSampleFramePage(self.wizard, self)
- self.keyboardpage = KeyboardPage(self.wizard, self)
- self.samplingareapage = SamplingAreasPage(self.wizard, self)
- self.summarypage = SummaryPage(self.wizard, self)
- self.units = SampleUnitsKeyPage(self.wizard, self)
- self.drawunits = UnitsMousePage(self.wizard, self)
- self.drawsampleunitspage = DrawSampleUnitsPage(self.wizard, self)
- self.vectorareas = VectorAreasPage(self.wizard, self)
- self.moving = MovingKeyPage(self.wizard, self)
- self.regions = DrawRegionsPage(self.wizard, self)
- # order of pages
- self.startpage.SetNext(self.samplingareapage)
- self.keyboardpage.SetPrev(self.startpage)
- self.keyboardpage.SetNext(self.samplingareapage)
- self.drawsampleframepage.SetNext(self.samplingareapage)
- self.drawsampleframepage.SetPrev(self.startpage)
- self.samplingareapage.SetPrev(self.startpage)
- self.samplingareapage.SetNext(self.summarypage)
- self.regions.SetPrev(self.samplingareapage)
- self.regions.SetNext(self.summarypage)
- self.units.SetPrev(self.samplingareapage)
- self.units.SetNext(self.summarypage)
- self.drawunits.SetPrev(self.samplingareapage)
- self.drawunits.SetNext(self.drawsampleunitspage)
- self.drawsampleunitspage.SetPrev(self.drawunits)
- self.drawsampleunitspage.SetNext(self.summarypage)
- self.moving.SetPrev(self.samplingareapage)
- self.moving.SetNext(self.summarypage)
- self.vectorareas.SetPrev(self.samplingareapage)
- self.vectorareas.SetNext(self.summarypage)
- self.summarypage.SetPrev(self.samplingareapage)
- # layout
- self.startpage.DoLayout()
- self.drawsampleframepage.DoLayout()
- self.keyboardpage.DoLayout()
- self.samplingareapage.DoLayout()
- self.summarypage.DoLayout()
- self.units.DoLayout()
- self.drawunits.DoLayout()
- self.drawsampleunitspage.DoLayout()
- self.regions.DoLayout()
- self.moving.DoLayout()
- self.vectorareas.DoLayout()
- self.wizard.FitToPage(self.startpage)
- # run_wizard
- if self.wizard.RunWizard(self.startpage):
- dlg = wx.MessageDialog(
- parent=self.parent,
- message=_("Do you want to create r.li " "configuration file <%s>?")
- % self.startpage.conf_name,
- caption=_("Create new r.li configuration file?"),
- style=wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION,
- )
- if dlg.ShowModal() == wx.ID_NO:
- self._cleanup()
- else:
- self._write_confile()
- self._cleanup()
- dlg.Destroy()
- else:
- self._cleanup()
- self.wizard.Destroy()
- GMessage(
- parent=self.parent,
- message=_(
- "r.li.setup wizard canceled. " "Configuration file not created."
- ),
- )
- def _write_confile(self):
- """Write the configuration file"""
- f = open(os.path.join(self.rlipath, self.startpage.conf_name), "w")
- self.rasterinfo = grast.raster_info(self.startpage.rast)
- self._write_region(f)
- self._write_area(f)
- f.close()
- def _temp_region(self):
- # save current settings:
- grass.use_temp_region()
- # Temporarily aligning region resolution to $RASTER resolution
- # keep boundary settings
- grass.run_command("g.region", raster=self.startpage.rast)
- self.gregion = grass.region()
- self.SF_NSRES = self.gregion["nsres"]
- self.SF_EWRES = self.gregion["ewres"]
- def _write_region(self, fil):
- """Write the region"""
- if self.startpage.region == "whole":
- fil.write("SAMPLINGFRAME 0|0|1|1\n")
- self._temp_region()
- self.SF_X = 0.0
- self.SF_Y = 0.0
- self.SF_RL = abs(
- int(
- float(self.gregion["s"] - self.gregion["n"])
- / float(self.gregion["nsres"])
- )
- )
- self.SF_CL = abs(
- int(
- float(self.gregion["e"] - self.gregion["w"])
- / float(self.gregion["ewres"])
- )
- )
- self.SF_N = self.gregion["n"]
- self.SF_S = self.gregion["s"]
- self.SF_E = self.gregion["e"]
- self.SF_W = self.gregion["w"]
- self.per_x = float(self.SF_X) / float(self.rasterinfo["cols"])
- self.per_y = float(self.SF_Y) / float(self.rasterinfo["rows"])
- self.per_rl = float(self.SF_RL) / float(self.rasterinfo["rows"])
- self.per_cl = float(self.SF_CL) / float(self.rasterinfo["cols"])
- elif self.startpage.region == "key":
- self._temp_region()
- self.SF_X = float(self.keyboardpage.col_up)
- self.SF_Y = float(self.keyboardpage.row_up)
- self.SF_RL = float(self.keyboardpage.row_len)
- self.SF_CL = float(self.keyboardpage.col_len)
- self.SF_N = self.gregion["n"] - (self.SF_NSRES * self.SF_Y)
- self.SF_S = self.gregion["n"] - (self.SF_NSRES * self.SF_Y + self.SF_RL)
- self.SF_W = self.gregion["w"] + (self.SF_EWRES * self.SF_X)
- self.SF_E = self.gregion["w"] + (self.SF_EWRES * self.SF_X + self.SF_CL)
- self.per_x = float(self.SF_X) / float(self.rasterinfo["cols"])
- self.per_y = float(self.SF_Y) / float(self.rasterinfo["rows"])
- self.per_rl = float(self.SF_RL) / float(self.rasterinfo["rows"])
- self.per_cl = float(self.SF_CL) / float(self.rasterinfo["cols"])
- fil.write(
- "SAMPLINGFRAME %r|%r|%r|%r\n"
- % (self.per_x, self.per_y, self.per_rl, self.per_cl)
- )
- elif self.startpage.region == "draw":
- self._temp_region()
- tregion = self.drawsampleframepage.tregion
- # should we call this? with align param?
- RunCommand(
- "g.region",
- align=self.startpage.rast,
- n=tregion["n"],
- s=tregion["s"],
- w=tregion["w"],
- e=tregion["e"],
- )
- newreg = grass.region()
- self.SF_N = newreg["n"] # set env(SF_N) $n
- self.SF_S = newreg["s"] # set env(SF_S) $s
- self.SF_E = newreg["e"] # set env(SF_E) $e
- self.SF_W = newreg["w"] # set env(SF_W) $w
- self.SF_Y = abs(round(self.gregion["n"] - newreg["n"]) / newreg["nsres"])
- # set env(SF_Y) [expr abs(round(($s_n - $n) / $nres)) ]
- self.SF_X = abs(round(self.gregion["w"] - newreg["w"]) / newreg["ewres"])
- # set env(SF_X) [expr abs(round(($s_w - $w) / $sres)) ]
- self.SF_RL = abs(round(newreg["n"] - newreg["s"]) / newreg["nsres"])
- # set env(SF_RL) [expr abs(round(($n - $s) / $nres)) ]
- self.SF_CL = abs(round(newreg["e"] - newreg["w"]) / newreg["ewres"])
- # set env(SF_CL) [expr abs(round(($e - $w) / $sres)) ]
- self.per_x = float(self.SF_X) / float(self.rasterinfo["cols"])
- # double($env(SF_X)) / double($cols)
- self.per_y = float(self.SF_Y) / float(self.rasterinfo["rows"])
- # double($env(SF_Y)) / double($rows)
- self.per_rl = float(self.SF_RL) / float(self.rasterinfo["rows"])
- # double($env(SF_RL)) / double($rows)
- self.per_cl = float(self.SF_CL) / float(self.rasterinfo["cols"])
- # double($env(SF_CL)) / double($cols)
- fil.write(
- "SAMPLINGFRAME %r|%r|%r|%r\n"
- % (self.per_x, self.per_y, self.per_rl, self.per_cl)
- )
- def _value_for_circle(self, radius):
- self.CIR_RL = round((2 * float(radius)) / float(self.rasterinfo["ewres"]))
- self.CIR_CL = round((2 * float(radius)) / float(self.rasterinfo["nsres"]))
- if not self.CIR_RL % 2:
- self.CIR_RL += 1
- if not self.CIR_CL % 2:
- self.CIR_CL += 1
- return
- def _circle(self, radius, mask):
- """Create a circle mask"""
- self._value_for_circle(radius)
- eastEdge = float(self.SF_W + (self.CIR_RL * self.SF_EWRES))
- southEdge = float(self.SF_N - (self.CIR_CL * self.SF_NSRES))
- grass.del_temp_region()
- grass.use_temp_region()
- grass.run_command("g.region", n=self.SF_N, s=southEdge, e=eastEdge, w=self.SF_W)
- xcenter = grass.region(complete=True)["center_easting"]
- ycenter = grass.region(complete=True)["center_northing"]
- grass.run_command(
- "r.circle",
- flags="b",
- out=mask,
- max=radius,
- coordinate=[xcenter, ycenter],
- quiet=True,
- )
- grass.del_temp_region()
- grass.use_temp_region()
- grass.run_command("g.region", raster=self.startpage.rast)
- def getSamplingType(self):
- """Obtain the sampling type"""
- devicetype = self.samplingareapage.regionbox
- samplingtype = self.samplingareapage.samplingtype
- shapetype = self.units.boxtype
- if samplingtype == SamplingType.UNITS:
- if devicetype == "mouse":
- if shapetype == "circle":
- samtype = SamplingType.MUNITSC
- else:
- samtype = SamplingType.MUNITSR
- elif devicetype == "keyboard":
- if shapetype == "circle":
- samtype = SamplingType.KUNITSC
- else:
- samtype = SamplingType.KUNITSR
- elif samplingtype == SamplingType.MVWIN:
- if devicetype == "mouse":
- if shapetype == "circle":
- samtype = SamplingType.MMVWINC
- else:
- samtype = SamplingType.MMVWINR
- elif devicetype == "keyboard":
- if shapetype == "circle":
- samtype = SamplingType.KMVWINC
- else:
- samtype = SamplingType.KMVWINR
- elif samplingtype == SamplingType.WHOLE:
- samtype = SamplingType.WHOLE
- elif samplingtype == SamplingType.REGIONS:
- samtype = SamplingType.REGIONS
- elif samplingtype == SamplingType.VECT:
- samtype = SamplingType.VECT
- else:
- samtype = samplingtype
- return samtype
- def _write_area(self, fil):
- """Write the area according the type"""
- samtype = self.getSamplingType()
- # sampling type is whole
- if samtype == SamplingType.WHOLE:
- cl = float(self.SF_CL) / float(self.rasterinfo["cols"])
- rl = float(self.SF_RL) / float(self.rasterinfo["rows"])
- # this two variable are unused, problably to remove
- x = float(self.SF_X) / float(self.rasterinfo["cols"])
- y = float(self.SF_Y) / float(self.rasterinfo["rows"])
- fil.write("SAMPLEAREA %r|%r|%r|%r\n" % (self.per_x, self.per_y, rl, cl))
- # KMWINC = samplingtype=moving, regionbox=keyboard, shape=circle
- elif samtype == SamplingType.KMVWINC:
- self._circle(self.moving.width, self.moving.height)
- cl = float(self.CIR_CL) / float(self.rasterinfo["cols"])
- rl = float(self.CIR_RL) / float(self.rasterinfo["rows"])
- fil.write("MASKEDSAMPLEAREA -1|-1|%r|%r" % (rl, cl))
- fil.write("|%s" % self.moving.height)
- fil.write("\nMOVINGWINDOW\n")
- # KMWINR = samplingtype moving, regionbox=keyboard, shape=rectangle
- elif samtype == SamplingType.KMVWINR:
- cl = float(self.moving.width) / float(self.rasterinfo["cols"])
- rl = float(self.moving.height) / float(self.rasterinfo["rows"])
- fil.write("SAMPLEAREA -1|-1|%r|%r" % (rl, cl))
- fil.write("\nMOVINGWINDOW\n")
- # MMVWINR = samplingtype moving, regionbox=mouse, shape=rectangle
- elif samtype == SamplingType.MMVWINR:
- cl = float(self.msAreaList[0]["cols"]) / float(self.rasterinfo["cols"])
- rl = float(self.msAreaList[0]["rows"]) / float(self.rasterinfo["rows"])
- fil.write("SAMPLEAREA -1|-1|%r|%r" % (rl, cl))
- fil.write("\nMOVINGWINDOW\n")
- # MMVWINR = samplingtype moving, regionbox=mouse, shape=circle
- elif samtype == SamplingType.MMVWINC:
- self._value_for_circle(self.msAreaList[0].radius)
- cl = float(self.CIR_CL) / float(self.rasterinfo["cols"])
- rl = float(self.CIR_RL) / float(self.rasterinfo["rows"])
- fil.write("SAMPLEAREA -1|-1|%r|%r" % (rl, cl))
- fil.write("|%s" % self.msAreaList[0].raster)
- fil.write("\nMOVINGWINDOW\n")
- # KUNITSC = samplingtype=units, regionbox=keyboard, shape=cirlce
- # KUNITSR = samplingtype=units, regionbox=keyboard, shape=rectangle
- elif samtype == SamplingType.KUNITSC or samtype == SamplingType.KUNITSR:
- if samtype == SamplingType.KUNITSC:
- self._circle(self.units.width, self.units.height)
- cl = float(self.CIR_CL) / float(self.rasterinfo["cols"])
- rl = float(self.CIR_RL) / float(self.rasterinfo["rows"])
- else:
- cl = float(self.units.width) / float(self.rasterinfo["cols"])
- rl = float(self.units.height) / float(self.rasterinfo["rows"])
- fil.write("SAMPLEAREA -1|-1|%r|%r\n" % (rl, cl))
- if self.units.distrtype == "non_overlapping":
- fil.write("RANDOMNONOVERLAPPING %s\n" % self.units.distr1)
- elif self.units.distrtype == "systematic_contiguos":
- fil.write("SYSTEMATICCONTIGUOUS\n")
- elif self.units.distrtype == "stratified_random":
- fil.write(
- "STRATIFIEDRANDOM %s|%s\n" % (self.units.distr1, self.units.distr2)
- )
- elif self.units.distrtype == "systematic_noncontiguos":
- fil.write("SYSTEMATICNONCONTIGUOUS %s\n" % self.units.distr1)
- elif self.units.distrtype == "centered_oversites":
- fil.write("")
- # elif self.samplingareapage.samplingtype == SamplingType.UNITS and
- # self.samplingareapage.regionbox=='mouse':
- # MUNITSC = samplingtype=units, regionbox=mouse, shape=cirlce
- # MUNITSR = samplingtype=units, regionbox=mouse, shape=rectangle
- elif self.samplingareapage.samplingtype in [
- SamplingType.MUNITSR,
- SamplingType.MUNITSC,
- ]:
- # get the raster region into rastregion
- grass.use_temp_region()
- grass.run_command("g.region", raster=self.startpage.rast)
- rastregion = grass.region()
- s_n = rastregion["n"]
- s_w = rastregion["w"]
- rows = float(self.rasterinfo["rows"])
- cols = float(self.rasterinfo["cols"])
- for tregion in self.msAreaList:
- if self.samplingareapage.samplingtype == SamplingType.MUNITSC:
- tregion = tregion.region
- abs_y = abs(round((float(s_n) - tregion["n"]) / tregion["nsres"]))
- abs_x = abs(round((float(s_w) - tregion["w"]) / tregion["ewres"]))
- abs_rl = abs(round((tregion["n"] - tregion["s"]) / tregion["nsres"]))
- abs_cl = abs(round((tregion["e"] - tregion["w"]) / tregion["ewres"]))
- x = float(abs_x) / float(cols)
- y = float(abs_y) / float(rows)
- rl = float(abs_rl) / float(rows)
- cl = float(abs_cl) / float(cols)
- sarea = str(x) + "|" + str(y) + "|" + str(rl) + "|" + str(cl)
- if self.samplingareapage.samplingtype == SamplingType.MUNITSR:
- fil.write("SQUAREAREA %s\n" % sarea)
- elif self.samplingareapage.samplingtype == SamplingType.MUNITSC:
- fil.write("MASKEDSAMPLEAREA %s" % sarea)
- fil.write("|%s\n" % self.msAreaList[0].raster)
- elif self.samplingareapage.samplingtype == SamplingType.REGIONS:
- rows = float(self.rasterinfo["rows"])
- cols = float(self.rasterinfo["cols"])
- for marea in self.msAreaList:
- gregion = marea.region
- abs_y = self.SF_Y + abs(
- round((self.SF_N - gregion["n"]) / self.SF_NSRES)
- )
- abs_x = self.SF_X + abs(
- round((self.SF_W - gregion["w"]) / self.SF_EWRES)
- )
- abs_rl = abs(round(gregion["n"] - gregion["s"]) / self.SF_NSRES)
- abs_cl = abs(round(gregion["e"] - gregion["w"]) / self.SF_EWRES)
- x = float(abs_x) / float(cols)
- y = float(abs_y) / float(rows)
- rl = float(abs_rl) / float(rows)
- cl = float(abs_cl) / float(cols)
- maskArea = (
- str(x)
- + "|"
- + str(y)
- + "|"
- + str(rl)
- + "|"
- + str(cl)
- + "|"
- + marea.raster
- )
- fil.write("SQUAREAREA %s\n" % maskArea)
- elif self.samplingareapage.samplingtype == SamplingType.VECT:
- for marea in self.msAreaList:
- fil.write(marea)
- fil.write("RASTERMAP {name}\n".format(name=self.startpage.rast))
- fil.write("VECTORMAP {name}\n".format(name=self.startpage.vect))
- def _cleanup(self):
- """Clean all the variables to save into configuration file"""
- self.startpage.conf_name = ""
- self.startpage.rast = ""
- self.startpage.vect = ""
- self.startpage.region = "whole"
- self.keyboardpage.col_len = ""
- self.keyboardpage.col_up = ""
- self.keyboardpage.row_len = ""
- self.keyboardpage.row_up = ""
- self.samplingareapage.samplingtype = "whole"
- self.units.width = ""
- self.units.height = ""
- self.units.boxtype = ""
- self.regions.numregions = 0
- self.moving.width = ""
- self.moving.height = ""
- self.moving.boxtype = ""
- for page in (
- self.drawsampleframepage,
- self.regions,
- self.drawsampleunitspage,
- self.vectorareas,
- ):
- if page.mapPanel:
- page.mapPanel._mgr.UnInit()
- class FirstPage(TitledPage):
- """
- !Set name of configuration file, choose raster and optionally vector/sites
- """
- def __init__(self, wizard, parent):
- TitledPage.__init__(self, wizard, _("Select maps and define name"))
- self.region = "whole"
- self.rast = ""
- self.conf_name = ""
- self.vect = ""
- self.VectorEnabled = True
- self.parent = parent
- # name of output configuration file
- self.newconflabel = StaticText(
- parent=self,
- id=wx.ID_ANY,
- label=_("Name for new configuration file to create"),
- )
- self.newconftxt = TextCtrl(parent=self, id=wx.ID_ANY, size=(250, -1))
- wx.CallAfter(self.newconftxt.SetFocus)
- self.sizer.Add(
- self.newconflabel,
- border=5,
- pos=(0, 0),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.newconftxt,
- border=5,
- pos=(0, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- # raster
- self.mapsellabel = StaticText(
- parent=self, id=wx.ID_ANY, label=_("Raster map to use to select areas")
- )
- self.mapselect = gselect.Select(
- parent=self, id=wx.ID_ANY, size=(250, -1), type="cell", multiple=False
- )
- self.sizer.Add(
- self.mapsellabel,
- border=5,
- pos=(1, 0),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.mapselect,
- border=5,
- pos=(1, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- # vector
- self.vectsellabel = StaticText(
- parent=self, id=wx.ID_ANY, label=_("Vector map to use to select areas")
- )
- self.vectselect = gselect.Select(
- parent=self, id=wx.ID_ANY, size=(250, -1), type="vector", multiple=False
- )
- self.sizer.Add(
- self.vectsellabel,
- border=5,
- pos=(2, 0),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.vectselect,
- border=5,
- pos=(2, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- # vector layer
- self.vectlaylabel = StaticText(
- parent=self,
- id=wx.ID_ANY,
- label=_("Vector map layer to use to select areas"),
- )
- self.vectlayer = wx.ComboBox(parent=self, id=wx.ID_ANY, size=(250, -1))
- self.sizer.Add(
- self.vectlaylabel,
- border=5,
- pos=(3, 0),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.vectlayer,
- border=5,
- pos=(3, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- # define sampling region
- self.sampling_reg = wx.RadioBox(
- parent=self,
- id=wx.ID_ANY,
- label=" %s " % _("Define sampling " "region (region for analysis)"),
- choices=[
- _("Whole map layer"),
- _("Keyboard setting"),
- _("Draw the sampling frame"),
- ],
- majorDimension=1,
- style=wx.RA_SPECIFY_ROWS,
- )
- self.sizer.Add(
- self.sampling_reg,
- flag=wx.ALIGN_CENTER | wx.ALL | wx.EXPAND,
- border=5,
- pos=(5, 0),
- span=(1, 2),
- )
- self.infoError = StaticText(self, label="")
- self.infoError.SetForegroundColour(wx.RED)
- self.sizer.Add(
- self.infoError,
- flag=wx.ALIGN_CENTER | wx.ALL | wx.EXPAND,
- border=5,
- pos=(6, 0),
- span=(1, 2),
- )
- # bindings
- self.sampling_reg.Bind(wx.EVT_RADIOBOX, self.OnSampling)
- self.newconftxt.Bind(wx.EVT_KILL_FOCUS, self.OnName)
- self.newconftxt.Bind(wx.EVT_TEXT, self.OnNameChanged)
- self.vectselect.Bind(wx.EVT_TEXT, self.OnVector)
- self.mapselect.Bind(wx.EVT_TEXT, self.OnRast)
- self.vectlayer.Bind(wx.EVT_TEXT, self.OnLayer)
- self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
- self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnExitPage)
- wx.CallAfter(wx.FindWindowById(wx.ID_FORWARD).Enable, False)
- def OnSampling(self, event):
- """Change region type"""
- if event.GetInt() == 0:
- self.region = "whole"
- self.SetNext(self.parent.samplingareapage)
- elif event.GetInt() == 1:
- self.region = "key"
- self.SetNext(self.parent.keyboardpage)
- elif event.GetInt() == 2: # currently disabled
- self.region = "draw"
- self.SetNext(self.parent.drawsampleframepage)
- def OnName(self, event):
- """Sets the name of configuration file"""
- if self.conf_name in self.parent.parent.listfiles:
- GMessage(
- parent=self,
- message=_(
- "The configuration file %s " "already exists, please change name"
- )
- % self.conf_name,
- )
- self.newconftxt.SetValue("")
- self.conf_name = ""
- def OnNameChanged(self, event):
- """Name of configuration file has changed"""
- self.conf_name = self.newconftxt.GetValue()
- next = wx.FindWindowById(wx.ID_FORWARD)
- next.Enable(self.CheckInput())
- def OnRast(self, event):
- """Sets raster map"""
- self.rast = self.mapselect.GetValue()
- next = wx.FindWindowById(wx.ID_FORWARD)
- next.Enable(self.CheckInput())
- def OnVector(self, event):
- """Sets vector map"""
- self.vect = self.vectselect.GetValue()
- if self.vect:
- self.VectorEnabled, layers = self.CheckVector(self.vect)
- if self.VectorEnabled:
- self.vectlayer.SetItems(layers)
- self.vectlayer.SetSelection(0)
- self.vectorlayer = self.vectlayer.GetValue()
- self.infoError.SetLabel("")
- else:
- self.vectlayer.Clear()
- self.vectlayer.SetValue("")
- self.vect = ""
- else:
- self.infoError.SetLabel("")
- self.vectlayer.Clear()
- self.vectlayer.SetValue("")
- next = wx.FindWindowById(wx.ID_FORWARD)
- next.Enable(self.CheckInput())
- def OnLayer(self, event):
- try:
- self.vectorlayer = self.vectlayer.GetValue()
- except:
- self.vectorlayer = None
- next = wx.FindWindowById(wx.ID_FORWARD)
- next.Enable(self.CheckInput())
- def OnEnterPage(self, event):
- """Sets the default values, for the entire map"""
- next = wx.FindWindowById(wx.ID_FORWARD)
- next.Enable(self.CheckInput())
- wx.CallAfter(wx.FindWindowById(wx.ID_FORWARD).Enable, self.CheckInput())
- def CheckVector(self, vector):
- """Check if the type of vector is area and return the number of
- vector's layer"""
- try:
- areas = gvect.vector_info_topo(vector)["areas"]
- except CalledModuleError:
- self.infoError.SetLabel(
- _("Vector %s was not found, please " "select another vector") % vector
- )
- return False, []
- if areas == 0:
- self.infoError.SetLabel(
- _("Vector %s has no areas, please " "select another vector") % vector
- )
- return False, []
- links = gvect.vector_info(vector)["num_dblinks"]
- if links == 0:
- self.infoError.SetLabel(
- _("Vector %s has no table connected, " "please select another vector")
- % vector
- )
- return False, []
- elif links > 0:
- layers = []
- for i in range(1, links + 1):
- layers.append(str(i))
- return True, layers
- else:
- return False, []
- def CheckInput(self):
- """Check input fields.
- :return: True if configuration file is given and raster xor vector map,
- False otherwise
- """
- return bool(self.conf_name and bool(self.rast and bool(self.VectorEnabled)))
- def OnExitPage(self, event=None):
- """Function during exiting"""
- next = wx.FindWindowById(wx.ID_FORWARD)
- next.Enable(self.CheckInput())
- if event.GetDirection():
- if self.region == "key":
- self.SetNext(self.parent.keyboardpage)
- self.parent.samplingareapage.SetPrev(self.parent.keyboardpage)
- elif self.region == "whole":
- self.SetNext(self.parent.samplingareapage)
- self.parent.samplingareapage.SetPrev(self)
- elif self.region == "draw":
- self.SetNext(self.parent.drawsampleframepage)
- self.parent.samplingareapage.SetPrev(self.parent.drawsampleframepage)
- return
- class KeyboardPage(TitledPage):
- """
- !Choose the region setting the values of border using the keyboard
- """
- def __init__(self, wizard, parent):
- TitledPage.__init__(self, wizard, _("Insert sampling frame parameter"))
- self.parent = parent
- self.col_len = ""
- self.row_len = ""
- self.col_up = "0"
- self.row_up = "0"
- # column up/left
- self.ColUpLeftlabel = StaticText(
- parent=self, id=wx.ID_ANY, label=_("Column of upper left " "corner")
- )
- self.ColUpLefttxt = TextCtrl(parent=self, id=wx.ID_ANY, size=(250, -1))
- wx.CallAfter(self.ColUpLeftlabel.SetFocus)
- self.sizer.Add(
- self.ColUpLeftlabel,
- border=5,
- pos=(1, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.ColUpLefttxt,
- border=5,
- pos=(1, 2),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.AddGrowableCol(2)
- # row up/left
- self.RowUpLeftlabel = StaticText(
- parent=self, id=wx.ID_ANY, label=_("Row of upper left corner")
- )
- self.RowUpLefttxt = TextCtrl(parent=self, id=wx.ID_ANY, size=(250, -1))
- wx.CallAfter(self.RowUpLeftlabel.SetFocus)
- self.sizer.Add(
- self.RowUpLeftlabel,
- border=5,
- pos=(2, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.RowUpLefttxt,
- border=5,
- pos=(2, 2),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- # row length
- self.RowLenlabel = StaticText(
- parent=self, id=wx.ID_ANY, label=_("Row length of sampling frame")
- )
- self.RowLentxt = TextCtrl(parent=self, id=wx.ID_ANY, size=(250, -1))
- wx.CallAfter(self.RowLenlabel.SetFocus)
- self.sizer.Add(
- self.RowLenlabel,
- border=5,
- pos=(3, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.RowLentxt,
- border=5,
- pos=(3, 2),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- # column length
- self.ColLenlabel = StaticText(
- parent=self, id=wx.ID_ANY, label=_("Row length of sampling frame")
- )
- self.ColLentxt = TextCtrl(parent=self, id=wx.ID_ANY, size=(250, -1))
- wx.CallAfter(self.ColLenlabel.SetFocus)
- self.sizer.Add(
- self.ColLenlabel,
- border=5,
- pos=(4, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.ColLentxt,
- border=5,
- pos=(4, 2),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.ColUpLefttxt.SetValue(self.col_up)
- self.RowUpLefttxt.SetValue(self.row_up)
- self.ColUpLefttxt.Bind(wx.EVT_KILL_FOCUS, self.OnColLeft)
- self.RowUpLefttxt.Bind(wx.EVT_KILL_FOCUS, self.OnRowLeft)
- self.ColLentxt.Bind(wx.EVT_KILL_FOCUS, self.OnColLen)
- self.RowLentxt.Bind(wx.EVT_KILL_FOCUS, self.OnRowLen)
- self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
- self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnExitPage)
- def OnColLeft(self, event):
- """Sets the name of configuration file"""
- self.col_up = self.ColUpLefttxt.GetValue()
- checkValue(self.col_up)
- def OnRowLeft(self, event):
- """Sets the name of configuration file"""
- self.row_up = self.RowUpLefttxt.GetValue()
- checkValue(self.row_up)
- def OnColLen(self, event):
- """Sets the name of configuration file"""
- self.col_len = self.ColLentxt.GetValue()
- checkValue(self.col_len)
- def OnRowLen(self, event):
- """Sets the name of configuration file"""
- self.row_len = self.RowLentxt.GetValue()
- checkValue(self.row_len)
- def OnEnterPage(self, event):
- """Sets the default values, for the entire map"""
- # R# check if raster exists before anything
- if self.col_len == "" and self.row_len == "":
- rastinfo = grast.raster_info(self.parent.startpage.rast)
- self.col_len = rastinfo["cols"]
- self.row_len = rastinfo["rows"]
- self.ColLentxt.SetValue(self.col_len)
- self.RowLentxt.SetValue(self.row_len)
- def OnExitPage(self, event=None):
- """Function during exiting"""
- if (
- self.row_len == ""
- or self.col_len == ""
- or self.row_up == ""
- or self.col_up == ""
- ):
- wx.FindWindowById(wx.ID_FORWARD).Enable(False)
- else:
- wx.FindWindowById(wx.ID_FORWARD).Enable(True)
- class DrawSampleFramePage(TitledPage):
- """Choose the region setting the values drawing a box"""
- def __init__(self, wizard, parent):
- TitledPage.__init__(self, wizard, _("Draw sampling frame"))
- self.parent = parent
- self.mapPanel = None
- self.tregion = None
- self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
- self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnExitPage)
- def SampleFrameChanged(self, region):
- """Enables the next dialog when region is set"""
- if region:
- self.tregion = region
- wx.FindWindowById(wx.ID_FORWARD).Enable(True)
- else:
- wx.FindWindowById(wx.ID_FORWARD).Enable(False)
- def OnEnterPage(self, event):
- """Function during entering"""
- if self.mapPanel is None:
- self.mapPanel = RLiSetupMapPanel(self, samplingType="drawFrame")
- self.mapPanel.sampleFrameChanged.connect(self.SampleFrameChanged)
- self.sizer.Add(self.mapPanel, flag=wx.EXPAND, pos=(0, 0))
- self.sizer.AddGrowableCol(0)
- self.sizer.AddGrowableRow(0)
- self._raster = None
- else:
- self.mapPanel._region = {}
- self.SampleFrameChanged(region=None)
- rast = self.parent.startpage.rast
- if self._raster != rast:
- map_ = self.mapPanel.GetMap()
- map_.DeleteAllLayers()
- cmdlist = ["d.rast", "map=%s" % rast]
- map_.AddLayer(
- ltype="raster",
- command=cmdlist,
- active=True,
- name=rast,
- hidden=False,
- opacity=1.0,
- render=True,
- )
- def OnExitPage(self, event=None):
- """Function during exiting"""
- if event.GetDirection():
- self.SetNext(self.parent.samplingareapage)
- self.parent.samplingareapage.SetPrev(self)
- else:
- wx.FindWindowById(wx.ID_FORWARD).Enable(True)
- class SamplingAreasPage(TitledPage):
- """
- Set name of configuration file, choose raster and optionally vector/sites.
- This is coming after choose the region
- """
- def __init__(self, wizard, parent):
- TitledPage.__init__(self, wizard, _("Insert sampling areas"))
- self.samplingtype = "whole"
- self.parent = parent
- self.overwriteTemp = False
- # toggles
- self.radioBox = wx.RadioBox(
- parent=self,
- id=wx.ID_ANY,
- label="",
- choices=[
- _("Whole map layer"),
- _("Regions"),
- _("Sample units"),
- _("Moving window"),
- _("Select areas from the\n" "overlaid vector map"),
- ],
- majorDimension=1,
- style=wx.RA_SPECIFY_COLS | wx.NO_BORDER,
- )
- # layout
- self.sizer.SetVGap(10)
- self.sizer.Add(self.radioBox, flag=wx.ALIGN_LEFT, pos=(0, 0))
- self.regionBox = wx.RadioBox(
- parent=self,
- id=wx.ID_ANY,
- label=_("Choose a method"),
- choices=[
- _("Use keyboard to enter sampling area"),
- _("Use mouse to draw sampling area"),
- ],
- majorDimension=1,
- style=wx.RA_SPECIFY_ROWS,
- )
- # self.regionBox.EnableItem(1, False)
- self.regionBox.SetItemToolTip(1, _("This option is not supported yet"))
- self.sizer.Add(self.regionBox, flag=wx.ALIGN_CENTER, pos=(1, 0))
- # bindings
- self.radioBox.Bind(wx.EVT_RADIOBOX, self.SetVal)
- self.regionBox.Bind(wx.EVT_RADIOBOX, self.OnRegionDraw)
- self.regionbox = "keyboard"
- self.regionPanelSizer = wx.GridBagSizer(1, 2)
- self.regionNumPanel = wx.Panel(parent=self, id=wx.ID_ANY)
- self.regionNumLabel = StaticText(
- parent=self.regionNumPanel,
- id=wx.ID_ANY,
- label=_("Number of regions to draw:"),
- )
- self.regionNumTxt = TextCtrl(
- parent=self.regionNumPanel, id=wx.ID_ANY, size=(50, -1)
- )
- self.regionPanelSizer.Add(self.regionNumLabel, flag=wx.ALIGN_CENTER, pos=(0, 0))
- self.regionPanelSizer.Add(self.regionNumTxt, flag=wx.ALIGN_CENTER, pos=(0, 1))
- self.regionNumPanel.SetSizer(self.regionPanelSizer)
- self.sizer.Add(self.regionNumPanel, flag=wx.ALIGN_CENTER, pos=(2, 0))
- self.areaPanelSizer = wx.GridBagSizer(2, 3)
- self.areaPanel = wx.Panel(parent=self, id=wx.ID_ANY)
- self.overwriteText = StaticText(
- parent=self.areaPanel,
- id=wx.ID_ANY,
- label=_(
- "Do you want to overwrite existing" " temporal maps if they exist?"
- ),
- )
- self.overwriteCheck = wx.CheckBox(parent=self.areaPanel, id=wx.ID_ANY)
- self.areaText = StaticText(
- parent=self.areaPanel,
- id=wx.ID_ANY,
- label=_("Do you want to check vector areas?"),
- )
- self.areaOK = Button(self.areaPanel, wx.ID_ANY, "Yes", (50, 80))
- self.areaOK.SetToolTip(_("Select if use area by area"))
- self.areaNO = Button(self.areaPanel, wx.ID_ANY, "No", (50, 80))
- self.areaNO.SetToolTip(_("All the features will be used"))
- self.areaOK.Bind(wx.EVT_BUTTON, self.OnVectYes)
- self.areaNO.Bind(wx.EVT_BUTTON, self.OnVectNo)
- self.overwriteCheck.Bind(wx.EVT_CHECKBOX, self.OnOverwrite)
- self.areaPanelSizer.Add(self.overwriteText, flag=wx.ALIGN_CENTER, pos=(0, 0))
- self.areaPanelSizer.Add(self.overwriteCheck, flag=wx.ALIGN_CENTER, pos=(0, 1))
- self.areaPanelSizer.Add(self.areaText, flag=wx.ALIGN_CENTER, pos=(1, 0))
- self.areaPanelSizer.Add(self.areaOK, flag=wx.ALIGN_CENTER, pos=(1, 1))
- self.areaPanelSizer.Add(self.areaNO, flag=wx.ALIGN_CENTER, pos=(1, 2))
- self.areaPanel.SetSizer(self.areaPanelSizer)
- self.sizer.Add(self.areaPanel, flag=wx.ALIGN_CENTER, pos=(3, 0))
- self.calculatingAreas = StaticText(
- parent=self, id=wx.ID_ANY, label=_("Analysing all vector features...")
- )
- self.sizer.Add(self.calculatingAreas, flag=wx.ALIGN_CENTER, pos=(4, 0))
- self.numregions = ""
- self.regionNumTxt.Bind(wx.EVT_TEXT, self.OnNumRegions)
- self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
- def OnNumRegions(self, event):
- """Obtain the number of regions"""
- if self.regionNumTxt.GetValue():
- self.SetNext(self.parent.regions)
- wx.FindWindowById(wx.ID_FORWARD).Enable(True)
- self.numregions = self.regionNumTxt.GetValue()
- else:
- wx.FindWindowById(wx.ID_FORWARD).Enable(False)
- def OnEnterPage(self, event):
- """Insert values into text controls for summary of location
- creation options
- """
- self.SetVal(None)
- if self.parent.startpage.vect:
- self.radioBox.ShowItem(4, True)
- self.vect_data = []
- else:
- self.radioBox.ShowItem(4, False)
- self.sizer.Layout()
- wx.FindWindowById(wx.ID_FORWARD).Enable(True)
- def SetVal(self, event):
- """Choose method"""
- radio = self.radioBox.GetSelection()
- wx.FindWindowById(wx.ID_FORWARD).Enable(True)
- if radio == 0:
- self.samplingtype = SamplingType.WHOLE
- self.DrawNothing()
- elif radio == 1:
- self.samplingtype = SamplingType.REGIONS
- wx.FindWindowById(wx.ID_FORWARD).Enable(False)
- elif radio == 2:
- self.samplingtype = SamplingType.UNITS
- regtype = self.regionBox.GetSelection()
- self.RegionDraw(regtype)
- elif radio == 3:
- self.samplingtype = SamplingType.MVWIN
- regtype = self.regionBox.GetSelection()
- self.RegionDraw(regtype)
- elif radio == 4:
- self.samplingtype = SamplingType.VECT
- wx.FindWindowById(wx.ID_FORWARD).Enable(False)
- self.ShowExtraOptions(self.samplingtype)
- def ShowExtraOptions(self, samtype):
- """Show some extra options for some sampling type"""
- if samtype == SamplingType.REGIONS:
- self.sizer.Hide(self.regionBox)
- self.sizer.Hide(self.areaPanel)
- self.sizer.Hide(self.calculatingAreas)
- self.sizer.Show(self.regionNumPanel)
- elif samtype == SamplingType.UNITS or samtype == SamplingType.MVWIN:
- self.sizer.Hide(self.regionNumPanel)
- self.sizer.Hide(self.areaPanel)
- self.sizer.Hide(self.calculatingAreas)
- self.sizer.Show(self.regionBox)
- elif samtype == SamplingType.VECT:
- self.sizer.Hide(self.regionBox)
- self.sizer.Hide(self.regionNumPanel)
- self.sizer.Hide(self.calculatingAreas)
- self.sizer.Show(self.areaPanel)
- self.sizer.Layout()
- def OnRegionDraw(self, event):
- self.RegionDraw(event.GetInt())
- return
- def OnOverwrite(self, event):
- self.overwriteTemp = self.overwriteCheck.GetValue()
- return
- def OnVectYes(self, event):
- """The user choose to select the vector areas, this function set the
- next page to VectorAreasPage"""
- self.SetNext(self.parent.vectorareas)
- wx.FindWindowById(wx.ID_FORWARD).Enable(True)
- self.parent.wizard.ShowPage(self.parent.vectorareas)
- def OnVectNo(self, event):
- """The user choose to use all the vector areas, this function analyses
- all the vector areas and fill the msAreaList variable"""
- self.sizer.Show(self.calculatingAreas)
- self.sizer.Hide(self.regionNumPanel)
- self.sizer.Hide(self.regionBox)
- self.sizer.Hide(self.areaPanel)
- self.SetNext(self.parent.summarypage)
- vect_cats = obtainCategories(
- self.parent.startpage.vect, self.parent.startpage.vectorlayer
- )
- self._progressDlg = wx.ProgressDialog(
- title=_("Analysing vector"),
- message="Analysing vector",
- maximum=len(vect_cats),
- parent=self,
- style=wx.PD_CAN_ABORT | wx.PD_APP_MODAL | wx.PD_AUTO_HIDE | wx.PD_SMOOTH,
- )
- self._progressDlgMax = len(vect_cats)
- grass.use_temp_region()
- self.parent.msAreaList = sampleAreaVector(
- self.parent.startpage.vect,
- self.parent.startpage.rast,
- vect_cats,
- self.parent.startpage.vectorlayer,
- self.overwriteTemp,
- self._progressDlg,
- )
- grass.del_temp_region()
- if self.parent.msAreaList:
- self.calculatingAreas.SetLabel(_("All feature are been analyzed."))
- wx.FindWindowById(wx.ID_FORWARD).Enable(True)
- self.parent.wizard.ShowPage(self.parent.summarypage)
- else:
- self.calculatingAreas.SetLabel(_("An error occurred"))
- self._progressDlg.Destroy()
- self._progressDlg = None
- def RegionDraw(self, regtype):
- """Set the next page to units or drawunits"""
- if regtype == 0:
- self.regionbox = "keyboard"
- if self.samplingtype == SamplingType.UNITS:
- self.SetNext(self.parent.units)
- elif self.samplingtype == SamplingType.MVWIN:
- self.SetNext(self.parent.moving)
- elif regtype == 1:
- self.regionbox = "mouse"
- self.SetNext(self.parent.drawunits)
- def DrawNothing(self):
- """Remove all the optional choices. Used also when the wizard enter in
- SamplingAreasPage, all the optional choices should be hide here"""
- self.sizer.Hide(self.regionNumPanel)
- self.sizer.Hide(self.regionBox)
- self.sizer.Hide(self.areaPanel)
- self.sizer.Hide(self.calculatingAreas)
- self.sizer.Layout()
- self.SetNext(self.parent.summarypage)
- class DrawRegionsPage(TitledPage):
- def __init__(self, wizard, parent):
- self.parent = parent
- TitledPage.__init__(self, wizard, _("Draw sampling regions"))
- self.regioncount = 0
- self.mapPanel = None
- self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
- # self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnExitPage)
- def afterRegionDrawn(self, marea):
- if marea:
- self.parent.msAreaList.append(marea)
- self.regioncount = self.regioncount + 1
- numregions = int(self.parent.samplingareapage.numregions)
- if self.regioncount > numregions:
- wx.FindWindowById(wx.ID_FORWARD).Enable(True)
- self.parent.wizard.ShowPage(self.parent.summarypage)
- else:
- self.title.SetLabel(
- _(
- "Draw sample region "
- + str(self.regioncount)
- + " of "
- + str(numregions)
- )
- )
- wx.FindWindowById(wx.ID_FORWARD).Enable(False)
- def OnEnterPage(self, event):
- """Function during entering"""
- if self.parent.samplingareapage.samplingtype == SamplingType.WHOLE:
- self.title.SetLabel(_("Draw moving windows region"))
- elif self.parent.samplingareapage.samplingtype == SamplingType.UNITS:
- self.title.SetLabel(_("Draw sampling region"))
- if self.mapPanel is None:
- self.mapPanel = RLiSetupMapPanel(
- self,
- samplingType=self.parent.samplingareapage.samplingtype,
- )
- self.mapPanel.afterRegionDrawn.connect(self.afterRegionDrawn)
- self.sizer.Add(self.mapPanel, flag=wx.EXPAND, pos=(1, 0))
- self.sizer.AddGrowableCol(0)
- self.sizer.AddGrowableRow(1)
- self._raster = None
- rast = self.parent.startpage.rast
- self.afterRegionDrawn(marea=None)
- if self._raster != rast:
- map_ = self.mapPanel.GetMap()
- map_.DeleteAllLayers()
- cmdlist = ["d.rast", "map=%s" % rast]
- map_.AddLayer(
- ltype="raster",
- command=cmdlist,
- active=True,
- name=rast,
- hidden=False,
- opacity=1.0,
- render=True,
- )
- # def OnExitPage(self, event=None):
- # Function during exiting
- # print event.GetDirection()
- # if event.GetDirection():
- # self.SetNext(self.parent.samplingareapage)
- # self.parent.samplingareapage.SetPrev(self)
- class SampleUnitsKeyPage(TitledPage):
- """Set values from keyboard for sample units
- It is used if you choose keyboard from Sampling Units or Moving windows
- in sampling areas page
- """
- def __init__(self, wizard, parent):
- TitledPage.__init__(self, wizard, _("Select sample units from keyboard"))
- self.parent = parent
- self.scrollPanel = scrolled.ScrolledPanel(parent=self, id=wx.ID_ANY)
- self.scrollPanel.SetupScrolling(scroll_x=False)
- self.panelSizer = wx.GridBagSizer(5, 5)
- self.width = ""
- self.height = ""
- self.boxtype = "rectangle"
- self.distrtype = "non_overlapping"
- # type of shape
- self.typeBox = wx.RadioBox(
- parent=self.scrollPanel,
- id=wx.ID_ANY,
- majorDimension=1,
- style=wx.RA_SPECIFY_COLS,
- label=" %s " % _("Select type of shape"),
- choices=[_("Rectangle"), _("Circle"), ("None")],
- )
- self.panelSizer.Add(self.typeBox, flag=wx.ALIGN_LEFT, pos=(0, 0), span=(1, 2))
- self.widthLabel = StaticText(parent=self.scrollPanel, id=wx.ID_ANY)
- self.widthTxt = TextCtrl(parent=self.scrollPanel, id=wx.ID_ANY, size=(250, -1))
- self.panelSizer.Add(
- self.widthLabel,
- pos=(1, 0),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.panelSizer.Add(
- self.widthTxt,
- pos=(1, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.heightLabel = StaticText(parent=self.scrollPanel, id=wx.ID_ANY)
- self.heightTxt = TextCtrl(parent=self.scrollPanel, id=wx.ID_ANY, size=(250, -1))
- self.panelSizer.Add(
- self.heightLabel,
- pos=(2, 0),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.panelSizer.Add(
- self.heightTxt,
- pos=(2, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.widthLabels = [
- _("Width size (in cells)?"),
- _("What radius size (in meters)?"),
- ]
- self.heightLabels = [_("Height size (in cells)?"), _("Name of the circle mask")]
- self.distributionBox = wx.RadioBox(
- parent=self.scrollPanel,
- id=wx.ID_ANY,
- majorDimension=1,
- style=wx.RA_SPECIFY_COLS,
- label=" %s " % _("Select method of sampling unit distribution"),
- choices=[
- _("Random non overlapping"),
- _("Systematic contiguos"),
- _("Stratified random"),
- _("Systematic non contiguos"),
- _("Centered over sites"),
- ],
- )
- self.panelSizer.Add(
- self.distributionBox,
- pos=(3, 0),
- span=(1, 2),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.distr1Label = StaticText(
- parent=self.scrollPanel,
- id=wx.ID_ANY,
- label=_("What number of Sampling " "Units to use?"),
- )
- self.distr1Txt = TextCtrl(parent=self.scrollPanel, id=wx.ID_ANY, size=(250, -1))
- self.panelSizer.Add(
- self.distr1Label,
- pos=(4, 0),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.panelSizer.Add(
- self.distr1Txt,
- pos=(4, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.distr2Label = StaticText(parent=self.scrollPanel, id=wx.ID_ANY, label="")
- self.distr2Txt = TextCtrl(parent=self.scrollPanel, id=wx.ID_ANY, size=(250, -1))
- self.panelSizer.Add(
- self.distr2Label,
- pos=(5, 0),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.panelSizer.Add(
- self.distr2Txt,
- pos=(5, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.panelSizer.Hide(self.distr2Txt)
- self.typeBox.Bind(wx.EVT_RADIOBOX, self.OnType)
- self.distributionBox.Bind(wx.EVT_RADIOBOX, self.OnDistr)
- self.widthTxt.Bind(wx.EVT_TEXT, self.OnWidth)
- self.heightTxt.Bind(wx.EVT_TEXT, self.OnHeight)
- self.distr1Txt.Bind(wx.EVT_TEXT, self.OnDistr1)
- self.distr2Txt.Bind(wx.EVT_TEXT, self.OnDistr2)
- self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
- self.sizer.Add(self.scrollPanel, pos=(0, 0), flag=wx.EXPAND)
- self.sizer.AddGrowableCol(0)
- self.sizer.AddGrowableRow(0)
- self.scrollPanel.SetSizer(self.panelSizer)
- # self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnExitPage)
- self.OnType(None)
- def OnEnterPage(self, event=None):
- """Function during entering"""
- # This is an hack to force the user to choose Rectangle or Circle
- self.typeBox.SetSelection(2),
- self.typeBox.ShowItem(2, False)
- self.panelSizer.Layout()
- def OnExitPage(self, event=None):
- """Function during exiting"""
- if event.GetDirection():
- self.SetNext(self.parent.summarypage)
- self.SetPrev(self.parent.samplingareapage)
- def OnType(self, event):
- """Set if rectangle or circle will be used"""
- chosen = self.typeBox.GetSelection()
- self.widthLabel.SetLabel(self.widthLabels[chosen])
- self.heightLabel.SetLabel(self.heightLabels[chosen])
- self.panelSizer.Layout()
- if chosen == 0:
- self.boxtype = "rectangle"
- else:
- self.boxtype = "circle"
- def OnDistr(self, event):
- chosen = self.distributionBox.GetSelection()
- if chosen == 0:
- self.distrtype = "non_overlapping"
- self.distr1Label.SetLabel(_("What number of Sampling Units to use?"))
- self.panelSizer.Show(self.distr1Txt)
- self.distr2Label.SetLabel("")
- self.panelSizer.Hide(self.distr2Txt)
- self.panelSizer.Layout()
- elif chosen == 1:
- self.distrtype = "systematic_contiguos"
- self.distr1Label.SetLabel("")
- self.distr2Label.SetLabel("")
- self.panelSizer.Hide(self.distr1Txt)
- self.panelSizer.Hide(self.distr2Txt)
- self.panelSizer.Layout()
- elif chosen == 2:
- self.distrtype = "stratified_random"
- self.distr1Label.SetLabel(_("Insert number of row strates"))
- self.distr2Label.SetLabel(_("Insert number of column strates"))
- self.panelSizer.Show(self.distr1Txt)
- self.panelSizer.Show(self.distr2Txt)
- self.panelSizer.Layout()
- elif chosen == 3:
- self.distrtype = "systematic_noncontiguos"
- self.distr1Label.SetLabel(_("Insert distance between units"))
- self.panelSizer.Show(self.distr1Txt)
- self.distr2Label.SetLabel("")
- self.panelSizer.Hide(self.distr2Txt)
- self.panelSizer.Layout()
- elif chosen == 4:
- self.distrtype = "centered_oversites"
- self.distr1Label.SetLabel("")
- self.distr2Label.SetLabel("")
- self.panelSizer.Hide(self.distr2Txt)
- self.panelSizer.Hide(self.distr1Txt)
- self.panelSizer.Layout()
- def OnWidth(self, event):
- self.width = self.widthTxt.GetValue()
- def OnHeight(self, event):
- self.height = self.heightTxt.GetValue()
- def OnDistr1(self, event):
- self.distr1 = self.distr1Txt.GetValue()
- def OnDistr2(self, event):
- self.distr2 = self.distr2Txt.GetValue()
- class MovingKeyPage(TitledPage):
- """Set values from keyboard for sample units"""
- def __init__(self, wizard, parent):
- TitledPage.__init__(self, wizard, _("Set sample units"))
- self.parent = parent
- self.width = ""
- self.height = ""
- self.boxtype = "rectangle"
- # type of shape
- self.typeBox = wx.RadioBox(
- parent=self,
- id=wx.ID_ANY,
- label=" %s " % _("Select type of shape"),
- choices=[_("Rectangle"), _("Circle")],
- # ('None')],
- majorDimension=1,
- style=wx.RA_SPECIFY_COLS,
- )
- self.sizer.Add(self.typeBox, flag=wx.ALIGN_LEFT, pos=(1, 1))
- self.typeBox.Bind(wx.EVT_RADIOBOX, self.OnType)
- self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
- self.widthLabel = StaticText(
- parent=self, id=wx.ID_ANY, label=_("Width size (in cells)?")
- )
- self.widthTxt = TextCtrl(parent=self, id=wx.ID_ANY, size=(250, -1))
- self.sizer.Add(
- self.widthLabel,
- border=5,
- pos=(2, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.widthTxt,
- border=5,
- pos=(2, 2),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.heightLabel = StaticText(
- parent=self, id=wx.ID_ANY, label=_("Height size (in cells)?")
- )
- self.heightTxt = TextCtrl(parent=self, id=wx.ID_ANY, size=(250, -1))
- self.sizer.Add(
- self.heightLabel,
- border=5,
- pos=(3, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.heightTxt,
- border=5,
- pos=(3, 2),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.AddGrowableCol(2)
- self.widthLabels = [
- _("Width size (in cells)?"),
- _("What radius size (in meters)?"),
- ]
- self.heightLabels = [_("Height size (in cells)?"), _("Name of the circle mask")]
- self.widthTxt.Bind(wx.EVT_TEXT, self.OnWidth)
- self.heightTxt.Bind(wx.EVT_TEXT, self.OnHeight)
- wx.FindWindowById(wx.ID_FORWARD).Enable(False)
- def OnEnterPage(self, event):
- # This is an hack to force the user to choose Rectangle or Circle
- # self.typeBox.SetSelection(2),
- # self.typeBox.ShowItem(2, False)
- if self.parent.samplingareapage.samplingtype == SamplingType.MVWIN:
- self.title.SetLabel(_("Set moving windows"))
- self.OnType(None)
- def OnType(self, event):
- chosen = self.typeBox.GetSelection()
- self.widthLabel.SetLabel(self.widthLabels[chosen])
- self.heightLabel.SetLabel(self.heightLabels[chosen])
- self.sizer.Layout()
- if chosen == 0:
- self.parent.samplingareapage.samplingtype = SamplingType.KMVWINR
- self.boxtype = "rectangle"
- elif chosen == 1:
- self.parent.samplingareapage.samplingtype = SamplingType.KMVWINC
- self.boxtype = "circle"
- def CheckInput(self):
- """Check input fields.
- :return: True if configuration file is given and raster xor
- vector map, False otherwise
- """
- return bool(self.width and bool(self.height))
- def OnWidth(self, event):
- self.width = self.widthTxt.GetValue()
- next = wx.FindWindowById(wx.ID_FORWARD)
- next.Enable(self.CheckInput())
- def OnHeight(self, event):
- self.height = self.heightTxt.GetValue()
- next = wx.FindWindowById(wx.ID_FORWARD)
- next.Enable(self.CheckInput())
- class UnitsMousePage(TitledPage):
- """Choose the sampling area setting the values using the mouse drawing the
- areas with rectangle or circle. It is used both from 'Moving windows'
- and 'Sample units'.
- """
- def __init__(self, wizard, parent):
- self.parent = parent
- self.wizard = wizard
- TitledPage.__init__(self, self.wizard, _("Draw sampling units"))
- self.numregions = ""
- self.mapPanel = None
- # type of shape
- self.typeBox = wx.RadioBox(
- parent=self,
- id=wx.ID_ANY,
- majorDimension=1,
- style=wx.RA_SPECIFY_COLS,
- label=" %s " % _("Select type of shape"),
- choices=[_("Rectangle"), _("Circle"), ("")],
- )
- # This is an hack to force the user to choose Rectangle or Circle
- self.typeBox.SetSelection(2),
- self.typeBox.ShowItem(2, False)
- self.sizer.Add(self.typeBox, flag=wx.ALIGN_LEFT, pos=(0, 0), span=(1, 2))
- self.regionPanelSizer = wx.GridBagSizer(1, 2)
- self.regionNumPanel = wx.Panel(parent=self, id=wx.ID_ANY)
- self.regionNumLabel = StaticText(
- parent=self.regionNumPanel,
- id=wx.ID_ANY,
- label=_("Number of sampling area to draw:"),
- )
- self.regionNumTxt = TextCtrl(
- parent=self.regionNumPanel, id=wx.ID_ANY, size=(50, -1)
- )
- self.regionPanelSizer.Add(self.regionNumLabel, flag=wx.ALIGN_CENTER, pos=(0, 0))
- self.regionPanelSizer.Add(self.regionNumTxt, flag=wx.ALIGN_CENTER, pos=(0, 1))
- self.regionNumPanel.SetSizer(self.regionPanelSizer)
- self.sizer.Add(self.regionNumPanel, flag=wx.ALIGN_LEFT, pos=(1, 0), span=(1, 2))
- self.typeBox.Bind(wx.EVT_RADIOBOX, self.OnType)
- self.regionNumTxt.Bind(wx.EVT_TEXT, self.OnNumRegions)
- self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
- self.sizer.AddGrowableCol(0)
- self.OnType(None)
- self.regionNumTxt.SetValue("")
- def OnEnterPage(self, event):
- """Function during entering"""
- if self.numregions:
- wx.FindWindowById(wx.ID_FORWARD).Enable(True)
- else:
- wx.FindWindowById(wx.ID_FORWARD).Enable(False)
- if self.parent.samplingareapage.samplingtype in [
- SamplingType.MVWIN,
- SamplingType.MMVWINR,
- SamplingType.MMVWINC,
- ]:
- self.title.SetLabel(_("Draw moving windows region"))
- self.sizer.Hide(self.regionNumPanel)
- wx.FindWindowById(wx.ID_FORWARD).Enable(True)
- elif self.parent.samplingareapage.samplingtype in [
- SamplingType.UNITS,
- SamplingType.MUNITSR,
- SamplingType.MUNITSC,
- ]:
- self.title.SetLabel(_("Draw sampling region"))
- self.sizer.Show(self.regionNumPanel)
- if self.typeBox.GetSelection() == 2:
- wx.FindWindowById(wx.ID_FORWARD).Enable(False)
- self.sizer.Layout()
- def OnType(self, event):
- chosen = self.typeBox.GetSelection()
- if chosen == 0:
- if self.parent.samplingareapage.samplingtype in [
- SamplingType.MVWIN,
- SamplingType.MMVWINR,
- SamplingType.MMVWINC,
- ]:
- self.parent.samplingareapage.samplingtype = SamplingType.MMVWINR
- wx.FindWindowById(wx.ID_FORWARD).Enable(True)
- else:
- self.parent.samplingareapage.samplingtype = SamplingType.MUNITSR
- self.drawtype = "rectangle"
- else:
- if self.parent.samplingareapage.samplingtype in [
- SamplingType.MVWIN,
- SamplingType.MMVWINR,
- SamplingType.MMVWINC,
- ]:
- self.parent.samplingareapage.samplingtype = SamplingType.MMVWINC
- wx.FindWindowById(wx.ID_FORWARD).Enable(True)
- else:
- self.parent.samplingareapage.samplingtype = SamplingType.MUNITSC
- self.drawtype = "circle"
- def OnNumRegions(self, event):
- """Set the number of region"""
- if self.regionNumTxt.GetValue():
- self.SetNext(self.parent.drawsampleunitspage)
- wx.FindWindowById(wx.ID_FORWARD).Enable(True)
- self.numregions = self.regionNumTxt.GetValue()
- else:
- wx.FindWindowById(wx.ID_FORWARD).Enable(False)
- def OnExitPage(self, event=None):
- """Function during exiting"""
- if event.GetDirection():
- self.SetNext(self.drawsampleunitspage)
- self.SetPrev(self.samplingareapage)
- class DrawSampleUnitsPage(TitledPage):
- """Choose the sampling area drawing them"""
- def __init__(self, wizard, parent):
- TitledPage.__init__(self, wizard, _("Draw sampling units"))
- self.parent = parent
- self.mapPanel = None
- self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
- # self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnExitPage)
- def SampleFrameChanged(self, region):
- # region = self.GetSampleUnitRegion()
- if region:
- self.parent.msAreaList.append(region)
- self.regioncount = self.regioncount + 1
- drawtype = self.parent.drawunits.drawtype
- if self.regioncount > self.numregions:
- wx.FindWindowById(wx.ID_FORWARD).Enable(True)
- self.parent.wizard.ShowPage(self.parent.summarypage)
- else:
- self.title.SetLabel(
- _(
- "Draw Sampling "
- + drawtype
- + " "
- + str(self.regioncount)
- + " of "
- + str(self.numregions)
- )
- )
- wx.FindWindowById(wx.ID_FORWARD).Enable(False)
- def OnEnterPage(self, event):
- """Function during entering"""
- if self.parent.samplingareapage.samplingtype in [
- SamplingType.MVWIN,
- SamplingType.MMVWINC,
- SamplingType.MMVWINR,
- ]:
- self.numregions = 1
- else:
- self.numregions = int(self.parent.drawunits.numregions)
- self.regioncount = 0
- if self.mapPanel:
- self.sizer.Remove(self.mapPanel)
- gtype = self.parent.drawunits.drawtype
- self.mapPanel = RLiSetupMapPanel(
- self,
- samplingType=self.parent.samplingareapage.samplingtype,
- )
- if gtype == "circle":
- self.mapPanel.afterCircleDrawn.connect(self.SampleFrameChanged)
- else:
- self.mapPanel.sampleFrameChanged.connect(self.SampleFrameChanged)
- self.sizer.Add(self.mapPanel, flag=wx.EXPAND, pos=(1, 0))
- self.sizer.AddGrowableCol(0)
- self.sizer.AddGrowableRow(1)
- self._raster = None
- self.SampleFrameChanged(region=None)
- rast = self.parent.startpage.rast
- if self._raster != rast:
- map_ = self.mapPanel.GetMap()
- map_.DeleteAllLayers()
- cmdlist = ["d.rast", "map=%s" % rast]
- map_.AddLayer(
- ltype="raster",
- command=cmdlist,
- active=True,
- name=rast,
- hidden=False,
- opacity=1.0,
- render=True,
- )
- def OnExitPage(self, event=None):
- """Function during exiting"""
- pass
- # if event.GetDirection():
- # self.SetNext(self.parent.samplingareapage)
- # self.parent.samplingareapage.SetPrev(self)
- class VectorAreasPage(TitledPage):
- """Choose the sampling area using the vector features"""
- def __init__(self, wizard, parent):
- TitledPage.__init__(self, wizard, _("Select sampling areas"))
- self.parent = parent
- self.areascount = 0
- self.mapPanel = None
- self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
- self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnExitPage)
- self.areaPanelSizer = wx.GridBagSizer(1, 3)
- self.areaPanel = wx.Panel(parent=self, id=wx.ID_ANY)
- self.areaText = StaticText(
- parent=self.areaPanel, id=wx.ID_ANY, label=_("Is this area ok?")
- )
- self.areaOK = Button(self.areaPanel, wx.ID_ANY, "Yes", (50, 80))
- self.areaNO = Button(self.areaPanel, wx.ID_ANY, "No", (50, 80))
- self.areaOK.Bind(wx.EVT_BUTTON, self.OnYes)
- self.areaNO.Bind(wx.EVT_BUTTON, self.OnNo)
- self.areaPanelSizer.Add(self.areaText, flag=wx.ALIGN_CENTER, pos=(0, 0))
- self.areaPanelSizer.Add(self.areaOK, flag=wx.ALIGN_CENTER, pos=(0, 1))
- self.areaPanelSizer.Add(self.areaNO, flag=wx.ALIGN_CENTER, pos=(0, 2))
- self.areaPanel.SetSizer(self.areaPanelSizer)
- self.sizer.Add(self.areaPanel, flag=wx.ALIGN_CENTER, pos=(2, 0))
- def afterRegionDrawn(self):
- """Function to update the title and the number of selected area"""
- self.areascount = self.areascount + 1
- if self.areascount == self.areanum:
- wx.FindWindowById(wx.ID_FORWARD).Enable(True)
- self.areaOK.Enable(False)
- self.areaNO.Enable(False)
- return True
- else:
- self.title.SetLabel(
- _(
- "Select sample area "
- + str(self.areascount + 1)
- + " of "
- + str(self.areanum)
- )
- )
- wx.FindWindowById(wx.ID_FORWARD).Enable(False)
- return False
- def OnYes(self, event):
- """Function to create the string for the conf file if the area
- is selected"""
- self.parent.msAreaList.append(obtainAreaVector(self.outname))
- if not self.afterRegionDrawn():
- self.newCat()
- def OnNo(self, event):
- """Function to pass to the next feature if it is not selected"""
- if not self.afterRegionDrawn():
- self.newCat()
- def newCat(self):
- """Convert to raster and draw the new feature"""
- cat = self.vect_cats[self.areascount]
- self.outpref = "{rast}_{vect}_".format(
- vect=self.vect.split("@")[0], rast=self.rast.split("@")[0]
- )
- self.outname = "{pref}{cat}".format(pref=self.outpref, cat=cat)
- # check if raster already axist
- if (
- len(grass.list_strings("raster", pattern=self.outname, mapset=".")) == 1
- and not self.parent.samplingareapage.overwriteTemp
- ):
- GError(
- parent=self,
- message=_(
- "The raster map <%s> already exists."
- " Please remove or rename the maps "
- "with the prefix '%s' or select the "
- "option to overwrite existing maps" % (self.outname, self.outpref)
- ),
- )
- self.parent.wizard.ShowPage(self.parent.samplingareapage)
- return
- convertFeature(
- self.vect,
- self.outname,
- cat,
- self.rast,
- self.parent.startpage.vectorlayer,
- self.parent.samplingareapage.overwriteTemp,
- )
- cmdlistcat = ["d.rast", "map=%s" % self.outname]
- self.map_.AddLayer(
- ltype="raster",
- command=cmdlistcat,
- active=True,
- name=self.outname,
- hidden=False,
- opacity=1.0,
- render=True,
- )
- for l in self.map_.GetListOfLayers():
- if l.name == self.outname:
- self.mapPanel.mapWindow.ZoomToMap(
- layers=[l], render=True, ignoreNulls=True
- )
- elif l.name != self.rast:
- self.map_.DeleteLayer(l)
- self.areaText.SetLabel("Is this area (cat={n}) ok?".format(n=cat))
- def OnEnterPage(self, event):
- """Function during entering: draw the raster map and the first vector
- feature"""
- if self.mapPanel is None:
- self.mapPanel = RLiSetupMapPanel(
- self, samplingType=self.parent.samplingareapage.samplingtype
- )
- self.sizer.Add(self.mapPanel, flag=wx.EXPAND, pos=(1, 0))
- self.sizer.AddGrowableCol(0)
- self.sizer.AddGrowableRow(1)
- self._raster = None
- self.rast = self.parent.startpage.rast
- self.vect = self.parent.startpage.vect
- self.vect_cats = obtainCategories(
- self.vect, layer=self.parent.startpage.vectorlayer
- )
- self.areanum = len(self.vect_cats)
- if self.areanum == 0:
- GError(parent=self, message=_("The polygon seems to have 0 areas"))
- self.parent.wizard.ShowPage(self.parent.samplingareapage)
- return
- self.title.SetLabel(_("Select sample area 1 of " + str(self.areanum)))
- grass.use_temp_region()
- if self._raster != self.rast:
- self.map_ = self.mapPanel.GetMap()
- self.map_.DeleteAllLayers()
- cmdlist = ["d.rast", "map=%s" % self.rast]
- self.map_.AddLayer(
- ltype="raster",
- command=cmdlist,
- active=True,
- name=self.rast,
- hidden=False,
- opacity=1.0,
- render=True,
- )
- self.newCat()
- def OnExitPage(self, event=None):
- """Function during exiting"""
- grass.del_temp_region()
- # if event.GetDirection():
- # self.SetNext(self.parent.samplingareapage)
- # self.parent.samplingareapage.SetPrev(self)
- class SummaryPage(TitledPage):
- """Shows summary result of choosing data"""
- def __init__(self, wizard, parent):
- TitledPage.__init__(self, wizard, _("Summary"))
- global rlisettings
- self.parent = parent
- # configuration file name
- self.conflabel = StaticText(
- parent=self, id=wx.ID_ANY, label=_("Configuration file name:")
- )
- self.conftxt = StaticText(parent=self, id=wx.ID_ANY, label="")
- self.sizer.Add(
- self.conflabel,
- border=5,
- pos=(0, 0),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.conftxt,
- border=5,
- pos=(0, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- # raster name
- self.rastlabel = StaticText(parent=self, id=wx.ID_ANY, label=_("Raster name:"))
- self.rasttxt = StaticText(parent=self, id=wx.ID_ANY, label="")
- self.sizer.Add(
- self.rastlabel,
- border=5,
- pos=(1, 0),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.rasttxt,
- border=5,
- pos=(1, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- # vector name
- self.vectlabel = StaticText(parent=self, id=wx.ID_ANY, label=_("Vector name:"))
- self.vecttxt = StaticText(parent=self, id=wx.ID_ANY, label="")
- self.sizer.Add(
- self.vectlabel,
- border=5,
- pos=(2, 0),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.vecttxt,
- border=5,
- pos=(2, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- # region type name
- self.regionlabel = StaticText(
- parent=self, id=wx.ID_ANY, label=_("Region type:")
- )
- self.regiontxt = StaticText(parent=self, id=wx.ID_ANY, label="")
- self.sizer.Add(
- self.regionlabel,
- border=5,
- pos=(3, 0),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.regiontxt,
- border=5,
- pos=(3, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- # region keyboard
- self.regionkeylabel = StaticText(parent=self, id=wx.ID_ANY, label="")
- self.regionkeytxt = StaticText(parent=self, id=wx.ID_ANY, label="")
- self.sizer.Add(
- self.regionkeylabel,
- border=5,
- pos=(4, 0),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.regionkeytxt,
- border=5,
- pos=(4, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
- # sampling area
- self.samplinglabel = StaticText(
- parent=self, id=wx.ID_ANY, label=_("Sampling area type:")
- )
- self.samplingtxt = StaticText(parent=self, id=wx.ID_ANY, label="")
- self.sizer.Add(
- self.samplinglabel,
- border=5,
- pos=(5, 0),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.samplingtxt,
- border=5,
- pos=(5, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- # shapetype
- self.shapelabel = StaticText(parent=self, id=wx.ID_ANY, label="")
- self.shapetxt = StaticText(parent=self, id=wx.ID_ANY, label="")
- self.sizer.Add(
- self.shapelabel,
- border=5,
- pos=(6, 0),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.shapetxt,
- border=5,
- pos=(6, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- # shapedim
- self.shapewidthlabel = StaticText(parent=self, id=wx.ID_ANY, label="")
- self.shapewidthtxt = StaticText(parent=self, id=wx.ID_ANY, label="")
- self.sizer.Add(
- self.shapewidthlabel,
- border=5,
- pos=(7, 0),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.shapewidthtxt,
- border=5,
- pos=(7, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.shapeheightlabel = StaticText(parent=self, id=wx.ID_ANY, label="")
- self.shapeheighttxt = StaticText(parent=self, id=wx.ID_ANY, label="")
- self.sizer.Add(
- self.shapeheightlabel,
- border=5,
- pos=(8, 0),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.shapeheighttxt,
- border=5,
- pos=(8, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- # units type
- self.unitslabel = StaticText(parent=self, id=wx.ID_ANY, label="")
- self.unitstxt = StaticText(parent=self, id=wx.ID_ANY, label="")
- self.sizer.Add(
- self.unitslabel,
- border=5,
- pos=(9, 0),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.unitstxt,
- border=5,
- pos=(9, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.unitsmorelabel = StaticText(parent=self, id=wx.ID_ANY, label="")
- self.unitsmoretxt = StaticText(parent=self, id=wx.ID_ANY, label="")
- self.sizer.Add(
- self.unitsmorelabel,
- border=5,
- pos=(10, 0),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.unitsmoretxt,
- border=5,
- pos=(10, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.unitsmorelabel2 = StaticText(parent=self, id=wx.ID_ANY, label="")
- self.unitsmoretxt2 = StaticText(parent=self, id=wx.ID_ANY, label="")
- self.sizer.Add(
- self.unitsmorelabel2,
- border=5,
- pos=(11, 0),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- self.sizer.Add(
- self.unitsmoretxt2,
- border=5,
- pos=(11, 1),
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
- )
- def OnEnterPage(self, event):
- """Insert values into text controls for summary of location
- creation options
- """
- self.conftxt.SetLabel(self.parent.startpage.conf_name)
- self.rasttxt.SetLabel(self.parent.startpage.rast)
- self.samplingtxt.SetLabel(self.parent.samplingareapage.samplingtype)
- self.regiontxt.SetLabel(self.parent.startpage.region)
- self.vecttxt.SetLabel(self.parent.startpage.vect)
- if self.parent.startpage.region == "key":
- # region keyboard values
- self.regionkeylabel.SetLabel(_("Region keyboard values:"))
- regKeyVals = (
- "Column left up: %s - Row left up: %s\n"
- "Column length: %s - Row length: %s\n"
- % (
- self.parent.keyboardpage.col_up,
- self.parent.keyboardpage.row_up,
- self.parent.keyboardpage.col_len,
- self.parent.keyboardpage.row_len,
- )
- )
- self.regionkeytxt.SetLabel(regKeyVals)
- else:
- self.regionkeylabel.SetLabel("")
- self.regionkeytxt.SetLabel("")
- if (
- self.parent.samplingareapage.samplingtype == SamplingType.UNITS
- and self.parent.samplingareapage.regionbox == "keyboard"
- ):
- self.shapelabel.SetLabel(_("Type of shape:"))
- self.shapetxt.SetLabel(self.parent.units.boxtype)
- if self.parent.units.boxtype == "circle":
- self.shapewidthlabel.SetLabel(_("Radius size:"))
- self.shapeheightlabel.SetLabel(_("Name circle mask:"))
- else:
- self.shapewidthlabel.SetLabel(_("Width size:"))
- self.shapeheightlabel.SetLabel(_("Height size:"))
- self.shapewidthtxt.SetLabel(self.parent.units.width)
- self.shapeheighttxt.SetLabel(self.parent.units.height)
- self.unitslabel.SetLabel(_("Method of distribution:"))
- self.unitstxt.SetLabel(self.parent.units.distrtype)
- if self.parent.units.distrtype == "non_overlapping":
- self.unitsmorelabel.SetLabel(_("Number sampling units:"))
- self.unitsmoretxt.SetLabel(self.parent.units.distr1)
- elif self.parent.units.distrtype == "systematic_noncontiguos":
- self.unitsmorelabel.SetLabel(_("Distance between units:"))
- self.unitsmoretxt.SetLabel(self.parent.units.distr1)
- elif self.parent.units.distrtype == "stratified_random":
- self.unitsmorelabel.SetLabel(_("Number row strates:"))
- self.unitsmoretxt.SetLabel(self.parent.units.distr1)
- self.unitsmorelabel2.SetLabel(_("Number column strates:"))
- self.unitsmoretxt2.SetLabel(self.parent.units.distr2)
- elif (
- self.parent.samplingareapage.samplingtype == SamplingType.UNITS
- and self.parent.samplingareapage.regionbox == "mouse"
- ):
- self.shapelabel.SetLabel(_("Type of shape:"))
- self.shapetxt.SetLabel(self.parent.units.boxtype)
- self.unitstxt.SetLabel("by mouse")
- elif self.parent.samplingareapage.samplingtype == "moving":
- self.shapelabel.SetLabel(_("Type of shape:"))
- self.shapetxt.SetLabel(self.parent.moving.boxtype)
- if self.parent.moving.boxtype == "circle":
- self.shapewidthlabel.SetLabel(_("Radius size:"))
- self.shapeheightlabel.SetLabel(_("Name circle mask:"))
- else:
- self.shapewidthlabel.SetLabel(_("Width size:"))
- self.shapeheightlabel.SetLabel(_("Height size:"))
- self.shapewidthtxt.SetLabel(self.parent.moving.width)
- self.shapeheighttxt.SetLabel(self.parent.moving.height)
- else:
- self.shapelabel.SetLabel("")
- self.shapetxt.SetLabel("")
- self.shapewidthlabel.SetLabel("")
- self.shapewidthtxt.SetLabel("")
- self.shapeheightlabel.SetLabel("")
- self.shapeheighttxt.SetLabel("")
|