def __init__(self):
		QtGui.QDialog.__init__(self)
		self.ui = Ui_Form ()
		self.ui.setupUi(self)
		sys.stdout = StdOutLog( self.ui.textInformation, sys.stdout)
		sys.stderr = StdErrLog( self.ui.textInformation, sys.stderr)		
		sys.stdout.write(str(datetime.now().strftime("%d-%m-%Y %H:%M\n")))
		#conect signals and slots
		QtCore.QObject.connect(self.ui.listWidget_Layers,QtCore.SIGNAL("itemClicked(QListWidgetItem*)"),self.get_band_list)
		QtCore.QObject.connect(self.ui.listWidget_Layers,QtCore.SIGNAL("itemChanged(QListWidgetItem*)"),self.get_band_list)	
		QtCore.QObject.connect(self.ui.btnLoad,QtCore.SIGNAL("pressed()"),self.load_band_status)
		QtCore.QObject.connect(self.ui.btnLoad,QtCore.SIGNAL("released()"),self.load_band)
		QtCore.QObject.connect(self.ui.btnRun,QtCore.SIGNAL("pressed()"),self.run_status)		
		QtCore.QObject.connect(self.ui.btnRun,QtCore.SIGNAL("released()"),self.run)
		QtCore.QObject.connect(self.ui.btnClear,QtCore.SIGNAL("pressed()"),self.clear_EqEdit)
		QtCore.QObject.connect(self.ui.btnSave,QtCore.SIGNAL("clicked()"),self.save_file_dialog)
		QtCore.QObject.connect(self.ui.checkBoxGenerateOutput,QtCore.SIGNAL("toggled(bool)"),self.disable_output)
		# Math operators
		QtCore.QObject.connect(self.ui.btnAddition,QtCore.SIGNAL("clicked()"),self.insertAdd)
		QtCore.QObject.connect(self.ui.btnSubtract,QtCore.SIGNAL("clicked()"),self.insertMinus)
		QtCore.QObject.connect(self.ui.btnDivide,QtCore.SIGNAL("clicked()"),self.insertDivide)
		QtCore.QObject.connect(self.ui.btnMultiply,QtCore.SIGNAL("clicked()"),self.insertMult)
		QtCore.QObject.connect(self.ui.btnSqRoot,QtCore.SIGNAL("clicked()"),self.insertRoot)
		QtCore.QObject.connect(self.ui.btnSquared,QtCore.SIGNAL("clicked()"),self.insertPower)
		QtCore.QObject.connect(self.ui.btnRBracket,QtCore.SIGNAL("clicked()"),self.insertRbracket)
		QtCore.QObject.connect(self.ui.btnLBracket,QtCore.SIGNAL("clicked()"),self.insertLbracket)		
		QtCore.QObject.connect(self.ui.btnMean,QtCore.SIGNAL("clicked()"),self.insertMean)
		QtCore.QObject.connect(self.ui.btnStDev,QtCore.SIGNAL("clicked()"),self.insertStDev)
		QtCore.QObject.connect(self.ui.btn0,QtCore.SIGNAL("clicked()"),self.insertZero)
		QtCore.QObject.connect(self.ui.btn1,QtCore.SIGNAL("clicked()"),self.insertOne)
		QtCore.QObject.connect(self.ui.btn2,QtCore.SIGNAL("clicked()"),self.insertTwo)
		QtCore.QObject.connect(self.ui.btn3,QtCore.SIGNAL("clicked()"),self.insertThree)
		QtCore.QObject.connect(self.ui.btn4,QtCore.SIGNAL("clicked()"),self.insertFour)
		QtCore.QObject.connect(self.ui.btn5,QtCore.SIGNAL("clicked()"),self.insertFive)
		QtCore.QObject.connect(self.ui.btn6,QtCore.SIGNAL("clicked()"),self.insertSix)
		QtCore.QObject.connect(self.ui.btn7,QtCore.SIGNAL("clicked()"),self.insertSeven)
		QtCore.QObject.connect(self.ui.btn8,QtCore.SIGNAL("clicked()"),self.insertEight)
		QtCore.QObject.connect(self.ui.btn9,QtCore.SIGNAL("clicked()"),self.insertNine)
		QtCore.QObject.connect(self.ui.btnPoint,QtCore.SIGNAL("clicked()"),self.insertPoint)
		# Tab_2 buttons (Python scripts)
		QtCore.QObject.connect(self.ui.btnClearScript,QtCore.SIGNAL("clicked()"),self.clear_Pyout)
		QtCore.QObject.connect(self.ui.btnRunScript,QtCore.SIGNAL("pressed()"),self.run_status)
		QtCore.QObject.connect(self.ui.btnRunScript,QtCore.SIGNAL("released()"),self.run_Pyout)
		QtCore.QObject.connect(self.ui.btnSaveScript,QtCore.SIGNAL("clicked()"),self.save_Pyout)
		QtCore.QObject.connect(self.ui.btnOpenScript,QtCore.SIGNAL("clicked()"),self.open_Pyout)
		QtCore.QObject.connect(self.ui.btnOpenTemplate,QtCore.SIGNAL("clicked()"),self.open_template)
		QtCore.QObject.connect(self.ui.btnViewLicense,QtCore.SIGNAL("clicked()"),self.print_license)
		# Get the rasters that have been loaded into QGIS
		self.add_band()
		# Add some text to PyOut
		#self.ui.textPyout.setTextColor(QtCore.Qt.blue)
		self.ui.textPyout.insertPlainText('#!/usr/bin/env python\n')
		self.ui.textPyout.insertPlainText('import rasterIO\n')
		self.ui.textPyout.insertPlainText('import numpy.ma as ma\n\n')
 def __init__(self):
     QtGui.QDialog.__init__(self)
     self.ui = Ui_Form()
     self.ui.setupUi(self)
     sys.stdout = StdOutLog(self.ui.textInformation, sys.stdout)
     sys.stderr = StdErrLog(self.ui.textInformation, sys.stderr)
     sys.stdout.write(str(datetime.now().strftime("%d-%m-%Y %H:%M\n")))
     #conect signals and slots
     QtCore.QObject.connect(self.ui.listWidget_Layers,
                            QtCore.SIGNAL("itemClicked(QListWidgetItem*)"),
                            self.get_band_list)
     QtCore.QObject.connect(self.ui.listWidget_Layers,
                            QtCore.SIGNAL("itemChanged(QListWidgetItem*)"),
                            self.get_band_list)
     QtCore.QObject.connect(self.ui.btnLoad, QtCore.SIGNAL("pressed()"),
                            self.load_band_status)
     QtCore.QObject.connect(self.ui.btnLoad, QtCore.SIGNAL("released()"),
                            self.load_band)
     QtCore.QObject.connect(self.ui.btnRun, QtCore.SIGNAL("pressed()"),
                            self.run_status)
     QtCore.QObject.connect(self.ui.btnRun, QtCore.SIGNAL("released()"),
                            self.run)
     QtCore.QObject.connect(self.ui.btnClear, QtCore.SIGNAL("pressed()"),
                            self.clear_EqEdit)
     QtCore.QObject.connect(self.ui.btnSave, QtCore.SIGNAL("clicked()"),
                            self.save_file_dialog)
     QtCore.QObject.connect(self.ui.checkBoxGenerateOutput,
                            QtCore.SIGNAL("toggled(bool)"),
                            self.disable_output)
     # Math operators
     QtCore.QObject.connect(self.ui.btnAddition, QtCore.SIGNAL("clicked()"),
                            self.insertAdd)
     QtCore.QObject.connect(self.ui.btnSubtract, QtCore.SIGNAL("clicked()"),
                            self.insertMinus)
     QtCore.QObject.connect(self.ui.btnDivide, QtCore.SIGNAL("clicked()"),
                            self.insertDivide)
     QtCore.QObject.connect(self.ui.btnMultiply, QtCore.SIGNAL("clicked()"),
                            self.insertMult)
     QtCore.QObject.connect(self.ui.btnSqRoot, QtCore.SIGNAL("clicked()"),
                            self.insertRoot)
     QtCore.QObject.connect(self.ui.btnSquared, QtCore.SIGNAL("clicked()"),
                            self.insertPower)
     QtCore.QObject.connect(self.ui.btnRBracket, QtCore.SIGNAL("clicked()"),
                            self.insertRbracket)
     QtCore.QObject.connect(self.ui.btnLBracket, QtCore.SIGNAL("clicked()"),
                            self.insertLbracket)
     QtCore.QObject.connect(self.ui.btnMean, QtCore.SIGNAL("clicked()"),
                            self.insertMean)
     QtCore.QObject.connect(self.ui.btnStDev, QtCore.SIGNAL("clicked()"),
                            self.insertStDev)
     QtCore.QObject.connect(self.ui.btn0, QtCore.SIGNAL("clicked()"),
                            self.insertZero)
     QtCore.QObject.connect(self.ui.btn1, QtCore.SIGNAL("clicked()"),
                            self.insertOne)
     QtCore.QObject.connect(self.ui.btn2, QtCore.SIGNAL("clicked()"),
                            self.insertTwo)
     QtCore.QObject.connect(self.ui.btn3, QtCore.SIGNAL("clicked()"),
                            self.insertThree)
     QtCore.QObject.connect(self.ui.btn4, QtCore.SIGNAL("clicked()"),
                            self.insertFour)
     QtCore.QObject.connect(self.ui.btn5, QtCore.SIGNAL("clicked()"),
                            self.insertFive)
     QtCore.QObject.connect(self.ui.btn6, QtCore.SIGNAL("clicked()"),
                            self.insertSix)
     QtCore.QObject.connect(self.ui.btn7, QtCore.SIGNAL("clicked()"),
                            self.insertSeven)
     QtCore.QObject.connect(self.ui.btn8, QtCore.SIGNAL("clicked()"),
                            self.insertEight)
     QtCore.QObject.connect(self.ui.btn9, QtCore.SIGNAL("clicked()"),
                            self.insertNine)
     QtCore.QObject.connect(self.ui.btnPoint, QtCore.SIGNAL("clicked()"),
                            self.insertPoint)
     # Tab_2 buttons (Python scripts)
     QtCore.QObject.connect(self.ui.btnClearScript,
                            QtCore.SIGNAL("clicked()"), self.clear_Pyout)
     QtCore.QObject.connect(self.ui.btnRunScript,
                            QtCore.SIGNAL("pressed()"), self.run_status)
     QtCore.QObject.connect(self.ui.btnRunScript,
                            QtCore.SIGNAL("released()"), self.run_Pyout)
     QtCore.QObject.connect(self.ui.btnSaveScript,
                            QtCore.SIGNAL("clicked()"), self.save_Pyout)
     QtCore.QObject.connect(self.ui.btnOpenScript,
                            QtCore.SIGNAL("clicked()"), self.open_Pyout)
     QtCore.QObject.connect(self.ui.btnOpenTemplate,
                            QtCore.SIGNAL("clicked()"), self.open_template)
     QtCore.QObject.connect(self.ui.btnViewLicense,
                            QtCore.SIGNAL("clicked()"), self.print_license)
     # Get the rasters that have been loaded into QGIS
     self.add_band()
     # Add some text to PyOut
     #self.ui.textPyout.setTextColor(QtCore.Qt.blue)
     self.ui.textPyout.insertPlainText('#!/usr/bin/env python\n')
     self.ui.textPyout.insertPlainText('import rasterIO\n')
     self.ui.textPyout.insertPlainText('import numpy.ma as ma\n\n')
class StartQT4(QtGui.QDialog):
	def __init__(self):
		QtGui.QDialog.__init__(self)
		self.ui = Ui_Form ()
		self.ui.setupUi(self)
		sys.stdout = StdOutLog( self.ui.textInformation, sys.stdout)
		sys.stderr = StdErrLog( self.ui.textInformation, sys.stderr)		
		sys.stdout.write(str(datetime.now().strftime("%d-%m-%Y %H:%M\n")))
		#conect signals and slots
		QtCore.QObject.connect(self.ui.listWidget_Layers,QtCore.SIGNAL("itemClicked(QListWidgetItem*)"),self.get_band_list)
		QtCore.QObject.connect(self.ui.listWidget_Layers,QtCore.SIGNAL("itemChanged(QListWidgetItem*)"),self.get_band_list)	
		QtCore.QObject.connect(self.ui.btnLoad,QtCore.SIGNAL("pressed()"),self.load_band_status)
		QtCore.QObject.connect(self.ui.btnLoad,QtCore.SIGNAL("released()"),self.load_band)
		QtCore.QObject.connect(self.ui.btnRun,QtCore.SIGNAL("pressed()"),self.run_status)		
		QtCore.QObject.connect(self.ui.btnRun,QtCore.SIGNAL("released()"),self.run)
		QtCore.QObject.connect(self.ui.btnClear,QtCore.SIGNAL("pressed()"),self.clear_EqEdit)
		QtCore.QObject.connect(self.ui.btnSave,QtCore.SIGNAL("clicked()"),self.save_file_dialog)
		QtCore.QObject.connect(self.ui.checkBoxGenerateOutput,QtCore.SIGNAL("toggled(bool)"),self.disable_output)
		# Math operators
		QtCore.QObject.connect(self.ui.btnAddition,QtCore.SIGNAL("clicked()"),self.insertAdd)
		QtCore.QObject.connect(self.ui.btnSubtract,QtCore.SIGNAL("clicked()"),self.insertMinus)
		QtCore.QObject.connect(self.ui.btnDivide,QtCore.SIGNAL("clicked()"),self.insertDivide)
		QtCore.QObject.connect(self.ui.btnMultiply,QtCore.SIGNAL("clicked()"),self.insertMult)
		QtCore.QObject.connect(self.ui.btnSqRoot,QtCore.SIGNAL("clicked()"),self.insertRoot)
		QtCore.QObject.connect(self.ui.btnSquared,QtCore.SIGNAL("clicked()"),self.insertPower)
		QtCore.QObject.connect(self.ui.btnRBracket,QtCore.SIGNAL("clicked()"),self.insertRbracket)
		QtCore.QObject.connect(self.ui.btnLBracket,QtCore.SIGNAL("clicked()"),self.insertLbracket)		
		QtCore.QObject.connect(self.ui.btnMean,QtCore.SIGNAL("clicked()"),self.insertMean)
		QtCore.QObject.connect(self.ui.btnStDev,QtCore.SIGNAL("clicked()"),self.insertStDev)
		QtCore.QObject.connect(self.ui.btn0,QtCore.SIGNAL("clicked()"),self.insertZero)
		QtCore.QObject.connect(self.ui.btn1,QtCore.SIGNAL("clicked()"),self.insertOne)
		QtCore.QObject.connect(self.ui.btn2,QtCore.SIGNAL("clicked()"),self.insertTwo)
		QtCore.QObject.connect(self.ui.btn3,QtCore.SIGNAL("clicked()"),self.insertThree)
		QtCore.QObject.connect(self.ui.btn4,QtCore.SIGNAL("clicked()"),self.insertFour)
		QtCore.QObject.connect(self.ui.btn5,QtCore.SIGNAL("clicked()"),self.insertFive)
		QtCore.QObject.connect(self.ui.btn6,QtCore.SIGNAL("clicked()"),self.insertSix)
		QtCore.QObject.connect(self.ui.btn7,QtCore.SIGNAL("clicked()"),self.insertSeven)
		QtCore.QObject.connect(self.ui.btn8,QtCore.SIGNAL("clicked()"),self.insertEight)
		QtCore.QObject.connect(self.ui.btn9,QtCore.SIGNAL("clicked()"),self.insertNine)
		QtCore.QObject.connect(self.ui.btnPoint,QtCore.SIGNAL("clicked()"),self.insertPoint)
		# Tab_2 buttons (Python scripts)
		QtCore.QObject.connect(self.ui.btnClearScript,QtCore.SIGNAL("clicked()"),self.clear_Pyout)
		QtCore.QObject.connect(self.ui.btnRunScript,QtCore.SIGNAL("pressed()"),self.run_status)
		QtCore.QObject.connect(self.ui.btnRunScript,QtCore.SIGNAL("released()"),self.run_Pyout)
		QtCore.QObject.connect(self.ui.btnSaveScript,QtCore.SIGNAL("clicked()"),self.save_Pyout)
		QtCore.QObject.connect(self.ui.btnOpenScript,QtCore.SIGNAL("clicked()"),self.open_Pyout)
		QtCore.QObject.connect(self.ui.btnOpenTemplate,QtCore.SIGNAL("clicked()"),self.open_template)
		QtCore.QObject.connect(self.ui.btnViewLicense,QtCore.SIGNAL("clicked()"),self.print_license)
		# Get the rasters that have been loaded into QGIS
		self.add_band()
		# Add some text to PyOut
		#self.ui.textPyout.setTextColor(QtCore.Qt.blue)
		self.ui.textPyout.insertPlainText('#!/usr/bin/env python\n')
		self.ui.textPyout.insertPlainText('import rasterIO\n')
		self.ui.textPyout.insertPlainText('import numpy.ma as ma\n\n')
		#self.ui.textPyout.setTextColor(QtCore.Qt.black)
			
	# Add band function	
	def add_band(self):
		self.layermap = QgsMapLayerRegistry.instance().mapLayers()
		for (name, layer) in self.layermap.iteritems():
			if type(layer).__name__ == "QgsRasterLayer":
				raster =  layer.source()
				try:
					raster_str = str(raster)
					rasterIO.opengdalraster(raster_str)
					self.ui.listWidget_Layers.addItem(raster_str)
					self.ui.listWidget_Layers.setCurrentRow(0)
					self.get_band_list()
				except IOError:
					sys.stderr.write('IOError from file: ')
					sys.stderr.write(raster_str)
					sys.stderr.write('\n')
	def write(self,astring):
		self.ui.textInformation.append(astring)
	def exit(self):
		quit()
	def load_band_status(self):
		sys.stdout.write('Reading raster data...\n')
	# Math functions
	def insertStDev(self):
		self.ui.textEqEdit.insertPlainText(" ma.std( )")
		self.ui.textEqEdit.moveCursor(QtGui.QTextCursor.PreviousCharacter)
		#self.ui.statusbar.showMessage("Band standard deviation from Masked Array (ma) numerical library",4000)
	def insertRbracket(self):
		self.ui.textEqEdit.insertPlainText(") ")
	def insertLbracket(self):
		self.ui.textEqEdit.insertPlainText("( ")
	def insertRoot(self):
		self.ui.textEqEdit.insertPlainText("ma.sqrt( )")
		self.ui.textEqEdit.moveCursor(QtGui.QTextCursor.PreviousCharacter)
	def insertPower(self):
		self.ui.textEqEdit.insertPlainText("ma.power( ,2)")
		self.ui.textEqEdit.moveCursor(QtGui.QTextCursor.PreviousCharacter)
		self.ui.textEqEdit.moveCursor(QtGui.QTextCursor.PreviousCharacter)
		self.ui.textEqEdit.moveCursor(QtGui.QTextCursor.PreviousCharacter)
	def insertMean(self):
		self.ui.textEqEdit.insertPlainText(" ma.mean( )")
		self.ui.textEqEdit.moveCursor(QtGui.QTextCursor.PreviousCharacter)
	def insertAdd(self):
		self.ui.textEqEdit.insertPlainText("+ ")
	def insertMinus(self):
		self.ui.textEqEdit.insertPlainText("- ")
	def insertDivide(self):
		self.ui.textEqEdit.insertPlainText("/ ")
	def insertMult(self):
		self.ui.textEqEdit.insertPlainText("* ")
	def insertZero(self):
		self.ui.textEqEdit.insertPlainText("0")
	def insertOne(self):
		self.ui.textEqEdit.insertPlainText("1")
	def insertTwo(self):
		self.ui.textEqEdit.insertPlainText("2")
	def insertThree(self):
		self.ui.textEqEdit.insertPlainText("3")
	def insertFour(self):
		self.ui.textEqEdit.insertPlainText("4")
	def insertFive(self):
		self.ui.textEqEdit.insertPlainText("5")
	def insertSix(self):
		self.ui.textEqEdit.insertPlainText("6")
	def insertSeven(self):
		self.ui.textEqEdit.insertPlainText("7")
	def insertEight(self):
		self.ui.textEqEdit.insertPlainText("8")
	def insertNine(self):
		self.ui.textEqEdit.insertPlainText("9")	
	def insertPoint(self):
		self.ui.textEqEdit.insertPlainText(".")
	def disable_output(self):
		if self.ui.btnSave.isEnabled() == True:
			self.ui.btnSave.setEnabled(False)
			self.ui.lineOutfile.setEnabled(False)
			self.ui.comboFormats.setEnabled(False)
			self.ui.checkBoxQGIS.setEnabled(False)
			self.ui.labelSaveNewRaster.setEnabled(False)
		else:
			self.ui.btnSave.setEnabled(True)
			self.ui.lineOutfile.setEnabled(True)
			self.ui.comboFormats.setEnabled(True)
			self.ui.checkBoxQGIS.setEnabled(True)
			self.ui.labelSaveNewRaster.setEnabled(True)
	# Get a list of bands available in the raster	
	def get_band_list(self):
		if (self.ui.listWidget_Layers.count() > 0):
			fname = self.ui.listWidget_Layers.currentItem().text()
			fname_Str = str(fname)
			inraster = rasterIO.opengdalraster(fname_Str)
			numbands = inraster.RasterCount
			self.ui.comboBands.clear()
			self.ui.comboBands.addItem("Band #")		
			for i in range(1,numbands +1):
				self.ui.comboBands.addItem(str(i))
			self.ui.comboBands.setCurrentIndex(1)
	# Load the band into memory
	def load_band(self):
		file_count = self.ui.listWidget_Layers.count()		
		if file_count < 1:
			sys.stderr.write('Error: No input files, open a raster file first!\n')
		else:	
			if self.ui.comboBands.currentText() == 'Band #':
				sys.stderr.write('Select which band number to load.\n')
			else:
				band_num = int(self.ui.comboBands.currentText())
				fname = self.ui.listWidget_Layers.currentItem().text()
				fname_Str = str(fname)
				basename = os.path.basename(fname_Str)
				basename = os.path.splitext(basename)
				basename = basename[0]		
				cleaname_a = string.replace(basename, '.', '_') 
				cleaname = string.replace(cleaname_a, '-', '_')
				newname = cleaname+'_'+str(band_num)	
				rasterpointer = rasterIO.opengdalraster(fname_Str)
				global driver, XSize, YSize, proj, geotrans		
				global bandname
				bandname = newname
				globals()[bandname] = rasterIO.readrasterband(rasterpointer, band_num)
				driver, XSize, YSize, proj, geotrans = rasterIO.readrastermeta(rasterpointer)		
				self.ui.textEqEdit.insertPlainText(bandname+" ")
				sys.stdout.write("Loaded: ")
				sys.stdout.write(str(fname_Str))
				sys.stdout.write(", band: ")
				sys.stdout.write(str(band_num))
				sys.stdout.write("\n")
				self.ui.textPyout.insertPlainText('# open a file pointer\n')
				self.ui.textPyout.insertPlainText('rasterpointer = rasterIO.opengdalraster("%s")\n' %(fname_Str))
				self.ui.textPyout.insertPlainText('# read a raster band\n')
				self.ui.textPyout.insertPlainText('%s = rasterIO.readrasterband(rasterpointer, %i)\n' %(bandname, band_num))
				self.ui.textPyout.insertPlainText('# get file metadata: format, X, Y, projection, geo-parameters\n')
				self.ui.textPyout.insertPlainText('driver, XSize, YSize, proj, geotrans = rasterIO.readrastermeta(rasterpointer)\n\n')
	# print user information that process is running			
	def run_status(self):
		sys.stdout.write('Processing...\n')
	# execute process
	def run(self):
		# Get inputs
		outname = str(self.ui.lineOutfile.text())
		eqstring = str(self.ui.textEqEdit.toPlainText())
		# Basic user validation
		if (len(eqstring) < 1):
			sys.stderr.write('Error: No equation to process.\n')
		elif(self.ui.listWidget_Layers.count() < 1):
			sys.stderr.write('Error: No input files.\n')
		# Process to new file	
		else:	
			try:
				# Test if output box is checked
				if self.ui.checkBoxGenerateOutput.isChecked() == False:
					if (len(outname) < 1):
						sys.stderr.write('Error: No output filename specified.\n')
					else:
						newband = eval(eqstring)
						newband = ma.masked_values(newband, 9999.0)
						epsg = rasterIO.wkt2epsg(proj)
						# setup python dictionary of rgdal formats and drivers
						formats = {'GeoTiff (.tif)':'.tif','Erdas Imagine (.img)':'.img'}
						drivers = {'GeoTiff (.tif)':'GTiff','Erdas Imagine (.img)':'HFA'}
						out_ext = formats[str(self.ui.comboFormats.currentText())]
						driver = drivers[str(self.ui.comboFormats.currentText())]
						outfile = outname + out_ext
						#driver = 'GTiff'
						rasterIO.writerasterband(newband, outfile, driver, XSize, YSize, geotrans, epsg)
						sys.stdout.write('Process complete, created newfile ')
						sys.stdout.write(str(outfile))
						sys.stdout.write('\n')
						if self.ui.checkBoxQGIS.isEnabled() == True:
							qgis.utils.iface.addRasterLayer(outfile)
						self.ui.textPyout.insertPlainText('# create a new matrix from equation\n')
						self.ui.textPyout.insertPlainText('newband = %s\n' %(eqstring))
						self.ui.textPyout.insertPlainText('# get the epsg code from the projection\n')
						self.ui.textPyout.insertPlainText('epsg = rasterIO.wkt2epsg(proj)\n')
						self.ui.textPyout.insertPlainText('# set the gdal driver / output file type\n')
						self.ui.textPyout.insertPlainText('driver = "%s"\n' %(driver))
						self.ui.textPyout.insertPlainText('# specify the new output file\n')
						self.ui.textPyout.insertPlainText('outfile = "%s"\n' %(outfile))
						self.ui.textPyout.insertPlainText('# write the new matrix to the new file\n')
						self.ui.textPyout.insertPlainText('rasterIO.writerasterband(newband, outfile, driver, XSize, YSize, geotrans, epsg)\n\n')
						self.ui.textPyout.insertPlainText('# add the new file to qgis\n')
						self.ui.textPyout.insertPlainText('qgis.utils.iface.addRasterLayer(outfile)\n\n')
				else:
					outputstring = (str(eval(str(self.ui.textEqEdit.toPlainText())))) +'\n'
					self.ui.textInformation.setTextColor(QtGui.QColor(0,0,255))
					self.ui.textInformation.insertPlainText(outputstring)
					self.ui.textInformation.moveCursor(QtGui.QTextCursor.End)
					self.ui.textPyout.insertPlainText('# run without output file\n')
					self.ui.textPyout.insertPlainText('print %s\n\n' %(eqstring))
			except ValueError:
				sys.stderr.write('Error: Could not perform calculation. Are input rasters same shape and size? Is the output a matrix?\n')
			except TypeError:
				sys.stderr.write('Error: Could not perform calculation. Are input rasters loaded?\n')
			except SyntaxError:
				sys.stderr.write('Error: Could not perform calculation. Is the equation correct?\n')
			except AttributeError:
				sys.stderr.write('Error: Could not perform calculation. Is the output raster correct?\n')
	# Python script functions			
	def run_Pyout(self):
		try:
			commandstring = str(self.ui.textPyout.toPlainText())
			exec(commandstring)
		except:
			sys.stderr.write('Error: There was an error in the script.\n')
	def save_file_dialog(self):
		fd = QtGui.QFileDialog.getSaveFileName(self)
		self.ui.lineOutfile.insert(fd)	
	def clear_EqEdit(self):
		self.ui.textEqEdit.clear()
	def clear_Pyout(self):
		self.ui.textPyout.clear()
		self.ui.textPyout.insertPlainText('#!/usr/bin/env python\n')
		self.ui.textPyout.insertPlainText('import rasterIO\n')
		self.ui.textPyout.insertPlainText('import numpy.ma as ma\n\n')
	def save_Pyout(self):
		try:		
			#fd = QtGui.QFileDialog.getSaveFileName(self,"Save script", "Python scripts (*.py)")
			fd = QtGui.QFileDialog.getSaveFileName(self, "Save script", "", "Python files: *.py")			
			if fd != '':
				fd = fd+'.py'
				outfile = open(fd,'w')
				print >> outfile, str(self.ui.textPyout.toPlainText())
				sys.stdout.write('Saved script to file\n')  
		except IOError:
			sys.stderr.write('Error: There was an error saving the python script\n')
		
	def open_Pyout(self):
		try:
			fd = QtGui.QFileDialog.getOpenFileName(self, "Open script", "", "Python files: *.py ;; Text files: *.txt ;; All files: *.*")
			if fd != '':
				infile = open(fd,'r')
				script = infile.read()
				self.ui.textPyout.clear()
				self.ui.textPyout.insertPlainText(script)
		except IOError:
			sys.stderr.write('Error: There was an error opening the python script\n')
	def open_template(self):
		try:
			cdir = os.getcwd()
			template_dir = os.environ['HOME']+'/.qgis/python/plugins/raster_processing_suite/templates/'			
			os.chdir(template_dir)			
			fd = QtGui.QFileDialog.getOpenFileName(self, "Open template script", "", "Python files: *.py ;; Text files: *.txt ;; All files *.*")
			if fd != '':
				infile = open(fd,'r')
				script = infile.read()
				self.ui.textPyout.clear()
				self.ui.textPyout.insertPlainText(script)	
			os.chdir(cdir)
		except IOError:
			sys.stderr.write('Error: There was an error opening the python script\n')

	def print_license(self):
		try:		
			license = open(os.environ['HOME']+'/.qgis/python/plugins/raster_processing_suite/LICENSE.TXT')
			text = license.read()
			#sys.stdout.write(text)
			#print text
			self.ui.textInformation.insertPlainText(text)
		except IOError:
			sys.stdout.write("Error: Can't open LICENSE.TXT'.") 
class StartQT4(QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        sys.stdout = StdOutLog(self.ui.textInformation, sys.stdout)
        sys.stderr = StdErrLog(self.ui.textInformation, sys.stderr)
        sys.stdout.write(str(datetime.now().strftime("%d-%m-%Y %H:%M\n")))
        #conect signals and slots
        QtCore.QObject.connect(self.ui.listWidget_Layers,
                               QtCore.SIGNAL("itemClicked(QListWidgetItem*)"),
                               self.get_band_list)
        QtCore.QObject.connect(self.ui.listWidget_Layers,
                               QtCore.SIGNAL("itemChanged(QListWidgetItem*)"),
                               self.get_band_list)
        QtCore.QObject.connect(self.ui.btnLoad, QtCore.SIGNAL("pressed()"),
                               self.load_band_status)
        QtCore.QObject.connect(self.ui.btnLoad, QtCore.SIGNAL("released()"),
                               self.load_band)
        QtCore.QObject.connect(self.ui.btnRun, QtCore.SIGNAL("pressed()"),
                               self.run_status)
        QtCore.QObject.connect(self.ui.btnRun, QtCore.SIGNAL("released()"),
                               self.run)
        QtCore.QObject.connect(self.ui.btnClear, QtCore.SIGNAL("pressed()"),
                               self.clear_EqEdit)
        QtCore.QObject.connect(self.ui.btnSave, QtCore.SIGNAL("clicked()"),
                               self.save_file_dialog)
        QtCore.QObject.connect(self.ui.checkBoxGenerateOutput,
                               QtCore.SIGNAL("toggled(bool)"),
                               self.disable_output)
        # Math operators
        QtCore.QObject.connect(self.ui.btnAddition, QtCore.SIGNAL("clicked()"),
                               self.insertAdd)
        QtCore.QObject.connect(self.ui.btnSubtract, QtCore.SIGNAL("clicked()"),
                               self.insertMinus)
        QtCore.QObject.connect(self.ui.btnDivide, QtCore.SIGNAL("clicked()"),
                               self.insertDivide)
        QtCore.QObject.connect(self.ui.btnMultiply, QtCore.SIGNAL("clicked()"),
                               self.insertMult)
        QtCore.QObject.connect(self.ui.btnSqRoot, QtCore.SIGNAL("clicked()"),
                               self.insertRoot)
        QtCore.QObject.connect(self.ui.btnSquared, QtCore.SIGNAL("clicked()"),
                               self.insertPower)
        QtCore.QObject.connect(self.ui.btnRBracket, QtCore.SIGNAL("clicked()"),
                               self.insertRbracket)
        QtCore.QObject.connect(self.ui.btnLBracket, QtCore.SIGNAL("clicked()"),
                               self.insertLbracket)
        QtCore.QObject.connect(self.ui.btnMean, QtCore.SIGNAL("clicked()"),
                               self.insertMean)
        QtCore.QObject.connect(self.ui.btnStDev, QtCore.SIGNAL("clicked()"),
                               self.insertStDev)
        QtCore.QObject.connect(self.ui.btn0, QtCore.SIGNAL("clicked()"),
                               self.insertZero)
        QtCore.QObject.connect(self.ui.btn1, QtCore.SIGNAL("clicked()"),
                               self.insertOne)
        QtCore.QObject.connect(self.ui.btn2, QtCore.SIGNAL("clicked()"),
                               self.insertTwo)
        QtCore.QObject.connect(self.ui.btn3, QtCore.SIGNAL("clicked()"),
                               self.insertThree)
        QtCore.QObject.connect(self.ui.btn4, QtCore.SIGNAL("clicked()"),
                               self.insertFour)
        QtCore.QObject.connect(self.ui.btn5, QtCore.SIGNAL("clicked()"),
                               self.insertFive)
        QtCore.QObject.connect(self.ui.btn6, QtCore.SIGNAL("clicked()"),
                               self.insertSix)
        QtCore.QObject.connect(self.ui.btn7, QtCore.SIGNAL("clicked()"),
                               self.insertSeven)
        QtCore.QObject.connect(self.ui.btn8, QtCore.SIGNAL("clicked()"),
                               self.insertEight)
        QtCore.QObject.connect(self.ui.btn9, QtCore.SIGNAL("clicked()"),
                               self.insertNine)
        QtCore.QObject.connect(self.ui.btnPoint, QtCore.SIGNAL("clicked()"),
                               self.insertPoint)
        # Tab_2 buttons (Python scripts)
        QtCore.QObject.connect(self.ui.btnClearScript,
                               QtCore.SIGNAL("clicked()"), self.clear_Pyout)
        QtCore.QObject.connect(self.ui.btnRunScript,
                               QtCore.SIGNAL("pressed()"), self.run_status)
        QtCore.QObject.connect(self.ui.btnRunScript,
                               QtCore.SIGNAL("released()"), self.run_Pyout)
        QtCore.QObject.connect(self.ui.btnSaveScript,
                               QtCore.SIGNAL("clicked()"), self.save_Pyout)
        QtCore.QObject.connect(self.ui.btnOpenScript,
                               QtCore.SIGNAL("clicked()"), self.open_Pyout)
        QtCore.QObject.connect(self.ui.btnOpenTemplate,
                               QtCore.SIGNAL("clicked()"), self.open_template)
        QtCore.QObject.connect(self.ui.btnViewLicense,
                               QtCore.SIGNAL("clicked()"), self.print_license)
        # Get the rasters that have been loaded into QGIS
        self.add_band()
        # Add some text to PyOut
        #self.ui.textPyout.setTextColor(QtCore.Qt.blue)
        self.ui.textPyout.insertPlainText('#!/usr/bin/env python\n')
        self.ui.textPyout.insertPlainText('import rasterIO\n')
        self.ui.textPyout.insertPlainText('import numpy.ma as ma\n\n')
        #self.ui.textPyout.setTextColor(QtCore.Qt.black)

    # Add band function
    def add_band(self):
        self.layermap = QgsMapLayerRegistry.instance().mapLayers()
        for (name, layer) in self.layermap.iteritems():
            if type(layer).__name__ == "QgsRasterLayer":
                raster = layer.source()
                try:
                    raster_str = str(raster)
                    rasterIO.opengdalraster(raster_str)
                    self.ui.listWidget_Layers.addItem(raster_str)
                    self.ui.listWidget_Layers.setCurrentRow(0)
                    self.get_band_list()
                except IOError:
                    sys.stderr.write('IOError from file: ')
                    sys.stderr.write(raster_str)
                    sys.stderr.write('\n')

    def write(self, astring):
        self.ui.textInformation.append(astring)

    def exit(self):
        quit()

    def load_band_status(self):
        sys.stdout.write('Reading raster data...\n')

    # Math functions
    def insertStDev(self):
        self.ui.textEqEdit.insertPlainText(" ma.std( )")
        self.ui.textEqEdit.moveCursor(QtGui.QTextCursor.PreviousCharacter)
        #self.ui.statusbar.showMessage("Band standard deviation from Masked Array (ma) numerical library",4000)
    def insertRbracket(self):
        self.ui.textEqEdit.insertPlainText(") ")

    def insertLbracket(self):
        self.ui.textEqEdit.insertPlainText("( ")

    def insertRoot(self):
        self.ui.textEqEdit.insertPlainText("ma.sqrt( )")
        self.ui.textEqEdit.moveCursor(QtGui.QTextCursor.PreviousCharacter)

    def insertPower(self):
        self.ui.textEqEdit.insertPlainText("ma.power( ,2)")
        self.ui.textEqEdit.moveCursor(QtGui.QTextCursor.PreviousCharacter)
        self.ui.textEqEdit.moveCursor(QtGui.QTextCursor.PreviousCharacter)
        self.ui.textEqEdit.moveCursor(QtGui.QTextCursor.PreviousCharacter)

    def insertMean(self):
        self.ui.textEqEdit.insertPlainText(" ma.mean( )")
        self.ui.textEqEdit.moveCursor(QtGui.QTextCursor.PreviousCharacter)

    def insertAdd(self):
        self.ui.textEqEdit.insertPlainText("+ ")

    def insertMinus(self):
        self.ui.textEqEdit.insertPlainText("- ")

    def insertDivide(self):
        self.ui.textEqEdit.insertPlainText("/ ")

    def insertMult(self):
        self.ui.textEqEdit.insertPlainText("* ")

    def insertZero(self):
        self.ui.textEqEdit.insertPlainText("0")

    def insertOne(self):
        self.ui.textEqEdit.insertPlainText("1")

    def insertTwo(self):
        self.ui.textEqEdit.insertPlainText("2")

    def insertThree(self):
        self.ui.textEqEdit.insertPlainText("3")

    def insertFour(self):
        self.ui.textEqEdit.insertPlainText("4")

    def insertFive(self):
        self.ui.textEqEdit.insertPlainText("5")

    def insertSix(self):
        self.ui.textEqEdit.insertPlainText("6")

    def insertSeven(self):
        self.ui.textEqEdit.insertPlainText("7")

    def insertEight(self):
        self.ui.textEqEdit.insertPlainText("8")

    def insertNine(self):
        self.ui.textEqEdit.insertPlainText("9")

    def insertPoint(self):
        self.ui.textEqEdit.insertPlainText(".")

    def disable_output(self):
        if self.ui.btnSave.isEnabled() == True:
            self.ui.btnSave.setEnabled(False)
            self.ui.lineOutfile.setEnabled(False)
            self.ui.comboFormats.setEnabled(False)
            self.ui.checkBoxQGIS.setEnabled(False)
            self.ui.labelSaveNewRaster.setEnabled(False)
        else:
            self.ui.btnSave.setEnabled(True)
            self.ui.lineOutfile.setEnabled(True)
            self.ui.comboFormats.setEnabled(True)
            self.ui.checkBoxQGIS.setEnabled(True)
            self.ui.labelSaveNewRaster.setEnabled(True)

    # Get a list of bands available in the raster
    def get_band_list(self):
        if (self.ui.listWidget_Layers.count() > 0):
            fname = self.ui.listWidget_Layers.currentItem().text()
            fname_Str = str(fname)
            inraster = rasterIO.opengdalraster(fname_Str)
            numbands = inraster.RasterCount
            self.ui.comboBands.clear()
            self.ui.comboBands.addItem("Band #")
            for i in range(1, numbands + 1):
                self.ui.comboBands.addItem(str(i))
            self.ui.comboBands.setCurrentIndex(1)

    # Load the band into memory
    def load_band(self):
        file_count = self.ui.listWidget_Layers.count()
        if file_count < 1:
            sys.stderr.write(
                'Error: No input files, open a raster file first!\n')
        else:
            if self.ui.comboBands.currentText() == 'Band #':
                sys.stderr.write('Select which band number to load.\n')
            else:
                band_num = int(self.ui.comboBands.currentText())
                fname = self.ui.listWidget_Layers.currentItem().text()
                fname_Str = str(fname)
                basename = os.path.basename(fname_Str)
                basename = os.path.splitext(basename)
                basename = basename[0]
                cleaname_a = string.replace(basename, '.', '_')
                cleaname = string.replace(cleaname_a, '-', '_')
                newname = cleaname + '_' + str(band_num)
                rasterpointer = rasterIO.opengdalraster(fname_Str)
                global driver, XSize, YSize, proj, geotrans
                global bandname
                bandname = newname
                globals()[bandname] = rasterIO.readrasterband(
                    rasterpointer, band_num)
                driver, XSize, YSize, proj, geotrans = rasterIO.readrastermeta(
                    rasterpointer)
                self.ui.textEqEdit.insertPlainText(bandname + " ")
                sys.stdout.write("Loaded: ")
                sys.stdout.write(str(fname_Str))
                sys.stdout.write(", band: ")
                sys.stdout.write(str(band_num))
                sys.stdout.write("\n")
                self.ui.textPyout.insertPlainText('# open a file pointer\n')
                self.ui.textPyout.insertPlainText(
                    'rasterpointer = rasterIO.opengdalraster("%s")\n' %
                    (fname_Str))
                self.ui.textPyout.insertPlainText('# read a raster band\n')
                self.ui.textPyout.insertPlainText(
                    '%s = rasterIO.readrasterband(rasterpointer, %i)\n' %
                    (bandname, band_num))
                self.ui.textPyout.insertPlainText(
                    '# get file metadata: format, X, Y, projection, geo-parameters\n'
                )
                self.ui.textPyout.insertPlainText(
                    'driver, XSize, YSize, proj, geotrans = rasterIO.readrastermeta(rasterpointer)\n\n'
                )

    # print user information that process is running
    def run_status(self):
        sys.stdout.write('Processing...\n')

    # execute process
    def run(self):
        # Get inputs
        outname = str(self.ui.lineOutfile.text())
        eqstring = str(self.ui.textEqEdit.toPlainText())
        # Basic user validation
        if (len(eqstring) < 1):
            sys.stderr.write('Error: No equation to process.\n')
        elif (self.ui.listWidget_Layers.count() < 1):
            sys.stderr.write('Error: No input files.\n')
        # Process to new file
        else:
            try:
                # Test if output box is checked
                if self.ui.checkBoxGenerateOutput.isChecked() == False:
                    if (len(outname) < 1):
                        sys.stderr.write(
                            'Error: No output filename specified.\n')
                    else:
                        newband = eval(eqstring)
                        newband = ma.masked_values(newband, 9999.0)
                        epsg = rasterIO.wkt2epsg(proj)
                        # setup python dictionary of rgdal formats and drivers
                        formats = {
                            'GeoTiff (.tif)': '.tif',
                            'Erdas Imagine (.img)': '.img'
                        }
                        drivers = {
                            'GeoTiff (.tif)': 'GTiff',
                            'Erdas Imagine (.img)': 'HFA'
                        }
                        out_ext = formats[str(
                            self.ui.comboFormats.currentText())]
                        driver = drivers[str(
                            self.ui.comboFormats.currentText())]
                        outfile = outname + out_ext
                        #driver = 'GTiff'
                        rasterIO.writerasterband(newband, outfile, driver,
                                                 XSize, YSize, geotrans, epsg)
                        sys.stdout.write('Process complete, created newfile ')
                        sys.stdout.write(str(outfile))
                        sys.stdout.write('\n')
                        if self.ui.checkBoxQGIS.isEnabled() == True:
                            qgis.utils.iface.addRasterLayer(outfile)
                        self.ui.textPyout.insertPlainText(
                            '# create a new matrix from equation\n')
                        self.ui.textPyout.insertPlainText('newband = %s\n' %
                                                          (eqstring))
                        self.ui.textPyout.insertPlainText(
                            '# get the epsg code from the projection\n')
                        self.ui.textPyout.insertPlainText(
                            'epsg = rasterIO.wkt2epsg(proj)\n')
                        self.ui.textPyout.insertPlainText(
                            '# set the gdal driver / output file type\n')
                        self.ui.textPyout.insertPlainText('driver = "%s"\n' %
                                                          (driver))
                        self.ui.textPyout.insertPlainText(
                            '# specify the new output file\n')
                        self.ui.textPyout.insertPlainText('outfile = "%s"\n' %
                                                          (outfile))
                        self.ui.textPyout.insertPlainText(
                            '# write the new matrix to the new file\n')
                        self.ui.textPyout.insertPlainText(
                            'rasterIO.writerasterband(newband, outfile, driver, XSize, YSize, geotrans, epsg)\n\n'
                        )
                        self.ui.textPyout.insertPlainText(
                            '# add the new file to qgis\n')
                        self.ui.textPyout.insertPlainText(
                            'qgis.utils.iface.addRasterLayer(outfile)\n\n')
                else:
                    outputstring = (str(
                        eval(str(self.ui.textEqEdit.toPlainText())))) + '\n'
                    self.ui.textInformation.setTextColor(
                        QtGui.QColor(0, 0, 255))
                    self.ui.textInformation.insertPlainText(outputstring)
                    self.ui.textInformation.moveCursor(QtGui.QTextCursor.End)
                    self.ui.textPyout.insertPlainText(
                        '# run without output file\n')
                    self.ui.textPyout.insertPlainText('print %s\n\n' %
                                                      (eqstring))
            except ValueError:
                sys.stderr.write(
                    'Error: Could not perform calculation. Are input rasters same shape and size? Is the output a matrix?\n'
                )
            except TypeError:
                sys.stderr.write(
                    'Error: Could not perform calculation. Are input rasters loaded?\n'
                )
            except SyntaxError:
                sys.stderr.write(
                    'Error: Could not perform calculation. Is the equation correct?\n'
                )
            except AttributeError:
                sys.stderr.write(
                    'Error: Could not perform calculation. Is the output raster correct?\n'
                )

    # Python script functions
    def run_Pyout(self):
        try:
            commandstring = str(self.ui.textPyout.toPlainText())
            exec(commandstring)
        except:
            sys.stderr.write('Error: There was an error in the script.\n')

    def save_file_dialog(self):
        fd = QtGui.QFileDialog.getSaveFileName(self)
        self.ui.lineOutfile.insert(fd)

    def clear_EqEdit(self):
        self.ui.textEqEdit.clear()

    def clear_Pyout(self):
        self.ui.textPyout.clear()
        self.ui.textPyout.insertPlainText('#!/usr/bin/env python\n')
        self.ui.textPyout.insertPlainText('import rasterIO\n')
        self.ui.textPyout.insertPlainText('import numpy.ma as ma\n\n')

    def save_Pyout(self):
        try:
            #fd = QtGui.QFileDialog.getSaveFileName(self,"Save script", "Python scripts (*.py)")
            fd = QtGui.QFileDialog.getSaveFileName(self, "Save script", "",
                                                   "Python files: *.py")
            if fd != '':
                fd = fd + '.py'
                outfile = open(fd, 'w')
                print >> outfile, str(self.ui.textPyout.toPlainText())
                sys.stdout.write('Saved script to file\n')
        except IOError:
            sys.stderr.write(
                'Error: There was an error saving the python script\n')

    def open_Pyout(self):
        try:
            fd = QtGui.QFileDialog.getOpenFileName(
                self, "Open script", "",
                "Python files: *.py ;; Text files: *.txt ;; All files: *.*")
            if fd != '':
                infile = open(fd, 'r')
                script = infile.read()
                self.ui.textPyout.clear()
                self.ui.textPyout.insertPlainText(script)
        except IOError:
            sys.stderr.write(
                'Error: There was an error opening the python script\n')

    def open_template(self):
        try:
            cdir = os.getcwd()
            template_dir = os.environ[
                'HOME'] + '/.qgis/python/plugins/raster_processing_suite/templates/'
            os.chdir(template_dir)
            fd = QtGui.QFileDialog.getOpenFileName(
                self, "Open template script", "",
                "Python files: *.py ;; Text files: *.txt ;; All files *.*")
            if fd != '':
                infile = open(fd, 'r')
                script = infile.read()
                self.ui.textPyout.clear()
                self.ui.textPyout.insertPlainText(script)
            os.chdir(cdir)
        except IOError:
            sys.stderr.write(
                'Error: There was an error opening the python script\n')

    def print_license(self):
        try:
            license = open(
                os.environ['HOME'] +
                '/.qgis/python/plugins/raster_processing_suite/LICENSE.TXT')
            text = license.read()
            #sys.stdout.write(text)
            #print text
            self.ui.textInformation.insertPlainText(text)
        except IOError:
            sys.stdout.write("Error: Can't open LICENSE.TXT'.")