QGIS माप उपकरण से दूरी प्राप्त करना?


13

मैंने एक इनपुट मास्क के साथ स्पैटियलाइट डेटाबेस को खिलाने के लिए एक प्लगइन बनाया है। दो क्षेत्र हैं जो किसी वस्तु के न्यूनतम / अधिकतम आयाम का प्रतिनिधित्व करते हैं।

पल में मैं iface.actionMeasure().trigger()दो पुश बटन "उपाय" के साथ माप उपकरण ( ) को कॉल करता हूं , आयाम पर क्लिक करें और अपने कीबोर्ड के साथ मूल्य को फ़ील्ड्स (QLineEdit) में टाइप करें।

क्या इस बात की संभावना है कि जब मैं माप उपकरण के साथ सही क्लिक (समाप्त माप) करता हूं तो मूल्य स्वचालित रूप से फ़ील्ड (न्यूनतम या अधिकतम, QLineEdit) के लिए प्रतिबद्ध होगा?

  1. कॉल माप उपकरण (यह काम करता है)
  2. बायाँ-क्लिक: माप शुरू करें
  3. और 4. एक बार में: राइट क्लिक करें और कम से कम करने के लिए उपाय उपकरण का कुल मूल्य न्यूनतम फ़ील्ड (QLineEdit)।

यहाँ छवि विवरण दर्ज करें

अद्यतन 1:

इस सवाल को पूछने के एक दिन बाद मुझे एक लाइनरिंग परत रखने का विचार मिला है जिसे मैं एक माप उपकरण (ST_Length (जियोम)) के रूप में उपयोग कर सकता हूं। लाभ यह है कि आप डेटा से छेड़छाड़ और उसे प्राप्त करने का पूरा नियंत्रण रख सकते हैं। एक नुकसान परियोजना में एक अतिरिक्त परत है।

एक वर्कफ़्लो हो सकता है:

  1. माप पर क्लिक करें: संपादन टॉगल करें, "सुविधा जोड़ें" को सक्रिय करें

  2. एक वस्तु के न्यूनतम आयाम का प्रतिनिधित्व करने वाली लिनेस्ट्रिंग बनाएँ

  3. परिवर्तनों की पुष्टि करें, linestring की लंबाई की गणना करें (ST_Length (geom)), QLineEdit की लंबाई

  4. डायलॉग बंद करें और लिनेस्ट्रिंग को हटा दें (DELETE FROM)

लेकिन मेरा वास्तविक सवाल बना हुआ है। क्या माप उपकरण से सीधे दूरी मान प्राप्त करने का कोई तरीका है?

अपडेट 2:

मदद से अगर जैकब मैं माप उपकरण के कुल मूल्य के साथ अपने QLineEdit को अपडेट कर सकता हूं, जब तक मैं माप उपकरण बंद नहीं करता। फिर मान को '0,000 मीटर' पर सेट किया जाता है। मैंने इसका उपयोग करके इस समस्या को हल किया:

def text_changed(str_measure):
    if str_measure == '0,000 m':
        pass
    else:
        self.min.setText(str_measure)

यह काम करता है, लेकिन मुझे नहीं पता कि यह एक उचित समाधान है।

जवाबों:


10
  1. QgsMeasureBase विजेट ढूंढें
  2. विजेट में कुल मूल्य के साथ QLineEdit का पता लगाएं
  3. एक स्लॉट को QLineEdit textChanged सिग्नल से कनेक्ट करें।

यह कोड आपको जाना चाहिए:

def text_changed(str_measure):
        QgsMessageLog.logMessage(str_measure, "test")

from qgis.core import QgsMessageLog
from PyQt4.QtGui import QApplication, QLineEdit
from PyQt4.QtCore import pyqtSignal

QgsMessageLog.logMessage("start", "test")

for w in QApplication.instance().allWidgets():
    name = w.objectName()
    if name == 'QgsMeasureBase':
        QgsMessageLog.logMessage(name, "test")

        lineedit = w.findChild(QLineEdit, 'editTotal')
        QgsMessageLog.logMessage('Text: {}'.format(lineedit.text()),'test')

        #{object}.{signal}.connect({slot})
        lineedit.textChanged.connect(text_changed) 
        break

QgsMessageLog.logMessage("stop", "test")
QgsMessageLog.logMessage("", "test")

डेमो के लिए मापा मूल्यों को टेस्ट नामक टैब में लॉग संदेश पैनल में लिखा जाता है। इसके बजाय आप मिनट और अधिकतम QLineEdit अद्यतन करते हैं।

यहाँ छवि विवरण दर्ज करें

वास्तव में कोड को छोटा किया जा सकता है। उपरोक्त लूप के लिए क्योंकि मुझे QgsMeasureBase विजेट के नाम के बारे में नहीं पता था, और पाठ 'माप' के लिए सभी विजेट्स पर एक नज़र डालनी थी।

def text_changed(str_measure):
    QgsMessageLog.logMessage(str_measure, "test")

from qgis.core import QgsMessageLog
from PyQt4.QtGui import QApplication, QLineEdit
from PyQt4.QtCore import pyqtSignal

QgsMessageLog.logMessage("---start---", "test")

widget_measure = [w for w in QApplication.instance().allWidgets() if w.objectName() == 'QgsMeasureBase'][0]
lineedit = widget_measure.findChild(QLineEdit, 'editTotal')
lineedit.textChanged.connect(text_changed) 

QgsMessageLog.logMessage('Text: {}'.format(lineedit.text()),'test')

QgsMessageLog.logMessage("---stop---", "test")

1
अच्छा उत्तर, मैं एक प्रोग्रामर नहीं हूं लेकिन मैं इस तर्क को समझता हूं। बहुत बढ़िया।
Mapperz

मैं सफलतापूर्वक अपने QLineEdit में 'editTotal' मान कनेक्ट करने में सक्षम हूं। लेकिन जब मैं QgsMeasureBase डायलॉग को बंद कर देता हूं तो मान (QLineEdit) 0. पर सेट हो जाता है। डायलॉग बंद करने पर मैं इससे कैसे बच सकता हूं?
स्टीफन

जब मैं QgsMeasureBase संवाद के सभी बच्चों को प्रिंट करता हूं: widget_measure = [w for w in QApplication.instance().allWidgets() if w.objectName() == 'QgsMeasureBase'][0]तब for i in widget_measure.children(): print i.objectName(), विजेट 'बटनबॉक्स' होता है, जो मुझे लगता है कि बटन को हटा देता है QDialogButtonBox.Close। क्या यह कहने के लिए इस्तेमाल किया जा सकता है कि "अगर क्लिक किया जाता है तो editTotal मान रखें या कुछ न करें"?
स्टीफन

समस्या यह है कि टेक्स्टचेंज्ड सिग्नल को रिजेक्ट सिग्नल से पहले कहा जाता है। आप इसे जोड़कर परीक्षण कर सकते हैं: बटनबॉक्स = widget_measure.findChild (QDialogButtonBox, 'buttonBox') buttonbox.rejected.connect (buttonbox_rejected) फ़ंक्शन के साथ शीर्ष में: defbox_rejected (): QgsMessageLog.logMessage ('अस्वीकृत', "परीक्षण")
जैकब

क्या आप एक सरणी में text_changed स्लॉट में माप लंबाई स्टोर कर सकते हैं और फिर अस्वीकार स्लॉट पर आप के लिए सरणी में दूसरा अंतिम दर्ज मूल्य चुनें।
जैकब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.