Example #1
0
class openLand:
    def __init__(self, iface):
        self.iface = iface
        self.canvas = self.iface.mapCanvas()

        self.dlgFillAreaUpdate  = None
        self.dlgRoundCoords     = None
        self.dlgXml2Print       = None
        self.dlgFilterSet       = None
        self.dlgSettings        = None
        self.dlgAbout           = None
        self.dlgImportXML       = None
        self.dlgMP              = None

    def initGui(self):
        QObject.connect(self.iface, SIGNAL('currentLayerChanged(QgsMapLayer*)'), self.toggle)

        self.menu = QMenu()
        self.menu.setTitle(u"Кадастр")

        self.importMenu = QMenu()
        self.importMenu.setTitle(u"Импорт")
        self.openland_importobject = QAction(u"Импорт кадастровых объектов", self.iface.mainWindow())
        self.openland_importobject.setEnabled(False)
        self.openland_importobject.setIcon(QIcon(":/plugins/openland/icons/importkk.png"))
        self.openland_importgeometry = QAction(u"Импорт геометрии", self.iface.mainWindow())
        self.openland_importgeometry.setEnabled(False)
        self.openland_importgeometry.setIcon(QIcon(":/plugins/openland/icons/importgeomzu.png"))
        self.openland_importxml = QAction(u"Импорт XML", self.iface.mainWindow())
        self.openland_importxml.setEnabled(False)
        self.openland_importxml.setIcon(QIcon(":/plugins/openland/icons/import_xml.png"))
        self.importMenu.addActions([self.openland_importxml, self.openland_importgeometry, self.openland_importobject])
        self.menu.addMenu(self.importMenu)

        self.geometryMenu = QMenu()
        self.geometryMenu.setTitle(u"Геометрия")
        self.openland_roundcoords = QAction(u"Округлить координаты", self.iface.mainWindow())
        self.openland_roundcoords.setEnabled(False)
        self.openland_roundcoords.setIcon(QIcon(":/plugins/openland/icons/coord_round.png"))
        self.openland_scale2area = QAction(u"Масштабировать полигон", self.iface.mainWindow())
        self.openland_scale2area.setEnabled(False)
        self.openland_scale2area.setIcon(QIcon(":/plugins/openland/icons/scalearea.png"))
        self.geometryMenu.addActions([self.openland_roundcoords, self.openland_scale2area])
        self.menu.addMenu(self.geometryMenu)

        self.functionMenu = QMenu()
        self.functionMenu.setTitle(u"Функции")
        self.openland_createpoints = QAction(u"Создать точки и границы", self.iface.mainWindow())
        self.openland_createpoints.setEnabled(False)
        self.openland_createpoints.setIcon(QIcon(":/plugins/openland/icons/border.png"))
        self.openland_renumber = QAction(u"Изменить точки", self.iface.mainWindow())
        self.openland_renumber.setEnabled(False)
        self.openland_renumber.setIcon(QIcon(":/plugins/openland/icons/reorder.png"))
        self.openland_objects2pre = QAction(u"Прекратить существование выбранных объектов", self.iface.mainWindow())
        self.openland_objects2pre.setEnabled(False)
        self.openland_objects2pre.setIcon(QIcon(":/plugins/openland/icons/objects2pre.png"))
        self.openland_linkpoint2area = QAction(u"Указать принадлежность точек выбранному участку", self.iface.mainWindow())
        self.openland_linkpoint2area.setEnabled(False)
        self.openland_linkpoint2area.setIcon(QIcon(":/plugins/openland/icons/linkpoint2area.png"))
        self.openland_createborder = QAction(u"Создать границу по двум точкам", self.iface.mainWindow())
        self.openland_createborder.setEnabled(False)
        self.openland_createborder.setIcon(QIcon(":/plugins/openland/icons/create_border.png"))
        self.openland_createmulticontour = QAction(u"Создать многоконтурный", self.iface.mainWindow())
        self.openland_createmulticontour.setEnabled(False)
        self.openland_createmulticontour.setIcon(QIcon(":/plugins/openland/icons/combcontours.png"))
        self.openland_selectallcontours = QAction(u"Выбрать все контуры, входящие или ЧЗУ", self.iface.mainWindow())
        self.openland_selectallcontours.setEnabled(False)
        self.openland_selectallcontours.setIcon(QIcon(":/plugins/openland/icons/selectallcontours.png"))
        self.openland_fillareaupdate = QAction(u"Расчёт уточненных площадей контуров", self.iface.mainWindow())
        self.openland_fillareaupdate.setEnabled(False)
        self.openland_fillareaupdate.setIcon(QIcon(":/plugins/openland/icons/fillareaupdate.png"))
        self.functionMenu.addActions([self.openland_createpoints, self.openland_renumber, self.openland_objects2pre, self.openland_linkpoint2area, self.openland_createborder])
        self.functionMenu.addActions([self.openland_createmulticontour, self.openland_selectallcontours, self.openland_fillareaupdate])
        self.menu.addMenu(self.functionMenu)
        
        self.attributeMenu = QMenu()
        self.attributeMenu.setTitle(u"Атрибуты")
        self.openland_attribute = QAction(u"Атрибуты объекта", self.iface.mainWindow())
        self.openland_attribute.setEnabled(False)
        self.openland_attribute.setIcon(QIcon(":/plugins/openland/icons/attributes.png"))
        self.openland_mp = QAction(u"Межевой план", self.iface.mainWindow())
        self.openland_mp.setEnabled(False)
        self.openland_mp.setIcon(QIcon(":/plugins/openland/icons/mp.png"))
        self.attributeMenu.addActions([self.openland_attribute, self.openland_mp])
        self.menu.addMenu(self.attributeMenu)

        self.cadastreWorkMenu = QMenu()
        self.cadastreWorkMenu.setTitle(u"Кадастровые работы")
        self.openland_addpartorcontour = QAction(u"Добавить контур, входящий или ЧЗУ", self.iface.mainWindow())
        self.openland_addpartorcontour.setEnabled(False)
        self.openland_addpartorcontour.setIcon(QIcon(":/plugins/openland/icons/addcontour.png"))
        self.openland_unionparcels = QAction(u"Объединить участки", self.iface.mainWindow())
        self.openland_unionparcels.setEnabled(False)
        self.openland_unionparcels.setIcon(QIcon(":/plugins/openland/icons/unionparcels.png"))
        self.openland_splitparcel = QAction(u"Разделить участок", self.iface.mainWindow())
        self.openland_splitparcel.setEnabled(False)
        self.openland_splitparcel.setIcon(QIcon(":/plugins/openland/icons/splitparcel.png"))
        self.cadastreWorkMenu.addActions([self.openland_unionparcels, self.openland_addpartorcontour, self.openland_splitparcel])
        self.menu.addMenu(self.cadastreWorkMenu)

        self.beforeprintMenu = QMenu()
        self.beforeprintMenu.setTitle(u"Построения для печати")
        self.openland_geoshema = QAction(u"Схема геопостроений", self.iface.mainWindow())
        self.openland_geoshema.setEnabled(False)
        self.openland_geoshema.setIcon(QIcon(":/plugins/openland/icons/geoshema.png"))
        self.beforeprintMenu.addActions([self.openland_geoshema])
        self.menu.addMenu(self.beforeprintMenu)

        self.openland_xml2print = QAction(u"Документ для печати", self.iface.mainWindow() )
        self.openland_xml2print.setIcon(QIcon(":/plugins/openland/icons/print.png"))
        self.openland_xml2print.setEnabled(False)
        self.openland_filterset = QAction(u"Фильтр данных", self.iface.mainWindow() )
        self.openland_filterset.setIcon(QIcon(":/plugins/openland/icons/filter.png"))
        self.openland_filterset.setEnabled(False)
        self.openland_settings = QAction(u"Настройки", self.iface.mainWindow() )
        self.openland_settings.setIcon(QIcon(":/plugins/openland/icons/settings.png"))
        self.openland_settings.setEnabled(True)
        self.openland_about = QAction(u"О программе", self.iface.mainWindow() )
        self.openland_about.setIcon(QIcon(":/plugins/openland/icons/about.png"))
        self.menu.addActions([self.openland_xml2print, self.openland_filterset, self.openland_settings, self.openland_about])

        menu_bar = self.iface.mainWindow().menuBar()
        actions = menu_bar.actions()
        lastAction = actions[len( actions ) - 1]
        menu_bar.insertMenu(lastAction, self.menu)

        QObject.connect(self.openland_importxml, SIGNAL("triggered()"), self.doImportXML)
        QObject.connect(self.openland_importgeometry, SIGNAL("triggered()"), self.doImportGeometry)
        QObject.connect(self.openland_importobject, SIGNAL("triggered()"), self.doImportObject)
        QObject.connect(self.openland_roundcoords, SIGNAL("triggered()"), self.doRoundCoords)
        QObject.connect(self.openland_scale2area, SIGNAL("triggered()"), self.doScaleArea)
        QObject.connect(self.openland_createpoints, SIGNAL("triggered()"), self.doCreatePoints)
        QObject.connect(self.openland_renumber, SIGNAL("triggered()"), self.doReNumberPoints)
        QObject.connect(self.openland_objects2pre, SIGNAL("triggered()"), self.doObjects2Pre)
        QObject.connect(self.openland_linkpoint2area, SIGNAL("triggered()"), self.doLinkPoint)
        QObject.connect(self.openland_createborder, SIGNAL("triggered()"), self.doCreateBorder)
        QObject.connect(self.openland_geoshema, SIGNAL("triggered()"), self.doCreateGeoShema)
        QObject.connect(self.openland_createmulticontour, SIGNAL("triggered()"), self.doCreateMultiContour)
        QObject.connect(self.openland_selectallcontours, SIGNAL("triggered()"), self.doSelectAllContours)
        QObject.connect(self.openland_fillareaupdate, SIGNAL("triggered()"), self.doFillAreaUpdate)
        QObject.connect(self.openland_attribute, SIGNAL("triggered()"), self.doAttribute)
        QObject.connect(self.openland_mp, SIGNAL("triggered()"), self.doMp)
        QObject.connect(self.openland_addpartorcontour, SIGNAL("triggered()"), self.doAddPartOrContour)
        QObject.connect(self.openland_unionparcels, SIGNAL("triggered()"), self.doUnionParcels)
        QObject.connect(self.openland_splitparcel, SIGNAL("triggered()"), self.doSplitParcel)
        QObject.connect(self.openland_xml2print, SIGNAL("triggered()"), self.doXml2print)
        QObject.connect(self.openland_filterset, SIGNAL("triggered()"), self.doFilterSet)
        QObject.connect(self.openland_settings, SIGNAL("triggered()"), self.doSettings)
        QObject.connect(self.openland_about, SIGNAL("triggered()"), self.doAbout)

        self.toolBar = self.iface.addToolBar("openLand")
        self.toolBar.setObjectName("openLand")
        self.toolBar.addAction(self.openland_roundcoords)
        self.toolBar.addAction(self.openland_scale2area)
        self.toolBar.addSeparator()
        self.toolBar.addAction(self.openland_createpoints)
        self.toolBar.addAction(self.openland_renumber)
        self.toolBar.addAction(self.openland_objects2pre)
        self.toolBar.addAction(self.openland_linkpoint2area)
        self.toolBar.addAction(self.openland_createborder)
        self.toolBar.addAction(self.openland_createmulticontour)
        self.toolBar.addAction(self.openland_selectallcontours)
        self.toolBar.addAction(self.openland_fillareaupdate)
        self.toolBar.addSeparator()
        self.toolBar.addAction(self.openland_unionparcels)
        self.toolBar.addAction(self.openland_addpartorcontour)
        self.toolBar.addAction(self.openland_splitparcel)
        self.toolBar.addSeparator()
        self.toolBar.addAction(self.openland_attribute)
        self.toolBar.addAction(self.openland_mp)
        self.toolBar.addSeparator()
        self.toolBar.addAction(self.openland_geoshema)
        self.toolBar.addSeparator()
        self.toolBar.addAction(self.openland_filterset)

        self.updateProjectFromDefault()

    def doImportGeometry(self):
        d = importGeometry(self.iface)
        if d.toPrepare():
            d.exec_()
        del d

    def doImportObject(self):
        d = importObject(self.iface)
        if d.toPrepare():
            d.exec_()
        del d

    def doImportXML(self):
        if self.dlgImportXML == None:
            self.dlgImportXML = ImportXML(self.iface)
        self.dlgImportXML.toPrepare()
        self.dlgImportXML.show()

    def doXml2print(self):
        if self.dlgXml2Print == None: 
            self.dlgXml2Print = xml2Print(self.iface)
        self.dlgXml2Print.toPrepare(os.path.abspath(os.path.dirname(__file__)))
        self.dlgXml2Print.show()

    def doRoundCoords(self):
        if self.dlgRoundCoords == None:
            self.dlgRoundCoords = RoundCoords(self.iface)
        if self.dlgRoundCoords.toPrepare():
            self.dlgRoundCoords.show()

    def doScaleArea(self):
        d = olScale2Area(self.iface)
        if d.toPrepare():
            d.exec_()
        del d
            
    def doCreatePoints(self):
        d = createPoints(self.iface)
        if d.toPrepare():
            d.exec_()
        del d

    def doCreateGeoShema(self):
        d = createGeoShema(self.iface)
        if d.toPrepare():
            d.exec_()
        del d
        
    def doReNumberPoints(self):
        # noinspection PyUnresolvedReferences
        layer = get_vector_layer_by_name(gln['ln_uchastok'])
        selection = layer.selectedFeatures()
        ls = len(selection)
        if ls >= 1:
            d = reNumberPoints(self.iface)
            d.lineEditSelectedCount.setText(str(ls))
            d.lineEditDelta.setText(str(accuracyById(selection[0].id())))
            d.selectionUc = selection
            d.exec_()
            del d
        else:
            QMessageBox.warning(self.iface.mainWindow(), u"Ошибка выбора данных", 
                                                         u'Необходимо выбрать не менее одного ЗУ(ЧЗУ, контура) для изменения порядка точек.')

    def doObjects2Pre(self):
        d = objects2pre(self.iface)
        d.exec_()
        del d

    def doLinkPoint(self):
        layerUc = get_vector_layer_by_name(gln['ln_uchastok'])
        layerPn = get_vector_layer_by_name(gln['ln_tochka'])
        selectionUc = layerUc.selectedFeatures()
        if len(selectionUc) == 1:
            selectionPn = layerPn.selectedFeatures()
            if len(selectionPn) >= 1:
                geoma = QgsGeometry(selectionUc[0].geometry())
                idu = selectionUc[0].id()
                geomaPoints = allPointsPolygon(geoma)

                attributesAllPoint = {}
                for p in selectionPn:
                    idp = p.id()
                    geomp = QgsGeometry(p.geometry()).asPoint()
                    x = geomp.x()
                    y = geomp.y()
                    l4sort = []

                    for i in geomaPoints:
                        dl = sqrt((i[0] - x)**2 + (i[1] - y)**2);
                        l4sort.append([dl, i[0], i[1]])
    
                    l4sort.sort()
                    xNew = l4sort[0][1]
                    yNew = l4sort[0][2]
                    
                    attributesOnePoint = {}
                    attributesOnePoint[layerPn.fieldNameIndex('id_uchastok')] = idu
                    attributesOnePoint[layerPn.fieldNameIndex('x')] = xNew
                    attributesOnePoint[layerPn.fieldNameIndex('y')] = yNew
                    attributesOnePoint[layerPn.fieldNameIndex('pre')] = 0
                    attributesAllPoint[idp] = attributesOnePoint
                    del geomp

                layerPn.dataProvider().changeAttributeValues(attributesAllPoint)
                self.canvas.refresh()
                del geoma

            else:
                QMessageBox.warning(self.iface.mainWindow(), u"Ошибка выбора данных", 
                                                             u'Необходимо выбрать не менее одной точки.')
        else:
            QMessageBox.warning(self.iface.mainWindow(), u"Ошибка выбора данных", 
                                                         u'Необходимо предварительно выбрать только один участок.')
    
    def doCreateBorder(self):
        layerPn = get_vector_layer_by_name(gln['ln_tochka'])
        selection = layerPn.selectedFeatures()
        ls = len(selection)
        if ls == 2:
            feat = QgsFeature()
            layerBrd = get_vector_layer_by_name(gln['ln_granica'])

            row1 = selection[0].attributes()
            id1 = row1[layerPn.fieldNameIndex('id')]
            id_uchastok1 = row1[layerPn.fieldNameIndex('id_uchastok')]
            geom1 = QgsGeometry(selection[0].geometry())

            row2 = selection[1].attributes()
            id2 = row2[layerPn.fieldNameIndex('id')]
            id_uchastok2 = row2[layerPn.fieldNameIndex('id_uchastok')]
            geom2 = QgsGeometry(selection[1].geometry())

            if id_uchastok1 != id_uchastok2:
                QMessageBox.warning(self.iface.mainWindow(), u"Ошибка выбора данных", 
                                                             u'Выбранные точки не принадлежат одному участку.')
                return

            geomline = QgsGeometry.fromPolyline([geom1.asPoint(), geom2.asPoint()])
            if (geomline != None) and geomline.isGeosValid():               
                feat.setGeometry(geomline)
                feat.initAttributes(len(layerBrd.dataProvider().attributeIndexes()))
                feat.setAttribute(layerBrd.fieldNameIndex('id_uchastok'), id_uchastok1)
                feat.setAttribute(layerBrd.fieldNameIndex('id_msk'), idCurrentMSK())
                
                if layerBrd.dataProvider().addFeatures([feat])[0]:
                    self.canvas.refresh()
                else: 
                    QMessageBox.warning(self.iface.mainWindow(), u"Ошибка обработки данных", 
                                                                 u'Не удалось создать границу по выбранным точкам.')
            else:
                QMessageBox.warning(self.iface.mainWindow(), u"Ошибка обработки данных", 
                                                             u'Не удалось создать линейный объект по выбранным точкам.')
                return

            del geom1
            del geom2
            del feat
        else:
            QMessageBox.warning(self.iface.mainWindow(), u"Ошибка выбора данных", 
                                                         u'Необходимо выбрать только две точки для создания границы между ними.')

    def doCreateMultiContour(self):
        layerParcel = get_vector_layer_by_name(gln['ln_uchastok'])
        selection = layerParcel.selectedFeatures()
        ls = len(selection)
        if ls > 1:
            d = createMultiContour(self.iface)
            d.lineEditSelectedCount.setText(str(ls))
            d.selectionCount = ls
            d.exec_()
            del d
        else:
            QMessageBox.warning(self.iface.mainWindow(), u"Ошибка выбора данных", 
                                                         u'Необходимо выбрать не менее двух участков для объединения в многоконтурный участок.')

    def doUnionParcels(self):
        d = unionParcels(self.iface)
        if d.toPrepare():
            d.exec_()
        del d

    def doAddPartOrContour(self):
        d = addPartOrAddContour(self.iface)
        if d.toPrepare():
            d.exec_()
        del d

    def doSplitParcel(self):
        d = splitParcel(self.iface)
        if d.toPrepare():
            d.exec_()
        del d

    def doSelectAllContours(self):
        listSelectedParcelId = attributesFromSelection('ln_uchastok', ['id'])
        if len(listSelectedParcelId) == 1:
            idChild = int(listSelectedParcelId[0]['id'])
            idParent = idParentByIdChild(idChild)

            if idParent > 0:
                listIdParcel = listIdChildByIdParent(idParent)
                
                if len(listIdParcel) > 0:
                    if selectVectorObjectsById('ln_uchastok', listIdParcel):
                        self.canvas.zoomToSelected()

        else:
            QMessageBox.warning(self.iface.mainWindow(), u"Ошибка выбора данных", 
                                                         u'Необходимо выбрать только один участок(контур, часть) для автоматического выбора остальных контуров(частей).')

    def doFillAreaUpdate(self):
        layer = get_vector_layer_by_name(gln['ln_uchastok'])
        selection = layer.selectedFeatures()
        ls = len(selection)
        if ls >= 1:
            if self.dlgFillAreaUpdate == None:
                self.dlgFillAreaUpdate = fillAreaUpdate(self.iface)
            self.dlgFillAreaUpdate.lineEditSelectedCount.setText(str(ls))
            self.dlgFillAreaUpdate.selection = selection
            self.dlgFillAreaUpdate.selectionCount = ls
            self.dlgFillAreaUpdate.show()
        else:
            QMessageBox.warning(self.iface.mainWindow(), u"Ошибка выбора данных", 
                                                         u'Необходимо выбрать не менее одного контура для расчёта уточнённой площади.')
    
    def doAttribute(self):
        layer = self.iface.mainWindow().activeLayer()
        selection = layer.selectedFeatures()
        if len(selection) == 1:
            row = selection[0].attributes()
            
            # Атрибуты земельного участка
            if layer.name() == gln['ln_uchastok']: 
                d = uchAttributes(self.iface)
                d.idParcel = int(selection[0].id())
                d.geom = QgsGeometry(selection[0].geometry())
                d.sumArea = 0

                if paramByName([['interface/isEditMultiContour', 'bool']])[0]:
                    listParentId = attributesBySearchCondition('pb_parcel_parcel', 
                                   '\"id_children\"=' + str(d.idParcel), ['id_parent'])
                    if len(listParentId) == 1:
                        d.idParent = int(listParentId[0]['id_parent'])

                        if (d.idParent > 0):
                            d.layerUc.removeSelection() 
                            d.layerUc.select(d.idParent)
                            selection = d.layerUc.selectedFeatures()
                            d.idParcel = d.idParent
                            d.geom = QgsGeometry()
                            d.sumArea = calculatedArea(d.idParent)

                d.dlgFill()
                d.layerUc.removeSelection() 

            elif layer.name() == gln['ln_kvartal']: 
                d = kvrAttributes(self.iface)

            elif layer.name() == gln['ln_tochka']: 
                d = point(self.iface)
                d.idPoint = int(row[layer.fieldNameIndex('id')])
                d.idParcel = row[layer.fieldNameIndex('id_uchastok')]
                d.action = 'edit'
                d.dlgFill()

            elif layer.name() == gln['ln_granica']: 
                d = border(self.iface)
                d.idBorder = int(row[layer.fieldNameIndex('id')])
                d.dlgFill()

            else:
                QMessageBox.warning(self.iface.mainWindow(), u"Ошибка выбора данных", 
                                                             u'Необходимо выбрать объект на одном из перечисленных слоёв: \"Точка\", \"Граница\", \"Участок\", \"Квартал\"')
                return
            
            d.exec_()
            del d
            self.canvas.refresh()
        else:
            QMessageBox.warning(self.iface.mainWindow(), u"Ошибка выбора данных", 
                                                         u'Необходимо выбрать только один объект для работы с атрибутами.')
                    
    def doMp(self):
        if self.dlgMP == None:
            self.dlgMP = mpDialog(self.iface)
            self.dlgMP.fillTree()

        self.dlgMP.mpSelectionParcel()
        self.dlgMP.show()
    
    def doFilterSet(self):
        if self.dlgFilterSet == None:
            self.dlgFilterSet = filterSet(self.iface)

        self.dlgFilterSet.isUseDefaultConnection = self.dlgFilterSet.settings.value('database/isusedefault', False)
        self.dlgFilterSet.connectionUserName = self.dlgFilterSet.settings.value('database/user', u'openlanduser1')

        if (self.dlgFilterSet.isUseDefaultConnection) and (self.dlgFilterSet.connectionUserName > ' ') and (self.dlgFilterSet.connectionUserName != 'openlanduser1'):
            self.dlgFilterSet.checkBoxOnlyCurrentUser.setEnabled(True)

        else:
            self.dlgFilterSet.checkBoxOnlyCurrentUser.setEnabled(False)

        self.dlgFilterSet.show()

    def doSettings(self):
        if self.dlgSettings == None:
            self.dlgSettings = OpenLandSettings(self.iface)
        self.dlgSettings.paramsRead()
        self.dlgSettings.exec_()

        if self.dlgSettings.isChangeMSK:
            if not (self.dlgFilterSet == None):
                self.dlgFilterSet = None

    def doAbout(self):
        if self.dlgAbout == None:
            self.dlgAbout = OpenLandAbout(self.iface)

        dbInformation = []
        dbInformation = attributesBySearchCondition('cl_database_version', 'True', ['number_version', 'date_version'])

        if len(dbInformation) == 1:
            dbVersion = str(dbInformation[0]['number_version'])
            dbDate = dbInformation[0]['date_version'].toString(('yyyy-MM-dd'))
            self.dlgAbout.labelDbVersion.setText(u'Версия базы данных ' + dbVersion + u' от ' + dbDate)

        self.dlgAbout.lblVersion.setText(u'<html><head/><body><p>Версия ' +gv['versionPlugin']+ u' <span style=\" color:#008800; vertical-align:sub;\">бета</span> от ' +gv['datePlugin']+ u'</p></body></html>')
        self.dlgAbout.show()

    def updateProjectFromDefault(self):
        '''
        Обновление проекта QGIS, указанного в настройках
        на состав данных из проекта по умолчанию в составе модуля
        '''
        settings = QSettings("openLand", "openLand")

        isUseDefaultConnection = settings.value('database/isusedefault', False)
        pathIn = os.path.abspath(os.path.dirname(__file__) + '/projects')
        fileProject = pathIn + '/openLand.qgs'
        file4Update = settings.value('database/file4update', u'Не указан')

        if (isUseDefaultConnection) and (len(file4Update) > 5) and (file4Update != u'Не указан'):
            connectionServer = settings.value('database/server', u'localhost')
            connectionPort = settings.value('database/port', u'5432')
            connectionDataBase = settings.value('database/database', u'openland')
            connectionUserName = settings.value('database/user', u'openlanduser1')
            connectionUserPassword = settings.value('database/password', u'user1pass')

            isCreateNewProject = False
            newConnectionString = ''
            newLine = ''
            
            if (connectionServer > ' ') and (connectionPort > ' ') and (connectionDataBase > ' '):
                newConnectionString = "dbname=\'" +connectionDataBase+ "\' host=" +connectionServer+ " port=" +connectionPort
                
                if (connectionUserName > ' '):
                    newConnectionString = newConnectionString + " user=\'" +connectionUserName+ "\'"

                if (connectionUserPassword > ' '):
                    newConnectionString = newConnectionString + " password=\'" +connectionUserPassword+ "\'"
                 
                # newConnectionString = newConnectionString + " key="
                newConnectionString = newConnectionString + " sslmode=disable"
                # newConnectionString = unicode(newConnectionString)

                if (os.path.exists(file4Update)) and (os.path.getmtime(fileProject) <= os.path.getmtime(file4Update)):
                    fileTest = codecs.open(file4Update, 'r', 'utf-8')
                    testLine = fileTest.read()
                    testPosition = testLine.find(newConnectionString)

                    if (testPosition == -1):
                        isCreateNewProject = True
                    else:
                        isCreateNewProject = False

                    fileTest.close()

                else:
                    isCreateNewProject = True
                        
            if (isCreateNewProject) and (newConnectionString > 'dbname'):
                fileIn = codecs.open(fileProject, 'r', 'utf-8')

                for line in fileIn:
                    dbname = line.find('dbname')

                    if (dbname > 0):
                        newString = line.find(newConnectionString)

                        if (newString == -1):
                            #key = line.find('key=')
                            #if (key > 0):
                            #    newLine = newLine + line[:dbname] +newConnectionString+ line[key:]

                            sslmode = line.find('sslmode=disable')
                            if (sslmode > 0):
                                sslmode = sslmode + len('sslmode=disable')
                                newLine = newLine + line[:dbname] + newConnectionString + line[sslmode:]

                                isCreateNewProject = True

                            else:
                                isCreateNewProject = False

                        else:
                            isCreateNewProject = False

                    else:
                        newLine = newLine + line

                if isCreateNewProject:
                    try:
                        fileOut = codecs.open(file4Update, 'w', 'utf-8')
                    except:
                        QMessageBox.warning(self.iface.mainWindow(), u'Ошибка создания файла', 
                                                                     u'Невозможно создать обновляемый файл проекта ' + unicode(file4Update) + u'. Проверьте настройки модуля openLand.')
                    else:
                        fileOut.write(newLine)
                        fileOut.close()

                        shpFromDir = os.path.abspath(os.path.dirname(__file__) + '/projects/data')
                        shpToDir = os.path.dirname(os.path.abspath(fileOut.name))  + '/data'
                        if not os.path.isdir(shpToDir):
                            copyTree(shpFromDir, shpToDir)

                fileIn.close()
    
    def toggle(self):
        mc = self.canvas
        layer = mc.currentLayer()

        if layer != None:
            self.openland_xml2print.setEnabled(True)
            if (layer.type() == QgsMapLayer.VectorLayer) and (layer.geometryType() in [0, 1, 2]):
#               Выбран векторный слой
                selection = layer.selectedFeatures()
                if (layer.geometryType() == QGis.Polygon):
#                   Слой - полигон любой
                    self.openland_importobject.setEnabled(True)
                    self.openland_importgeometry.setEnabled(True)
                    self.openland_roundcoords.setEnabled(True)
                    self.openland_scale2area.setEnabled(True)
                    self.openland_geoshema.setEnabled(True)

                if (unicode(layer.name()) == gln['ln_uchastok']):
                    self.openland_attribute.setEnabled(True)
                    self.openland_mp.setEnabled(True)
                    self.openland_objects2pre.setEnabled(True)
                    self.openland_filterset.setEnabled(True)
                    self.openland_createpoints.setEnabled(True)
                    self.openland_renumber.setEnabled(True)
                    self.openland_createmulticontour.setEnabled(True)
                    self.openland_addpartorcontour.setEnabled(True)
                    self.openland_selectallcontours.setEnabled(True)
                    self.openland_fillareaupdate.setEnabled(True)
                    self.openland_importxml.setEnabled(True)
                    self.openland_linkpoint2area.setEnabled(True)
                    self.openland_createborder.setEnabled(False)
                    self.openland_unionparcels.setEnabled(True)
                    self.openland_splitparcel.setEnabled(True)

                elif (unicode(layer.name()) == gln['ln_tochka']):
                    self.openland_attribute.setEnabled(True)
                    self.openland_mp.setEnabled(False)
                    self.openland_objects2pre.setEnabled(True)
                    self.openland_linkpoint2area.setEnabled(True)
                    self.openland_createborder.setEnabled(True)
                    self.openland_filterset.setEnabled(False)
                    self.openland_createpoints.setEnabled(False)
                    self.openland_renumber.setEnabled(False)
                    self.openland_createmulticontour.setEnabled(False)
                    self.openland_addpartorcontour.setEnabled(False)
                    self.openland_selectallcontours.setEnabled(False)
                    self.openland_fillareaupdate.setEnabled(False)
                    self.openland_importxml.setEnabled(False)
                    self.openland_unionparcels.setEnabled(False)
                    self.openland_splitparcel.setEnabled(False)
                    
                elif (unicode(layer.name()) == gln['ln_granica']):
                    self.openland_attribute.setEnabled(True)
                    self.openland_mp.setEnabled(False)
                    self.openland_objects2pre.setEnabled(True)
                    self.openland_filterset.setEnabled(False)
                    self.openland_createpoints.setEnabled(False)
                    self.openland_renumber.setEnabled(False)
                    self.openland_linkpoint2area.setEnabled(False)
                    self.openland_createborder.setEnabled(False)
                    self.openland_createmulticontour.setEnabled(False)
                    self.openland_addpartorcontour.setEnabled(False)
                    self.openland_selectallcontours.setEnabled(False)
                    self.openland_fillareaupdate.setEnabled(False)
                    self.openland_importxml.setEnabled(False)
                    self.openland_unionparcels.setEnabled(False)
                    self.openland_splitparcel.setEnabled(True)

                elif (unicode(layer.name()) == gln['ln_kvartal']):
                    self.openland_attribute.setEnabled(True)
                    self.openland_mp.setEnabled(False)
                    self.openland_filterset.setEnabled(True)
                    self.openland_objects2pre.setEnabled(False)
                    self.openland_createpoints.setEnabled(False)
                    self.openland_renumber.setEnabled(False)
                    self.openland_linkpoint2area.setEnabled(False)
                    self.openland_createborder.setEnabled(False)
                    self.openland_createmulticontour.setEnabled(False)
                    self.openland_addpartorcontour.setEnabled(False)
                    self.openland_selectallcontours.setEnabled(False)
                    self.openland_fillareaupdate.setEnabled(False)
                    self.openland_importxml.setEnabled(False)
                    self.openland_unionparcels.setEnabled(False)
                    self.openland_splitparcel.setEnabled(False)

                else:
#                   НЕ [точка, граница, участок, квартал]
                    self.openland_attribute.setEnabled(False)
                    self.openland_mp.setEnabled(False)
                    self.openland_objects2pre.setEnabled(False)
                    self.openland_filterset.setEnabled(False)
                    self.openland_createpoints.setEnabled(False)
                    self.openland_renumber.setEnabled(False)
                    self.openland_linkpoint2area.setEnabled(False)
                    self.openland_createborder.setEnabled(False)
                    self.openland_createmulticontour.setEnabled(False)
                    self.openland_addpartorcontour.setEnabled(False)
                    self.openland_selectallcontours.setEnabled(False)
                    self.openland_fillareaupdate.setEnabled(False)
                    self.openland_importxml.setEnabled(False)
                    self.openland_unionparcels.setEnabled(False)
                    self.openland_splitparcel.setEnabled(False)

            else:
#               Выбран НЕ векторный слой
                self.openland_importobject.setEnabled(False)
                self.openland_importgeometry.setEnabled(False)
                self.openland_filterset.setEnabled(False)
                self.openland_roundcoords.setEnabled(False)
                self.openland_scale2area.setEnabled(False)
                self.openland_createpoints.setEnabled(False)
                self.openland_renumber.setEnabled(False)
                self.openland_objects2pre.setEnabled(False)
                self.openland_linkpoint2area.setEnabled(False)
                self.openland_createborder.setEnabled(False)
                self.openland_createmulticontour.setEnabled(False)
                self.openland_addpartorcontour.setEnabled(False)
                self.openland_selectallcontours.setEnabled(False)
                self.openland_fillareaupdate.setEnabled(False)
                self.openland_attribute.setEnabled(False)
                self.openland_mp.setEnabled(False)
                self.openland_unionparcels.setEnabled(False)
                self.openland_splitparcel.setEnabled(False)

        else:
#           Не выбран слой
            self.openland_filterset.setEnabled(False)
            self.openland_roundcoords.setEnabled(False)
            self.openland_scale2area.setEnabled(False)
            self.openland_createpoints.setEnabled(False)
            self.openland_renumber.setEnabled(False)
            self.openland_objects2pre.setEnabled(False)
            self.openland_linkpoint2area.setEnabled(False)
            self.openland_createborder.setEnabled(False)
            self.openland_geoshema.setEnabled(False)
            self.openland_createmulticontour.setEnabled(False)
            self.openland_addpartorcontour.setEnabled(False)
            self.openland_selectallcontours.setEnabled(False)
            self.openland_fillareaupdate.setEnabled(False)
            self.openland_attribute.setEnabled(False)
            self.openland_mp.setEnabled(False)
            self.openland_xml2print.setEnabled(False)
            self.openland_importxml.setEnabled(False)
            self.openland_importobject.setEnabled(False)
            self.openland_importgeometry.setEnabled(False)
            self.openland_unionparcels.setEnabled(False)
            self.openland_splitparcel.setEnabled(False)

    def unload(self):
        for every in self.menu.actions():
            del every

        del self.dlgFillAreaUpdate
        del self.dlgRoundCoords
        del self.dlgXml2Print
        del self.dlgFilterSet
        del self.dlgSettings
        del self.dlgAbout
        del self.dlgImportXML
        del self.dlgMP

        del self.toolBar
        del self.menu
Example #2
0
class openLand:
    def __init__(self, iface):
        self.iface = iface
        self.canvas = self.iface.mapCanvas()

        self.dlgFillAreaUpdate = None
        self.dlgRoundCoords = None
        self.dlgXml2Print = None
        self.dlgFilterSet = None
        self.dlgSettings = None
        self.dlgAbout = None
        self.dlgImportXML = None
        self.dlgMP = None

    def initGui(self):
        QObject.connect(self.iface,
                        SIGNAL('currentLayerChanged(QgsMapLayer*)'),
                        self.toggle)

        self.menu = QMenu()
        self.menu.setTitle(u"Кадастр")

        self.importMenu = QMenu()
        self.importMenu.setTitle(u"Импорт")
        self.openland_importobject = QAction(u"Импорт кадастровых объектов",
                                             self.iface.mainWindow())
        self.openland_importobject.setEnabled(False)
        self.openland_importobject.setIcon(
            QIcon(":/plugins/openland/icons/importkk.png"))
        self.openland_importgeometry = QAction(u"Импорт геометрии",
                                               self.iface.mainWindow())
        self.openland_importgeometry.setEnabled(False)
        self.openland_importgeometry.setIcon(
            QIcon(":/plugins/openland/icons/importgeomzu.png"))
        self.openland_importxml = QAction(u"Импорт XML",
                                          self.iface.mainWindow())
        self.openland_importxml.setEnabled(False)
        self.openland_importxml.setIcon(
            QIcon(":/plugins/openland/icons/import_xml.png"))
        self.importMenu.addActions([
            self.openland_importxml, self.openland_importgeometry,
            self.openland_importobject
        ])
        self.menu.addMenu(self.importMenu)

        self.geometryMenu = QMenu()
        self.geometryMenu.setTitle(u"Геометрия")
        self.openland_roundcoords = QAction(u"Округлить координаты",
                                            self.iface.mainWindow())
        self.openland_roundcoords.setEnabled(False)
        self.openland_roundcoords.setIcon(
            QIcon(":/plugins/openland/icons/coord_round.png"))
        self.openland_scale2area = QAction(u"Масштабировать полигон",
                                           self.iface.mainWindow())
        self.openland_scale2area.setEnabled(False)
        self.openland_scale2area.setIcon(
            QIcon(":/plugins/openland/icons/scalearea.png"))
        self.geometryMenu.addActions(
            [self.openland_roundcoords, self.openland_scale2area])
        self.menu.addMenu(self.geometryMenu)

        self.functionMenu = QMenu()
        self.functionMenu.setTitle(u"Функции")
        self.openland_createpoints = QAction(u"Создать точки и границы",
                                             self.iface.mainWindow())
        self.openland_createpoints.setEnabled(False)
        self.openland_createpoints.setIcon(
            QIcon(":/plugins/openland/icons/border.png"))
        self.openland_renumber = QAction(u"Изменить точки",
                                         self.iface.mainWindow())
        self.openland_renumber.setEnabled(False)
        self.openland_renumber.setIcon(
            QIcon(":/plugins/openland/icons/reorder.png"))
        self.openland_objects2pre = QAction(
            u"Прекратить существование выбранных объектов",
            self.iface.mainWindow())
        self.openland_objects2pre.setEnabled(False)
        self.openland_objects2pre.setIcon(
            QIcon(":/plugins/openland/icons/objects2pre.png"))
        self.openland_linkpoint2area = QAction(
            u"Указать принадлежность точек выбранному участку",
            self.iface.mainWindow())
        self.openland_linkpoint2area.setEnabled(False)
        self.openland_linkpoint2area.setIcon(
            QIcon(":/plugins/openland/icons/linkpoint2area.png"))
        self.openland_createborder = QAction(u"Создать границу по двум точкам",
                                             self.iface.mainWindow())
        self.openland_createborder.setEnabled(False)
        self.openland_createborder.setIcon(
            QIcon(":/plugins/openland/icons/create_border.png"))
        self.openland_createmulticontour = QAction(u"Создать многоконтурный",
                                                   self.iface.mainWindow())
        self.openland_createmulticontour.setEnabled(False)
        self.openland_createmulticontour.setIcon(
            QIcon(":/plugins/openland/icons/combcontours.png"))
        self.openland_selectallcontours = QAction(
            u"Выбрать все контуры, входящие или ЧЗУ", self.iface.mainWindow())
        self.openland_selectallcontours.setEnabled(False)
        self.openland_selectallcontours.setIcon(
            QIcon(":/plugins/openland/icons/selectallcontours.png"))
        self.openland_fillareaupdate = QAction(
            u"Расчёт уточненных площадей контуров", self.iface.mainWindow())
        self.openland_fillareaupdate.setEnabled(False)
        self.openland_fillareaupdate.setIcon(
            QIcon(":/plugins/openland/icons/fillareaupdate.png"))
        self.functionMenu.addActions([
            self.openland_createpoints, self.openland_renumber,
            self.openland_objects2pre, self.openland_linkpoint2area,
            self.openland_createborder
        ])
        self.functionMenu.addActions([
            self.openland_createmulticontour, self.openland_selectallcontours,
            self.openland_fillareaupdate
        ])
        self.menu.addMenu(self.functionMenu)

        self.attributeMenu = QMenu()
        self.attributeMenu.setTitle(u"Атрибуты")
        self.openland_attribute = QAction(u"Атрибуты объекта",
                                          self.iface.mainWindow())
        self.openland_attribute.setEnabled(False)
        self.openland_attribute.setIcon(
            QIcon(":/plugins/openland/icons/attributes.png"))
        self.openland_mp = QAction(u"Межевой план", self.iface.mainWindow())
        self.openland_mp.setEnabled(False)
        self.openland_mp.setIcon(QIcon(":/plugins/openland/icons/mp.png"))
        self.attributeMenu.addActions(
            [self.openland_attribute, self.openland_mp])
        self.menu.addMenu(self.attributeMenu)

        self.cadastreWorkMenu = QMenu()
        self.cadastreWorkMenu.setTitle(u"Кадастровые работы")
        self.openland_addpartorcontour = QAction(
            u"Добавить контур, входящий или ЧЗУ", self.iface.mainWindow())
        self.openland_addpartorcontour.setEnabled(False)
        self.openland_addpartorcontour.setIcon(
            QIcon(":/plugins/openland/icons/addcontour.png"))
        self.openland_unionparcels = QAction(u"Объединить участки",
                                             self.iface.mainWindow())
        self.openland_unionparcels.setEnabled(False)
        self.openland_unionparcels.setIcon(
            QIcon(":/plugins/openland/icons/unionparcels.png"))
        self.openland_splitparcel = QAction(u"Разделить участок",
                                            self.iface.mainWindow())
        self.openland_splitparcel.setEnabled(False)
        self.openland_splitparcel.setIcon(
            QIcon(":/plugins/openland/icons/splitparcel.png"))
        self.cadastreWorkMenu.addActions([
            self.openland_unionparcels, self.openland_addpartorcontour,
            self.openland_splitparcel
        ])
        self.menu.addMenu(self.cadastreWorkMenu)

        self.beforeprintMenu = QMenu()
        self.beforeprintMenu.setTitle(u"Построения для печати")
        self.openland_geoshema = QAction(u"Схема геопостроений",
                                         self.iface.mainWindow())
        self.openland_geoshema.setEnabled(False)
        self.openland_geoshema.setIcon(
            QIcon(":/plugins/openland/icons/geoshema.png"))
        self.beforeprintMenu.addActions([self.openland_geoshema])
        self.menu.addMenu(self.beforeprintMenu)

        self.openland_xml2print = QAction(u"Документ для печати",
                                          self.iface.mainWindow())
        self.openland_xml2print.setIcon(
            QIcon(":/plugins/openland/icons/print.png"))
        self.openland_xml2print.setEnabled(False)
        self.openland_filterset = QAction(u"Фильтр данных",
                                          self.iface.mainWindow())
        self.openland_filterset.setIcon(
            QIcon(":/plugins/openland/icons/filter.png"))
        self.openland_filterset.setEnabled(False)
        self.openland_settings = QAction(u"Настройки", self.iface.mainWindow())
        self.openland_settings.setIcon(
            QIcon(":/plugins/openland/icons/settings.png"))
        self.openland_settings.setEnabled(True)
        self.openland_about = QAction(u"О программе", self.iface.mainWindow())
        self.openland_about.setIcon(
            QIcon(":/plugins/openland/icons/about.png"))
        self.menu.addActions([
            self.openland_xml2print, self.openland_filterset,
            self.openland_settings, self.openland_about
        ])

        menu_bar = self.iface.mainWindow().menuBar()
        actions = menu_bar.actions()
        lastAction = actions[len(actions) - 1]
        menu_bar.insertMenu(lastAction, self.menu)

        QObject.connect(self.openland_importxml, SIGNAL("triggered()"),
                        self.doImportXML)
        QObject.connect(self.openland_importgeometry, SIGNAL("triggered()"),
                        self.doImportGeometry)
        QObject.connect(self.openland_importobject, SIGNAL("triggered()"),
                        self.doImportObject)
        QObject.connect(self.openland_roundcoords, SIGNAL("triggered()"),
                        self.doRoundCoords)
        QObject.connect(self.openland_scale2area, SIGNAL("triggered()"),
                        self.doScaleArea)
        QObject.connect(self.openland_createpoints, SIGNAL("triggered()"),
                        self.doCreatePoints)
        QObject.connect(self.openland_renumber, SIGNAL("triggered()"),
                        self.doReNumberPoints)
        QObject.connect(self.openland_objects2pre, SIGNAL("triggered()"),
                        self.doObjects2Pre)
        QObject.connect(self.openland_linkpoint2area, SIGNAL("triggered()"),
                        self.doLinkPoint)
        QObject.connect(self.openland_createborder, SIGNAL("triggered()"),
                        self.doCreateBorder)
        QObject.connect(self.openland_geoshema, SIGNAL("triggered()"),
                        self.doCreateGeoShema)
        QObject.connect(self.openland_createmulticontour,
                        SIGNAL("triggered()"), self.doCreateMultiContour)
        QObject.connect(self.openland_selectallcontours, SIGNAL("triggered()"),
                        self.doSelectAllContours)
        QObject.connect(self.openland_fillareaupdate, SIGNAL("triggered()"),
                        self.doFillAreaUpdate)
        QObject.connect(self.openland_attribute, SIGNAL("triggered()"),
                        self.doAttribute)
        QObject.connect(self.openland_mp, SIGNAL("triggered()"), self.doMp)
        QObject.connect(self.openland_addpartorcontour, SIGNAL("triggered()"),
                        self.doAddPartOrContour)
        QObject.connect(self.openland_unionparcels, SIGNAL("triggered()"),
                        self.doUnionParcels)
        QObject.connect(self.openland_splitparcel, SIGNAL("triggered()"),
                        self.doSplitParcel)
        QObject.connect(self.openland_xml2print, SIGNAL("triggered()"),
                        self.doXml2print)
        QObject.connect(self.openland_filterset, SIGNAL("triggered()"),
                        self.doFilterSet)
        QObject.connect(self.openland_settings, SIGNAL("triggered()"),
                        self.doSettings)
        QObject.connect(self.openland_about, SIGNAL("triggered()"),
                        self.doAbout)

        self.toolBar = self.iface.addToolBar("openLand")
        self.toolBar.setObjectName("openLand")
        self.toolBar.addAction(self.openland_roundcoords)
        self.toolBar.addAction(self.openland_scale2area)
        self.toolBar.addSeparator()
        self.toolBar.addAction(self.openland_createpoints)
        self.toolBar.addAction(self.openland_renumber)
        self.toolBar.addAction(self.openland_objects2pre)
        self.toolBar.addAction(self.openland_linkpoint2area)
        self.toolBar.addAction(self.openland_createborder)
        self.toolBar.addAction(self.openland_createmulticontour)
        self.toolBar.addAction(self.openland_selectallcontours)
        self.toolBar.addAction(self.openland_fillareaupdate)
        self.toolBar.addSeparator()
        self.toolBar.addAction(self.openland_unionparcels)
        self.toolBar.addAction(self.openland_addpartorcontour)
        self.toolBar.addAction(self.openland_splitparcel)
        self.toolBar.addSeparator()
        self.toolBar.addAction(self.openland_attribute)
        self.toolBar.addAction(self.openland_mp)
        self.toolBar.addSeparator()
        self.toolBar.addAction(self.openland_geoshema)
        self.toolBar.addSeparator()
        self.toolBar.addAction(self.openland_filterset)

        self.updateProjectFromDefault()

    def doImportGeometry(self):
        d = importGeometry(self.iface)
        if d.toPrepare():
            d.exec_()
        del d

    def doImportObject(self):
        d = importObject(self.iface)
        if d.toPrepare():
            d.exec_()
        del d

    def doImportXML(self):
        if self.dlgImportXML == None:
            self.dlgImportXML = ImportXML(self.iface)
        self.dlgImportXML.toPrepare()
        self.dlgImportXML.show()

    def doXml2print(self):
        if self.dlgXml2Print == None:
            self.dlgXml2Print = xml2Print(self.iface)
        self.dlgXml2Print.toPrepare(os.path.abspath(os.path.dirname(__file__)))
        self.dlgXml2Print.show()

    def doRoundCoords(self):
        if self.dlgRoundCoords == None:
            self.dlgRoundCoords = RoundCoords(self.iface)
        if self.dlgRoundCoords.toPrepare():
            self.dlgRoundCoords.show()

    def doScaleArea(self):
        d = olScale2Area(self.iface)
        if d.toPrepare():
            d.exec_()
        del d

    def doCreatePoints(self):
        d = createPoints(self.iface)
        if d.toPrepare():
            d.exec_()
        del d

    def doCreateGeoShema(self):
        d = createGeoShema(self.iface)
        if d.toPrepare():
            d.exec_()
        del d

    def doReNumberPoints(self):
        # noinspection PyUnresolvedReferences
        layer = get_vector_layer_by_name(gln['ln_uchastok'])
        selection = layer.selectedFeatures()
        ls = len(selection)
        if ls >= 1:
            d = reNumberPoints(self.iface)
            d.lineEditSelectedCount.setText(str(ls))
            d.lineEditDelta.setText(str(accuracyById(selection[0].id())))
            d.selectionUc = selection
            d.exec_()
            del d
        else:
            QMessageBox.warning(
                self.iface.mainWindow(), u"Ошибка выбора данных",
                u'Необходимо выбрать не менее одного ЗУ(ЧЗУ, контура) для изменения порядка точек.'
            )

    def doObjects2Pre(self):
        d = objects2pre(self.iface)
        d.exec_()
        del d

    def doLinkPoint(self):
        layerUc = get_vector_layer_by_name(gln['ln_uchastok'])
        layerPn = get_vector_layer_by_name(gln['ln_tochka'])
        selectionUc = layerUc.selectedFeatures()
        if len(selectionUc) == 1:
            selectionPn = layerPn.selectedFeatures()
            if len(selectionPn) >= 1:
                geoma = QgsGeometry(selectionUc[0].geometry())
                idu = selectionUc[0].id()
                geomaPoints = allPointsPolygon(geoma)

                attributesAllPoint = {}
                for p in selectionPn:
                    idp = p.id()
                    geomp = QgsGeometry(p.geometry()).asPoint()
                    x = geomp.x()
                    y = geomp.y()
                    l4sort = []

                    for i in geomaPoints:
                        dl = sqrt((i[0] - x)**2 + (i[1] - y)**2)
                        l4sort.append([dl, i[0], i[1]])

                    l4sort.sort()
                    xNew = l4sort[0][1]
                    yNew = l4sort[0][2]

                    attributesOnePoint = {}
                    attributesOnePoint[layerPn.fieldNameIndex(
                        'id_uchastok')] = idu
                    attributesOnePoint[layerPn.fieldNameIndex('x')] = xNew
                    attributesOnePoint[layerPn.fieldNameIndex('y')] = yNew
                    attributesOnePoint[layerPn.fieldNameIndex('pre')] = 0
                    attributesAllPoint[idp] = attributesOnePoint
                    del geomp

                layerPn.dataProvider().changeAttributeValues(
                    attributesAllPoint)
                self.canvas.refresh()
                del geoma

            else:
                QMessageBox.warning(
                    self.iface.mainWindow(), u"Ошибка выбора данных",
                    u'Необходимо выбрать не менее одной точки.')
        else:
            QMessageBox.warning(
                self.iface.mainWindow(), u"Ошибка выбора данных",
                u'Необходимо предварительно выбрать только один участок.')

    def doCreateBorder(self):
        layerPn = get_vector_layer_by_name(gln['ln_tochka'])
        selection = layerPn.selectedFeatures()
        ls = len(selection)
        if ls == 2:
            feat = QgsFeature()
            layerBrd = get_vector_layer_by_name(gln['ln_granica'])

            row1 = selection[0].attributes()
            id1 = row1[layerPn.fieldNameIndex('id')]
            id_uchastok1 = row1[layerPn.fieldNameIndex('id_uchastok')]
            geom1 = QgsGeometry(selection[0].geometry())

            row2 = selection[1].attributes()
            id2 = row2[layerPn.fieldNameIndex('id')]
            id_uchastok2 = row2[layerPn.fieldNameIndex('id_uchastok')]
            geom2 = QgsGeometry(selection[1].geometry())

            if id_uchastok1 != id_uchastok2:
                QMessageBox.warning(
                    self.iface.mainWindow(), u"Ошибка выбора данных",
                    u'Выбранные точки не принадлежат одному участку.')
                return

            geomline = QgsGeometry.fromPolyline(
                [geom1.asPoint(), geom2.asPoint()])
            if (geomline != None) and geomline.isGeosValid():
                feat.setGeometry(geomline)
                feat.initAttributes(
                    len(layerBrd.dataProvider().attributeIndexes()))
                feat.setAttribute(layerBrd.fieldNameIndex('id_uchastok'),
                                  id_uchastok1)
                feat.setAttribute(layerBrd.fieldNameIndex('id_msk'),
                                  idCurrentMSK())

                if layerBrd.dataProvider().addFeatures([feat])[0]:
                    self.canvas.refresh()
                else:
                    QMessageBox.warning(
                        self.iface.mainWindow(), u"Ошибка обработки данных",
                        u'Не удалось создать границу по выбранным точкам.')
            else:
                QMessageBox.warning(
                    self.iface.mainWindow(), u"Ошибка обработки данных",
                    u'Не удалось создать линейный объект по выбранным точкам.')
                return

            del geom1
            del geom2
            del feat
        else:
            QMessageBox.warning(
                self.iface.mainWindow(), u"Ошибка выбора данных",
                u'Необходимо выбрать только две точки для создания границы между ними.'
            )

    def doCreateMultiContour(self):
        layerParcel = get_vector_layer_by_name(gln['ln_uchastok'])
        selection = layerParcel.selectedFeatures()
        ls = len(selection)
        if ls > 1:
            d = createMultiContour(self.iface)
            d.lineEditSelectedCount.setText(str(ls))
            d.selectionCount = ls
            d.exec_()
            del d
        else:
            QMessageBox.warning(
                self.iface.mainWindow(), u"Ошибка выбора данных",
                u'Необходимо выбрать не менее двух участков для объединения в многоконтурный участок.'
            )

    def doUnionParcels(self):
        d = unionParcels(self.iface)
        if d.toPrepare():
            d.exec_()
        del d

    def doAddPartOrContour(self):
        d = addPartOrAddContour(self.iface)
        if d.toPrepare():
            d.exec_()
        del d

    def doSplitParcel(self):
        d = splitParcel(self.iface)
        if d.toPrepare():
            d.exec_()
        del d

    def doSelectAllContours(self):
        listSelectedParcelId = attributesFromSelection('ln_uchastok', ['id'])
        if len(listSelectedParcelId) == 1:
            idChild = int(listSelectedParcelId[0]['id'])
            idParent = idParentByIdChild(idChild)

            if idParent > 0:
                listIdParcel = listIdChildByIdParent(idParent)

                if len(listIdParcel) > 0:
                    if selectVectorObjectsById('ln_uchastok', listIdParcel):
                        self.canvas.zoomToSelected()

        else:
            QMessageBox.warning(
                self.iface.mainWindow(), u"Ошибка выбора данных",
                u'Необходимо выбрать только один участок(контур, часть) для автоматического выбора остальных контуров(частей).'
            )

    def doFillAreaUpdate(self):
        layer = get_vector_layer_by_name(gln['ln_uchastok'])
        selection = layer.selectedFeatures()
        ls = len(selection)
        if ls >= 1:
            if self.dlgFillAreaUpdate == None:
                self.dlgFillAreaUpdate = fillAreaUpdate(self.iface)
            self.dlgFillAreaUpdate.lineEditSelectedCount.setText(str(ls))
            self.dlgFillAreaUpdate.selection = selection
            self.dlgFillAreaUpdate.selectionCount = ls
            self.dlgFillAreaUpdate.show()
        else:
            QMessageBox.warning(
                self.iface.mainWindow(), u"Ошибка выбора данных",
                u'Необходимо выбрать не менее одного контура для расчёта уточнённой площади.'
            )

    def doAttribute(self):
        layer = self.iface.mainWindow().activeLayer()
        selection = layer.selectedFeatures()
        if len(selection) == 1:
            row = selection[0].attributes()

            # Атрибуты земельного участка
            if layer.name() == gln['ln_uchastok']:
                d = uchAttributes(self.iface)
                d.idParcel = int(selection[0].id())
                d.geom = QgsGeometry(selection[0].geometry())
                d.sumArea = 0

                if paramByName([['interface/isEditMultiContour', 'bool']])[0]:
                    listParentId = attributesBySearchCondition(
                        'pb_parcel_parcel',
                        '\"id_children\"=' + str(d.idParcel), ['id_parent'])
                    if len(listParentId) == 1:
                        d.idParent = int(listParentId[0]['id_parent'])

                        if (d.idParent > 0):
                            d.layerUc.removeSelection()
                            d.layerUc.select(d.idParent)
                            selection = d.layerUc.selectedFeatures()
                            d.idParcel = d.idParent
                            d.geom = QgsGeometry()
                            d.sumArea = calculatedArea(d.idParent)

                d.dlgFill()
                d.layerUc.removeSelection()

            elif layer.name() == gln['ln_kvartal']:
                d = kvrAttributes(self.iface)

            elif layer.name() == gln['ln_tochka']:
                d = point(self.iface)
                d.idPoint = int(row[layer.fieldNameIndex('id')])
                d.idParcel = row[layer.fieldNameIndex('id_uchastok')]
                d.action = 'edit'
                d.dlgFill()

            elif layer.name() == gln['ln_granica']:
                d = border(self.iface)
                d.idBorder = int(row[layer.fieldNameIndex('id')])
                d.dlgFill()

            else:
                QMessageBox.warning(
                    self.iface.mainWindow(), u"Ошибка выбора данных",
                    u'Необходимо выбрать объект на одном из перечисленных слоёв: \"Точка\", \"Граница\", \"Участок\", \"Квартал\"'
                )
                return

            d.exec_()
            del d
            self.canvas.refresh()
        else:
            QMessageBox.warning(
                self.iface.mainWindow(), u"Ошибка выбора данных",
                u'Необходимо выбрать только один объект для работы с атрибутами.'
            )

    def doMp(self):
        if self.dlgMP == None:
            self.dlgMP = mpDialog(self.iface)
            self.dlgMP.fillTree()

        self.dlgMP.mpSelectionParcel()
        self.dlgMP.show()

    def doFilterSet(self):
        if self.dlgFilterSet == None:
            self.dlgFilterSet = filterSet(self.iface)

        self.dlgFilterSet.isUseDefaultConnection = self.dlgFilterSet.settings.value(
            'database/isusedefault', False)
        self.dlgFilterSet.connectionUserName = self.dlgFilterSet.settings.value(
            'database/user', u'openlanduser1')

        if (self.dlgFilterSet.isUseDefaultConnection) and (
                self.dlgFilterSet.connectionUserName > ' ') and (
                    self.dlgFilterSet.connectionUserName != 'openlanduser1'):
            self.dlgFilterSet.checkBoxOnlyCurrentUser.setEnabled(True)

        else:
            self.dlgFilterSet.checkBoxOnlyCurrentUser.setEnabled(False)

        self.dlgFilterSet.show()

    def doSettings(self):
        if self.dlgSettings == None:
            self.dlgSettings = OpenLandSettings(self.iface)
        self.dlgSettings.paramsRead()
        self.dlgSettings.exec_()

        if self.dlgSettings.isChangeMSK:
            if not (self.dlgFilterSet == None):
                self.dlgFilterSet = None

    def doAbout(self):
        if self.dlgAbout == None:
            self.dlgAbout = OpenLandAbout(self.iface)

        dbInformation = []
        dbInformation = attributesBySearchCondition(
            'cl_database_version', 'True', ['number_version', 'date_version'])

        if len(dbInformation) == 1:
            dbVersion = str(dbInformation[0]['number_version'])
            dbDate = dbInformation[0]['date_version'].toString(('yyyy-MM-dd'))
            self.dlgAbout.labelDbVersion.setText(u'Версия базы данных ' +
                                                 dbVersion + u' от ' + dbDate)

        self.dlgAbout.lblVersion.setText(
            u'<html><head/><body><p>Версия ' + gv['versionPlugin'] +
            u' <span style=\" color:#008800; vertical-align:sub;\">бета</span> от '
            + gv['datePlugin'] + u'</p></body></html>')
        self.dlgAbout.show()

    def updateProjectFromDefault(self):
        '''
        Обновление проекта QGIS, указанного в настройках
        на состав данных из проекта по умолчанию в составе модуля
        '''
        settings = QSettings("openLand", "openLand")

        isUseDefaultConnection = settings.value('database/isusedefault', False)
        pathIn = os.path.abspath(os.path.dirname(__file__) + '/projects')
        fileProject = pathIn + '/openLand.qgs'
        file4Update = settings.value('database/file4update', u'Не указан')

        if (isUseDefaultConnection) and (len(file4Update) >
                                         5) and (file4Update != u'Не указан'):
            connectionServer = settings.value('database/server', u'localhost')
            connectionPort = settings.value('database/port', u'5432')
            connectionDataBase = settings.value('database/database',
                                                u'openland')
            connectionUserName = settings.value('database/user',
                                                u'openlanduser1')
            connectionUserPassword = settings.value('database/password',
                                                    u'user1pass')

            isCreateNewProject = False
            newConnectionString = ''
            newLine = ''

            if (connectionServer > ' ') and (connectionPort > ' ') and (
                    connectionDataBase > ' '):
                newConnectionString = "dbname=\'" + connectionDataBase + "\' host=" + connectionServer + " port=" + connectionPort

                if (connectionUserName > ' '):
                    newConnectionString = newConnectionString + " user=\'" + connectionUserName + "\'"

                if (connectionUserPassword > ' '):
                    newConnectionString = newConnectionString + " password=\'" + connectionUserPassword + "\'"

                # newConnectionString = newConnectionString + " key="
                newConnectionString = newConnectionString + " sslmode=disable"
                # newConnectionString = unicode(newConnectionString)

                if (os.path.exists(file4Update)) and (
                        os.path.getmtime(fileProject) <=
                        os.path.getmtime(file4Update)):
                    fileTest = codecs.open(file4Update, 'r', 'utf-8')
                    testLine = fileTest.read()
                    testPosition = testLine.find(newConnectionString)

                    if (testPosition == -1):
                        isCreateNewProject = True
                    else:
                        isCreateNewProject = False

                    fileTest.close()

                else:
                    isCreateNewProject = True

            if (isCreateNewProject) and (newConnectionString > 'dbname'):
                fileIn = codecs.open(fileProject, 'r', 'utf-8')

                for line in fileIn:
                    dbname = line.find('dbname')

                    if (dbname > 0):
                        newString = line.find(newConnectionString)

                        if (newString == -1):
                            #key = line.find('key=')
                            #if (key > 0):
                            #    newLine = newLine + line[:dbname] +newConnectionString+ line[key:]

                            sslmode = line.find('sslmode=disable')
                            if (sslmode > 0):
                                sslmode = sslmode + len('sslmode=disable')
                                newLine = newLine + line[:
                                                         dbname] + newConnectionString + line[
                                                             sslmode:]

                                isCreateNewProject = True

                            else:
                                isCreateNewProject = False

                        else:
                            isCreateNewProject = False

                    else:
                        newLine = newLine + line

                if isCreateNewProject:
                    try:
                        fileOut = codecs.open(file4Update, 'w', 'utf-8')
                    except:
                        QMessageBox.warning(
                            self.iface.mainWindow(), u'Ошибка создания файла',
                            u'Невозможно создать обновляемый файл проекта ' +
                            unicode(file4Update) +
                            u'. Проверьте настройки модуля openLand.')
                    else:
                        fileOut.write(newLine)
                        fileOut.close()

                        shpFromDir = os.path.abspath(
                            os.path.dirname(__file__) + '/projects/data')
                        shpToDir = os.path.dirname(
                            os.path.abspath(fileOut.name)) + '/data'
                        if not os.path.isdir(shpToDir):
                            copyTree(shpFromDir, shpToDir)

                fileIn.close()

    def toggle(self):
        mc = self.canvas
        layer = mc.currentLayer()

        if layer != None:
            self.openland_xml2print.setEnabled(True)
            if (layer.type()
                    == QgsMapLayer.VectorLayer) and (layer.geometryType()
                                                     in [0, 1, 2]):
                #               Выбран векторный слой
                selection = layer.selectedFeatures()
                if (layer.geometryType() == QGis.Polygon):
                    #                   Слой - полигон любой
                    self.openland_importobject.setEnabled(True)
                    self.openland_importgeometry.setEnabled(True)
                    self.openland_roundcoords.setEnabled(True)
                    self.openland_scale2area.setEnabled(True)
                    self.openland_geoshema.setEnabled(True)

                if (unicode(layer.name()) == gln['ln_uchastok']):
                    self.openland_attribute.setEnabled(True)
                    self.openland_mp.setEnabled(True)
                    self.openland_objects2pre.setEnabled(True)
                    self.openland_filterset.setEnabled(True)
                    self.openland_createpoints.setEnabled(True)
                    self.openland_renumber.setEnabled(True)
                    self.openland_createmulticontour.setEnabled(True)
                    self.openland_addpartorcontour.setEnabled(True)
                    self.openland_selectallcontours.setEnabled(True)
                    self.openland_fillareaupdate.setEnabled(True)
                    self.openland_importxml.setEnabled(True)
                    self.openland_linkpoint2area.setEnabled(True)
                    self.openland_createborder.setEnabled(False)
                    self.openland_unionparcels.setEnabled(True)
                    self.openland_splitparcel.setEnabled(True)

                elif (unicode(layer.name()) == gln['ln_tochka']):
                    self.openland_attribute.setEnabled(True)
                    self.openland_mp.setEnabled(False)
                    self.openland_objects2pre.setEnabled(True)
                    self.openland_linkpoint2area.setEnabled(True)
                    self.openland_createborder.setEnabled(True)
                    self.openland_filterset.setEnabled(False)
                    self.openland_createpoints.setEnabled(False)
                    self.openland_renumber.setEnabled(False)
                    self.openland_createmulticontour.setEnabled(False)
                    self.openland_addpartorcontour.setEnabled(False)
                    self.openland_selectallcontours.setEnabled(False)
                    self.openland_fillareaupdate.setEnabled(False)
                    self.openland_importxml.setEnabled(False)
                    self.openland_unionparcels.setEnabled(False)
                    self.openland_splitparcel.setEnabled(False)

                elif (unicode(layer.name()) == gln['ln_granica']):
                    self.openland_attribute.setEnabled(True)
                    self.openland_mp.setEnabled(False)
                    self.openland_objects2pre.setEnabled(True)
                    self.openland_filterset.setEnabled(False)
                    self.openland_createpoints.setEnabled(False)
                    self.openland_renumber.setEnabled(False)
                    self.openland_linkpoint2area.setEnabled(False)
                    self.openland_createborder.setEnabled(False)
                    self.openland_createmulticontour.setEnabled(False)
                    self.openland_addpartorcontour.setEnabled(False)
                    self.openland_selectallcontours.setEnabled(False)
                    self.openland_fillareaupdate.setEnabled(False)
                    self.openland_importxml.setEnabled(False)
                    self.openland_unionparcels.setEnabled(False)
                    self.openland_splitparcel.setEnabled(True)

                elif (unicode(layer.name()) == gln['ln_kvartal']):
                    self.openland_attribute.setEnabled(True)
                    self.openland_mp.setEnabled(False)
                    self.openland_filterset.setEnabled(True)
                    self.openland_objects2pre.setEnabled(False)
                    self.openland_createpoints.setEnabled(False)
                    self.openland_renumber.setEnabled(False)
                    self.openland_linkpoint2area.setEnabled(False)
                    self.openland_createborder.setEnabled(False)
                    self.openland_createmulticontour.setEnabled(False)
                    self.openland_addpartorcontour.setEnabled(False)
                    self.openland_selectallcontours.setEnabled(False)
                    self.openland_fillareaupdate.setEnabled(False)
                    self.openland_importxml.setEnabled(False)
                    self.openland_unionparcels.setEnabled(False)
                    self.openland_splitparcel.setEnabled(False)

                else:
                    #                   НЕ [точка, граница, участок, квартал]
                    self.openland_attribute.setEnabled(False)
                    self.openland_mp.setEnabled(False)
                    self.openland_objects2pre.setEnabled(False)
                    self.openland_filterset.setEnabled(False)
                    self.openland_createpoints.setEnabled(False)
                    self.openland_renumber.setEnabled(False)
                    self.openland_linkpoint2area.setEnabled(False)
                    self.openland_createborder.setEnabled(False)
                    self.openland_createmulticontour.setEnabled(False)
                    self.openland_addpartorcontour.setEnabled(False)
                    self.openland_selectallcontours.setEnabled(False)
                    self.openland_fillareaupdate.setEnabled(False)
                    self.openland_importxml.setEnabled(False)
                    self.openland_unionparcels.setEnabled(False)
                    self.openland_splitparcel.setEnabled(False)

            else:
                #               Выбран НЕ векторный слой
                self.openland_importobject.setEnabled(False)
                self.openland_importgeometry.setEnabled(False)
                self.openland_filterset.setEnabled(False)
                self.openland_roundcoords.setEnabled(False)
                self.openland_scale2area.setEnabled(False)
                self.openland_createpoints.setEnabled(False)
                self.openland_renumber.setEnabled(False)
                self.openland_objects2pre.setEnabled(False)
                self.openland_linkpoint2area.setEnabled(False)
                self.openland_createborder.setEnabled(False)
                self.openland_createmulticontour.setEnabled(False)
                self.openland_addpartorcontour.setEnabled(False)
                self.openland_selectallcontours.setEnabled(False)
                self.openland_fillareaupdate.setEnabled(False)
                self.openland_attribute.setEnabled(False)
                self.openland_mp.setEnabled(False)
                self.openland_unionparcels.setEnabled(False)
                self.openland_splitparcel.setEnabled(False)

        else:
            #           Не выбран слой
            self.openland_filterset.setEnabled(False)
            self.openland_roundcoords.setEnabled(False)
            self.openland_scale2area.setEnabled(False)
            self.openland_createpoints.setEnabled(False)
            self.openland_renumber.setEnabled(False)
            self.openland_objects2pre.setEnabled(False)
            self.openland_linkpoint2area.setEnabled(False)
            self.openland_createborder.setEnabled(False)
            self.openland_geoshema.setEnabled(False)
            self.openland_createmulticontour.setEnabled(False)
            self.openland_addpartorcontour.setEnabled(False)
            self.openland_selectallcontours.setEnabled(False)
            self.openland_fillareaupdate.setEnabled(False)
            self.openland_attribute.setEnabled(False)
            self.openland_mp.setEnabled(False)
            self.openland_xml2print.setEnabled(False)
            self.openland_importxml.setEnabled(False)
            self.openland_importobject.setEnabled(False)
            self.openland_importgeometry.setEnabled(False)
            self.openland_unionparcels.setEnabled(False)
            self.openland_splitparcel.setEnabled(False)

    def unload(self):
        for every in self.menu.actions():
            del every

        del self.dlgFillAreaUpdate
        del self.dlgRoundCoords
        del self.dlgXml2Print
        del self.dlgFilterSet
        del self.dlgSettings
        del self.dlgAbout
        del self.dlgImportXML
        del self.dlgMP

        del self.toolBar
        del self.menu
Example #3
0
 def doRoundCoords(self):
     if self.dlgRoundCoords == None:
         self.dlgRoundCoords = RoundCoords(self.iface)
     if self.dlgRoundCoords.toPrepare():
         self.dlgRoundCoords.show()
Example #4
0
 def doRoundCoords(self):
     if self.dlgRoundCoords == None:
         self.dlgRoundCoords = RoundCoords(self.iface)
     if self.dlgRoundCoords.toPrepare():
         self.dlgRoundCoords.show()