কিউজিআইএস পরিমাপ সরঞ্জাম থেকে দূরত্ব প্রাপ্ত?


13

আমি একটি ইনপুট মাস্ক সহ স্প্যাটিয়ালাইট ডাটাবেস খাওয়ানোর জন্য একটি প্লাগইন তৈরি করেছি। দুটি ক্ষেত্র রয়েছে যা কোনও বস্তুর সর্বনিম্ন / সর্বোচ্চ মাত্রা উপস্থাপন করে।

এই মুহুর্তে আমি iface.actionMeasure().trigger()দুটি পুশ বোতাম "পরিমাপ" সহ পরিমাপ সরঞ্জামটি ( ) কল করি , মাত্রাটি ক্লিক করুন এবং আমার কীবোর্ডের সাথে ক্ষেত্রগুলিতে মানটি টাইপ করুন (কিউলাইনএডিট)।

সম্ভাবনা কি আছে যে আমি পরিমাপ সরঞ্জামের সাথে ডান ক্লিক করার পরে (পরিমাপ সমাপ্তি) করার পরে মানটি স্বয়ংক্রিয়ভাবে ক্ষেত্রের প্রতি প্রতিশ্রুতিবদ্ধ হবে (সর্বনিম্ন বা সর্বোচ্চ, কিউলাইনএডিট)?

  1. কল পরিমাপ সরঞ্জাম (এটি কাজ করে)
  2. বাম ক্লিক: পরিমাপ শুরু
  3. এবং 4. একবারে: রাইট ক্লিক করুন এবং সর্বনিম্ন ক্ষেত্রের (কিউলাইনএডিট) টিপে পরিমাপ সরঞ্জামের মোট মানটি প্রতিশ্রুতিবদ্ধ।

এখানে চিত্র বর্ণনা লিখুন

আপডেট 1:

এই প্রশ্নটি জিজ্ঞাসা করার একদিন পরে আমি একটি লাইনস্ট্রিং স্তর রাখার ধারণা পেয়েছি যা আমি একটি পরিমাপ সরঞ্জাম হিসাবে ব্যবহার করতে পারি (ST_Length (geom))। সুবিধাটি হ'ল এটি থেকে ডেটা ম্যানিপুলেট করার এবং প্রাপ্ত করার সম্পূর্ণ নিয়ন্ত্রণ আপনার কাছে থাকতে পারে। অসুবিধা হ'ল প্রকল্পের একটি অতিরিক্ত স্তর।

একটি কর্মপ্রবাহ হতে পারে:

  1. পরিমাপ ক্লিক করুন: টগল সম্পাদনা, "বৈশিষ্ট্য যুক্ত করুন" সক্রিয় করুন

  2. লাস্টারিং তৈরি করুন যা কোনও বস্তুর নূন্যতম মাত্রা উপস্থাপন করে

  3. পরিবর্তনগুলি নিশ্চিত করুন, লাস্টারিংয়ের দৈর্ঘ্য গণনা করুন (ST_Length (geom)), QLineEdit এর দৈর্ঘ্য কমিট করুন

  4. কথোপকথন বন্ধ করুন এবং লাইনস্ট্রিং সরান (ফর্ম থেকে মুছে ফেলুন)

তবে আমার আসল প্রশ্ন রয়ে গেছে। সরাসরি পরিমাপ সরঞ্জাম থেকে দূরত্বের মান পাওয়ার কোনও উপায় আছে কি?

আপডেট 2:

সাহায্যে যদি জাকব আমি পরিমাপ সরঞ্জামটি বন্ধ না করি ততক্ষণ পরিমাপের সামগ্রীর মোট মান সহ আমার কিউলাইনএডিট আপডেট করতে পারি। তারপরে মানটি '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 টেক্সট চেঞ্জড সিগন্যালে একটি স্লট সংযুক্ত করুন।

এই কোডটি আপনার যেতে হবে:

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 আপডেট করুন update

এখানে চিত্র বর্ণনা লিখুন

আসলে কোডটি ছোট করা যেতে পারে। উপরের লুপটি হ'ল কারণ আমি 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
চমৎকার উত্তর, আমি প্রোগ্রামার নই তবে আমি এই যুক্তিটি বুঝতে পারি। সাবাশ.
ম্যাপারজ

আমি সফলভাবে 'কিউলাইনএডিট'-এর সাথে' এডিটটোটাল 'মানটি সংযোগ করতে সক্ষম। তবে আমি যখন QgsMeasureBase ডায়ালগটি বন্ধ করি তখন মান (QLineEdit) 0 তে সেট করা থাকে আমি যখন ডায়ালগটি বন্ধ করি তখন কীভাবে আমি এড়াতে পারি?
স্টিফান

আমি যখন কিগসমিজারবেস ডায়ালগের সমস্ত বাচ্চাদের সাথে মুদ্রণ করব: 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। এটি "ক্লোজ করা থাকলে এডিটটোটাল মান রাখুন বা কিছুই না" বলার জন্য ব্যবহার করা যেতে পারে?
স্টিফান

সমস্যাটি হ'ল পাঠ্য বদলানো সিগন্যালটিকে প্রত্যাখ্যান করা সংকেতের আগে ডাকা হয়। আপনি এটি যোগ করে এটি পরীক্ষা করতে পারেন: বাটনবক্স = উইজেট_মিজার.ফাইন্ডচিল্ড (কিউডায়ালগবটনবক্স, 'বাটনবক্স') বাটনবক্স.রেজেক্টড কানেক্ট (বাটনবক্স_রেজেক্ট) শীর্ষে ফাংশন সহ: ডিফ বাটনবক্স_রেজেক্ট (): QgsMessageLog.logMessage ('প্রত্যাখ্যান', "পরীক্ষা")
Jakob

আপনি কি অ্যারেতে টেক্সট_জেঞ্জড স্লটে পরিমাপের দৈর্ঘ্য সংরক্ষণ করতে পারেন এবং তারপরে প্রত্যাখাত স্লটে আপনার গুইয়ের জন্য অ্যারেতে দ্বিতীয় শেষ প্রবেশকৃত মানটি বেছে নিতে পারেন।
Jakob
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.