Hi,

If you are only going to use this once, then making two ROIs and 
synchronising them might be easiest:

from PyQt5 import QtWidgets
import pyqtgraph as pg

class TestPlot(pg.GraphicsLayoutWidget):

    def __init__(self):
        super().__init__()

        self.plot = self.addPlot()
        self.plot.getViewBox().setAspectLocked(ratio=1.0)

        self.ring1 = pg.CircleROI(pos=(0.25, 0.25), size=(0.5, 0.5))
        self.ring2 = pg.CircleROI(pos=(0, 0), size=(0.1, 0.1))
        self.plot.addItem(self.ring1, ignoreBounds=True)
        self.plot.addItem(self.ring2, ignoreBounds=True)
        self.ring1.sigRegionChanged.connect(self._ring1_changed)
        self.ring2.sigRegionChanged.connect(self._ring2_changed)
        self._ring1_changed()

    def _ring1_changed(self):
        if not self.ring2.pos() == self.ring1.pos() + self.ring1.size()/2 - 
self.ring2.size()/2:
            self.ring2.setPos(self.ring1.pos() + self.ring1.size()/2 - self.
ring2.size()/2)

    def _ring2_changed(self):
        if not self.ring1.pos() == self.ring2.pos() + self.ring1.size()/2 - 
self.ring2.size()/2:
            self.ring1.setPos(self.ring2.pos() + self.ring2.size()/2 - self.
ring1.size()/2)

def main():
    import sys
    app = QtWidgets.QApplication(sys.argv)
    mainwindow = TestPlot()
    mainwindow.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

If you needed the getArrayRegion() 
<http://www.pyqtgraph.org/documentation/_modules/pyqtgraph/graphicsItems/ROI.html#EllipseROI.getArrayRegion>
 
functionality from EllipseROI, then you would need to implement something 
yourself. Copy the linked method, but make two masks and you should be able 
to do a mask = np.logical_and(mask1, mask2) on them.
If you actually wanted two EllipseROIs, then you'd need to modify the above 
code with similar logic to mirror the two size and angle parameters as 
well, but making your own ROI component might be easier.
If you want to do that, then start with copying the code from EllipseROI 
(extending ROI), but add an additional handle (addFreeHandle?) in the 
_addHandles() method, draw the second ellipse in the paint() method, modify 
getArrayRegion() as described above. You may be able to get away without 
modifying the shape() method.

Patrick



On Saturday, 30 March 2019 21:46:01 UTC+10:30, [email protected] wrote:
>
> Hi,
>
> I'd like to create a custom ROI for content selection in an ImageItem. It 
> should consist of two concentric CircleROIs with different handles:
>
> - outer circle with 3 point handles to define the circle
> and
> - inner concentric circle with just a radius handle
>
> The goal is to have a ring-like selection ROI. I guess the simplest 
> solution would be to somehow combine two CircleROIs. It's just I don't know 
> how to start...
> Suggestions are very welcome! Thank you!
>

-- 
You received this message because you are subscribed to the Google Groups 
"pyqtgraph" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/pyqtgraph/07df3f78-4ad5-4b2a-8380-50511ad1a9cb%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to