#JuliNgeblog Der zweite Tag : Delegate Mouse Event Signal on QLabel

Selamat datang kembali!

Tulisan hari kedua sudah mulai masuk ke topik yang teknis. Persoalannya adalah ketika mau menangkap sinyal tetikus (press, release, move) untuk menggambar. Ketika menggunakan delphi dulu, prosedur untuk menangani event tetikus bisa dibuat terpisah dari komponen yang menjadi tempat terjadinya event. Misalnya, ketika ada event mouse di atas komponen Image, maka prosedur penanganannya bisa dibuat sebagai method dari objek Form. Salah satu contoh skenarionya adalah ketika terjadi sesuatu di komponen ini, maka akan disimpan perintah menggambar dan proses penggambaran di komponen yang bisa menggambar bisa didekorasi dengan penunjuk objek apa yang akan digambar tanpa mengganggu kondisi yang sudah ada (misal. rubberband).

dip

Masalah muncul ketika mau menerapkan cara serupa pada konteks Qt di python (PyQt atau PySide). Pada konteks ini, kelas yang memiliki buffer untuk menggambar ada di QImage. Agar gambar di objek ini dapat ditampilkan, Objek QImage perlu dipasang di Objek QLabel. Penanganan event mouse dilakukan di QLabel. Pendekatan untuk menangani proses semacam ini adalah dengan membuat kelas turunan QLabel atau QWidget untuk kebutuhan yang berbeda yang tentu saja merepotkan. Saya perlu satu komponen kecil yang bisa dipakai untuk beberapa konteks penggambaran yang berbeda tapi memiliki mekanisme yang sama (prosedur penanganan ada di objek lain).

Setelah membaca manual, ternyata membuat sinyal event cukup mudah:

  1. deklarasikan objek sinyal internal
  2. lempar sinyal sesuai dengan keadaan yang diinginkan (dalam hal ini, setiap terjadi mouse event)

Penjelasan lebih lanjut dapat dilihat di kode berikut :

class QMLabel(QtGui.QLabel):
	mousePressed = QtCore.Signal(QtGui.QMouseEvent)
	mouseMove = QtCore.Signal(QtGui.QMouseEvent)
	mouseReleased = QtCore.Signal(QtGui.QMouseEvent)

	def __init__(self, parent):
		super(QMLabel, self).__init__(parent)
		self.setMouseTracking(True)

	def mousePressEvent(self, event):
		self.mousePressed.emit(event)
		super(QMLabel, self).mousePressEvent(event)

	def mouseMoveEvent(self, event):
		self.mouseMove.emit(event)
		super(QMLabel, self).mouseMoveEvent(event)

	def mouseReleaseEvent(self, event):
		self.mouseReleased.emit(event)
		super(QMLabel, self).mouseReleaseEvent(event)

Di kode tersebut, saya membuat tiga event yang akan dilempar (didelegasikan). Pada setiap kode penangan event, saya lempar sinyal internal (prosedur emit).

Cara menggunakan kelas ini sama seperti ketika menggunakan komponen lain. rinciannya bisa dilihat di kode berikut :

class PickWidget(QtGui.QWidget):
	postAction = QtCore.Signal()
	def __init__(self, parent):
		super(PickWidget, self).__init__(parent)

		#offline buffer
		self.trackimage = QtGui.QImage(660, height, QtGui.QImage.Format_RGB32)

		self.tracklabel = QMLabel(self)
		self.tracklabel.setPixmap(QtGui.QPixmap.fromImage(self.trackimage))
		self.tracklabel.adjustSize()

		self.tracklabel.mousePressed.connect(self.mousepress)
		self.tracklabel.mouseReleased.connect(self.mouserelease)
		self.tracklabel.mouseMove.connect(self.mousemove)

	def mousepress(self, event):
		pass

	def mouserelease(self, event):
		pass

	def mousemove(self, event):
		pass

Sekian dulu catatan kali ini. Mudah-mudahan bermanfaat bagi saya sendiri kalau sewaktu-waktu lupa atau untuk anda kalau bertemu dengan persoalan yang sama.

Wassalam,

dua angka terakhir pemangkatan bilangan bulat

Berawal dari status kawan di facebook tentang tantangan kecil di hackerrank 2 minggu yang lalu. Akhirnya saya ikutan mencoba membuat program sederhana dengan python. Sebetulnya hanya iseng saja di sela-sela menulis.

Persoalannya adalah diberikan dua buah angka yaitu K dan N.  Hal yang ditanyakan adalah 2 angka terakhir dari deret S = 1^N + 2^N + … + K^N
Read More

Grid Shifts for Coordinate Transformation

Introduction to Look-up tables
Back in the DOS era and 80×86 CPU (I guess it’s quite old), mathematical operations for 3D Graphics were too expensive. One of the tricks to speed-up the graphics pipeline was using a pre-computed trigonometric functions implemented in a table. The benefit of using discretization of function parameter is measured by how complex the computation of function relative to accessing a table using a discretized input parameter. This method of replacing function call into looking up a table for already computed values are generally called Memoization.

Generalizing Look-up table for higher dimension
In previous example(trigonometric function) the input parameter is only one. If we think the parameter as a dimension, then the domain of the input parameter is a one dimensional object (a line). Of course the memoization technique is not only limited to one dimensional look-up table but can also be generalized to higher dimensions. In 3D Graphics (again), The memoization for higher dimension is used in texture mapping (2D) or voxel(volume pixel) representation for object modeling.

Grid shift: LUT in Coordinate transformation
Now let’s move from 3D Graphics to another area. In Geospatial domain, the same technique (look-up table) is used to transform coordinate from one Coordinate Reference System (CRS) to another CRS. Since most geographical coordinates only has two horizontal components (latitude and longitude). The look-up table is in the form of a two-dimensional grid. This grid-based transformation is also known as ‘Grid Shifts’.
Read More

Simple Entity Extraction from News Article in Bahasa Indonesia

Tulisan kali ini membahas cara mengekstrak informasi dari teks berita menggunakan python. Entitas yang dimaksud adalah entitas berupa tempat, orang, organisasi atau entitas lain yang diketahui dalam basis pengetahuan. Basis pengetahuan yang dipakai dalam tulisan ini adalah dbpedia bahasa Indonesia. Sebetulnya DBPedia sudah menyediakan layanan semacam ini yaitu Spotlight namun sayangnya belum tersedia dalam bahasa Indonesia.
Read More

GSoC 2013 so far : pre mid-term Evaluation

It’s been quite a while since my last post about Google Summer of code activities. I was trying to understand the inner working of the library which I use and gathering deeper knowledge about spatial coordinate and mapping. As I may previously mentioned in earlier post, I am working with GDAL and PROJ.4 Library. GDAL/OGR is mainly used for supporting many raster/vector format and also dealing with WKT (Well Known Text) representation of coordinate system. The Coordinate system is defined in WKT Format although in the GDAL/OGR Library, the main coordinate system transformation is done in the PROJ.4 library which is wrapped through an interface which consists of OGRSpatialReference and OGRCoordinateTransformation.
Read More