diff --git a/.gitignore b/.gitignore index 21f701be..06ed37a0 100644 --- a/.gitignore +++ b/.gitignore @@ -5,11 +5,14 @@ /* !plugins.xml +#Skip Ignores !CenRa_AUTOMAP/ -!CenRa_COPIE -!CenRa_FLUX -!CenRa_METABASE -!CenRa_POSTGIS -!CenRa_SICEN +!CenRa_COPIE/ +!CenRa_FLUX/ +!CenRa_METABASE/ +!CenRa_POSTGIS/ +!CenRa_SICEN/ -**/__pycache__ \ No newline at end of file +#ReIgnore +**/__pycache__ +**/test/ \ No newline at end of file diff --git a/CenRa_AUTOMAP/tools/logo_library/CBNA.png b/CenRa_AUTOMAP/tools/logo_library/CBNA.png new file mode 100644 index 00000000..a34e4e11 Binary files /dev/null and b/CenRa_AUTOMAP/tools/logo_library/CBNA.png differ diff --git a/CenRa_AUTOMAP/tools/logo_library/CBNMC.png b/CenRa_AUTOMAP/tools/logo_library/CBNMC.png new file mode 100644 index 00000000..7d74fa98 Binary files /dev/null and b/CenRa_AUTOMAP/tools/logo_library/CBNMC.png differ diff --git a/CenRa_AUTOMAP/tools/logo_library/DREAL_pref_region_AuRA_web.png b/CenRa_AUTOMAP/tools/logo_library/DREAL_pref_region_AuRA_web.png new file mode 100644 index 00000000..7a355258 Binary files /dev/null and b/CenRa_AUTOMAP/tools/logo_library/DREAL_pref_region_AuRA_web.png differ diff --git a/CenRa_AUTOMAP/tools/logo_library/FEADER.png b/CenRa_AUTOMAP/tools/logo_library/FEADER.png new file mode 100644 index 00000000..35ed3c78 Binary files /dev/null and b/CenRa_AUTOMAP/tools/logo_library/FEADER.png differ diff --git a/CenRa_AUTOMAP/tools/logo_library/LES_AGENCES_DELEAU.png b/CenRa_AUTOMAP/tools/logo_library/LES_AGENCES_DELEAU.png new file mode 100644 index 00000000..5c6b8e88 Binary files /dev/null and b/CenRa_AUTOMAP/tools/logo_library/LES_AGENCES_DELEAU.png differ diff --git a/CenRa_AUTOMAP/tools/logo_library/LPO_AuRA.png b/CenRa_AUTOMAP/tools/logo_library/LPO_AuRA.png new file mode 100644 index 00000000..ad175f90 Binary files /dev/null and b/CenRa_AUTOMAP/tools/logo_library/LPO_AuRA.png differ diff --git a/CenRa_AUTOMAP/tools/logo_library/Ministere agriculture et alimentation.png b/CenRa_AUTOMAP/tools/logo_library/Ministere agriculture et alimentation.png new file mode 100644 index 00000000..584cfb7e Binary files /dev/null and b/CenRa_AUTOMAP/tools/logo_library/Ministere agriculture et alimentation.png differ diff --git a/CenRa_AUTOMAP/tools/logo_library/OFB.png b/CenRa_AUTOMAP/tools/logo_library/OFB.png new file mode 100644 index 00000000..6b1e4edc Binary files /dev/null and b/CenRa_AUTOMAP/tools/logo_library/OFB.png differ diff --git a/CenRa_AUTOMAP/tools/logo_library/REGION_AuRA.png b/CenRa_AUTOMAP/tools/logo_library/REGION_AuRA.png new file mode 100644 index 00000000..6ceef305 Binary files /dev/null and b/CenRa_AUTOMAP/tools/logo_library/REGION_AuRA.png differ diff --git a/CenRa_AUTOMAP/tools/mises_en_pages/1. Modèle carto standard.qpt b/CenRa_AUTOMAP/tools/mises_en_pages/1. Modèle carto standard.qpt new file mode 100644 index 00000000..06609745 --- /dev/null +++ b/CenRa_AUTOMAP/tools/mises_en_pages/1. Modèle carto standard.qpt @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CenRa_AUTOMAP/tools/mises_en_pages/2. Modèle carto plein page.qpt b/CenRa_AUTOMAP/tools/mises_en_pages/2. Modèle carto plein page.qpt new file mode 100644 index 00000000..06609745 --- /dev/null +++ b/CenRa_AUTOMAP/tools/mises_en_pages/2. Modèle carto plein page.qpt @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CenRa_AUTOMAP/tools/mises_en_pages/NorthArrow_02.svg b/CenRa_AUTOMAP/tools/mises_en_pages/NorthArrow_02.svg new file mode 100644 index 00000000..86fa08b1 --- /dev/null +++ b/CenRa_AUTOMAP/tools/mises_en_pages/NorthArrow_02.svg @@ -0,0 +1,82 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/CenRa_AUTOMAP/tools/mises_en_pages/NorthArrow_03.svg b/CenRa_AUTOMAP/tools/mises_en_pages/NorthArrow_03.svg new file mode 100644 index 00000000..5e2ac9a3 --- /dev/null +++ b/CenRa_AUTOMAP/tools/mises_en_pages/NorthArrow_03.svg @@ -0,0 +1,47 @@ + + + + + + + + + + +N + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CenRa_AUTOMAP/tools/mises_en_pages/canvas.py b/CenRa_AUTOMAP/tools/mises_en_pages/canvas.py new file mode 100644 index 00000000..1180ec4e --- /dev/null +++ b/CenRa_AUTOMAP/tools/mises_en_pages/canvas.py @@ -0,0 +1,317 @@ +from qgis.core import ( + QgsLayoutSize, + QgsUnitTypes, + QgsLayoutPoint, +) + +def fletch_canvas(self,values_page): + ### Modèle carto standard ### + if values_page == '1. Modèle carto standard.qpt': + if self.radioButton_6.isChecked() and self.radioButton_7.isChecked(): + + self.template_parameters['position_map_size'] = QgsLayoutSize(50, 50, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['position_map_position'] = QgsLayoutPoint(2.5, 20, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['map_size'] = QgsLayoutSize(199, 175, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['map_position'] = QgsLayoutPoint(5, 25, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['title_size'] = QgsLayoutSize(200, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['title_position'] = QgsLayoutPoint(5, 2, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['subtitle_size'] = QgsLayoutSize(200, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['subtitle_position'] = QgsLayoutPoint(5, 12, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['logo_size'] = QgsLayoutSize(46, 16, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['logo_position'] = QgsLayoutPoint(5, 4, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['logo_credit_size'] = QgsLayoutSize(50, 20, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['logo_credit_position'] = QgsLayoutPoint(5, 275, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['legend_size'] = QgsLayoutSize(405, 203, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['legend_position'] = QgsLayoutPoint(5, 205, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['scalebarnumeric_size'] = QgsLayoutSize(55, 5, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['scalebarnumeric_position'] = QgsLayoutPoint(145, 228, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['scalebar_size'] = QgsLayoutSize(55, 15, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['scalebar_position'] = QgsLayoutPoint(145, 215, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['north_size'] = QgsLayoutSize(12, 12, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['north_position'] = QgsLayoutPoint(193, 214, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['credit_text_size'] = QgsLayoutSize(100, 3.9, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['credit_text_position'] = QgsLayoutPoint(205, 125, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['credit_text2_size'] = QgsLayoutSize(100, 3.9, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['credit_text2_position'] = QgsLayoutPoint(104, 201, QgsUnitTypes.LayoutMillimeters) + + + + if self.radioButton_6.isChecked() and self.radioButton_8.isChecked(): + + self.template_parameters['position_map_size'] = QgsLayoutSize(100, 100, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['position_map_position'] = QgsLayoutPoint(6, 23, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['map_size'] = QgsLayoutSize(285, 145, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['map_position'] = QgsLayoutPoint(6, 23, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['title_size'] = QgsLayoutSize(286, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['title_position'] = QgsLayoutPoint(5, 2, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['subtitle_size'] = QgsLayoutSize(286, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['subtitle_position'] = QgsLayoutPoint(5, 10, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['logo_size'] = QgsLayoutSize(46, 16, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['logo_position'] = QgsLayoutPoint(5, 4, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['logo_credit_size'] = QgsLayoutSize(50, 20, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['logo_credit_position'] = QgsLayoutPoint(5, 185, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['legend_size'] = QgsLayoutSize(405, 203, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['legend_position'] = QgsLayoutPoint(5, 168, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['scalebarnumeric_size'] = QgsLayoutSize(55, 15, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['scalebarnumeric_position'] = QgsLayoutPoint(207, 193, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['scalebar_size'] = QgsLayoutSize(55, 15, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['scalebar_position'] = QgsLayoutPoint(207, 180, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['north_size'] = QgsLayoutSize(8.4, 12.5, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['north_position'] = QgsLayoutPoint(273, 182, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['credit_text_size'] = QgsLayoutSize(100, 3.9, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['credit_text_position'] = QgsLayoutPoint(291.5, 123, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['credit_text2_size'] = QgsLayoutSize(100, 3.9, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['credit_text2_position'] = QgsLayoutPoint(189, 168.5, QgsUnitTypes.LayoutMillimeters) + + + + if self.radioButton_5.isChecked() and self.radioButton_7.isChecked(): + + self.template_parameters['map_size'] = QgsLayoutSize(285, 260, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['map_position'] = QgsLayoutPoint(6, 23, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['title_size'] = QgsLayoutSize(286, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['title_position'] = QgsLayoutPoint(5, 2, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['subtitle_size'] = QgsLayoutSize(286, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['subtitle_position'] = QgsLayoutPoint(5, 10, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['logo_size'] = QgsLayoutSize(46, 16, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['logo_position'] = QgsLayoutPoint(5, 4, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['logo_credit_size'] = QgsLayoutSize(50, 20, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['logo_credit_position'] = QgsLayoutPoint(5, 395, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['legend_size'] = QgsLayoutSize(405, 203, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['legend_position'] = QgsLayoutPoint(5, 284, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['scalebarnumeric_size'] = QgsLayoutSize(50, 15, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['scalebarnumeric_position'] = QgsLayoutPoint(207, 310, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['scalebar_size'] = QgsLayoutSize(50, 15, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['scalebar_position'] = QgsLayoutPoint(207, 298, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['north_size'] = QgsLayoutSize(8.4, 12.5, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['north_position'] = QgsLayoutPoint(273, 297, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['credit_text_size'] = QgsLayoutSize(100, 3.9, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['credit_text_position'] = QgsLayoutPoint(291.5, 123, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['credit_text2_size'] = QgsLayoutSize(100, 3.9, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['credit_text2_position'] = QgsLayoutPoint(189, 284, QgsUnitTypes.LayoutMillimeters) + + + + if self.radioButton_5.isChecked() and self.radioButton_8.isChecked(): + + self.template_parameters['map_size'] = QgsLayoutSize(408.5, 222, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['map_position'] = QgsLayoutPoint(5, 23.5, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['title_size'] = QgsLayoutSize(409, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['title_position'] = QgsLayoutPoint(5, 2, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['subtitle_size'] = QgsLayoutSize(409, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['subtitle_position'] = QgsLayoutPoint(5, 10, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['logo_size'] = QgsLayoutSize(46, 16, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['logo_position'] = QgsLayoutPoint(5, 4, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['logo_credit_size'] = QgsLayoutSize(50, 20, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['logo_credit_position'] = QgsLayoutPoint(5, 275, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['legend_size'] = QgsLayoutSize(405, 203, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['legend_position'] = QgsLayoutPoint(5, 249, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['scalebarnumeric_size'] = QgsLayoutSize(55, 15, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['scalebarnumeric_position'] = QgsLayoutPoint(323, 282, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['scalebar_size'] = QgsLayoutSize(55, 15, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['scalebar_position'] = QgsLayoutPoint(323, 270, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['north_size'] = QgsLayoutSize(8.4, 12.5, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['north_position'] = QgsLayoutPoint(402, 270, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['credit_text_size'] = QgsLayoutSize(100, 3.9, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['credit_text_position'] = QgsLayoutPoint(415, 123, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['credit_text2_size'] = QgsLayoutSize(100, 3.9, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['credit_text2_position'] = QgsLayoutPoint(313, 247, QgsUnitTypes.LayoutMillimeters) + + ### Modèle carto plein page ### + if values_page == '2. Modèle carto plein page.qpt': + if self.radioButton_6.isChecked() and self.radioButton_7.isChecked(): + + self.template_parameters['position_map_size'] = QgsLayoutSize(50, 50, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['position_map_position'] = QgsLayoutPoint(2.5, 20, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['map_size'] = QgsLayoutSize(210, 297, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['map_position'] = QgsLayoutPoint(0, 0, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['title_size'] = QgsLayoutSize(200, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['title_position'] = QgsLayoutPoint(5, 2, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['subtitle_size'] = QgsLayoutSize(200, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['subtitle_position'] = QgsLayoutPoint(5, 10, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['logo_size'] = QgsLayoutSize(48, 17, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['logo_position'] = QgsLayoutPoint(5, 2, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['logo_credit_size'] = QgsLayoutSize(50, 20, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['logo_credit_position'] = QgsLayoutPoint(5, 275, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['legend_size'] = QgsLayoutSize(405, 203, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['legend_position'] = QgsLayoutPoint(133, 215, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['scalebarnumeric_size'] = QgsLayoutSize(64, 7, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['scalebarnumeric_position'] = QgsLayoutPoint(3, 288, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['scalebar_size'] = QgsLayoutSize(65, 15, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['scalebar_position'] = QgsLayoutPoint(3, 273, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['north_size'] = QgsLayoutSize(12, 12, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['north_position'] = QgsLayoutPoint(196, 283, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['credit_text_size'] = QgsLayoutSize(100, 3.9, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['credit_text_position'] = QgsLayoutPoint(205, 125, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['credit_text2_size'] = QgsLayoutSize(100, 4, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['credit_text2_position'] = QgsLayoutPoint(55, 292, QgsUnitTypes.LayoutMillimeters) + + if self.radioButton_6.isChecked() and self.radioButton_8.isChecked(): + + self.template_parameters['position_map_size'] = QgsLayoutSize(100, 100, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['position_map_position'] = QgsLayoutPoint(6, 23, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['map_size'] = QgsLayoutSize(297, 210, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['map_position'] = QgsLayoutPoint(0, 0, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['title_size'] = QgsLayoutSize(286, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['title_position'] = QgsLayoutPoint(5, 2, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['subtitle_size'] = QgsLayoutSize(286, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['subtitle_position'] = QgsLayoutPoint(5, 10, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['logo_size'] = QgsLayoutSize(48, 17, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['logo_position'] = QgsLayoutPoint(5, 2, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['logo_credit_size'] = QgsLayoutSize(50, 20, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['logo_credit_position'] = QgsLayoutPoint(5, 185, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['legend_size'] = QgsLayoutSize(405, 203, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['legend_position'] = QgsLayoutPoint(231, 135, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['scalebarnumeric_size'] = QgsLayoutSize(64, 7, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['scalebarnumeric_position'] = QgsLayoutPoint(3, 201, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['scalebar_size'] = QgsLayoutSize(65, 15, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['scalebar_position'] = QgsLayoutPoint(3, 186, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['north_size'] = QgsLayoutSize(12, 12, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['north_position'] = QgsLayoutPoint(283, 196, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['credit_text_size'] = QgsLayoutSize(100, 3.9, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['credit_text_position'] = QgsLayoutPoint(291.5, 123, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['credit_text2_size'] = QgsLayoutSize(100, 3.9, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['credit_text2_position'] = QgsLayoutPoint(98, 205, QgsUnitTypes.LayoutMillimeters) + + if self.radioButton_5.isChecked() and self.radioButton_7.isChecked(): + + self.template_parameters['position_map_size'] = QgsLayoutSize(50, 50, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['position_map_position'] = QgsLayoutPoint(2.5, 20, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['map_size'] = QgsLayoutSize(297, 420, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['map_position'] = QgsLayoutPoint(0, 0, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['title_size'] = QgsLayoutSize(286, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['title_position'] = QgsLayoutPoint(5, 2, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['subtitle_size'] = QgsLayoutSize(286, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['subtitle_position'] = QgsLayoutPoint(5, 10, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['logo_size'] = QgsLayoutSize(48, 17, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['logo_position'] = QgsLayoutPoint(5, 2, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['logo_credit_size'] = QgsLayoutSize(50, 20, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['logo_credit_position'] = QgsLayoutPoint(5, 370, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['legend_size'] = QgsLayoutSize(405, 203, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['legend_position'] = QgsLayoutPoint(219, 324, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['scalebarnumeric_size'] = QgsLayoutSize(64, 7, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['scalebarnumeric_position'] = QgsLayoutPoint(3, 410, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['scalebar_size'] = QgsLayoutSize(65, 15, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['scalebar_position'] = QgsLayoutPoint(3, 395, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['north_size'] = QgsLayoutSize(24, 24, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['north_position'] = QgsLayoutPoint(271, 394, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['credit_text_size'] = QgsLayoutSize(100, 3.9, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['credit_text_position'] = QgsLayoutPoint(291, 125, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['credit_text2_size'] = QgsLayoutSize(100, 4, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['credit_text2_position'] = QgsLayoutPoint(98, 414, QgsUnitTypes.LayoutMillimeters) + + if self.radioButton_5.isChecked() and self.radioButton_8.isChecked(): + + self.template_parameters['position_map_size'] = QgsLayoutSize(100, 100, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['position_map_position'] = QgsLayoutPoint(6, 23, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['map_size'] = QgsLayoutSize(420, 297, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['map_position'] = QgsLayoutPoint(0, 0, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['title_size'] = QgsLayoutSize(411, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['title_position'] = QgsLayoutPoint(5, 2, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['subtitle_size'] = QgsLayoutSize(411, 8, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['subtitle_position'] = QgsLayoutPoint(5, 10, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['logo_size'] = QgsLayoutSize(48, 17, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['logo_position'] = QgsLayoutPoint(5, 2, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['logo_credit_size'] = QgsLayoutSize(50, 20, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['logo_credit_position'] = QgsLayoutPoint(5, 247, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['legend_size'] = QgsLayoutSize(405, 203, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['legend_position'] = QgsLayoutPoint(341, 196, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['scalebarnumeric_size'] = QgsLayoutSize(64, 7, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['scalebarnumeric_position'] = QgsLayoutPoint(3, 287, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['scalebar_size'] = QgsLayoutSize(65, 15, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['scalebar_position'] = QgsLayoutPoint(3, 272, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['north_size'] = QgsLayoutSize(24, 24, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['north_position'] = QgsLayoutPoint(394, 271, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['credit_text_size'] = QgsLayoutSize(100, 4, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['credit_text_position'] = QgsLayoutPoint(414, 123, QgsUnitTypes.LayoutMillimeters) + + self.template_parameters['credit_text2_size'] = QgsLayoutSize(100, 4, QgsUnitTypes.LayoutMillimeters) + self.template_parameters['credit_text2_position'] = QgsLayoutPoint(185, 292, QgsUnitTypes.LayoutMillimeters) + + # Retour des info # + return self.template_parameters \ No newline at end of file diff --git a/CenRa_COPIE/Makefile b/CenRa_COPIE/Makefile new file mode 100644 index 00000000..83240465 --- /dev/null +++ b/CenRa_COPIE/Makefile @@ -0,0 +1,226 @@ +#/*************************************************************************** +# Copie +# +# Permet la copie d'une table dans une base PostGis +# ------------------- +# begin : 2015-04-13 +# git sha : $Format:%H$ +# copyright : (C) 2015 by Guillaume COSTES - CEN Rhône-Alpes +# email : guillaume.costes@espaces-naturels.fr +# ***************************************************************************/ +# +#/*************************************************************************** +# * * +# * 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. * +# * * +# ***************************************************************************/ + +################################################# +# Edit the following to match your sources lists +################################################# + + +#Add iso code for any locales you want to support here (space separated) +# default is no locales +# LOCALES = af +LOCALES = + +# If locales are enabled, set the name of the lrelease binary on your system. If +# you have trouble compiling the translations, you may have to specify the full path to +# lrelease +#LRELEASE = lrelease +#LRELEASE = lrelease-qt4 + + +# translation +SOURCES = \ + __init__.py \ + copie.py \ + copie_dialog.py + +PLUGINNAME = Copie + +PY_FILES = \ + copie.py \ + copie_dialog.py \ + __init__.py + +UI_FILES = copie_dialog_base.ui + +EXTRAS = icon.png metadata.txt + +COMPILED_RESOURCE_FILES = resources_rc.py + +PEP8EXCLUDE=pydev,resources_rc.py,conf.py,third_party,ui + + +################################################# +# Normally you would not need to edit below here +################################################# + +HELP = help/build/html + +PLUGIN_UPLOAD = $(c)/plugin_upload.py + +RESOURCE_SRC=$(shell grep '^ *@@g;s/.*>//g' | tr '\n' ' ') + +QGISDIR=.qgis2 + +default: compile + +compile: $(COMPILED_RESOURCE_FILES) + +%_rc.py : %.qrc $(RESOURCES_SRC) + pyrcc4 -o $*_rc.py $< + +%.qm : %.ts + $(LRELEASE) $< + +test: compile transcompile + @echo + @echo "----------------------" + @echo "Regression Test Suite" + @echo "----------------------" + + @# Preceding dash means that make will continue in case of errors + @-export PYTHONPATH=`pwd`:$(PYTHONPATH); \ + export QGIS_DEBUG=0; \ + export QGIS_LOG_FILE=/dev/null; \ + nosetests -v --with-id --with-coverage --cover-package=. \ + 3>&1 1>&2 2>&3 3>&- || true + @echo "----------------------" + @echo "If you get a 'no module named qgis.core error, try sourcing" + @echo "the helper script we have provided first then run make test." + @echo "e.g. source run-env-linux.sh ; make test" + @echo "----------------------" + +deploy: compile doc transcompile + @echo + @echo "------------------------------------------" + @echo "Deploying plugin to your .qgis2 directory." + @echo "------------------------------------------" + # The deploy target only works on unix like operating system where + # the Python plugin directory is located at: + # $HOME/$(QGISDIR)/python/plugins + mkdir -p $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vf $(PY_FILES) $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vf $(UI_FILES) $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vf $(COMPILED_RESOURCE_FILES) $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vf $(EXTRAS) $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vfr i18n $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vfr $(HELP) $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME)/help + +# The dclean target removes compiled python files from plugin directory +# also deletes any .git entry +dclean: + @echo + @echo "-----------------------------------" + @echo "Removing any compiled python files." + @echo "-----------------------------------" + find $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) -iname "*.pyc" -delete + find $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) -iname ".git" -prune -exec rm -Rf {} \; + + +derase: + @echo + @echo "-------------------------" + @echo "Removing deployed plugin." + @echo "-------------------------" + rm -Rf $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + +zip: deploy dclean + @echo + @echo "---------------------------" + @echo "Creating plugin zip bundle." + @echo "---------------------------" + # The zip target deploys the plugin and creates a zip file with the deployed + # content. You can then upload the zip file on http://plugins.qgis.org + rm -f $(PLUGINNAME).zip + cd $(HOME)/$(QGISDIR)/python/plugins; zip -9r $(CURDIR)/$(PLUGINNAME).zip $(PLUGINNAME) + +package: compile + # Create a zip package of the plugin named $(PLUGINNAME).zip. + # This requires use of git (your plugin development directory must be a + # git repository). + # To use, pass a valid commit or tag as follows: + # make package VERSION=Version_0.3.2 + @echo + @echo "------------------------------------" + @echo "Exporting plugin to zip package. " + @echo "------------------------------------" + rm -f $(PLUGINNAME).zip + git archive --prefix=$(PLUGINNAME)/ -o $(PLUGINNAME).zip $(VERSION) + echo "Created package: $(PLUGINNAME).zip" + +upload: zip + @echo + @echo "-------------------------------------" + @echo "Uploading plugin to QGIS Plugin repo." + @echo "-------------------------------------" + $(PLUGIN_UPLOAD) $(PLUGINNAME).zip + +transup: + @echo + @echo "------------------------------------------------" + @echo "Updating translation files with any new strings." + @echo "------------------------------------------------" + @chmod +x scripts/update-strings.sh + @scripts/update-strings.sh $(LOCALES) + +transcompile: + @echo + @echo "----------------------------------------" + @echo "Compiled translation files to .qm files." + @echo "----------------------------------------" + @chmod +x scripts/compile-strings.sh + @scripts/compile-strings.sh $(LRELEASE) $(LOCALES) + +transclean: + @echo + @echo "------------------------------------" + @echo "Removing compiled translation files." + @echo "------------------------------------" + rm -f i18n/*.qm + +clean: + @echo + @echo "------------------------------------" + @echo "Removing uic and rcc generated files" + @echo "------------------------------------" + rm $(COMPILED_UI_FILES) $(COMPILED_RESOURCE_FILES) + +doc: + @echo + @echo "------------------------------------" + @echo "Building documentation using sphinx." + @echo "------------------------------------" + cd help; make html + +pylint: + @echo + @echo "-----------------" + @echo "Pylint violations" + @echo "-----------------" + @pylint --reports=n --rcfile=pylintrc . || true + @echo + @echo "----------------------" + @echo "If you get a 'no module named qgis.core' error, try sourcing" + @echo "the helper script we have provided first then run make pylint." + @echo "e.g. source run-env-linux.sh ; make pylint" + @echo "----------------------" + + +# Run pep8 style checking +#http://pypi.python.org/pypi/pep8 +pep8: + @echo + @echo "-----------" + @echo "PEP8 issues" + @echo "-----------" + @pep8 --repeat --ignore=E203,E121,E122,E123,E124,E125,E126,E127,E128 --exclude $(PEP8EXCLUDE) . || true + @echo "-----------" + @echo "Ignored in PEP8 check:" + @echo $(PEP8EXCLUDE) diff --git a/CenRa_COPIE/README.html b/CenRa_COPIE/README.html new file mode 100644 index 00000000..b67f7f70 --- /dev/null +++ b/CenRa_COPIE/README.html @@ -0,0 +1,41 @@ + + +

Plugin Builder Results

+ +Congratulations! You just built a plugin for QGIS!

+ +
+Your plugin Copie was created in:
+  C:\Users\gcostes\.qgis2\python\plugins\Copie +

+Your QGIS plugin directory is located at:
+  C:/Users/gcostes/.qgis2/python/plugins +

+

What's Next

+
    +
  1. In your plugin directory, compile the resources file using pyrcc4 (simply run make if you have automake or use pb_tool) +
  2. Test the generated sources using make test (or run tests from your IDE) +
  3. Copy the entire directory containing your new plugin to the QGIS plugin directory (see Notes below) +
  4. Test the plugin by enabling it in the QGIS plugin manager +
  5. Customize it by editing the implementation file copie.py +
  6. Create your own custom icon, replacing the default icon.png +
  7. Modify your user interface by opening copie_dialog_base.ui in Qt Designer +
+Notes: +
    +
  • You can use the Makefile to compile and deploy when you + make changes. This requires GNU make (gmake). The Makefile is ready to use, however you + will have to edit it to add addional Python source files, dialogs, and translations. +
  • You can also use pb_tool to compile and deploy your plugin. Tweak the pb_tool.cfg file included with your plugin as you add files. Install pb_tool using + pip or easy_install. See http://loc8.cc/pb_tool for more information. +
+
+
+

+For information on writing PyQGIS code, see http://loc8.cc/pyqgis_resources for a list of resources. +

+
+GeoApt LLC +©2011-2015 GeoApt LLC - geoapt.com + + diff --git a/CenRa_COPIE/README.txt b/CenRa_COPIE/README.txt new file mode 100644 index 00000000..b966603a --- /dev/null +++ b/CenRa_COPIE/README.txt @@ -0,0 +1,33 @@ +Plugin Builder Results + +Your plugin Copie was created in: + C:\Users\gcostes\.qgis2\python\plugins\Copie + +Your QGIS plugin directory is located at: + C:/Users/gcostes/.qgis2/python/plugins + +What's Next: + + * Copy the entire directory containing your new plugin to the QGIS plugin + directory + + * Compile the resources file using pyrcc4 + + * Run the tests (``make test``) + + * Test the plugin by enabling it in the QGIS plugin manager + + * Customize it by editing the implementation file: ``copie.py`` + + * Create your own custom icon, replacing the default icon.png + + * Modify your user interface by opening Copie.ui in Qt Designer + + * You can use the Makefile to compile your Ui and resource files when + you make changes. This requires GNU make (gmake) + +For more information, see the PyQGIS Developer Cookbook at: +http://www.qgis.org/pyqgis-cookbook/index.html + +(C) 2011-2014 GeoApt LLC - geoapt.com +Git revision : $Format:%H$ diff --git a/CenRa_COPIE/copie.py.bak b/CenRa_COPIE/copie.py.bak new file mode 100644 index 00000000..057d5db1 --- /dev/null +++ b/CenRa_COPIE/copie.py.bak @@ -0,0 +1,360 @@ +# -*- coding: utf-8 -*- +""" +/*************************************************************************** + Copie + A QGIS plugin + Permet la copie d'une table dans une base PostGis + ------------------- + begin : 2015-04-13 + git sha : $Format:%H$ + copyright : (C) 2015 by Guillaume COSTES - CEN Rhône-Alpes + email : guillaume.costes@espaces-naturels.fr + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 PyQt4.QtCore import * +#from PyQt4.QtGui import * +from qgis.core import * +from qgis.gui import * +# Initialize Qt resources from file resources.py +import resources_rc +# Import the code for the dialog +from copie_dialog import CopieDialog +import os.path + + +class Copie: + """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', + 'Copie_{}.qm'.format(locale)) + + if os.path.exists(locale_path): + self.translator = QTranslator() + self.translator.load(locale_path) + + if qVersion() > '4.3.3': + QCoreApplication.installTranslator(self.translator) + + # Create the dialog (after translation) and keep reference + self.dlg = CopieDialog() + + # Declare instance attributes + self.actions = [] + self.menu = self.tr(u'&Copie') + # TODO: We are going to let the user set this up in a future iteration + self.toolbar = self.iface.addToolBar(u'Copie') + self.toolbar.setObjectName(u'Copie') + + # 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('Copie', 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: + self.toolbar.addAction(action) + + if add_to_menu: + self.iface.addPluginToMenu( + self.menu, + action) + + self.actions.append(action) + + return action + + def initGui(self): + """Create the menu entries and toolbar icons inside the QGIS GUI.""" + + icon_path = ':/plugins/Copie/table_copie.png' + self.add_action( + icon_path, + text=self.tr(u'Copie'), + callback=self.run, + parent=self.iface.mainWindow()) + + + def unload(self): + """Removes the plugin menu item and icon from QGIS GUI.""" + for action in self.actions: + self.iface.removePluginMenu( + self.tr(u'&Copie'), + action) + self.iface.removeToolBarIcon(action) + # remove the toolbar + del self.toolbar + + + def run(self): + """Run method that performs all the real work""" + layer = self.iface.activeLayer() + + if layer == None : + self.iface.messageBar().pushMessage(u"Vous devez sélectionner une table !", level=QgsMessageBar.WARNING, duration=5) + + else : + # Récupération des sources de la couche active + list_sources = layer.source().split(" ") + # dbname + source_db = [s for s in list_sources if "dbname" in s][0].split("'")[1] + # schema + source_schema = [s for s in list_sources if "table" in s][0].split('"')[1] + # tablename + source_tablename = [s for s in list_sources if "table" in s][0].split('"')[3] + + if source_db != 'sig4269': + self.iface.messageBar().pushMessage(u"Un référentiel ne peut être copié, utilisez les filtres !", level=QgsMessageBar.CRITICAL, duration=10) + + else : + import psycopg2 + + config = "//100.100.100.100/bd_sig/z_QGIS/config.txt" # Chemin du fichier config + # Fonction de lecture des lignes du fichier config + def readline(n): + with open(config, "r") as f: + for lineno, line in enumerate(f): + if lineno == n: + return line.strip() # Permet d'enlever les retours chariots + + host = readline(10) + port = readline(12) + dbname = readline(14) + user = readline(16) + password = readline(18) + + con = psycopg2.connect("dbname="+ dbname + " user=" + user + " host=" + host + " password=" + password) + cur = con.cursor() + # Creation de la liste des schemas de la base de donnees + SQL = """WITH list_schema AS ( + SELECT catalog_name, schema_name + FROM information_schema.schemata + WHERE schema_name <> 'information_schema' + AND schema_name !~ E'^pg_' + ORDER BY schema_name + ) + + SELECT string_agg(schema_name,',') + FROM list_schema + GROUP BY catalog_name""" + + cur.execute(SQL) + + list_brut = str(cur.next()) + + list = list_brut [3:-3] + listItems = list.split(",") + + con.close() + + self.dlg.schema.clear() + self.dlg.schema.addItems(listItems) + self.dlg.schema.setCurrentIndex(-1) # Pour ne pas commencer la liste au premier schema + + + self.dlg.table_source.setText(source_schema + "." + source_tablename) # Affiche le nom de la table source + # show the dialog + self.dlg.show() + # Run the dialog event loop + result = self.dlg.exec_() + # See if OK was pressed + if result: + #******************************debut script********************************* + ### config.txt + config = "//100.100.100.100/bd_sig/z_QGIS/config.txt" # Chemin du fichier config + + # Fonction de lecture des lignes du fichier config + def readline(n): + with open(config, "r") as f: + for lineno, line in enumerate(f): + if lineno == n: + return line.strip() # Permet d'enlever les retours chariots + + # Recuperation des donnees + host = readline(10) + port = readline(12) + dbname = readline(14) + user = readline(16) + password = readline(18) + + con = psycopg2.connect("dbname="+ dbname + " user=" + user + " host=" + host + " password=" + password) + cur = con.cursor() + + # Récupération de la couche active + layer = self.iface.activeLayer() + + # Récupération des sources de la couche active + list_sources = layer.source().split(" ") + # dbname + source_db = [s for s in list_sources if "dbname" in s][0].split("'")[1] + # schema + source_schema = [s for s in list_sources if "table" in s][0].split('"')[1] + # tablename + source_tablename = [s for s in list_sources if "table" in s][0].split('"')[3] + + if self.dlg.schema.currentIndex() == -1 : + QMessageBox.warning(None, "Oups :", "Veuillez choisir un dossier de destination.") + return + + schema = self.dlg.schema.currentText() + + if self.dlg.table_destination.text() == '' : + QMessageBox.warning(None, "Oups :", "Veuillez choisir un nom de destination.") + return + + if self.dlg.annee.text() == 'aaaa' or self.dlg.annee.text() == '': + tablename = schema + "_" + self.dlg.table_destination.text().lower() + else : + tablename = schema + "_" + self.dlg.table_destination.text().lower() + "_" + self.dlg.annee.text() + + tablename_qgis = tablename[1:] # Permet d'enlever le "_", ajouter a la premiere etape, dans qgis + + geom = readline(6) + + if self.dlg.table_vide.isChecked() == 1 : + SQL_table = "CREATE TABLE " + schema + "." + tablename + " AS SELECT * FROM " + source_schema + "." + source_tablename + " LIMIT 0;" + else : + SQL_table = "CREATE TABLE " + schema + "." + tablename + " AS SELECT * FROM " + source_schema + "." + source_tablename + + + SQL_pkey = "ALTER TABLE " + schema + "." + tablename + " ADD CONSTRAINT " + tablename + "_pkey" + " PRIMARY KEY (gid)" + SQL_sequence_01 = "CREATE SEQUENCE " + schema + "." + tablename + "_gid_seq" + " INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 CACHE 1;" + SQL_sequence_02 = "ALTER TABLE " + schema + "." + tablename + " ALTER COLUMN gid SET DEFAULT nextval(\'" + schema + "." + tablename + "_gid_seq\'::regclass);" + SQL_sequence_03 = "SELECT setval(\'" + schema + "." + tablename + "_gid_seq\'::regclass, (SELECT max(gid) AS max_gid FROM " + schema + "." + tablename + "));" + SQL_sequence_04 = "ALTER SEQUENCE " + schema + "." + tablename + "_gid_seq" + " OWNED BY " + schema + "." + tablename + ".gid;" + + SQL_trigger_area_m2 = "CREATE TRIGGER area_m2" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_m2();" + SQL_trigger_area_ha = "CREATE TRIGGER area_ha" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_ha();" + SQL_trigger_length_m = "CREATE TRIGGER length_m" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.length_m();" + SQL_trigger_length_km = "CREATE TRIGGER length_km" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.length_km();" + SQL_trigger_coordonnees = "CREATE TRIGGER coordonnees" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.coordonnees();" + + cur.execute(SQL_table) + cur.execute(SQL_pkey) + cur.execute(SQL_sequence_01) + cur.execute(SQL_sequence_02) + cur.execute(SQL_sequence_03) + cur.execute(SQL_sequence_04) + + if layer.wkbType() == QGis.WKBPoint : + cur.execute(SQL_trigger_coordonnees) + + if layer.wkbType() == QGis.WKBMultiLineString : + cur.execute(SQL_trigger_length_m) + cur.execute(SQL_trigger_length_km) + + if layer.wkbType() == QGis.WKBMultiPolygon : + cur.execute(SQL_trigger_area_m2) + cur.execute(SQL_trigger_area_ha) + + con.commit() + + ### Affichage de la table + uri = QgsDataSourceURI() + # set host name, port, database name, username and password + uri.setConnection(host ,port ,dbname ,user ,password) + # set database schema, table name, geometry column and optionaly subset (WHERE clause) + uri.setDataSource(schema, tablename, geom) + + layer = self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres") + + con.commit() + con.close() + + self.iface.messageBar().pushMessage("Table \"" + source_schema + "." + source_tablename + u"\" copiée dans \"" + schema + "." + tablename + "\"." , level=QgsMessageBar.INFO, duration=10) + pass diff --git a/CenRa_COPIE/copie_dialog.py.bak b/CenRa_COPIE/copie_dialog.py.bak new file mode 100644 index 00000000..a951555c --- /dev/null +++ b/CenRa_COPIE/copie_dialog.py.bak @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +""" +/*************************************************************************** + CopieDialog + A QGIS plugin + Permet la copie d'une table dans une base PostGis + ------------------- + begin : 2015-04-13 + git sha : $Format:%H$ + copyright : (C) 2015 by Guillaume COSTES - CEN Rhône-Alpes + email : guillaume.costes@espaces-naturels.fr + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ +""" + +import os + +from PyQt4 import QtGui, uic + +FORM_CLASS, _ = uic.loadUiType(os.path.join( + os.path.dirname(__file__), 'copie_dialog_base.ui')) + + +class CopieDialog(QtGui.QDialog, FORM_CLASS): + def __init__(self, parent=None): + """Constructor.""" + super(CopieDialog, self).__init__(parent) + # Set up the user interface from Designer. + # After setupUI you can access any designer object by doing + # self., and you can use autoconnect slots - see + # http://qt-project.org/doc/qt-4.8/designer-using-a-ui-file.html + # #widgets-and-dialogs-with-auto-connect + self.setupUi(self) diff --git a/CenRa_COPIE/copie_dialog_base.py.bak b/CenRa_COPIE/copie_dialog_base.py.bak new file mode 100644 index 00000000..14a5847d --- /dev/null +++ b/CenRa_COPIE/copie_dialog_base.py.bak @@ -0,0 +1,106 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'copie_dialog_base.ui' +# +# Created: Tue Apr 14 11:48:04 2015 +# by: PyQt4 UI code generator 4.10.2 +# +# WARNING! All changes made in this file will be lost! + +from PyQt4 import QtCore, QtGui + +try: + _fromUtf8 = QtCore.QString.fromUtf8 +except AttributeError: + def _fromUtf8(s): + return s + +try: + _encoding = QtGui.QApplication.UnicodeUTF8 + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig, _encoding) +except AttributeError: + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig) + +class Ui_CopieDialogBase(object): + def setupUi(self, CopieDialogBase): + CopieDialogBase.setObjectName(_fromUtf8("CopieDialogBase")) + CopieDialogBase.resize(386, 290) + self.button_box = QtGui.QDialogButtonBox(CopieDialogBase) + self.button_box.setGeometry(QtCore.QRect(100, 250, 161, 32)) + self.button_box.setOrientation(QtCore.Qt.Horizontal) + self.button_box.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) + self.button_box.setObjectName(_fromUtf8("button_box")) + self.schema_label = QtGui.QLabel(CopieDialogBase) + self.schema_label.setGeometry(QtCore.QRect(20, 100, 121, 29)) + self.schema_label.setMaximumSize(QtCore.QSize(10000, 16777215)) + self.schema_label.setObjectName(_fromUtf8("schema_label")) + self.label_nom_table = QtGui.QLabel(CopieDialogBase) + self.label_nom_table.setGeometry(QtCore.QRect(20, 150, 131, 29)) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.label_nom_table.setFont(font) + self.label_nom_table.setObjectName(_fromUtf8("label_nom_table")) + self.schema = QtGui.QComboBox(CopieDialogBase) + self.schema.setGeometry(QtCore.QRect(20, 130, 351, 20)) + self.schema.setObjectName(_fromUtf8("schema")) + self.table_destination = QtGui.QLineEdit(CopieDialogBase) + self.table_destination.setGeometry(QtCore.QRect(20, 180, 291, 20)) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.table_destination.setFont(font) + self.table_destination.setObjectName(_fromUtf8("table_destination")) + self.annee = QtGui.QLineEdit(CopieDialogBase) + self.annee.setGeometry(QtCore.QRect(320, 180, 50, 20)) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.annee.setFont(font) + self.annee.setAlignment(QtCore.Qt.AlignCenter) + self.annee.setObjectName(_fromUtf8("annee")) + self.table_vide = QtGui.QCheckBox(CopieDialogBase) + self.table_vide.setGeometry(QtCore.QRect(60, 220, 271, 20)) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.table_vide.setFont(font) + self.table_vide.setObjectName(_fromUtf8("table_vide")) + self.table_source = QtGui.QLineEdit(CopieDialogBase) + self.table_source.setEnabled(False) + self.table_source.setGeometry(QtCore.QRect(20, 60, 351, 20)) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.table_source.setFont(font) + self.table_source.setObjectName(_fromUtf8("table_source")) + self.Titre = QtGui.QLabel(CopieDialogBase) + self.Titre.setGeometry(QtCore.QRect(0, 0, 381, 31)) + font = QtGui.QFont() + font.setPointSize(14) + font.setBold(True) + font.setWeight(75) + self.Titre.setFont(font) + self.Titre.setAlignment(QtCore.Qt.AlignCenter) + self.Titre.setObjectName(_fromUtf8("Titre")) + self.table_source_label = QtGui.QLabel(CopieDialogBase) + self.table_source_label.setGeometry(QtCore.QRect(20, 30, 75, 29)) + self.table_source_label.setMaximumSize(QtCore.QSize(75, 16777215)) + self.table_source_label.setObjectName(_fromUtf8("table_source_label")) + + self.retranslateUi(CopieDialogBase) + QtCore.QObject.connect(self.button_box, QtCore.SIGNAL(_fromUtf8("accepted()")), CopieDialogBase.accept) + QtCore.QObject.connect(self.button_box, QtCore.SIGNAL(_fromUtf8("rejected()")), CopieDialogBase.reject) + QtCore.QMetaObject.connectSlotsByName(CopieDialogBase) + + def retranslateUi(self, CopieDialogBase): + CopieDialogBase.setWindowTitle(_translate("CopieDialogBase", "Copie", None)) + self.schema_label.setText(_translate("CopieDialogBase", "Dossier de destination ", None)) + self.label_nom_table.setText(_translate("CopieDialogBase", "Nom de la nouvelle table", None)) + self.annee.setText(_translate("CopieDialogBase", "aaaa", None)) + self.table_vide.setText(_translate("CopieDialogBase", "Cocher cette case pour vider la table de destination", None)) + self.Titre.setText(_translate("CopieDialogBase", "Copie d\'une table", None)) + self.table_source_label.setText(_translate("CopieDialogBase", "Table source ", None)) + diff --git a/CenRa_COPIE/forms/about_form.py b/CenRa_COPIE/forms/about_form.py new file mode 100644 index 00000000..4e9790d7 --- /dev/null +++ b/CenRa_COPIE/forms/about_form.py @@ -0,0 +1,46 @@ +import os.path + +from pathlib import Path + +from qgis.PyQt import uic +from qgis.PyQt.QtGui import QPixmap +from qgis.PyQt.QtWidgets import QDialog + +from ..tools.resources import devlog + +ABOUT_FORM_CLASS, _ = uic.loadUiType( + os.path.join( + str(Path(__file__).resolve().parent.parent), + 'forms', + 'copie_about_form.ui' + ) +) + + +class CopieAboutDialog(QDialog, ABOUT_FORM_CLASS): + + """ About - Let the user display the about dialog. """ + + def __init__(self, iface, parent=None): + super().__init__(parent) + self.iface = iface + self.setupUi(self) + + self.viewer.setHtml(devlog('CenRa_COPIE')) + + self.rejected.connect(self.onReject) + self.buttonBox.rejected.connect(self.onReject) + self.buttonBox.accepted.connect(self.onAccept) + + def onAccept(self): + """ + Save options when pressing OK button + """ + self.accept() + + def onReject(self): + """ + Run some actions when + the user closes the dialog + """ + self.close() \ No newline at end of file diff --git a/CenRa_COPIE/forms/copie_about_form.ui b/CenRa_COPIE/forms/copie_about_form.ui new file mode 100644 index 00000000..e4f9e4e1 --- /dev/null +++ b/CenRa_COPIE/forms/copie_about_form.ui @@ -0,0 +1,96 @@ + + + CenRa_Metabase_editorwidget_base + + + + 0 + 0 + 471 + 594 + + + + COPIE + + + + ../../CenRa_Metabase/tools/ui/icon.svg../../CenRa_Metabase/tools/ui/icon.svg + + + + + + true + + + Qt::NoFocus + + + QFrame::NoFrame + + + QFrame::Plain + + + true + + + + + 0 + 0 + 453 + 547 + + + + + + 0 + 0 + 451 + 541 + + + + DevLog + + + + + 10 + 20 + 431 + 511 + + + + + about:blank + + + + + + + + + + + QDialogButtonBox::Ok + + + + + + + + QWebView + QWidget +
QtWebKitWidgets/QWebView
+
+
+ + +
diff --git a/CenRa_COPIE/help/Makefile b/CenRa_COPIE/help/Makefile new file mode 100644 index 00000000..9def777d --- /dev/null +++ b/CenRa_COPIE/help/Makefile @@ -0,0 +1,130 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/template_class.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/template_class.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/template_class" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/template_class" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + make -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/CenRa_COPIE/help/make.bat b/CenRa_COPIE/help/make.bat new file mode 100644 index 00000000..33776100 --- /dev/null +++ b/CenRa_COPIE/help/make.bat @@ -0,0 +1,155 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. changes to make an overview over all changed/added/deprecated items + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\template_class.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\template_class.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +:end diff --git a/CenRa_COPIE/help/source/conf.py b/CenRa_COPIE/help/source/conf.py new file mode 100644 index 00000000..0c9c79a3 --- /dev/null +++ b/CenRa_COPIE/help/source/conf.py @@ -0,0 +1,216 @@ +# -*- coding: utf-8 -*- +# +# Copie documentation build configuration file, created by +# sphinx-quickstart on Sun Feb 12 17:11:03 2012. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.todo', 'sphinx.ext.pngmath', 'sphinx.ext.viewcode'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'Copie' +copyright = u'2013, Guillaume COSTES - CEN Rhône-Alpes' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0.1' +# The full version, including alpha/beta/rc tags. +release = '0.1' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = [] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_TemplateModuleNames = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'TemplateClassdoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +# The paper size ('letter' or 'a4'). +#latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +#latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'Copie.tex', u'Copie Documentation', + u'Guillaume COSTES - CEN Rhône-Alpes', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'TemplateClass', u'Copie Documentation', + [u'Guillaume COSTES - CEN Rhône-Alpes'], 1) +] diff --git a/CenRa_COPIE/help/source/index.rst b/CenRa_COPIE/help/source/index.rst new file mode 100644 index 00000000..a6116321 --- /dev/null +++ b/CenRa_COPIE/help/source/index.rst @@ -0,0 +1,20 @@ +.. Copie documentation master file, created by + sphinx-quickstart on Sun Feb 12 17:11:03 2012. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to Copie's documentation! +============================================ + +Contents: + +.. toctree:: + :maxdepth: 2 + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/CenRa_COPIE/i18n/af.ts b/CenRa_COPIE/i18n/af.ts new file mode 100644 index 00000000..615a88c3 --- /dev/null +++ b/CenRa_COPIE/i18n/af.ts @@ -0,0 +1,11 @@ + + + + @default + + + Good morning + Goeie more + + + diff --git a/CenRa_COPIE/pb_tool.cfg b/CenRa_COPIE/pb_tool.cfg new file mode 100644 index 00000000..091fb227 --- /dev/null +++ b/CenRa_COPIE/pb_tool.cfg @@ -0,0 +1,74 @@ +#/*************************************************************************** +# Copie +# +# Configuration file for plugin builder tool (pb_tool) +# ------------------- +# begin : 2015-04-13 +# copyright : (C) 2015 by Guillaume COSTES - CEN Rhône-Alpes +# email : guillaume.costes@espaces-naturels.fr +# ***************************************************************************/ +# +#/*************************************************************************** +# * * +# * 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. * +# * * +# ***************************************************************************/ +# +# +# You can install pb_tool using: +# pip install http://geoapt.net/files/pb_tool.zip +# +# Consider doing your development (and install of pb_tool) in a virtualenv. +# +# For details on setting up and using pb_tool, see: +# http://spatialgalaxy.net/qgis-plugin-development-with-pb_tool +# +# Issues and pull requests here: +# https://github.com/g-sherman/plugin_build_tool: +# +# Sane defaults for your plugin generated by the Plugin Builder are +# already set below. +# +# As you add Python source files and UI files to your plugin, add +# them to the appropriate [files] section below. + +[plugin] +# Name of the plugin. This is the name of the directory that will +# be created in .qgis2/python/plugins +name: Copie + +[files] +# Python files that should be deployed with the plugin +python_files: __init__.py copie.py copie_dialog.py + +# The main dialog file that is loaded (not compiled) +main_dialog: copie_dialog_base.ui + +# Other ui files for dialogs you create (these will be compiled) +compiled_ui_files: + +# Resource file(s) that will be compiled +resource_files: resources.qrc + +# Other files required for the plugin +extras: icon.png metadata.txt + +# Other directories to be deployed with the plugin. +# These must be subdirectories under the plugin directory +extra_dirs: + +# ISO code(s) for any locales (translations), separated by spaces. +# Corresponding .ts files must exist in the i18n directory +locales: + +[help] +# the built help directory that should be deployed with the plugin +dir: help/build/html +# the name of the directory to target in the deployed plugin +target: help + + + diff --git a/CenRa_COPIE/plugin_upload.py.bak b/CenRa_COPIE/plugin_upload.py.bak new file mode 100644 index 00000000..8a238549 --- /dev/null +++ b/CenRa_COPIE/plugin_upload.py.bak @@ -0,0 +1,107 @@ +#!/usr/bin/env python +# coding=utf-8 +"""This script uploads a plugin package on the server. + Authors: A. Pasotti, V. Picavet + git sha : $TemplateVCSFormat +""" + +import sys +import getpass +import xmlrpclib +from optparse import OptionParser + +# Configuration +PROTOCOL = 'http' +SERVER = 'plugins.qgis.org' +PORT = '80' +ENDPOINT = '/plugins/RPC2/' +VERBOSE = False + + +def main(parameters, arguments): + """Main entry point. + + :param parameters: Command line parameters. + :param arguments: Command line arguments. + """ + address = "%s://%s:%s@%s:%s%s" % ( + PROTOCOL, + parameters.username, + parameters.password, + parameters.server, + parameters.port, + ENDPOINT) + print "Connecting to: %s" % hide_password(address) + + server = xmlrpclib.ServerProxy(address, verbose=VERBOSE) + + try: + plugin_id, version_id = server.plugin.upload( + xmlrpclib.Binary(open(arguments[0]).read())) + print "Plugin ID: %s" % plugin_id + print "Version ID: %s" % version_id + except xmlrpclib.ProtocolError, err: + print "A protocol error occurred" + print "URL: %s" % hide_password(err.url, 0) + print "HTTP/HTTPS headers: %s" % err.headers + print "Error code: %d" % err.errcode + print "Error message: %s" % err.errmsg + except xmlrpclib.Fault, err: + print "A fault occurred" + print "Fault code: %d" % err.faultCode + print "Fault string: %s" % err.faultString + + +def hide_password(url, start=6): + """Returns the http url with password part replaced with '*'. + + :param url: URL to upload the plugin to. + :type url: str + + :param start: Position of start of password. + :type start: int + """ + start_position = url.find(':', start) + 1 + end_position = url.find('@') + return "%s%s%s" % ( + url[:start_position], + '*' * (end_position - start_position), + url[end_position:]) + + +if __name__ == "__main__": + parser = OptionParser(usage="%prog [options] plugin.zip") + parser.add_option( + "-w", "--password", dest="password", + help="Password for plugin site", metavar="******") + parser.add_option( + "-u", "--username", dest="username", + help="Username of plugin site", metavar="user") + parser.add_option( + "-p", "--port", dest="port", + help="Server port to connect to", metavar="80") + parser.add_option( + "-s", "--server", dest="server", + help="Specify server name", metavar="plugins.qgis.org") + options, args = parser.parse_args() + if len(args) != 1: + print "Please specify zip file.\n" + parser.print_help() + sys.exit(1) + if not options.server: + options.server = SERVER + if not options.port: + options.port = PORT + if not options.username: + # interactive mode + username = getpass.getuser() + print "Please enter user name [%s] :" % username, + res = raw_input() + if res != "": + options.username = res + else: + options.username = username + if not options.password: + # interactive mode + options.password = getpass.getpass() + main(options, args) diff --git a/CenRa_COPIE/pylintrc b/CenRa_COPIE/pylintrc new file mode 100644 index 00000000..7e168f64 --- /dev/null +++ b/CenRa_COPIE/pylintrc @@ -0,0 +1,281 @@ +[MASTER] + +# Specify a configuration file. +#rcfile= + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Profiled execution. +profile=no + +# Add files or directories to the blacklist. They should be base names, not +# paths. +ignore=CVS + +# Pickle collected data for later comparisons. +persistent=yes + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + + +[MESSAGES CONTROL] + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time. See also the "--disable" option for examples. +#enable= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once).You can also use "--disable=all" to +# disable everything first and then reenable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use"--disable=all --enable=classes +# --disable=W" +# see http://stackoverflow.com/questions/21487025/pylint-locally-defined-disables-still-give-warnings-how-to-suppress-them +disable=locally-disabled,C0103 + + +[REPORTS] + +# Set the output format. Available formats are text, parseable, colorized, msvs +# (visual studio) and html. You can also give a reporter class, eg +# mypackage.mymodule.MyReporterClass. +output-format=text + +# Put messages in a separate file for each module / package specified on the +# command line instead of printing them on stdout. Reports (if any) will be +# written in a file name "pylint_global.[txt|html]". +files-output=no + +# Tells whether to display a full report or only the messages +reports=yes + +# Python expression which should return a note less than 10 (10 is the highest +# note). You have access to the variables errors warning, statement which +# respectively contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (RP0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Add a comment according to your evaluation note. This is used by the global +# evaluation report (RP0004). +comment=no + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details +#msg-template= + + +[BASIC] + +# Required attributes for module, separated by a comma +required-attributes= + +# List of builtins function names that should not be used, separated by a comma +bad-functions=map,filter,apply,input + +# Regular expression which should only match correct module names +module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Regular expression which should only match correct module level names +const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ + +# Regular expression which should only match correct class names +class-rgx=[A-Z_][a-zA-Z0-9]+$ + +# Regular expression which should only match correct function names +function-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct method names +method-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct instance attribute names +attr-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct argument names +argument-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct variable names +variable-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct attribute names in class +# bodies +class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ + +# Regular expression which should only match correct list comprehension / +# generator expression variable names +inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ + +# Good variable names which should always be accepted, separated by a comma +good-names=i,j,k,ex,Run,_ + +# Bad variable names which should always be refused, separated by a comma +bad-names=foo,bar,baz,toto,tutu,tata + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=__.*__ + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=-1 + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME,XXX,TODO + + +[TYPECHECK] + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# List of classes names for which member attributes should not be checked +# (useful for classes with attributes dynamically set). +ignored-classes=SQLObject + +# When zope mode is activated, add a predefined set of Zope acquired attributes +# to generated-members. +zope=no + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E0201 when accessed. Python regular +# expressions are accepted. +generated-members=REQUEST,acl_users,aq_parent + + +[VARIABLES] + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# A regular expression matching the beginning of the name of dummy variables +# (i.e. not used). +dummy-variables-rgx=_$|dummy + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + + +[FORMAT] + +# Maximum number of characters on a single line. +max-line-length=80 + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )??$ + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + +# List of optional constructs for which whitespace checking is disabled +no-space-check=trailing-comma,dict-separator + +# Maximum number of lines in a module +max-module-lines=1000 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + + +[SIMILARITIES] + +# Minimum lines number of a similarity. +min-similarity-lines=4 + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + + +[IMPORTS] + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=regsub,TERMIOS,Bastion,rexec + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled) +import-graph= + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled) +int-import-graph= + + +[DESIGN] + +# Maximum number of arguments for function / method +max-args=5 + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore +ignored-argument-names=_.* + +# Maximum number of locals for function / method body +max-locals=15 + +# Maximum number of return / yield for function / method body +max-returns=6 + +# Maximum number of branch for function / method body +max-branches=12 + +# Maximum number of statements in function / method body +max-statements=50 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + + +[CLASSES] + +# List of interface methods to ignore, separated by a comma. This is used for +# instance to not check methods defines in Zope's Interface base class. +ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__,__new__,setUp + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "Exception" +overgeneral-exceptions=Exception diff --git a/CenRa_COPIE/resources_rc.py b/CenRa_COPIE/resources_rc.py new file mode 100644 index 00000000..9910bad8 --- /dev/null +++ b/CenRa_COPIE/resources_rc.py @@ -0,0 +1,441 @@ +# -*- coding: utf-8 -*- + +# Resource object code +# +# Created by: The Resource Compiler for PyQt5 (Qt v5.15.2) +# +# WARNING! All changes made in this file will be lost! + +from PyQt5 import QtCore + +qt_resource_data = b"\ +\x00\x00\x13\x71\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x32\x00\x00\x00\x3d\x08\x06\x00\x00\x00\xef\x69\x3a\x64\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x2e\x23\x00\x00\x2e\x23\ +\x01\x78\xa5\x3f\x76\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\ +\x25\x00\x00\x80\x83\x00\x00\xf9\xff\x00\x00\x80\xe9\x00\x00\x75\ +\x30\x00\x00\xea\x60\x00\x00\x3a\x98\x00\x00\x17\x6f\x92\x5f\xc5\ +\x46\x00\x00\x12\xf7\x49\x44\x41\x54\x78\xda\xbc\x9a\x79\x78\x5d\ +\x75\x99\xc7\x3f\xbf\xb3\xde\x2d\x37\x49\x93\xb4\x69\x93\x74\x23\ +\x5d\xd2\x9d\x96\x16\x0a\x94\x82\x0a\xb2\x29\xa8\xa0\x28\xe0\x02\ +\x8f\x32\xe3\xe8\x30\x8a\x0b\x33\xe3\xf3\x80\x88\x0c\x33\x32\xa2\ +\xc8\x8c\x3e\x08\x8e\x0f\x08\x82\x6c\xa3\xc8\xbe\x43\x0b\xa4\x14\ +\xda\xa4\x4d\x4a\x93\xb4\x49\x9b\x7d\xbd\xb9\xb9\xb9\xdb\x59\xe7\ +\x8f\x7b\xee\xed\xbd\x69\x9a\x05\x75\xde\xe7\x39\xcf\x73\x97\x73\ +\xce\xef\x7c\x7f\xef\xf6\x7d\xdf\xf7\x88\x3b\x9e\x39\x93\xac\x38\ +\xae\x8d\x5f\x0d\x73\xfe\xda\x1b\x79\xb6\xf1\x36\x92\xe6\x18\xb2\ +\xa4\xaa\x40\x0d\x50\x0b\x2c\x06\x96\x00\xf3\x81\x72\x60\x0e\x10\ +\x02\xfc\x80\x0f\x50\xc8\x13\x17\x57\xd8\xb6\x61\x5d\x71\xda\xdd\ +\x6e\x2c\x35\x94\x7c\x6a\xcf\x0f\xa2\x9a\x12\x8c\x01\x11\xef\xe8\ +\x07\xba\x80\x3e\xe0\xa8\xf7\x79\x04\x30\x01\x6c\xc7\xc4\x76\x4d\ +\xce\x5f\x73\x23\x8b\xca\x36\x31\x9e\x1a\x60\x34\x7e\x14\xc3\x4c\ +\x20\x84\xc8\x5f\xaa\x70\xe1\xac\xc8\x42\x41\x96\xb5\x6d\x46\x32\ +\x7e\x99\x2c\xe9\x67\x28\xb2\xbe\x5c\x12\x52\x11\xb3\x14\x81\xc0\ +\x76\x4d\xc6\x92\x03\xcc\x2f\xa9\x43\x91\x7d\xb8\x38\x08\xa4\xc9\ +\x4e\x37\x80\xa8\xeb\x3a\x47\x6c\xc7\x3c\x68\xbb\x56\x83\xe3\x98\ +\x7b\xc1\xdd\x6b\x3b\xe6\xa0\xeb\xba\x53\xae\xa5\x4c\x5c\xd8\x71\ +\xac\x6a\xd3\x49\xdf\x79\xc9\xc6\xdb\x3e\x35\x30\xd6\x22\x1f\xea\ +\xdf\x41\xe7\xc8\x5e\x12\xc6\x28\xaa\xec\x43\x96\xd4\xd9\xa1\x71\ +\x21\x96\xea\xa3\x56\x3f\x13\x5d\x09\x92\xb6\xe2\x4c\xd8\x4c\x1c\ +\xd7\xc6\xb2\xd3\x9a\x8b\x53\xe1\x53\xc3\x15\x73\x82\x0b\x4f\x29\ +\x2f\x5a\x7a\x65\x59\x68\x11\x41\xbd\xbc\xaf\xb2\x78\xe5\x6e\x45\ +\xd6\x9f\x75\x5d\xf7\x61\xd7\xb5\x47\xa6\x07\x22\xa4\x45\xa6\x93\ +\xfa\xf3\x33\x8d\x3f\x5e\x53\x1e\x5a\xc2\x49\x73\xcf\xe0\xb4\xda\ +\x2f\x73\x96\x12\xa0\xa5\xef\x35\xf6\x1e\x79\x9c\x68\xb2\x1f\x5d\ +\x09\x22\x84\x34\x63\x2c\x86\x95\x44\x57\x82\x68\x4a\x80\x94\x19\ +\x03\x21\x93\x35\x1d\xd3\x4e\x11\xd0\x4a\x58\x5c\xbe\x99\xda\x79\ +\xdb\xa8\x2e\x5d\x4f\x69\x68\x21\x8a\xa4\x67\x2f\xaf\x04\x2e\x06\ +\x2e\xd6\xd4\xd0\x75\x89\xf4\xd0\x55\x86\x95\xdc\x27\x26\x18\x53\ +\xfe\x37\x0d\xb8\x17\xc4\x1a\xcb\x4e\xd1\x15\x69\xe4\xc8\xf0\x6e\ +\x74\xa5\x88\xc5\x15\x9b\x39\x75\xe9\xd5\xac\xab\xf9\x04\xef\xb4\ +\xdd\xcf\x9e\x23\x8f\x83\x00\x45\xf2\x65\xb6\x7c\x5a\x13\x03\x21\ +\x64\x24\x0f\x80\xe3\xda\x18\x56\x82\x62\x7f\x25\xab\xab\x2f\x60\ +\x4d\xd5\x85\x54\x84\x97\x4d\x7b\x1f\xbf\x56\xb2\x6e\xd9\x82\x73\ +\x1f\xed\x18\x78\x73\x9b\x65\xa5\x07\xf3\x37\x33\x1f\xc8\xa5\xc0\ +\xc7\xf0\x16\x55\x65\x19\x55\xf6\xe1\xba\x0e\x2d\x7d\xaf\x73\xa8\ +\x7f\x27\x6b\xab\x2f\xe2\xec\xba\x6f\xb2\xbc\xf2\x6c\x9e\x6e\xf8\ +\x21\x63\xc9\x7e\x34\x25\x30\xed\x03\xe8\x6a\x51\x4e\x83\x86\x15\ +\xc7\xaf\x95\x70\xda\x49\x5f\xe4\x94\xa5\x57\x50\xec\x5f\x70\xdc\ +\xf9\xa6\x95\x60\x68\xbc\x9d\x48\xbc\x93\xb1\x64\x2f\xe3\xe9\x11\ +\x1c\xc7\x04\x21\x08\x68\x73\x56\x58\x76\xf2\xfa\xb4\x11\xfd\xc1\ +\x89\x80\x5c\x3d\xe9\x6e\x0a\x09\x5d\x09\xe2\xba\x0e\xef\x1f\x7d\ +\x9c\xce\xc8\x5e\x2e\xdb\x7c\x27\x57\x9e\x7e\x0f\x8f\xed\xfa\x16\ +\x83\xb1\xc3\x68\x4a\xf0\xc4\x9a\x11\x10\xd2\xcb\x71\x5c\x9b\x84\ +\x11\xa1\x7a\xce\x06\xce\x5d\xf3\x5d\xaa\x4a\xd7\x15\x9c\x96\xb6\ +\xc6\xe9\x18\xac\xa7\xad\xff\x0d\x7a\x22\x4d\x8c\xa5\xfa\x30\xac\ +\x04\xae\xeb\xe4\xe9\xd5\xc5\x05\x64\x49\xbd\x5c\x12\xf2\x6d\x40\ +\x22\xb7\x8c\x17\x7e\x2b\x80\xfd\xc0\xdc\xe9\x8c\x24\xb3\xa3\x61\ +\x3e\x7f\xda\x2f\x09\xe8\xa5\x3c\xb8\xf3\x3a\x46\x93\xdd\xa8\xb2\ +\x6f\x12\x3f\x77\x71\x6c\x93\x2b\xb6\xfe\x37\x65\xa1\x45\xec\x6e\ +\x7f\x98\xad\xb5\xd7\x14\x68\x31\x9e\x1e\xa2\xb1\xf3\x4f\xec\xeb\ +\x7c\x9a\xe1\xf1\x76\x1c\xd7\x41\x91\x35\x64\xa1\x7a\x21\x56\x9c\ +\x20\x84\xb8\x67\x01\x3b\xb2\x3f\x64\x75\x73\x92\x97\x17\xa6\x0d\ +\x41\x9a\x12\x24\x65\x8c\xf1\xd8\xae\x6f\x21\x09\x95\x4f\x9d\x72\ +\x3b\xaa\xec\xc3\x71\xad\xe3\xcf\x76\x6d\x7c\x5a\x31\x25\xc1\x6a\ +\x02\x5a\x29\xdb\x57\x7e\x23\x07\xc2\x75\x6d\xde\xef\xf8\x03\xf7\ +\xef\xf8\x0a\x2f\x37\xff\x9c\x48\xbc\x13\x4d\x09\xe0\x53\x8b\x50\ +\x24\xdd\x33\x45\x31\x85\xdb\x89\x8d\x9e\xf7\x41\x5e\x40\x5f\x90\ +\x07\x6a\x5a\x30\xaa\x12\x64\x34\xd9\xcb\x33\x0d\x3f\x64\x5e\xf1\ +\x4a\xb6\x2d\xff\x1a\x86\x95\x3c\xde\xd6\xed\x34\xa5\xc1\x6a\x8a\ +\x7c\x15\x08\xcf\xd1\x01\x22\xf1\x4e\x1e\xdd\x75\x3d\xcf\x36\xde\ +\xc6\x58\xb2\x1f\xbf\x1a\x46\x91\xf5\xa9\x1e\x7c\x32\xa9\xcd\xff\ +\x92\x7d\xf8\xd0\x6c\x93\x83\xae\x86\x68\xed\x7b\x9d\x0f\x7a\x5e\ +\x64\xf3\x49\x57\x52\x55\xba\x06\xd3\x4e\xe5\x69\xc3\x41\x12\x12\ +\x9b\x16\x5f\x5e\x90\x00\x3b\x06\xeb\x79\xe8\xed\xeb\x68\xed\xdf\ +\x81\x4f\x0d\x79\x00\x3e\x94\x84\x26\x03\xa2\x7f\x98\xac\x2d\x84\ +\x42\xfd\xa1\xdf\x21\x90\x38\x75\xe9\x17\x71\x72\x8e\x09\x86\x1d\ +\xe7\xcc\xe5\x5f\x65\x55\xd5\x05\xb9\xdf\x3e\xe8\x79\x91\xc7\x77\ +\xdf\x40\x2c\x35\x80\x4f\x0d\xcf\x56\x03\xc7\x29\x7c\x32\x20\xee\ +\x87\xb9\x93\x2a\xfb\xe8\x8d\x36\xd3\x39\xfc\x3e\xcb\xe7\x9f\x43\ +\x45\xd1\x62\x6c\xc7\x20\x6d\xc5\x59\x5e\x79\x0e\x67\x2c\xff\x6a\ +\xee\xdc\x43\xfd\x6f\xf2\xd4\xde\x9b\xb0\x1c\x03\x55\x0e\x7c\xd8\ +\x25\xf3\xa5\x73\x32\x20\xe9\x0f\x73\x27\x21\x04\xb6\x63\xd2\xd2\ +\xf7\x2a\xb2\xa4\x72\xd2\xdc\x33\x49\x59\xe3\x84\x7d\x73\x39\x77\ +\xf5\x77\x73\x26\x35\x30\xd6\xc2\x9f\x1b\x6e\xc6\x71\xac\x29\x93\ +\xa8\x8b\x8b\xe3\xda\xd8\x8e\x81\x65\xa7\x31\xed\x54\xee\xb0\xec\ +\x34\xb6\x63\xe6\x85\x63\xf6\x14\x64\x76\xcf\xae\xd3\x92\x90\x67\ +\xcf\xa3\x32\x31\x9d\xae\x48\x23\x00\x8b\xcb\xb7\xf0\x66\xcb\x3d\ +\x9c\xbe\xec\x5a\x8a\x03\x0b\xbc\x04\x98\xe0\xd9\x86\x5b\x89\xa7\ +\x23\xe8\x4a\xa8\x00\x84\x8b\x8b\x6d\x1b\xd8\x8e\x89\x10\x02\x45\ +\xf6\xe1\x53\x42\xe8\x6a\x11\xba\x12\x40\x95\xfd\x48\x92\x82\x65\ +\xa7\x31\xec\x24\x69\x33\x46\xd2\x1c\xc3\xb4\x53\xdd\x02\xf1\x76\ +\xbe\x69\x2a\x0b\xcb\x36\x21\x20\x19\x4d\xf6\x11\x4d\xf6\x60\x3b\ +\x26\x8a\xa4\xcf\x18\x94\x2c\xa9\x44\x93\xbd\x24\xd2\x11\xe6\x84\ +\x16\xb3\xa2\xf2\x6c\xd6\xd5\x7c\x32\xf7\xff\x5b\xad\xf7\xd2\x39\ +\xb2\x17\xbf\x56\x9c\x03\x61\x3b\x26\x96\x9d\x46\x55\xfc\xcc\x0d\ +\xd7\x52\x53\xb6\x89\xf9\x25\x75\x94\x05\x17\x53\xe4\x9f\x8b\x24\ +\x54\x5c\xd7\xc2\x71\x2d\x32\xac\x57\x20\x49\x2a\x92\x90\x48\x5b\ +\xe3\x1c\xec\x79\xf9\xa9\xde\xd1\x7d\x23\xb2\xa4\x1d\x03\xf2\xd1\ +\x55\xff\x04\x60\xe8\x4a\x90\xd1\x44\x0f\x1d\x43\xf5\xb4\xf4\xbf\ +\xce\x70\xac\x03\x21\x04\xaa\xec\x9f\xc6\xe9\x25\xd2\x66\x8c\xd1\ +\x44\x27\x73\x8b\x57\xf2\xb1\x55\x37\xe4\x22\x51\x5f\xf4\x00\xbb\ +\xdb\x1f\x41\x57\x43\x80\xf0\x00\xa4\x28\x0e\xcc\x67\x55\xd5\xc7\ +\x59\xb5\xe0\x7c\x4a\x83\x55\x24\x8d\x51\x06\xc7\x0e\xd3\xda\xff\ +\x06\x23\xf1\x23\x8c\xa7\x86\x48\x5b\xe3\x98\x76\x0a\xc7\xb1\x90\ +\x25\x15\x55\xf6\x27\xfc\x5a\xf1\xc1\x92\x40\xf5\x70\x40\x0d\xdd\ +\x1d\xd2\xcb\x0a\x82\x85\xf2\x70\xfd\x37\xc0\x75\x8d\x22\x7f\x85\ +\xbb\xa0\x64\x9d\xa8\x9d\xb7\x8d\xb5\xd5\x17\x33\x18\x6b\xe3\xfd\ +\x23\x4f\x70\x64\xf8\x5d\x24\xe4\x13\x86\x49\x21\xc0\xb2\x2d\xc6\ +\x53\xc3\x2c\x28\xd5\x28\x0f\xd7\xe6\x0c\xe7\xad\xd6\x7b\x31\xec\ +\x44\x26\x89\x5a\x31\xc2\xfa\x5c\xb6\xac\xb8\x8e\xf5\x8b\x3e\x8d\ +\x65\xa7\x38\xd0\xf3\x12\x2f\x35\xdd\x41\xff\xd8\x41\x52\xc6\x78\ +\xa6\x56\x11\x12\x92\x90\x11\x48\xd9\xe2\xc9\x00\x7e\xe1\xb8\xce\ +\x7d\x96\x9d\xea\xb0\x1d\x33\xe9\xd3\xc2\x48\xc8\x85\xec\xd7\xb0\ +\x12\x00\xc6\x60\xec\xb0\xd3\x37\x7a\x50\x7e\xbf\xe3\x51\xca\x42\ +\x8b\xa8\xab\xfa\x38\xe7\xae\xbe\x81\x91\xf8\x51\x76\xb4\xdc\x43\ +\x5f\xf4\x20\xba\x12\x3a\xae\x32\xf3\x92\x06\xb6\x5b\x10\x0d\xe9\ +\x1a\x69\xa4\xad\x7f\x07\xb2\xa4\x62\xd9\x29\x4e\xae\xf9\x14\xdb\ +\x57\x7e\x1d\x04\xec\x6c\xf9\x35\xfb\xba\x9e\x26\x9e\x1e\x46\x96\ +\x54\x64\x49\x43\x57\x83\x93\xed\x53\x1a\xf8\x12\xf0\x88\x84\x8b\ +\xf0\x4c\x59\x53\x7c\xa8\xaa\x83\x10\xc7\xfc\x4d\xf1\xa8\xb5\x29\ +\x09\xd9\xcd\xd6\x00\xd1\x64\x2f\x6f\x1c\xfc\x15\x7b\x3a\x1e\x67\ +\xcb\xd2\x2f\xf0\xd9\x2d\x77\xf1\x5e\xfb\x23\xbc\x73\xf8\x01\x32\ +\x41\x41\x9b\x36\x7c\x36\x1c\x7d\x92\x84\x31\x4a\x59\x70\x11\xe7\ +\xad\xbd\x91\x15\xf3\xcf\x66\x77\xfb\x23\xec\x6c\xbd\x8f\xf1\xd4\ +\x20\xaa\x1c\xf0\x72\xc9\x94\xf2\x33\xe0\x91\x9c\x3f\x2a\x36\x12\ +\x26\x8e\x23\xd1\xd6\x5c\x8d\x6d\x4b\x08\xef\x39\x94\xbc\x32\xd3\ +\x3d\xe6\xc0\x1a\x7e\x49\x27\x6d\xc5\x79\xb9\xf9\x67\xb4\x0e\xbc\ +\xc9\xc5\xeb\x6f\x62\x7e\xe9\x1a\x9e\x6e\xb8\x19\xd3\x4a\xa1\xc8\ +\x79\x61\x54\x90\xab\x35\x00\x62\xc9\x01\x9a\x7b\x5e\xa0\xaa\x74\ +\x2d\x9f\x39\xe5\x0e\x02\x7a\x29\x7f\xa8\xbf\x9e\xd6\xbe\xd7\x51\ +\x95\x00\x3e\xb5\x78\x26\x79\xa4\x17\xf8\xcf\x5c\xce\x52\x4d\x86\ +\x87\xc2\xec\xab\x5f\x45\x7f\x67\x0d\x23\x83\x61\x1c\x47\xe4\xaa\ +\xcd\xfc\x3c\xe2\x4c\x8c\xea\xb2\xa4\xe0\xd7\x8a\xe9\x1a\x69\xe0\ +\xfe\x9d\xd7\x10\xf2\x95\xf1\xb9\x2d\x77\xa3\xab\x21\x2c\x27\x9d\ +\xcb\xa4\x92\x50\xf0\xe7\xed\xee\x81\xde\xe7\x09\xfb\xe6\x71\xd5\ +\xe9\xf7\xe2\x02\xbf\x7d\xe3\x8b\xb4\xf6\xbf\x89\x4f\x2b\xf6\xa2\ +\xe1\x8c\x92\xe1\x53\xc0\x20\x80\xa2\xd8\x0c\xf5\x95\xf3\xf4\xef\ +\x2e\xa2\xe9\xdd\x75\x8c\x0e\x17\xa1\x6a\x16\xba\xcf\x44\xd3\x33\ +\x47\x3e\x10\xeb\x84\x85\x91\x12\x22\x65\xc6\x78\xf8\x9d\x6f\xa0\ +\xc8\x1a\x97\x6d\xfe\x29\x8a\x50\xb1\x5d\x0b\xd7\x75\xd0\xd5\x20\ +\x61\x2f\x6f\xd8\x8e\xc9\x68\xa2\x9b\xcf\x9d\x7a\x17\x49\x23\xca\ +\xc3\xef\xfc\x3d\x91\x44\xe7\x4c\xcc\x68\xa2\xbc\x0c\x20\x09\x17\ +\xc3\x50\x79\xf1\x89\xb3\x88\xc7\x02\xe8\xfe\x34\xb2\x62\x1f\x77\ +\x72\x3e\x90\xf4\x94\x8c\x57\xf6\x63\xda\x49\x9e\xd8\xfd\x1d\xe6\ +\x86\x97\x71\xfe\xba\x7f\xc1\xb6\x0d\x2c\xc7\x60\x4e\x70\x11\xc5\ +\xfe\xf9\x00\x58\x76\x8a\xcd\x4b\xae\x24\xa0\xcf\xe1\x89\xdd\xdf\ +\xf1\xaa\xc8\xd0\x6c\x29\x49\x0a\xd8\x07\xa0\x6a\x16\xad\xfb\x97\ +\x10\x19\x0a\xa3\x6a\x56\xb6\x24\x3f\xe9\x44\x40\x52\xd3\xd3\x14\ +\x17\x55\x0e\x30\x12\xef\xe4\xd9\xc6\x5b\x59\x5d\x7d\x21\x1b\x16\ +\x5d\x4a\xd2\x18\xa5\x32\xbc\x22\x57\xca\xea\x6a\x11\xa5\xc1\x1a\ +\x9e\x6f\xbc\x9d\xbe\xe8\xc1\xa9\xab\xc7\x13\x4b\x1f\xd0\x29\x84\ +\x4b\x32\xa9\xb1\x7f\xf7\x0a\x24\x39\x67\xf9\xff\x0a\xd4\x67\xfa\ +\x0b\xc7\xc8\x6e\xbe\x46\x92\x33\xa3\xef\x45\x34\x77\xbf\x40\xfb\ +\xe0\xdb\x9c\x53\x77\x3d\x25\x81\x2a\xe6\x84\x16\x17\x9c\x75\xa8\ +\x7f\x07\x4d\xdd\xcf\xe0\xd3\x66\xda\x0a\xcb\x94\xb1\x8e\x6b\x65\ +\x39\x56\x87\x65\xa7\xe3\x42\x8e\x73\xb0\x71\x11\xc3\xfd\xa5\x28\ +\x19\x73\x0a\x7a\xe1\xb8\x0c\xb8\x16\xf8\xee\x44\x20\x66\x7e\xfd\ +\x3b\x1d\x7d\xcf\xe4\x82\x7b\xf1\xa9\x61\xce\x58\x76\x2d\x45\xbe\ +\xb9\x05\x75\x48\xfd\xa1\xfb\x71\x0a\xea\xb6\xc9\x25\xdb\x4d\x49\ +\x5b\x31\x1c\xc7\x26\xa8\xcd\xa1\x6a\xce\x3a\x96\x94\x6f\xee\xac\ +\x2a\x5d\xed\x2e\x2c\x5b\x8b\x6c\x2d\xc2\x76\x72\xda\x58\xef\x75\ +\x3d\xb3\xf2\xed\xec\x77\xc5\xb0\xe2\x78\x8e\x3e\x26\x09\xd9\xe3\ +\x34\xf2\x34\xf4\xdd\x9f\x69\x17\x0d\xed\xe2\x94\x25\x9f\xc7\xb4\ +\x8f\xed\x41\xf7\xc8\x5e\x3a\x23\x0d\x68\x53\x50\x1b\xd3\x4e\xe1\ +\xb8\x16\x45\xbe\x0a\x6a\x2a\xb7\x53\x53\xba\x9e\xb9\xc5\xcb\x71\ +\x1d\x1b\xdb\xb5\xb0\xed\x54\x87\x84\x4b\x28\x24\xd3\xb2\xab\x07\ +\xcb\xee\x83\x4c\x26\xdf\x36\xa1\x92\x2d\x05\x2e\x07\x7e\xaa\x6c\ +\x5c\x74\x19\x42\x08\xdb\x76\xac\x58\x24\xd1\xc5\x60\xec\x10\xf1\ +\xf4\x30\x02\x09\x55\xf6\x79\x25\xaa\x3b\x69\x2b\x74\x7f\xd7\xd3\ +\x2c\x2a\xdf\x82\x2c\x15\xe7\xfe\x6b\xed\x7f\x03\xcb\x4e\xa3\xa8\ +\xda\x71\x00\x2c\x3b\x8d\xe3\x5a\x54\x95\xae\x65\xfd\xc2\x4b\xa9\ +\x2a\x5d\x4f\xca\x1c\xa3\x7d\xf0\x1d\x76\xb6\xdc\xc7\xf0\x78\x3b\ +\xf1\xf4\x30\x7e\xb5\xb8\x29\xec\x2f\xc3\x34\x65\x5e\xdd\xb9\x05\ +\xbf\x4f\xc9\x3e\xc3\xb6\x49\xf6\xe5\x62\xe0\x4e\xa5\x38\x30\x1f\ +\xd7\x75\xf0\xa9\xc5\x63\x75\x55\xe7\x21\x0b\x95\x58\xb2\x9f\x03\ +\x7d\x2f\x73\x78\xe0\x2d\x0c\x6b\x1c\x4d\x09\x64\x4c\x2a\x5f\x2b\ +\x92\x8f\x23\xc3\xef\x91\x32\xa3\x5e\x82\xcb\x98\x55\x77\xa4\x11\ +\x59\x52\x26\x30\x18\x87\xb4\x15\x67\x6e\x78\x19\xdb\x96\x5f\x47\ +\x4d\xd9\xc9\x1c\x1e\xd8\xc9\xb3\x8d\xb7\xd2\x33\xba\x1f\xcb\x36\ +\x90\x25\xc5\xa3\x2b\xaa\x95\xb2\xc6\x5b\x53\xe3\xa3\x18\x69\x95\ +\x81\xa1\x0d\x48\x19\xc6\x51\x06\x6c\x9a\x04\xc8\x46\xa0\x5a\x79\ +\xe5\xc0\x2f\xb2\xcb\xf5\x29\x92\x4e\x69\xa0\x9a\xc5\x15\xa7\xb2\ +\x65\xc9\x95\x6c\x3d\xe9\xcb\xbc\xd7\xf1\x30\x4d\xdd\xcf\x21\x72\ +\xc4\x31\xa3\x1d\x49\x52\x18\x4b\xf5\xd3\x3b\xda\xc4\x92\x8a\xd3\ +\x33\xa1\xcf\x1c\x63\x2c\x35\x80\x24\x94\x9c\xee\x6c\xc7\xc0\x75\ +\x6d\xb6\xd6\x7e\x99\x6d\xcb\xaf\xa3\x2b\xd2\xc0\x23\xf5\xdf\xa4\ +\x77\xb4\x09\x59\xd2\x50\x64\x7d\x62\xb1\xd5\x2b\x09\xf9\x90\xac\ +\x08\xc6\x86\x4b\xc1\x55\xb2\xd9\x7b\xbd\xd7\x3e\x9d\x28\xc5\xc0\ +\x06\x45\x57\x72\x64\xad\x1b\x5c\x22\x89\x2e\x06\x0e\xb7\xb1\xe7\ +\xc8\x63\xac\xa8\x3c\x87\xad\xcb\xae\x61\x75\xd5\x85\xbc\xb0\xff\ +\x76\x46\xc6\x3b\x3d\x4a\xee\x35\xbc\x6d\x93\x9e\x48\x73\x01\x10\ +\xd3\x4a\xe4\x5a\x39\x96\x9d\x42\x95\x7d\x5c\xb0\xfe\x07\xd4\x2d\ +\x38\x8f\x57\x9b\x7f\x4e\xfd\xe1\x07\x00\x26\x24\xc8\x02\xd3\x6d\ +\x02\xa2\xaa\x6a\xd2\xd1\x52\x4d\x7c\xdc\x8f\xcf\x9f\x06\xd8\x3a\ +\x85\xdb\xae\x96\x0a\x6b\x60\x81\x2c\xa9\xf8\xd4\x30\x92\xa4\xd2\ +\xd4\xfd\x3c\x0f\xec\xbc\x96\xd1\x44\x17\x57\x9d\xfe\x1b\x96\x57\ +\x6e\x27\x65\x8e\xe5\x16\x16\x42\x62\x30\xd6\x5a\x50\x9b\xe0\x81\ +\xb0\x9d\x34\xaa\xe2\xe3\xd3\x9b\x7f\x42\xdd\x82\xf3\x78\x7c\xf7\ +\x0d\xec\x6c\xbd\x17\x45\xd2\xa7\xab\x71\x76\x01\x58\xa6\x42\x62\ +\xdc\x8f\x24\xe5\x22\xd6\x69\x53\x5c\xb3\x22\x1f\xc8\xbe\x63\x34\ +\xc5\x45\x20\xd0\xd5\x22\x1c\xc7\xe2\x99\xc6\x5b\xd9\xd9\xfa\x6b\ +\x2e\xd9\x78\x1b\x1b\x17\x7d\x86\x94\x11\xcb\x9c\x23\x64\xa2\x89\ +\x5e\x1c\x37\x43\x19\x14\x59\x47\x16\x6a\xa6\x4f\x0b\x7c\xe2\xe4\ +\x5b\x58\x5c\x7e\x2a\x4f\xbc\xfb\x1d\x0e\x74\xbf\x88\x5f\x2b\x99\ +\x49\x17\x7f\x87\x24\xb9\x24\x93\x3a\xed\x07\x6b\x50\x54\x0b\x6f\ +\xa0\xb4\x69\x8a\x6b\x16\xe6\x7b\xe5\x7e\xe0\x0a\xe0\x2e\xaf\x61\ +\x07\xb8\x48\x92\x82\x5f\x0a\xf3\xee\xe1\x87\x30\xac\x04\x17\x6d\ +\xb8\x09\x17\x97\x3d\x47\x9e\x40\x95\x7d\xa4\xed\x04\xb6\x6d\x20\ +\x29\x7e\x6f\x7e\xa2\x61\x58\xe3\x7c\x64\xd5\xb7\x58\x36\xef\x6c\ +\x5e\x69\xbe\x93\xe6\x9e\x17\xbc\x52\x77\x5a\x39\x0a\xec\x12\xc2\ +\x25\x11\xf3\xe3\x38\x22\x3f\x7f\xcc\x9f\xe2\xba\x0a\x65\x82\xa1\ +\x3e\xee\xd9\xe8\x83\x5e\x34\xc8\x19\x8d\x5f\x2b\xa1\xe1\xe8\x1f\ +\x09\x6a\xa5\x5c\xb8\xfe\x26\x12\xe9\x08\x07\x7a\x5f\xc2\xb4\x92\ +\x18\x76\x12\x55\xf1\xa3\xc8\x3e\x24\x21\xa8\x9a\xb3\x81\xad\xcb\ +\xae\xa1\x7d\xf0\x6d\x76\x1d\x7e\x10\x9f\x3a\xe3\x61\xd7\x8b\x40\ +\x54\xd5\x4c\x3a\x5a\x6a\x88\xc7\x02\x59\xff\x38\x7d\x9a\xeb\x4a\ +\x25\x5b\x11\xd8\x8a\xc0\x3d\x56\xf9\x7d\x00\x5c\x32\xb1\xdd\x02\ +\xe0\xd3\xc2\xbc\x7d\xe8\x7e\x9a\xbb\x9f\xe3\x92\x4d\xff\x46\x45\ +\x51\x2d\x71\x63\xd8\xf3\x9b\x4c\x24\xf3\x6b\xa5\x6c\x5b\xfe\x35\ +\x04\x82\xd7\x0e\xdc\x0d\x2e\xb3\x19\x0a\xfd\x41\x08\x48\x25\x75\ +\x8e\xb6\x55\x65\xcd\xea\x44\xf9\x23\x5f\x34\x69\xe5\xde\x11\x56\ +\x34\x8c\xa0\xa5\x6d\x2c\x35\xb7\x60\x17\xf0\x59\xa0\x63\x62\x22\ +\x54\x64\x9d\x17\xf7\xff\x84\xa4\x31\xc6\xc5\x1b\x6e\xc6\xb1\x2d\ +\x62\xc9\x81\x8c\x4a\x1d\x87\x75\x35\x17\xb3\xac\x72\x3b\x4d\xdd\ +\xcf\xd2\x3b\xda\x84\xaa\xf8\x67\x0a\xe2\x7d\xe0\x35\x59\x76\x88\ +\x8d\x86\x18\x19\x2c\x46\xce\x10\xc5\xf9\xc0\xe6\xe9\x48\xa0\x54\ +\x36\x90\xa2\xa2\x37\xc9\xea\xf7\x87\x98\x7f\x34\x8e\x2d\xe7\x34\ +\xd3\xe6\x11\xb4\x78\x41\x91\x2f\x69\x8c\xa7\x87\x79\xa5\xe9\xa7\ +\x54\xcf\xd9\xc0\xa6\xc5\x97\x33\x12\xef\xf0\x34\x22\xb1\xae\xe6\ +\x12\x5c\x37\xe3\x43\x42\x52\x66\xc3\x78\xef\x06\x0c\x21\x1c\xf6\ +\xef\x5e\x41\x3a\xa5\x65\x6b\xf2\x33\x3d\x67\x9f\x52\x24\x5b\x16\ +\x58\xaa\x84\x9e\xb4\xa9\x6d\x8e\x50\xd1\x9f\xcc\xd7\xcc\x1b\xc0\ +\xf5\xc7\x99\x98\x1a\xe4\x83\xbe\x97\xe9\x18\xac\xe7\xcc\x15\x7f\ +\x87\x2f\x57\x6f\x08\x24\x49\xa1\x2f\xda\x4c\x5f\xf4\x00\xaa\xe4\ +\x9b\x29\x88\xf7\x80\xdf\x4f\x12\xad\x00\x3e\x3e\x93\x1b\xe4\x9e\ +\xd8\x91\x04\x8e\x24\xa8\x6a\x8f\xa1\x27\xed\x7c\xcd\xdc\xe7\x45\ +\xb2\x82\xcb\x5c\xd7\xe5\xad\xb6\xff\xc1\xaf\x15\x53\x5b\xb9\xdd\ +\x9b\x25\x65\xe4\xc8\xd0\x6e\x2f\x31\xce\xa8\x49\x6d\x03\xdf\x03\ +\x52\x8a\x6a\xd1\xd5\x3e\x9f\x64\xdc\x97\xd5\x46\x18\x38\x77\x56\ +\x40\xb2\x60\x82\x63\x16\x75\x7b\x87\xd1\xd2\x4e\x3e\x98\x1b\x81\ +\xe7\x0b\xb8\x96\xe2\xe7\xe8\xd0\x7b\x1c\x1e\x78\x1b\x4d\x09\x16\ +\x50\xf6\xee\x48\xe3\x6c\x1c\xfc\x76\xe0\x15\x21\x5c\x6c\x4b\xa2\ +\xb1\xbe\x0e\xc7\x25\x4b\x4b\x3e\x02\x2c\x9c\x0d\x90\xab\xb2\x09\ +\xc7\x56\x04\xa1\xa8\x99\x01\x63\x38\x38\x19\x30\x49\x6f\xc6\xb8\ +\xa7\x60\x26\x8f\x45\x63\xe7\xff\x1e\x57\x7c\xa5\xcc\xd8\x4c\xe7\ +\x46\x8f\x01\xb7\x64\x1b\x0c\xfb\xdf\x5b\xc1\x40\x77\x39\xaa\x9a\ +\xab\xc9\xaf\x98\x69\x65\x96\x5d\xed\x0b\x5e\x0c\xbf\x62\x22\x18\ +\xe5\x18\x98\x41\xe0\x33\x40\x63\x2e\xe6\xc9\x7e\x3a\x86\x76\x11\ +\x89\x77\x16\xc4\xb6\xb9\xe1\x65\xb8\xae\x35\xdd\xe2\x8f\x02\x5f\ +\x01\x0c\x55\xb3\x18\x1b\x0d\xb1\xeb\xd5\x93\x91\xe4\x1c\x88\xa5\ +\xc0\x85\x33\x1d\xe5\x4b\xde\xd6\xcd\xf1\x8a\x94\x07\x3d\x7b\xcd\ +\x80\x19\x35\x59\x55\x08\xa6\xdd\xbb\xf9\x2b\xd9\x31\x76\x3c\x1d\ +\xa1\xad\xff\x8d\x82\xbb\x2e\x28\x59\x3d\x55\x75\x98\x06\x7e\x08\ +\x5c\x09\x8c\x4b\xb2\x43\x3c\x16\xe0\xa5\x27\xb7\x61\x9a\x32\x92\ +\x94\xf3\xb5\x6b\x81\x99\x66\xd2\x51\xc9\x1b\x82\x2e\xcd\x33\xb5\ +\x7f\x07\xfe\x39\x1f\xcc\x04\xcd\x74\x03\x9f\xf4\x4c\x22\x2a\x49\ +\x32\x87\xfa\x77\x14\xdc\xb5\xb2\x64\x15\x3e\xad\xa8\x60\x82\xe5\ +\x35\x38\x9e\x04\xb6\x03\x37\x67\x27\x4e\x3e\x9f\xc1\xde\xb7\x56\ +\xd3\xd5\x5e\x99\xad\xcb\xb3\x33\xcd\x6b\x67\x11\xba\x07\x25\x60\ +\xb9\x57\xb4\xe4\xcb\x6d\xc0\x3f\x64\xc1\x84\x47\x4d\xea\x1a\x32\ +\x60\xbc\x00\x10\x07\x6e\x02\x4e\x53\x24\xfd\x96\xfe\xb1\x83\xef\ +\x0e\x8f\x77\x44\x1d\xd7\x76\x1c\xc7\x22\xec\xaf\xa4\x34\xb8\x30\ +\xe1\x38\x66\x9f\x17\xc2\x7f\x04\x9c\x05\x7c\xda\xeb\x80\x20\x49\ +\x0e\x81\x60\x8a\x86\xfa\x3a\xf6\xbf\xb7\x0c\x5f\x20\x95\xbf\xfe\ +\xf7\x80\x79\xb3\x99\x5e\x29\xc0\xaa\x13\x78\xe6\x9d\xde\x2b\x47\ +\xbf\xb7\x14\x41\x38\x62\xb0\xb2\x71\x84\xb6\xba\x12\x52\x41\x05\ +\xc9\x76\x01\x3e\x10\x42\xba\x29\x6d\x27\x6f\xe9\x1b\x6d\xaa\xd5\ +\x15\xff\x3c\xd3\x4a\x15\xdb\x8e\x95\xd2\x95\xe0\x90\x8b\xdb\xe3\ +\xbd\xca\x74\x2c\xba\x48\x0e\xba\xdf\x60\x2c\x52\xc4\x9b\xcf\x6d\ +\xa1\x65\xdf\xd2\x5c\x57\xdf\x93\x33\x80\xeb\x66\xd9\x3e\x3a\xa4\ +\x00\x6b\x4f\xd4\x63\xf0\x7a\x47\xe3\xc0\x53\x96\x22\x51\x34\x6a\ +\xb0\xe1\x9d\x01\x0e\xd7\x95\xd0\x53\x13\x42\xb6\x9d\x4c\x1e\x74\ +\x84\x2d\x10\x07\x81\x83\xc7\x66\x51\x6e\xde\xe8\xc1\x45\x51\x6d\ +\x14\xd5\x22\x3a\x52\xc4\x3b\xaf\x6c\xa4\xaf\xb3\x82\x9e\xa3\xf3\ +\xd0\x7d\x46\xbe\x5f\x94\x01\xbf\xf4\xde\xfd\x9a\x8d\x34\x2b\xc0\ +\x54\x6f\xb3\x04\x80\xdf\x79\xa1\xf7\x4f\x8e\x24\x10\x2e\x2c\xf9\ +\x20\x4a\x78\x24\x4d\xb4\x4c\x27\x5a\xac\x62\xaa\x02\x34\x1d\x21\ +\x1d\xdf\x7d\xd1\x74\x13\xd3\x50\x38\xb0\xb7\x96\x81\x9e\x32\x86\ +\xfb\x4b\xe9\x6a\x9f\x8f\xaa\x99\x59\x66\x9b\x23\x0c\x5e\xf2\x5d\ +\x3b\x4b\x10\x29\xa0\x49\x01\xaa\xa7\x39\x31\x0c\x3c\x04\xfc\x23\ +\xf0\x1b\xd7\x33\x81\x79\x3d\x09\xca\xfb\x92\xb8\x02\x62\x01\x17\ +\x3b\xbc\x07\x7b\xf3\x2a\x64\x5f\x08\x27\x15\x45\x51\x1c\xfc\x81\ +\x14\x6d\x4d\xab\xd9\xf3\xf6\x6a\x06\xba\xcb\x71\x1c\x81\xa2\xd8\ +\xf8\x0b\xfd\x01\xcf\x1f\x7e\xe5\xb1\xee\xd9\x4a\x1b\x70\x58\x99\ +\x09\x21\xf3\x3a\x7c\xf7\x01\x6b\xbc\x88\x33\x66\x29\xc7\xdc\xaa\ +\x78\xdc\x25\xf2\xe4\x5d\x24\x76\xbf\x48\xe5\xb6\x2f\x51\xbc\x72\ +\x13\xa3\x91\x20\xaf\x3d\xbf\x95\xd6\x86\xb5\x58\xa6\x8c\xaa\x99\ +\x27\x6a\x31\x7e\xc2\x0b\x2e\xab\x3f\xe4\x98\x7a\x07\x90\x16\xaf\ +\x7f\xbf\x76\xc0\x7b\xa9\x66\xa6\xb2\xd7\x0b\xd1\x7f\x9c\xd8\x66\ +\x75\xcc\x14\xba\x64\xd0\x14\xba\x8c\x5f\xec\xde\x48\x72\x34\x8d\ +\xa6\xdb\x05\x93\x25\xaf\xeb\xb1\xd0\x2b\x96\x2e\x07\x3e\xfa\x17\ +\xce\xdb\x2f\x05\xfe\xa8\x4c\x35\x4e\x38\x81\x6c\x00\x7e\xef\x01\ +\xfa\xb3\xb7\x23\x87\x80\x36\x49\xf5\xa1\x2b\x0e\xad\x2d\x83\x44\ +\xa3\x36\x45\xbe\xdc\xad\x2b\x3d\x3f\x3b\x1b\xa8\xf3\xcc\x59\xe5\ +\x2f\x97\x0e\xe0\xb5\xec\xc4\xea\xc8\x34\xf5\xf0\x54\x80\x36\x78\ +\x9f\xff\x03\xf8\xbe\xc0\x25\x6e\xfb\x39\x94\x5c\x8c\x7e\x8c\x2f\ +\x95\x01\xcf\x79\x75\xf7\x5f\x5b\x1e\x02\xa2\xd9\x4c\xfe\xdb\xbf\ +\xf0\x66\x0f\x7b\x36\x8e\x2c\x1c\x22\x46\x11\x6d\xe3\x0b\x50\x84\ +\x95\xef\xc8\x7f\x0b\x10\x11\xe0\x9e\x7c\xf6\x7b\xaf\xb7\xa3\x1f\ +\xe6\x5d\x90\x6f\x7b\x9c\x29\x9a\x21\x91\x26\xf5\xc3\x75\x8c\x9b\ +\x7e\xa4\x63\x7e\x71\x08\x78\xfd\x6f\x00\xe4\x0e\xcf\x9a\x72\x40\ +\x6c\xe0\xfb\xc0\x45\x9e\x09\xc4\xa7\xb8\x38\xe6\x51\x8e\x1b\x80\ +\x53\xbd\xec\x5f\x40\xa8\x2c\x57\xf6\x06\xc9\x05\x24\xf1\xab\x40\ +\xf3\x5f\x11\xc4\x6b\xde\xda\xc7\x4a\xf0\xbc\xcf\xcf\x78\xc7\x4a\ +\xcf\x14\x16\x7a\x39\xc4\xf6\x28\x7c\xa7\xd7\xfb\x6a\x9f\x6a\x04\ +\x25\x26\xff\xab\x15\x38\xcf\x9b\x36\x5d\xcd\xac\xdf\x0f\x3b\xae\ +\x2c\xbe\x7a\x62\xc4\x9c\xac\x3b\xf0\x81\x77\xfc\xb5\xa5\x1b\xf8\ +\x3a\xf0\x5f\xc0\x65\xc0\x05\xc0\x3a\x32\xaf\xa3\xcf\x44\xc6\x81\ +\x07\x3c\xb2\x3a\x38\xf1\x4f\x85\xff\x7f\x69\xf2\x8e\x1f\x7b\xf4\ +\x68\xbd\x47\x5c\x17\x93\x79\x39\xb4\xc8\x1b\x78\x1a\x9e\x43\x77\ +\x7b\xa1\xfe\x35\xe0\xc0\x89\x6e\xfa\x7f\x03\x00\x16\xc1\xec\x18\ +\x22\x48\x5b\x85\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\ +\x00\x00\x03\x8e\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01\x42\x28\x9b\x78\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\ +\x25\x00\x00\x80\x83\x00\x00\xf9\xff\x00\x00\x80\xe9\x00\x00\x75\ +\x30\x00\x00\xea\x60\x00\x00\x3a\x98\x00\x00\x17\x6f\x92\x5f\xc5\ +\x46\x00\x00\x03\x14\x49\x44\x41\x54\x78\xda\xb4\x95\x4d\x68\x94\ +\x57\x14\x86\x9f\x7b\xbf\xef\x1b\x4d\x93\x89\x13\xa6\x64\x66\x12\ +\x23\xc9\xd4\x62\x54\x34\x25\x85\xfe\x8c\x94\x42\xbb\x28\x52\xa1\ +\x16\xa4\x52\x4a\x88\x68\xb4\xab\x52\x25\x43\x71\x5b\x37\x86\x36\ +\xa5\x5d\x95\x82\xd4\x36\xd5\x95\xab\x16\xba\x10\xb4\x52\x08\x95\ +\x0a\x4a\xb1\x41\xac\x1a\x13\x1d\xcc\x64\x34\xf3\xf3\x25\x33\x75\ +\x66\xbe\x9f\x7b\xbb\x08\x26\xd4\x9f\x34\x33\x8d\xef\xea\xc0\xe5\ +\x9e\x73\xcf\xfb\xbe\xe7\x5c\xa1\xb5\xe6\x69\x42\xf2\x94\x61\x3e\ +\x08\xde\xd8\x33\x98\x71\x5d\x2f\xb2\x12\x49\x2d\xcb\xbc\x7b\xee\ +\xfb\x2f\xa2\xff\x2a\xe0\xba\x5e\x64\x78\x78\x78\x45\x5e\x9d\x4c\ +\x26\x23\x8f\x74\x00\x30\x31\x39\xc1\xf1\xe3\xdf\x51\x29\x97\xe7\ +\x0f\x4d\x8b\x03\x1f\xee\x27\xde\x15\x67\x64\x64\x84\xb1\xb1\xb1\ +\x25\x13\x6f\xdc\xb4\x89\x7d\x7b\xf7\x2e\xad\x81\xe7\x7a\x8b\xad\ +\x9a\x8b\xf5\x3d\xdf\xff\x6f\xbe\x0d\xe3\xc9\x1a\x00\xc4\xbb\xe2\ +\x0c\x0d\x1d\x7d\xec\xe5\x87\x5f\x56\xb3\xc8\x96\x65\xaa\x64\x32\ +\x29\x57\x48\x64\xf5\x48\x01\xd7\xf5\xe4\xa9\xe1\xc3\x2b\x22\xf2\ +\x7b\xc9\x21\xf9\x58\x8a\x00\x0e\x7d\x76\x8c\xa9\x7b\x39\x00\xda\ +\x5b\xc3\x7c\xf9\xc9\x7e\x00\xce\x5f\xfe\x8b\xaf\x4e\xfc\xb8\x64\ +\xe2\x83\x7d\x3b\x49\xf4\x74\x3f\x59\x03\x60\x21\xe1\xc3\x48\xf4\ +\x74\x93\xe8\x39\x5c\xbf\x06\xf5\xc0\x55\x2e\xb7\xca\xb7\xa8\xde\ +\xaf\x12\x14\x41\xa2\xa1\x28\xab\xcc\x55\x00\x1c\xf9\xf4\xc8\xff\ +\xa3\xc8\x0a\x55\x88\x6d\xd5\x3c\xd7\x1c\x45\x36\x48\x3c\xe5\x51\ +\x29\xba\xbc\xb3\x79\xc7\xbc\xad\xc5\xbc\xdd\xc5\x83\x65\xf7\xda\ +\x07\x1f\xeb\xe5\x8a\x9c\x9d\xcb\x72\xe6\xea\x19\x3a\xd7\x75\x32\ +\x39\x3b\x49\xa1\x50\xc0\xf7\x7d\x1a\x1a\x1a\x28\xce\x16\xb9\xf8\ +\x4b\x99\x58\x77\x5e\xd4\x4d\xd1\x95\xd4\x15\xda\xd7\xad\xe5\x66\ +\x7e\x9c\x72\xbe\xc2\xf6\x8d\xdb\x69\x0a\x34\x31\x7a\x6d\x94\x92\ +\x2a\x61\xae\xf6\x50\x52\xd5\x4e\xd1\xb1\x9f\x4f\x81\x54\x74\xad\ +\x6f\x26\x91\xd8\x4a\xc1\xb6\xb9\x7c\x69\x9a\xf3\xa3\x27\xa8\xcc\ +\x05\xf8\xe8\xfd\x77\x89\x75\xc4\xb8\x70\xf6\x57\xa4\x90\xb5\xbb\ +\x68\xa2\x14\xc7\x6a\xb2\x08\x36\x07\xc9\x96\xb2\xac\x09\xad\xa1\ +\xf7\x65\x83\x62\xbe\xc8\xc0\xeb\x03\xdc\xc8\xdc\xe0\x6a\xf6\x3a\ +\x2d\x6d\x15\x84\x16\x42\x48\xa1\x6b\x9a\xdc\xdd\xaf\xec\x46\x57\ +\x35\x33\xc5\x19\x84\x14\x98\x86\x89\x72\x14\xfd\xdb\xfa\x19\xbf\ +\x3b\x4e\x5e\x17\x88\x75\x44\xd9\xf2\x52\x14\x69\xc8\xcf\xb5\xd6\ +\xb2\x66\x17\x09\xa9\x89\xac\x2f\xb3\xe5\xc5\x0e\xd2\x77\x66\xb8\ +\x7e\xd1\xe7\x8f\x0b\xdf\xb0\xe3\xed\x17\x08\x04\x03\x64\xe7\x72\ +\x84\xc3\x61\x94\x52\x83\xa9\xdb\xa9\x67\xea\x72\x91\xe3\x39\x9c\ +\xfe\xf3\x34\xbd\x9d\xbd\xb4\xb5\xb4\x71\xf2\xb7\x93\x18\x86\x41\ +\xce\xcd\x11\x89\x45\x98\xba\x93\xc1\xb6\x73\x67\xab\x4e\x55\xd6\ +\xb5\xdc\x1c\xcf\xc1\xd7\x3e\xa9\x5c\x0a\x21\x04\x7d\xdb\xfa\xd8\ +\x10\xd9\x80\x16\x1a\x29\x25\x99\xe9\x3c\xf9\xbf\xf3\x3b\x3d\xe5\ +\xbd\xb5\xd0\xc1\x9b\x7b\x06\x33\xce\x32\xbf\x4c\xc3\x54\x74\xbf\ +\xaa\x78\xb6\xb5\x85\xc9\x6b\x59\x94\xaf\x59\x1b\x0f\xd1\xd6\x1e\ +\xa5\x54\x2c\x71\xe9\xf7\xdb\xf7\xbd\x48\xa6\x31\xe4\x85\x16\x07\ +\x6d\x39\xe8\x3f\xda\xbf\x10\xab\x80\xda\xd7\x1a\x6d\xfd\x3a\x1c\ +\x0e\x07\x02\x81\x00\x00\xb6\x6d\x93\x9e\x4a\x9f\x13\x86\xd8\x65\ +\x5a\x66\xc1\xa9\x3a\xf5\xef\x22\x21\xc4\xb7\xe9\xe9\xf4\x4d\xbb\ +\x60\x0f\x98\x96\xf9\xbc\x52\xaa\x58\x29\x57\x7e\xf2\x3c\xef\x87\ +\xc6\x60\xe3\xac\x40\x00\xf0\xcf\x00\xe0\xe8\x5f\x8e\x9d\x28\xd2\ +\xfe\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +" + +qt_resource_name = b"\ +\x00\x07\ +\x07\x3b\xe0\xb3\ +\x00\x70\ +\x00\x6c\x00\x75\x00\x67\x00\x69\x00\x6e\x00\x73\ +\x00\x05\ +\x00\x4a\x66\xf5\ +\x00\x43\ +\x00\x6f\x00\x70\x00\x69\x00\x65\ +\x00\x09\ +\x05\x84\x84\xc7\ +\x00\x63\ +\x00\x65\x00\x6e\x00\x72\x00\x61\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x0f\ +\x04\xa3\x0a\x67\ +\x00\x74\ +\x00\x61\x00\x62\x00\x6c\x00\x65\x00\x5f\x00\x63\x00\x6f\x00\x70\x00\x69\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ +" + +qt_resource_struct_v1 = b"\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ +\x00\x00\x00\x14\x00\x02\x00\x00\x00\x02\x00\x00\x00\x03\ +\x00\x00\x00\x3c\x00\x00\x00\x00\x00\x01\x00\x00\x13\x75\ +\x00\x00\x00\x24\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +" + +qt_resource_struct_v2 = b"\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x14\x00\x02\x00\x00\x00\x02\x00\x00\x00\x03\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x3c\x00\x00\x00\x00\x00\x01\x00\x00\x13\x75\ +\x00\x00\x01\x8d\xac\xb3\xc8\x10\ +\x00\x00\x00\x24\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x01\x8d\xac\xb4\x4d\x47\ +" + +qt_version = [int(v) for v in QtCore.qVersion().split('.')] +if qt_version < [5, 8, 0]: + rcc_version = 1 + qt_resource_struct = qt_resource_struct_v1 +else: + rcc_version = 2 + qt_resource_struct = qt_resource_struct_v2 + +def qInitResources(): + QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) + +def qCleanupResources(): + QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) + +qInitResources() diff --git a/CenRa_COPIE/resources_rc.py.bak b/CenRa_COPIE/resources_rc.py.bak new file mode 100644 index 00000000..a838d075 --- /dev/null +++ b/CenRa_COPIE/resources_rc.py.bak @@ -0,0 +1,102 @@ +# -*- coding: utf-8 -*- + +# Resource object code +# +# Created: mar. 14. avr. 11:48:28 2015 +# by: The Resource Compiler for PyQt (Qt v4.8.5) +# +# WARNING! All changes made in this file will be lost! + +from PyQt4 import QtCore + +qt_resource_data = "\ +\x00\x00\x03\x8e\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01\x42\x28\x9b\x78\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\ +\x25\x00\x00\x80\x83\x00\x00\xf9\xff\x00\x00\x80\xe9\x00\x00\x75\ +\x30\x00\x00\xea\x60\x00\x00\x3a\x98\x00\x00\x17\x6f\x92\x5f\xc5\ +\x46\x00\x00\x03\x14\x49\x44\x41\x54\x78\xda\xb4\x95\x4d\x68\x94\ +\x57\x14\x86\x9f\x7b\xbf\xef\x1b\x4d\x93\x89\x13\xa6\x64\x66\x12\ +\x23\xc9\xd4\x62\x54\x34\x25\x85\xfe\x8c\x94\x42\xbb\x28\x52\xa1\ +\x16\xa4\x52\x4a\x88\x68\xb4\xab\x52\x25\x43\x71\x5b\x37\x86\x36\ +\xa5\x5d\x95\x82\xd4\x36\xd5\x95\xab\x16\xba\x10\xb4\x52\x08\x95\ +\x0a\x4a\xb1\x41\xac\x1a\x13\x1d\xcc\x64\x34\xf3\xf3\x25\x33\x75\ +\x66\xbe\x9f\x7b\xbb\x08\x26\xd4\x9f\x34\x33\x8d\xef\xea\xc0\xe5\ +\x9e\x73\xcf\xfb\xbe\xe7\x5c\xa1\xb5\xe6\x69\x42\xf2\x94\x61\x3e\ +\x08\xde\xd8\x33\x98\x71\x5d\x2f\xb2\x12\x49\x2d\xcb\xbc\x7b\xee\ +\xfb\x2f\xa2\xff\x2a\xe0\xba\x5e\x64\x78\x78\x78\x45\x5e\x9d\x4c\ +\x26\x23\x8f\x74\x00\x30\x31\x39\xc1\xf1\xe3\xdf\x51\x29\x97\xe7\ +\x0f\x4d\x8b\x03\x1f\xee\x27\xde\x15\x67\x64\x64\x84\xb1\xb1\xb1\ +\x25\x13\x6f\xdc\xb4\x89\x7d\x7b\xf7\x2e\xad\x81\xe7\x7a\x8b\xad\ +\x9a\x8b\xf5\x3d\xdf\xff\x6f\xbe\x0d\xe3\xc9\x1a\x00\xc4\xbb\xe2\ +\x0c\x0d\x1d\x7d\xec\xe5\x87\x5f\x56\xb3\xc8\x96\x65\xaa\x64\x32\ +\x29\x57\x48\x64\xf5\x48\x01\xd7\xf5\xe4\xa9\xe1\xc3\x2b\x22\xf2\ +\x7b\xc9\x21\xf9\x58\x8a\x00\x0e\x7d\x76\x8c\xa9\x7b\x39\x00\xda\ +\x5b\xc3\x7c\xf9\xc9\x7e\x00\xce\x5f\xfe\x8b\xaf\x4e\xfc\xb8\x64\ +\xe2\x83\x7d\x3b\x49\xf4\x74\x3f\x59\x03\x60\x21\xe1\xc3\x48\xf4\ +\x74\x93\xe8\x39\x5c\xbf\x06\xf5\xc0\x55\x2e\xb7\xca\xb7\xa8\xde\ +\xaf\x12\x14\x41\xa2\xa1\x28\xab\xcc\x55\x00\x1c\xf9\xf4\xc8\xff\ +\xa3\xc8\x0a\x55\x88\x6d\xd5\x3c\xd7\x1c\x45\x36\x48\x3c\xe5\x51\ +\x29\xba\xbc\xb3\x79\xc7\xbc\xad\xc5\xbc\xdd\xc5\x83\x65\xf7\xda\ +\x07\x1f\xeb\xe5\x8a\x9c\x9d\xcb\x72\xe6\xea\x19\x3a\xd7\x75\x32\ +\x39\x3b\x49\xa1\x50\xc0\xf7\x7d\x1a\x1a\x1a\x28\xce\x16\xb9\xf8\ +\x4b\x99\x58\x77\x5e\xd4\x4d\xd1\x95\xd4\x15\xda\xd7\xad\xe5\x66\ +\x7e\x9c\x72\xbe\xc2\xf6\x8d\xdb\x69\x0a\x34\x31\x7a\x6d\x94\x92\ +\x2a\x61\xae\xf6\x50\x52\xd5\x4e\xd1\xb1\x9f\x4f\x81\x54\x74\xad\ +\x6f\x26\x91\xd8\x4a\xc1\xb6\xb9\x7c\x69\x9a\xf3\xa3\x27\xa8\xcc\ +\x05\xf8\xe8\xfd\x77\x89\x75\xc4\xb8\x70\xf6\x57\xa4\x90\xb5\xbb\ +\x68\xa2\x14\xc7\x6a\xb2\x08\x36\x07\xc9\x96\xb2\xac\x09\xad\xa1\ +\xf7\x65\x83\x62\xbe\xc8\xc0\xeb\x03\xdc\xc8\xdc\xe0\x6a\xf6\x3a\ +\x2d\x6d\x15\x84\x16\x42\x48\xa1\x6b\x9a\xdc\xdd\xaf\xec\x46\x57\ +\x35\x33\xc5\x19\x84\x14\x98\x86\x89\x72\x14\xfd\xdb\xfa\x19\xbf\ +\x3b\x4e\x5e\x17\x88\x75\x44\xd9\xf2\x52\x14\x69\xc8\xcf\xb5\xd6\ +\xb2\x66\x17\x09\xa9\x89\xac\x2f\xb3\xe5\xc5\x0e\xd2\x77\x66\xb8\ +\x7e\xd1\xe7\x8f\x0b\xdf\xb0\xe3\xed\x17\x08\x04\x03\x64\xe7\x72\ +\x84\xc3\x61\x94\x52\x83\xa9\xdb\xa9\x67\xea\x72\x91\xe3\x39\x9c\ +\xfe\xf3\x34\xbd\x9d\xbd\xb4\xb5\xb4\x71\xf2\xb7\x93\x18\x86\x41\ +\xce\xcd\x11\x89\x45\x98\xba\x93\xc1\xb6\x73\x67\xab\x4e\x55\xd6\ +\xb5\xdc\x1c\xcf\xc1\xd7\x3e\xa9\x5c\x0a\x21\x04\x7d\xdb\xfa\xd8\ +\x10\xd9\x80\x16\x1a\x29\x25\x99\xe9\x3c\xf9\xbf\xf3\x3b\x3d\xe5\ +\xbd\xb5\xd0\xc1\x9b\x7b\x06\x33\xce\x32\xbf\x4c\xc3\x54\x74\xbf\ +\xaa\x78\xb6\xb5\x85\xc9\x6b\x59\x94\xaf\x59\x1b\x0f\xd1\xd6\x1e\ +\xa5\x54\x2c\x71\xe9\xf7\xdb\xf7\xbd\x48\xa6\x31\xe4\x85\x16\x07\ +\x6d\x39\xe8\x3f\xda\xbf\x10\xab\x80\xda\xd7\x1a\x6d\xfd\x3a\x1c\ +\x0e\x07\x02\x81\x00\x00\xb6\x6d\x93\x9e\x4a\x9f\x13\x86\xd8\x65\ +\x5a\x66\xc1\xa9\x3a\xf5\xef\x22\x21\xc4\xb7\xe9\xe9\xf4\x4d\xbb\ +\x60\x0f\x98\x96\xf9\xbc\x52\xaa\x58\x29\x57\x7e\xf2\x3c\xef\x87\ +\xc6\x60\xe3\xac\x40\x00\xf0\xcf\x00\xe0\xe8\x5f\x8e\x9d\x28\xd2\ +\xfe\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +" + +qt_resource_name = "\ +\x00\x07\ +\x07\x3b\xe0\xb3\ +\x00\x70\ +\x00\x6c\x00\x75\x00\x67\x00\x69\x00\x6e\x00\x73\ +\x00\x05\ +\x00\x4a\x66\xf5\ +\x00\x43\ +\x00\x6f\x00\x70\x00\x69\x00\x65\ +\x00\x0f\ +\x04\xa3\x0a\x67\ +\x00\x74\ +\x00\x61\x00\x62\x00\x6c\x00\x65\x00\x5f\x00\x63\x00\x6f\x00\x70\x00\x69\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ +" + +qt_resource_struct = "\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ +\x00\x00\x00\x14\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\ +\x00\x00\x00\x24\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +" + +def qInitResources(): + QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) + +def qCleanupResources(): + QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) + +qInitResources() diff --git a/CenRa_COPIE/resources_rc.qrc b/CenRa_COPIE/resources_rc.qrc new file mode 100644 index 00000000..2736e439 --- /dev/null +++ b/CenRa_COPIE/resources_rc.qrc @@ -0,0 +1,6 @@ + + + table_copie.png + cenra.png + + diff --git a/CenRa_COPIE/scripts/compile-strings.sh b/CenRa_COPIE/scripts/compile-strings.sh new file mode 100644 index 00000000..9d760831 --- /dev/null +++ b/CenRa_COPIE/scripts/compile-strings.sh @@ -0,0 +1,12 @@ +#!/bin/bash +LRELEASE=$1 +LOCALES=$2 + + +for LOCALE in ${LOCALES} +do + echo "Processing: ${LOCALE}.ts" + # Note we don't use pylupdate with qt .pro file approach as it is flakey + # about what is made available. + $LRELEASE i18n/${LOCALE}.ts +done diff --git a/CenRa_COPIE/scripts/run-env-linux.sh b/CenRa_COPIE/scripts/run-env-linux.sh new file mode 100644 index 00000000..668247c5 --- /dev/null +++ b/CenRa_COPIE/scripts/run-env-linux.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +QGIS_PREFIX_PATH=/usr/local/qgis-2.0 +if [ -n "$1" ]; then + QGIS_PREFIX_PATH=$1 +fi + +echo ${QGIS_PREFIX_PATH} + + +export QGIS_PREFIX_PATH=${QGIS_PREFIX_PATH} +export QGIS_PATH=${QGIS_PREFIX_PATH} +export LD_LIBRARY_PATH=${QGIS_PREFIX_PATH}/lib +export PYTHONPATH=${QGIS_PREFIX_PATH}/share/qgis/python:${QGIS_PREFIX_PATH}/share/qgis/python/plugins:${PYTHONPATH} + +echo "QGIS PATH: $QGIS_PREFIX_PATH" +export QGIS_DEBUG=0 +export QGIS_LOG_FILE=/tmp/inasafe/realtime/logs/qgis.log + +export PATH=${QGIS_PREFIX_PATH}/bin:$PATH + +echo "This script is intended to be sourced to set up your shell to" +echo "use a QGIS 2.0 built in $QGIS_PREFIX_PATH" +echo +echo "To use it do:" +echo "source $BASH_SOURCE /your/optional/install/path" +echo +echo "Then use the make file supplied here e.g. make guitest" diff --git a/CenRa_COPIE/scripts/update-strings.sh b/CenRa_COPIE/scripts/update-strings.sh new file mode 100644 index 00000000..03dcfd78 --- /dev/null +++ b/CenRa_COPIE/scripts/update-strings.sh @@ -0,0 +1,56 @@ +#!/bin/bash +LOCALES=$* + +# Get newest .py files so we don't update strings unnecessarily + +CHANGED_FILES=0 +PYTHON_FILES=`find . -regex ".*\(ui\|py\)$" -type f` +for PYTHON_FILE in $PYTHON_FILES +do + CHANGED=$(stat -c %Y $PYTHON_FILE) + if [ ${CHANGED} -gt ${CHANGED_FILES} ] + then + CHANGED_FILES=${CHANGED} + fi +done + +# Qt translation stuff +# for .ts file +UPDATE=false +for LOCALE in ${LOCALES} +do + TRANSLATION_FILE="i18n/$LOCALE.ts" + if [ ! -f ${TRANSLATION_FILE} ] + then + # Force translation string collection as we have a new language file + touch ${TRANSLATION_FILE} + UPDATE=true + break + fi + + MODIFICATION_TIME=$(stat -c %Y ${TRANSLATION_FILE}) + if [ ${CHANGED_FILES} -gt ${MODIFICATION_TIME} ] + then + # Force translation string collection as a .py file has been updated + UPDATE=true + break + fi +done + +if [ ${UPDATE} == true ] +# retrieve all python files +then + print ${PYTHON_FILES} + # update .ts + echo "Please provide translations by editing the translation files below:" + for LOCALE in ${LOCALES} + do + echo "i18n/"${LOCALE}".ts" + # Note we don't use pylupdate with qt .pro file approach as it is flakey + # about what is made available. + pylupdate4 -noobsolete ${PYTHON_FILES} -ts i18n/${LOCALE}.ts + done +else + echo "No need to edit any translation files (.ts) because no python files" + echo "has been updated since the last update translation. " +fi diff --git a/CenRa_COPIE/table_copie.png b/CenRa_COPIE/table_copie.png new file mode 100644 index 00000000..861eb41b Binary files /dev/null and b/CenRa_COPIE/table_copie.png differ diff --git a/CenRa_FLUX/.gitattributes b/CenRa_FLUX/.gitattributes new file mode 100644 index 00000000..dfe07704 --- /dev/null +++ b/CenRa_FLUX/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/CenRa_FLUX/LICENSE b/CenRa_FLUX/LICENSE new file mode 100644 index 00000000..f288702d --- /dev/null +++ b/CenRa_FLUX/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/CenRa_FLUX/Makefile b/CenRa_FLUX/Makefile new file mode 100644 index 00000000..406f962a --- /dev/null +++ b/CenRa_FLUX/Makefile @@ -0,0 +1,244 @@ +#/*************************************************************************** +# FluxCEN +# +# Flux IGN etc etc +# ------------------- +# begin : 2022-04-04 +# git sha : $Format:%H$ +# copyright : (C) 2022 by Romain Montillet +# email : r.montillet@cen-na.org +# ***************************************************************************/ +# +#/*************************************************************************** +# * * +# * 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. * +# * * +# ***************************************************************************/ + +################################################# +# Edit the following to match your sources lists +################################################# + + +#Add iso code for any locales you want to support here (space separated) +# default is no locales +# LOCALES = af +LOCALES = + +# If locales are enabled, set the name of the lrelease binary on your system. If +# you have trouble compiling the translations, you may have to specify the full path to +# lrelease +#LRELEASE = lrelease +#LRELEASE = lrelease-qt4 + + +# translation +SOURCES = \ + __init__.py \ + FluxCEN.py FluxCEN_dialog.py + +PLUGINNAME = FluxCEN + +PY_FILES = \ + __init__.py \ + FluxCEN.py FluxCEN_dialog.py + +UI_FILES = FluxCEN_dialog_base.ui + +EXTRAS = metadata.txt icon.png + +EXTRA_DIRS = + +COMPILED_RESOURCE_FILES = resources.py + +PEP8EXCLUDE=pydev,resources.py,conf.py,third_party,ui + +# QGISDIR points to the location where your plugin should be installed. +# This varies by platform, relative to your HOME directory: +# * Linux: +# .local/share/QGIS/QGIS3/profiles/default/python/plugins/ +# * Mac OS X: +# Library/Application Support/QGIS/QGIS3/profiles/default/python/plugins +# * Windows: +# AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins' + +QGISDIR=C:\Users\Romain\AppData/Roaming/QGIS/QGIS3/profiles/default/python/plugins + +################################################# +# Normally you would not need to edit below here +################################################# + +HELP = help/build/html + +PLUGIN_UPLOAD = $(c)/plugin_upload.py + +RESOURCE_SRC=$(shell grep '^ *@@g;s/.*>//g' | tr '\n' ' ') + +.PHONY: default +default: + @echo While you can use make to build and deploy your plugin, pb_tool + @echo is a much better solution. + @echo A Python script, pb_tool provides platform independent management of + @echo your plugins and runs anywhere. + @echo You can install pb_tool using: pip install pb_tool + @echo See https://g-sherman.github.io/plugin_build_tool/ for info. + +compile: $(COMPILED_RESOURCE_FILES) + +%.py : %.qrc $(RESOURCES_SRC) + pyrcc5 -o $*.py $< + +%.qm : %.ts + $(LRELEASE) $< + +test: compile transcompile + @echo + @echo "----------------------" + @echo "Regression Test Suite" + @echo "----------------------" + + @# Preceding dash means that make will continue in case of errors + @-export PYTHONPATH=`pwd`:$(PYTHONPATH); \ + export QGIS_DEBUG=0; \ + export QGIS_LOG_FILE=/dev/null; \ + nosetests -v --with-id --with-coverage --cover-package=. \ + 3>&1 1>&2 2>&3 3>&- || true + @echo "----------------------" + @echo "If you get a 'no module named qgis.core error, try sourcing" + @echo "the helper script we have provided first then run make test." + @echo "e.g. source run-env-linux.sh ; make test" + @echo "----------------------" + +deploy: compile doc transcompile + @echo + @echo "------------------------------------------" + @echo "Deploying plugin to your .qgis2 directory." + @echo "------------------------------------------" + # The deploy target only works on unix like operating system where + # the Python plugin directory is located at: + # $HOME/$(QGISDIR)/python/plugins + mkdir -p $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vf $(PY_FILES) $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vf $(UI_FILES) $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vf $(COMPILED_RESOURCE_FILES) $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vf $(EXTRAS) $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vfr i18n $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vfr $(HELP) $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME)/help + # Copy extra directories if any + (foreach EXTRA_DIR,(EXTRA_DIRS), cp -R (EXTRA_DIR) (HOME)/(QGISDIR)/python/plugins/(PLUGINNAME)/;) + + +# The dclean target removes compiled python files from plugin directory +# also deletes any .git entry +dclean: + @echo + @echo "-----------------------------------" + @echo "Removing any compiled python files." + @echo "-----------------------------------" + find $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) -iname "*.pyc" -delete + find $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) -iname ".git" -prune -exec rm -Rf {} \; + + +derase: + @echo + @echo "-------------------------" + @echo "Removing deployed plugin." + @echo "-------------------------" + rm -Rf $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + +zip: deploy dclean + @echo + @echo "---------------------------" + @echo "Creating plugin zip bundle." + @echo "---------------------------" + # The zip target deploys the plugin and creates a zip file with the deployed + # content. You can then upload the zip file on http://plugins.qgis.org + rm -f $(PLUGINNAME).zip + cd $(HOME)/$(QGISDIR)/python/plugins; zip -9r $(CURDIR)/$(PLUGINNAME).zip $(PLUGINNAME) + +package: compile + # Create a zip package of the plugin named $(PLUGINNAME).zip. + # This requires use of git (your plugin development directory must be a + # git repository). + # To use, pass a valid commit or tag as follows: + # make package VERSION=Version_0.3.2 + @echo + @echo "------------------------------------" + @echo "Exporting plugin to zip package. " + @echo "------------------------------------" + rm -f $(PLUGINNAME).zip + git archive --prefix=$(PLUGINNAME)/ -o $(PLUGINNAME).zip $(VERSION) + echo "Created package: $(PLUGINNAME).zip" + +upload: zip + @echo + @echo "-------------------------------------" + @echo "Uploading plugin to QGIS Plugin repo." + @echo "-------------------------------------" + $(PLUGIN_UPLOAD) $(PLUGINNAME).zip + +transup: + @echo + @echo "------------------------------------------------" + @echo "Updating translation files with any new strings." + @echo "------------------------------------------------" + @chmod +x scripts/update-strings.sh + @scripts/update-strings.sh $(LOCALES) + +transcompile: + @echo + @echo "----------------------------------------" + @echo "Compiled translation files to .qm files." + @echo "----------------------------------------" + @chmod +x scripts/compile-strings.sh + @scripts/compile-strings.sh $(LRELEASE) $(LOCALES) + +transclean: + @echo + @echo "------------------------------------" + @echo "Removing compiled translation files." + @echo "------------------------------------" + rm -f i18n/*.qm + +clean: + @echo + @echo "------------------------------------" + @echo "Removing uic and rcc generated files" + @echo "------------------------------------" + rm $(COMPILED_UI_FILES) $(COMPILED_RESOURCE_FILES) + +doc: + @echo + @echo "------------------------------------" + @echo "Building documentation using sphinx." + @echo "------------------------------------" + cd help; make html + +pylint: + @echo + @echo "-----------------" + @echo "Pylint violations" + @echo "-----------------" + @pylint --reports=n --rcfile=pylintrc . || true + @echo + @echo "----------------------" + @echo "If you get a 'no module named qgis.core' error, try sourcing" + @echo "the helper script we have provided first then run make pylint." + @echo "e.g. source run-env-linux.sh ; make pylint" + @echo "----------------------" + + +# Run pep8 style checking +#http://pypi.python.org/pypi/pep8 +pep8: + @echo + @echo "-----------" + @echo "PEP8 issues" + @echo "-----------" + @pep8 --repeat --ignore=E203,E121,E122,E123,E124,E125,E126,E127,E128 --exclude $(PEP8EXCLUDE) . || true + @echo "-----------" + @echo "Ignored in PEP8 check:" + @echo $(PEP8EXCLUDE) diff --git a/CenRa_FLUX/README.html b/CenRa_FLUX/README.html new file mode 100644 index 00000000..6996c846 --- /dev/null +++ b/CenRa_FLUX/README.html @@ -0,0 +1,42 @@ + + +

Plugin Builder Results

+ +Congratulations! You just built a plugin for QGIS!

+ +
+Your plugin FluxCEN was created in:
+  C:\Users\Romain\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins\fluxcen +

+Your QGIS plugin directory is located at:
+  C:/Users/Romain/AppData/Roaming/QGIS/QGIS3/profiles/default/python/plugins +

+

What's Next

+
    +
  1. If resources.py is not present in your plugin directory, compile the resources file using pyrcc5 (simply use pb_tool or make if you have automake) +
  2. Optionally, test the generated sources using make test (or run tests from your IDE) +
  3. Copy the entire directory containing your new plugin to the QGIS plugin directory (see Notes below) +
  4. Test the plugin by enabling it in the QGIS plugin manager +
  5. Customize it by editing the implementation file FluxCEN.py +
  6. Create your own custom icon, replacing the default icon.png +
  7. Modify your user interface by opening FluxCEN_dialog_base.ui in Qt Designer +
+Notes: +
    +
  • You can use pb_tool to compile, deploy, and manage your plugin. Tweak the pb_tool.cfg file included with your plugin as you add files. Install pb_tool using + pip or easy_install. See http://loc8.cc/pb_tool for more information. +
  • You can also use the Makefile to compile and deploy when you + make changes. This requires GNU make (gmake). The Makefile is ready to use, however you + will have to edit it to add addional Python source files, dialogs, and translations. +
+
+
+

+For information on writing PyQGIS code, see http://loc8.cc/pyqgis_resources for a list of resources. +

+
+

+©2011-2019 GeoApt LLC - geoapt.com +

+ + diff --git a/CenRa_FLUX/README.txt b/CenRa_FLUX/README.txt new file mode 100644 index 00000000..278f7be6 --- /dev/null +++ b/CenRa_FLUX/README.txt @@ -0,0 +1,32 @@ +Plugin Builder Results + +Your plugin FluxCEN was created in: + C:\Users\Romain\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins\fluxcen + +Your QGIS plugin directory is located at: + C:/Users/Romain/AppData/Roaming/QGIS/QGIS3/profiles/default/python/plugins + +What's Next: + + * Copy the entire directory containing your new plugin to the QGIS plugin + directory + + * Compile the resources file using pyrcc5 + + * Run the tests (``make test``) + + * Test the plugin by enabling it in the QGIS plugin manager + + * Customize it by editing the implementation file: ``FluxCEN.py`` + + * Create your own custom icon, replacing the default icon.png + + * Modify your user interface by opening FluxCEN_dialog_base.ui in Qt Designer + + * You can use the Makefile to compile your Ui and resource files when + you make changes. This requires GNU make (gmake) + +For more information, see the PyQGIS Developer Cookbook at: +http://www.qgis.org/pyqgis-cookbook/index.html + +(C) 2011-2018 GeoApt LLC - geoapt.com diff --git a/CenRa_FLUX/forms/about_form.py b/CenRa_FLUX/forms/about_form.py new file mode 100644 index 00000000..131749a2 --- /dev/null +++ b/CenRa_FLUX/forms/about_form.py @@ -0,0 +1,46 @@ +import os.path + +from pathlib import Path + +from qgis.PyQt import uic +from qgis.PyQt.QtGui import QPixmap +from qgis.PyQt.QtWidgets import QDialog + +from ..tools.resources import devlog + +ABOUT_FORM_CLASS, _ = uic.loadUiType( + os.path.join( + str(Path(__file__).resolve().parent.parent), + 'forms', + 'flux_about_form.ui' + ) +) + + +class FluxAboutDialog(QDialog, ABOUT_FORM_CLASS): + + """ About - Let the user display the about dialog. """ + + def __init__(self, iface, parent=None): + super().__init__(parent) + self.iface = iface + self.setupUi(self) + + self.viewer.setHtml(devlog('CenRa_FLUX')) + + self.rejected.connect(self.onReject) + self.buttonBox.rejected.connect(self.onReject) + self.buttonBox.accepted.connect(self.onAccept) + + def onAccept(self): + """ + Save options when pressing OK button + """ + self.accept() + + def onReject(self): + """ + Run some actions when + the user closes the dialog + """ + self.close() \ No newline at end of file diff --git a/CenRa_FLUX/forms/flux_about_form.ui b/CenRa_FLUX/forms/flux_about_form.ui new file mode 100644 index 00000000..1c65e2a6 --- /dev/null +++ b/CenRa_FLUX/forms/flux_about_form.ui @@ -0,0 +1,96 @@ + + + CenRa_Metabase_editorwidget_base + + + + 0 + 0 + 471 + 594 + + + + FLUX + + + + ../../CenRa_Metabase/tools/ui/icon.svg../../CenRa_Metabase/tools/ui/icon.svg + + + + + + true + + + Qt::NoFocus + + + QFrame::NoFrame + + + QFrame::Plain + + + true + + + + + 0 + 0 + 453 + 547 + + + + + + 0 + 0 + 451 + 541 + + + + DevLog + + + + + 10 + 20 + 431 + 511 + + + + + about:blank + + + + + + + + + + + QDialogButtonBox::Ok + + + + + + + + QWebView + QWidget +
QtWebKitWidgets/QWebView
+
+
+ + +
diff --git a/CenRa_FLUX/help/Makefile b/CenRa_FLUX/help/Makefile new file mode 100644 index 00000000..9def777d --- /dev/null +++ b/CenRa_FLUX/help/Makefile @@ -0,0 +1,130 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/template_class.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/template_class.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/template_class" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/template_class" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + make -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/CenRa_FLUX/help/make.bat b/CenRa_FLUX/help/make.bat new file mode 100644 index 00000000..33776100 --- /dev/null +++ b/CenRa_FLUX/help/make.bat @@ -0,0 +1,155 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. changes to make an overview over all changed/added/deprecated items + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\template_class.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\template_class.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +:end diff --git a/CenRa_FLUX/help/source/conf.py b/CenRa_FLUX/help/source/conf.py new file mode 100644 index 00000000..1f00a290 --- /dev/null +++ b/CenRa_FLUX/help/source/conf.py @@ -0,0 +1,216 @@ +# -*- coding: utf-8 -*- +# +# FluxCEN documentation build configuration file, created by +# sphinx-quickstart on Sun Feb 12 17:11:03 2012. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.todo', 'sphinx.ext.imgmath', 'sphinx.ext.viewcode'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'FluxCEN' +copyright = u'2013, Romain Montillet' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0.1' +# The full version, including alpha/beta/rc tags. +release = '0.1' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = [] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_TemplateModuleNames = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'TemplateClassdoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +# The paper size ('letter' or 'a4'). +#latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +#latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'FluxCEN.tex', u'FluxCEN Documentation', + u'Romain Montillet', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'TemplateClass', u'FluxCEN Documentation', + [u'Romain Montillet'], 1) +] diff --git a/CenRa_FLUX/help/source/index.rst b/CenRa_FLUX/help/source/index.rst new file mode 100644 index 00000000..ba3ae4ad --- /dev/null +++ b/CenRa_FLUX/help/source/index.rst @@ -0,0 +1,20 @@ +.. FluxCEN documentation master file, created by + sphinx-quickstart on Sun Feb 12 17:11:03 2012. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to FluxCEN's documentation! +============================================ + +Contents: + +.. toctree:: + :maxdepth: 2 + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/CenRa_FLUX/i18n/af.ts b/CenRa_FLUX/i18n/af.ts new file mode 100644 index 00000000..615a88c3 --- /dev/null +++ b/CenRa_FLUX/i18n/af.ts @@ -0,0 +1,11 @@ + + + + @default + + + Good morning + Goeie more + + + diff --git a/CenRa_FLUX/missing_metadata.html b/CenRa_FLUX/missing_metadata.html new file mode 100644 index 00000000..c1daf80e --- /dev/null +++ b/CenRa_FLUX/missing_metadata.html @@ -0,0 +1,57 @@ + + + + + + + No Metadata + + +
+
+ Another Image +
+
+ Metadata Image +
+
+

Pas de métadonnées encore associées à cette ressource ! Revenez plus tard 😎

+ + diff --git a/CenRa_FLUX/pb_tool.cfg b/CenRa_FLUX/pb_tool.cfg new file mode 100644 index 00000000..63383310 --- /dev/null +++ b/CenRa_FLUX/pb_tool.cfg @@ -0,0 +1,80 @@ +#/*************************************************************************** +# FluxCEN +# +# Configuration file for plugin builder tool (pb_tool) +# Generated by Plugin Builder: http://g-sherman.github.io/Qgis-Plugin-Builder/ +# ------------------- +# begin : 2022-04-04 +# copyright : (C) 2022 by Romain Montillet +# email : r.montillet@cen-na.org +# ***************************************************************************/ +# +#/*************************************************************************** +# * * +# * 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. * +# * * +# ***************************************************************************/ +# +# +# You can install pb_tool using: +# pip install http://geoapt.net/files/pb_tool.zip +# +# Consider doing your development (and install of pb_tool) in a virtualenv. +# +# For details on setting up and using pb_tool, see: +# http://g-sherman.github.io/plugin_build_tool/ +# +# Issues and pull requests here: +# https://github.com/g-sherman/plugin_build_tool: +# +# Sane defaults for your plugin generated by the Plugin Builder are +# already set below. +# +# As you add Python source files and UI files to your plugin, add +# them to the appropriate [files] section below. + +[plugin] +# Name of the plugin. This is the name of the directory that will +# be created in .qgis2/python/plugins +name: FluxCEN + +# Full path to where you want your plugin directory copied. If empty, +# the QGIS default path will be used. Don't include the plugin name in +# the path. +plugin_path: + +[files] +# Python files that should be deployed with the plugin +python_files: __init__.py FluxCEN.py FluxCEN_dialog.py + +# The main dialog file that is loaded (not compiled) +main_dialog: FluxCEN_dialog_base.ui + +# Other ui files for dialogs you create (these will be compiled) +compiled_ui_files: + +# Resource file(s) that will be compiled +resource_files: resources.qrc + +# Other files required for the plugin +extras: metadata.txt icon.png + +# Other directories to be deployed with the plugin. +# These must be subdirectories under the plugin directory +extra_dirs: + +# ISO code(s) for any locales (translations), separated by spaces. +# Corresponding .ts files must exist in the i18n directory +locales: + +[help] +# the built help directory that should be deployed with the plugin +dir: help/build/html +# the name of the directory to target in the deployed plugin +target: help + + + diff --git a/CenRa_FLUX/pylintrc b/CenRa_FLUX/pylintrc new file mode 100644 index 00000000..7e168f64 --- /dev/null +++ b/CenRa_FLUX/pylintrc @@ -0,0 +1,281 @@ +[MASTER] + +# Specify a configuration file. +#rcfile= + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Profiled execution. +profile=no + +# Add files or directories to the blacklist. They should be base names, not +# paths. +ignore=CVS + +# Pickle collected data for later comparisons. +persistent=yes + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + + +[MESSAGES CONTROL] + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time. See also the "--disable" option for examples. +#enable= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once).You can also use "--disable=all" to +# disable everything first and then reenable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use"--disable=all --enable=classes +# --disable=W" +# see http://stackoverflow.com/questions/21487025/pylint-locally-defined-disables-still-give-warnings-how-to-suppress-them +disable=locally-disabled,C0103 + + +[REPORTS] + +# Set the output format. Available formats are text, parseable, colorized, msvs +# (visual studio) and html. You can also give a reporter class, eg +# mypackage.mymodule.MyReporterClass. +output-format=text + +# Put messages in a separate file for each module / package specified on the +# command line instead of printing them on stdout. Reports (if any) will be +# written in a file name "pylint_global.[txt|html]". +files-output=no + +# Tells whether to display a full report or only the messages +reports=yes + +# Python expression which should return a note less than 10 (10 is the highest +# note). You have access to the variables errors warning, statement which +# respectively contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (RP0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Add a comment according to your evaluation note. This is used by the global +# evaluation report (RP0004). +comment=no + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details +#msg-template= + + +[BASIC] + +# Required attributes for module, separated by a comma +required-attributes= + +# List of builtins function names that should not be used, separated by a comma +bad-functions=map,filter,apply,input + +# Regular expression which should only match correct module names +module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Regular expression which should only match correct module level names +const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ + +# Regular expression which should only match correct class names +class-rgx=[A-Z_][a-zA-Z0-9]+$ + +# Regular expression which should only match correct function names +function-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct method names +method-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct instance attribute names +attr-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct argument names +argument-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct variable names +variable-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match correct attribute names in class +# bodies +class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ + +# Regular expression which should only match correct list comprehension / +# generator expression variable names +inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ + +# Good variable names which should always be accepted, separated by a comma +good-names=i,j,k,ex,Run,_ + +# Bad variable names which should always be refused, separated by a comma +bad-names=foo,bar,baz,toto,tutu,tata + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=__.*__ + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=-1 + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME,XXX,TODO + + +[TYPECHECK] + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# List of classes names for which member attributes should not be checked +# (useful for classes with attributes dynamically set). +ignored-classes=SQLObject + +# When zope mode is activated, add a predefined set of Zope acquired attributes +# to generated-members. +zope=no + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E0201 when accessed. Python regular +# expressions are accepted. +generated-members=REQUEST,acl_users,aq_parent + + +[VARIABLES] + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# A regular expression matching the beginning of the name of dummy variables +# (i.e. not used). +dummy-variables-rgx=_$|dummy + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + + +[FORMAT] + +# Maximum number of characters on a single line. +max-line-length=80 + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )??$ + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + +# List of optional constructs for which whitespace checking is disabled +no-space-check=trailing-comma,dict-separator + +# Maximum number of lines in a module +max-module-lines=1000 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + + +[SIMILARITIES] + +# Minimum lines number of a similarity. +min-similarity-lines=4 + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + + +[IMPORTS] + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=regsub,TERMIOS,Bastion,rexec + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled) +import-graph= + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled) +int-import-graph= + + +[DESIGN] + +# Maximum number of arguments for function / method +max-args=5 + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore +ignored-argument-names=_.* + +# Maximum number of locals for function / method body +max-locals=15 + +# Maximum number of return / yield for function / method body +max-returns=6 + +# Maximum number of branch for function / method body +max-branches=12 + +# Maximum number of statements in function / method body +max-statements=50 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + + +[CLASSES] + +# List of interface methods to ignore, separated by a comma. This is used for +# instance to not check methods defines in Zope's Interface base class. +ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__,__new__,setUp + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "Exception" +overgeneral-exceptions=Exception diff --git a/CenRa_FLUX/scripts/compile-strings.sh b/CenRa_FLUX/scripts/compile-strings.sh new file mode 100644 index 00000000..9d760831 --- /dev/null +++ b/CenRa_FLUX/scripts/compile-strings.sh @@ -0,0 +1,12 @@ +#!/bin/bash +LRELEASE=$1 +LOCALES=$2 + + +for LOCALE in ${LOCALES} +do + echo "Processing: ${LOCALE}.ts" + # Note we don't use pylupdate with qt .pro file approach as it is flakey + # about what is made available. + $LRELEASE i18n/${LOCALE}.ts +done diff --git a/CenRa_FLUX/scripts/run-env-linux.sh b/CenRa_FLUX/scripts/run-env-linux.sh new file mode 100644 index 00000000..668247c5 --- /dev/null +++ b/CenRa_FLUX/scripts/run-env-linux.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +QGIS_PREFIX_PATH=/usr/local/qgis-2.0 +if [ -n "$1" ]; then + QGIS_PREFIX_PATH=$1 +fi + +echo ${QGIS_PREFIX_PATH} + + +export QGIS_PREFIX_PATH=${QGIS_PREFIX_PATH} +export QGIS_PATH=${QGIS_PREFIX_PATH} +export LD_LIBRARY_PATH=${QGIS_PREFIX_PATH}/lib +export PYTHONPATH=${QGIS_PREFIX_PATH}/share/qgis/python:${QGIS_PREFIX_PATH}/share/qgis/python/plugins:${PYTHONPATH} + +echo "QGIS PATH: $QGIS_PREFIX_PATH" +export QGIS_DEBUG=0 +export QGIS_LOG_FILE=/tmp/inasafe/realtime/logs/qgis.log + +export PATH=${QGIS_PREFIX_PATH}/bin:$PATH + +echo "This script is intended to be sourced to set up your shell to" +echo "use a QGIS 2.0 built in $QGIS_PREFIX_PATH" +echo +echo "To use it do:" +echo "source $BASH_SOURCE /your/optional/install/path" +echo +echo "Then use the make file supplied here e.g. make guitest" diff --git a/CenRa_FLUX/scripts/update-strings.sh b/CenRa_FLUX/scripts/update-strings.sh new file mode 100644 index 00000000..a31f7124 --- /dev/null +++ b/CenRa_FLUX/scripts/update-strings.sh @@ -0,0 +1,56 @@ +#!/bin/bash +LOCALES=$* + +# Get newest .py files so we don't update strings unnecessarily + +CHANGED_FILES=0 +PYTHON_FILES=`find . -regex ".*\(ui\|py\)$" -type f` +for PYTHON_FILE in $PYTHON_FILES +do + CHANGED=$(stat -c %Y $PYTHON_FILE) + if [ ${CHANGED} -gt ${CHANGED_FILES} ] + then + CHANGED_FILES=${CHANGED} + fi +done + +# Qt translation stuff +# for .ts file +UPDATE=false +for LOCALE in ${LOCALES} +do + TRANSLATION_FILE="i18n/$LOCALE.ts" + if [ ! -f ${TRANSLATION_FILE} ] + then + # Force translation string collection as we have a new language file + touch ${TRANSLATION_FILE} + UPDATE=true + break + fi + + MODIFICATION_TIME=$(stat -c %Y ${TRANSLATION_FILE}) + if [ ${CHANGED_FILES} -gt ${MODIFICATION_TIME} ] + then + # Force translation string collection as a .py file has been updated + UPDATE=true + break + fi +done + +if [ ${UPDATE} == true ] +# retrieve all python files +then + echo ${PYTHON_FILES} + # update .ts + echo "Please provide translations by editing the translation files below:" + for LOCALE in ${LOCALES} + do + echo "i18n/"${LOCALE}".ts" + # Note we don't use pylupdate with qt .pro file approach as it is flakey + # about what is made available. + pylupdate4 -noobsolete ${PYTHON_FILES} -ts i18n/${LOCALE}.ts + done +else + echo "No need to edit any translation files (.ts) because no python files" + echo "has been updated since the last update translation. " +fi diff --git a/CenRa_FLUX/styles_couches/RNN.qml b/CenRa_FLUX/styles_couches/RNN.qml new file mode 100644 index 00000000..3e22d491 --- /dev/null +++ b/CenRa_FLUX/styles_couches/RNN.qml @@ -0,0 +1,321 @@ + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 0.6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /home/tga/travail/47CASS/2014/donnees/SIG/production/cartographie/presentation + + 0 + /home/tga/travail/47RODI/2015/donnees/SIG/production/cartographie/presentation + + 0 + generatedlayout + + + + + + COALESCE( "ID_MNHN", '<NULL>' ) + + 3 + diff --git a/CenRa_FLUX/styles_couches/RNR.qml b/CenRa_FLUX/styles_couches/RNR.qml new file mode 100644 index 00000000..b4c3960b --- /dev/null +++ b/CenRa_FLUX/styles_couches/RNR.qml @@ -0,0 +1,846 @@ + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 0.6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /home/tga/travail/47CASS/2014/donnees/SIG/production/cartographie/presentation + + 0 + /home/tga/travail/47RODI/2015/donnees/SIG/production/cartographie/presentation + + 0 + generatedlayout + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + COALESCE( "ID_MNHN", '<NULL>' ) + + 2 + diff --git a/CenRa_FLUX/styles_couches/RPG.qml b/CenRa_FLUX/styles_couches/RPG.qml new file mode 100644 index 00000000..e9ec8ae4 --- /dev/null +++ b/CenRa_FLUX/styles_couches/RPG.qml @@ -0,0 +1,1589 @@ + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ID_PARCEL + + 2 + diff --git a/CenRa_FLUX/styles_couches/cheflieu.qml b/CenRa_FLUX/styles_couches/cheflieu.qml new file mode 100644 index 00000000..1a149ed9 --- /dev/null +++ b/CenRa_FLUX/styles_couches/cheflieu.qml @@ -0,0 +1,509 @@ + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + + + + + + + + + + + "nom_chef_lieu" + + 0 + diff --git a/CenRa_FLUX/styles_couches/emprise_drone.qml b/CenRa_FLUX/styles_couches/emprise_drone.qml new file mode 100644 index 00000000..3d915024 --- /dev/null +++ b/CenRa_FLUX/styles_couches/emprise_drone.qml @@ -0,0 +1,537 @@ + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "nomcouche" + + 2 + diff --git a/CenRa_FLUX/styles_couches/frayeres.qml b/CenRa_FLUX/styles_couches/frayeres.qml new file mode 100644 index 00000000..02a3b2e6 --- /dev/null +++ b/CenRa_FLUX/styles_couches/frayeres.qml @@ -0,0 +1,1414 @@ + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "nom_modif" + + 0 + diff --git a/CenRa_FLUX/styles_couches/habitats_carhab.qml b/CenRa_FLUX/styles_couches/habitats_carhab.qml new file mode 100644 index 00000000..eaba92df --- /dev/null +++ b/CenRa_FLUX/styles_couches/habitats_carhab.qml @@ -0,0 +1,2490 @@ + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "nom_complet_hab" + + 2 + diff --git a/CenRa_FLUX/styles_couches/mfu_cenna.qml b/CenRa_FLUX/styles_couches/mfu_cenna.qml new file mode 100644 index 00000000..8b4c0400 --- /dev/null +++ b/CenRa_FLUX/styles_couches/mfu_cenna.qml @@ -0,0 +1,895 @@ + + + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "nom" + + 2 + diff --git a/CenRa_FLUX/styles_couches/parcelles_af.qml b/CenRa_FLUX/styles_couches/parcelles_af.qml new file mode 100644 index 00000000..d7a12e45 --- /dev/null +++ b/CenRa_FLUX/styles_couches/parcelles_af.qml @@ -0,0 +1,1081 @@ + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "nom" + + 2 + diff --git a/CenRa_FLUX/styles_couches/pigma_ocs.qml b/CenRa_FLUX/styles_couches/pigma_ocs.qml new file mode 100644 index 00000000..891b0b7a --- /dev/null +++ b/CenRa_FLUX/styles_couches/pigma_ocs.qml @@ -0,0 +1,3446 @@ + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "lib20niv1" + + 2 + diff --git a/CenRa_FLUX/styles_couches/sites_inscrits.qml b/CenRa_FLUX/styles_couches/sites_inscrits.qml new file mode 100644 index 00000000..aa3fd92b --- /dev/null +++ b/CenRa_FLUX/styles_couches/sites_inscrits.qml @@ -0,0 +1,459 @@ + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + gid + + 3 + diff --git a/CenRa_FLUX/styles_couches/style_piezo.qml b/CenRa_FLUX/styles_couches/style_piezo.qml new file mode 100644 index 00000000..d558e1ec --- /dev/null +++ b/CenRa_FLUX/styles_couches/style_piezo.qml @@ -0,0 +1,482 @@ + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "id_cen" + + 0 + diff --git a/CenRa_FLUX/styles_couches/znieff1.qml b/CenRa_FLUX/styles_couches/znieff1.qml new file mode 100644 index 00000000..2a0cceda --- /dev/null +++ b/CenRa_FLUX/styles_couches/znieff1.qml @@ -0,0 +1,331 @@ + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 0.6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /home/tga/travail/47CASS/2014/donnees/SIG/production/cartographie/presentation + + 0 + /home/tga/travail/47RODI/2015/donnees/SIG/production/cartographie/presentation + + 0 + generatedlayout + + + + + + + + + + + + + + + + ID_MNHN + + 3 + diff --git a/CenRa_FLUX/styles_couches/znieff2.qml b/CenRa_FLUX/styles_couches/znieff2.qml new file mode 100644 index 00000000..abf4198e --- /dev/null +++ b/CenRa_FLUX/styles_couches/znieff2.qml @@ -0,0 +1,331 @@ + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 0.6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /home/tga/travail/47CASS/2014/donnees/SIG/production/cartographie/presentation + + 0 + /home/tga/travail/47RODI/2015/donnees/SIG/production/cartographie/presentation + + 0 + generatedlayout + + + + + + + + + + + + + + + + ID_MNHN + + 3 + diff --git a/CenRa_FLUX/styles_couches/zones_baties_carhab.qml b/CenRa_FLUX/styles_couches/zones_baties_carhab.qml new file mode 100644 index 00000000..17e18ab5 --- /dev/null +++ b/CenRa_FLUX/styles_couches/zones_baties_carhab.qml @@ -0,0 +1,579 @@ + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "nom_complet_hab" + + 2 + diff --git a/CenRa_Metabase/about_form.py b/CenRa_Metabase/about_form.py new file mode 100644 index 00000000..bb6ffee1 --- /dev/null +++ b/CenRa_Metabase/about_form.py @@ -0,0 +1,46 @@ +import os.path + +from pathlib import Path + +from qgis.PyQt import uic +from qgis.PyQt.QtGui import QPixmap +from qgis.PyQt.QtWidgets import QDialog + +from .tools.resources import devlog + +ABOUT_FORM_CLASS, _ = uic.loadUiType( + os.path.join( + str(Path(__file__).resolve().parent), + 'tools/ui', + 'CenRa_Metabase_about_form.ui' + ) +) + + +class MetabaseAboutDialog(QDialog, ABOUT_FORM_CLASS): + + """ About - Let the user display the about dialog. """ + + def __init__(self, iface, parent=None): + super().__init__(parent) + self.iface = iface + self.setupUi(self) + + self.viewer.setHtml(devlog('CenRa_METABASE')) + + self.rejected.connect(self.onReject) + self.buttonBox.rejected.connect(self.onReject) + self.buttonBox.accepted.connect(self.onAccept) + + def onAccept(self): + """ + Save options when pressing OK button + """ + self.accept() + + def onReject(self): + """ + Run some actions when + the user closes the dialog + """ + self.close() \ No newline at end of file diff --git a/CenRa_Metabase/tools/PythonSQL.py b/CenRa_Metabase/tools/PythonSQL.py new file mode 100644 index 00000000..f6c28865 --- /dev/null +++ b/CenRa_Metabase/tools/PythonSQL.py @@ -0,0 +1,34 @@ +import sys +import socket +import os +IPAddr=socket.gethostbyname(socket.gethostname()) +#print(IPAddr) +if IPAddr[0:11] == "100.100.100": #4269 + host = "100.100.100.81" + port = "5432" + dbname = "sig4269" + sigdb="sig4269" + refdb="ref_geo4269" + password = "McVities" +if IPAddr[0:9] == "192.168.0": #01 + host = "192.168.0.201" + port = "5432" + dbname = "sig01" + sigdb="sig01" + refdb="ref_geo01" + password = "McVities" +if IPAddr[0:9] == "192.168.1": #0726 + host = "192.168.1.201" + port = "5432" + dbname = "sig0726" + sigdb="sig0726" + refdb="ref_geo0726" + password = "McVities" +if sys.platform == 'linux': + os_user = os.environ['USER'] +else: + os_user = os.environ['USERNAME'] +if os_user == 'STAGE': + os_user='stage' +if os_user == 'Administrateur': + os_user='stage' \ No newline at end of file diff --git a/CenRa_Metabase/tools/bg/Capture.png b/CenRa_Metabase/tools/bg/Capture.png new file mode 100644 index 00000000..ba8fc760 Binary files /dev/null and b/CenRa_Metabase/tools/bg/Capture.png differ diff --git a/CenRa_Metabase/tools/css/dock.css b/CenRa_Metabase/tools/css/dock.css new file mode 100644 index 00000000..f05b8501 --- /dev/null +++ b/CenRa_Metabase/tools/css/dock.css @@ -0,0 +1,61 @@ +body { + font-family: Ubuntu, Lucida Grande, Segoe UI, Arial, sans-serif; + margin-left: 0px; + margin-right: 0px; + margin-top: 0px; + font-size: 14px; +} +img { + max-width: 100%; +} +img.logo{ + display: inline-block; + margin-left:0px; + margin-right: 0px; + margin-top: 10px; + margin-bottom: 10px; + vertical-align: top; + width:25% +} +h2, h3 { + color: #fff; + background-color: #8cb63c; + line-height: 2; + padding-left:5px; +} + +table { + border-collapse: collapse; + width: 100%; + font-size: 13px; +} +th{ + color: #2c4491 +} +table tr th, table tr td { + text-align: left; + padding: 5px; +} + +table.table-striped { + border: 1px solid #BBB; +} +table.table-striped tr td { + border: 1px solid #BBB; +} +table.table-striped tr th { + border: 1px solid #BBB; +} +table.table-striped tr:nth-child(even) { + background: #EEE; +} +table.table-striped tr:nth-child(odd) { + background: #FFF; +} + +#map { + padding: 5px; + width: 400px; + height: 400px; + box-shadow: 0 0 10px #999; +} diff --git a/CenRa_Metabase/tools/html/contact.html b/CenRa_Metabase/tools/html/contact.html new file mode 100644 index 00000000..a6cda01c --- /dev/null +++ b/CenRa_Metabase/tools/html/contact.html @@ -0,0 +1,7 @@ + + [% contact_role %] + [% name %] + [% organisation_name %] ([% organisation_unit %]) + [% email %] + [% phone %] + diff --git a/CenRa_Metabase/tools/html/link.html b/CenRa_Metabase/tools/html/link.html new file mode 100644 index 00000000..cdcdabe1 --- /dev/null +++ b/CenRa_Metabase/tools/html/link.html @@ -0,0 +1,7 @@ + + [% type %] + [% name %] + [% mime %] + [% format %] + [% size %] + diff --git a/CenRa_Metabase/tools/html/main.html b/CenRa_Metabase/tools/html/main.html new file mode 100644 index 00000000..f7ff4a06 --- /dev/null +++ b/CenRa_Metabase/tools/html/main.html @@ -0,0 +1,123 @@ +
+

Identification

+ + + + + + + + + + + + + + + + + + + +
Title[% title %]
Abstract[% abstract %]
Categories[% categories %]
Themes[% themes %]
Keywords[% keywords %]
Data last update[% data_last_update %]
+
+ +
+

Spatial properties

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Level[% spatial_level %]
Minimum scale[% minimum_optimal_scale %]
Maximum scale[% maximum_optimal_scale %]
Feature count[% feature_count %]
Geometry[% geometry_type %]
Extent[% spatial_extent %]
Projection name[% projection_name %]
Projection ID[% projection_authid %]
+
+ +
+

Publication

+ + + + + + + + + + + + + + + + +
Date[% publication_date %]
Frequency[% publication_frequency %]
License[% license %]
License attribution / number[% license_attribution %]
Confidentiality[% confidentiality %]
+
+ +
+

Links

+ + + + + + + + + [% meta_links %] +
TypeNameMIMEFormatSize
+
+ +
+

Contacts

+ + + + + + + + + [% meta_contacts %] +
RoleNameOrganisationEmailPhone
+
+ +
+

Metadata

+ + + + + + + + + + + + + + + + +
Table[% table_name %]
Schema[% schema_name %]
Creation[% creation_date %]
Update[% update_date %]
UUID[% uid %]
+
diff --git a/CenRa_Metabase/tools/icons/CEN_RA.png b/CenRa_Metabase/tools/icons/CEN_RA.png new file mode 100644 index 00000000..95ead1cf Binary files /dev/null and b/CenRa_Metabase/tools/icons/CEN_RA.png differ diff --git a/CenRa_Metabase/tools/icons/icon.png b/CenRa_Metabase/tools/icons/icon.png new file mode 100644 index 00000000..96a568ef Binary files /dev/null and b/CenRa_Metabase/tools/icons/icon.png differ diff --git a/CenRa_Metabase/tools/icons/icon_2.png b/CenRa_Metabase/tools/icons/icon_2.png new file mode 100644 index 00000000..5e21f30c Binary files /dev/null and b/CenRa_Metabase/tools/icons/icon_2.png differ diff --git a/CenRa_Metabase/tools/images/must_be_a_file.png b/CenRa_Metabase/tools/images/must_be_a_file.png new file mode 100644 index 00000000..70629956 Binary files /dev/null and b/CenRa_Metabase/tools/images/must_be_a_file.png differ diff --git a/CenRa_Metabase/tools/lecture_sql.py b/CenRa_Metabase/tools/lecture_sql.py new file mode 100644 index 00000000..06d74050 Binary files /dev/null and b/CenRa_Metabase/tools/lecture_sql.py differ diff --git a/CenRa_Metabase/tools/resources.py b/CenRa_Metabase/tools/resources.py new file mode 100644 index 00000000..b494f011 --- /dev/null +++ b/CenRa_Metabase/tools/resources.py @@ -0,0 +1,187 @@ +"""Tools to work with resource files.""" + +import configparser +import shutil +import tempfile +import base64 +import psycopg2 +import psycopg2.extras +from os.path import abspath, join, pardir, dirname +from qgis.PyQt.QtWidgets import QApplication +from qgis.PyQt import uic + +__copyright__ = "Copyright 2019, 3Liz" +__license__ = "GPL version 3" +__email__ = "info@3liz.org" +__revision__ = "$Format:%H$" + + +def plugin_path(*args): + """Get the path to plugin root folder. + + :param args List of path elements e.g. ['img', 'logos', 'image.png'] + :type args: str + + :return: Absolute path to the plugin path. + :rtype: str + """ + path = dirname(dirname(__file__)) + path = abspath(abspath(join(path, pardir))) + for item in args: + path = abspath(join(path, item)) + + return path + + +def plugin_name(): + """Return the plugin name according to metadata.txt. + + :return: The plugin name. + :rtype: basestring + """ + metadata = metadata_config() + name = metadata["general"]["name"] + return name + + +def metadata_config() -> configparser: + """Get the INI config parser for the metadata file. + + :return: The config parser object. + :rtype: ConfigParser + """ + path = plugin_path("metadata.txt") + config = configparser.ConfigParser() + config.read(path, encoding='utf8') + return config + + +def plugin_test_data_path(*args, copy=False): + """Get the path to the plugin test data path. + + :param args List of path elements e.g. ['img', 'logos', 'image.png'] + :type args: str + + :param copy: If the file must be copied into a temporary directory first. + :type copy: bool + + :return: Absolute path to the resources folder. + :rtype: str + """ + path = abspath(abspath(join(plugin_path(), "test", "data"))) + for item in args: + path = abspath(join(path, item)) + + if copy: + temp = tempfile.mkdtemp() + shutil.copy(path, temp) + return join(temp, args[-1]) + else: + return path + + +def resources_path(*args): + """Get the path to our resources folder. + + :param args List of path elements e.g. ['img', 'logos', 'image.png'] + :type args: str + + :return: Absolute path to the resources folder. + :rtype: str + """ + path = abspath(abspath(join(plugin_path(), "CenRa_METABASE\\tools"))) + for item in args: + path = abspath(join(path, item)) + return path + + +def load_ui(*args): + """Get compile UI file. + + :param args List of path elements e.g. ['img', 'logos', 'image.png'] + :type args: str + + :return: Compiled UI file. + """ + ui_class, _ = uic.loadUiType(resources_path("ui", *args)) + + return ui_class + +def login_base(take=None): + from CenRa_METABASE.tools.PythonSQL import host,port,dbname,password,os_user + first_conn = psycopg2.connect("host=" + host + " port=" + port + " dbname="+dbname+" user=first_cnx password=" + password) + first_cur = first_conn.cursor(cursor_factory = psycopg2.extras.DictCursor) + first_cur.execute("SELECT mdp_w, login_w FROM pg_catalog.pg_user t1, admin_sig.vm_users_sig t2 WHERE t2.oid = t1.usesysid AND (login_w = '" + os_user + "' OR login_w = '" + os_user + "')") + res_ident = first_cur.fetchone() + + mdp = base64.b64decode(str(res_ident[0])).decode('utf-8') + user = res_ident[1] + + con = psycopg2.connect("host=" + host + " port=" + port + " dbname="+dbname+" user=" + user + " password=" + mdp) + + cur = con.cursor(cursor_factory = psycopg2.extras.DictCursor) + first_conn.close() + + if take: + return cur,con + else: + return cur +def send_issues(url,titre,body,labels): + import requests + import json + import os + import qgis + + usr = os.environ['USERNAME'] + token = '9d0a4e0bea561710e0728f161f7edf4e5201e112' + url=url+'?token='+token + + headers = {'Authorization': 'token ' + token,'accept': 'application/json','Content-Type': 'application/json'} + + + payload = {'title': titre, 'body': body, 'labels': labels} + try: + urllib.request.urlopen('https://google.com') + binar = True + except: + binar = False + r = '' + if binar: + r = requests.post(url, data=json.dumps(payload), headers=headers) + return r + +def maj_verif(NAME): + import qgis + import urllib.request + iface = qgis.utils.iface + from qgis.core import Qgis + + url = qgis.utils.pluginMetadata(NAME,'repository') + #URL = url+'/raw/branch/main/plugins.xml' + URL = 'https://gitea.cenra-outils.org/CEN-RA/Plugin_QGIS/releases/download/releases/plugins.xml' +# print(URL) + version = qgis.utils.pluginMetadata(NAME,'version') + len_version = len(version) + try: + urllib.request.urlopen('https://google.com') + binar = True + except: + binar = False + if binar: + version_web = str(urllib.request.urlopen(URL).read()) + plugin_num = version_web.find(NAME) + valeur_version_web = version_web.find('',plugin_num)+9 + version_plugin = version_web[valeur_version_web:valeur_version_web+len_version] + if version_plugin != version: + iface.messageBar().pushMessage("MAJ :", "Des mise à jour de plugin sont disponibles.", level=Qgis.Info, duration=30) + else: + iface.messageBar().pushMessage("WiFi :", "Pas de connection à internet.", level=Qgis.Warning, duration=30) + +def tr(text, context="@default"): + return QApplication.translate(context, text) + +def devlog(NAME): + import qgis + devmaj = '' + devmaj = devmaj+qgis.utils.pluginMetadata(NAME,'changelog') + return devmaj \ No newline at end of file diff --git a/CenRa_Metabase/tools/ui/CenRa_IssuesSend.ui b/CenRa_Metabase/tools/ui/CenRa_IssuesSend.ui new file mode 100644 index 00000000..14d923e4 --- /dev/null +++ b/CenRa_Metabase/tools/ui/CenRa_IssuesSend.ui @@ -0,0 +1,332 @@ + + + CenRa_IssuesSend + + + + 0 + 0 + 810 + 587 + + + + CEN-RA Metabase + + + + icon.svgicon.svg + + + + + 0 + 550 + 811 + 31 + + + + + + + Annuler + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Envoyer + + + + + + + + + 10 + 10 + 791 + 531 + + + + Issues + + + + + 240 + 40 + 321 + 41 + + + + Qt::AlignCenter + + + + + + 10 + 101 + 571 + 421 + + + + + + + 589 + 100 + 191 + 431 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 9 + 9 + 341 + 411 + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Bug + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Aide + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Question + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Amélioration + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Autre + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + 250 + 20 + 51 + 21 + + + + + Arial + 14 + + + + Titre: + + + + + + 20 + 70 + 91 + 31 + + + + + Arial + 12 + + + + Messages: + + + + + + 600 + 70 + 91 + 31 + + + + + Arial + 12 + + + + Sujet: + + + + + + ok_button + annuler_button + + + + diff --git a/CenRa_Metabase/tools/ui/CenRa_Metabase_about_form.ui b/CenRa_Metabase/tools/ui/CenRa_Metabase_about_form.ui new file mode 100644 index 00000000..3e3608ff --- /dev/null +++ b/CenRa_Metabase/tools/ui/CenRa_Metabase_about_form.ui @@ -0,0 +1,96 @@ + + + CenRa_Metabase_editorwidget_base + + + + 0 + 0 + 471 + 594 + + + + Metabase + + + + ../../CenRa_Metabase/tools/ui/icon.svg../../CenRa_Metabase/tools/ui/icon.svg + + + + + + true + + + Qt::NoFocus + + + QFrame::NoFrame + + + QFrame::Plain + + + true + + + + + 0 + 0 + 453 + 547 + + + + + + 0 + 0 + 451 + 541 + + + + DevLog + + + + + 10 + 20 + 431 + 511 + + + + + about:blank + + + + + + + + + + + QDialogButtonBox::Ok + + + + + + + + QWebView + QWidget +
QtWebKitWidgets/QWebView
+
+
+ + +
diff --git a/CenRa_Metabase/tools/ui/CenRa_Metabase_dockwidget_base.ui b/CenRa_Metabase/tools/ui/CenRa_Metabase_dockwidget_base.ui new file mode 100644 index 00000000..f7c76a74 --- /dev/null +++ b/CenRa_Metabase/tools/ui/CenRa_Metabase_dockwidget_base.ui @@ -0,0 +1,87 @@ + + + CenRa_MetabaseDockWidgetBase + + + + 0 + 0 + 329 + 515 + + + + CenRa MetaBase + + + + + + + + + ... + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + ... + + + Qt::NoArrow + + + + + + + ... + + + + + + + help + + + + + + + + + + about:blank + + + + + + + + + + QWebView + QWidget +
QtWebKitWidgets/QWebView
+
+
+ + +
diff --git a/CenRa_Metabase/tools/ui/CenRa_Metabase_editorwidget_base.ui b/CenRa_Metabase/tools/ui/CenRa_Metabase_editorwidget_base.ui new file mode 100644 index 00000000..91c6c4b0 --- /dev/null +++ b/CenRa_Metabase/tools/ui/CenRa_Metabase_editorwidget_base.ui @@ -0,0 +1,1921 @@ + + + CenRa_Metabase_editorwidget_base + + + + 0 + 0 + 818 + 741 + + + + CEN-RA Metabase + + + + icon.svgicon.svg + + + + + 0 + 0 + 821 + 711 + + + + + Myriad Pro Black + 10 + 75 + false + true + + + + Qt::DefaultContextMenu + + + Qt::LeftToRight + + + false + + + QTabWidget::North + + + QTabWidget::Rounded + + + 0 + + + + 40 + 40 + + + + true + + + false + + + false + + + false + + + false + + + + Identification + + + + + 30 + 110 + 751 + 99 + + + + + + + Description + + + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + + + + + + + + + 30 + 220 + 751 + 101 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 20 + 20 + + + + + + + + Categories : + + + + + + + QAbstractItemView::NoEditTriggers + + + + + + + true + + + QAbstractItemView::NoEditTriggers + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectItems + + + + + + + + + 30 + 330 + 751 + 101 + + + + + + + Thèmes : + + + + + + + Qt::Horizontal + + + + 10 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + QAbstractItemView::NoEditTriggers + + + + + + + QAbstractItemView::NoEditTriggers + + + + + + + + + 30 + 440 + 751 + 101 + + + + + + + + + + Mots-clés : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 30 + 550 + 751 + 51 + + + + + + + Dernier mise à jour : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + true + + + QAbstractSpinBox::NoButtons + + + + 2024 + 12 + 25 + + + + QDateTimeEdit::MonthSection + + + dd/MM/yyyy + + + true + + + 1 + + + Qt::UTC + + + + + + + + + 30 + 30 + 751 + 61 + + + + + + + + + + Titre : + + + + + + + + + 30 + 620 + 751 + 51 + + + + + + + Langue : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Spatial properties + + + + + 220 + 20 + 540 + 39 + + + + + + + 34 + 20 + 170 + 39 + + + + Niveau : + + + + + + 34 + 70 + 170 + 39 + + + + Echelle minimum : + + + + + + 220 + 70 + 540 + 39 + + + + + + + 34 + 120 + 170 + 39 + + + + Echelle maximum : + + + + + + 220 + 120 + 540 + 39 + + + + + + + 34 + 170 + 170 + 39 + + + + Nombre d'entités : + + + + + false + + + + 220 + 170 + 540 + 39 + + + + + + + 34 + 220 + 170 + 39 + + + + Type de géométrie : + + + + + false + + + + 220 + 220 + 540 + 39 + + + + + + false + + + + 220 + 320 + 540 + 39 + + + + + + + 34 + 270 + 170 + 39 + + + + Nom de projection : + + + + + + 34 + 370 + 170 + 39 + + + + Emprise : + + + + + + 34 + 320 + 170 + 39 + + + + ID de projection : + + + + + false + + + + 220 + 270 + 540 + 39 + + + + + + false + + + + 221 + 370 + 540 + 39 + + + + + + + Publication + + + + + 30 + 390 + 751 + 61 + + + + + + + Restriction : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 30 + 210 + 751 + 61 + + + + + + + Licence : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 30 + 30 + 751 + 61 + + + + + + + Date : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + true + + + QAbstractSpinBox::NoButtons + + + + 2024 + 12 + 23 + + + + QDateTimeEdit::MonthSection + + + dd/MM/yyyy + + + true + + + 1 + + + Qt::UTC + + + + + + + + + 30 + 300 + 751 + 61 + + + + + + + Licence attribué : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 30 + 120 + 751 + 61 + + + + + + + Fréquence de mise à jour : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Lien + + + + + 10 + 120 + 791 + 511 + + + + + + + QAbstractItemView::NoEditTriggers + + + + + + + + + 20 + 20 + 771 + 61 + + + + + 1 + + + 1 + + + 1 + + + 1 + + + + + Taille : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Type : + + + + + + + + + + + + + URL : + + + + + + + Type MIME : + + + + + + + Format : + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Ajouter + + + + + + + + + + + + + + + 10 + 640 + 791 + 31 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Delete + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 10 + 90 + 790 + 3 + + + + Qt::Horizontal + + + + + + 10 + 20 + 790 + 3 + + + + Qt::Horizontal + + + + + + 10 + 20 + 3 + 70 + + + + Qt::Vertical + + + + + + 800 + 20 + 3 + 70 + + + + Qt::Vertical + + + + + + Contacts + + + + + 20 + 20 + 771 + 61 + + + + + + + Nom : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Ajouter + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Email : + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Organisation : + + + + + + + Telephone + + + + + + + Rôle : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + + + + 10 + 120 + 791 + 511 + + + + + + + QAbstractItemView::NoEditTriggers + + + + + + + + + 10 + 640 + 791 + 31 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Delete + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 800 + 20 + 3 + 70 + + + + Qt::Vertical + + + + + + 10 + 20 + 790 + 3 + + + + Qt::Horizontal + + + + + + 10 + 90 + 790 + 3 + + + + Qt::Horizontal + + + + + + 10 + 20 + 3 + 70 + + + + Qt::Vertical + + + + + + Metadata + + + + + 30 + 30 + 751 + 61 + + + + + + + Table : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + false + + + + + + + + + 30 + 300 + 751 + 61 + + + + + + + Date de modification : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + true + + + QAbstractSpinBox::NoButtons + + + + 2024 + 12 + 24 + + + + QDateTimeEdit::MonthSection + + + dd/MM/yyyy + + + true + + + 1 + + + Qt::UTC + + + + + + + + + 30 + 390 + 751 + 61 + + + + + + + Encodage : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + 30 + 210 + 751 + 61 + + + + + + + Date de création : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + true + + + QAbstractSpinBox::NoButtons + + + + 2024 + 12 + 24 + + + + QDateTimeEdit::MonthSection + + + dd/MM/yyyy + + + true + + + 1 + + + Qt::UTC + + + + + + + + + 30 + 120 + 751 + 61 + + + + + + + Schema : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + false + + + + + + + + + 30 + 480 + 751 + 61 + + + + + + + UUID : + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + false + + + + + + + + + + + 0 + 710 + 821 + 31 + + + + + + + Annuler + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + OK + + + + + + + + + 780 + 20 + 25 + 19 + + + + ... + + + + 32 + 32 + + + + Qt::NoArrow + + + + + + 780 + 2 + 25 + 19 + + + + ... + + + + 32 + 32 + + + + Qt::NoArrow + + + + + titre_line + description_text + ok_button + annuler_button + tabWidget + langue_box + niveau_plain + echelle_min_plain + echelle_max_plain + nbr_layers + typegeom_plaintext + crscode_plaintext + crsname_plaintext + extend_plaintext + restriction_box + licence_box + licence_attrib_box + frequence_box + table_lien + add_lien_button + format_box + mime_box + type_box + delete_lien_button + organisation_box + add_contact_button + role_box + table_contact + delete_contact_button + table_ligne + encodage_box + schema_ligne + uuid_ligne + mots_cles_text + + + + diff --git a/CenRa_Metabase/tools/xml/dcat.xml b/CenRa_Metabase/tools/xml/dcat.xml new file mode 100644 index 00000000..852508d0 --- /dev/null +++ b/CenRa_Metabase/tools/xml/dcat.xml @@ -0,0 +1,26 @@ + + + + + CEN-RA DCAT RDF catalog + {language} + CEN-RA Metadata + + + + {content} + + + + + + diff --git a/CenRa_Metabase/tools/xml/distribution.xml b/CenRa_Metabase/tools/xml/distribution.xml new file mode 100644 index 00000000..2ff86b03 --- /dev/null +++ b/CenRa_Metabase/tools/xml/distribution.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/CenRa_Metabase/tools/xml/publisher.xml b/CenRa_Metabase/tools/xml/publisher.xml new file mode 100644 index 00000000..1cda9317 --- /dev/null +++ b/CenRa_Metabase/tools/xml/publisher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/CenRa_POSTGIS/Makefile b/CenRa_POSTGIS/Makefile new file mode 100644 index 00000000..ff1a50bd --- /dev/null +++ b/CenRa_POSTGIS/Makefile @@ -0,0 +1,119 @@ +#/*************************************************************************** +# CenRa +# +# Conservatoire d'Espaces Naturels de Rhône-Alpes +# ------------------- +# begin : 2014-03-27 +# copyright : (C) 2014 by Conservatoire d'Espaces Naturels de Rhône-Alpes +# email : guillaume.costes@espaces-naturels.fr +# ***************************************************************************/ +# +#/*************************************************************************** +# * * +# * 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. * +# * * +# ***************************************************************************/ + +# CONFIGURATION +PLUGIN_UPLOAD = $(CURDIR)/plugin_upload.py + +QGISDIR=.qgis2 + +# Makefile for a PyQGIS plugin + +# translation +SOURCES = cenra.py ui_cenra.py __init__.py cenradialog.py +#TRANSLATIONS = i18n/cenra_en.ts +TRANSLATIONS = + +# global + +PLUGINNAME = cenra + +PY_FILES = cenra.py cenradialog.py __init__.py + +EXTRAS = cenra.png metadata.txt + +UI_FILES = ui_cenra.py + +RESOURCE_FILES = resources_rc.py + +HELP = help/build/html + +default: compile + +compile: $(UI_FILES) $(RESOURCE_FILES) + +%_rc.py : %.qrc + pyrcc4 -o $*_rc.py $< + +%.py : %.ui + pyuic4 -o $@ $< + +%.qm : %.ts + lrelease $< + +# The deploy target only works on unix like operating system where +# the Python plugin directory is located at: +# $HOME/$(QGISDIR)/python/plugins +deploy: compile doc transcompile + mkdir -p $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vf $(PY_FILES) $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vf $(UI_FILES) $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vf $(RESOURCE_FILES) $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vf $(EXTRAS) $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vfr i18n $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vfr $(HELP) $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME)/help + +# The dclean target removes compiled python files from plugin directory +# also delets any .svn entry +dclean: + find $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) -iname "*.pyc" -delete + find $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) -iname ".svn" -prune -exec rm -Rf {} \; + +# The derase deletes deployed plugin +derase: + rm -Rf $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + +# The zip target deploys the plugin and creates a zip file with the deployed +# content. You can then upload the zip file on http://plugins.qgis.org +zip: deploy dclean + rm -f $(PLUGINNAME).zip + cd $(HOME)/$(QGISDIR)/python/plugins; zip -9r $(CURDIR)/$(PLUGINNAME).zip $(PLUGINNAME) + +# Create a zip package of the plugin named $(PLUGINNAME).zip. +# This requires use of git (your plugin development directory must be a +# git repository). +# To use, pass a valid commit or tag as follows: +# make package VERSION=Version_0.3.2 +package: compile + rm -f $(PLUGINNAME).zip + git archive --prefix=$(PLUGINNAME)/ -o $(PLUGINNAME).zip $(VERSION) + echo "Created package: $(PLUGINNAME).zip" + +upload: zip + $(PLUGIN_UPLOAD) $(PLUGINNAME).zip + +# transup +# update .ts translation files +transup: + pylupdate4 Makefile + +# transcompile +# compile translation files into .qm binary format +transcompile: $(TRANSLATIONS:.ts=.qm) + +# transclean +# deletes all .qm files +transclean: + rm -f i18n/*.qm + +clean: + rm $(UI_FILES) $(RESOURCE_FILES) + +# build documentation with sphinx +doc: + cd help; make html diff --git a/CenRa_POSTGIS/README.html b/CenRa_POSTGIS/README.html new file mode 100644 index 00000000..2c92b760 --- /dev/null +++ b/CenRa_POSTGIS/README.html @@ -0,0 +1,32 @@ + + +

Plugin Builder Results

+
+Your plugin CenRa was created in:
+  C:\Users\gcostes\.qgis2\python\plugins\CenRa +

+Your QGIS plugin directory is located at:
+  C:/Users/gcostes/.qgis2/python/plugins +

+What's Next +

    +
  1. Copy the entire directory containing your new plugin to the QGIS plugin directory +
  2. Compile the ui file using pyuic4 +
  3. Compile the resources file using pyrcc4 +
  4. Test the plugin by enabling it in the QGIS plugin manager +
  5. Customize it by editing the implementation file cenra.py +
  6. Create your own custom icon, replacing the default icon.png +
  7. Modify your user interface by opening cenra.ui in Qt Designer (don't forget to compile it with pyuic4 after changing it) +
  8. You can use the Makefile to compile your Ui and resource files when you make changes. This requires GNU make (gmake) + +
+
+

+For more information, see the PyQGIS Developer Cookbook at: +http://www.qgis.org/pyqgis-cookbook/index.html. +

+
+GeoApt LLC +©2011-2014 GeoApt LLC - geoapt.com + + diff --git a/CenRa_POSTGIS/__init__.py.bak b/CenRa_POSTGIS/__init__.py.bak new file mode 100644 index 00000000..a1de1556 --- /dev/null +++ b/CenRa_POSTGIS/__init__.py.bak @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +""" +/*************************************************************************** + CenRa + A QGIS plugin + Conservatoire d'Espaces Naturels de Rhône-Alpes + ------------------- + begin : 2014-03-27 + copyright : (C) 2014 by Conservatoire d'Espaces Naturels de Rhône-Alpes + email : guillaume.costes@espaces-naturels.fr + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + This script initializes the plugin, making it known to QGIS. +""" + +def classFactory(iface): + # load CenRa class from file CenRa + from cenra import CenRa + return CenRa(iface) diff --git a/CenRa_POSTGIS/cenra.py.bak b/CenRa_POSTGIS/cenra.py.bak new file mode 100644 index 00000000..0812e5ef --- /dev/null +++ b/CenRa_POSTGIS/cenra.py.bak @@ -0,0 +1,798 @@ +# -*- coding: utf-8 -*- +""" +/*************************************************************************** + CenRa + A QGIS plugin + Conservatoire d'Espaces Naturels de Rhône-Alpes + ------------------- + begin : 2014-03-27 + copyright : (C) 2014 by Conservatoire d'Espaces Naturels de Rhône-Alpes + email : guillaume.costes@espaces-naturels.fr + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 __future__ import absolute_import +# Import the PyQt and QGIS libraries +from builtins import str +from builtins import object +from qgis.PyQt.QtCore import QSettings +from qgis.PyQt.QtWidgets import QAction, QMenu +from qgis.PyQt.QtGui import QIcon +from qgis.core import * +# Initialize Qt resources from file resources.py +from . import resources_rc +# Import the code for the dialog +from .cenradialog import CenRaDialog +from .table_postgisdialog import table_postgisDialog + +import os.path +import webbrowser, os +import sys +import psycopg2 + +class CenRa(object): + + def __init__(self, iface): + # 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] + localePath = os.path.join(self.plugin_dir, 'i18n', 'cenra_{}.qm'.format(locale)) + + if os.path.exists(localePath): + 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 = CenRaDialog() + self.dlgAjout = table_postgisDialog() + + def initGui(self): + self.toolBar = self.iface.addToolBar("CEN-RA") + self.toolBar.setObjectName("CEN-RA") + + # ***Create action that will start plugin configuration + self.action = QAction( + QIcon(":/plugins/CenRa/page_new.png"), + u"Création d'un dossier", self.iface.mainWindow()) + # connect the action to the run method + self.action.triggered.connect(self.creation) + + # Add toolbar button and menu item + self.toolBar.addAction(self.action) + self.iface.addPluginToMenu(u"CenRa", self.action) + + # ***Create action that will start plugin configuration + self.action = QAction( + QIcon(":/plugins/CenRa/page_ajout.png"), + u"Ajout d'une table", self.iface.mainWindow()) + # connect the action to the run method + self.action.triggered.connect(self.ajout) + + # Add toolbar button and menu item + self.toolBar.addAction(self.action) + self.iface.addPluginToMenu(u"&CenRa", self.action) + + # ***Create action that will start plugin configuration + self.action = QAction( + QIcon(":/plugins/CenRa/help.png"), + u"Aide", self.iface.mainWindow()) + # connect the action to the run method + self.action.triggered.connect(self.doHelp) + + # Add toolbar button and menu item + self.toolBar.addAction(self.action) + self.iface.addPluginToMenu(u"CenRa", self.action) + + self.menu = QMenu() + self.menu.setTitle( QCoreApplication.translate( "CENRA","&CenRa" ) ) + + self.cenra_new = QAction( QIcon(":/plugins/CenRa/page_new.png"), QCoreApplication.translate("CENRA", u"Création d'un dossier" ), self.iface.mainWindow() ) + self.cenra_ajout = QAction( QIcon(":/plugins/CenRa/page_ajout.png"), QCoreApplication.translate("CENRA", "Ajout d'une table" ), self.iface.mainWindow() ) + self.cenra_help = QAction( QIcon(":/plugins/CenRa/help.png"), QCoreApplication.translate("CENRA", "Aide" ), self.iface.mainWindow() ) + + self.menu.addActions( [self.cenra_new, self.cenra_ajout, self.cenra_help] ) + + menu_bar = self.iface.mainWindow().menuBar() + actions = menu_bar.actions() + lastAction = actions[ len( actions ) - 1 ] + menu_bar.insertMenu( lastAction, self.menu ) + + self.cenra_new.triggered.connect(self.creation) + self.cenra_ajout.triggered.connect(self.ajout) + self.cenra_help.triggered.connect(self.doHelp) + + def unload(self): + # Remove the plugin menu item and icon + self.iface.removePluginMenu(u"&CenRa", self.action) + self.iface.removeToolBarIcon(self.action) + + # run method that performs all the real work + def creation(self): + # show the dialog + self.dlg.show() + # Run the dialog event loop + result = self.dlg.exec_() + # See if OK was pressed + if result == 1: + +#**********************************Debut_script**************************************** + import psycopg2 + + ### config.txt + config = "//100.100.100.100/bd_sig/z_QGIS/config.txt" # Chemin du fichier config + + # Fonction de lecture des lignes du fichier config + def readline(n): + with open(config, "r") as f: + for lineno, line in enumerate(f): + if lineno == n: + return line.strip() # Permet d'enlever les retours chariots + + # Recuperation des donnees + host = readline(10) + port = readline(12) + dbname = readline(14) + user = readline(16) + password = readline(18) + + ### Creation du schema pour le nouveau site + if self.dlg.at.isChecked(): + schema = "_" + self.dlg.dept.currentText() + "_at_" + self.dlg.nom.text().lower() # Ajout de "_" pour eviter pb de numero en premier caractere + else : + schema = "_" + self.dlg.dept.currentText() + "_" + self.dlg.nom.text().lower() # Ajout de "_" pour eviter pb de numero en premier caractere + + if self.dlg.nom.text() == "" or self.dlg.nom.text() == "NULL": + QMessageBox.warning(None, "Oups :", "Veuillez renseigner un nom de dossier.") + return + + ch = [u"à", u"À", u"â", u"Â", u"ä", u"Ä", u"å", u"Å", u"ç", u"Ç", u"é", u"É", u"è", u"È", u"ê", u"Ê", u"ë", u"Ë", u"î", u"Î", u"ï", u"Ï", u"ô", u"Ô", u"ö", u"Ö", u"ù", u"Ù", u"û", u"Û", u"ü", u"Ü", u"ÿ", u"Ÿ", u"'", u"-", u" "] + for car in ch : + if self.dlg.nom.text().find(car) != -1 : + QMessageBox.warning(None, "Oups :", u"Le nom de dossier ne doit pas comporter de caractères spéciaux, ni d'espaces !\n\n\t" + self.dlg.nom.text().lower() ) + return + + con = psycopg2.connect("dbname="+ dbname + " user=" + user + " host=" + host + " password=" + password) + cur = con.cursor() + + SQL_schema = "CREATE SCHEMA " + schema + " AUTHORIZATION postgres;" + + cur.execute(SQL_schema) + + ### Creation de la table contour + if self.dlg.couche_contour.isChecked(): # Verifie si la checkbox est cochee + if self.dlg.annee_1.text() == 'aaaa' or self.dlg.annee_1.text() == '': + tablename = schema + "_contour" + else : + tablename = schema + "_contour_" + self.dlg.annee_1.text() + tablename_qgis = tablename[1:] # Permet d'enlever le "_", ajouter a la premiere etape, dans qgis + geom = readline(6) + style = readline(21) + champ_contour = readline(32) + + SQL_contour = "CREATE TABLE " + schema + "."+ tablename + champ_contour + SQL_pkey = "ALTER TABLE " + schema + "." + tablename + " ADD CONSTRAINT " + tablename + "_pkey" + " PRIMARY KEY (gid)" + SQL_trigger_area_m2 = "CREATE TRIGGER area_m2" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_m2();" + SQL_trigger_area_ha = "CREATE TRIGGER area_ha" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_ha();" + SQL_trigger_date_creation = "CREATE TRIGGER date_creation" + tablename + " BEFORE INSERT ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_creation();" + SQL_trigger_date_maj = "CREATE TRIGGER date_maj" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_maj();" + + SQL_style = """INSERT INTO layer_styles (f_table_catalog, f_table_schema, f_table_name, f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, update_time) + SELECT f_table_catalog, '""" + schema + "', '" + tablename + """', f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, now() + FROM layer_styles + WHERE description = 'contour_modele'""" + + cur.execute(SQL_contour) + cur.execute(SQL_pkey) + cur.execute(SQL_trigger_area_m2) + cur.execute(SQL_trigger_area_ha) + cur.execute(SQL_trigger_date_creation) + cur.execute(SQL_trigger_date_maj) + cur.execute(SQL_style) ## Enregistrement du style (comme style par defaut) dans la table layer_styles + + con.commit() + + ## Affichage de la table + uri = QgsDataSourceURI() + # set host name, port, database name, username and password + uri.setConnection(host ,port ,dbname ,user ,password) + # set database schema, table name, geometry column and optionaly subset (WHERE clause) + uri.setDataSource(schema, tablename, geom) + + layer = self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres") + + ### Creation de la table habitat + if self.dlg.couche_habitat.isChecked(): + if self.dlg.annee_2.text() == 'aaaa' or self.dlg.annee_2.text() == '': + tablename = schema + "_habitat" + else : + tablename = schema + "_habitat_" + self.dlg.annee_2.text() + tablename_qgis = tablename[1:] # Permet d'enlever le "_", ajouter a la premiere etape, dans qgis + geom = readline(6) + style = readline(22) + champ_habitat = readline(35) + + SQL_habitat = "CREATE TABLE " + schema + "."+ tablename + champ_habitat + SQL_pkey = "ALTER TABLE " + schema + "." + tablename + " ADD CONSTRAINT " + tablename + "_pkey" + " PRIMARY KEY (gid)" + SQL_trigger_area_m2 = "CREATE TRIGGER area_m2" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_m2();" + SQL_trigger_area_ha = "CREATE TRIGGER area_ha" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_ha();" + SQL_trigger_concat_cd_cb = "CREATE TRIGGER concat_cd_cb" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.concat_cd_cb();" + SQL_trigger_date_creation = "CREATE TRIGGER date_creation" + tablename + " BEFORE INSERT ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_creation();" + SQL_trigger_date_maj = "CREATE TRIGGER date_maj" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_maj();" + + SQL_style = """INSERT INTO layer_styles (f_table_catalog, f_table_schema, f_table_name, f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, update_time) + SELECT f_table_catalog, '""" + schema + "', '" + tablename + """', f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, now() + FROM layer_styles + WHERE description = 'habitat_modele'""" + + cur.execute(SQL_habitat) + cur.execute(SQL_pkey) + cur.execute(SQL_trigger_area_m2) + cur.execute(SQL_trigger_area_ha) + cur.execute(SQL_trigger_concat_cd_cb) + cur.execute(SQL_trigger_date_creation) + cur.execute(SQL_trigger_date_maj) + cur.execute(SQL_style) ## Enregistrement du style (comme style par defaut) dans la table layer_styles + + con.commit() + + ## Affichage de la table + uri = QgsDataSourceURI() + # set host name, port, database name, username and password + uri.setConnection(host ,port ,dbname ,user ,password) + # set database schema, table name, geometry column and optionaly subset (WHERE clause) + uri.setDataSource(schema, tablename, geom) + + layer = self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres") + + ### Creation de la table travaux prevus + if self.dlg.couche_travaux_prevus.isChecked(): + #**********Poly + if self.dlg.annee_5.text() == 'aaaa' or self.dlg.annee_5.text() == '': + tablename = schema + "_travaux_prevus_poly" + else : + tablename = schema + "_travaux_prevus_poly_" + self.dlg.annee_5.text() + tablename_qgis = tablename[1:] # Permet d'enlever le "_", ajouter a la premiere etape, dans qgis + geom = readline(6) + style = readline(26) + champ_travaux_prevus = readline(43) + + SQL_travaux_prevus = "CREATE TABLE " + schema + "."+ tablename + champ_travaux_prevus + SQL_pkey = "ALTER TABLE " + schema + "." + tablename + " ADD CONSTRAINT " + tablename + "_pkey" + " PRIMARY KEY (gid)" + SQL_trigger_date_creation = "CREATE TRIGGER date_creation" + tablename + " BEFORE INSERT ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_creation();" + SQL_trigger_date_maj = "CREATE TRIGGER date_maj" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_maj();" + SQL_trigger_area_m2 = "CREATE TRIGGER area_m2" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_m2();" + SQL_trigger_area_ha = "CREATE TRIGGER area_ha" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_ha();" + + SQL_style = """INSERT INTO layer_styles (f_table_catalog, f_table_schema, f_table_name, f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, update_time) + SELECT f_table_catalog, '""" + schema + "', '" + tablename + """', f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, now() + FROM layer_styles + WHERE description = 'travaux_prevus_poly_modele'""" + + cur.execute(SQL_travaux_prevus) + cur.execute(SQL_pkey) + cur.execute(SQL_trigger_date_creation) + cur.execute(SQL_trigger_date_maj) + cur.execute(SQL_trigger_area_m2) + cur.execute(SQL_trigger_area_ha) + cur.execute(SQL_style) ## Enregistrement du style (comme style par defaut) dans la table layer_styles + + con.commit() + + ## Affichage de la table + uri = QgsDataSourceURI() + # set host name, port, database name, username and password + uri.setConnection(host ,port ,dbname ,user ,password) + # set database schema, table name, geometry column and optionaly subset (WHERE clause) + uri.setDataSource(schema, tablename, geom) + + layer = self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres") + + #**********ligne + if self.dlg.annee_5.text() == 'aaaa' or self.dlg.annee_5.text() == '': + tablename = schema + "_travaux_prevus_ligne" + else : + tablename = schema + "_travaux_prevus_ligne_" + self.dlg.annee_5.text() + tablename_qgis = tablename[1:] # Permet d'enlever le "_", ajouter a la premiere etape, dans qgis + geom = readline(6) + style = readline(27) + champ_travaux_prevus = readline(44) + + SQL_travaux_prevus = "CREATE TABLE " + schema + "."+ tablename + champ_travaux_prevus + SQL_pkey = "ALTER TABLE " + schema + "." + tablename + " ADD CONSTRAINT " + tablename + "_pkey" + " PRIMARY KEY (gid)" + SQL_trigger_date_creation = "CREATE TRIGGER date_creation" + tablename + " BEFORE INSERT ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_creation();" + SQL_trigger_date_maj = "CREATE TRIGGER date_maj" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_maj();" + SQL_trigger_length_m = "CREATE TRIGGER length_m" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.length_m();" + SQL_trigger_length_km = "CREATE TRIGGER length_km" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.length_km();" + + SQL_style = """INSERT INTO layer_styles (f_table_catalog, f_table_schema, f_table_name, f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, update_time) + SELECT f_table_catalog, '""" + schema + "', '" + tablename + """', f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, now() + FROM layer_styles + WHERE description = 'travaux_prevus_ligne_modele'""" + + cur.execute(SQL_travaux_prevus) + cur.execute(SQL_pkey) + cur.execute(SQL_trigger_date_creation) + cur.execute(SQL_trigger_date_maj) + cur.execute(SQL_trigger_length_m) + cur.execute(SQL_trigger_length_km) + cur.execute(SQL_style) ## Enregistrement du style (comme style par defaut) dans la table layer_styles + + con.commit() + + ## Affichage de la table + uri = QgsDataSourceURI() + # set host name, port, database name, username and password + uri.setConnection(host ,port ,dbname ,user ,password) + # set database schema, table name, geometry column and optionaly subset (WHERE clause) + uri.setDataSource(schema, tablename, geom) + + layer = self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres") + + #**********point + if self.dlg.annee_5.text() == 'aaaa' or self.dlg.annee_5.text() == '': + tablename = schema + "_travaux_prevus_point" + else : + tablename = schema + "_travaux_prevus_point_" + self.dlg.annee_5.text() + tablename_qgis = tablename[1:] # Permet d'enlever le "_", ajouter a la premiere etape, dans qgis + geom = readline(6) + style = readline(28) + champ_travaux_prevus = readline(45) + + SQL_travaux_prevus = "CREATE TABLE " + schema + "."+ tablename + champ_travaux_prevus + SQL_pkey = "ALTER TABLE " + schema + "." + tablename + " ADD CONSTRAINT " + tablename + "_pkey" + " PRIMARY KEY (gid)" + SQL_trigger_date_creation = "CREATE TRIGGER date_creation" + tablename + " BEFORE INSERT ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_creation();" + SQL_trigger_date_maj = "CREATE TRIGGER date_maj" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_maj();" + SQL_trigger_coordonnees = "CREATE TRIGGER coordonnees" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.coordonnees();" + + SQL_style = """INSERT INTO layer_styles (f_table_catalog, f_table_schema, f_table_name, f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, update_time) + SELECT f_table_catalog, '""" + schema + "', '" + tablename + """', f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, now() + FROM layer_styles + WHERE description = 'travaux_prevus_point_modele'""" + + cur.execute(SQL_travaux_prevus) + cur.execute(SQL_pkey) + cur.execute(SQL_trigger_date_creation) + cur.execute(SQL_trigger_date_maj) + cur.execute(SQL_trigger_coordonnees) + cur.execute(SQL_style) ## Enregistrement du style (comme style par defaut) dans la table layer_styles + + con.commit() + + ## Affichage de la table + uri = QgsDataSourceURI() + # set host name, port, database name, username and password + uri.setConnection(host ,port ,dbname ,user ,password) + # set database schema, table name, geometry column and optionaly subset (WHERE clause) + uri.setDataSource(schema, tablename, geom) + + layer = self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres") + + ### Creation de la table vierge + if self.dlg.couche_vierge.isChecked(): + if self.dlg.annee_4.text() == 'aaaa' or self.dlg.annee_4.text() == '': + tablename = schema + "_" + self.dlg.nom_couche_vierge.text().lower() + else : + tablename = schema + "_" + self.dlg.nom_couche_vierge.text().lower() + "_" + self.dlg.annee_4.text() + tablename_qgis = tablename[1:] # Permet d'enlever le "_", ajouter a la premiere etape, dans qgis + geom = readline(6) + style = readline(29) + champ_viergePolygone = readline(48) + champ_viergeLigne = readline(49) + champ_viergePoint = readline(50) + + if self.dlg.couche_vierge_point.isChecked() == 1 : + champ_vierge = champ_viergePoint + + if self.dlg.couche_vierge_ligne.isChecked() == 1 : + champ_vierge = champ_viergeLigne + + if self.dlg.couche_vierge_polygone.isChecked() == 1 : + champ_vierge = champ_viergePolygone + + SQL_vierge = "CREATE TABLE " + schema + "."+ tablename + champ_vierge + SQL_pkey = "ALTER TABLE " + schema + "." + tablename + " ADD CONSTRAINT " + tablename + "_pkey" + " PRIMARY KEY (gid)" + + SQL_trigger_area_m2 = "CREATE TRIGGER area_m2" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_m2();" + SQL_trigger_area_ha = "CREATE TRIGGER area_ha" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_ha();" + SQL_trigger_length_m = "CREATE TRIGGER length_m" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.length_m();" + SQL_trigger_length_km = "CREATE TRIGGER length_km" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.length_km();" + SQL_trigger_coordonnees = "CREATE TRIGGER coordonnees" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.coordonnees();" + + cur.execute(SQL_vierge) + cur.execute(SQL_pkey) + + if self.dlg.couche_vierge_point.isChecked() == 1 : + cur.execute(SQL_trigger_coordonnees) + + if self.dlg.couche_vierge_ligne.isChecked() == 1 : + cur.execute(SQL_trigger_length_m) + cur.execute(SQL_trigger_length_km) + + if self.dlg.couche_vierge_polygone.isChecked() == 1 : + cur.execute(SQL_trigger_area_m2) + cur.execute(SQL_trigger_area_ha) + + con.commit() + + ### Affichage de la table + uri = QgsDataSourceURI() + # set host name, port, database name, username and password + uri.setConnection(host ,port ,dbname ,user ,password) + # set database schema, table name, geometry column and optionaly subset (WHERE clause) + uri.setDataSource(schema, tablename, geom) + + layer = self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres") + + else : + con.commit() + + con.close() + pass + + ### Outil Aide + def doHelp(self): + webbrowser.open("http://plateformesig.cenra-outils.org/") + + ### Outil Ajout de nouvelles couche a un dossier + def ajout(self): + import psycopg2 + + config = "//100.100.100.100/bd_sig/z_QGIS/config.txt" # Chemin du fichier config + # Fonction de lecture des lignes du fichier config + def readline(n): + with open(config, "r") as f: + for lineno, line in enumerate(f): + if lineno == n: + return line.strip() # Permet d'enlever les retours chariots + + host = readline(10) + port = readline(12) + dbname = readline(14) + user = readline(16) + password = readline(18) + + con = psycopg2.connect("dbname="+ dbname + " user=" + user + " host=" + host + " password=" + password) + cur = con.cursor() + # Creation de la liste des schemas de la base de donnees + SQL = """WITH list_schema AS ( + SELECT catalog_name, schema_name + FROM information_schema.schemata + WHERE schema_name <> 'information_schema' + AND schema_name !~ E'^pg_' + ORDER BY schema_name + ) + + SELECT string_agg(schema_name,',') + FROM list_schema + GROUP BY catalog_name""" + + cur.execute(SQL) + + list_brut = str(next(cur)) + + list = list_brut [3:-3] + listItems = list.split(",") + + con.close() + + self.dlgAjout.ui.schema.clear() + self.dlgAjout.ui.schema.addItems(listItems) + self.dlgAjout.ui.schema.setCurrentIndex(-1) # Pour ne pas commencer la liste au premier schema + + # show the dialog + self.dlgAjout.show() + # Run the dialog event loop + result = self.dlgAjout.exec_() + # See if OK was pressed + if result == 1: +#******************************debut script********************************* + ### config.txt + config = "//100.100.100.100/bd_sig/z_QGIS/config.txt" # Chemin du fichier config + + # Fonction de lecture des lignes du fichier config + def readline(n): + with open(config, "r") as f: + for lineno, line in enumerate(f): + if lineno == n: + return line.strip() # Permet d'enlever les retours chariots + + # Recuperation des donnees + host = readline(10) + port = readline(12) + dbname = readline(14) + user = readline(16) + password = readline(18) + + con = psycopg2.connect("dbname="+ dbname + " user=" + user + " host=" + host + " password=" + password) + cur = con.cursor() + + if self.dlgAjout.ui.schema.currentIndex() == -1 : + QMessageBox.warning(None, "Oups :", "Veuillez choisir un nom de dossier.") + return + + schema = self.dlgAjout.ui.schema.currentText() + + ### Creation de la table contour + if self.dlgAjout.ui.couche_contour.isChecked(): # Verifie si la checkbox est cochee + if self.dlgAjout.ui.annee_1.text() == 'aaaa' or self.dlgAjout.ui.annee_1.text() == '': + tablename = schema + "_contour" + else : + tablename = schema + "_contour_" + self.dlgAjout.ui.annee_1.text() + tablename_qgis = tablename[1:] # Permet d'enlever le "_", ajouter a la premiere etape, dans qgis + geom = readline(6) + style = readline(21) + champ_contour = readline(32) + + SQL_contour = "CREATE TABLE " + schema + "."+ tablename + champ_contour + SQL_pkey = "ALTER TABLE " + schema + "." + tablename + " ADD CONSTRAINT " + tablename + "_pkey" + " PRIMARY KEY (gid)" + SQL_trigger_area_m2 = "CREATE TRIGGER area_m2" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_m2();" + SQL_trigger_area_ha = "CREATE TRIGGER area_ha" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_ha();" + SQL_trigger_date_creation = "CREATE TRIGGER date_creation" + tablename + " BEFORE INSERT ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_creation();" + SQL_trigger_date_maj = "CREATE TRIGGER date_maj" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_maj();" + + SQL_style = """INSERT INTO layer_styles (f_table_catalog, f_table_schema, f_table_name, f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, update_time) + SELECT f_table_catalog, '""" + schema + "', '" + tablename + """', f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, now() + FROM layer_styles + WHERE description = 'contour_modele'""" + + cur.execute(SQL_contour) + cur.execute(SQL_pkey) + cur.execute(SQL_trigger_area_m2) + cur.execute(SQL_trigger_area_ha) + cur.execute(SQL_trigger_date_creation) + cur.execute(SQL_trigger_date_maj) + cur.execute(SQL_style) ## Enregistrement du style (comme style par defaut) dans la table layer_styles + + con.commit() + + ## Affichage de la table + uri = QgsDataSourceURI() + # set host name, port, database name, username and password + uri.setConnection(host ,port ,dbname ,user ,password) + # set database schema, table name, geometry column and optionaly subset (WHERE clause) + uri.setDataSource(schema, tablename, geom) + + layer = self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres") + + ### Creation de la table habitat + if self.dlgAjout.ui.couche_habitat.isChecked(): + if self.dlgAjout.ui.annee_2.text() == 'aaaa' or self.dlgAjout.ui.annee_2.text() == '': + tablename = schema + "_habitat" + else : + tablename = schema + "_habitat_" + self.dlgAjout.ui.annee_2.text() + tablename_qgis = tablename[1:] # Permet d'enlever le "_", ajouter a la premiere etape, dans qgis + geom = readline(6) + style = readline(22) + champ_habitat = readline(35) + + SQL_habitat = "CREATE TABLE " + schema + "."+ tablename + champ_habitat + SQL_pkey = "ALTER TABLE " + schema + "." + tablename + " ADD CONSTRAINT " + tablename + "_pkey" + " PRIMARY KEY (gid)" + SQL_trigger_area_m2 = "CREATE TRIGGER area_m2" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_m2();" + SQL_trigger_area_ha = "CREATE TRIGGER area_ha" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_ha();" + SQL_trigger_concat_cd_cb = "CREATE TRIGGER concat_cd_cb" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.concat_cd_cb();" + SQL_trigger_date_creation = "CREATE TRIGGER date_creation" + tablename + " BEFORE INSERT ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_creation();" + SQL_trigger_date_maj = "CREATE TRIGGER date_maj" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_maj();" + + SQL_style = """INSERT INTO layer_styles (f_table_catalog, f_table_schema, f_table_name, f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, update_time) + SELECT f_table_catalog, '""" + schema + "', '" + tablename + """', f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, now() + FROM layer_styles + WHERE description = 'habitat_modele'""" + + cur.execute(SQL_habitat) + cur.execute(SQL_pkey) + cur.execute(SQL_trigger_area_m2) + cur.execute(SQL_trigger_area_ha) + cur.execute(SQL_trigger_concat_cd_cb) + cur.execute(SQL_trigger_date_creation) + cur.execute(SQL_trigger_date_maj) + cur.execute(SQL_style) ## Enregistrement du style (comme style par defaut) dans la table layer_styles + + con.commit() + + ## Affichage de la table + uri = QgsDataSourceURI() + # set host name, port, database name, username and password + uri.setConnection(host ,port ,dbname ,user ,password) + # set database schema, table name, geometry column and optionaly subset (WHERE clause) + uri.setDataSource(schema, tablename, geom) + + layer = self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres") + + ### Creation de la table travaux prevus + if self.dlgAjout.ui.couche_travaux_prevus.isChecked(): + #**********Poly + if self.dlgAjout.ui.annee_5.text() == 'aaaa' or self.dlgAjout.ui.annee_5.text() == '': + tablename = schema + "_travaux_prevus_poly" + else : + tablename = schema + "_travaux_prevus_poly_" + self.dlgAjout.ui.annee_5.text() + tablename_qgis = tablename[1:] # Permet d'enlever le "_", ajouter a la premiere etape, dans qgis + geom = readline(6) + style = readline(26) + champ_travaux_prevus = readline(43) + + SQL_travaux_prevus = "CREATE TABLE " + schema + "."+ tablename + champ_travaux_prevus + SQL_pkey = "ALTER TABLE " + schema + "." + tablename + " ADD CONSTRAINT " + tablename + "_pkey" + " PRIMARY KEY (gid)" + SQL_trigger_date_creation = "CREATE TRIGGER date_creation" + tablename + " BEFORE INSERT ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_creation();" + SQL_trigger_date_maj = "CREATE TRIGGER date_maj" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_maj();" + SQL_trigger_area_m2 = "CREATE TRIGGER area_m2" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_m2();" + SQL_trigger_area_ha = "CREATE TRIGGER area_ha" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_ha();" + + SQL_style = """INSERT INTO layer_styles (f_table_catalog, f_table_schema, f_table_name, f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, update_time) + SELECT f_table_catalog, '""" + schema + "', '" + tablename + """', f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, now() + FROM layer_styles + WHERE description = 'travaux_prevus_poly_modele'""" + + cur.execute(SQL_travaux_prevus) + cur.execute(SQL_pkey) + cur.execute(SQL_trigger_date_creation) + cur.execute(SQL_trigger_date_maj) + cur.execute(SQL_trigger_area_m2) + cur.execute(SQL_trigger_area_ha) + cur.execute(SQL_style) ## Enregistrement du style (comme style par defaut) dans la table layer_styles + + con.commit() + + ## Affichage de la table + uri = QgsDataSourceURI() + # set host name, port, database name, username and password + uri.setConnection(host ,port ,dbname ,user ,password) + # set database schema, table name, geometry column and optionaly subset (WHERE clause) + uri.setDataSource(schema, tablename, geom) + + layer = self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres") + + #**********ligne + if self.dlgAjout.ui.annee_5.text() == 'aaaa' or self.dlgAjout.ui.annee_5.text() == '': + tablename = schema + "_travaux_prevus_ligne" + else : + tablename = schema + "_travaux_prevus_ligne_" + self.dlgAjout.ui.annee_5.text() + tablename_qgis = tablename[1:] # Permet d'enlever le "_", ajouter a la premiere etape, dans qgis + geom = readline(6) + style = readline(27) + champ_travaux_prevus = readline(44) + + SQL_travaux_prevus = "CREATE TABLE " + schema + "."+ tablename + champ_travaux_prevus + SQL_pkey = "ALTER TABLE " + schema + "." + tablename + " ADD CONSTRAINT " + tablename + "_pkey" + " PRIMARY KEY (gid)" + SQL_trigger_date_creation = "CREATE TRIGGER date_creation" + tablename + " BEFORE INSERT ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_creation();" + SQL_trigger_date_maj = "CREATE TRIGGER date_maj" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_maj();" + SQL_trigger_length_m = "CREATE TRIGGER length_m" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.length_m();" + SQL_trigger_length_km = "CREATE TRIGGER length_km" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.length_km();" + + SQL_style = """INSERT INTO layer_styles (f_table_catalog, f_table_schema, f_table_name, f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, update_time) + SELECT f_table_catalog, '""" + schema + "', '" + tablename + """', f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, now() + FROM layer_styles + WHERE description = 'travaux_prevus_ligne_modele'""" + + cur.execute(SQL_travaux_prevus) + cur.execute(SQL_pkey) + cur.execute(SQL_trigger_date_creation) + cur.execute(SQL_trigger_date_maj) + cur.execute(SQL_trigger_length_m) + cur.execute(SQL_trigger_length_km) + cur.execute(SQL_style) ## Enregistrement du style (comme style par defaut) dans la table layer_styles + + con.commit() + + ## Affichage de la table + uri = QgsDataSourceURI() + # set host name, port, database name, username and password + uri.setConnection(host ,port ,dbname ,user ,password) + # set database schema, table name, geometry column and optionaly subset (WHERE clause) + uri.setDataSource(schema, tablename, geom) + + layer = self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres") + + #**********point + if self.dlgAjout.ui.annee_5.text() == 'aaaa' or self.dlgAjout.ui.annee_5.text() == '': + tablename = schema + "_travaux_prevus_point" + else : + tablename = schema + "_travaux_prevus_point_" + self.dlgAjout.ui.annee_5.text() + tablename_qgis = tablename[1:] # Permet d'enlever le "_", ajouter a la premiere etape, dans qgis + geom = readline(6) + style = readline(28) + champ_travaux_prevus = readline(45) + + SQL_travaux_prevus = "CREATE TABLE " + schema + "."+ tablename + champ_travaux_prevus + SQL_pkey = "ALTER TABLE " + schema + "." + tablename + " ADD CONSTRAINT " + tablename + "_pkey" + " PRIMARY KEY (gid)" + SQL_trigger_date_creation = "CREATE TRIGGER date_creation" + tablename + " BEFORE INSERT ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_creation();" + SQL_trigger_date_maj = "CREATE TRIGGER date_maj" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.date_maj();" + SQL_trigger_coordonnees = "CREATE TRIGGER coordonnees" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.coordonnees();" + + SQL_style = """INSERT INTO layer_styles (f_table_catalog, f_table_schema, f_table_name, f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, update_time) + SELECT f_table_catalog, '""" + schema + "', '" + tablename + """', f_geometry_column, stylename, styleqml, stylesld, useasdefault, "owner", ui, now() + FROM layer_styles + WHERE description = 'travaux_prevus_point_modele'""" + + cur.execute(SQL_travaux_prevus) + cur.execute(SQL_pkey) + cur.execute(SQL_trigger_date_creation) + cur.execute(SQL_trigger_date_maj) + cur.execute(SQL_trigger_coordonnees) + cur.execute(SQL_style) ## Enregistrement du style (comme style par defaut) dans la table layer_styles + + con.commit() + + ## Affichage de la table + uri = QgsDataSourceURI() + # set host name, port, database name, username and password + uri.setConnection(host ,port ,dbname ,user ,password) + # set database schema, table name, geometry column and optionaly subset (WHERE clause) + uri.setDataSource(schema, tablename, geom) + + layer = self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres") + + ### Creation de la table vierge + if self.dlgAjout.ui.couche_vierge.isChecked(): + if self.dlgAjout.ui.annee_4.text() == 'aaaa' or self.dlgAjout.ui.annee_4.text() == '': + tablename = schema + "_" + self.dlgAjout.ui.nom_couche_vierge.text().lower() + else : + tablename = schema + "_" + self.dlgAjout.ui.nom_couche_vierge.text().lower() + "_" + self.dlgAjout.ui.annee_4.text() + tablename_qgis = tablename[1:] # Permet d'enlever le "_", ajouter a la premiere etape, dans qgis + geom = readline(6) + style = readline(29) + champ_viergePolygone = readline(48) + champ_viergeLigne = readline(49) + champ_viergePoint = readline(50) + + if self.dlgAjout.ui.couche_vierge_point.isChecked() == 1 : + champ_vierge = champ_viergePoint + + if self.dlgAjout.ui.couche_vierge_ligne.isChecked() == 1 : + champ_vierge = champ_viergeLigne + + if self.dlgAjout.ui.couche_vierge_polygone.isChecked() == 1 : + champ_vierge = champ_viergePolygone + + SQL_vierge = "CREATE TABLE " + schema + "."+ tablename + champ_vierge + SQL_pkey = "ALTER TABLE " + schema + "." + tablename + " ADD CONSTRAINT " + tablename + "_pkey" + " PRIMARY KEY (gid)" + + SQL_trigger_area_m2 = "CREATE TRIGGER area_m2" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_m2();" + SQL_trigger_area_ha = "CREATE TRIGGER area_ha" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.area_ha();" + SQL_trigger_length_m = "CREATE TRIGGER length_m" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.length_m();" + SQL_trigger_length_km = "CREATE TRIGGER length_km" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.length_km();" + SQL_trigger_coordonnees = "CREATE TRIGGER coordonnees" + tablename + " BEFORE INSERT OR UPDATE ON " + schema + "." + tablename + " FOR EACH ROW EXECUTE PROCEDURE ref.coordonnees();" + + cur.execute(SQL_vierge) + cur.execute(SQL_pkey) + + if self.dlgAjout.ui.couche_vierge_point.isChecked() == 1 : + cur.execute(SQL_trigger_coordonnees) + + if self.dlgAjout.ui.couche_vierge_ligne.isChecked() == 1 : + cur.execute(SQL_trigger_length_m) + cur.execute(SQL_trigger_length_km) + + if self.dlgAjout.ui.couche_vierge_polygone.isChecked() == 1 : + cur.execute(SQL_trigger_area_m2) + cur.execute(SQL_trigger_area_ha) + + con.commit() + + ### Affichage de la table + uri = QgsDataSourceURI() + # set host name, port, database name, username and password + uri.setConnection(host ,port ,dbname ,user ,password) + # set database schema, table name, geometry column and optionaly subset (WHERE clause) + uri.setDataSource(schema, tablename, geom) + + layer = self.iface.addVectorLayer(uri.uri(), tablename_qgis, "postgres") + + else : + con.commit() + + con.close() + pass \ No newline at end of file diff --git a/CenRa_POSTGIS/cenradialog.py.bak b/CenRa_POSTGIS/cenradialog.py.bak new file mode 100644 index 00000000..e29830d2 --- /dev/null +++ b/CenRa_POSTGIS/cenradialog.py.bak @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +""" +/*************************************************************************** + CenRaDialog + A QGIS plugin + Conservatoire d'Espaces Naturels de Rhône-Alpes + ------------------- + begin : 2014-03-27 + copyright : (C) 2014 by Conservatoire d'Espaces Naturels de Rhône-Alpes + email : guillaume.costes@espaces-naturels.fr + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 PyQt4 import QtCore, QtGui +from ui_cenra import Ui_cenra +# create the dialog for zoom to point + + +class CenRaDialog(QtGui.QDialog, Ui_cenra): + def __init__(self): + QtGui.QDialog.__init__(self) + # Set up the user interface from Designer. + # After setupUI you can access any designer object by doing + # self., and you can use autoconnect slots - see + # http://qt-project.org/doc/qt-4.8/designer-using-a-ui-file.html + # #widgets-and-dialogs-with-auto-connect + self.setupUi(self) diff --git a/CenRa_POSTGIS/forms/about_form.py b/CenRa_POSTGIS/forms/about_form.py new file mode 100644 index 00000000..b9896793 --- /dev/null +++ b/CenRa_POSTGIS/forms/about_form.py @@ -0,0 +1,46 @@ +import os.path + +from pathlib import Path + +from qgis.PyQt import uic +from qgis.PyQt.QtGui import QPixmap +from qgis.PyQt.QtWidgets import QDialog + +from ..tools.resources import devlog + +ABOUT_FORM_CLASS, _ = uic.loadUiType( + os.path.join( + str(Path(__file__).resolve().parent.parent), + 'forms', + 'postgis_about_form.ui' + ) +) + + +class PostgisAboutDialog(QDialog, ABOUT_FORM_CLASS): + + """ About - Let the user display the about dialog. """ + + def __init__(self, iface, parent=None): + super().__init__(parent) + self.iface = iface + self.setupUi(self) + + self.viewer.setHtml(devlog('CenRa_POSTGIS')) + + self.rejected.connect(self.onReject) + self.buttonBox.rejected.connect(self.onReject) + self.buttonBox.accepted.connect(self.onAccept) + + def onAccept(self): + """ + Save options when pressing OK button + """ + self.accept() + + def onReject(self): + """ + Run some actions when + the user closes the dialog + """ + self.close() \ No newline at end of file diff --git a/CenRa_POSTGIS/forms/postgis_about_form.ui b/CenRa_POSTGIS/forms/postgis_about_form.ui new file mode 100644 index 00000000..2a03633d --- /dev/null +++ b/CenRa_POSTGIS/forms/postgis_about_form.ui @@ -0,0 +1,96 @@ + + + CenRa_Metabase_editorwidget_base + + + + 0 + 0 + 471 + 594 + + + + POSTGIS + + + + ../../CenRa_Metabase/tools/ui/icon.svg../../CenRa_Metabase/tools/ui/icon.svg + + + + + + true + + + Qt::NoFocus + + + QFrame::NoFrame + + + QFrame::Plain + + + true + + + + + 0 + 0 + 453 + 547 + + + + + + 0 + 0 + 451 + 541 + + + + DevLog + + + + + 10 + 20 + 431 + 511 + + + + + about:blank + + + + + + + + + + + QDialogButtonBox::Ok + + + + + + + + QWebView + QWidget +
QtWebKitWidgets/QWebView
+
+
+ + +
diff --git a/CenRa_POSTGIS/help/Makefile b/CenRa_POSTGIS/help/Makefile new file mode 100644 index 00000000..ebb0236d --- /dev/null +++ b/CenRa_POSTGIS/help/Makefile @@ -0,0 +1,130 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/templateclass.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/templateclass.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/templateclass" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/templateclass" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + make -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/CenRa_POSTGIS/help/make.bat b/CenRa_POSTGIS/help/make.bat new file mode 100644 index 00000000..90dc1912 --- /dev/null +++ b/CenRa_POSTGIS/help/make.bat @@ -0,0 +1,155 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. changes to make an overview over all changed/added/deprecated items + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\templateclass.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\templateclass.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +:end diff --git a/CenRa_POSTGIS/help/source/conf.py b/CenRa_POSTGIS/help/source/conf.py new file mode 100644 index 00000000..a7bd6e9a --- /dev/null +++ b/CenRa_POSTGIS/help/source/conf.py @@ -0,0 +1,216 @@ +# -*- coding: utf-8 -*- +# +# cenra documentation build configuration file, created by +# sphinx-quickstart on Sun Feb 12 17:11:03 2012. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.todo', 'sphinx.ext.pngmath', 'sphinx.ext.viewcode'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'cenra' +copyright = u'2013, Conservatoire d''Espaces Naturels de Rhône-Alpes' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0.1' +# The full version, including alpha/beta/rc tags. +release = '0.1' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = [] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'templateclassdoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +# The paper size ('letter' or 'a4'). +#latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +#latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'cenra.tex', u'cenra Documentation', + u'Conservatoire d''Espaces Naturels de Rhône-Alpes', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'templateclass', u'cenra Documentation', + [u'Conservatoire d''Espaces Naturels de Rhône-Alpes'], 1) +] diff --git a/CenRa_POSTGIS/help/source/index.rst b/CenRa_POSTGIS/help/source/index.rst new file mode 100644 index 00000000..02812ef1 --- /dev/null +++ b/CenRa_POSTGIS/help/source/index.rst @@ -0,0 +1,20 @@ +.. cenra documentation master file, created by + sphinx-quickstart on Sun Feb 12 17:11:03 2012. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to cenra's documentation! +============================================ + +Contents: + +.. toctree:: + :maxdepth: 2 + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/CenRa_POSTGIS/resources_rc.py.bak b/CenRa_POSTGIS/resources_rc.py.bak new file mode 100644 index 00000000..1498204f --- /dev/null +++ b/CenRa_POSTGIS/resources_rc.py.bak @@ -0,0 +1,892 @@ +# -*- coding: utf-8 -*- + +# Resource object code +# +# Created: ven. 29. août 14:43:36 2014 +# by: The Resource Compiler for PyQt (Qt v4.8.4) +# +# WARNING! All changes made in this file will be lost! + +from PyQt4 import QtCore + +qt_resource_data = "\ +\x00\x00\x15\x6a\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x22\x00\x00\x00\x23\x08\x06\x00\x00\x01\x86\x1c\xe8\xf1\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x2e\x23\x00\x00\x2e\x23\ +\x01\x78\xa5\x3f\x76\x00\x00\x0a\x4f\x69\x43\x43\x50\x50\x68\x6f\ +\x74\x6f\x73\x68\x6f\x70\x20\x49\x43\x43\x20\x70\x72\x6f\x66\x69\ +\x6c\x65\x00\x00\x78\xda\x9d\x53\x67\x54\x53\xe9\x16\x3d\xf7\xde\ +\xf4\x42\x4b\x88\x80\x94\x4b\x6f\x52\x15\x08\x20\x52\x42\x8b\x80\ +\x14\x91\x26\x2a\x21\x09\x10\x4a\x88\x21\xa1\xd9\x15\x51\xc1\x11\ +\x45\x45\x04\x1b\xc8\xa0\x88\x03\x8e\x8e\x80\x8c\x15\x51\x2c\x0c\ +\x8a\x0a\xd8\x07\xe4\x21\xa2\x8e\x83\xa3\x88\x8a\xca\xfb\xe1\x7b\ +\xa3\x6b\xd6\xbc\xf7\xe6\xcd\xfe\xb5\xd7\x3e\xe7\xac\xf3\x9d\xb3\ +\xcf\x07\xc0\x08\x0c\x96\x48\x33\x51\x35\x80\x0c\xa9\x42\x1e\x11\ +\xe0\x83\xc7\xc4\xc6\xe1\xe4\x2e\x40\x81\x0a\x24\x70\x00\x10\x08\ +\xb3\x64\x21\x73\xfd\x23\x01\x00\xf8\x7e\x3c\x3c\x2b\x22\xc0\x07\ +\xbe\x00\x01\x78\xd3\x0b\x08\x00\xc0\x4d\x9b\xc0\x30\x1c\x87\xff\ +\x0f\xea\x42\x99\x5c\x01\x80\x84\x01\xc0\x74\x91\x38\x4b\x08\x80\ +\x14\x00\x40\x7a\x8e\x42\xa6\x00\x40\x46\x01\x80\x9d\x98\x26\x53\ +\x00\xa0\x04\x00\x60\xcb\x63\x62\xe3\x00\x50\x2d\x00\x60\x27\x7f\ +\xe6\xd3\x00\x80\x9d\xf8\x99\x7b\x01\x00\x5b\x94\x21\x15\x01\xa0\ +\x91\x00\x20\x13\x65\x88\x44\x00\x68\x3b\x00\xac\xcf\x56\x8a\x45\ +\x00\x58\x30\x00\x14\x66\x4b\xc4\x39\x00\xd8\x2d\x00\x30\x49\x57\ +\x66\x48\x00\xb0\xb7\x00\xc0\xce\x10\x0b\xb2\x00\x08\x0c\x00\x30\ +\x51\x88\x85\x29\x00\x04\x7b\x00\x60\xc8\x23\x23\x78\x00\x84\x99\ +\x00\x14\x46\xf2\x57\x3c\xf1\x2b\xae\x10\xe7\x2a\x00\x00\x78\x99\ +\xb2\x3c\xb9\x24\x39\x45\x81\x5b\x08\x2d\x71\x07\x57\x57\x2e\x1e\ +\x28\xce\x49\x17\x2b\x14\x36\x61\x02\x61\x9a\x40\x2e\xc2\x79\x99\ +\x19\x32\x81\x34\x0f\xe0\xf3\xcc\x00\x00\xa0\x91\x15\x11\xe0\x83\ +\xf3\xfd\x78\xce\x0e\xae\xce\xce\x36\x8e\xb6\x0e\x5f\x2d\xea\xbf\ +\x06\xff\x22\x62\x62\xe3\xfe\xe5\xcf\xab\x70\x40\x00\x00\xe1\x74\ +\x7e\xd1\xfe\x2c\x2f\xb3\x1a\x80\x3b\x06\x80\x6d\xfe\xa2\x25\xee\ +\x04\x68\x5e\x0b\xa0\x75\xf7\x8b\x66\xb2\x0f\x40\xb5\x00\xa0\xe9\ +\xda\x57\xf3\x70\xf8\x7e\x3c\x3c\x45\xa1\x90\xb9\xd9\xd9\xe5\xe4\ +\xe4\xd8\x4a\xc4\x42\x5b\x61\xca\x57\x7d\xfe\x67\xc2\x5f\xc0\x57\ +\xfd\x6c\xf9\x7e\x3c\xfc\xf7\xf5\xe0\xbe\xe2\x24\x81\x32\x5d\x81\ +\x47\x04\xf8\xe0\xc2\xcc\xf4\x4c\xa5\x1c\xcf\x92\x09\x84\x62\xdc\ +\xe6\x8f\x47\xfc\xb7\x0b\xff\xfc\x1d\xd3\x22\xc4\x49\x62\xb9\x58\ +\x2a\x14\xe3\x51\x12\x71\x8e\x44\x9a\x8c\xf3\x32\xa5\x22\x89\x42\ +\x92\x29\xc5\x25\xd2\xff\x64\xe2\xdf\x2c\xfb\x03\x3e\xdf\x35\x00\ +\xb0\x6a\x3e\x01\x7b\x91\x2d\xa8\x5d\x63\x03\xf6\x4b\x27\x10\x58\ +\x74\xc0\xe2\xf7\x00\x00\xf2\xbb\x6f\xc1\xd4\x28\x08\x03\x80\x68\ +\x83\xe1\xcf\x77\xff\xef\x3f\xfd\x47\xa0\x25\x00\x80\x66\x49\x92\ +\x71\x00\x00\x5e\x44\x24\x2e\x54\xca\xb3\x3f\xc7\x08\x00\x00\x44\ +\xa0\x81\x2a\xb0\x41\x1b\xf4\xc1\x18\x2c\xc0\x06\x1c\xc1\x05\xdc\ +\xc1\x0b\xfc\x60\x36\x84\x42\x24\xc4\xc2\x42\x10\x42\x0a\x64\x80\ +\x1c\x72\x60\x29\xac\x82\x42\x28\x86\xcd\xb0\x1d\x2a\x60\x2f\xd4\ +\x40\x1d\x34\xc0\x51\x68\x86\x93\x70\x0e\x2e\xc2\x55\xb8\x0e\x3d\ +\x70\x0f\xfa\x61\x08\x9e\xc1\x28\xbc\x81\x09\x04\x41\xc8\x08\x13\ +\x61\x21\xda\x88\x01\x62\x8a\x58\x23\x8e\x08\x17\x99\x85\xf8\x21\ +\xc1\x48\x04\x12\x8b\x24\x20\xc9\x88\x14\x51\x22\x4b\x91\x35\x48\ +\x31\x52\x8a\x54\x20\x55\x48\x1d\xf2\x3d\x72\x02\x39\x87\x5c\x46\ +\xba\x91\x3b\xc8\x00\x32\x82\xfc\x86\xbc\x47\x31\x94\x81\xb2\x51\ +\x3d\xd4\x0c\xb5\x43\xb9\xa8\x37\x1a\x84\x46\xa2\x0b\xd0\x64\x74\ +\x31\x9a\x8f\x16\xa0\x9b\xd0\x72\xb4\x1a\x3d\x8c\x36\xa1\xe7\xd0\ +\xab\x68\x0f\xda\x8f\x3e\x43\xc7\x30\xc0\xe8\x18\x07\x33\xc4\x6c\ +\x30\x2e\xc6\xc3\x42\xb1\x38\x2c\x09\x93\x63\xcb\xb1\x22\xac\x0c\ +\xab\xc6\x1a\xb0\x56\xac\x03\xbb\x89\xf5\x63\xcf\xb1\x77\x04\x12\ +\x81\x45\xc0\x09\x36\x04\x77\x42\x20\x61\x1e\x41\x48\x58\x4c\x58\ +\x4e\xd8\x48\xa8\x20\x1c\x24\x34\x11\xda\x09\x37\x09\x03\x84\x51\ +\xc2\x27\x22\x93\xa8\x4b\xb4\x26\xba\x11\xf9\xc4\x18\x62\x32\x31\ +\x87\x58\x48\x2c\x23\xd6\x12\x8f\x13\x2f\x10\x7b\x88\x43\xc4\x37\ +\x24\x12\x89\x43\x32\x27\xb9\x90\x02\x49\xb1\xa4\x54\xd2\x12\xd2\ +\x46\xd2\x6e\x52\x23\xe9\x2c\xa9\x9b\x34\x48\x1a\x23\x93\xc9\xda\ +\x64\x6b\xb2\x07\x39\x94\x2c\x20\x2b\xc8\x85\xe4\x9d\xe4\xc3\xe4\ +\x33\xe4\x1b\xe4\x21\xf2\x5b\x0a\x9d\x62\x40\x71\xa4\xf8\x53\xe2\ +\x28\x52\xca\x6a\x4a\x19\xe5\x10\xe5\x34\xe5\x06\x65\x98\x32\x41\ +\x55\xa3\x9a\x52\xdd\xa8\xa1\x54\x11\x35\x8f\x5a\x42\xad\xa1\xb6\ +\x52\xaf\x51\x87\xa8\x13\x34\x75\x9a\x39\xcd\x83\x16\x49\x4b\xa5\ +\xad\xa2\x95\xd3\x1a\x68\x17\x68\xf7\x69\xaf\xe8\x74\xba\x11\xdd\ +\x95\x1e\x4e\x97\xd0\x57\xd2\xcb\xe9\x47\xe8\x97\xe8\x03\xf4\x77\ +\x0c\x0d\x86\x15\x83\xc7\x88\x67\x28\x19\x9b\x18\x07\x18\x67\x19\ +\x77\x18\xaf\x98\x4c\xa6\x19\xd3\x8b\x19\xc7\x54\x30\x37\x31\xeb\ +\x98\xe7\x99\x0f\x99\x6f\x55\x58\x2a\xb6\x2a\x7c\x15\x91\xca\x0a\ +\x95\x4a\x95\x26\x95\x1b\x2a\x2f\x54\xa9\xaa\xa6\xaa\xde\xaa\x0b\ +\x55\xf3\x55\xcb\x54\x8f\xa9\x5e\x53\x7d\xae\x46\x55\x33\x53\xe3\ +\xa9\x09\xd4\x96\xab\x55\xaa\x9d\x50\xeb\x53\x1b\x53\x67\xa9\x3b\ +\xa8\x87\xaa\x67\xa8\x6f\x54\x3f\xa4\x7e\x59\xfd\x89\x06\x59\xc3\ +\x4c\xc3\x4f\x43\xa4\x51\xa0\xb1\x5f\xe3\xbc\xc6\x20\x0b\x63\x19\ +\xb3\x78\x2c\x21\x6b\x0d\xab\x86\x75\x81\x35\xc4\x26\xb1\xcd\xd9\ +\x7c\x76\x2a\xbb\x98\xfd\x1d\xbb\x8b\x3d\xaa\xa9\xa1\x39\x43\x33\ +\x4a\x33\x57\xb3\x52\xf3\x94\x66\x3f\x07\xe3\x98\x71\xf8\x9c\x74\ +\x4e\x09\xe7\x28\xa7\x97\xf3\x7e\x8a\xde\x14\xef\x29\xe2\x29\x1b\ +\xa6\x34\x4c\xb9\x31\x65\x5c\x6b\xaa\x96\x97\x96\x58\xab\x48\xab\ +\x51\xab\x47\xeb\xbd\x36\xae\xed\xa7\x9d\xa6\xbd\x45\xbb\x59\xfb\ +\x81\x0e\x41\xc7\x4a\x27\x5c\x27\x47\x67\x8f\xce\x05\x9d\xe7\x53\ +\xd9\x53\xdd\xa7\x0a\xa7\x16\x4d\x3d\x3a\xf5\xae\x2e\xaa\x6b\xa5\ +\x1b\xa1\xbb\x44\x77\xbf\x6e\xa7\xee\x98\x9e\xbe\x5e\x80\x9e\x4c\ +\x6f\xa7\xde\x79\xbd\xe7\xfa\x1c\x7d\x2f\xfd\x54\xfd\x6d\xfa\xa7\ +\xf5\x47\x0c\x58\x06\xb3\x0c\x24\x06\xdb\x0c\xce\x18\x3c\xc5\x35\ +\x71\x6f\x3c\x1d\x2f\xc7\xdb\xf1\x51\x43\x5d\xc3\x40\x43\xa5\x61\ +\x95\x61\x97\xe1\x84\x91\xb9\xd1\x3c\xa3\xd5\x46\x8d\x46\x0f\x8c\ +\x69\xc6\x5c\xe3\x24\xe3\x6d\xc6\x6d\xc6\xa3\x26\x06\x26\x21\x26\ +\x4b\x4d\xea\x4d\xee\x9a\x52\x4d\xb9\xa6\x29\xa6\x3b\x4c\x3b\x4c\ +\xc7\xcd\xcc\xcd\xa2\xcd\xd6\x99\x35\x9b\x3d\x31\xd7\x32\xe7\x9b\ +\xe7\x9b\xd7\x9b\xdf\xb7\x60\x5a\x78\x5a\x2c\xb6\xa8\xb6\xb8\x65\ +\x49\xb2\xe4\x5a\xa6\x59\xee\xb6\xbc\x6e\x85\x5a\x39\x59\xa5\x58\ +\x55\x5a\x5d\xb3\x46\xad\x9d\xad\x25\xd6\xbb\xad\xbb\xa7\x11\xa7\ +\xb9\x4e\x93\x4e\xab\x9e\xd6\x67\xc3\xb0\xf1\xb6\xc9\xb6\xa9\xb7\ +\x19\xb0\xe5\xd8\x06\xdb\xae\xb6\x6d\xb6\x7d\x61\x67\x62\x17\x67\ +\xb7\xc5\xae\xc3\xee\x93\xbd\x93\x7d\xba\x7d\x8d\xfd\x3d\x07\x0d\ +\x87\xd9\x0e\xab\x1d\x5a\x1d\x7e\x73\xb4\x72\x14\x3a\x56\x3a\xde\ +\x9a\xce\x9c\xee\x3f\x7d\xc5\xf4\x96\xe9\x2f\x67\x58\xcf\x10\xcf\ +\xd8\x33\xe3\xb6\x13\xcb\x29\xc4\x69\x9d\x53\x9b\xd3\x47\x67\x17\ +\x67\xb9\x73\x83\xf3\x88\x8b\x89\x4b\x82\xcb\x2e\x97\x3e\x2e\x9b\ +\x1b\xc6\xdd\xc8\xbd\xe4\x4a\x74\xf5\x71\x5d\xe1\x7a\xd2\xf5\x9d\ +\x9b\xb3\x9b\xc2\xed\xa8\xdb\xaf\xee\x36\xee\x69\xee\x87\xdc\x9f\ +\xcc\x34\x9f\x29\x9e\x59\x33\x73\xd0\xc3\xc8\x43\xe0\x51\xe5\xd1\ +\x3f\x0b\x9f\x95\x30\x6b\xdf\xac\x7e\x4f\x43\x4f\x81\x67\xb5\xe7\ +\x23\x2f\x63\x2f\x91\x57\xad\xd7\xb0\xb7\xa5\x77\xaa\xf7\x61\xef\ +\x17\x3e\xf6\x3e\x72\x9f\xe3\x3e\xe3\x3c\x37\xde\x32\xde\x59\x5f\ +\xcc\x37\xc0\xb7\xc8\xb7\xcb\x4f\xc3\x6f\x9e\x5f\x85\xdf\x43\x7f\ +\x23\xff\x64\xff\x7a\xff\xd1\x00\xa7\x80\x25\x01\x67\x03\x89\x81\ +\x41\x81\x5b\x02\xfb\xf8\x7a\x7c\x21\xbf\x8e\x3f\x3a\xdb\x65\xf6\ +\xb2\xd9\xed\x41\x8c\xa0\xb9\x41\x15\x41\x8f\x82\xad\x82\xe5\xc1\ +\xad\x21\x68\xc8\xec\x90\xad\x21\xf7\xe7\x98\xce\x91\xce\x69\x0e\ +\x85\x50\x7e\xe8\xd6\xd0\x07\x61\xe6\x61\x8b\xc3\x7e\x0c\x27\x85\ +\x87\x85\x57\x86\x3f\x8e\x70\x88\x58\x1a\xd1\x31\x97\x35\x77\xd1\ +\xdc\x43\x73\xdf\x44\xfa\x44\x96\x44\xde\x9b\x67\x31\x4f\x39\xaf\ +\x2d\x4a\x35\x2a\x3e\xaa\x2e\x6a\x3c\xda\x37\xba\x34\xba\x3f\xc6\ +\x2e\x66\x59\xcc\xd5\x58\x9d\x58\x49\x6c\x4b\x1c\x39\x2e\x2a\xae\ +\x36\x6e\x6c\xbe\xdf\xfc\xed\xf3\x87\xe2\x9d\xe2\x0b\xe3\x7b\x17\ +\x98\x2f\xc8\x5d\x70\x79\xa1\xce\xc2\xf4\x85\xa7\x16\xa9\x2e\x12\ +\x2c\x3a\x96\x40\x4c\x88\x4e\x38\x94\xf0\x41\x10\x2a\xa8\x16\x8c\ +\x25\xf2\x13\x77\x25\x8e\x0a\x79\xc2\x1d\xc2\x67\x22\x2f\xd1\x36\ +\xd1\x88\xd8\x43\x5c\x2a\x1e\x4e\xf2\x48\x2a\x4d\x7a\x92\xec\x91\ +\xbc\x35\x79\x24\xc5\x33\xa5\x2c\xe5\xb9\x84\x27\xa9\x90\xbc\x4c\ +\x0d\x4c\xdd\x9b\x3a\x9e\x16\x9a\x76\x20\x6d\x32\x3d\x3a\xbd\x31\ +\x83\x92\x91\x90\x71\x42\xaa\x21\x4d\x93\xb6\x67\xea\x67\xe6\x66\ +\x76\xcb\xac\x65\x85\xb2\xfe\xc5\x6e\x8b\xb7\x2f\x1e\x95\x07\xc9\ +\x6b\xb3\x90\xac\x05\x59\x2d\x0a\xb6\x42\xa6\xe8\x54\x5a\x28\xd7\ +\x2a\x07\xb2\x67\x65\x57\x66\xbf\xcd\x89\xca\x39\x96\xab\x9e\x2b\ +\xcd\xed\xcc\xb3\xca\xdb\x90\x37\x9c\xef\x9f\xff\xed\x12\xc2\x12\ +\xe1\x92\xb6\xa5\x86\x4b\x57\x2d\x1d\x58\xe6\xbd\xac\x6a\x39\xb2\ +\x3c\x71\x79\xdb\x0a\xe3\x15\x05\x2b\x86\x56\x06\xac\x3c\xb8\x8a\ +\xb6\x2a\x6d\xd5\x4f\xab\xed\x57\x97\xae\x7e\xbd\x26\x7a\x4d\x6b\ +\x81\x5e\xc1\xca\x82\xc1\xb5\x01\x6b\xeb\x0b\x55\x0a\xe5\x85\x7d\ +\xeb\xdc\xd7\xed\x5d\x4f\x58\x2f\x59\xdf\xb5\x61\xfa\x86\x9d\x1b\ +\x3e\x15\x89\x8a\xae\x14\xdb\x17\x97\x15\x7f\xd8\x28\xdc\x78\xe5\ +\x1b\x87\x6f\xca\xbf\x99\xdc\x94\xb4\xa9\xab\xc4\xb9\x64\xcf\x66\ +\xd2\x66\xe9\xe6\xde\x2d\x9e\x5b\x0e\x96\xaa\x97\xe6\x97\x0e\x6e\ +\x0d\xd9\xda\xb4\x0d\xdf\x56\xb4\xed\xf5\xf6\x45\xdb\x2f\x97\xcd\ +\x28\xdb\xbb\x83\xb6\x43\xb9\xa3\xbf\x3c\xb8\xbc\x65\xa7\xc9\xce\ +\xcd\x3b\x3f\x54\xa4\x54\xf4\x54\xfa\x54\x36\xee\xd2\xdd\xb5\x61\ +\xd7\xf8\x6e\xd1\xee\x1b\x7b\xbc\xf6\x34\xec\xd5\xdb\x5b\xbc\xf7\ +\xfd\x3e\xc9\xbe\xdb\x55\x01\x55\x4d\xd5\x66\xd5\x65\xfb\x49\xfb\ +\xb3\xf7\x3f\xae\x89\xaa\xe9\xf8\x96\xfb\x6d\x5d\xad\x4e\x6d\x71\ +\xed\xc7\x03\xd2\x03\xfd\x07\x23\x0e\xb6\xd7\xb9\xd4\xd5\x1d\xd2\ +\x3d\x54\x52\x8f\xd6\x2b\xeb\x47\x0e\xc7\x1f\xbe\xfe\x9d\xef\x77\ +\x2d\x0d\x36\x0d\x55\x8d\x9c\xc6\xe2\x23\x70\x44\x79\xe4\xe9\xf7\ +\x09\xdf\xf7\x1e\x0d\x3a\xda\x76\x8c\x7b\xac\xe1\x07\xd3\x1f\x76\ +\x1d\x67\x1d\x2f\x6a\x42\x9a\xf2\x9a\x46\x9b\x53\x9a\xfb\x5b\x62\ +\x5b\xba\x4f\xcc\x3e\xd1\xd6\xea\xde\x7a\xfc\x47\xdb\x1f\x0f\x9c\ +\x34\x3c\x59\x79\x4a\xf3\x54\xc9\x69\xda\xe9\x82\xd3\x93\x67\xf2\ +\xcf\x8c\x9d\x95\x9d\x7d\x7e\x2e\xf9\xdc\x60\xdb\xa2\xb6\x7b\xe7\ +\x63\xce\xdf\x6a\x0f\x6f\xef\xba\x10\x74\xe1\xd2\x45\xff\x8b\xe7\ +\x3b\xbc\x3b\xce\x5c\xf2\xb8\x74\xf2\xb2\xdb\xe5\x13\x57\xb8\x57\ +\x9a\xaf\x3a\x5f\x6d\xea\x74\xea\x3c\xfe\x93\xd3\x4f\xc7\xbb\x9c\ +\xbb\x9a\xae\xb9\x5c\x6b\xb9\xee\x7a\xbd\xb5\x7b\x66\xf7\xe9\x1b\ +\x9e\x37\xce\xdd\xf4\xbd\x79\xf1\x16\xff\xd6\xd5\x9e\x39\x3d\xdd\ +\xbd\xf3\x7a\x6f\xf7\xc5\xf7\xf5\xdf\x16\xdd\x7e\x72\x27\xfd\xce\ +\xcb\xbb\xd9\x77\x27\xee\xad\xbc\x4f\xbc\x5f\xf4\x40\xed\x41\xd9\ +\x43\xdd\x87\xd5\x3f\x5b\xfe\xdc\xd8\xef\xdc\x7f\x6a\xc0\x77\xa0\ +\xf3\xd1\xdc\x47\xf7\x06\x85\x83\xcf\xfe\x91\xf5\x8f\x0f\x43\x05\ +\x8f\x99\x8f\xcb\x86\x0d\x86\xeb\x9e\x38\x3e\x39\x39\xe2\x3f\x72\ +\xfd\xe9\xfc\xa7\x43\xcf\x64\xcf\x26\x9e\x17\xfe\xa2\xfe\xcb\xae\ +\x17\x16\x2f\x7e\xf8\xd5\xeb\xd7\xce\xd1\x98\xd1\xa1\x97\xf2\x97\ +\x93\xbf\x6d\x7c\xa5\xfd\xea\xc0\xeb\x19\xaf\xdb\xc6\xc2\xc6\x1e\ +\xbe\xc9\x78\x33\x31\x5e\xf4\x56\xfb\xed\xc1\x77\xdc\x77\x1d\xef\ +\xa3\xdf\x0f\x4f\xe4\x7c\x20\x7f\x28\xff\x68\xf9\xb1\xf5\x53\xd0\ +\xa7\xfb\x93\x19\x93\x93\xff\x04\x03\x98\xf3\xfc\x63\x33\x2d\xdb\ +\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\x25\x00\x00\x80\x83\ +\x00\x00\xf9\xff\x00\x00\x80\xe9\x00\x00\x75\x30\x00\x00\xea\x60\ +\x00\x00\x3a\x98\x00\x00\x17\x6f\x92\x5f\xc5\x46\x00\x00\x0a\x95\ +\x49\x44\x41\x54\x78\xda\x62\xfa\xff\xff\x3f\x03\x3a\x66\x62\x60\ +\x60\x60\x28\xdf\xa1\xf5\xbf\x76\xb7\xc9\x7f\x06\x28\x60\x62\x60\ +\x60\x60\xd0\x95\x70\x67\xf8\xf5\xf7\x1b\x03\x8a\xa0\xc9\xca\x45\ +\x0c\x33\xba\xb2\x19\x0a\xe6\x14\xfc\x87\x0b\x6a\xb4\xbf\x65\xfc\ +\xb8\x2f\x9b\xf1\xf5\xc7\xd7\x0c\x0c\x0c\x0c\x0c\x00\x00\x00\x00\ +\xff\xff\x62\xc2\xb0\xa4\x74\xbb\xda\xff\x3f\xff\x7e\xfe\x9f\x7c\ +\x3c\x0c\xa2\x8d\x91\x91\xa5\xe8\xe4\xe3\xd5\x0c\x35\xd5\xf6\x5f\ +\x19\x18\x18\x18\x98\x92\x0e\xbe\xec\xb3\x89\xfc\xc3\xc8\xc0\xc0\ +\xc0\x5d\x30\xa7\xe0\x3f\x93\x46\xfb\x5b\xc6\xff\xc7\x12\x18\x60\ +\x06\x03\x00\x00\x00\xff\xff\x62\xfa\xff\xff\x3f\x43\xe9\x76\x8d\ +\xa4\xb6\x03\x4e\xff\x0b\xb7\x28\xfe\x5f\x7d\xb9\xe6\xff\xaf\xbf\ +\x3f\x4e\x60\xf8\x86\x91\x81\x71\x92\xbe\xa4\x17\x83\xba\xa8\x2d\ +\xc3\xf1\x47\xcb\x18\x78\x6d\x96\xf8\x30\x20\x01\x26\x06\x06\x06\ +\x86\xc4\x83\x2f\x2f\xef\xbb\x37\x7b\xc1\xed\x37\xc7\x18\x3e\xbf\ +\x97\x64\x64\xe7\xf8\xf1\x1a\x43\x91\x46\xfb\x5b\xcb\x1e\x8f\x1b\ +\x89\x3d\x5e\xb7\x19\x67\x45\x1f\x61\xf8\xb8\x2f\x9b\xf1\xd5\xeb\ +\xd7\xff\x5f\xbd\x7e\xfd\x9f\x81\x81\x81\x01\x00\x00\x00\xff\xff\ +\x62\xc2\x16\xa2\x28\xee\x29\xdf\xa1\xc5\xb0\xfc\x62\xe9\xff\xf2\ +\x1d\x5a\xff\x1b\xf6\x5a\xfc\xff\xfe\xfb\xd3\xff\x9f\x7f\xbe\x20\ +\xac\x61\x61\x62\x67\x38\xff\x7c\x33\x43\xb0\x4e\x23\xc3\x8b\xcf\ +\xb7\x19\xe6\x9d\x4d\x67\xa8\xdc\xa9\x87\x50\xf0\xe7\xdf\x0f\x06\ +\x06\x06\x46\x06\x3e\x76\x71\x06\x7e\x0e\x71\x86\x47\x9f\x8f\xa6\ +\xcd\xed\x2d\xe6\x86\x2b\xf8\xc5\xcc\xc4\xf0\xe7\xef\x4f\x06\x45\ +\x41\x13\x86\x1f\x7f\x3e\x33\x3c\xb8\xa9\x3b\x9b\x81\x81\x01\x6e\ +\x07\x53\xfa\xbe\x17\x5c\x8e\x77\x7e\x31\x7e\xfb\xfd\x81\x81\x83\ +\x85\xf7\xda\xb6\x35\x3e\x69\xe8\x5e\xf5\x51\x7d\xf1\xfd\xff\x97\ +\x26\x05\x89\x19\x5d\xd9\x4a\x4c\x4c\xff\x66\xfa\xfa\x1c\x67\x28\ +\x9e\x57\xfc\x3f\xa6\x2f\xe6\x3f\x93\x46\xfb\xdb\x55\x1a\xed\x6f\ +\x19\x65\xdb\x7f\xbd\xfc\xb8\x2f\x9b\xf3\xe3\xbe\x6c\x46\x6e\x0e\ +\x1e\x86\x72\xdf\x0a\x06\x6e\x0e\x1e\x48\x60\xa1\x83\x2f\xdf\x3f\ +\x33\x14\x2e\x2a\x60\xf8\xf2\xfd\x33\x03\x80\x91\xfa\x07\x69\x23\ +\x0c\xc3\x00\xfe\x7c\x26\x27\x26\x1a\x8d\x29\x96\x46\x23\x76\xd0\ +\x34\x69\xb1\x81\x62\x41\x4a\x41\x17\x0b\x22\x38\xa4\x83\x8b\x9b\ +\xba\x18\x23\x84\x84\x6b\x91\x76\x28\x1a\x52\x8a\x8a\xd2\x16\x9d\ +\x3a\x08\x59\x8a\x8a\x94\xe8\x21\x6a\x88\x1d\x1c\x1c\x34\x5a\xfc\ +\x03\x1a\x44\x10\xce\x82\xf1\x3c\x8f\x6b\x4c\x72\x77\x9f\x83\x38\ +\x08\x1e\xf4\x9d\xde\xe9\xc7\x33\x3c\xef\x5b\x40\x29\x05\xcb\xb9\ +\xf1\x69\xe5\x15\xfc\xbf\x2a\x4b\x58\xce\xed\x65\x39\xf7\x20\xcb\ +\x3d\xfd\x3c\xb0\xe8\xe9\x65\x39\x57\x7d\xf7\xac\x85\x50\x4a\xa1\ +\x69\x0a\x74\xab\x0a\x00\x72\x4e\xd0\x4c\x4c\x99\x04\x90\x19\x9b\ +\xc9\xf1\x41\xd5\x72\xef\xc2\x6f\x92\xdf\x0b\x0d\xe6\xed\x62\xa6\ +\x5c\x0b\x2e\xd4\xd2\x10\xf7\xe4\xbe\x50\x37\x08\xa5\x2a\x18\x43\ +\x11\x6d\xac\xee\x40\x5e\xfd\x87\x17\x95\xed\xa8\xb6\x3e\x47\x6c\ +\xff\x0b\x32\x8a\x04\x42\x88\x8c\x02\x91\x94\xca\xdd\xfa\x48\x83\ +\xe3\x2d\xdc\x15\xcd\x27\x7f\x4e\x17\x91\xd7\x72\x68\xa9\xeb\xc3\ +\xc1\xd9\x1a\xa4\xec\x19\x6a\x6d\x8d\xb0\x99\xab\x9e\x4d\x86\x07\ +\xc7\x47\x27\x2c\x09\x5d\xe4\xe5\xd4\x24\x2c\xbf\x7f\xd6\x48\xca\ +\xc5\x47\x33\x63\x45\x26\x7f\x89\xd2\xa2\x0a\x24\xf9\x18\x8e\xc5\ +\xf5\xa5\x89\xb1\xf6\x63\x23\xa3\xf6\x03\x68\xd2\x45\xb2\x46\xd2\ +\xe6\xe4\x33\xb4\x2b\xf1\xf7\x75\x5b\xf2\x9c\xec\x1c\x4d\x93\xf2\ +\xe2\x07\x64\x39\xd6\x42\xbe\x0e\x05\x5a\x65\xa9\xe4\xf6\xb4\xb7\ +\x74\x11\x00\xf3\x00\x18\x00\x81\x87\x62\x0e\x8f\xa6\xfc\x78\x3f\ +\xd0\x89\xc3\x5d\xa7\xd7\x60\x54\x52\x00\x54\x00\xdf\x7a\x3a\x8f\ +\x3c\xc3\x73\x23\xf4\x5c\x10\xe8\xf0\xdc\x08\x0d\xfd\x08\xdd\xf9\ +\x04\x70\x45\xd2\x8a\x2b\x92\xde\x73\x45\xd2\x70\x0c\xc9\x50\x57\ +\xbb\x20\xc6\x7d\xb3\x62\xdc\xf7\x58\x8c\xfb\x8c\x62\xdc\xe7\xe7\ +\x05\x1e\x9b\xa9\x0d\x64\xaf\xae\xb0\x99\xda\x00\x2f\xf0\x77\x92\ +\xfc\xd7\x44\x83\x51\x12\x0d\x46\x89\xdd\x6e\x27\xb7\x3b\x00\x5c\ +\x53\x52\x6e\x21\x4d\xc6\x61\x18\xff\xfd\xbf\xa9\x13\xc3\x9a\xc7\ +\x0d\x52\xd3\x28\x0f\x95\x9a\x74\x20\xb5\x2e\x23\xf2\x00\x51\x61\ +\x20\xb6\x8a\xea\x42\xb4\x5a\x61\x59\x41\x65\x18\x49\x91\x22\x11\ +\x41\x60\x41\x9a\x90\x84\xbb\x30\x48\x0d\x59\x84\xa6\x61\x05\x91\ +\x59\xd0\x81\x3c\xa4\x96\xb9\x60\x6d\x6e\x73\xf3\xfb\xfe\xdd\x78\ +\x11\xc1\x2c\x2f\x9e\xbb\x87\xdf\xc5\xfb\x3e\xcf\xf3\xcf\x56\xfe\ +\x8f\x14\x80\x53\xed\xa9\x58\x07\xab\x38\xd9\x9e\x92\x5e\xd9\xb1\ +\xea\x44\x65\x47\xda\xd5\xae\x4f\x37\xcf\x9f\xea\x48\x2b\xac\x78\ +\xb4\x32\xea\x5a\x77\x1e\x52\x6a\x48\xa9\x06\xce\x89\x10\x0a\x9f\ +\x7f\xf6\xcb\x9c\x84\xe2\x37\x3e\xd5\x5d\x0b\xe2\xa4\x2a\x67\x2f\ +\x0a\x44\x5b\x79\x76\xcb\xd4\xd1\x9c\x56\xe9\xd7\xbc\x46\x9f\xea\ +\x61\xbe\xef\x64\x4d\x4d\x0f\xd1\x33\xdc\x44\x51\x7a\x0d\x7e\xd5\ +\x4b\x86\x69\x1b\x85\xa9\xa7\xa9\xed\x29\xe4\x4c\xe7\x1a\xce\x74\ +\x66\x58\xcf\x3e\x5e\x1b\x18\x12\xa4\x84\x84\xfa\x55\x0f\x41\x4a\ +\x08\xd6\xc1\x0b\xac\x36\x6e\xe5\xd9\xf0\x3d\x5a\x07\x2f\xb0\xcc\ +\x90\xc9\x8a\xa8\x6c\xc2\x82\x0d\x9f\x03\x1d\x5c\x01\xf0\xa9\x1e\ +\xd7\xf2\xc8\x8d\x24\x18\x32\x99\x99\x75\x73\x70\xfd\x2d\x04\x0a\ +\xa6\xf0\x95\x8c\xfd\x7a\xc7\x07\x7b\x77\x6e\xd8\x6c\x8e\x79\xb1\ +\x7b\x7f\x60\x88\x22\x14\xe7\xa8\x63\x80\x8f\x53\xbd\x24\x47\x6f\ +\x46\x93\x2a\x4f\xbf\xdc\xc6\x3e\x3d\x82\x40\x61\x72\x74\x45\xef\ +\xe5\x2b\x69\x27\xea\x6e\x46\x04\x86\xac\x5b\xba\xc3\x9e\x12\xbd\ +\x19\x21\x74\xa4\xc4\x6c\xa1\xe1\xe5\x21\x16\x85\x44\x90\x9d\x50\ +\x4c\x6c\x78\xd2\x74\xff\x93\x6d\x28\x8a\x56\x0b\xc4\x06\x84\xf4\ +\x7d\x6b\x73\x0e\x4e\xda\xd8\x10\xb7\x93\xde\x91\x66\xbc\xfe\x5f\ +\x98\xc2\x93\x79\x3e\x7a\x9f\xe9\xd9\xe1\xa6\xb1\xaf\x86\xc4\x39\ +\xff\xee\x80\x90\x63\x9d\xe3\x10\xac\x17\xaf\xc7\x1f\x92\x97\x52\ +\x81\x39\xeb\x06\x5f\x1d\x6f\x01\x70\xbb\xc3\x4a\x15\x9d\x56\x35\ +\xe7\x4f\x08\x08\xf1\x06\x2b\x47\xca\x1f\x4f\x44\x6a\xba\xa0\xd0\ +\xd6\x81\x73\x38\x7d\x3f\x10\x42\x41\x1f\x3a\xb3\xf1\x4e\xfd\x61\ +\x74\x3a\x75\xdf\x9c\xff\xfb\x7c\x39\xd9\x35\x13\x24\xec\xa5\x5d\ +\x13\x7a\xe3\xf8\xa4\x88\x5f\x92\x21\x46\xbe\x18\xc5\xf5\x4b\x96\ +\x17\x9a\xa6\x34\xff\xe1\x6f\x9b\x0f\x12\x0a\xe0\xd7\x09\xc7\xf6\ +\x8f\xb2\xb7\xde\xbc\x9e\xf6\x07\x45\x77\xa5\xa6\x48\xa0\x18\xa0\ +\xb0\xa0\x8f\xbd\x7b\xde\x7f\xb2\x34\x58\xa4\xa5\xc1\x22\xcb\x6f\ +\x95\xcb\x92\xba\x12\xf9\x27\x64\x13\x90\x04\xc4\x80\xcc\x79\x35\ +\x93\x01\xc8\x03\x80\x15\xf0\x01\x93\x26\x83\x89\x44\x63\x12\x71\ +\xd1\xf1\xc4\x45\xc7\x93\x68\x4c\xc2\x64\x30\xf1\xf7\x9e\x0c\xa5\ +\xd6\xd8\xa7\x52\x6b\xec\x34\xb5\xdc\xc1\x61\x2b\xd3\x1c\xb6\xb2\ +\x5d\x0e\x5b\x99\xde\x61\x2b\x33\x3a\xbd\x2e\x0a\x32\xf3\x31\xe7\ +\x9a\x31\xe7\x9a\x29\xc8\xcc\xc7\xe9\x75\x2d\x6c\x4f\x5c\x1e\x27\ +\xd5\xd6\x6a\x8e\x37\x5a\x38\xde\x68\xa1\xda\x5a\x8d\xcb\xe3\x5c\ +\xf8\x28\xcd\xdb\x9d\x85\xac\xda\xdf\x02\xf8\xcd\x7a\xb9\xc6\xc4\ +\x51\x46\x61\xf8\x9d\xd9\x9d\xd9\x4b\x61\xcb\xdd\x52\x96\x22\x97\ +\x05\xc1\x8a\xa1\x2d\x6c\x4d\x05\x0b\x05\x0b\x06\x94\x04\x41\xdb\ +\xa4\xda\xc4\x6a\xdb\xb0\x82\x0d\x54\x2c\x44\x29\xb1\x11\xa5\xd6\ +\x46\x4b\x7f\x78\x69\x09\x12\xa2\x41\xc4\xc6\x00\xe5\xba\xdc\x2c\ +\xb7\x02\xb5\x85\x0a\x85\x42\x29\x72\xdd\x05\xba\xbb\xb0\x37\x76\ +\xd9\xf1\x87\x8c\x11\x52\x4d\x16\xf8\x26\xe7\xc7\xcc\x9c\xbc\x79\ +\xe6\x9b\x2f\xe7\xbc\x67\x53\x2a\xdb\xa6\x55\xc7\x15\xe7\x88\xf7\ +\xaf\x3f\x85\xec\x3a\x29\xaa\x87\x2e\xed\x3d\xd7\x10\x7a\x29\xad\ +\xd2\xbb\x39\xbd\x52\x32\x92\x51\x15\xa0\xce\xa8\x0a\x30\x65\x54\ +\x05\x58\x4e\x5f\xf7\xb3\xd4\x0c\x7d\x65\xc8\xae\x93\xce\xa5\x57\ +\x4a\x06\x53\xcb\x77\x34\x9d\xaa\xf0\x2a\xc8\xa8\xf2\x4f\x2b\xba\ +\x95\xfa\x3c\x7b\xe4\x36\xb4\xad\x04\x41\xda\x18\xcc\x0b\xc3\x35\ +\x43\x5f\xb6\xcd\xe9\xfe\x94\xd9\x0b\xc4\xa1\xd1\xbe\xa7\x3c\x3d\ +\xec\x82\x44\x4b\xcb\x3a\x2e\x00\xc2\xc2\x98\x09\x8a\xc3\xe7\x05\ +\xba\x46\x3b\x7c\x18\xd1\x22\xc9\x8b\x19\x08\x3b\x14\xf8\xd9\x51\ +\x7f\x97\x88\xcf\x67\x16\xef\xb7\x7c\xda\x14\xa5\xcf\x6b\x8e\xce\ +\xcd\x6d\x8a\x44\x6e\x53\xa4\xf5\x20\xcc\xdf\x57\x10\x00\x2f\x2e\ +\x49\x83\xe6\x08\xb1\x60\x54\xa2\xe2\xde\x79\x58\x18\x13\x12\x9e\ +\xce\x81\xc6\x30\x83\xd0\x27\x8f\x22\xdc\xeb\x1d\xe8\x97\xd4\xc8\ +\xaa\x09\x42\x66\x75\x20\x4a\xfa\xb2\x70\x67\xba\x0a\x93\x9a\x7e\ +\x28\xb5\x23\x98\xd5\x8e\xc6\xa8\xf4\x93\x84\x4a\x3f\x69\x3d\x48\ +\x88\xf8\x55\x48\xc5\x89\xda\x60\x71\x02\x7c\x1c\xf7\x82\x22\x79\ +\x30\x2d\x1b\x40\x73\x04\x18\x9a\x6b\xc3\xd2\xb2\x01\xf9\xaf\x4c\ +\xc3\xdb\x21\x04\x27\xaf\x39\x61\x46\x3b\x8c\x83\x92\x14\x44\x78\ +\x1f\x87\x54\x9c\x88\x20\xd7\x58\x04\xba\x46\xab\x82\xc5\x09\x65\ +\x21\x1e\xb1\x6f\x79\x39\xfb\x33\x3e\x2e\x3b\xad\x07\xb9\x39\xfe\ +\x33\x3a\xc7\x4b\x75\x9d\xe3\xa5\xa6\x7e\x45\x23\x8c\xcb\x3a\x48\ +\xdd\x93\xb0\xf3\x89\x28\x18\xcd\x5a\xf0\x29\x1b\xcc\xeb\xc6\xa1\ +\xd4\x8e\x62\xb7\x38\x1e\x63\xaa\xdb\x68\x7a\x70\x15\xcd\x0f\x0a\ +\xd0\x35\xf1\x0b\xee\x2a\x6a\x0a\xef\xcd\xca\xed\x2f\x17\xcf\x25\ +\x1c\x93\x79\x76\xa7\xa6\x44\x22\x25\x65\xbf\xf5\x20\x04\x41\x82\ +\x20\xc8\x79\x30\x8c\x86\x7d\xd6\x35\x51\x86\xa1\xd9\x1b\x38\x29\ +\x2d\x46\xb0\x5b\x02\xc6\x54\x77\x70\xed\x8f\x8f\x31\xa8\xfc\x0d\ +\x24\x41\x42\x40\x6d\x85\x9b\x28\x00\xbe\x4e\xfb\xb0\x6b\xc7\x81\ +\x82\xdb\x8d\x47\xd0\xd1\xbc\x27\x9e\x01\x18\x1e\xcf\x22\xa3\x69\ +\x66\xbd\x35\x80\x51\x72\x48\x6a\xc2\xd5\xd6\x0f\x52\xf7\x24\xf8\ +\x39\x85\x61\x5e\x3f\x8e\xd6\xb1\x62\x50\x1c\x3e\x6a\xef\xe7\x43\ +\xc4\x77\x46\x9c\xff\x07\xf0\x77\x0e\x87\xce\xa4\xc2\xe8\xa3\x1e\ +\x0c\xce\x37\xf4\x35\xf6\xb6\xb5\x74\x74\x0b\xc1\xe7\x21\x73\x45\ +\xec\x23\x00\xe1\x56\x83\x78\xce\xe8\xe0\xae\xd4\x33\x16\x66\xf9\ +\x59\x85\xfe\xe1\xb1\x9b\xe3\xa5\xe8\x9d\xa9\x46\x94\x44\x06\x7b\ +\x81\x1b\x14\xda\x11\xbc\xec\x9f\x89\xc0\x6d\x31\x28\xe9\xcd\xc4\ +\xf0\x7c\x27\xb8\x24\x0d\x8a\xc3\x07\x8f\x66\xde\xeb\xed\xda\x6d\ +\xd1\x2e\xda\xbe\x4e\x90\x96\xe0\x15\x49\x67\x00\xfb\xad\x06\x79\ +\xa1\x5f\xcd\x39\x70\x57\xed\x78\xa2\x6e\x5a\x14\x36\xa0\xb9\x62\ +\x26\x49\x82\xa6\x44\x45\xf2\xe1\xaf\x61\x30\x2d\xc0\x65\x8b\x17\ +\x4c\xcb\x7a\xdc\x78\x58\x04\x21\x65\x07\x80\x01\x80\x59\x1e\xdf\ +\xf8\xcc\xef\x1d\xbb\xea\xbb\x5b\xf7\x38\xf0\x78\xc6\x0b\x6b\xf4\ +\x39\xeb\xf9\x35\x3b\x00\x64\x1b\x29\x42\x2d\x99\xd6\x37\xca\x6a\ +\xa7\x6c\x43\x07\xd4\x6f\x50\xb4\x2d\xd9\xae\x28\x7f\xb1\x7d\xa2\ +\xf4\x72\xe0\xb6\xe8\x1f\x9c\x84\x1e\xf9\x24\x57\x97\xc4\x13\x18\ +\x6d\xe6\x94\x8e\xce\xdf\x7d\x71\xbc\xaf\xbe\x22\xd2\x9e\xa2\x4d\ +\x1d\x00\xb6\xff\x4b\x4f\x0d\xa0\x75\x3d\x20\x87\x01\x24\xb1\x1b\ +\x64\xe4\x12\x1a\xdf\x69\xfd\xad\x13\x75\xd3\xfb\xd2\xeb\x54\xb5\ +\xdb\x8b\x73\x64\x83\x4d\x85\x87\x7f\x2d\x8b\x7f\xf7\xe2\xd9\xd3\ +\x3f\x9d\x3f\x73\x46\x58\x72\xe5\x50\xa4\x76\x71\x4b\x03\x97\x6b\ +\x9e\x07\xe0\xc3\x0a\xc5\xc5\xb6\x21\x2e\xb6\x6d\xeb\x91\xd7\xfa\ +\x2b\xd8\x86\x9d\x76\x35\x8d\x59\xdb\xbc\xd9\x06\xbe\x16\xe4\x13\ +\x00\x2f\x01\x68\x07\x60\x00\x60\x06\xe0\x6e\xe6\x10\x59\x66\x9a\ +\x8a\x20\x35\x23\xb8\xf8\x4d\x3d\x7a\x7a\xed\xc1\xa3\xf1\x2d\xcd\ +\x37\x2a\x08\x92\xa9\x7d\xdc\x39\x10\x09\x45\x10\x09\x45\xab\x9a\ +\x7e\xf2\x41\xd9\x2a\x03\xc0\xe6\x3c\x0e\x84\x01\xd0\x03\xe0\x39\ +\x00\x82\x95\x69\xc5\x09\x40\x0c\x00\x39\x00\xe8\x2d\x14\x9b\xfb\ +\x36\x00\x02\x80\x18\x40\x22\x80\xb3\x2b\x1f\xf2\x26\x00\x27\x21\ +\x2d\x84\x90\x16\xae\x82\xb3\x13\xda\xad\xba\x5f\x9b\xf3\x0f\xc8\ +\x8a\x2b\xf9\xcf\x10\x9f\xd3\xa2\xf0\xc7\x02\x76\xf2\x61\x63\x42\ +\x2d\x4f\x2e\x55\xcb\x93\x73\xd4\xf2\xe4\x2c\xb5\x3c\xf9\x7b\xb5\ +\x3c\x79\x6e\xea\xd1\x14\xd8\x69\x88\x0d\x76\x2a\x62\x83\xcd\xb1\ +\xda\x4b\x6c\x74\x29\x34\x8a\xcd\x31\x35\x1b\x5d\x79\xe5\x79\xff\ +\xfb\xfe\xaf\x01\x00\x3d\xb9\x4e\x56\xa9\x10\xde\xd1\x00\x00\x00\ +\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x15\xd7\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x22\x00\x00\x00\x23\x08\x06\x00\x00\x01\x86\x1c\xe8\xf1\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x2e\x23\x00\x00\x2e\x23\ +\x01\x78\xa5\x3f\x76\x00\x00\x0a\x4f\x69\x43\x43\x50\x50\x68\x6f\ +\x74\x6f\x73\x68\x6f\x70\x20\x49\x43\x43\x20\x70\x72\x6f\x66\x69\ +\x6c\x65\x00\x00\x78\xda\x9d\x53\x67\x54\x53\xe9\x16\x3d\xf7\xde\ +\xf4\x42\x4b\x88\x80\x94\x4b\x6f\x52\x15\x08\x20\x52\x42\x8b\x80\ +\x14\x91\x26\x2a\x21\x09\x10\x4a\x88\x21\xa1\xd9\x15\x51\xc1\x11\ +\x45\x45\x04\x1b\xc8\xa0\x88\x03\x8e\x8e\x80\x8c\x15\x51\x2c\x0c\ +\x8a\x0a\xd8\x07\xe4\x21\xa2\x8e\x83\xa3\x88\x8a\xca\xfb\xe1\x7b\ +\xa3\x6b\xd6\xbc\xf7\xe6\xcd\xfe\xb5\xd7\x3e\xe7\xac\xf3\x9d\xb3\ +\xcf\x07\xc0\x08\x0c\x96\x48\x33\x51\x35\x80\x0c\xa9\x42\x1e\x11\ +\xe0\x83\xc7\xc4\xc6\xe1\xe4\x2e\x40\x81\x0a\x24\x70\x00\x10\x08\ +\xb3\x64\x21\x73\xfd\x23\x01\x00\xf8\x7e\x3c\x3c\x2b\x22\xc0\x07\ +\xbe\x00\x01\x78\xd3\x0b\x08\x00\xc0\x4d\x9b\xc0\x30\x1c\x87\xff\ +\x0f\xea\x42\x99\x5c\x01\x80\x84\x01\xc0\x74\x91\x38\x4b\x08\x80\ +\x14\x00\x40\x7a\x8e\x42\xa6\x00\x40\x46\x01\x80\x9d\x98\x26\x53\ +\x00\xa0\x04\x00\x60\xcb\x63\x62\xe3\x00\x50\x2d\x00\x60\x27\x7f\ +\xe6\xd3\x00\x80\x9d\xf8\x99\x7b\x01\x00\x5b\x94\x21\x15\x01\xa0\ +\x91\x00\x20\x13\x65\x88\x44\x00\x68\x3b\x00\xac\xcf\x56\x8a\x45\ +\x00\x58\x30\x00\x14\x66\x4b\xc4\x39\x00\xd8\x2d\x00\x30\x49\x57\ +\x66\x48\x00\xb0\xb7\x00\xc0\xce\x10\x0b\xb2\x00\x08\x0c\x00\x30\ +\x51\x88\x85\x29\x00\x04\x7b\x00\x60\xc8\x23\x23\x78\x00\x84\x99\ +\x00\x14\x46\xf2\x57\x3c\xf1\x2b\xae\x10\xe7\x2a\x00\x00\x78\x99\ +\xb2\x3c\xb9\x24\x39\x45\x81\x5b\x08\x2d\x71\x07\x57\x57\x2e\x1e\ +\x28\xce\x49\x17\x2b\x14\x36\x61\x02\x61\x9a\x40\x2e\xc2\x79\x99\ +\x19\x32\x81\x34\x0f\xe0\xf3\xcc\x00\x00\xa0\x91\x15\x11\xe0\x83\ +\xf3\xfd\x78\xce\x0e\xae\xce\xce\x36\x8e\xb6\x0e\x5f\x2d\xea\xbf\ +\x06\xff\x22\x62\x62\xe3\xfe\xe5\xcf\xab\x70\x40\x00\x00\xe1\x74\ +\x7e\xd1\xfe\x2c\x2f\xb3\x1a\x80\x3b\x06\x80\x6d\xfe\xa2\x25\xee\ +\x04\x68\x5e\x0b\xa0\x75\xf7\x8b\x66\xb2\x0f\x40\xb5\x00\xa0\xe9\ +\xda\x57\xf3\x70\xf8\x7e\x3c\x3c\x45\xa1\x90\xb9\xd9\xd9\xe5\xe4\ +\xe4\xd8\x4a\xc4\x42\x5b\x61\xca\x57\x7d\xfe\x67\xc2\x5f\xc0\x57\ +\xfd\x6c\xf9\x7e\x3c\xfc\xf7\xf5\xe0\xbe\xe2\x24\x81\x32\x5d\x81\ +\x47\x04\xf8\xe0\xc2\xcc\xf4\x4c\xa5\x1c\xcf\x92\x09\x84\x62\xdc\ +\xe6\x8f\x47\xfc\xb7\x0b\xff\xfc\x1d\xd3\x22\xc4\x49\x62\xb9\x58\ +\x2a\x14\xe3\x51\x12\x71\x8e\x44\x9a\x8c\xf3\x32\xa5\x22\x89\x42\ +\x92\x29\xc5\x25\xd2\xff\x64\xe2\xdf\x2c\xfb\x03\x3e\xdf\x35\x00\ +\xb0\x6a\x3e\x01\x7b\x91\x2d\xa8\x5d\x63\x03\xf6\x4b\x27\x10\x58\ +\x74\xc0\xe2\xf7\x00\x00\xf2\xbb\x6f\xc1\xd4\x28\x08\x03\x80\x68\ +\x83\xe1\xcf\x77\xff\xef\x3f\xfd\x47\xa0\x25\x00\x80\x66\x49\x92\ +\x71\x00\x00\x5e\x44\x24\x2e\x54\xca\xb3\x3f\xc7\x08\x00\x00\x44\ +\xa0\x81\x2a\xb0\x41\x1b\xf4\xc1\x18\x2c\xc0\x06\x1c\xc1\x05\xdc\ +\xc1\x0b\xfc\x60\x36\x84\x42\x24\xc4\xc2\x42\x10\x42\x0a\x64\x80\ +\x1c\x72\x60\x29\xac\x82\x42\x28\x86\xcd\xb0\x1d\x2a\x60\x2f\xd4\ +\x40\x1d\x34\xc0\x51\x68\x86\x93\x70\x0e\x2e\xc2\x55\xb8\x0e\x3d\ +\x70\x0f\xfa\x61\x08\x9e\xc1\x28\xbc\x81\x09\x04\x41\xc8\x08\x13\ +\x61\x21\xda\x88\x01\x62\x8a\x58\x23\x8e\x08\x17\x99\x85\xf8\x21\ +\xc1\x48\x04\x12\x8b\x24\x20\xc9\x88\x14\x51\x22\x4b\x91\x35\x48\ +\x31\x52\x8a\x54\x20\x55\x48\x1d\xf2\x3d\x72\x02\x39\x87\x5c\x46\ +\xba\x91\x3b\xc8\x00\x32\x82\xfc\x86\xbc\x47\x31\x94\x81\xb2\x51\ +\x3d\xd4\x0c\xb5\x43\xb9\xa8\x37\x1a\x84\x46\xa2\x0b\xd0\x64\x74\ +\x31\x9a\x8f\x16\xa0\x9b\xd0\x72\xb4\x1a\x3d\x8c\x36\xa1\xe7\xd0\ +\xab\x68\x0f\xda\x8f\x3e\x43\xc7\x30\xc0\xe8\x18\x07\x33\xc4\x6c\ +\x30\x2e\xc6\xc3\x42\xb1\x38\x2c\x09\x93\x63\xcb\xb1\x22\xac\x0c\ +\xab\xc6\x1a\xb0\x56\xac\x03\xbb\x89\xf5\x63\xcf\xb1\x77\x04\x12\ +\x81\x45\xc0\x09\x36\x04\x77\x42\x20\x61\x1e\x41\x48\x58\x4c\x58\ +\x4e\xd8\x48\xa8\x20\x1c\x24\x34\x11\xda\x09\x37\x09\x03\x84\x51\ +\xc2\x27\x22\x93\xa8\x4b\xb4\x26\xba\x11\xf9\xc4\x18\x62\x32\x31\ +\x87\x58\x48\x2c\x23\xd6\x12\x8f\x13\x2f\x10\x7b\x88\x43\xc4\x37\ +\x24\x12\x89\x43\x32\x27\xb9\x90\x02\x49\xb1\xa4\x54\xd2\x12\xd2\ +\x46\xd2\x6e\x52\x23\xe9\x2c\xa9\x9b\x34\x48\x1a\x23\x93\xc9\xda\ +\x64\x6b\xb2\x07\x39\x94\x2c\x20\x2b\xc8\x85\xe4\x9d\xe4\xc3\xe4\ +\x33\xe4\x1b\xe4\x21\xf2\x5b\x0a\x9d\x62\x40\x71\xa4\xf8\x53\xe2\ +\x28\x52\xca\x6a\x4a\x19\xe5\x10\xe5\x34\xe5\x06\x65\x98\x32\x41\ +\x55\xa3\x9a\x52\xdd\xa8\xa1\x54\x11\x35\x8f\x5a\x42\xad\xa1\xb6\ +\x52\xaf\x51\x87\xa8\x13\x34\x75\x9a\x39\xcd\x83\x16\x49\x4b\xa5\ +\xad\xa2\x95\xd3\x1a\x68\x17\x68\xf7\x69\xaf\xe8\x74\xba\x11\xdd\ +\x95\x1e\x4e\x97\xd0\x57\xd2\xcb\xe9\x47\xe8\x97\xe8\x03\xf4\x77\ +\x0c\x0d\x86\x15\x83\xc7\x88\x67\x28\x19\x9b\x18\x07\x18\x67\x19\ +\x77\x18\xaf\x98\x4c\xa6\x19\xd3\x8b\x19\xc7\x54\x30\x37\x31\xeb\ +\x98\xe7\x99\x0f\x99\x6f\x55\x58\x2a\xb6\x2a\x7c\x15\x91\xca\x0a\ +\x95\x4a\x95\x26\x95\x1b\x2a\x2f\x54\xa9\xaa\xa6\xaa\xde\xaa\x0b\ +\x55\xf3\x55\xcb\x54\x8f\xa9\x5e\x53\x7d\xae\x46\x55\x33\x53\xe3\ +\xa9\x09\xd4\x96\xab\x55\xaa\x9d\x50\xeb\x53\x1b\x53\x67\xa9\x3b\ +\xa8\x87\xaa\x67\xa8\x6f\x54\x3f\xa4\x7e\x59\xfd\x89\x06\x59\xc3\ +\x4c\xc3\x4f\x43\xa4\x51\xa0\xb1\x5f\xe3\xbc\xc6\x20\x0b\x63\x19\ +\xb3\x78\x2c\x21\x6b\x0d\xab\x86\x75\x81\x35\xc4\x26\xb1\xcd\xd9\ +\x7c\x76\x2a\xbb\x98\xfd\x1d\xbb\x8b\x3d\xaa\xa9\xa1\x39\x43\x33\ +\x4a\x33\x57\xb3\x52\xf3\x94\x66\x3f\x07\xe3\x98\x71\xf8\x9c\x74\ +\x4e\x09\xe7\x28\xa7\x97\xf3\x7e\x8a\xde\x14\xef\x29\xe2\x29\x1b\ +\xa6\x34\x4c\xb9\x31\x65\x5c\x6b\xaa\x96\x97\x96\x58\xab\x48\xab\ +\x51\xab\x47\xeb\xbd\x36\xae\xed\xa7\x9d\xa6\xbd\x45\xbb\x59\xfb\ +\x81\x0e\x41\xc7\x4a\x27\x5c\x27\x47\x67\x8f\xce\x05\x9d\xe7\x53\ +\xd9\x53\xdd\xa7\x0a\xa7\x16\x4d\x3d\x3a\xf5\xae\x2e\xaa\x6b\xa5\ +\x1b\xa1\xbb\x44\x77\xbf\x6e\xa7\xee\x98\x9e\xbe\x5e\x80\x9e\x4c\ +\x6f\xa7\xde\x79\xbd\xe7\xfa\x1c\x7d\x2f\xfd\x54\xfd\x6d\xfa\xa7\ +\xf5\x47\x0c\x58\x06\xb3\x0c\x24\x06\xdb\x0c\xce\x18\x3c\xc5\x35\ +\x71\x6f\x3c\x1d\x2f\xc7\xdb\xf1\x51\x43\x5d\xc3\x40\x43\xa5\x61\ +\x95\x61\x97\xe1\x84\x91\xb9\xd1\x3c\xa3\xd5\x46\x8d\x46\x0f\x8c\ +\x69\xc6\x5c\xe3\x24\xe3\x6d\xc6\x6d\xc6\xa3\x26\x06\x26\x21\x26\ +\x4b\x4d\xea\x4d\xee\x9a\x52\x4d\xb9\xa6\x29\xa6\x3b\x4c\x3b\x4c\ +\xc7\xcd\xcc\xcd\xa2\xcd\xd6\x99\x35\x9b\x3d\x31\xd7\x32\xe7\x9b\ +\xe7\x9b\xd7\x9b\xdf\xb7\x60\x5a\x78\x5a\x2c\xb6\xa8\xb6\xb8\x65\ +\x49\xb2\xe4\x5a\xa6\x59\xee\xb6\xbc\x6e\x85\x5a\x39\x59\xa5\x58\ +\x55\x5a\x5d\xb3\x46\xad\x9d\xad\x25\xd6\xbb\xad\xbb\xa7\x11\xa7\ +\xb9\x4e\x93\x4e\xab\x9e\xd6\x67\xc3\xb0\xf1\xb6\xc9\xb6\xa9\xb7\ +\x19\xb0\xe5\xd8\x06\xdb\xae\xb6\x6d\xb6\x7d\x61\x67\x62\x17\x67\ +\xb7\xc5\xae\xc3\xee\x93\xbd\x93\x7d\xba\x7d\x8d\xfd\x3d\x07\x0d\ +\x87\xd9\x0e\xab\x1d\x5a\x1d\x7e\x73\xb4\x72\x14\x3a\x56\x3a\xde\ +\x9a\xce\x9c\xee\x3f\x7d\xc5\xf4\x96\xe9\x2f\x67\x58\xcf\x10\xcf\ +\xd8\x33\xe3\xb6\x13\xcb\x29\xc4\x69\x9d\x53\x9b\xd3\x47\x67\x17\ +\x67\xb9\x73\x83\xf3\x88\x8b\x89\x4b\x82\xcb\x2e\x97\x3e\x2e\x9b\ +\x1b\xc6\xdd\xc8\xbd\xe4\x4a\x74\xf5\x71\x5d\xe1\x7a\xd2\xf5\x9d\ +\x9b\xb3\x9b\xc2\xed\xa8\xdb\xaf\xee\x36\xee\x69\xee\x87\xdc\x9f\ +\xcc\x34\x9f\x29\x9e\x59\x33\x73\xd0\xc3\xc8\x43\xe0\x51\xe5\xd1\ +\x3f\x0b\x9f\x95\x30\x6b\xdf\xac\x7e\x4f\x43\x4f\x81\x67\xb5\xe7\ +\x23\x2f\x63\x2f\x91\x57\xad\xd7\xb0\xb7\xa5\x77\xaa\xf7\x61\xef\ +\x17\x3e\xf6\x3e\x72\x9f\xe3\x3e\xe3\x3c\x37\xde\x32\xde\x59\x5f\ +\xcc\x37\xc0\xb7\xc8\xb7\xcb\x4f\xc3\x6f\x9e\x5f\x85\xdf\x43\x7f\ +\x23\xff\x64\xff\x7a\xff\xd1\x00\xa7\x80\x25\x01\x67\x03\x89\x81\ +\x41\x81\x5b\x02\xfb\xf8\x7a\x7c\x21\xbf\x8e\x3f\x3a\xdb\x65\xf6\ +\xb2\xd9\xed\x41\x8c\xa0\xb9\x41\x15\x41\x8f\x82\xad\x82\xe5\xc1\ +\xad\x21\x68\xc8\xec\x90\xad\x21\xf7\xe7\x98\xce\x91\xce\x69\x0e\ +\x85\x50\x7e\xe8\xd6\xd0\x07\x61\xe6\x61\x8b\xc3\x7e\x0c\x27\x85\ +\x87\x85\x57\x86\x3f\x8e\x70\x88\x58\x1a\xd1\x31\x97\x35\x77\xd1\ +\xdc\x43\x73\xdf\x44\xfa\x44\x96\x44\xde\x9b\x67\x31\x4f\x39\xaf\ +\x2d\x4a\x35\x2a\x3e\xaa\x2e\x6a\x3c\xda\x37\xba\x34\xba\x3f\xc6\ +\x2e\x66\x59\xcc\xd5\x58\x9d\x58\x49\x6c\x4b\x1c\x39\x2e\x2a\xae\ +\x36\x6e\x6c\xbe\xdf\xfc\xed\xf3\x87\xe2\x9d\xe2\x0b\xe3\x7b\x17\ +\x98\x2f\xc8\x5d\x70\x79\xa1\xce\xc2\xf4\x85\xa7\x16\xa9\x2e\x12\ +\x2c\x3a\x96\x40\x4c\x88\x4e\x38\x94\xf0\x41\x10\x2a\xa8\x16\x8c\ +\x25\xf2\x13\x77\x25\x8e\x0a\x79\xc2\x1d\xc2\x67\x22\x2f\xd1\x36\ +\xd1\x88\xd8\x43\x5c\x2a\x1e\x4e\xf2\x48\x2a\x4d\x7a\x92\xec\x91\ +\xbc\x35\x79\x24\xc5\x33\xa5\x2c\xe5\xb9\x84\x27\xa9\x90\xbc\x4c\ +\x0d\x4c\xdd\x9b\x3a\x9e\x16\x9a\x76\x20\x6d\x32\x3d\x3a\xbd\x31\ +\x83\x92\x91\x90\x71\x42\xaa\x21\x4d\x93\xb6\x67\xea\x67\xe6\x66\ +\x76\xcb\xac\x65\x85\xb2\xfe\xc5\x6e\x8b\xb7\x2f\x1e\x95\x07\xc9\ +\x6b\xb3\x90\xac\x05\x59\x2d\x0a\xb6\x42\xa6\xe8\x54\x5a\x28\xd7\ +\x2a\x07\xb2\x67\x65\x57\x66\xbf\xcd\x89\xca\x39\x96\xab\x9e\x2b\ +\xcd\xed\xcc\xb3\xca\xdb\x90\x37\x9c\xef\x9f\xff\xed\x12\xc2\x12\ +\xe1\x92\xb6\xa5\x86\x4b\x57\x2d\x1d\x58\xe6\xbd\xac\x6a\x39\xb2\ +\x3c\x71\x79\xdb\x0a\xe3\x15\x05\x2b\x86\x56\x06\xac\x3c\xb8\x8a\ +\xb6\x2a\x6d\xd5\x4f\xab\xed\x57\x97\xae\x7e\xbd\x26\x7a\x4d\x6b\ +\x81\x5e\xc1\xca\x82\xc1\xb5\x01\x6b\xeb\x0b\x55\x0a\xe5\x85\x7d\ +\xeb\xdc\xd7\xed\x5d\x4f\x58\x2f\x59\xdf\xb5\x61\xfa\x86\x9d\x1b\ +\x3e\x15\x89\x8a\xae\x14\xdb\x17\x97\x15\x7f\xd8\x28\xdc\x78\xe5\ +\x1b\x87\x6f\xca\xbf\x99\xdc\x94\xb4\xa9\xab\xc4\xb9\x64\xcf\x66\ +\xd2\x66\xe9\xe6\xde\x2d\x9e\x5b\x0e\x96\xaa\x97\xe6\x97\x0e\x6e\ +\x0d\xd9\xda\xb4\x0d\xdf\x56\xb4\xed\xf5\xf6\x45\xdb\x2f\x97\xcd\ +\x28\xdb\xbb\x83\xb6\x43\xb9\xa3\xbf\x3c\xb8\xbc\x65\xa7\xc9\xce\ +\xcd\x3b\x3f\x54\xa4\x54\xf4\x54\xfa\x54\x36\xee\xd2\xdd\xb5\x61\ +\xd7\xf8\x6e\xd1\xee\x1b\x7b\xbc\xf6\x34\xec\xd5\xdb\x5b\xbc\xf7\ +\xfd\x3e\xc9\xbe\xdb\x55\x01\x55\x4d\xd5\x66\xd5\x65\xfb\x49\xfb\ +\xb3\xf7\x3f\xae\x89\xaa\xe9\xf8\x96\xfb\x6d\x5d\xad\x4e\x6d\x71\ +\xed\xc7\x03\xd2\x03\xfd\x07\x23\x0e\xb6\xd7\xb9\xd4\xd5\x1d\xd2\ +\x3d\x54\x52\x8f\xd6\x2b\xeb\x47\x0e\xc7\x1f\xbe\xfe\x9d\xef\x77\ +\x2d\x0d\x36\x0d\x55\x8d\x9c\xc6\xe2\x23\x70\x44\x79\xe4\xe9\xf7\ +\x09\xdf\xf7\x1e\x0d\x3a\xda\x76\x8c\x7b\xac\xe1\x07\xd3\x1f\x76\ +\x1d\x67\x1d\x2f\x6a\x42\x9a\xf2\x9a\x46\x9b\x53\x9a\xfb\x5b\x62\ +\x5b\xba\x4f\xcc\x3e\xd1\xd6\xea\xde\x7a\xfc\x47\xdb\x1f\x0f\x9c\ +\x34\x3c\x59\x79\x4a\xf3\x54\xc9\x69\xda\xe9\x82\xd3\x93\x67\xf2\ +\xcf\x8c\x9d\x95\x9d\x7d\x7e\x2e\xf9\xdc\x60\xdb\xa2\xb6\x7b\xe7\ +\x63\xce\xdf\x6a\x0f\x6f\xef\xba\x10\x74\xe1\xd2\x45\xff\x8b\xe7\ +\x3b\xbc\x3b\xce\x5c\xf2\xb8\x74\xf2\xb2\xdb\xe5\x13\x57\xb8\x57\ +\x9a\xaf\x3a\x5f\x6d\xea\x74\xea\x3c\xfe\x93\xd3\x4f\xc7\xbb\x9c\ +\xbb\x9a\xae\xb9\x5c\x6b\xb9\xee\x7a\xbd\xb5\x7b\x66\xf7\xe9\x1b\ +\x9e\x37\xce\xdd\xf4\xbd\x79\xf1\x16\xff\xd6\xd5\x9e\x39\x3d\xdd\ +\xbd\xf3\x7a\x6f\xf7\xc5\xf7\xf5\xdf\x16\xdd\x7e\x72\x27\xfd\xce\ +\xcb\xbb\xd9\x77\x27\xee\xad\xbc\x4f\xbc\x5f\xf4\x40\xed\x41\xd9\ +\x43\xdd\x87\xd5\x3f\x5b\xfe\xdc\xd8\xef\xdc\x7f\x6a\xc0\x77\xa0\ +\xf3\xd1\xdc\x47\xf7\x06\x85\x83\xcf\xfe\x91\xf5\x8f\x0f\x43\x05\ +\x8f\x99\x8f\xcb\x86\x0d\x86\xeb\x9e\x38\x3e\x39\x39\xe2\x3f\x72\ +\xfd\xe9\xfc\xa7\x43\xcf\x64\xcf\x26\x9e\x17\xfe\xa2\xfe\xcb\xae\ +\x17\x16\x2f\x7e\xf8\xd5\xeb\xd7\xce\xd1\x98\xd1\xa1\x97\xf2\x97\ +\x93\xbf\x6d\x7c\xa5\xfd\xea\xc0\xeb\x19\xaf\xdb\xc6\xc2\xc6\x1e\ +\xbe\xc9\x78\x33\x31\x5e\xf4\x56\xfb\xed\xc1\x77\xdc\x77\x1d\xef\ +\xa3\xdf\x0f\x4f\xe4\x7c\x20\x7f\x28\xff\x68\xf9\xb1\xf5\x53\xd0\ +\xa7\xfb\x93\x19\x93\x93\xff\x04\x03\x98\xf3\xfc\x63\x33\x2d\xdb\ +\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\x25\x00\x00\x80\x83\ +\x00\x00\xf9\xff\x00\x00\x80\xe9\x00\x00\x75\x30\x00\x00\xea\x60\ +\x00\x00\x3a\x98\x00\x00\x17\x6f\x92\x5f\xc5\x46\x00\x00\x0b\x02\ +\x49\x44\x41\x54\x78\xda\x62\xfa\xff\xff\x3f\x03\x3a\x66\x62\x60\ +\x60\x60\x28\xdf\xa1\xf5\xbf\x76\xb7\xc9\x7f\x06\x28\x60\x62\x60\ +\x60\x60\xd0\x95\x70\x67\xf8\xf5\xf7\x1b\x03\x8a\xa0\xc9\xca\x45\ +\x0c\x33\xba\xb2\x19\xae\xed\xf5\xfd\x0f\x17\xd4\x68\x7f\xcb\xf8\ +\x71\x5f\x36\xe3\xfb\x27\x5b\x18\x18\x18\x18\x18\x00\x00\x00\x00\ +\xff\xff\x62\xc2\xb0\xa4\x74\xbb\xda\xff\x3f\xff\x7e\xfe\x9f\x7c\ +\x3c\x0c\xa2\x8d\x91\x91\xa5\xe8\xe4\xe3\xd5\x0c\x35\xd5\xf6\x5f\ +\x19\x18\x18\x18\x98\x92\x0e\xbe\xec\xb3\x89\xfc\xc3\xc8\xc0\xc0\ +\xc0\x7d\x6d\xaf\xef\x7f\x26\x8d\xf6\xb7\x8c\xff\x8f\x25\x30\xc0\ +\x0c\x06\x00\x00\x00\xff\xff\x62\xfa\xff\xff\x3f\x43\xe9\x76\x8d\ +\xa4\xb6\x03\x4e\xff\x0b\xb7\x28\xfe\x5f\x7d\xb9\xe6\xff\xaf\xbf\ +\x3f\x4e\x60\xf8\x86\x91\x81\x71\x92\xbe\xa4\x17\x83\xba\xa8\x2d\ +\xc3\xf1\x47\xcb\x18\x78\x6d\x96\xf8\x30\x20\x01\x26\x06\x06\x06\ +\x86\xc4\x83\x2f\x2f\xef\xbb\x37\x7b\xc1\xed\x37\xc7\x18\x3e\xbf\ +\x97\x64\x64\xe7\xf8\xf1\x1a\x43\x91\x46\xfb\x5b\xcb\x1e\x8f\x1b\ +\x89\x3d\x5e\xb7\x19\x67\x45\x1f\x61\xf8\xb8\x2f\x9b\xf1\xf7\xdf\ +\x1f\xff\x7f\xff\xfd\xf1\x9f\x81\x81\x81\x01\x00\x00\x00\xff\xff\ +\x62\xc2\x16\xa2\x28\xee\x29\xdf\xa1\xc5\xb0\xfc\x62\xe9\xff\xf2\ +\x1d\x5a\xff\x1b\xf6\x5a\xfc\xff\xfe\xfb\xd3\xff\x9f\x7f\xbe\x20\ +\xac\x61\x61\x62\x67\x38\xff\x7c\x33\x43\xb0\x4e\x23\xc3\x8b\xcf\ +\xb7\x19\xe6\x9d\x4d\x67\xa8\xdc\xa9\x87\x50\xf0\xe7\xdf\x0f\x06\ +\x06\x06\x46\x06\x3e\x76\x71\x06\x7e\x0e\x71\x86\x47\x9f\x8f\xa6\ +\xcd\xed\x2d\xe6\x86\x2b\xf8\xc5\xcc\xc4\xf0\xe7\xef\x4f\x06\x45\ +\x41\x13\x86\x1f\x7f\x3e\x33\x3c\xb8\xa9\x3b\x9b\x81\x81\x01\x6e\ +\x07\x53\xfa\xbe\x17\x5c\x8e\x77\x7e\x31\x7e\xfb\xfd\x81\x81\x83\ +\x85\xf7\xda\xb6\x35\x3e\x69\xe8\x5e\xf5\x51\x7d\xf1\xfd\xff\x97\ +\x26\x05\x89\x19\x5d\xd9\x4a\x4c\x4c\xff\x66\x1e\xa9\x58\xc7\xf0\ +\x97\x81\xe1\xff\xe5\x5d\xce\xff\x99\x34\xda\xdf\xae\xd2\x68\x7f\ +\xcb\x28\xdb\xfe\xeb\xe5\xc7\x7d\xd9\x9c\x1f\xf7\x65\x33\x7e\x7a\ +\xbe\x9f\xe1\xe5\xad\x59\x0c\x9f\x9e\xef\x87\x04\x16\x3a\xf8\xcf\ +\xf0\x9f\xe1\xfe\xf1\x74\x86\xff\x0c\xff\x19\x00\x8c\x93\x4f\x48\ +\x53\x71\x00\xc7\x3f\x3f\xb7\x97\x3a\x9d\xcd\x17\x46\xe8\xa4\x0e\ +\x66\x5b\x51\x41\x94\x68\x06\x75\xc8\x28\x44\x0f\x76\xe8\x32\xd9\ +\x41\x4f\xcd\x05\x52\xbc\x42\xea\x10\x2a\x8b\x0e\x51\x54\xe8\x55\ +\xbd\x45\x79\x88\xd9\x43\x56\xc3\xa2\x3a\xec\x34\x8a\xfe\x40\x45\ +\x08\xc1\x0a\x5c\xf5\x7a\xbc\x1e\xdb\xde\x7b\xbf\x0e\x11\x15\x34\ +\xe8\x0b\xdf\xeb\x87\xcf\xe1\xfb\xad\x91\x52\xa2\xe9\x51\x2e\x3e\ +\xd8\x4f\xf2\x6e\x6b\xa3\xa6\x47\x87\x34\x3d\x3a\xa9\xe9\xdb\x2f\ +\x4d\x2c\xef\x3e\xa9\xe9\x91\x9d\xa3\x8b\x41\x21\xa5\xc4\xf3\x1c\ +\xaa\x4e\x15\xc0\x2a\x7f\xf1\xea\x95\xf5\x26\x88\x3b\x6a\x7d\xf8\ +\xbc\xeb\x95\xcf\x4e\x1f\xc9\xdf\x5c\xe7\x0b\x3c\x6b\x50\x9a\xbd\ +\xd3\xf7\x3a\xe4\x19\x7d\xdb\xbf\xa4\x7e\x42\xa4\x74\x51\x7c\x75\ +\xb2\xbb\xfd\x04\x15\xf7\x3b\x7b\x5a\x07\x69\x0f\xed\x22\xfd\xfa\ +\x32\xb6\x63\x22\x84\xb0\xa8\x31\x44\x93\x35\x5a\x1d\xb2\x37\x7c\ +\x9c\x68\xcb\xa1\x0f\xcf\x3f\x2e\x53\xf1\xca\xf4\x6d\x1d\xe3\xcd\ +\xda\x53\xcc\xd2\x1a\x1d\x6a\x37\x6a\xa0\x6d\xc7\xec\xf4\xe4\xb5\ +\x2b\x33\xc1\x95\xaa\x90\x7d\xf3\xb3\x04\x1f\xdd\xda\x6c\x3a\x5f\ +\x2f\x04\x94\x10\x76\xe5\x1b\x4d\x75\x2d\xe4\x0b\x69\x56\x8d\x5c\ +\x66\xe6\xea\xe0\xaa\x5f\x71\x4f\x01\x07\xab\x42\x4a\x7e\xd1\xdf\ +\x59\xb0\xe5\xc8\xca\xa7\x03\xfd\xf9\xcf\xe2\xc5\xfb\xdb\xa2\xb9\ +\x61\x83\xb8\x9f\xee\x13\xd7\xa7\xc6\x8f\x59\x66\xa3\x04\x58\x8a\ +\x8f\xf1\x64\x4e\xc8\x5f\x7d\x3c\x27\x7e\x9f\x18\x58\x02\x14\x60\ +\x7c\xa3\x51\x66\xd3\x7c\x92\x73\x13\x31\xde\xbe\xec\x1c\xf2\xf9\ +\x9d\x77\x80\x0b\xdc\x50\xc3\x03\x74\x0d\x97\x88\x1c\xd6\xe9\x1a\ +\x2e\xa1\x86\x07\xfe\x3a\x0c\x91\x54\xd1\x89\xa4\x8a\xaf\x22\xa9\ +\x22\xe1\x29\x0b\xf7\xe1\x08\x46\x36\xb1\x68\x64\x13\x5b\x8c\x6c\ +\xc2\x6f\x64\x13\x49\xa3\x90\x21\xb7\x50\x4b\xa8\xed\x28\xb9\x85\ +\x5a\x8c\x42\x86\x3f\x4d\xfe\x2b\x3d\x31\x5b\xf4\xc6\xa5\xf0\x81\ +\xe8\x8d\x4b\xd1\x13\xb3\x05\xc0\x0f\xce\xca\x2c\x24\xca\x30\x0a\ +\xc3\xcf\xf7\x8d\x1b\x86\xa6\x96\x8e\x90\xda\x82\xe9\x58\xa9\x49\ +\x26\xa9\x85\x57\x11\x45\x03\x51\xe1\x85\x90\x26\xd5\x85\x68\x0b\ +\xe2\x92\x41\x65\x10\x49\x91\x11\x11\x42\x50\x41\x98\x4c\x11\x7a\ +\x51\xe0\x46\x4c\x44\x6a\x51\x86\x51\xd9\x45\x25\xe6\x92\x95\xcd\ +\x08\x93\xcd\xa8\x33\xfe\xff\xd7\x45\x12\x5a\xfc\x25\x1d\x78\xef\ +\xde\xf3\x70\x38\x9c\xe5\x9f\x5b\x39\x1f\x49\x80\x8a\x16\x0b\x4d\ +\xbd\xd5\x94\xb7\x24\x26\x57\xb6\xae\x2a\xad\x6c\x4d\x3a\x77\xff\ +\x7d\xdd\x89\x8a\xd6\x24\x6b\x59\xf3\xca\x45\xe7\x1f\x6d\x43\x29\ +\x1d\xa5\x34\xe3\x39\x11\x42\xd2\x37\xf6\x54\x65\xc5\xe5\xbd\xf4\ +\x6a\x9e\x5a\x10\xe5\x9a\x9a\x3e\x25\x10\x77\x4b\x32\x6f\x3b\x0e\ +\x65\x35\x2a\x9f\x3e\x69\xf6\x6a\x13\xc6\x10\x20\xcd\xe1\xfe\x40\ +\xc7\x40\x3d\xb9\xc9\x35\xf8\xb4\x49\x52\xa2\xb7\x60\xb5\x1c\xa5\ +\xb6\xc3\x4a\x55\xdb\x1a\xaa\xda\x52\x9a\x8e\xb5\xaf\x35\x86\xf8\ +\xc9\x80\x20\x9f\x36\x81\x9f\x0c\xa0\xa9\xf7\x24\xab\xcd\x9b\xe9\ +\x1c\xb8\x49\x63\xef\x49\x96\x86\xa5\x12\xbf\x28\x93\x60\xff\xb0\ +\x3e\xa3\x86\x4b\x00\xaf\x36\xf1\x7d\x45\x44\x06\x71\x61\xa9\x4c\ +\x4d\x7b\xd8\x97\x7e\x05\x81\x24\x3a\x64\x25\x1f\xbf\xbd\xe1\xad\ +\xf3\x51\x76\xf0\x74\x56\x7e\xa8\x67\xaf\x31\x44\x0a\x39\x3e\xe4\ +\x7a\xc5\x3b\x47\x17\x09\x8b\x37\xa2\x2b\x8d\x87\xfd\xd7\x70\xba\ +\x07\x11\x48\x46\x87\xe2\xbb\xce\x9c\x4d\x2a\xbd\x50\x17\x6e\x0c\ +\x59\xb7\x64\x87\x33\x71\xf1\x46\x84\x30\x91\x18\xb9\x89\xab\xdd\ +\xfb\x59\x10\x10\x4e\x66\x5c\x1e\x51\x21\xcb\xdd\x4f\x1f\x6c\x41\ +\x4a\xbd\x16\x88\x32\x84\x3c\xfe\x7c\x77\xbc\x77\xd4\xce\xfa\x98\ +\x9d\x74\x0d\x36\x30\xe9\xfb\x46\x74\x48\x02\x4f\x86\x6e\xe1\x9e\ +\x1e\xa8\xff\x38\x1c\xb6\x6c\xc6\xbf\xdb\x10\x72\xb8\x6d\x04\xfc\ +\x03\xc5\x8b\x91\x7b\x6c\x4b\x2c\x23\x3f\xed\x32\xc3\xae\xd7\x00\ +\x78\x3c\xc1\x45\xd2\xa4\x57\xcf\xf8\xe3\x0c\x21\x93\xfe\xf2\x60\ +\x49\xfb\xa7\x08\xdd\xe4\x17\xd4\xf8\xea\x38\xe3\xde\xaf\x08\x21\ +\x09\x0c\x9a\xca\xb8\x7e\xf1\x00\x26\x93\x56\x30\xe3\xff\xf2\xb7\ +\x39\xd9\x35\xe5\x27\x9c\x45\xf7\x3f\x05\x9a\x47\x46\x45\xec\xc2\ +\x14\x31\xd8\x6f\x16\x97\x4e\x1f\x79\xa6\xeb\xb2\x01\xa0\xb9\xb0\ +\x84\xe6\x82\x92\x0b\xb3\x4f\x41\x67\xfd\xdc\x53\x10\x04\xe0\x33\ +\x09\xd7\xd6\x77\xaa\xeb\x62\x7e\x3a\x2d\x77\x72\x6f\x28\x5d\x2a\ +\x20\x0f\x00\x1d\xc2\x63\xad\x84\xc7\x6c\xff\xa9\x58\x2b\xe8\x73\ +\x2b\xd9\x00\x2c\x07\x22\x41\x65\x3d\x9f\x4a\x01\x54\x21\xd0\x04\ +\x78\x81\x51\x80\x50\x73\x0e\xf1\x39\x36\xe2\x73\x6c\x84\x9a\x73\ +\xfe\x78\xc0\x58\x6a\x9c\x1f\x2c\x35\x4e\x87\xa5\xc6\x49\xfd\xed\ +\xeb\xb8\xec\xc5\xba\xcb\x5e\xbc\xcb\x65\x2f\x0e\x74\xd9\x8b\xcd\ +\x00\xee\xb1\x1e\x94\xee\x43\xe9\x3e\xdc\x63\x3d\x7f\xf4\x64\x5e\ +\xe1\xe8\xb7\xd1\x6d\x8b\xa0\xdb\x16\x81\xa3\xdf\xf6\x1f\x10\x09\ +\x28\x7d\xd6\x0b\xd4\x7f\x65\xcf\x1b\x92\xbd\x47\x89\xec\x82\xdf\ +\xb4\x47\x09\x80\x1f\xb4\x98\x6b\x50\x94\x55\x18\xc7\x7f\xef\x2e\ +\x7b\x01\x05\x41\xc1\x44\x16\x49\x2e\x12\x68\x28\x08\x62\xa3\x78\ +\x41\x48\x68\xb4\x9c\x21\x31\x9c\x29\x9c\x49\x53\x07\xc2\x48\x89\ +\x84\x31\x71\x72\x32\xb5\x72\x4c\xfd\xd0\xc5\xc8\x1c\x86\xc6\xc8\ +\xb4\x40\xee\x08\x98\x0a\x78\x4b\xc0\x50\x56\x50\x14\x94\x3b\xbb\ +\xe8\xee\xb2\xb0\xbb\x6f\x1f\x62\x1d\xd3\x6c\x06\xc7\xce\x99\xe7\ +\xcb\x3b\xe7\xfc\xdf\xdf\x79\xce\x33\xcf\x3c\xcf\x79\x26\x99\xed\ +\x99\x65\xc7\xe1\xca\x91\x0f\xf2\x5f\x60\x6b\x49\x28\x85\xea\x7d\ +\xb3\xb7\x9f\x0c\xdb\xb7\xf1\x84\x57\xe5\xa6\x13\x3e\xcd\xa9\x05\ +\xfe\xda\xd4\x02\xff\xa1\xd4\x02\x7f\x4b\x4a\xbe\xaf\xa5\x48\xfd\ +\xe5\xc0\xd6\x92\xd0\x9e\x4d\x27\x7c\x1a\x37\xe4\x4e\xaa\x48\xce\ +\xf3\xcc\x4c\x2d\xf0\xdb\x78\xf8\xd2\x86\xb9\xd6\x90\x1b\xe9\xf8\ +\x87\x5b\x05\x41\x32\x7a\xc0\x74\xaf\xa9\x48\xbd\xf7\x6c\x8f\xfe\ +\x76\xa2\x93\xad\x2a\x2c\x6a\x4a\xf2\x64\x0f\xc7\x40\x87\x41\xb3\ +\xde\x06\x10\x2c\xa2\x49\x90\x49\x95\x8a\x00\xd7\xa8\xb1\x5b\xc2\ +\x4f\xf9\xec\x8a\xbe\x3a\x2f\x2e\x60\xe7\x2a\xbf\xf1\xe1\x9f\x75\ +\xdc\xbf\x7e\xea\xd3\x8a\x48\xc3\xae\xca\xa8\x1d\x3b\x2a\x22\xd8\ +\x51\x11\x31\x72\x10\xf1\xef\x19\x08\x78\xda\x48\xe4\xc8\xa5\x76\ +\xdc\x33\x76\x91\x77\x6d\x37\x16\x71\x88\x98\xa9\xdb\xe8\x1f\xe8\ +\x20\xec\xf9\x55\x2c\xf4\x7c\x07\xc3\xa0\x96\xf4\xa2\x40\xd2\x0a\ +\x03\x38\x52\x9f\x4e\x6d\x7b\x01\x77\xfa\x1b\xe8\xd2\x35\xd3\xad\ +\xbb\x19\xad\x31\xdc\x11\x34\x86\x3b\x23\x07\x99\xa5\x7a\x9d\x50\ +\xd5\x72\x5d\x88\x2a\x06\xef\x71\xb3\x91\x49\x14\x0c\x99\x07\x90\ +\x4b\x6d\x51\xf7\x9c\x65\xd0\x3c\xc0\xfe\xd7\xda\xf1\x1a\x3b\x8b\ +\xf5\xc7\x9c\xe9\xd0\x35\xb1\xd8\x27\x89\x70\xaf\xb5\x84\xaa\x96\ +\x13\xe8\xba\x84\x00\xd7\x28\x4d\x88\x2a\xe6\xe8\x2c\x8f\x25\x6f\ +\x7b\xba\xf8\x89\xde\xe3\xa7\x8d\x1c\xe4\x5c\xeb\xcf\xd4\xb4\xe6\ +\xe8\x6b\x5a\x73\x86\x1a\x3a\xcb\x31\x9a\xf5\x84\xba\xc7\x32\xed\ +\xb9\x48\x8c\x26\x1d\x4a\xd9\x68\x7a\xf5\xad\x74\xe9\x6e\x32\x53\ +\xb5\x8c\x5b\x9a\xcb\x54\xdc\xf8\x8e\xca\x1b\x99\x9c\x6f\xfb\x85\ +\x2b\x9d\x45\x87\xae\x75\x97\x39\x1d\xc8\xea\x89\x59\x9d\x38\xf9\ +\xc2\x86\xa4\x08\x92\x92\x16\x8c\x1c\x44\x10\x24\x08\x82\xa4\x17\ +\x51\xec\xb7\x7e\x3b\xdf\x76\x14\x75\xf7\x69\xd6\x87\x66\x11\xe2\ +\x16\xc3\x2d\x4d\x2d\xc7\xfe\xfc\x98\xc6\xae\xdf\x91\x08\x12\x6c\ +\x65\x63\x70\x73\xf0\x67\x8a\xf3\x1c\x82\x26\x2d\xca\xbc\x5c\xfe\ +\x26\xd5\x95\xc1\xcb\x44\x10\x15\x0a\x4b\xa2\x5c\x2e\x3e\x5d\xb0\ +\x82\xd8\x25\x95\xc8\xda\x5c\xed\x7d\x09\x75\x8f\xc5\xd7\x79\x1e\ +\xbd\x86\x56\xce\xdc\xca\x42\x26\x55\x52\x7c\x7d\x3f\x0e\x4a\x17\ +\x96\xfa\x7d\x88\x9f\xcb\x42\xf4\x43\x1a\x6e\xf6\x5d\xa4\xb1\xf7\ +\x64\x7d\x79\xdd\xd9\x53\xd5\x17\xec\x50\x2a\x48\x1b\x16\xfb\x08\ +\x58\x38\x62\x90\xc9\x1d\x7a\xdc\xbb\x0c\xa2\x45\x34\x4f\xef\x34\ +\xb4\xac\x3e\xd7\x9a\x43\x5d\x47\x21\x91\x3e\x89\x38\xd9\xba\xd1\ +\xa9\x6b\xe6\x55\xbf\x34\x02\x26\x44\x73\xa4\x2e\x8d\xa6\xde\x1a\ +\x6c\x24\x72\x64\x52\x25\x0a\xb9\xf8\x5e\xdd\xf9\x99\x16\xdd\x7d\ +\xfb\x37\x04\x89\x25\x64\x58\xd2\x05\x58\x30\x62\x90\xf9\x0d\x5a\ +\xe9\xa2\x2b\xda\x71\xeb\x4a\xda\x1d\xe6\x5d\xed\x3f\x68\x92\x48\ +\x04\xb9\xcc\xe1\x70\x59\xd3\x57\x0c\x0c\xdd\x63\xfc\x28\x4f\x86\ +\xcc\x06\x4e\xb7\x1c\xc6\x4e\xe6\x08\x88\x00\xdd\x0a\xa5\xf1\xc5\ +\x3f\xaa\x83\x4a\x2f\x9c\x09\x1e\xab\x50\x18\x3f\x7f\x44\x5f\xfa\ +\x34\x57\x33\x09\xd8\x6a\x94\x09\x5a\x9f\x76\x43\x79\x62\xf1\x5d\ +\xfb\xb0\xab\xda\xb7\x64\x72\x7b\x49\x55\x67\xee\xcb\x55\x6d\x39\ +\x07\x02\x26\x44\x65\x3b\xdb\x79\xec\x97\xd8\xe8\x63\x15\xb6\xc6\ +\xd1\x3d\x5d\xe3\x5c\xbe\xfd\x62\x6d\x7d\x69\x5e\x84\x93\x4c\x3e\ +\x54\x0d\x4c\x7c\x48\x4f\x0b\x9c\x79\x1a\x90\x95\x40\xac\xd5\x41\ +\x46\x1b\xa1\x7f\x4a\xbb\xe1\xd2\xba\x92\xf6\x39\x9b\x4a\x34\xc5\ +\x13\xb3\xb6\x25\x36\x56\x1c\x5a\xf9\xeb\xd1\x65\xef\xee\xc9\x48\ +\xf9\x69\xf7\xe6\xcd\x76\x47\x0e\xc6\x45\xe8\xee\x8f\x3a\x69\x63\ +\x63\xea\x05\xbc\xad\x42\x79\xf1\x89\x14\xae\x49\x1f\x53\xf9\xfe\ +\xf7\x79\xb5\xf9\x61\x62\x7d\x51\xa4\x68\x06\xb1\xbe\x28\x52\xac\ +\xcd\x0f\x13\x2f\xe7\x86\x88\x55\xd9\x8e\x0f\x1a\x82\x47\x41\x3e\ +\x01\x5e\x01\xaa\x80\x01\xc0\x04\xb8\x9b\xa4\x42\xba\x49\x2e\x0b\ +\x97\xf4\x37\xb3\xe7\xeb\x52\x2e\xd6\x39\xa1\x90\xf3\x8d\x5c\x69\ +\xec\x14\x24\x62\xf1\xbf\xc5\x81\x00\x78\x04\xed\xc4\x7b\x7e\x36\ +\x8e\x6e\x8b\x51\x4d\xdf\x02\x80\x6a\xfa\x16\x1c\xdd\x16\xe3\x3d\ +\x3f\x1b\x8f\xa0\x9d\x08\x4f\xf0\x88\x08\x5c\x04\x5e\x02\x6c\x87\ +\xbb\x15\x67\x20\x1a\x28\x03\x30\x58\x64\xd6\xb5\x6b\x86\xff\xa7\ +\x02\x96\x03\x19\xc3\x07\x89\x1f\xde\x43\x5f\x6b\x2e\x2d\x35\xc9\ +\xb8\x4e\x4d\xc1\x6c\xd2\x73\xad\x74\x29\x66\x93\x1e\xd7\xa9\x29\ +\xb4\xd4\x24\x63\x7d\xce\x78\x0c\x64\xb8\x2a\x79\xa2\xa9\xb6\xeb\ +\x38\xf4\x63\xa6\xb5\xf3\xb1\x5a\x9b\xb6\x2c\x21\x47\x5b\x96\xb0\ +\x4d\x5b\x96\x90\xae\x2d\x4b\xf8\x41\x5b\x96\xd0\x03\xa0\xb4\xf7\ +\x42\x35\x23\x03\x75\xc5\x0a\xcc\x83\x1a\x7c\x17\xfd\x86\x79\x50\ +\x83\xba\x62\x05\xaa\x19\x19\x28\xed\xbd\xfe\x2b\x8f\x3c\x9b\x21\ +\x02\x77\x1b\xf6\x52\x97\x1b\x4c\xdf\xed\xe3\xa8\x2b\xe3\x00\x50\ +\x57\xc6\xd1\x77\xfb\x38\x75\xb9\xc1\xdc\x6d\xd8\x8b\xf8\x7f\x83\ +\xcc\x8d\x7f\xbc\x00\xb2\xb6\x78\x0f\xdb\xdc\x78\xf1\x41\x98\xfc\ +\x35\x00\xe1\xfe\x7a\x92\x1d\x0a\xb2\xf0\x00\x00\x00\x00\x49\x45\ +\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x08\xb7\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ +\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ +\x00\x00\x08\x6e\x49\x44\x41\x54\x58\x85\xc5\x97\x7b\x70\x55\xd5\ +\x15\xc6\x7f\x7b\x9f\x73\x6e\x6e\x6e\xde\xb9\x97\x20\x84\x47\x5e\ +\x04\x12\x02\x11\x05\x05\x22\x05\x44\x0a\xa2\x28\xd6\xe2\x4c\xa7\ +\x75\xa8\x76\xac\xa3\x33\x3a\x63\x67\xb4\xd3\x87\x6d\x1c\x2b\x7d\ +\x4d\xff\x68\xcb\xd8\x56\x1d\x29\x76\xaa\x45\xc6\xe7\x0c\xa1\xa9\ +\xa0\x11\x5a\x01\x8d\x41\x1e\x01\xcc\x83\x24\x4a\x42\x42\x72\xf3\ +\xbc\xaf\xdc\xdc\xb3\x77\xff\x38\xe7\xde\x24\xd5\x19\x69\xa7\x33\ +\xee\x99\x35\xe7\xdc\x39\x77\xaf\xf5\x9d\x6f\x7d\x6b\xad\xb3\xe1\ +\x4b\x5e\xe2\x4a\xff\xb8\x6e\x5d\xad\xd9\x91\x61\xad\x11\x88\xed\ +\x02\xb1\x46\x43\x00\xc8\x71\x1f\x8f\x08\x18\x10\xe8\x23\x36\x7a\ +\x5f\x71\x78\xe2\x48\x43\x43\x6d\xe2\xff\x02\xa0\x68\x5b\x6d\xae\ +\x18\x4f\xfb\x31\x82\xfb\xca\xe6\xcd\xe0\xc6\x15\xa5\x59\x2b\xaa\ +\xe6\x8a\xab\x02\x59\xf8\xb3\xd3\x01\x18\x1c\x8d\xd2\x1b\x1c\xa3\ +\xb1\xf9\xa2\x3e\xf4\x41\xfb\x58\x6b\xe7\x65\xd0\x3c\xab\xd3\xc6\ +\x7f\xd6\xf9\x7a\xed\xf0\xff\x0c\xa0\x68\xf3\xce\x87\xa5\x21\x9e\ +\xdc\x5c\xb3\x28\xfd\xfe\xaf\xaf\xb4\xca\xe7\x05\xae\x88\xb3\xb6\ +\x4f\x83\x3c\xf3\xca\xf1\x89\xfd\x87\xcf\x46\x95\x96\x8f\x77\xd6\ +\x7d\xff\x77\xff\x15\x80\xa2\x75\xb5\x5e\xed\xf3\xfe\x75\x71\xe9\ +\xcc\x4d\x4f\x3e\xf8\xd5\x8c\xca\xe2\x02\x10\x8e\xe3\x7f\x9d\xfc\ +\x84\x13\x1f\x5f\x22\x38\x1a\x61\x70\x24\x86\x10\x10\xc8\x4d\xc7\ +\x9f\x93\xc1\xb2\xf2\x59\xac\x5e\x3a\x97\x92\x39\xf9\x00\x7c\xdc\ +\xd9\xcf\xe3\x4f\xbf\x15\x3e\xdd\xd6\x5b\x4f\x38\xfa\xcd\xce\x86\ +\xda\xd8\x17\x02\x58\xbc\xbd\xd6\x13\x0e\xa7\xbd\xbf\x6d\x7d\x55\ +\xc5\x4f\xee\xdf\xe0\x49\xf7\x58\xb4\x7e\x1a\xe4\xb9\x37\x1a\x69\ +\x3c\xdb\x8d\x34\x24\x86\x94\x08\x21\x90\x52\x20\x10\x29\x2f\x5a\ +\x6b\xb4\xd6\x2c\xaf\x28\x64\xc7\x2d\x57\x53\x3a\x27\x9f\x58\x3c\ +\xc1\x53\xcf\xbe\x1d\x7f\xe5\xd0\xe9\x73\x3e\x5f\xec\xba\xe6\x7d\ +\xb5\xf1\xa9\xf1\x8c\xe9\xe1\xb5\xc8\x2c\x3e\xf6\xea\xb6\x1b\xab\ +\x56\xee\x7c\x68\x53\x9a\x65\x1a\xbc\xde\x70\x96\x27\x9e\x7b\x9b\ +\x4b\x03\x21\x4c\xd3\xc0\x9a\x62\xa6\x61\x60\x9a\x06\x86\x29\x31\ +\x0c\x89\x69\x18\x48\x43\x72\x29\x18\xe2\xad\xe3\xed\x64\xf9\xd2\ +\xa8\x2c\x9e\xc1\x8d\x2b\x4a\x8d\xbe\xa1\x70\xde\xc9\x96\x81\x6b\ +\x86\x5b\x0e\xee\x85\x27\x3e\x1f\x40\xf1\x16\xef\xa3\xab\xae\x2e\ +\xba\xf7\x37\x8f\xdc\x92\x6e\x18\x92\xdf\xef\x3d\xca\x9e\xfd\x1f\ +\x61\x18\x06\xa6\x69\x62\x59\x6e\x70\xcb\xf9\x6d\x9a\xc6\xa4\x49\ +\x03\xc3\x65\xc7\x30\x24\x00\x8d\xe7\x7b\x08\x45\xe2\x5c\x5b\x31\ +\x9b\x35\xcb\x8a\xcd\x33\xed\x7d\x73\x43\xd9\xfb\xe3\x43\x2d\x07\ +\xdf\xfb\x4c\x0a\x0a\xef\xd8\xe9\xcf\xd4\x56\xcb\x9b\xbf\xfd\x76\ +\xfe\xbc\x99\xb9\xbc\x54\x7f\x92\xe7\xde\xf8\x10\xd3\x32\xa7\xbc\ +\xad\x64\x69\xd9\x0c\x96\x94\x14\x50\x51\x14\xa0\x20\xcf\x47\x6e\ +\x56\x3a\xe3\xf1\x04\x7d\x83\x61\x9a\x5a\xfa\xa8\x3f\xde\x41\x28\ +\x1a\xc7\x56\x0a\xdb\x56\x24\x6c\xc5\xdd\x9b\x97\x72\xe7\xfa\x0a\ +\x2e\x5e\x1e\x65\xeb\xc3\xbb\x07\x47\x89\x97\x77\xbf\xf6\xc3\xe0\ +\x34\x06\xfc\xa5\x37\xed\xba\xe7\xf6\xe5\xd7\xdf\xbc\x7a\xa1\x3c\ +\x73\xa1\x8f\x9f\xef\x39\x8c\x69\x18\x58\x2e\x00\xcb\x72\xee\x7f\ +\xfd\xc0\x57\x58\x34\xdf\xcf\x8c\x5c\x1f\x3e\xaf\x07\xc3\x90\xa4\ +\x79\x4c\xf2\xb2\xbc\x2c\x9a\x9f\xcf\xaa\xaa\xd9\x9c\x6a\xef\x27\ +\x16\xb7\x1d\x9d\x00\xa7\xda\xfb\xa8\x2e\x9b\x49\x49\x61\x1e\x13\ +\xb6\xf2\x9c\x38\xdd\x5d\x30\xd4\x72\xf0\x4d\x00\x09\xb0\x78\x5d\ +\x6d\xa6\x65\xca\xbb\xee\xb9\x6d\x85\xa1\xd1\x3c\xbd\xef\x38\x52\ +\xc8\x69\x14\x3b\x40\x4c\x84\x10\x08\xe1\x10\x17\x4f\x28\xe2\x09\ +\x85\x94\x12\xe9\x0a\x33\x3f\xcb\xcb\xf6\xf5\x0b\xb1\x2c\x13\x8f\ +\x65\x62\x59\x26\x86\x34\xd8\xbd\xff\x23\x34\x70\xf7\x96\x6b\x0c\ +\xd3\x34\xee\x5a\xbc\xae\x36\x13\xc0\x04\x88\xf8\xbc\x5b\xd6\x5e\ +\x5d\x2c\xf3\xb3\xd3\x39\xd5\xd6\x4b\xcb\x27\x41\x3c\x1e\x73\x8a\ +\xe8\xdc\x34\x98\x06\x09\x5b\x71\xfc\x7c\x3f\xef\x35\xf7\xd2\x3b\ +\x14\xc1\x10\x82\x0d\xcb\xe7\x73\x7b\x4d\x69\x0a\x5c\xe5\x7c\x3f\ +\x1e\xcb\x24\x21\x6d\x5c\xac\x74\x74\x0f\x73\xae\x73\x80\xca\xa2\ +\x00\x6b\xaf\x2d\x91\x07\x8f\xb6\x6e\x01\x5e\x96\x8e\xf6\xf5\x8e\ +\x9b\xae\x5b\xe0\x43\xc0\x91\x8f\xba\x1c\x31\x19\x4e\xde\x0d\x37\ +\xf7\x49\x30\xbf\x78\xe9\x04\xaf\xfd\xf3\x02\x03\xa3\xe3\xa4\x79\ +\x2c\x2c\x8f\xc5\xd9\xae\x41\xb4\xd6\x29\x31\x4b\x49\x8a\xb1\xa9\ +\x2c\xbe\xdf\xdc\x0d\xc0\xc6\x95\xe5\x3e\x21\xc5\x8e\x14\x03\x68\ +\x96\x55\x95\xcd\x04\xa0\xf5\x93\xe0\x34\x35\x9b\xc6\x64\x2a\x2c\ +\xd3\x24\x34\x6e\x63\x59\xa6\x0b\x4e\x22\xa5\x60\xcd\x92\xc2\x54\ +\x0f\xd0\x5a\x73\xb1\x3f\x8c\x65\x19\xae\x6b\x8d\xd6\xa0\x94\xe6\ +\xc2\xa5\x21\x00\x2a\x4b\x0a\xd0\x5a\x2f\x9b\x04\x20\xf0\x17\xe4\ +\x67\x02\x4e\x5f\x97\x6e\xf0\xa9\xe6\x00\x91\x93\x3d\xc0\xb5\x9a\ +\xc5\x57\xb1\xaa\x72\x66\x2a\xb8\xad\x14\xef\x9e\xee\xc3\x32\x0d\ +\xd0\x4e\x73\x52\x4a\x63\x18\x92\x91\xd0\x38\x08\xc1\x8c\xdc\x0c\ +\x34\xda\x3f\x95\x01\xf2\xdc\xc1\x32\x16\x89\xbb\xa2\x12\x93\x40\ +\xa4\x93\x12\xc3\x6d\x3c\xc9\xd2\x5c\xbb\x74\x16\x6b\x16\x4f\x09\ +\x6e\xdb\x1c\x68\xec\xa6\x67\x30\x8a\x69\x18\x4e\x60\x25\x31\x6c\ +\xc7\x4f\x24\xe6\x0c\xc8\x9c\xcc\xb4\x54\xfd\xcb\x64\x37\x18\x1a\ +\x8d\xba\x0f\xbd\x48\x21\xa6\x9b\x94\x18\x52\x4c\x63\xa3\xba\x38\ +\x9f\xd5\x8b\x02\x28\xa5\x50\x4a\x61\xdb\x36\x75\x1f\x5e\xe2\xe3\ +\xee\x31\xb7\x3b\x4e\x6f\x4c\x52\x0a\xb2\x33\xbd\x00\x8c\x84\xc7\ +\x53\x2d\x48\x02\x08\x4d\xb0\x7f\x28\x0c\x40\x20\xcf\x87\x10\x38\ +\x8a\x96\x8e\x49\x29\x10\x2e\x2b\x49\x87\xd7\x2f\xf4\xa7\x82\x2b\ +\xa5\x38\xd6\x32\x44\x57\x7f\xd4\x65\xca\x01\x9c\x64\x52\xb8\x2f\ +\x92\x9f\xed\x00\x08\x0e\x47\x10\x10\x9c\x04\x20\xe4\x89\xe6\x0b\ +\x97\x01\x58\x38\x2f\xe0\xd4\xb9\x10\x08\x40\x20\xdc\xf2\x22\x55\ +\x66\x52\x08\xb2\xd3\x8d\x14\xf5\x4a\x29\xda\xfa\x22\x29\x86\xa4\ +\x10\x08\x91\xbc\x3a\x7b\x11\x82\x92\xd9\x79\x00\x9c\xeb\xec\x47\ +\x48\x79\x22\xa5\x01\xad\xf5\x9e\x43\xc7\xdb\xd6\xdd\xb1\xbe\xd2\ +\x57\xb3\x74\x2e\x07\x8e\xb6\x4d\xf6\x68\x91\xbc\x4c\x19\x9c\x42\ +\xf0\x87\xfa\x0e\xd2\x3c\x16\x1e\x8f\x85\xc7\x63\xa2\x34\xa9\x06\ +\xe5\xe2\x9f\xb2\x9c\xdd\xcb\x17\xcd\x02\xe0\xad\x63\xad\x11\x65\ +\xab\x3d\x29\x00\xbe\x48\xac\xee\x48\xd3\x05\x35\x3c\x16\xa3\xb2\ +\xa4\x80\x05\xf3\xfc\x74\xf5\x8e\x90\x14\x68\xf2\x4d\xd1\xc9\xb2\ +\xd2\xec\x58\x3b\x27\x35\x92\x01\x5e\x3e\xd6\x8f\x52\xca\x61\x24\ +\xb9\x07\x8d\x76\x9d\x14\xcd\xca\x61\xc1\x9c\x7c\x46\x43\xe3\xbc\ +\xf3\x7e\xab\xf2\x45\x62\x75\xa9\x14\x34\x37\xd4\x86\x12\x09\xb5\ +\xf7\x2f\x75\x4d\xb6\x00\xee\xbd\x75\x19\x42\x08\xd7\x99\x53\xc7\ +\xc9\x7b\xa5\x34\xca\x56\x58\x06\x58\x06\x98\xd2\xb1\xf8\x44\x82\ +\x89\x84\x4d\xc2\x56\x28\x5b\x39\xff\x53\x1a\xad\x1c\xe0\x77\xad\ +\xaf\x00\x01\x7f\xfb\xc7\x49\xdb\xb6\xd5\xde\xe6\x86\xda\xd0\x64\ +\x15\x00\xf1\x84\xf5\xd8\xee\xd7\x3e\x18\xee\xee\x1f\x63\xd1\x7c\ +\x3f\xdf\xd8\x58\xe5\x04\x57\x4e\x8e\xed\xe4\xd5\x9d\x70\x53\x05\ +\xa8\x94\x22\x3e\x31\xc1\xc4\x84\x4d\x22\x61\x93\xb0\x6d\x6c\xdb\ +\x4e\x3d\xdb\x5a\x53\x46\x69\x61\x2e\x7d\xc1\x10\x7f\xda\x77\x6c\ +\x38\x16\xb7\x1e\x4b\xc6\x4d\x4d\xc3\xd1\xf6\xfa\x68\x4e\xd9\x06\ +\xdd\xd1\x33\x5c\xb3\xb9\xa6\xdc\xaa\x2c\x0a\x10\x8e\x4d\xd0\xde\ +\x3d\xe4\x28\x5a\x48\xa7\x22\x84\x93\xd1\x6b\x4a\x73\xb1\xb5\x26\ +\x61\x3b\xa0\x3e\x68\x1b\x26\x61\x2b\x07\x80\xcb\xc4\x44\xc2\xe6\ +\x86\x25\x85\x6c\x5d\x5d\x4a\xc2\x56\xfc\x60\x57\x7d\xa4\xad\xab\ +\xff\xa9\xae\x03\x8f\x1e\xfa\x0f\x89\x25\x97\x16\xa5\xb7\xfe\xea\ +\xf5\xed\x9b\xaa\x37\xfd\xf4\xbb\x1b\xd2\x84\x10\x1c\x6a\xec\x60\ +\xef\xa1\x73\x48\x29\xdd\xe9\x96\xfc\x18\x71\x9b\x93\x5b\x66\x5a\ +\x83\xd2\x0e\xfd\x09\x37\x05\xb7\xad\x2e\xe1\x86\x25\x85\x68\x60\ +\xe7\xf3\x0d\xe3\x2f\xd6\x35\xd5\xb7\xbd\xf9\xe8\x36\x10\xfa\x33\ +\x0c\x38\xeb\x09\x66\x57\xdf\xf0\xea\xc9\xf3\x03\x5b\x07\x46\xa2\ +\x81\x55\x4b\xe7\x19\x0b\xe6\xfa\xa9\x2e\x2b\x20\x38\x1a\xa5\x6f\ +\x28\xe2\x40\x76\xb7\x27\xf3\x3c\xf5\xe3\x23\x61\xdb\x2c\x28\xcc\ +\xe5\x5b\x1b\x2b\xa8\x2a\x0e\x30\x3e\x61\xf3\xcb\x17\x0e\xc7\x5f\ +\xac\x6b\x3a\x93\x96\x16\xd9\xdc\x7f\x76\xbd\x3d\xbd\x3e\x3e\x67\ +\xcd\x59\xf5\x48\xba\x95\x1f\x78\xa9\xba\x7c\xce\xc6\xa7\x1e\xba\ +\xd9\x57\xea\x7e\xe5\x5e\xbc\x3c\xca\xa9\xf6\x7e\x5a\xbb\x87\x18\ +\x0b\x4f\x30\x16\x8b\x23\x85\x20\x27\xd3\x4b\x8e\x2f\x8d\xb2\xc2\ +\x5c\xaa\x8a\xfd\xcc\x0e\x38\x73\xa5\xe3\xd2\x30\x3f\xda\xf5\xf7\ +\x68\x53\xf3\x85\x77\x7b\x8f\xbd\x70\x5f\x74\xb0\x2d\x08\x44\xbf\ +\x10\x00\xe0\x03\xb2\x0b\xd7\x7e\xef\x41\x6f\x76\xe0\x91\x3b\x37\ +\x2c\xf3\x7e\xe7\x6b\x2b\xcc\xf9\x57\xe5\x5e\xd1\x51\xea\xd3\xcb\ +\xa3\x3c\xff\x46\x63\xe2\xe5\x03\x1f\x8e\x47\x83\x5d\xcf\x74\x1f\ +\xfd\xe3\x6e\x60\xcc\xb5\x21\x40\x7d\x11\x80\x34\x20\x0b\xc8\x4a\ +\x2f\x28\x9d\xed\xaf\xdc\xf6\x80\x95\xe1\xdf\x56\x55\x3a\x4b\x6c\ +\x5e\x53\x99\x7e\x6d\x45\xa1\x98\x91\xe7\x23\x27\xc3\x0b\x02\x46\ +\x43\xe3\x0c\x8c\x44\x68\x3a\xdf\xa3\xeb\x0e\x37\xc7\xce\xb4\xf6\ +\xe8\xd8\x58\x4f\x7d\xf0\xd4\xab\x7f\x1e\x1f\xee\xe9\x75\x03\x87\ +\x80\x41\x20\x7c\x25\x0c\x80\x53\xa2\x19\x40\x36\x90\x61\x59\xbe\ +\xac\xec\xf2\x8d\x2b\x7d\x05\x0b\x36\x5a\xe9\xd9\xd5\x60\xe4\x68\ +\x21\x7d\x8e\x13\x15\x45\xdb\xa3\xf1\xf0\xd0\x99\x48\xdf\xf9\x77\ +\x46\xdb\xde\x69\x4a\x24\x62\x21\x1c\xba\x43\xc0\xb0\x0b\xe2\x33\ +\xe7\xc5\x2b\x3d\x9c\x1a\x80\x05\x78\x5d\x76\xbc\x38\x5d\xd4\x72\ +\x81\x2a\xc0\x06\xe2\xae\xc5\x80\x71\xf7\xfe\x8a\x0e\xa9\x5f\xda\ +\xfa\x37\x3d\x87\xb9\xea\xf9\xa4\xbb\x03\x00\x00\x00\x00\x49\x45\ +\x4e\x44\xae\x42\x60\x82\ +" + +qt_resource_name = "\ +\x00\x07\ +\x07\x3b\xe0\xb3\ +\x00\x70\ +\x00\x6c\x00\x75\x00\x67\x00\x69\x00\x6e\x00\x73\ +\x00\x05\ +\x00\x49\xc3\x81\ +\x00\x43\ +\x00\x65\x00\x6e\x00\x52\x00\x61\ +\x00\x0e\ +\x09\x71\xe2\xe7\ +\x00\x70\ +\x00\x61\x00\x67\x00\x65\x00\x5f\x00\x61\x00\x6a\x00\x6f\x00\x75\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x0c\ +\x0a\x09\xe1\x87\ +\x00\x70\ +\x00\x61\x00\x67\x00\x65\x00\x5f\x00\x6e\x00\x65\x00\x77\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x08\ +\x0c\x33\x5a\x87\ +\x00\x68\ +\x00\x65\x00\x6c\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\ +" + +qt_resource_struct = "\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ +\x00\x00\x00\x14\x00\x02\x00\x00\x00\x03\x00\x00\x00\x03\ +\x00\x00\x00\x24\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x00\x46\x00\x00\x00\x00\x00\x01\x00\x00\x15\x6e\ +\x00\x00\x00\x64\x00\x00\x00\x00\x00\x01\x00\x00\x2b\x49\ +" + +def qInitResources(): + QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) + +def qCleanupResources(): + QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) + +qInitResources() diff --git a/CenRa_POSTGIS/resources_rc.qrc b/CenRa_POSTGIS/resources_rc.qrc new file mode 100644 index 00000000..0ce36606 --- /dev/null +++ b/CenRa_POSTGIS/resources_rc.qrc @@ -0,0 +1,11 @@ + + + help.png + + + page_ajout.png + + + page_new.png + + diff --git a/CenRa_POSTGIS/table_postgisdialog.py.bak b/CenRa_POSTGIS/table_postgisdialog.py.bak new file mode 100644 index 00000000..0355f30e --- /dev/null +++ b/CenRa_POSTGIS/table_postgisdialog.py.bak @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +""" +/*************************************************************************** + table_postgisDialog + A QGIS plugin + table_postgis + ------------------- + begin : 2013-10-15 + copyright : (C) 2013 by gcostes + email : sfdg + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 PyQt4 import QtCore, QtGui +from ui_table_postgis import Ui_table_postgis +# create the dialog for zoom to point + + +class table_postgisDialog(QtGui.QDialog): + def __init__(self): + QtGui.QDialog.__init__(self) + # Set up the user interface from Designer. + self.ui = Ui_table_postgis() + self.ui.setupUi(self) diff --git a/CenRa_POSTGIS/ui_cenra.py.bak b/CenRa_POSTGIS/ui_cenra.py.bak new file mode 100644 index 00000000..89b09290 --- /dev/null +++ b/CenRa_POSTGIS/ui_cenra.py.bak @@ -0,0 +1,345 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'ui_cenra.ui' +# +# Created: Fri Aug 29 15:27:40 2014 +# by: PyQt4 UI code generator 4.9.6 +# +# WARNING! All changes made in this file will be lost! + +from PyQt4 import QtCore, QtGui + +try: + _fromUtf8 = QtCore.QString.fromUtf8 +except AttributeError: + def _fromUtf8(s): + return s + +try: + _encoding = QtGui.QApplication.UnicodeUTF8 + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig, _encoding) +except AttributeError: + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig) + +class Ui_cenra(object): + def setupUi(self, cenra): + cenra.setObjectName(_fromUtf8("cenra")) + cenra.resize(533, 565) + self.buttonBox = QtGui.QDialogButtonBox(cenra) + self.buttonBox.setGeometry(QtCore.QRect(350, 530, 171, 32)) + self.buttonBox.setOrientation(QtCore.Qt.Horizontal) + self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) + self.buttonBox.setObjectName(_fromUtf8("buttonBox")) + self.Titre = QtGui.QLabel(cenra) + self.Titre.setGeometry(QtCore.QRect(40, 10, 441, 31)) + font = QtGui.QFont() + font.setPointSize(14) + font.setBold(True) + font.setWeight(75) + self.Titre.setFont(font) + self.Titre.setObjectName(_fromUtf8("Titre")) + self.groupBox = QtGui.QGroupBox(cenra) + self.groupBox.setGeometry(QtCore.QRect(10, 50, 511, 121)) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.groupBox.setFont(font) + self.groupBox.setAlignment(QtCore.Qt.AlignCenter) + self.groupBox.setObjectName(_fromUtf8("groupBox")) + self.horizontalLayoutWidget = QtGui.QWidget(self.groupBox) + self.horizontalLayoutWidget.setGeometry(QtCore.QRect(20, 20, 126, 31)) + self.horizontalLayoutWidget.setObjectName(_fromUtf8("horizontalLayoutWidget")) + self.horizontalLayout = QtGui.QHBoxLayout(self.horizontalLayoutWidget) + self.horizontalLayout.setMargin(0) + self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) + self.label_dept = QtGui.QLabel(self.horizontalLayoutWidget) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.label_dept.setFont(font) + self.label_dept.setObjectName(_fromUtf8("label_dept")) + self.horizontalLayout.addWidget(self.label_dept) + self.dept = QtGui.QComboBox(self.horizontalLayoutWidget) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.dept.setFont(font) + self.dept.setObjectName(_fromUtf8("dept")) + self.dept.addItem(_fromUtf8("")) + self.dept.setItemText(0, _fromUtf8("")) + self.dept.addItem(_fromUtf8("")) + self.dept.addItem(_fromUtf8("")) + self.dept.addItem(_fromUtf8("")) + self.dept.addItem(_fromUtf8("")) + self.dept.addItem(_fromUtf8("")) + self.dept.addItem(_fromUtf8("")) + self.horizontalLayout.addWidget(self.dept) + self.horizontalLayoutWidget_2 = QtGui.QWidget(self.groupBox) + self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(20, 50, 481, 31)) + self.horizontalLayoutWidget_2.setObjectName(_fromUtf8("horizontalLayoutWidget_2")) + self.horizontalLayout_2 = QtGui.QHBoxLayout(self.horizontalLayoutWidget_2) + self.horizontalLayout_2.setMargin(0) + self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) + self.label_nom = QtGui.QLabel(self.horizontalLayoutWidget_2) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.label_nom.setFont(font) + self.label_nom.setObjectName(_fromUtf8("label_nom")) + self.horizontalLayout_2.addWidget(self.label_nom) + self.nom = QtGui.QLineEdit(self.horizontalLayoutWidget_2) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.nom.setFont(font) + self.nom.setObjectName(_fromUtf8("nom")) + self.horizontalLayout_2.addWidget(self.nom) + self.horizontalLayoutWidget_3 = QtGui.QWidget(self.groupBox) + self.horizontalLayoutWidget_3.setGeometry(QtCore.QRect(20, 80, 479, 31)) + self.horizontalLayoutWidget_3.setObjectName(_fromUtf8("horizontalLayoutWidget_3")) + self.horizontalLayout_3 = QtGui.QHBoxLayout(self.horizontalLayoutWidget_3) + self.horizontalLayout_3.setMargin(0) + self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) + self.label_2 = QtGui.QLabel(self.horizontalLayoutWidget_3) + self.label_2.setObjectName(_fromUtf8("label_2")) + self.horizontalLayout_3.addWidget(self.label_2) + self.label = QtGui.QLabel(self.horizontalLayoutWidget_3) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.label.setFont(font) + self.label.setObjectName(_fromUtf8("label")) + self.horizontalLayout_3.addWidget(self.label) + self.horizontalLayoutWidget_6 = QtGui.QWidget(self.groupBox) + self.horizontalLayoutWidget_6.setGeometry(QtCore.QRect(339, 20, 161, 31)) + self.horizontalLayoutWidget_6.setObjectName(_fromUtf8("horizontalLayoutWidget_6")) + self.horizontalLayout_6 = QtGui.QHBoxLayout(self.horizontalLayoutWidget_6) + self.horizontalLayout_6.setMargin(0) + self.horizontalLayout_6.setObjectName(_fromUtf8("horizontalLayout_6")) + self.at = QtGui.QCheckBox(self.horizontalLayoutWidget_6) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.at.setFont(font) + self.at.setObjectName(_fromUtf8("at")) + self.horizontalLayout_6.addWidget(self.at) + self.groupBox_2 = QtGui.QGroupBox(cenra) + self.groupBox_2.setGeometry(QtCore.QRect(10, 190, 511, 241)) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.groupBox_2.setFont(font) + self.groupBox_2.setAlignment(QtCore.Qt.AlignCenter) + self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) + self.gridLayoutWidget = QtGui.QWidget(self.groupBox_2) + self.gridLayoutWidget.setGeometry(QtCore.QRect(20, 30, 162, 141)) + self.gridLayoutWidget.setObjectName(_fromUtf8("gridLayoutWidget")) + self.gridLayout = QtGui.QGridLayout(self.gridLayoutWidget) + self.gridLayout.setMargin(0) + self.gridLayout.setObjectName(_fromUtf8("gridLayout")) + self.couche_habitat = QtGui.QCheckBox(self.gridLayoutWidget) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.couche_habitat.setFont(font) + self.couche_habitat.setObjectName(_fromUtf8("couche_habitat")) + self.gridLayout.addWidget(self.couche_habitat, 1, 0, 1, 1) + self.couche_contour = QtGui.QCheckBox(self.gridLayoutWidget) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.couche_contour.setFont(font) + self.couche_contour.setObjectName(_fromUtf8("couche_contour")) + self.gridLayout.addWidget(self.couche_contour, 0, 0, 1, 1) + self.annee_4 = QtGui.QLineEdit(self.gridLayoutWidget) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.annee_4.setFont(font) + self.annee_4.setAlignment(QtCore.Qt.AlignCenter) + self.annee_4.setObjectName(_fromUtf8("annee_4")) + self.gridLayout.addWidget(self.annee_4, 4, 1, 1, 1) + self.couche_travaux_prevus = QtGui.QCheckBox(self.gridLayoutWidget) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.couche_travaux_prevus.setFont(font) + self.couche_travaux_prevus.setObjectName(_fromUtf8("couche_travaux_prevus")) + self.gridLayout.addWidget(self.couche_travaux_prevus, 3, 0, 1, 1) + self.annee_5 = QtGui.QLineEdit(self.gridLayoutWidget) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.annee_5.setFont(font) + self.annee_5.setAlignment(QtCore.Qt.AlignCenter) + self.annee_5.setObjectName(_fromUtf8("annee_5")) + self.gridLayout.addWidget(self.annee_5, 3, 1, 1, 1) + self.couche_vierge = QtGui.QCheckBox(self.gridLayoutWidget) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.couche_vierge.setFont(font) + self.couche_vierge.setObjectName(_fromUtf8("couche_vierge")) + self.gridLayout.addWidget(self.couche_vierge, 4, 0, 1, 1) + self.annee_1 = QtGui.QLineEdit(self.gridLayoutWidget) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.annee_1.setFont(font) + self.annee_1.setAlignment(QtCore.Qt.AlignCenter) + self.annee_1.setObjectName(_fromUtf8("annee_1")) + self.gridLayout.addWidget(self.annee_1, 0, 1, 1, 1) + self.annee_2 = QtGui.QLineEdit(self.gridLayoutWidget) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.annee_2.setFont(font) + self.annee_2.setAlignment(QtCore.Qt.AlignCenter) + self.annee_2.setObjectName(_fromUtf8("annee_2")) + self.gridLayout.addWidget(self.annee_2, 1, 1, 1, 1) + self.horizontalLayoutWidget_4 = QtGui.QWidget(self.groupBox_2) + self.horizontalLayoutWidget_4.setGeometry(QtCore.QRect(50, 170, 451, 31)) + self.horizontalLayoutWidget_4.setObjectName(_fromUtf8("horizontalLayoutWidget_4")) + self.horizontalLayout_4 = QtGui.QHBoxLayout(self.horizontalLayoutWidget_4) + self.horizontalLayout_4.setMargin(0) + self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) + self.label_nom_couche_vierge = QtGui.QLabel(self.horizontalLayoutWidget_4) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.label_nom_couche_vierge.setFont(font) + self.label_nom_couche_vierge.setObjectName(_fromUtf8("label_nom_couche_vierge")) + self.horizontalLayout_4.addWidget(self.label_nom_couche_vierge) + self.nom_couche_vierge = QtGui.QLineEdit(self.horizontalLayoutWidget_4) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.nom_couche_vierge.setFont(font) + self.nom_couche_vierge.setObjectName(_fromUtf8("nom_couche_vierge")) + self.horizontalLayout_4.addWidget(self.nom_couche_vierge) + self.horizontalLayoutWidget_5 = QtGui.QWidget(self.groupBox_2) + self.horizontalLayoutWidget_5.setGeometry(QtCore.QRect(50, 200, 341, 31)) + self.horizontalLayoutWidget_5.setObjectName(_fromUtf8("horizontalLayoutWidget_5")) + self.horizontalLayout_5 = QtGui.QHBoxLayout(self.horizontalLayoutWidget_5) + self.horizontalLayout_5.setMargin(0) + self.horizontalLayout_5.setObjectName(_fromUtf8("horizontalLayout_5")) + self.label_geom_couche_vierge = QtGui.QLabel(self.horizontalLayoutWidget_5) + self.label_geom_couche_vierge.setMinimumSize(QtCore.QSize(152, 0)) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.label_geom_couche_vierge.setFont(font) + self.label_geom_couche_vierge.setObjectName(_fromUtf8("label_geom_couche_vierge")) + self.horizontalLayout_5.addWidget(self.label_geom_couche_vierge) + self.couche_vierge_point = QtGui.QRadioButton(self.horizontalLayoutWidget_5) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.couche_vierge_point.setFont(font) + self.couche_vierge_point.setObjectName(_fromUtf8("couche_vierge_point")) + self.horizontalLayout_5.addWidget(self.couche_vierge_point) + self.couche_vierge_ligne = QtGui.QRadioButton(self.horizontalLayoutWidget_5) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.couche_vierge_ligne.setFont(font) + self.couche_vierge_ligne.setObjectName(_fromUtf8("couche_vierge_ligne")) + self.horizontalLayout_5.addWidget(self.couche_vierge_ligne) + self.couche_vierge_polygone = QtGui.QRadioButton(self.horizontalLayoutWidget_5) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.couche_vierge_polygone.setFont(font) + self.couche_vierge_polygone.setObjectName(_fromUtf8("couche_vierge_polygone")) + self.horizontalLayout_5.addWidget(self.couche_vierge_polygone) + self.label_3 = QtGui.QLabel(self.groupBox_2) + self.label_3.setGeometry(QtCore.QRect(320, 60, 60, 29)) + self.label_3.setObjectName(_fromUtf8("label_3")) + self.label_4 = QtGui.QLabel(self.groupBox_2) + self.label_4.setGeometry(QtCore.QRect(240, 90, 221, 16)) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.label_4.setFont(font) + self.label_4.setObjectName(_fromUtf8("label_4")) + self.label_5 = QtGui.QLabel(self.groupBox_2) + self.label_5.setGeometry(QtCore.QRect(240, 110, 221, 16)) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.label_5.setFont(font) + self.label_5.setAlignment(QtCore.Qt.AlignCenter) + self.label_5.setObjectName(_fromUtf8("label_5")) + self.groupBox_3 = QtGui.QGroupBox(cenra) + self.groupBox_3.setGeometry(QtCore.QRect(10, 440, 511, 81)) + font = QtGui.QFont() + font.setBold(True) + font.setItalic(True) + font.setWeight(75) + self.groupBox_3.setFont(font) + self.groupBox_3.setAlignment(QtCore.Qt.AlignCenter) + self.groupBox_3.setObjectName(_fromUtf8("groupBox_3")) + self.label_6 = QtGui.QLabel(self.groupBox_3) + self.label_6.setGeometry(QtCore.QRect(20, 20, 471, 16)) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.label_6.setFont(font) + self.label_6.setObjectName(_fromUtf8("label_6")) + self.label_7 = QtGui.QLabel(self.groupBox_3) + self.label_7.setGeometry(QtCore.QRect(120, 50, 141, 16)) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.label_7.setFont(font) + self.label_7.setObjectName(_fromUtf8("label_7")) + self.label_8 = QtGui.QLabel(self.groupBox_3) + self.label_8.setGeometry(QtCore.QRect(270, 40, 41, 41)) + self.label_8.setText(_fromUtf8("")) + self.label_8.setTextFormat(QtCore.Qt.PlainText) + self.label_8.setPixmap(QtGui.QPixmap(_fromUtf8("page_ajout.png"))) + self.label_8.setObjectName(_fromUtf8("label_8")) + + self.retranslateUi(cenra) + QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), cenra.accept) + QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), cenra.reject) + QtCore.QMetaObject.connectSlotsByName(cenra) + + def retranslateUi(self, cenra): + cenra.setWindowTitle(_translate("cenra", "Nouveau Projet Cartographique", None)) + self.Titre.setText(_translate("cenra", "Création d\'un nouveau dossier cartographique", None)) + self.groupBox.setTitle(_translate("cenra", "Généralités", None)) + self.label_dept.setText(_translate("cenra", "Département :", None)) + self.dept.setItemText(1, _translate("cenra", "01", None)) + self.dept.setItemText(2, _translate("cenra", "07", None)) + self.dept.setItemText(3, _translate("cenra", "26", None)) + self.dept.setItemText(4, _translate("cenra", "42", None)) + self.dept.setItemText(5, _translate("cenra", "69", None)) + self.dept.setItemText(6, _translate("cenra", "form", None)) + self.label_nom.setText(_translate("cenra", "Nom du dossier :", None)) + self.label_2.setText(_translate("cenra", "Attention :", None)) + self.label.setText(_translate("cenra", "Le nom du dossier ne doit comporter ni caractères spéciaux, ni espaces, ni majuscules", None)) + self.at.setText(_translate("cenra", "Animation Territoriale", None)) + self.groupBox_2.setTitle(_translate("cenra", "Liste des couches à ajouter lors de la création", None)) + self.couche_habitat.setText(_translate("cenra", "Habitat", None)) + self.couche_contour.setText(_translate("cenra", "Contour", None)) + self.annee_4.setText(_translate("cenra", "aaaa", None)) + self.couche_travaux_prevus.setText(_translate("cenra", "Travaux Prévus", None)) + self.annee_5.setText(_translate("cenra", "aaaa", None)) + self.couche_vierge.setText(_translate("cenra", "Vierge", None)) + self.annee_1.setText(_translate("cenra", "aaaa", None)) + self.annee_2.setText(_translate("cenra", "aaaa", None)) + self.label_nom_couche_vierge.setText(_translate("cenra", "- Nom de la couche vierge :", None)) + self.label_geom_couche_vierge.setText(_translate("cenra", "- Geométrie de la couche vierge :", None)) + self.couche_vierge_point.setText(_translate("cenra", "Point", None)) + self.couche_vierge_ligne.setText(_translate("cenra", "Ligne", None)) + self.couche_vierge_polygone.setText(_translate("cenra", "Polygone", None)) + self.label_3.setText(_translate("cenra", "Attention :", None)) + self.label_4.setText(_translate("cenra", "Le nom de la couche vierge ne doit comporter", None)) + self.label_5.setText(_translate("cenra", "ni caractères spéciaux, ni espaces", None)) + self.groupBox_3.setTitle(_translate("cenra", "Note", None)) + self.label_6.setText(_translate("cenra", "Vous pourez à tous moment ajouter de nouvelles couches à votre dossier, à l\'aide de l\'outil :", None)) + self.label_7.setText(_translate("cenra", "Ajout de nouvelles couches", None)) + diff --git a/CenRa_POSTGIS/ui_table_postgis.py.bak b/CenRa_POSTGIS/ui_table_postgis.py.bak new file mode 100644 index 00000000..e859f18d --- /dev/null +++ b/CenRa_POSTGIS/ui_table_postgis.py.bak @@ -0,0 +1,230 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'ui_table_postgis.ui' +# +# Created: Thu Mar 27 16:17:32 2014 +# by: PyQt4 UI code generator 4.9.6 +# +# WARNING! All changes made in this file will be lost! + +from PyQt4 import QtCore, QtGui + +try: + _fromUtf8 = QtCore.QString.fromUtf8 +except AttributeError: + def _fromUtf8(s): + return s + +try: + _encoding = QtGui.QApplication.UnicodeUTF8 + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig, _encoding) +except AttributeError: + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig) + +class Ui_table_postgis(object): + def setupUi(self, table_postgis): + table_postgis.setObjectName(_fromUtf8("table_postgis")) + table_postgis.resize(532, 364) + self.buttonBox = QtGui.QDialogButtonBox(table_postgis) + self.buttonBox.setGeometry(QtCore.QRect(360, 330, 161, 32)) + self.buttonBox.setOrientation(QtCore.Qt.Horizontal) + self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) + self.buttonBox.setObjectName(_fromUtf8("buttonBox")) + self.Titre = QtGui.QLabel(table_postgis) + self.Titre.setGeometry(QtCore.QRect(170, 0, 171, 31)) + font = QtGui.QFont() + font.setPointSize(14) + font.setBold(True) + font.setWeight(75) + self.Titre.setFont(font) + self.Titre.setObjectName(_fromUtf8("Titre")) + self.groupBox_2 = QtGui.QGroupBox(table_postgis) + self.groupBox_2.setGeometry(QtCore.QRect(10, 80, 511, 241)) + font = QtGui.QFont() + font.setBold(True) + font.setWeight(75) + self.groupBox_2.setFont(font) + self.groupBox_2.setAlignment(QtCore.Qt.AlignCenter) + self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) + self.gridLayoutWidget = QtGui.QWidget(self.groupBox_2) + self.gridLayoutWidget.setGeometry(QtCore.QRect(20, 30, 162, 141)) + self.gridLayoutWidget.setObjectName(_fromUtf8("gridLayoutWidget")) + self.gridLayout = QtGui.QGridLayout(self.gridLayoutWidget) + self.gridLayout.setMargin(0) + self.gridLayout.setObjectName(_fromUtf8("gridLayout")) + self.couche_habitat = QtGui.QCheckBox(self.gridLayoutWidget) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.couche_habitat.setFont(font) + self.couche_habitat.setObjectName(_fromUtf8("couche_habitat")) + self.gridLayout.addWidget(self.couche_habitat, 1, 0, 1, 1) + self.couche_contour = QtGui.QCheckBox(self.gridLayoutWidget) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.couche_contour.setFont(font) + self.couche_contour.setObjectName(_fromUtf8("couche_contour")) + self.gridLayout.addWidget(self.couche_contour, 0, 0, 1, 1) + self.annee_4 = QtGui.QLineEdit(self.gridLayoutWidget) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.annee_4.setFont(font) + self.annee_4.setAlignment(QtCore.Qt.AlignCenter) + self.annee_4.setObjectName(_fromUtf8("annee_4")) + self.gridLayout.addWidget(self.annee_4, 4, 1, 1, 1) + self.couche_travaux_prevus = QtGui.QCheckBox(self.gridLayoutWidget) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.couche_travaux_prevus.setFont(font) + self.couche_travaux_prevus.setObjectName(_fromUtf8("couche_travaux_prevus")) + self.gridLayout.addWidget(self.couche_travaux_prevus, 3, 0, 1, 1) + self.annee_5 = QtGui.QLineEdit(self.gridLayoutWidget) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.annee_5.setFont(font) + self.annee_5.setAlignment(QtCore.Qt.AlignCenter) + self.annee_5.setObjectName(_fromUtf8("annee_5")) + self.gridLayout.addWidget(self.annee_5, 3, 1, 1, 1) + self.couche_vierge = QtGui.QCheckBox(self.gridLayoutWidget) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.couche_vierge.setFont(font) + self.couche_vierge.setObjectName(_fromUtf8("couche_vierge")) + self.gridLayout.addWidget(self.couche_vierge, 4, 0, 1, 1) + self.annee_1 = QtGui.QLineEdit(self.gridLayoutWidget) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.annee_1.setFont(font) + self.annee_1.setAlignment(QtCore.Qt.AlignCenter) + self.annee_1.setObjectName(_fromUtf8("annee_1")) + self.gridLayout.addWidget(self.annee_1, 0, 1, 1, 1) + self.annee_2 = QtGui.QLineEdit(self.gridLayoutWidget) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.annee_2.setFont(font) + self.annee_2.setAlignment(QtCore.Qt.AlignCenter) + self.annee_2.setObjectName(_fromUtf8("annee_2")) + self.gridLayout.addWidget(self.annee_2, 1, 1, 1, 1) + self.horizontalLayoutWidget_4 = QtGui.QWidget(self.groupBox_2) + self.horizontalLayoutWidget_4.setGeometry(QtCore.QRect(50, 170, 451, 31)) + self.horizontalLayoutWidget_4.setObjectName(_fromUtf8("horizontalLayoutWidget_4")) + self.horizontalLayout_4 = QtGui.QHBoxLayout(self.horizontalLayoutWidget_4) + self.horizontalLayout_4.setMargin(0) + self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) + self.label_nom_couche_vierge = QtGui.QLabel(self.horizontalLayoutWidget_4) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.label_nom_couche_vierge.setFont(font) + self.label_nom_couche_vierge.setObjectName(_fromUtf8("label_nom_couche_vierge")) + self.horizontalLayout_4.addWidget(self.label_nom_couche_vierge) + self.nom_couche_vierge = QtGui.QLineEdit(self.horizontalLayoutWidget_4) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.nom_couche_vierge.setFont(font) + self.nom_couche_vierge.setObjectName(_fromUtf8("nom_couche_vierge")) + self.horizontalLayout_4.addWidget(self.nom_couche_vierge) + self.horizontalLayoutWidget_5 = QtGui.QWidget(self.groupBox_2) + self.horizontalLayoutWidget_5.setGeometry(QtCore.QRect(50, 200, 341, 31)) + self.horizontalLayoutWidget_5.setObjectName(_fromUtf8("horizontalLayoutWidget_5")) + self.horizontalLayout_5 = QtGui.QHBoxLayout(self.horizontalLayoutWidget_5) + self.horizontalLayout_5.setMargin(0) + self.horizontalLayout_5.setObjectName(_fromUtf8("horizontalLayout_5")) + self.label_geom_couche_vierge = QtGui.QLabel(self.horizontalLayoutWidget_5) + self.label_geom_couche_vierge.setMinimumSize(QtCore.QSize(152, 0)) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.label_geom_couche_vierge.setFont(font) + self.label_geom_couche_vierge.setObjectName(_fromUtf8("label_geom_couche_vierge")) + self.horizontalLayout_5.addWidget(self.label_geom_couche_vierge) + self.couche_vierge_point = QtGui.QRadioButton(self.horizontalLayoutWidget_5) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.couche_vierge_point.setFont(font) + self.couche_vierge_point.setObjectName(_fromUtf8("couche_vierge_point")) + self.horizontalLayout_5.addWidget(self.couche_vierge_point) + self.couche_vierge_ligne = QtGui.QRadioButton(self.horizontalLayoutWidget_5) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.couche_vierge_ligne.setFont(font) + self.couche_vierge_ligne.setObjectName(_fromUtf8("couche_vierge_ligne")) + self.horizontalLayout_5.addWidget(self.couche_vierge_ligne) + self.couche_vierge_polygone = QtGui.QRadioButton(self.horizontalLayoutWidget_5) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.couche_vierge_polygone.setFont(font) + self.couche_vierge_polygone.setObjectName(_fromUtf8("couche_vierge_polygone")) + self.horizontalLayout_5.addWidget(self.couche_vierge_polygone) + self.label_3 = QtGui.QLabel(self.groupBox_2) + self.label_3.setGeometry(QtCore.QRect(320, 60, 60, 29)) + self.label_3.setObjectName(_fromUtf8("label_3")) + self.label_4 = QtGui.QLabel(self.groupBox_2) + self.label_4.setGeometry(QtCore.QRect(240, 90, 221, 16)) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.label_4.setFont(font) + self.label_4.setObjectName(_fromUtf8("label_4")) + self.label_5 = QtGui.QLabel(self.groupBox_2) + self.label_5.setGeometry(QtCore.QRect(240, 110, 221, 16)) + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.label_5.setFont(font) + self.label_5.setAlignment(QtCore.Qt.AlignCenter) + self.label_5.setObjectName(_fromUtf8("label_5")) + self.horizontalLayoutWidget = QtGui.QWidget(table_postgis) + self.horizontalLayoutWidget.setGeometry(QtCore.QRect(10, 40, 511, 31)) + self.horizontalLayoutWidget.setObjectName(_fromUtf8("horizontalLayoutWidget")) + self.horizontalLayout = QtGui.QHBoxLayout(self.horizontalLayoutWidget) + self.horizontalLayout.setMargin(0) + self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) + self.schema_label = QtGui.QLabel(self.horizontalLayoutWidget) + self.schema_label.setMaximumSize(QtCore.QSize(75, 16777215)) + self.schema_label.setObjectName(_fromUtf8("schema_label")) + self.horizontalLayout.addWidget(self.schema_label) + self.schema = QtGui.QComboBox(self.horizontalLayoutWidget) + self.schema.setObjectName(_fromUtf8("schema")) + self.horizontalLayout.addWidget(self.schema) + + self.retranslateUi(table_postgis) + QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), table_postgis.accept) + QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), table_postgis.reject) + QtCore.QMetaObject.connectSlotsByName(table_postgis) + + def retranslateUi(self, table_postgis): + table_postgis.setWindowTitle(_translate("table_postgis", "Ajout d\'une table", None)) + self.Titre.setText(_translate("table_postgis", "Création de table", None)) + self.groupBox_2.setTitle(_translate("table_postgis", "Liste des couches à ajouter dans le projet", None)) + self.couche_habitat.setText(_translate("table_postgis", "Habitat", None)) + self.couche_contour.setText(_translate("table_postgis", "Contour", None)) + self.annee_4.setText(_translate("table_postgis", "aaaa", None)) + self.couche_travaux_prevus.setText(_translate("table_postgis", "Travaux Prévus", None)) + self.annee_5.setText(_translate("table_postgis", "aaaa", None)) + self.couche_vierge.setText(_translate("table_postgis", "Vierge", None)) + self.annee_1.setText(_translate("table_postgis", "aaaa", None)) + self.annee_2.setText(_translate("table_postgis", "aaaa", None)) + self.label_nom_couche_vierge.setText(_translate("table_postgis", "- Nom de la couche vierge :", None)) + self.label_geom_couche_vierge.setText(_translate("table_postgis", "- Geométrie de la couche vierge :", None)) + self.couche_vierge_point.setText(_translate("table_postgis", "Point", None)) + self.couche_vierge_ligne.setText(_translate("table_postgis", "Ligne", None)) + self.couche_vierge_polygone.setText(_translate("table_postgis", "Polygone", None)) + self.label_3.setText(_translate("table_postgis", "Attention :", None)) + self.label_4.setText(_translate("table_postgis", "Le nom de la couche vierge ne doit comporter", None)) + self.label_5.setText(_translate("table_postgis", "ni caractères spéciaux, ni espaces", None)) + self.schema_label.setText(_translate("table_postgis", "Nom du projet :", None)) + diff --git a/CenRa_SICEN/Makefile b/CenRa_SICEN/Makefile new file mode 100644 index 00000000..aa7663c9 --- /dev/null +++ b/CenRa_SICEN/Makefile @@ -0,0 +1,119 @@ +#/*************************************************************************** +# SICEN +# +# Filtre sur données SICEN +# ------------------- +# begin : 2014-10-17 +# copyright : (C) 2014 by Guillaume COSTES +# email : guillaume.costes@espaces-naturels.fr +# ***************************************************************************/ +# +#/*************************************************************************** +# * * +# * 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. * +# * * +# ***************************************************************************/ + +# CONFIGURATION +PLUGIN_UPLOAD = $(CURDIR)/plugin_upload.py + +QGISDIR=.qgis2 + +# Makefile for a PyQGIS plugin + +# translation +SOURCES = sicen.py ui_sicen.py __init__.py sicendialog.py +#TRANSLATIONS = i18n/sicen_en.ts +TRANSLATIONS = + +# global + +PLUGINNAME = sicen + +PY_FILES = sicen.py sicendialog.py __init__.py + +EXTRAS = cenra.png metadata.txt + +UI_FILES = ui_sicen.py + +RESOURCE_FILES = resources_rc.py + +HELP = help/build/html + +default: compile + +compile: $(UI_FILES) $(RESOURCE_FILES) + +%_rc.py : %.qrc + pyrcc4 -o $*_rc.py $< + +%.py : %.ui + pyuic4 -o $@ $< + +%.qm : %.ts + lrelease $< + +# The deploy target only works on unix like operating system where +# the Python plugin directory is located at: +# $HOME/$(QGISDIR)/python/plugins +deploy: compile doc transcompile + mkdir -p $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vf $(PY_FILES) $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vf $(UI_FILES) $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vf $(RESOURCE_FILES) $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vf $(EXTRAS) $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vfr i18n $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + cp -vfr $(HELP) $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME)/help + +# The dclean target removes compiled python files from plugin directory +# also delets any .svn entry +dclean: + find $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) -iname "*.pyc" -delete + find $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) -iname ".svn" -prune -exec rm -Rf {} \; + +# The derase deletes deployed plugin +derase: + rm -Rf $(HOME)/$(QGISDIR)/python/plugins/$(PLUGINNAME) + +# The zip target deploys the plugin and creates a zip file with the deployed +# content. You can then upload the zip file on http://plugins.qgis.org +zip: deploy dclean + rm -f $(PLUGINNAME).zip + cd $(HOME)/$(QGISDIR)/python/plugins; zip -9r $(CURDIR)/$(PLUGINNAME).zip $(PLUGINNAME) + +# Create a zip package of the plugin named $(PLUGINNAME).zip. +# This requires use of git (your plugin development directory must be a +# git repository). +# To use, pass a valid commit or tag as follows: +# make package VERSION=Version_0.3.2 +package: compile + rm -f $(PLUGINNAME).zip + git archive --prefix=$(PLUGINNAME)/ -o $(PLUGINNAME).zip $(VERSION) + echo "Created package: $(PLUGINNAME).zip" + +upload: zip + $(PLUGIN_UPLOAD) $(PLUGINNAME).zip + +# transup +# update .ts translation files +transup: + pylupdate4 Makefile + +# transcompile +# compile translation files into .qm binary format +transcompile: $(TRANSLATIONS:.ts=.qm) + +# transclean +# deletes all .qm files +transclean: + rm -f i18n/*.qm + +clean: + rm $(UI_FILES) $(RESOURCE_FILES) + +# build documentation with sphinx +doc: + cd help; make html diff --git a/CenRa_SICEN/README.html b/CenRa_SICEN/README.html new file mode 100644 index 00000000..7526d63c --- /dev/null +++ b/CenRa_SICEN/README.html @@ -0,0 +1,32 @@ + + +

Plugin Builder Results

+
+Your plugin SICEN was created in:
+  C:\Users\gcostes\.qgis2\python\plugins\SICEN +

+Your QGIS plugin directory is located at:
+  C:/Users/gcostes/.qgis2/python/plugins +

+What's Next +

    +
  1. Copy the entire directory containing your new plugin to the QGIS plugin directory +
  2. Compile the ui file using pyuic4 +
  3. Compile the resources file using pyrcc4 +
  4. Test the plugin by enabling it in the QGIS plugin manager +
  5. Customize it by editing the implementation file sicen.py +
  6. Create your own custom icon, replacing the default icon.png +
  7. Modify your user interface by opening sicen.ui in Qt Designer (don't forget to compile it with pyuic4 after changing it) +
  8. You can use the Makefile to compile your Ui and resource files when you make changes. This requires GNU make (gmake) + +
+
+

+For more information, see the PyQGIS Developer Cookbook at: +http://www.qgis.org/pyqgis-cookbook/index.html. +

+
+GeoApt LLC +©2011-2014 GeoApt LLC - geoapt.com + + diff --git a/CenRa_SICEN/forms/about_form.py b/CenRa_SICEN/forms/about_form.py new file mode 100644 index 00000000..89329d3f --- /dev/null +++ b/CenRa_SICEN/forms/about_form.py @@ -0,0 +1,46 @@ +import os.path + +from pathlib import Path + +from qgis.PyQt import uic +from qgis.PyQt.QtGui import QPixmap +from qgis.PyQt.QtWidgets import QDialog + +from ..tools.resources import devlog + +ABOUT_FORM_CLASS, _ = uic.loadUiType( + os.path.join( + str(Path(__file__).resolve().parent.parent), + 'forms', + 'sicen_about_form.ui' + ) +) + + +class SicenAboutDialog(QDialog, ABOUT_FORM_CLASS): + + """ About - Let the user display the about dialog. """ + + def __init__(self, iface, parent=None): + super().__init__(parent) + self.iface = iface + self.setupUi(self) + + self.viewer.setHtml(devlog('CenRa_SICEN')) + + self.rejected.connect(self.onReject) + self.buttonBox.rejected.connect(self.onReject) + self.buttonBox.accepted.connect(self.onAccept) + + def onAccept(self): + """ + Save options when pressing OK button + """ + self.accept() + + def onReject(self): + """ + Run some actions when + the user closes the dialog + """ + self.close() \ No newline at end of file diff --git a/CenRa_SICEN/forms/sicen_about_form.ui b/CenRa_SICEN/forms/sicen_about_form.ui new file mode 100644 index 00000000..a99c3eab --- /dev/null +++ b/CenRa_SICEN/forms/sicen_about_form.ui @@ -0,0 +1,96 @@ + + + CenRa_Metabase_editorwidget_base + + + + 0 + 0 + 471 + 594 + + + + SICEN + + + + ../../CenRa_Metabase/tools/ui/icon.svg../../CenRa_Metabase/tools/ui/icon.svg + + + + + + true + + + Qt::NoFocus + + + QFrame::NoFrame + + + QFrame::Plain + + + true + + + + + 0 + 0 + 453 + 547 + + + + + + 0 + 0 + 451 + 541 + + + + DevLog + + + + + 10 + 20 + 431 + 511 + + + + + about:blank + + + + + + + + + + + QDialogButtonBox::Ok + + + + + + + + QWebView + QWidget +
QtWebKitWidgets/QWebView
+
+
+ + +
diff --git a/CenRa_SICEN/help/Makefile b/CenRa_SICEN/help/Makefile new file mode 100644 index 00000000..ebb0236d --- /dev/null +++ b/CenRa_SICEN/help/Makefile @@ -0,0 +1,130 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/templateclass.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/templateclass.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/templateclass" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/templateclass" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + make -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/CenRa_SICEN/help/make.bat b/CenRa_SICEN/help/make.bat new file mode 100644 index 00000000..90dc1912 --- /dev/null +++ b/CenRa_SICEN/help/make.bat @@ -0,0 +1,155 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. changes to make an overview over all changed/added/deprecated items + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\templateclass.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\templateclass.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +:end diff --git a/CenRa_SICEN/help/source/conf.py b/CenRa_SICEN/help/source/conf.py new file mode 100644 index 00000000..7e12fd25 --- /dev/null +++ b/CenRa_SICEN/help/source/conf.py @@ -0,0 +1,216 @@ +# -*- coding: utf-8 -*- +# +# sicen documentation build configuration file, created by +# sphinx-quickstart on Sun Feb 12 17:11:03 2012. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.todo', 'sphinx.ext.pngmath', 'sphinx.ext.viewcode'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'sicen' +copyright = u'2013, Guillaume COSTES' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0.1' +# The full version, including alpha/beta/rc tags. +release = '0.1' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = [] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'templateclassdoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +# The paper size ('letter' or 'a4'). +#latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +#latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'sicen.tex', u'sicen Documentation', + u'Guillaume COSTES', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'templateclass', u'sicen Documentation', + [u'Guillaume COSTES'], 1) +] diff --git a/CenRa_SICEN/help/source/index.rst b/CenRa_SICEN/help/source/index.rst new file mode 100644 index 00000000..33d06390 --- /dev/null +++ b/CenRa_SICEN/help/source/index.rst @@ -0,0 +1,20 @@ +.. sicen documentation master file, created by + sphinx-quickstart on Sun Feb 12 17:11:03 2012. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to sicen's documentation! +============================================ + +Contents: + +.. toctree:: + :maxdepth: 2 + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/CenRa_SICEN/resources_rc.qrc b/CenRa_SICEN/resources_rc.qrc new file mode 100644 index 00000000..95b2868a --- /dev/null +++ b/CenRa_SICEN/resources_rc.qrc @@ -0,0 +1,8 @@ + + + sicen.png + + + sicen_export.png + + diff --git a/CenRa_SICEN/sicen.py.bak b/CenRa_SICEN/sicen.py.bak new file mode 100644 index 00000000..413fbb00 --- /dev/null +++ b/CenRa_SICEN/sicen.py.bak @@ -0,0 +1,852 @@ +# -*- coding: utf-8 -*- +""" +/*************************************************************************** + SICEN + A QGIS plugin + Filtre sur données SICEN + ------------------- + begin : 2014-10-17 + copyright : (C) 2014 by Guillaume COSTES (CENRA) + email : guillaume.costes@espaces-naturels.fr + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ +""" +# Import the PyQt and QGIS libraries +from PyQt4.QtCore import * +from PyQt4.QtGui import * +from qgis.core import * +from qgis.gui import * +from qgis.utils import iface + +# Initialize Qt resources from file resources.py +import resources_rc +# Import the code for the dialog +from sicendialog import SICENDialog + +import os.path +import psycopg2 +import qgis +import datetime +import csv + +class SICEN: + + def __init__(self, iface): + # 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] + localePath = os.path.join(self.plugin_dir, 'i18n', 'sicen_{}.qm'.format(locale)) + + if os.path.exists(localePath): + 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 = SICENDialog() + + def initGui(self): + self.toolBar = self.iface.addToolBar("SICEN") + self.toolBar.setObjectName("SICEN") + + ## Create action that will start plugin configuration + self.action = QAction( + QIcon(":/plugins/sicen/sicen.png"), + u"Ouverture des données SICEN", self.iface.mainWindow()) + # connect the action to the run method + self.action.triggered.connect(self.ouverture) + + # Add toolbar button and menu item + self.toolBar.addAction(self.action) + self.iface.addPluginToMenu(u"SICEN", self.action) + + ## Create action that will start plugin configuration + self.action = QAction( + QIcon(":/plugins/sicen/sicen_export.png"), + u"Export liste d'espèces", self.iface.mainWindow()) + # connect the action to the run method + self.action.triggered.connect(self.export) + + # Add toolbar button and menu item + self.toolBar.addAction(self.action) + self.iface.addPluginToMenu(u"SICEN", self.action) + + self.menu = QMenu() + self.menu.setTitle( QCoreApplication.translate( "SICEN","&SICEN" ) ) + + self.sicen_ouverture = QAction( QIcon(":/plugins/SICEN/sicen.png"), QCoreApplication.translate("SICEN", u"Ouverture des données SICEN" ), self.iface.mainWindow() ) + self.sicen_export = QAction( QIcon(":/plugins/SICEN/sicen_export.png"), QCoreApplication.translate("SICEN", u"Export liste d'espèces" ), self.iface.mainWindow() ) + + self.menu.addActions( [self.sicen_ouverture, self.sicen_export] ) + + menu_bar = self.iface.mainWindow().menuBar() + actions = menu_bar.actions() + lastAction = actions[ len( actions ) - 1 ] + menu_bar.insertMenu( lastAction, self.menu ) + + self.sicen_ouverture.triggered.connect(self.ouverture) + self.sicen_export.triggered.connect(self.export) + + def unload(self): + # Remove the plugin menu item and icon + self.iface.removePluginMenu(u"&SICEN", self.action) + self.iface.removeToolBarIcon(self.action) + + # run method that performs all the real work + def ouverture(self): + + ### config.txt + config = "//100.100.100.100/bd_sig/z_QGIS/config.txt" # Chemin du fichier config + + # Fonction de lecture des lignes du fichier config + def readline(n): + with open(config, "r") as f: + for lineno, line in enumerate(f): + if lineno == n: + return line.strip() # Permet d'enlever les retours chariots + + # Recuperation des donnees + host = readline(10) + port = readline(12) + dbname = readline(14) + user = readline(16) + password = readline(18) + + # Connexion a la BD + con = psycopg2.connect("dbname="+ dbname + " user=" + user + " host=" + host + " password=" + password + " port=" + port) + cur = con.cursor() + + ## Creation des listes deroulantes + # Listing de valeur des champs + SQL_observateur = u"""SELECT DISTINCT nom || '_' || prenom as nom FROM md.personne WHERE nom LIKE '%CenRA%' ORDER BY nom""" + SQL_nom_com = u"""SELECT DISTINCT nom FROM saisie.commune ORDER BY nom""" + SQL_nom_vern = u"""SELECT DISTINCT nom_vern FROM _agregation_ra.observations_table ORDER BY nom_vern""" + SQL_nom_complet = u"""SELECT DISTINCT nom_complet FROM _agregation_ra.observations_table ORDER BY nom_complet""" + SQL_ordre = u"""SELECT DISTINCT ordre FROM _agregation_ra.observations_table ORDER BY ordre""" + + # Generation des listes + cur.execute(SQL_observateur) + list_observateur = cur.fetchall() + + cur.execute(SQL_nom_com) + list_nom_com = cur.fetchall() + + cur.execute(SQL_nom_vern) + list_nom_vern = cur.fetchall() + + cur.execute(SQL_nom_complet) + list_nom_complet = cur.fetchall() + + cur.execute(SQL_ordre) + list_ordre = cur.fetchall() + + con.close() + + + # Ajout des items dans les combobox + self.dlg.observateur_1.clear() + i = 0 + while i < len(list_observateur): + self.dlg.observateur_1.addItems(list_observateur[i]) + i=i+1 + self.dlg.observateur_1.setCurrentIndex(-1) # Pour ne pas commencer la liste au premier item + + self.dlg.observateur_2.clear() + i = 0 + while i < len(list_observateur): + self.dlg.observateur_2.addItems(list_observateur[i]) + i=i+1 + self.dlg.observateur_2.setCurrentIndex(-1) + + self.dlg.observateur_3.clear() + i = 0 + while i < len(list_observateur): + self.dlg.observateur_3.addItems(list_observateur[i]) + i=i+1 + self.dlg.observateur_3.setCurrentIndex(-1) + + self.dlg.observateur_4.clear() + i = 0 + while i < len(list_observateur): + self.dlg.observateur_4.addItems(list_observateur[i]) + i=i+1 + self.dlg.observateur_4.setCurrentIndex(-1) + + self.dlg.nom_com_1.clear() + i = 0 + while i < len(list_nom_com): + self.dlg.nom_com_1.addItems(list_nom_com[i]) + i=i+1 + self.dlg.nom_com_1.setCurrentIndex(-1) + + self.dlg.nom_com_2.clear() + i = 0 + while i < len(list_nom_com): + self.dlg.nom_com_2.addItems(list_nom_com[i]) + i=i+1 + self.dlg.nom_com_2.setCurrentIndex(-1) + + self.dlg.nom_vern.clear() + i = 0 + while i < len(list_nom_vern): + self.dlg.nom_vern.addItems(list_nom_vern[i]) + i=i+1 + self.dlg.nom_vern.setCurrentIndex(-1) + + self.dlg.nom_complet.clear() + i = 0 + while i < len(list_nom_complet): + self.dlg.nom_complet.addItems(list_nom_complet[i]) + i=i+1 + self.dlg.nom_complet.setCurrentIndex(-1) + + self.dlg.ordre.clear() + i = 0 + while i < len(list_ordre): + self.dlg.ordre.addItems(list_ordre[i]) + i=i+1 + self.dlg.ordre.setCurrentIndex(-1) + + # show the dialog + self.dlg.show() + # Run the dialog event loop + result = self.dlg.exec_() + # See if OK was pressed + if result == 1: + + ### config.txt + config = "//100.100.100.100/bd_sig/z_QGIS/config.txt" # Chemin du fichier config + + # Fonction de lecture des lignes du fichier config + def readline(n): + with open(config, "r") as f: + for lineno, line in enumerate(f): + if lineno == n: + return line.strip() # Permet d'enlever les retours chariots + + # Recuperation des donnees + host = readline(10) + port = readline(12) + dbname = readline(14) + user = readline(16) + password = readline(18) + + # Requete filtre observateur + if self.dlg.observateur_1.currentIndex() != -1 : + sql_obs1 = """ "observateur" LIKE '%""" + self.dlg.observateur_1.currentText() + "%' " + else : + sql_obs1 = '' + + if self.dlg.observateur_2.currentIndex() != -1 : + sql_obs2 = """ "observateur" LIKE '%""" + self.dlg.observateur_2.currentText() + "%' " + else : + sql_obs2 = '' + + if self.dlg.observateur_3.currentIndex() != -1 : + sql_obs3 = """ "observateur" LIKE '%""" + self.dlg.observateur_3.currentText() + "%' " + else : + sql_obs3 = '' + + if self.dlg.observateur_4.currentIndex() != -1 : + sql_obs4 = """ "observateur" LIKE '%""" + self.dlg.observateur_4.currentText() + "%' " + else : + sql_obs4 = '' + + reqwhere_obs = sql_obs1 + 'OR' + sql_obs2 + 'OR' + sql_obs3 + 'OR' + sql_obs4 + + while reqwhere_obs[-2:] == 'OR' : + reqwhere_obs = reqwhere_obs[:-2] + while reqwhere_obs[:2] == 'OR' : + reqwhere_obs = reqwhere_obs[2:] + + # Requete communes + # Connexion a la BD + con = psycopg2.connect("dbname="+ dbname + " user=" + user + " host=" + host + " password=" + password + " port=" + port) + cur = con.cursor() + + if self.dlg.nom_com_1.currentIndex() != -1 : + nom_com = self.dlg.nom_com_1.currentText() + SQL_code_INSEE = u"""SELECT DISTINCT code_insee FROM saisie.commune WHERE nom = '""" + nom_com + "'" + cur.execute(SQL_code_INSEE) + list_code_INSEE = cur.fetchall() + code_INSEE = list_code_INSEE[0][0] + + sql_insee_1 = """ "code_insee" = '""" + code_INSEE + "' " + else : + sql_insee_1 = '' + + if self.dlg.nom_com_2.currentIndex() != -1 : + nom_com = self.dlg.nom_com_2.currentText() + SQL_code_INSEE = u"""SELECT DISTINCT code_insee FROM saisie.commune WHERE nom = '""" + nom_com + "'" + cur.execute(SQL_code_INSEE) + list_code_INSEE = cur.fetchall() + code_INSEE = list_code_INSEE[0][0] + + sql_insee_2 = """ "code_insee" = '""" + code_INSEE + "' " + else : + sql_insee_2 = '' + + reqwhere_insee = sql_insee_1 + 'OR' + sql_insee_2 + + while reqwhere_insee[-2:] == 'OR' : + reqwhere_insee = reqwhere_insee[:-2] + while reqwhere_insee[:2] == 'OR' : + reqwhere_insee = reqwhere_insee[2:] + + con.close() + + # Requete date + today = datetime.datetime.now().strftime("%Y-%m-%d") + date_min = self.dlg.date_min.selectedDate().toString("yyyy-MM-dd") + date_max = self.dlg.date_max.selectedDate().toString("yyyy-MM-dd") + + if date_min != today : + sql_date_min = """ "date_obs" >= '""" + date_min + "' " + else : + sql_date_min = '' + + if date_max != today : + sql_date_max = """ "date_obs" <= '""" + date_max + "' " + else : + sql_date_max = '' + + reqwhere_date = sql_date_min + 'AND' + sql_date_max + + while reqwhere_obs[-3:] == 'AND' : + reqwhere_obs = reqwhere_obs[:-3] + while reqwhere_obs[:3] == 'AND' : + reqwhere_obs = reqwhere_obs[3:] + + # Requete regne + if self.dlg.Animalia.isChecked() == 1 : + sql_Animalia = """"regne" = 'Animalia'""" + else : + sql_Animalia = '' + + if self.dlg.Plantae.isChecked() == 1 : + sql_Plantae = """"regne" = 'Plantae'""" + else : + sql_Plantae = '' + + reqwhere_regne = sql_Animalia + 'OR' + sql_Plantae + + while reqwhere_regne[-2:] == 'OR' : + reqwhere_regne = reqwhere_regne[:-2] + while reqwhere_regne[:2] == 'OR' : + reqwhere_regne = reqwhere_regne[2:] + + # Requete ordre + if self.dlg.ordre.currentIndex() != -1 : + reqwhere_ordre = """"ordre" = '""" + self.dlg.ordre.currentText() + "'" + else : + reqwhere_ordre = '' + + # Requete sp + if self.dlg.nom_vern.currentIndex() != -1 : + sql_nom_vern = """"nom_vern" = '""" + self.dlg.nom_vern.currentText() + "'" + else : + sql_nom_vern = '' + + if self.dlg.nom_complet.currentIndex() != -1 : + sql_nom_complet = """"nom_complet" = '""" + self.dlg.nom_complet.currentText() + "'" + else : + sql_nom_complet = '' + + reqwhere_sp = sql_nom_vern + 'OR' + sql_nom_complet + + while reqwhere_sp[-2:] == 'OR' : + reqwhere_sp = reqwhere_sp[:-2] + while reqwhere_sp[:2] == 'OR' : + reqwhere_sp = reqwhere_sp[2:] + + # Requete filtre patrimonialite + if self.dlg.LRD_01.isChecked() == 1 : + sql_lrd01 = """ lrd01 IN ('VU','EN','RE','CR') """ + else : + sql_lrd01 = '' + + if self.dlg.LRD_07.isChecked() == 1 : + sql_lrd07 = """ lrd07 IN ('VU','EN','RE','CR') """ + else : + sql_lrd07 = '' + + if self.dlg.LRD_26.isChecked() == 1 : + sql_lrd26 = """ lrd26 IN ('VU','EN','RE','CR') """ + else : + sql_lrd26 = '' + + if self.dlg.LRD_38.isChecked() == 1 : + sql_lrd38 = """ lrd38 IN ('VU','EN','RE','CR', 'AS-1', 'AS-2', 'AS-3') """ + else : + sql_lrd38 = '' + + if self.dlg.LRD_42.isChecked() == 1 : + sql_lrd42 = """ lrd42 IN ('VU','EN','RE','CR') """ + else : + sql_lrd42 = '' + + if self.dlg.LRD_69.isChecked() == 1 : + sql_lrd69 = """ lrd69 IN ('VU','EN','RE','CR') """ + else : + sql_lrd69 = '' + + if self.dlg.LRD_73.isChecked() == 1 : + sql_lrd73 = """ lrd73 IN ('VU','EN','RE','CR') """ + else : + sql_lrd73 = '' + + if self.dlg.LRD_74.isChecked() == 1 : + sql_lrd74 = """ lrd74 IN ('VU','EN','RE','CR') """ + else : + sql_lrd74 = '' + + if self.dlg.LRR_Flore.isChecked() == 1 : + sql_LRR_Flore = u""" "TAXO_GROUPE" IN ('Plantes') AND (lrr like '%CR%' OR lrr like '%EN%' OR lrr like '%EW%' OR lrr like '%RE%' OR lrr like '%VU%')""" + else : + sql_LRR_Flore = '' + + if self.dlg.LRR_Oiseaux.isChecked() == 1 : + sql_LRR_Oiseaux = u""" "TAXO_GROUPE" = 'Oiseaux' AND (lrr like '%RE %' OR lrr like '%CR %' OR lrr like '%EN %' OR lrr like '%VU %') """ + else : + sql_LRR_Oiseaux = '' + + if self.dlg.LRR_Autre.isChecked() == 1 : + sql_LRR_Autre = u""" (lrr like '%RE %' OR lrr like '%CR %' OR lrr like '%EN %' OR lrr like '%VU %') AND "TAXO_GROUPE" NOT IN ('Oiseaux', 'Plantes') """ + else : + sql_LRR_Autre = '' + + if self.dlg.LRN_Flore.isChecked() == 1 : + sql_LRN_Flore = u""" "TAXO_GROUPE" ilike 'plantes' AND (lrr like '%CR%' OR lrr like '%EN%' OR lrr like '%EW%' OR lrr like '%RE%' OR lrr like '%VU%') """ + else : + sql_LRN_Flore = '' + + if self.dlg.LRN_Oiseaux.isChecked() == 1 : + sql_LRN_Oiseaux = u""" "TAXO_GROUPE" = 'Oiseaux' AND (lrn like '%RE %' OR lrn like '%CR %' OR lrn like '%EN %' OR lrn like '%VU %') """ + else : + sql_LRN_Oiseaux = '' + + if self.dlg.LRN_Ortho.isChecked() == 1 : + sql_LRN_Ortho = u""" "TAXO_GROUPE" ilike 'orthoptères' AND (lrn like '1%' OR lrn like '2%' OR lrn like '3%') """ + else : + sql_LRN_Ortho = '' + + if self.dlg.LRN_Autre.isChecked() == 1 : + sql_LRN_Autre = u""" (lrr like '%CR%' OR lrr like '%EN%' OR lrr like '%EW%' OR lrr like '%RE%' OR lrr like '%VU%') AND "TAXO_GROUPE" NOT IN ('Oiseaux', 'Plantes', 'Orthoptères') """ + else : + sql_LRN_Autre = '' + + if self.dlg.LRE.isChecked() == 1 : + sql_lre = """ lre IN ('VU','EN','RE','CR', 'EW', 'EX') """ + else : + sql_lre = '' + + if self.dlg.UICN.isChecked() == 1 : + sql_UICN = """ lrm IN ('VU','EN','RE','CR', 'EW', 'EX') """ + else : + sql_UICN = '' + + + if self.dlg.PATRIMONIALITE.isChecked() == 1 : + sql_patrimonialite = """"patrimonialite" IS NOT NULL """ + else : + sql_patrimonialite = '' + + if self.dlg.PATRI01.isChecked() == 1 : + sql_patri01 = """"patri01" IS NOT NULL """ + else : + sql_patri01 = '' + + if self.dlg.PATRI07.isChecked() == 1 : + sql_patri07 = """"patri07" IS NOT NULL """ + else : + sql_patri07 = '' + + if self.dlg.PATRI26.isChecked() == 1 : + sql_patri26 = """"patri26" IS NOT NULL """ + else : + sql_patri26 = '' + + if self.dlg.PATRI38.isChecked() == 1 : + sql_patri38 = """"patri38" IS NOT NULL """ + else : + sql_patri38 = '' + + if self.dlg.PATRI42.isChecked() == 1 : + sql_patri42 = """"patri42" IS NOT NULL """ + else : + sql_patri42 = '' + + if self.dlg.PATRI69.isChecked() == 1 : + sql_patri69 = """"patri69" IS NOT NULL """ + else : + sql_patri69 = '' + + if self.dlg.PATRI73.isChecked() == 1 : + sql_patri73 = """"patri73" IS NOT NULL """ + else : + sql_patri73 = '' + + if self.dlg.PATRI74.isChecked() == 1 : + sql_patri74 = """"patri74" IS NOT NULL """ + else : + sql_patri74 = '' + + + if self.dlg.ZNIEFF.isChecked() == 1 : + sql_znieff = """"znieff" IS NOT NULL """ + else : + sql_znieff = '' + + if self.dlg.DH_AnnII.isChecked() == 1 : + sql_dh_an2 = """"dh_an2" IS NOT NULL """ + else : + sql_dh_an2 = '' + + if self.dlg.PD_38.isChecked() == 1 : + sql_pd38 = """"pd38" IS NOT NULL """ + else : + sql_pd38 = '' + + if self.dlg.PD_42.isChecked() == 1 : + sql_pd42 = """"pd42" IS NOT NULL """ + else : + sql_pd42 = '' + + if self.dlg.PN.isChecked() == 1 : + sql_pn = """"pn" IS NOT NULL """ + else : + sql_pn = '' + + if self.dlg.PR.isChecked() == 1 : + sql_pr = """"pr" IS NOT NULL """ + else : + sql_pr = '' + + reqwhere_pat = sql_lrd01 + 'OR' + sql_lrd07 + 'OR' + sql_lrd26 + 'OR' + sql_lrd38 + 'OR' + sql_lrd42 + 'OR' + sql_lrd69 + 'OR' + sql_lrd73 + 'OR' + sql_lrd74 + 'OR' + sql_lre + 'OR' + sql_LRN_Flore + 'OR' + sql_LRN_Oiseaux + 'OR' + sql_LRN_Ortho + 'OR' + sql_LRN_Autre + 'OR' + sql_LRR_Flore + 'OR' + sql_LRR_Oiseaux + 'OR' + sql_LRR_Autre + 'OR' + sql_UICN + 'OR' + sql_pd38 + 'OR' + sql_pd42 + 'OR' + sql_pn + 'OR' + sql_pr + 'OR' + sql_dh_an2 + 'OR' + sql_patri01 + 'OR' + sql_patri07 + 'OR' + sql_patri26 + 'OR' + sql_patri38 + 'OR' + sql_patri42 + 'OR' + sql_patri69 + 'OR' + sql_patri73 + 'OR' + sql_patri74 + 'OR' + sql_patrimonialite + + while reqwhere_pat.find('OROR') != -1 : + reqwhere_pat = reqwhere_pat.replace('OROR','OR') + while reqwhere_pat[-2:] == 'OR' : + reqwhere_pat = reqwhere_pat[:-2] + while reqwhere_pat[:2] == 'OR' : + reqwhere_pat = reqwhere_pat[2:] + + # Requete geom + if self.dlg.bouton_geom.isChecked() == 1 : + + layer = self.iface.activeLayer() + if layer == None : + self.iface.messageBar().pushMessage(u"Vous devez sélectionner une table !", level=QgsMessageBar.WARNING, duration=5) + + else : + selection = layer.selectedFeatures() + if layer.selectedFeatureCount() == 1 : + for feature in selection: + geom = feature.geometry() + poly = geom.exportToWkt() + + buffer = self.dlg.buffer.text() + reqwhere_geom = " ST_intersects(geometrie,ST_Buffer(ST_geomFromText('" + poly + "',2154), " + buffer + " ))" + + # Requete finale + reqwhere_final = '(' + reqwhere_obs + ')' + 'AND' + reqwhere_insee + 'AND' + reqwhere_ordre + 'AND' + reqwhere_sp + 'AND' + '(' + reqwhere_pat + ')' + 'AND' + reqwhere_regne + 'AND' + reqwhere_date + 'AND' + reqwhere_geom + + # Nettoyage de la requete finale + while reqwhere_final.find('ANDAND') != -1 : + reqwhere_final = reqwhere_final.replace('ANDAND','AND') + while reqwhere_final.find('AND()AND') != -1 : + reqwhere_final = reqwhere_final.replace('AND()AND','AND') + while reqwhere_final[-3:] == 'AND' : + reqwhere_final = reqwhere_final[:-3] + while reqwhere_final[:5] == '()AND' : + reqwhere_final = reqwhere_final[5:] + while reqwhere_final[-5:] == 'AND()' : + reqwhere_final = reqwhere_final[:-5] + while reqwhere_final[:3] == 'AND' : + reqwhere_final = reqwhere_final[3:] + + ## Affichage des tables + table_name = 'observations' + + uri = QgsDataSourceURI() + uri.setConnection(host ,port ,dbname ,user ,password) + + if self.dlg.centroide.isChecked() == 1 : + ### Centroide + if reqwhere_final.find('()') != -1 : + reqwhere_final = '' + uri.setDataSource("_agregation_ra", "observations_centroide", "geometrie", reqwhere_final, "gid") + layer = self.iface.addVectorLayer(uri.uri(), table_name + '_centroides', "postgres") + + else : + con = psycopg2.connect("dbname="+ dbname + " user=" + user + " host=" + host + " password=" + password + " port=" + port) + cur = con.cursor() + + # Creation group de couches + i = qgis.utils.iface + legende = i.legendInterface() + nomgroupe = 'Observations' + groupe = legende.addGroup(nomgroupe,False) + + # Récupération de la liste de groupes + toc = qgis.utils.iface.legendInterface() + groups = toc.groups() + index = groups.index(nomgroupe) + + ### Polygone + reqwhere_final_poly = '(' + reqwhere_final + " AND GeometryType(geometrie) LIKE '%POLYGON%'" + ')' + if reqwhere_final_poly.find('()') != -1 : + reqwhere_final_poly = "(GeometryType(geometrie) LIKE '%POLYGON%')" + + SQL_count_poly = u"""SELECT DISTINCT count(gid) AS count FROM _agregation_ra.observations_table WHERE """ + reqwhere_final_poly + cur.execute(SQL_count_poly) + list_count_poly = cur.fetchall() + count_poly = list_count_poly[0][0] + + if count_poly != 0: + uri.setDataSource("_agregation_ra", "observations_table", "geometrie", reqwhere_final_poly, "gid") + layer_poly = self.iface.addVectorLayer(uri.uri(), table_name + '_poly', "postgres") + legende.moveLayer(layer_poly,index) + + ### Point + reqwhere_final_point = '(' + reqwhere_final + " AND GeometryType(geometrie) LIKE '%POINT%'" + ')' + if reqwhere_final_point.find('()') != -1 : + reqwhere_final_point = "(GeometryType(geometrie) LIKE '%POINT%')" + + SQL_count_point = u"""SELECT DISTINCT count(gid) AS count FROM _agregation_ra.observations_table WHERE """ + reqwhere_final_point + cur.execute(SQL_count_point) + list_count_point = cur.fetchall() + count_point = list_count_point[0][0] + + if count_point != 0: + uri.setDataSource("_agregation_ra", "observations_table", "geometrie", reqwhere_final_point, "gid") + layer_point = self.iface.addVectorLayer(uri.uri(), table_name + '_point', "postgres") + legende.moveLayer(layer_point,index) + + ### Ligne + reqwhere_final_ligne = '(' + reqwhere_final + " AND GeometryType(geometrie) LIKE '%LINE%'" + ')' + if reqwhere_final_ligne.find('()') != -1 : + reqwhere_final_ligne = "(GeometryType(geometrie) LIKE '%LINE%')" + + SQL_count_ligne = u"""SELECT DISTINCT count(gid) AS count FROM _agregation_ra.observations_table WHERE """ + reqwhere_final_ligne + cur.execute(SQL_count_ligne) + list_count_ligne = cur.fetchall() + count_ligne = list_count_ligne[0][0] + + if count_ligne != 0: + uri.setDataSource("_agregation_ra", "observations_table", "geometrie", reqwhere_final_ligne, "gid") + layer_ligne = self.iface.addVectorLayer(uri.uri(), table_name + '_ligne', "postgres") + legende.moveLayer(layer_ligne,index) + + # ajout des couches dans le groupe Observations + legende.setGroupExpanded (index, True) + + self.iface.messageBar().pushMessage(u"Extraction réussie : ", u" Pensez à renommer vos couches pour plus de lisibilité.", level=QgsMessageBar.INFO, duration=10) + + + elif layer.selectedFeatureCount() == 0 : + self.iface.messageBar().pushMessage(u"Vous devez sélectionner au moins un polygone !", level=QgsMessageBar.WARNING, duration=5) + reqwhere_geom = '' + + else : + self.iface.messageBar().pushMessage(u"Vous devez sélectionner qu'un seul polygone !", level=QgsMessageBar.WARNING, duration=5) + reqwhere_geom = '' + else : + # Requete finale + reqwhere_final = '(' + reqwhere_obs + ')' + 'AND' + reqwhere_insee + 'AND' + reqwhere_ordre + 'AND' + reqwhere_sp + 'AND' + '(' + reqwhere_pat + ')' + 'AND' + reqwhere_regne + 'AND' + reqwhere_date + + # Nettoyage de la requete finale + while reqwhere_final.find('ANDAND') != -1 : + reqwhere_final = reqwhere_final.replace('ANDAND','AND') + while reqwhere_final.find('AND()AND') != -1 : + reqwhere_final = reqwhere_final.replace('AND()AND','AND') + while reqwhere_final[-3:] == 'AND' : + reqwhere_final = reqwhere_final[:-3] + while reqwhere_final[:5] == '()AND' : + reqwhere_final = reqwhere_final[5:] + while reqwhere_final[-5:] == 'AND()' : + reqwhere_final = reqwhere_final[:-5] + while reqwhere_final[:3] == 'AND' : + reqwhere_final = reqwhere_final[3:] + + ## Affichage des tables + table_name = 'observations' + + uri = QgsDataSourceURI() + uri.setConnection(host ,port ,dbname ,user ,password) + + ## Centroide + if self.dlg.centroide.isChecked() == 1 : + if reqwhere_final.find('()') != -1 : + reqwhere_final = '' + uri.setDataSource("_agregation_ra", "observations_centroide", "geometrie", reqwhere_final, "gid") + layer = self.iface.addVectorLayer(uri.uri(), table_name + '_centroides', "postgres") + + else : + con = psycopg2.connect("dbname="+ dbname + " user=" + user + " host=" + host + " password=" + password + " port=" + port) + cur = con.cursor() + + # Creation group de couches + i = qgis.utils.iface + legende = i.legendInterface() + nomgroupe = 'Observations' + groupe = legende.addGroup(nomgroupe,False) + + # Récupération de la liste de groupes + toc = qgis.utils.iface.legendInterface() + groups = toc.groups() + index = groups.index(nomgroupe) + + ### Polygone + reqwhere_final_poly = '(' + reqwhere_final + " AND GeometryType(geometrie) LIKE '%POLYGON%'" + ')' + if reqwhere_final_poly.find('()') != -1 : + reqwhere_final_poly = "(GeometryType(geometrie) LIKE '%POLYGON%')" + + SQL_count_poly = u"""SELECT DISTINCT count(gid) AS count FROM _agregation_ra.observations_table WHERE """ + reqwhere_final_poly + cur.execute(SQL_count_poly) + list_count_poly = cur.fetchall() + count_poly = list_count_poly[0][0] + + if count_poly != 0: + uri.setDataSource("_agregation_ra", "observations_table", "geometrie", reqwhere_final_poly, "gid") + layer_poly = self.iface.addVectorLayer(uri.uri(), table_name + '_poly', "postgres") + legende.moveLayer(layer_poly,index) + + ### Point + reqwhere_final_point = '(' + reqwhere_final + " AND GeometryType(geometrie) LIKE '%POINT%'" + ')' + if reqwhere_final_point.find('()') != -1 : + reqwhere_final_point = "(GeometryType(geometrie) LIKE '%POINT%')" + + SQL_count_point = u"""SELECT DISTINCT count(gid) AS count FROM _agregation_ra.observations_table WHERE """ + reqwhere_final_point + cur.execute(SQL_count_point) + list_count_point = cur.fetchall() + count_point = list_count_point[0][0] + + if count_point != 0: + uri.setDataSource("_agregation_ra", "observations_table", "geometrie", reqwhere_final_point, "gid") + layer_point = self.iface.addVectorLayer(uri.uri(), table_name + '_point', "postgres") + legende.moveLayer(layer_point,index) + + ### Ligne + reqwhere_final_ligne = '(' + reqwhere_final + " AND GeometryType(geometrie) LIKE '%LINE%'" + ')' + if reqwhere_final_ligne.find('()') != -1 : + reqwhere_final_ligne = "(GeometryType(geometrie) LIKE '%LINE%')" + + SQL_count_ligne = u"""SELECT DISTINCT count(gid) AS count FROM _agregation_ra.observations_table WHERE """ + reqwhere_final_ligne + cur.execute(SQL_count_ligne) + list_count_ligne = cur.fetchall() + count_ligne = list_count_ligne[0][0] + + if count_ligne != 0: + uri.setDataSource("_agregation_ra", "observations_table", "geometrie", reqwhere_final_ligne, "gid") + layer_ligne = self.iface.addVectorLayer(uri.uri(), table_name + '_ligne', "postgres") + legende.moveLayer(layer_ligne,index) + + # ajout des couches dans le groupe Observations + legende.setGroupExpanded (index, True) + + self.iface.messageBar().pushMessage(u"Extraction réussie : ", u" Pensez à renommer vos couches pour plus de lisibilité.", level=QgsMessageBar.INFO, duration=10) + + pass + + def export(self): + + ### config.txt + config = "//100.100.100.100/bd_sig/z_QGIS/config.txt" # Chemin du fichier config + + # Fonction de lecture des lignes du fichier config + def readline(n): + with open(config, "r") as f: + for lineno, line in enumerate(f): + if lineno == n: + return line.strip() # Permet d'enlever les retours chariots + + # Recuperation des donnees + host = readline(10) + port = readline(12) + dbname = readline(14) + user = readline(16) + password = readline(18) + + layer = self.iface.activeLayer() + + if layer == None : + self.iface.messageBar().pushMessage(u"Vous devez sélectionner une table !", level=QgsMessageBar.WARNING, duration=5) + + else : + selection = layer.selectedFeatures() + if (layer.selectedFeatureCount() == 1) : + for feature in selection: + geom = feature.geometry() + poly = geom.exportToWkt() + + buffer = '100' + + con = psycopg2.connect("dbname="+ dbname + " user=" + user + " host=" + host + " password=" + password + " port=" + port) + cur = con.cursor() + + SQL_list_sp = u"""SELECT DISTINCT classe::text, ordre::text, nom_complet::text, nom_vern::text, max(date_obs)::text AS derniere_obs FROM _agregation_ra.observations_table WHERE ST_intersects(geometrie,ST_Buffer(ST_geomFromText('""" + poly + "',2154), " + buffer + " )) GROUP BY classe, ordre, nom_complet, nom_vern ORDER BY nom_vern""" + cur.execute(SQL_list_sp) + data_sp = cur.fetchall() + + chemin_fichier = QFileDialog.getSaveFileName(None, 'Enregistrer sous...', "C:\Users\\" + str(os.environ.get("USERNAME")) + '\Desktop\liste_sp.csv', "Fichiers CSV (*.csv)") + file = open(chemin_fichier, 'wb') + file.write(u'\ufeff'.encode('utf8')) # BOM (optionel...Permet a Excel d'ouvrir proprement le fichier en UTF-8) + writer = csv.writer(file, delimiter = ';') # délimiteur ';' pour faciliter l'ouverture avec Excel + writer.writerow(['Classe', 'Ordre', 'Nom Complet', 'Nom Vernaculaire', u'Date Derniere Observation']) # Création des entêtes + + for row in data_sp : # Boucle d'écriture ligne par ligne dans le csv + list_sp = [] + if row[0] == None : # Si la valeur est 'None' l'encodage ne peut se faire donc boucle d'évitement + row0 = str(row[0]) + row0 = '' + else : + row0 = row[0] + list_sp.append(row0.encode('utf-8')) + if row[1] == None : # Si la valeur est 'None' l'encodage ne peut se faire donc boucle d'évitement + row1 = str(row[1]) + row1 = '' + else : + row1 = row[1] + list_sp.append(row1.encode('utf-8')) + if row[2] == None : # Si la valeur est 'None' l'encodage ne peut se faire donc boucle d'évitement + row2 = str(row[2]) + row2 = '' + else : + row2 = row[2] + list_sp.append(row2.encode('utf-8')) + if row[3] == None : # Si la valeur est 'None' l'encodage ne peut se faire donc boucle d'évitement + row3 = str(row[3]) + row3 = '' + else : + row3 = row[3] + list_sp.append(row3.encode('utf-8')) + if row[4] == None : + row4 = str(row[4]) + row4 = '' + else : + row4 = row[4] + list_sp.append(row4.encode('utf-8')) + writer.writerow(list_sp) + + file.close() + self.iface.messageBar().pushMessage(u"Export réussi dans " + chemin_fichier , level=QgsMessageBar.INFO, duration=5) + + elif (layer.selectedFeatureCount() == 0) : + self.iface.messageBar().pushMessage(u"Vous devez sélectionner au moins un polygone !", level=QgsMessageBar.WARNING, duration=5) + + else : + self.iface.messageBar().pushMessage(u"Vous devez sélectionner qu'un seul polygone !", level=QgsMessageBar.WARNING, duration=5) \ No newline at end of file