class ParallelOffset:
    def __init__(self, iface):
        # Save reference to the QGIS interface
        self.iface = iface
        # initialize plugin directory
        self.plugin_dir = QFileInfo(QgsApplication.qgisUserDbFilePath()).path(
        ) + "/python/plugins/paralleloffset"
        # initialize locale
        localePath = ""
        locale = QSettings().value("locale/userLocale")[0:2]

        if QFileInfo(self.plugin_dir).exists():
            localePath = self.plugin_dir + "/i18n/paralleloffset_" + locale + ".qm"

        if QFileInfo(localePath).exists():
            self.translator = QTranslator()
            self.translator.load(localePath)

            if qVersion() > '4.3.3':
                QCoreApplication.installTranslator(self.translator)

        # Create the dialog (after translation) and keep reference
        self.dlg = ParallelOffsetDialog()

    def initGui(self):
        # Create action that will start plugin configuration
        self.action = QAction(QIcon(":/plugins/paralleloffset/icon.png"),
                              u"Line Offset", self.iface.mainWindow())
        # connect the action to the run method
        QObject.connect(self.action, SIGNAL("triggered()"), self.run)

        # Add toolbar button and menu item
        self.iface.addToolBarIcon(self.action)
        self.iface.addPluginToMenu(u"&Line Offset", self.action)

    def unload(self):
        # Remove the plugin menu item and icon
        self.iface.removePluginMenu(u"&Line Offset", self.action)
        self.iface.removeToolBarIcon(self.action)

    # run method that performs all the real work
    def run(self):
        # show the dialog
        self.dlg.show()
        # Run the dialog event loop
        result = self.dlg.exec_()
        # See if OK was pressed
        if result == 1:
            layers = iface.legendInterface().layers()
            if len(layers) != 0:
                #Check that there is a selected layer
                layer = iface.mapCanvas().currentLayer()
                if layer.type() == 0:
                    #check selected layer is a vector layer
                    if layer.geometryType() == 1:
                        #check to see if selected layer is a linestring geometry
                        if len(layer.selectedFeatures()) != 0:
                            #Dir = float(self.dlg.ui.radLeft.isChecked()
                            layers = iface.legendInterface().layers()
                            Lexists = "false"
                            #check to see if the virtual layer already exists
                            for layer in layers:
                                if layer.name() == "Parallel_Offset":
                                    Lexists = "true"
                                    vl = layer
                            #if it doesn't exist create it
                            if Lexists == "false":
                                vl = QgsVectorLayer(
                                    "Linestring?field=offset:integer&field=direction:string(10)&field=method:string(10)",
                                    "Parallel_Offset", "memory")
                                #vl = QgsVectorLayer("Linestring", "Parallel_Offset", "memory")
                                pr = vl.dataProvider()
                                vl.startEditing()
                                #pr.addAttributes( [ QgsField("offset", Double), QgsField("direction",  String), QgsField("method", String) ] )
                            else:
                                pr = vl.dataProvider()
                                vl.startEditing()

                            #get the direction
                            Dir = 'right'
                            if self.dlg.ui.radLeft.isChecked():
                                Dir = 'left'
                            #get the method
                            if self.dlg.ui.radRound.isChecked():
                                js = 1
                            if self.dlg.ui.radMitre.isChecked():
                                js = 2
                            if self.dlg.ui.radBevel.isChecked():
                                js = 3
                            #get the offset
                            loffset = float(self.dlg.ui.txtDistance.text())

                            #create the new feature from the selection

                            for feature in layer.selectedFeatures():
                                geom = feature.geometry()
                                h = geom.asPolyline()
                                line = LineString(h)
                                nline = line.parallel_offset(loffset,
                                                             Dir,
                                                             resolution=16,
                                                             join_style=js,
                                                             mitre_limit=10.0)
                                #turn nline back into a polyline and add it to the map as a new layer.
                                fet = QgsFeature()
                                fet.setGeometry(QgsGeometry.fromWkt(
                                    str(nline)))
                                fet.setAttributes([loffset, Dir, js])
                                pr.addFeatures([fet])
                                vl.commitChanges()
                            QgsMapLayerRegistry.instance().addMapLayer(vl)
                            mc = self.iface.mapCanvas()
                            mc.refresh()
class ParallelOffset:

    def __init__(self, iface):
        # Save reference to the QGIS interface
        self.iface = iface
        # initialize plugin directory
        self.plugin_dir = QFileInfo(QgsApplication.qgisUserDbFilePath()).path() + "/python/plugins/paralleloffset"
        # initialize locale
        localePath = ""
        locale = QSettings().value("locale/userLocale")[0:2]

        if QFileInfo(self.plugin_dir).exists():
            localePath = self.plugin_dir + "/i18n/paralleloffset_" + locale + ".qm"

        if QFileInfo(localePath).exists():
            self.translator = QTranslator()
            self.translator.load(localePath)

            if qVersion() > '4.3.3':
                QCoreApplication.installTranslator(self.translator)

        # Create the dialog (after translation) and keep reference
        self.dlg = ParallelOffsetDialog()

    def initGui(self):
        # Create action that will start plugin configuration
        self.action = QAction(
            QIcon(":/plugins/paralleloffset/icon.png"),
            u"Line Offset", self.iface.mainWindow())
        # connect the action to the run method
        QObject.connect(self.action, SIGNAL("triggered()"), self.run)

        # Add toolbar button and menu item
        self.iface.addToolBarIcon(self.action)
        self.iface.addPluginToMenu(u"&Line Offset", self.action)

    def unload(self):
        # Remove the plugin menu item and icon
        self.iface.removePluginMenu(u"&Line Offset", self.action)
        self.iface.removeToolBarIcon(self.action)

    # run method that performs all the real work
    def run(self):
        # show the dialog
        self.dlg.show()
        # Run the dialog event loop
        result = self.dlg.exec_()
        # See if OK was pressed
        if result == 1:
			layers = iface.legendInterface().layers()
			if len(layers) != 0:
				#Check that there is a selected layer
				layer = iface.mapCanvas().currentLayer()
				if layer.type() == 0:
					#check selected layer is a vector layer
					if layer.geometryType() == 1:
						#check to see if selected layer is a linestring geometry
						if len(layer.selectedFeatures()) != 0:
							#Dir = float(self.dlg.ui.radLeft.isChecked()
							layers = iface.legendInterface().layers()
							Lexists = "false"
							#check to see if the virtual layer already exists
							for layer in layers:
								if layer.name() == "Parallel_Offset":
									Lexists = "true"
									vl = layer
							#if it doesn't exist create it
							if Lexists == "false":
								vl = QgsVectorLayer("Linestring?field=offset:integer&field=direction:string(10)&field=method:string(10)","Parallel_Offset","memory")
								#vl = QgsVectorLayer("Linestring", "Parallel_Offset", "memory")
								pr = vl.dataProvider()
								vl.startEditing()
								#pr.addAttributes( [ QgsField("offset", Double), QgsField("direction",  String), QgsField("method", String) ] )
							else:
								pr = vl.dataProvider()
								vl.startEditing()
						
							#get the direction
							Dir = 'right'
							if self.dlg.ui.radLeft.isChecked():
								Dir = 'left'
							#get the method
							if self.dlg.ui.radRound.isChecked():
								js = 1
							if self.dlg.ui.radMitre.isChecked():
								js = 2
							if self.dlg.ui.radBevel.isChecked():
								js = 3
							#get the offset
							loffset = float(self.dlg.ui.txtDistance.text())
						
							#create the new feature from the selection
					
							for feature in layer.selectedFeatures():
								geom = feature.geometry()
								h = geom.asPolyline()
								line = LineString(h)
								nline = line.parallel_offset(loffset, Dir,resolution=16,join_style=js,mitre_limit=10.0)
								#turn nline back into a polyline and add it to the map as a new layer.
								fet = QgsFeature()
								fet.setGeometry(QgsGeometry.fromWkt(str(nline)))
								fet.setAttributes( [loffset,Dir ,js] )
								pr.addFeatures( [ fet ] )
								vl.commitChanges()
							QgsMapLayerRegistry.instance().addMapLayer(vl)
							mc=self.iface.mapCanvas()
							mc.refresh()