# -*- coding: utf-8 -*-
"""
/***************************************************************************
 ImportCSV
                                 A QGIS plugin
 QGIS Import CSV
 Generated by Plugin Builder: http://g-sherman.github.io/Qgis-Plugin-Builder/
                              -------------------
        begin                : 2021-06-04
        git sha              : $Format:%H$
        copyright            : (C) 2021 by MS
        email                : info@microsystem-j.com
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/
"""
from qgis.PyQt.QtCore import QSettings, QTranslator, QCoreApplication, QVariant
from qgis.PyQt.QtGui import QIcon
from qgis.PyQt.QtWidgets import QAction


# Initialize Qt resources from file resources.py
from .resources import *

# Import the code for the dialog
from .import_CSV_dialog import ImportCSVDialog
from .import_CSV_help_import import HelpImportDialog #インポートヘルプダイアログ
from .import_CSV_help_polygon import HelpPolygonDialog #ポリゴン作成ヘルプダイアログ
from .import_CSV_help_save import HelpSaveDialog #保存ヘルプダイアログ
import os.path

from qgis.core import *
from PyQt5.QtWidgets import QAction, QMessageBox

# モジュールのインポート
import glob, os, chardet
import urllib.parse #URIエンコード
from PyQt5.QtWidgets import QFileDialog
from qgis.gui import QgsProjectionSelectionDialog, QgsTableWidgetItem #CRS選択ダイアログ
from qgis.core import QgsCoordinateReferenceSystem
from qgis.PyQt.QtWidgets import QProgressBar #プログレスバー




class ImportCSV:
    """QGIS Plugin Implementation."""

    
    def __init__(self, iface):
        """Constructor.

        :param iface: An interface instance that will be passed to this class
            which provides the hook by which you can manipulate the QGIS
            application at run time.
        :type iface: QgsInterface
        """
        # Save reference to the QGIS interface
        self.iface = iface
        # initialize plugin directory
        self.plugin_dir = os.path.dirname(__file__)
        # initialize locale
        locale = QSettings().value('locale/userLocale')[0:2]
        locale_path = os.path.join(
            self.plugin_dir,
            'i18n',
            'ImportCSV_{}.qm'.format(locale))

        if os.path.exists(locale_path):
            self.translator = QTranslator()
            self.translator.load(locale_path)
            QCoreApplication.installTranslator(self.translator)

        # Declare instance attributes
        self.actions = []
        self.menu = self.tr(u'&Import CSV')

        # Check if plugin was started the first time in current QGIS session
        # Must be set in initGui() to survive plugin reloads
        self.first_start = None

        

    # noinspection PyMethodMayBeStatic
    def tr(self, message):
        """Get the translation for a string using Qt translation API.

        We implement this ourselves since we do not inherit QObject.

        :param message: String for translation.
        :type message: str, QString

        :returns: Translated version of message.
        :rtype: QString
        """
        # noinspection PyTypeChecker,PyArgumentList,PyCallByClass
        return QCoreApplication.translate('ImportCSV', message)


    def add_action(
        self,
        icon_path,
        text,
        callback,
        enabled_flag=True,
        add_to_menu=True,
        add_to_toolbar=True,
        status_tip=None,
        whats_this=None,
        parent=None):
        """Add a toolbar icon to the toolbar.

        :param icon_path: Path to the icon for this action. Can be a resource
            path (e.g. ':/plugins/foo/bar.png') or a normal file system path.
        :type icon_path: str

        :param text: Text that should be shown in menu items for this action.
        :type text: str

        :param callback: Function to be called when the action is triggered.
        :type callback: function

        :param enabled_flag: A flag indicating if the action should be enabled
            by default. Defaults to True.
        :type enabled_flag: bool

        :param add_to_menu: Flag indicating whether the action should also
            be added to the menu. Defaults to True.
        :type add_to_menu: bool

        :param add_to_toolbar: Flag indicating whether the action should also
            be added to the toolbar. Defaults to True.
        :type add_to_toolbar: bool

        :param status_tip: Optional text to show in a popup when mouse pointer
            hovers over the action.
        :type status_tip: str

        :param parent: Parent widget for the new action. Defaults None.
        :type parent: QWidget

        :param whats_this: Optional text to show in the status bar when the
            mouse pointer hovers over the action.

        :returns: The action that was created. Note that the action is also
            added to self.actions list.
        :rtype: QAction
        """

        icon = QIcon(icon_path)
        action = QAction(icon, text, parent)
        action.triggered.connect(callback)
        action.setEnabled(enabled_flag)

        if status_tip is not None:
            action.setStatusTip(status_tip)

        if whats_this is not None:
            action.setWhatsThis(whats_this)

        if add_to_toolbar:
            # Adds plugin icon to Plugins toolbar
            self.iface.addToolBarIcon(action)

        if add_to_menu:
            self.iface.addPluginToMenu(
                self.menu,
                action)

        self.actions.append(action)

        return action

    def initGui(self):
        
        #icon_path = ':/plugins/import_CSV/icon.png'
        self.add_action(
            os.path.join(os.path.dirname(__file__), 'icon.png'),
            text=self.tr(u'Import CSV'),
            callback=self.run,
            parent=self.iface.mainWindow())

        # will be set False in run()
        self.first_start = True


    def unload(self):
        """Removes the plugin menu item and icon from QGIS GUI."""
        for action in self.actions:
            self.iface.removePluginMenu(
                self.tr(u'&Import CSV'),
                action)
            self.iface.removeToolBarIcon(action)


    def run(self):
        """Run method that performs all the real work"""

        # Create the dialog with elements (after translation) and keep reference
        # Only create GUI ONCE in callback, so that it will only load when the plugin is started
        if self.first_start == True:
            self.first_start = False
            self.dlg = ImportCSVDialog()
            self.dlg2 = HelpImportDialog()
            self.dlg3 = HelpPolygonDialog()
            self.dlg4 = HelpSaveDialog()
            
            self.dlg.button_Folder.clicked.connect(self.OpenBrowse) #フォルダ選択ボタン
            self.dlg.button_Folder_save.clicked.connect(self.OpenBrowse_save) #保存用フォルダ選択ボタン
            self.dlg.button_CRS.clicked.connect(self.CRSClicked) #CRS選択ボタン
            self.dlg.button_Import.clicked.connect(self.importClicked) #インポートボタン
            self.dlg.button_Singlepolygon.clicked.connect(self.SinglePolygonClicked) #レイヤを分けてポリゴン作成ボタン
            self.dlg.button_Multipolygon.clicked.connect(self.MultiPolygonClicked) #マルチポリゴン作成ボタン            
            self.dlg.button_Shapefile.clicked.connect(self.ShapeClicked) #レイヤをシェープファイルとして保存ボタン
            self.dlg.button_Help_import.clicked.connect(self.Help_importClicked) #インポートのヘルプボタン
            self.dlg.button_Help_polygon.clicked.connect(self.Help_polygonClicked) #ポリゴン作成のヘルプボタン
            self.dlg.button_Help_save.clicked.connect(self.Help_saveClicked) #シェープファイル保存のヘルプボタン

            self.dlg.comboBox_sinpolyselect.activated.connect(self.SinpolyCombobox) #シングルポリゴンのレイヤ作成選択コンボボックス
            self.dlg.comboBox_multipolyselect.activated.connect(self.MultipolyCombobox) #マルチポリゴンのレイヤ作成選択コンボボックス

            #起動時は無効にしておく
            self.dlg.label_4.setEnabled(False)
            self.dlg.lineEdit_Layername_sinpoly.setEnabled(False)
            self.dlg.label_5.setEnabled(False)
            self.dlg.lineEdit_Layername_multipoly.setEnabled(False)

            

       
        # show the dialog
        self.dlg.show()
        
        # Run the dialog event loop
        result = self.dlg.exec_()
        # See if OK was pressed
        if result:
            # Do something useful here - delete the line containing pass and
            # substitute with your code.
            pass

        

##ここから追加 

    #フォルダ選択ダイアログを開くボタンの処理
    def OpenBrowse(self):         
        dir_path = QFileDialog.getExistingDirectory(None,None,'D:/')
        self.dlg.lineEdit_Folder.setText(str(dir_path))
        folder_text = self.dlg.lineEdit_Folder.text() #フォルダ選択ダイアログで選択したパスを取得
        dir_list = glob.glob(folder_text + "/*.csv") #ディレクトリ内のファイル一覧を取得
        
        ## TableWidgetの設定
        self.dlg.tableWidget.setRowCount(len(dir_list)) # 行数の設定
        r = 0
        for fname in dir_list: # 要素の追加
            filename = os.path.split(fname)[1] #ファイル名を取得
            self.dlg.tableWidget.setItem(r, 0, QgsTableWidgetItem(filename)) #ファイル名カラムにセット
            with open(fname, "rb") as f: #文字コードの取得
                binary = f.read()
                ret_dict = chardet.detect(binary) # 文字コードを判定
                self.dlg.tableWidget.setItem(r, 1, QgsTableWidgetItem(str(ret_dict['encoding']))) #文字コードカラムにセット                
            r += 1
       

    # CRS選択ダイアログを開くボタンの処理    
    def CRSClicked(self):
        projSelector = QgsProjectionSelectionDialog() #CRS選択ダイアログを設定       
        projSelector.exec_() #ダイアログを開く
        self.dlg.lineEdit_CRS.setText(projSelector.crs().authid())
       

    #ファイル選択ダイアログで指定したファイルをインポートするボタンの処理
    def importClicked(self):      
        folder_text = self.dlg.lineEdit_Folder.text() #フォルダ選択ダイアログで選択したパスを取得        
        dir_list = glob.glob(folder_text + "/*.csv") #ディレクトリ内のファイル一覧を取得
        progress = self.dlg.progressBar_Import
        progress.setRange(0, len(dir_list)) #プログレスバーの最小、最大値を設定        
        if self.dlg.comboBox_csvselect.currentIndex() == 0: #コンボボックスが「緯度経度からポイントデータとしてレイヤ作成」になっていた場合            
            p = 0
            for fname, p in zip(dir_list, range(len(dir_list))): #ディレクトリ内のCSVファイルをQGISにインポート
                fname_uri = urllib.parse.quote(fname) #uri文字にエンコード
                crs_text = self.dlg.lineEdit_CRS.text() #CRS選択ダイアログで選択したCRSを取得

                with open(fname, "rb") as f: #文字コードの取得
                    binary = f.read()
                    ret_dict = chardet.detect(binary) # 文字コードを判定
                if ret_dict['encoding'] == "SHIFT_JIS":
                    uri ="file:///" + fname_uri + "?encoding=Shift_JIS&delimiter={}&xField={}&yField={}&crs={}".format (",", urllib.parse.quote("経度"), urllib.parse.quote("緯度"), crs_text)
                elif ret_dict['encoding'] == "utf-8":
                    uri ="file:///" + fname_uri + "?encoding=UTF-8&delimiter={}&xField={}&yField={}&crs={}".format (",", urllib.parse.quote("経度"), urllib.parse.quote("緯度"), crs_text)
                fname = urllib.parse.unquote(fname_uri) #uri文字をデコードして日本語に戻す
                fname = os.path.split(fname)[1] #ファイル名のみ取得
                name = fname.replace('.csv', '') #レイヤ名の設定　ファイル名から拡張子を削除           
                lyr = QgsVectorLayer(uri, name, 'delimitedtext') #ベクターレイヤの作成
                QgsProject.instance().addMapLayer(lyr) #地図に追加
                progress.setValue(p + 1) #プログレスバーのステップを進行

            progress.reset() #プログレスバーの進捗率をリセット

        elif self.dlg.comboBox_csvselect.currentIndex() == 1: #コンボボックスが「属性テーブルのみのレイヤ作成」になっていた場合
            p = 0
            for fname, p in zip(dir_list, range(len(dir_list))): #ディレクトリ内のCSVファイルをQGISにインポート
                fname_uri = urllib.parse.quote(fname) #uri文字にエンコード

                with open(fname, "rb") as f: #文字コードの取得
                    binary = f.read()
                    ret_dict = chardet.detect(binary) # 文字コードを判定
                if ret_dict['encoding'] == "SHIFT_JIS":
                    uri ="file:///" + fname_uri + "?encoding=Shift_JIS&delimiter={}".format (",")
                elif ret_dict['encoding'] == "utf-8":
                    uri ="file:///" + fname_uri + "?encoding=UTF-8&delimiter={}".format (",")
                fname = urllib.parse.unquote(fname_uri) #uri文字をデコードして日本語に戻す
                fname = os.path.split(fname)[1] #ファイル名のみ取得
                name = fname.replace('.csv', '') #レイヤ名の設定　ファイル名から拡張子を削除           
                lyr = QgsVectorLayer(uri, name + "_属性", 'delimitedtext') #ベクターレイヤの作成
                QgsProject.instance().addMapLayer(lyr) #地図に追加

                progress.setValue(p + 1) #プログレスバーのステップを進行                    
            progress.reset() #プログレスバーの進捗率をリセット

                    
    #ポリゴンを作成するボタンの処理
    def SinglePolygonClicked(self):
        crs_text = self.dlg.lineEdit_CRS.text() #CRS選択ダイアログで選択したCRSを取得
        layers = self.iface.mapCanvas().layers() # 追加されているレイヤのリストを取得
        layer_list = [layer for layer in layers if layer.geometryType() == 0] #ジオメトリタイプが「ポイント」のレイヤリストを作成
        progress = self.dlg.progressBar_Polygon
        progress.setRange(0, len(layer_list)) #プログレスバーの最小、最大値を設定
        if self.dlg.comboBox_sinpolyselect.currentIndex() == 0: #コンボボックスが「レイヤを分ける」になっていた場合            
            p = 0
            #for layer in layers:            
            for layer, p in zip(layer_list, range(len(layer_list))): #プログレスバー用の変数をfor文に追加
                polygonLayer = QgsVectorLayer('Polygon?crs={}'.format(crs_text), layer.name() + "_poly", 'memory') #スクラッチ（一時）レイヤを作成
                poly = QgsFeature(polygonLayer.fields()) #スクラッチレイヤの地物を取得？                
                points = [] #空のリストを作成
                features = layer.getFeatures() #地物を取得
                for feat in features: #属性から緯度経度を取得
                    fieldname = layer.fields().names() #フィールド名を取得
                    x = fieldname.index("経度") #経度のフィールドが何番目にあるのかを取得
                    y = fieldname.index("緯度") #緯度のフィールドが何番目にあるのかを取得
                    attrs = feat.attributes()
                    points.append([attrs[x],attrs[y]])#ポイント座標をリストに追加
                    dst = [] #NULLを削除したリストを入れるための、空のリスト作成
                    for block in points:#リストからNULLを削除
                        new_block = [x for x in block if x != NULL]
                        dst.append(new_block)                
                    list2 = [e for e in dst if e] #空になったリストを削除
                    points = list2 #緯度経度フィールドの空のデータを削除したリストをpointsに入れる

                poly.setGeometry(QgsGeometry.fromPolygonXY([[QgsPointXY(x[0], x[1]) for x in points]])) #ポイント座標からポリゴンを作成
                polygonLayer.dataProvider().addFeatures([poly]) #スクラッチレイヤにポリゴンの追加

                polygonLayer.startEditing() #編集を有効にする
                polygonLayer.dataProvider().addAttributes( [ #スクラッチレイヤにフィールドの追加
                    QgsField('ID',  QVariant.Int),
                    QgsField('ファイル名', QVariant.String),
                    ] )
                polygonLayer.updateFields() #フィールド追加の更新
                features = polygonLayer.getFeatures() #地物を取得                
                for feature in features:
                    polygonLayer.changeAttributeValue(feature.id(), 0, feature.id()) #レコード、フィールド、変更内容
                polygonLayer.changeAttributeValue(feature.id(), 1, layer.name()) #レコード、フィールド、変更内容
                polygonLayer.commitChanges()
                
                QgsProject.instance().addMapLayer(polygonLayer) #地図に追加
                progress.setValue(p + 1) #プログレスバーのステップを進行
                                    
            progress.reset() #プログレスバーの進捗率をリセット

        elif self.dlg.comboBox_sinpolyselect.currentIndex() == 1: #コンボボックスが「一つのレイヤにまとめる」になっていた場合
            layername_text = self.dlg.lineEdit_Layername_sinpoly.text() #レイヤ名に入力した文字を取得
            polygonLayer = QgsVectorLayer('Polygon?crs={}'.format(crs_text), layername_text + "_poly", 'memory') #スクラッチ（一時）レイヤを作成
            p = 0
            for layer, p in zip(layer_list, range(len(layer_list))): #プログレスバー用の変数をfor文に追加                
                poly = QgsFeature(polygonLayer.fields()) #スクラッチレイヤの地物を取得？
                points = [] #空のリストを作成
                features = layer.getFeatures() #地物を取得
                for feat in features: #属性から緯度経度を取得
                    fieldname = layer.fields().names() #フィールド名を取得
                    x = fieldname.index("経度") #経度のフィールドが何番目にあるのかを取得
                    y = fieldname.index("緯度") #緯度のフィールドが何番目にあるのかを取得
                    attrs = feat.attributes()
                    points.append([attrs[x],attrs[y]])#ポイント座標をリストに追加                    
                    dst = [] #NULLを削除したリストを入れるための、空のリスト作成
                    for block in points:#リストからNULLを削除
                        new_block = [x for x in block if x != NULL]
                        dst.append(new_block)                
                    list2 = [e for e in dst if e] #空になったリストを削除
                    points = list2 #緯度経度フィールドの空のデータを削除したリストをpointsに入れる
                poly.setGeometry(QgsGeometry.fromPolygonXY([[QgsPointXY(x[0], x[1]) for x in points]])) #ポイント座標からポリゴンを作成
                polygonLayer.dataProvider().addFeatures([poly]) #スクラッチレイヤにポリゴンの追加

                polygonLayer.startEditing() #編集を有効にする
                polygonLayer.dataProvider().addAttributes( [ #スクラッチレイヤにフィールドの追加
                    QgsField('ID',  QVariant.Int),
                    QgsField('ファイル名', QVariant.String),
                    ] )
                polygonLayer.updateFields() #フィールド追加の更新
                features = polygonLayer.getFeatures() #地物を取得
                for feature in features:
                    polygonLayer.changeAttributeValue(feature.id(), 0, feature.id()) #レコード、フィールド、変更内容
                polygonLayer.changeAttributeValue(feature.id(), 1, layer.name()) #レコード、フィールド、変更内容
                polygonLayer.commitChanges()

                progress.setValue(p + 1) #プログレスバーのステップを進行
                    
            QgsProject.instance().addMapLayer(polygonLayer) #地図に追加
            progress.reset() #プログレスバーの進捗率をリセット
    
    
    #マルチポリゴンを作成するボタンの処理
    def MultiPolygonClicked(self):
        crs_text = self.dlg.lineEdit_CRS.text() #CRS選択ダイアログで選択したCRSを取得
        layers = self.iface.mapCanvas().layers() # 追加されているレイヤのリストを取得
        layer_list = [layer for layer in layers if layer.geometryType() == 0] #ジオメトリタイプが「ポイント」のレイヤリストを作成
        progress = self.dlg.progressBar_Polygon
        progress.setRange(0, len(layer_list)) #プログレスバーの最小、最大値を設定
        if self.dlg.comboBox_multipolyselect.currentIndex() == 0: #コンボボックスが「レイヤを分ける」になっていた場合
            p = 0
            for layer, p in zip(layer_list, range(len(layer_list))): #プログレスバー用の変数をfor文に追加
                polygonLayer = QgsVectorLayer('Polygon?crs={}'.format(crs_text), layer.name() + "_multipoly", 'memory') #スクラッチ（一時）レイヤを作成
                poly = QgsFeature(polygonLayer.fields()) #スクラッチレイヤの地物を取得？                    
                polygonlist = []
                fieldname = layer.fields().names() #フィールド名を取得

                idolist = []
                kensaku = '緯度' #検索する単語
                for l in fieldname: #"緯度"を含むフィールド名であればリストに追加する
                    if kensaku in l:
                        idolist.append(l)
                i = 1
                while i < len(idolist): #面積ブロックの数だけ処理を繰り返す
                    points = [] #空のリストを作成
                    points2 = []
                    features = layer.getFeatures() #地物を取得
                    for feat in features: #属性から緯度経度を取得
                        fieldname = layer.fields().names() #フィールド名を取得                        
                        x = fieldname.index("経度{}".format(i)) #経度のフィールドが何番目にあるのかを取得
                        y = fieldname.index("緯度{}".format(i)) #緯度のフィールドが何番目にあるのかを取得
                        attrs = feat.attributes()
                        points.append([attrs[x],attrs[y]])#ポイント座標をリストに追加

                        dst = [] #NULLを削除したリストを入れるための、空のリスト作成
                        for block in points:#リストからNULLを削除
                            new_block = [x for x in block if x != NULL]
                            dst.append(new_block)              

                        list2 = [e for e in dst if e] #空になったリストを削除
                        points = list2 #緯度経度フィールドの空のデータを削除したリストをpointsに入れる
                    
                    polygonlist.append(points)
                    i = i + 1
                
                points = QgsGeometry.fromMultiPolygonXY(
                    [
                        [[QgsPointXY(x[0], x[1]) for x in polygon ] for polygon in  polygonlist]
                    ]
                )
                poly.setGeometry(points) #ポイント座標からポリゴンを作成
                polygonLayer.dataProvider().addFeatures([poly]) #スクラッチレイヤにポリゴンの追加

                polygonLayer.startEditing() #編集を有効にする
                polygonLayer.dataProvider().addAttributes( [ #スクラッチレイヤにフィールドの追加
                    QgsField('ID',  QVariant.Int),
                    QgsField('ファイル名', QVariant.String),
                    ] )
                polygonLayer.updateFields() #フィールド追加の更新
                features = polygonLayer.getFeatures() #地物を取得
                for feature in features:
                    polygonLayer.changeAttributeValue(feature.id(), 0, feature.id()) #レコード、フィールド、変更内容
                polygonLayer.changeAttributeValue(feature.id(), 1, layer.name()) #レコード、フィールド、変更内容
                polygonLayer.commitChanges()

                QgsProject.instance().addMapLayer(polygonLayer) #地図に追加
                progress.setValue(p + 1) #プログレスバーのステップを進行

            progress.reset() #プログレスバーの進捗率をリセット

        elif self.dlg.comboBox_multipolyselect.currentIndex() == 1: #コンボボックスが「一つのレイヤにまとめる」になっていた場合
            layername_text = self.dlg.lineEdit_Layername_multipoly.text() #レイヤ名に入力した文字を取得
            polygonLayer = QgsVectorLayer('Polygon?crs={}'.format(crs_text), layername_text + "_multipoly", 'memory') #スクラッチ（一時）レイヤを作成
            p = 0
            for layer, p in zip(layer_list, range(len(layer_list))): #プログレスバー用の変数をfor文に追加                
                poly = QgsFeature(polygonLayer.fields()) #スクラッチレイヤの地物を取得？
                polygonlist = []
                fieldname = layer.fields().names() #フィールド名を取得
                idolist = []
                kensaku = '緯度' #検索する単語
                for l in fieldname: #"緯度"を含むフィールド名であればリストに追加する
                    if kensaku in l:
                        idolist.append(l)
                i = 1
                while i < len(idolist): #面積ブロックの数だけ処理を繰り返す
                    points = [] #空のリストを作成
                    points2 = []
                    features = layer.getFeatures() #地物を取得
                    for feat in features: #属性から緯度経度を取得
                        fieldname = layer.fields().names() #フィールド名を取得                        
                        x = fieldname.index("経度{}".format(i)) #経度のフィールドが何番目にあるのかを取得
                        y = fieldname.index("緯度{}".format(i)) #緯度のフィールドが何番目にあるのかを取得
                        attrs = feat.attributes()
                        points.append([attrs[x],attrs[y]])#ポイント座標をリストに追加

                        dst = [] #NULLを削除したリストを入れるための、空のリスト作成
                        for block in points:#リストからNULLを削除
                            new_block = [x for x in block if x != NULL]
                            dst.append(new_block)              

                        list2 = [e for e in dst if e] #空になったリストを削除
                        points = list2 #緯度経度フィールドの空のデータを削除したリストをpointsに入れる

                    polygonlist.append(points)
                    i = i + 1
                
                points = QgsGeometry.fromMultiPolygonXY(
                    [
                        [[QgsPointXY(x[0], x[1]) for x in polygon ] for polygon in  polygonlist]
                    ]
                )
                poly.setGeometry(points) #ポイント座標からポリゴンを作成
                polygonLayer.dataProvider().addFeatures([poly]) #スクラッチレイヤにポリゴンの追加

                polygonLayer.startEditing() #編集を有効にする
                polygonLayer.dataProvider().addAttributes( [ #スクラッチレイヤにフィールドの追加
                    QgsField('ID',  QVariant.Int),
                    QgsField('ファイル名', QVariant.String),
                    ] )
                polygonLayer.updateFields() #フィールド追加の更新
                features = polygonLayer.getFeatures() #地物を取得
                for feature in features:
                    polygonLayer.changeAttributeValue(feature.id(), 0, feature.id()) #レコード、フィールド、変更内容
                polygonLayer.changeAttributeValue(feature.id(), 1, layer.name()) #レコード、フィールド、変更内容
                polygonLayer.commitChanges()

                progress.setValue(p + 1) #プログレスバーのステップを進行

            QgsProject.instance().addMapLayer(polygonLayer) #地図に追加
            progress.reset() #プログレスバーの進捗率をリセット
    

    #シェープファイルを保存するフォルダ指定の処理
    def OpenBrowse_save(self):
        dir_path = QFileDialog.getExistingDirectory(None,None,'D:/')
        self.dlg.lineEdit_Folder_save.setText(str(dir_path))
        

    #シェープファイルを作成するボタンの処理
    def ShapeClicked(self):
        folder_text = self.dlg.lineEdit_Folder_save.text() #フォルダ選択ダイアログで選択したパスを取得
        progress = self.dlg.progressBar_Save        
        if folder_text == '':
            QMessageBox.information(None, "確認", "保存先のフォルダを選択してください。", QMessageBox.Ok)
        else:
            layers = self.iface.mapCanvas().layers() # 追加されているレイヤのリストを取得            
            if self.dlg.comboBox_geomtype.currentIndex() == 0: #コンボボックスが「ポイントレイヤのみ」になっていた場合
                layer_list = [layer for layer in layers if layer.geometryType() == 0] #ジオメトリタイプが「ポイント」のレイヤリストを作成
                progress.setRange(0, len(layer_list)) #プログレスバーの最小、最大値を設定
                p = 0
                for layer, p in zip(layer_list, range(len(layer_list))): #プログレスバー用の変数をfor文に追加
                    lname = layer.name() #レイヤ名
                    QgsVectorFileWriter.writeAsVectorFormat(layer,folder_text + "/" + lname,"Shift-JIS",driverName="ESRI Shapefile") #シェープファイル保存
                    progress.setValue(p + 1) #プログレスバーのステップを進行
                QMessageBox.information(None, "情報", "保存しました。", QMessageBox.Ok)
                progress.reset() #プログレスバーの進捗率をリセット
            elif self.dlg.comboBox_geomtype.currentIndex() == 1: #コンボボックスが「ポリゴンレイヤのみ」になっていた場合
                layer_list = [layer for layer in layers if layer.geometryType() == 2] #ジオメトリタイプが「ポリゴン」のレイヤリストを作成
                progress.setRange(0, len(layer_list)) #プログレスバーの最小、最大値を設定
                p = 0
                for layer, p in zip(layer_list, range(len(layer_list))): #プログレスバー用の変数をfor文に追加
                    lname = layer.name() #レイヤ名
                    QgsVectorFileWriter.writeAsVectorFormat(layer,folder_text + "/" + lname,"Shift-JIS",driverName="ESRI Shapefile") #シェープファイル保存
                    progress.setValue(p + 1) #プログレスバーのステップを進行
                QMessageBox.information(None, "情報", "保存しました。", QMessageBox.Ok)
                progress.reset() #プログレスバーの進捗率をリセット
            elif self.dlg.comboBox_geomtype.currentIndex() == 2: #コンボボックスが「ポリゴンレイヤとポリゴンレイヤ」になっていた場合
                layer_list = [layer for layer in layers if layer.geometryType() == 0 or layer.geometryType() == 2] #ジオメトリタイプが「ポイント」か、「ポリゴン」のレイヤリストを作成
                progress.setRange(0, len(layer_list)) #プログレスバーの最小、最大値を設定
                p = 0
                for layer, p in zip(layer_list, range(len(layer_list))): #プログレスバー用の変数をfor文に追加
                    lname = layer.name() #レイヤ名
                    QgsVectorFileWriter.writeAsVectorFormat(layer,folder_text + "/" + lname,"Shift-JIS",driverName="ESRI Shapefile") #シェープファイル保存
                    progress.setValue(p + 1) #プログレスバーのステップを進行                    
                QMessageBox.information(None, "情報", "保存しました。", QMessageBox.Ok)
                progress.reset() #プログレスバーの進捗率をリセット


    #シングルポリゴンのレイヤ作成選択コンボボックスの処理
    def SinpolyCombobox(self):
        if self.dlg.comboBox_sinpolyselect.currentIndex() == 0: #コンボボックスが「レイヤを分ける」になっていた場合
            self.dlg.label_4.setEnabled(False)
            self.dlg.lineEdit_Layername_sinpoly.setEnabled(False)
        elif self.dlg.comboBox_sinpolyselect.currentIndex() == 1: #コンボボックスが「一つのレイヤにまとめる」になっていた場合
            self.dlg.label_4.setEnabled(True)
            self.dlg.lineEdit_Layername_sinpoly.setEnabled(True)


    #マルチポリゴンのレイヤ作成選択コンボボックスの処理
    def MultipolyCombobox(self):
        if self.dlg.comboBox_multipolyselect.currentIndex() == 0: #コンボボックスが「レイヤを分ける」になっていた場合
            self.dlg.label_5.setEnabled(False)
            self.dlg.lineEdit_Layername_multipoly.setEnabled(False)
        elif self.dlg.comboBox_multipolyselect.currentIndex() == 1: #コンボボックスが「一つのレイヤにまとめる」になっていた場合
            self.dlg.label_5.setEnabled(True)
            self.dlg.lineEdit_Layername_multipoly.setEnabled(True)


    #ヘルプウィンドウを開く処理    
    def Help_importClicked(self):
        self.dlg2.show()        

    def Help_polygonClicked(self):
        self.dlg3.show()

    def Help_saveClicked(self):
        self.dlg4.show()

    