2.2. How to do logical operation on ROI and MultiROI

In this example we will use multiple ROIs and MultiROIs to show boolean operation.

First create some ROIs:

from ORSModel import ROI, MultiROI, orsVect, orsColor
roiA = ROI()
roiA.setTitle('roiA')
roiA.setXYZTSize(1000, 1000, 1000, 1)
roiA.setXSpacing(0.0001)
roiA.setYSpacing(0.0001)
roiA.setZSpacing(0.0001)
roiA.setInitialColor(orsColor(1,0,0,1))
roiA.paintSphere(roiA.getBox().getOrigin(), roiA.getBox().getDirection0Size(), 1, 0)
roiA.publish()

roiB = ROI()
roiB.setTitle('roiB')
roiB.copyShapeFromStructuredGrid(roiA)
roiB.setInitialColor(orsColor(0,1,0,1))
roiB.paintSphere(roiB.getBox().getOriginOpposite(), roiB.getBox().getDirection0Size(), 1, 0)
roiB.publish()

roiC = ROI()
roiC.setTitle('roiC')
roiC.copyShapeFromStructuredGrid(roiA)
roiC.setInitialColor(orsColor(0,0,1,1))
roiBox = roiC.getBox()
roiBox.grow(orsVect(-roiBox.getDirection0Size()*0.5, -roiBox.getDirection1Size()*0.5, -roiBox.getDirection2Size()*0.5))
roiC.paintBox(roiBox,  1, 0)
roiC.publish()

multiROIa= MultiROI()
multiROIa.setTitle('multiROIa')
multiROIa.copyShapeFromStructuredGrid(roiA)
multiROIBox = multiROIa.getBox()
multiROIa.setLabelCount(3)
multiROIBox.grow(orsVect(-multiROIBox.getDirection0Size()*0.5, -multiROIBox.getDirection1Size()*0.5, -multiROIBox.getDirection2Size()*0.5))
multiROIBox.setOrigin(multiROIa.getOrigin())
multiROIa.paintBox(multiROIBox,  1, 0)

multiROIBox.setOrigin(multiROIa.getBox().getCenter())
multiROIa.paintBox(multiROIBox,  2, 0)

multiROIBox.setOrigin((multiROIa.getBox().getOriginOpposite() - multiROIa.getBox().getOrigin())*0.25)
multiROIa.paintBox(multiROIBox,  3, 0)
multiROIa.publish()

Now let’s do some intersection:

roiIntersect = roiA.getIntersectionWithROI(roiB, None)
roiIntersect.setTitle('intersection of roiA, roiB and roiC')
roiIntersect = roiIntersect.getIntersectionWithROI(roiC, roiIntersect)
roiIntersect.setInitialColor(orsColor(1,1,0,1))
roiIntersect.publish()
multiROIb = multiROIa.getIntersectionWithROI(roiIntersect, None)
multiROIb.setTitle('intersection of roiA, roiB, roiC and multiROia')
multiROIb.removeEmptyLabelsAndRenumber()
multiROIb.setDataDirty()
multiROIb.publish()

Now let’s do some subtraction:

roiAMinusB = roiA.copy()
roiAMinusB.removeROI(roiB)
roiAMinusB.setTitle('roiAMinusB')
roiAMinusB.publish()
roiBMinusA = roiB.copy()
roiBMinusA.removeROI(roiA)
roiBMinusA.setTitle('roiBMinusA')
roiBMinusA.publish()

Now let’s do some addition:

roiAPlusB = roiA.copy()
roiAPlusB.addROI(roiB)
roiAPlusB.setTitle('roiAPlusB')
roiAPlusB.publish()
roiBPlusA = roiB.copy()
roiBPlusA.addROI(roiA)
roiBPlusA.setTitle('roiBPlusA')
roiBPlusA.publish()