0

実際、これは非常に単純な質問のはずですが、私はチャコと特性の非常に急な学習曲線を経験しています...

現在、チャコと特性を使用して医療画像をプロットするアプリケーションを作成しています。画像からピクセル位置を選択し、このピクセル位置を使用して画像スタックで評価を行いたいだけです。そこで、画像プロットでのマウス クリックに反応する独自の Chaco ツールを書き始めました。これはこれまでのところうまくいきます。imageplot をクリックすると、ツール (カスタムメイドの PixelPickerTool) 内のマウス座標が表示されます。ただし、ツールの外部でこの座標値を使用したいので、次の質問があります。イベントが発生したときに、ツールの外部にある別のオブジェクトまたは変数に座標を渡すにはどうすればよいですか。

私がやりたいことを説明するために、私が書いている2つのクラスの主な構造を添付しました:

class PixelPickerTool(BaseTool):
    '''Pick a Pixel coordinate from an image'''

    ImageCoordinates = [0,0]

    def normal_left_down(self, event):       
        print "Mouse:", event.x, event.y,
        click_x, click_y = self.component.map_data((event.x, event.y))
        img_x = int(click_x)
        img_y = int(click_y)
        coord = [img_x, img_y]
        if ( (img_x > self.ImageSizeX) or (img_x < 0) ):
             coord = [0,0]
        if ( (img_y > self.ImageSizeY) or (img_y < 0) ):
             coord = [0,0]

        print coord
        # this print gives out the coordinates of the pixel that was clicked - this works fine...
        # so inside the picker too I can get the coordinates
        # but how can I use the coordinates outside this tool ?


class ImagePlot(HasTraits):
    # create simple chaco plot of 2D numpy image array, with a simple interactor (PixelPickerTool) 
    plot = Instance(Plot)
    string = String("hallo")
    picker = Instance(PixelPickerTool)

    traits_view = View(
        Item('plot', editor=ComponentEditor(), show_label=False,width=500, height=500, resizable=False),
        Item('string', show_label=False, springy=True, width=300, height=20, resizable=False),
        title="")   

    def __init__(self, numpyImage):
        super(ImagePlot, self).__init__()
        npImage = np.flipud(np.transpose(numpyImage))

        plotdata = ArrayPlotData(imagedata = npImage)

        plot = Plot(plotdata)
        plot.img_plot("imagedata", colormap=gray)

        self.plot = plot
        # Bild Nullpunkt ist oben links!
        self.plot.default_origin = 'top left'

        pixelPicker = PixelPickerTool(plot)
        self.picker = pixelPicker
        plot.tools.append(pixelPicker)

この ImagePlot クラスのどこかで、PixelPickerTool によって測定された座標を使用したいと考えています。たとえば、それらを MyImageSeries.setCoordinate(xy_coordinateFromPickerTool) のような別のオブジェクトに渡すことによって、イベントが発生したときに PickerTool からこのクラスのメンバー変数にピクセル座標を渡すにはどうすればよいですか? おそらく次のようなものです: self.PixelCoordinates = picker.getPixelCoordinates() は機能しますか? しかし、ピッカーで on_normal_left_down 関数が実行されたとき、どうすればわかりますか?

最後に、画像を処理し、ImagePlot で決定されたピクセル位置に適合させるために、より多くの画像を保持する別のクラスに座標を渡したいと思います。imagePlot クラスで "_picker_changed" のようなものを使用して、PickerTool でイベントが発生したかどうかを検出しようとしましたが、これはイベントの発生を検出しませんでした。だから多分私は何か間違ったことをしている...

このピッカー ツールからイベントと関連する変数を取得する方法を誰か教えてもらえますか?

乾杯、

アンドレ

4

1 に答える 1

1

「しかし、ピッカーで on_normal_left_down 関数がいつ実行されたか、どうすればわかりますか?」

おそらくこれを行う方法はいくつかありますが、1 つの方法は、単純に求めていることを正確に実行し、明示的に定義したイベントを起動することです。

例えば:

from traits.api import Event

class PickerTool(BaseTool):
  last_coords = SomeTrait
  i_fired = Event

  def normal_left_down(self,event):
     # do whatever necessary processing
     self.last_coords = do_some_stuff(event.some_attribute)
     # now notify your parent
     self.i_fired = True

次に、表示したい場所から plot.picker.i_fired をリッスンし、保存された状態を plot.picker.last_coords で調べます。

これらの座標でやりたいことが非常に単純である場合、より簡単にできるもう1つのことは、ピッカーが対話する必要があるデータ構造の初期化を渡すことです(またはself.parentへの一連の呼び出しでそれらを取得します)ピッカー内で直接作業を行います。

于 2013-03-07T21:52:43.887 に答える