| 11 | import numpy as np |
| 12 | |
| 13 | class PointRoi(ROI): |
| 14 | dtype = 'point' |
| 15 | def __init__(self, body=None): |
| 16 | self.body = body if body!=None else [] |
| 17 | self.body = [i if len(i)==3 else tuple(i) + (0,) for i in self.body] |
| 18 | self.update = body!=[] |
| 19 | self.infoupdate = body!=[] |
| 20 | |
| 21 | def add(self, p): |
| 22 | self.body.append(p) |
| 23 | self.update, self.infoupdate = True, True |
| 24 | |
| 25 | def snap(self, x, y, z, lim): |
| 26 | cur, minl = None, 1e8 |
| 27 | for i in self.body: |
| 28 | if z!=i[2]:continue |
| 29 | d = (i[0]-x)**2+(i[1]-y)**2 |
| 30 | if d < minl:cur,minl = i,d |
| 31 | if minl**0.5>lim:return None |
| 32 | return self.body.index(cur) |
| 33 | |
| 34 | def pick(self, x, y, z, lim): |
| 35 | return self.snap(x, y, z, lim) |
| 36 | |
| 37 | def draged(self, ox, oy, nx, ny, nz, i): |
| 38 | self.body[i] = (nx, ny, nz) |
| 39 | self.update = False |
| 40 | |
| 41 | def countbox(self): |
| 42 | self.box = [1000,1000,-1000,-1000] |
| 43 | for x, y in self.body: |
| 44 | if x<self.box[0]:self.box[0]=x |
| 45 | if x>self.box[2]:self.box[2]=x |
| 46 | if y<self.box[1]:self.box[1]=y |
| 47 | if y>self.box[3]:self.box[3]=y |
| 48 | |
| 49 | def get_box(self): |
| 50 | if self.infoupdate: |
| 51 | self.countbox() |
| 52 | self.infoupdate=False |
| 53 | return self.box |
| 54 | |
| 55 | def info(self, ips, cur): |
| 56 | k, u = ips.unit |
| 57 | if cur==None:return |
| 58 | x, y, z = self.body[cur] |
| 59 | IPy.set_info('points:%.0f x:%.1f y:%.1f z:%.1f'%(len(self.body), x*k, y*k, z*k)) |
| 60 | |
| 61 | def draw(self, dc, f, **key): |
| 62 | |
| 63 | |
| 64 | |
| 65 | colormap = (tuple(np.array(RoiManager.get_color())//2), RoiManager.get_color()) |
| 66 | font = wx.Font(8, wx.FONTFAMILY_DEFAULT, |
| 67 | wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False) |
| 68 | |
| 69 | dc.SetFont(font) |
| 70 | for c,r,z in self.body: |