Пример #1
0
 def on_setback(self, event):
     name = self.com_back.GetValue()
     if name is None: return
     ImageManager.get().back = ImageManager.get(name)
     #curwin = WindowsManager.get()
     #curwin.set_back(ImageManager.get(name))
     ImageManager.get().update()
Пример #2
0
    def run(self, ips, snap, img, para = None):
        intenimg = ImageManager.get(para['inten']).img
        strc = ndimage.generate_binary_structure(2, 1 if para['con']=='4-connect' else 2)
        buf, n = ndimage.label(snap, strc, output=np.uint32)
        index = range(1, n+1)
        idx = (np.ones(n+1)*para['front']).astype(np.uint8)
        msk = np.ones(n, dtype=np.bool)

        if para['mean']>0: msk *= ndimage.mean(intenimg, buf, index)>=para['mean']
        if para['mean']<0: msk *= ndimage.mean(intenimg, buf, index)<-para['mean']
        if para['max']>0: msk *= ndimage.maximum(intenimg, buf, index)>=para['max']
        if para['max']<0: msk *= ndimage.maximum(intenimg, buf, index)<-para['max']
        if para['min']>0: msk *= ndimage.minimum(intenimg, buf, index)>=para['min']
        if para['min']<0: msk *= ndimage.minimum(intenimg, buf, index)<-para['min']
        if para['sum']>0: msk *= ndimage.sum(intenimg, buf, index)>=para['sum']
        if para['sum']<0: msk *= ndimage.sum(intenimg, buf, index)<-para['sum']
        if para['std']>0: msk *= ndimage.standard_deviation(intenimg, buf, index)>=para['std']
        if para['std']<0: msk *= ndimage.standard_deviation(intenimg, buf, index)<-para['std']


        xy = ndimage.center_of_mass(intenimg, buf, index)
        xy = np.array(xy).round(2).T

        idx[1:][~msk] = para['back']
        idx[0] = 0
        img[:] = idx[buf]

        ImageManager.get(para['inten']).mark = RGMark((xy.T, msk))
        ImageManager.get(para['inten']).update = True
Пример #3
0
 def run(self, ips, imgs, para=None):
     ips1 = ImageManager.get(para['b1'])
     ips2 = ImageManager.get(para['b2'])
     rs1 = zip(ips1.imgs, ips1.data['prjs'], ips1.data['trans'])
     rs2 = zip(ips2.imgs, ips2.data['prjs'], ips2.data['trans'])
     rsts = []
     for r1, r2 in zip(rs1, rs2):
         rsts.append(geo_indicate.count_ndvi(r1, r2))
     imgs, prjs, trans = zip(*rsts)
     ips = ImagePlus(imgs, ips1.title + '-ndvi')
     ips.data['prjs'], ips.data['trans'] = prjs, trans
     IPy.show_ips(ips)
Пример #4
0
 def run(self, ips, imgs, para=None):
     if para['kill']:
         ips.backimg = None
     else:
         print(ImageManager.get())
         img = ImageManager.get(para['img']).img
         if img.dtype != np.uint8 or img.shape[:2] != ips.img.shape[:2]:
             IPy.alert(
                 'a background image must be 8-bit and with the same size')
             return
         ips.backimg = img
         ips.backmode = (para['k'], para['op'])
     ips.update()
Пример #5
0
 def run(self, ips, imgs, para=None):
     ips1 = ImageManager.get(para['b1'])
     ips2 = ImageManager.get(para['b2'])
     imgs = []
     for i in range(len(ips1.imgs)):
         b2, b1 = ips2.imgs[i], ips1.imgs[i]
         b1 = np.clip(b1, 1, 1e8, out=b1)
         b2 = np.clip(b2, 1, 1e8, out=b2)
         ndvi = (((b2 - b1) / (b2 + b1) + 1) / 2 * 255 + 0.5).astype(
             np.uint8)
         imgs.append(ndvi)
     ips = ImagePlus(imgs, ips1.title + '-ndvi')
     ips.data = ips1.data
     IPy.show_ips(ips)
Пример #6
0
 def run(self, ips, imgs, para=None):
     if not para['stack']:
         imgs, labs = [ips.img], [ImageManager.get(para['lab']).img]
     else:
         labs = ImageManager.get(para['lab']).imgs
         if len(imgs) != len(labs):
             labs = [ImageManager.get(para['lab']).img] * len(imgs)
     for i in range(len(imgs)):
         img, lab = imgs[i], labs[i]
         connect = ['4-connected', '8-connected'].index(para['connect']) + 1
         g = graph.rag_mean_color(img, lab, connect, para['mode'],
                                  para['sigma'])
         lab = graph.cut_normalized(lab, g, para['thresh'], para['num'])
         img[:] = color.label2rgb(lab, img, kind='avg')
         self.progress(i, len(imgs))
Пример #7
0
    def run(self, ips, imgs, para=None):
        ndvi = ImageManager.get(para['ndvi'])
        lst = ImageManager.get(para['lst'])
        lab = ImageManager.get(para['lab'])
        area = ImageManager.get(para['area'])

        ndvi = list(zip(ndvi.imgs, ndvi.data['prjs'], ndvi.data['trans']))[0]
        lst = list(zip(lst.imgs, lst.data['prjs'], lst.data['trans']))[0]
        lab = list(zip(lab.imgs, lab.data['prjs'], lab.data['trans']))[0]
        area = list(zip(area.imgs, area.data['prjs'], area.data['trans']))[0]
        df = TableManager.get(para['df']).data
        rst = wheat.get_grade(ndvi, lst, lab, area, df)
        ips = ImagePlus([rst[0]], 'tiao xiu bing')
        ips.data['prjs'], ips.data['trans'] = [rst[1]], [rst[2]]
        IPy.show_ips(ips)
Пример #8
0
 def run(self, tps, snap, data, para=None):
     ips = ImageManager.get(para['paper'])
     ips.snapshot()
     color = para['value'] if para['color'] == (0, 0, 0) else para['color']
     if para['field'] != 'None': color = para['field']
     gdraw.draw_line(ips.img, data, color, para['lw'])
     ips.update()
Пример #9
0
 def run(self, ips, imgs, para=None):
     ips2 = ImageManager.get(para['temp'])
     nimg = ips.img * 0
     nimg[ips.img > 0] += 80
     nimg[ips2.img > 0] += 160
     ips = ImagePlus([nimg], ips.title + '-diff-' + ips2.title)
     IPy.show_ips(ips)
Пример #10
0
 def preview(self, ips, para):
     lab = ImageManager.get(para['lab']).img
     connect = ['4-connected', '8-connected'].index(para['connect']) + 1
     g = graph.rag_mean_color(ips.snap, lab, connect, para['mode'],
                              para['sigma'])
     lab = graph.cut_normalized(lab, g, para['thresh'], para['num'])
     ips.img[:] = color.label2rgb(lab, ips.snap, kind='avg')
Пример #11
0
    def run(self, ips, imgs, para = None):
        inten = ImageManager.get(para['inten'])
        if not para['slice']:
            imgs = [inten.img]
            msks = [ips.img]
        else: 
            msks = ips.imgs
            imgs = inten.imgs
            if len(msks)==1:
                msks *= len(imgs)
        buf = imgs[0].astype(np.uint16)
        strc = ndimage.generate_binary_structure(2, 1 if para['con']=='4-connect' else 2)
        idct = ['Max','Min','Mean','Variance','Standard','Sum']
        key = {'Max':'max','Min':'min','Mean':'mean',
               'Variance':'var','Standard':'std','Sum':'sum'}
        idct = [i for i in idct if para[key[i]]]
        titles = ['Slice', 'ID'][0 if para['slice'] else 1:] 
        if para['center']: titles.extend(['Center-X','Center-Y'])
        if para['extent']: titles.extend(['Min-Y','Min-X','Max-Y','Max-X'])
        titles.extend(idct)
        k = ips.unit[0]
        data, mark = [],{'type':'layers', 'body':{}}
        # data,mark=[],[]
        for i in range(len(imgs)):
            n = ndimage.label(msks[i], strc, output=buf)
            index = range(1, n+1)
            dt = []
            if para['slice']:dt.append([i]*n)
            dt.append(range(n))
            
            xy = ndimage.center_of_mass(imgs[i], buf, index)
            xy = np.array(xy).round(2).T
            if para['center']:dt.extend([xy[1]*k, xy[0]*k])

            boxs = [None] * n
            if para['extent']:
                boxs = ndimage.find_objects(buf)
                boxs = [( i[1].start+(i[1].stop-i[1].start)/2, i[0].start+(i[0].stop-i[0].start)/2, i[1].stop-i[1].start,i[0].stop-i[0].start) for i in boxs]
                for j in (0,1,2,3):
                    dt.append([i[j]*k for i in boxs])
            if para['max']:dt.append(ndimage.maximum(imgs[i], buf, index).round(2))
            if para['min']:dt.append(ndimage.minimum(imgs[i], buf, index).round(2))        
            if para['mean']:dt.append(ndimage.mean(imgs[i], buf, index).round(2))
            if para['var']:dt.append(ndimage.variance(imgs[i], buf, index).round(2)) 
            if para['std']:dt.append(ndimage.standard_deviation(imgs[i], buf, index).round(2))
            if para['sum']:dt.append(ndimage.sum(imgs[i], buf, index).round(2))      
 
            layer = {'type':'layer', 'body':[]}
            xy=np.int0(xy).T

            texts = [(i[1],i[0])+('id=%d'%n,) for i,n in zip(xy,range(len(xy)))]
            layer['body'].append({'type':'texts', 'body':texts})
            if para['extent']: layer['body'].append({'type':'rectangles', 'body':boxs})
            mark['body'][i] = layer

            data.extend(list(zip(*dt)))
        IPy.show_table(pd.DataFrame(data, columns=titles), inten.title+'-region statistic')
        inten.mark = GeometryMark(mark)
        inten.update = True
Пример #12
0
    def run(self, ips, imgs, para=None):
        ips1 = ImageManager.get(para['img1'])
        ips2 = ImageManager.get(para['img2'])
        ips2.snapshot()

        img = ips1.img
        imgs = ips2.imgs

        sl1, sl2 = ips1.get_nslices(), ips2.get_nslices()
        cn1, cn2 = ips1.get_nchannels(), ips2.get_nchannels()
        if not (ips1.img.dtype == np.uint8 and ips2.img.dtype == np.uint8):
            IPy.alert('Two image must be type of 8-bit or rgb!')
            return

        for i in range(sl2):
            self.progress(i, sl2)
            match(img, imgs[i])
        ips2.update = 'pix'
Пример #13
0
 def on_mode(self, event):
     ips = ImageManager.get()
     if ips is None: return
     if self.chk_hide.GetValue():
         ips.chan_mode = 0.0
         return ips.update()
     modes = ['set', 'max', 'min', 'msk', 0.2, 0.4, 0.5, 0.6, 0.8]
     ips.chan_mode = modes[self.com_mode.GetSelection()]
     ips.update()
Пример #14
0
 def on_back(self, event):
     self.com_back.SetItems(['None'] + ImageManager.get_titles())
     cur = WindowsManager.get()
     if not cur is None: cur = cur.back
     if not cur is None: cur = cur.title
     self.com_back.SetValue(str(cur))
     modes = ['set', 'max', 'min', 'msk', 0.2, 0.4, 0.5, 0.6, 0.8]
     ips = ImageManager.get()
     if ips is None: self.com_mode.Select(0)
     else: self.com_mode.Select(modes.index(ips.chan_mode))
Пример #15
0
 def run(self, tps, snap, data, para=None):
     img = ImageManager.get(para['temp']).img
     chans = list(data['channels'][0])
     chans = [chans.index(i) for i in para['chans']]
     nimg = gmt.match_idx(data,
                          img,
                          step=para['step'],
                          order=para['order'],
                          chan=chans)
     IPy.show_img([nimg], tps.title + '-match')
Пример #16
0
 def run(self, tps, snap, data, para=None):
     ipst = ImageManager.get(para['temp'])
     chans = list(data['channels'][0])
     chans = [chans.index(i) for i in para['chans']]
     order = {'nearest': 0, 'linear': 1}[para['order']]
     rst = gmt.match_idx(data,
                         ipst.img,
                         chans,
                         step=para['step'],
                         order=order)
     ipst.update()
Пример #17
0
 def run(self, ips, imgs, para=None):
     ipst = ImageManager.get(para['temp'])
     chans = ['Channel %s' % i for i in range(ips.get_nchannels())]
     chans = [chans.index(i) for i in para['chans']]
     order = {'nearest': 0, 'linear': 1}[para['order']]
     rst = gmt.match_multi(imgs,
                           ipst.img,
                           chans,
                           step=para['step'],
                           order=order)
     ipst.update()
Пример #18
0
 def run(self, ips, snap, img, para=None):
     key = {'chans': None, 'grade': para['grade'], 'w': para['w']}
     key['items'] = [i for i in ['ori', 'blr', 'sob', 'eig'] if para[i]]
     ori = ImageManager.get(para['img']).img
     feat, lab, key = get_feature(ori, snap, key)
     model = BaggingClassifier(n_estimators=para['n_estimators'],
                               max_features=para['max_features'])
     model.fit(feat, lab)
     get_predict(ori, model, key, out=img)
     global model_para
     model_para = model, key
Пример #19
0
 def run(self, ips, imgs, para=None):
     if not para['stack']:
         imgs, labs = [ips.img], [ImageManager.get(para['lab']).img]
     else:
         labs = ImageManager.get(para['lab']).imgs
         if len(imgs) != len(labs):
             labs = [ImageManager.get(para['lab']).img] * len(imgs)
     for i in range(len(imgs)):
         img, lab = imgs[i], labs[i]
         connect = ['4-connected', '8-connected'].index(para['connect']) + 1
         g = graph.rag_mean_color(img, lab, connect, para['mode'],
                                  para['sigma'])
         lab = graph.merge_hierarchical(lab,
                                        g,
                                        thresh=para['thresh'],
                                        rag_copy=False,
                                        in_place_merge=True,
                                        merge_func=merge_mean_color,
                                        weight_func=_weight_mean_color)
         img[:] = color.label2rgb(lab, img, kind='avg')
         self.progress(i, len(imgs))
Пример #20
0
 def preview(self, ips, para):
     lab = ImageManager.get(para['lab']).img
     connect = ['4-connected', '8-connected'].index(para['connect']) + 1
     g = graph.rag_mean_color(ips.snap, lab, connect, para['mode'],
                              para['sigma'])
     lab = graph.merge_hierarchical(lab,
                                    g,
                                    thresh=para['thresh'],
                                    rag_copy=False,
                                    in_place_merge=True,
                                    merge_func=merge_mean_color,
                                    weight_func=_weight_mean_color)
     ips.img[:] = color.label2rgb(lab, ips.snap, kind='avg')
Пример #21
0
    def run(self, ips, imgs, para=None):
        if not ('prjs' in ips.data and 'trans' in ips.data):
            return IPy.alert('need projection and transform matrix!')
        objs = ImageManager.get(para['fragments'])
        if not ('prjs' in objs.data and 'trans' in objs.data):
            return IPy.alert('need projection and transform matrix!')
        goal = (imgs[0], ips.data['prjs'][0], ips.data['trans'][0])
        rasters = zip(objs.imgs, objs.data['prjs'], objs.data['trans'])

        rst = geo_util.rasters2des(list(rasters), goal, para['step'])

        ips = ImagePlus([rst[0]], ips.title + '-combine')
        ips.data['prjs'], ips.data['trans'] = [rst[1]], [rst[2]]
        IPy.show_ips(ips)
Пример #22
0
 def run(self, ips, imgs, para=None):
     conts = find_contours(ips.img,
                           1e-6,
                           fully_connected='low',
                           positive_orientation='low')
     areas = [Polygon(i).area for i in conts]
     areas = np.array(areas)
     img = ImageManager.get(para['background']).get_subimg()
     wx.CallAfter(pub.sendMessage,
                  'showice',
                  img=img,
                  ices=conts,
                  areas=areas,
                  para=para)
Пример #23
0
    def run(self, ips, imgs, para=None):
        ips1 = ImageManager.get(para['img1'])
        ips2 = ImageManager.get(para['img2'])
        ips1.snapshot()

        sl1, sl2 = ips1.get_nslices(), ips2.get_nslices()
        cn1, cn2 = ips1.get_nchannels(), ips2.get_nchannels()
        if ips1.dtype != ips2.dtype:
            IPy.alert('Two stack must be equal dtype!')
            return
        elif sl1 > 1 and sl2 > 1 and sl1 != sl2:
            IPy.alert('Two stack must have equal slices!')
            return
        elif cn1 > 1 and cn2 > 1 and cn1 != cn2:
            IPy.alert('Two stack must have equal channels!')
            return

        w, h = ips1.size, ips2.size
        w, h = min(w[0], h[0]), min(w[1], h[1])
        if sl1 == 1:
            bliter.blit(ips1.get_subimg(), ips2.get_subimg(), mode=para['op'])
        elif sl1 > 1 and sl2 == 1:
            for i in range(sl1):
                self.progress(i, sl1)
                ss1, se1 = ips1.get_rect()
                bliter.blit(ips1.imgs[i][ss1, se1],
                            ips2.get_subimg(),
                            mode=para['op'])
        elif sl1 > 1 and sl2 > 1:
            for i in range(sl1):
                self.progress(i, sl1)
                ss1, se1 = ips1.get_rect()
                ss2, se2 = ips2.get_rect()
                bliter.blit(ips1.imgs[i][ss1, se1],
                            ips2.imgs[i][ss2, se2],
                            mode=para['op'])
        ips1.update = 'pix'
Пример #24
0
    def run(self, ips, imgs, para=None):
        if not ('prj' in ips.data and 'trans' in ips.data):
            return IPy.alert('need projection and transform matrix!')
        objs = ImageManager.get(para['fragments'])
        if not ('prjs' in objs.data and 'trans' in objs.data):
            return IPy.alert('need projection and transform matrix!')

        goal = geo_struct.Raster(imgs, ips.data['prj'], ips.data['trans'])
        objs = zip(objs.imgs, objs.data['prjs'], objs.data['trans'])
        rasters = [geo_struct.Raster([i[0]], i[1], i[2]) for i in objs]
        rst = geo_util.rasters2one(rasters, goal, para['step'])

        ips = ImagePlus(rst.imgs, ips.title + '-combine')
        ips.data['prj'], ips.data['trans'] = goal.prj, goal.m
        IPy.show_ips(ips)
Пример #25
0
    def run(self, ips, imgs, para=None):
        ips1 = ImageManager.get(para['img1'])
        ips2 = ImageManager.get(para['img2'])

        detector = CVSURF(hessianThreshold=para['thr'],
                          nOctaves=para['oct'],
                          nOctaveLayers=para['int'],
                          upright=para['upright'],
                          extended=para['ext'])
        kps1, feats1 = detector.detectAndCompute(ips1.img, None)
        kps2, feats2 = detector.detectAndCompute(ips2.img, None)
        dim, std = {
            'None': 0,
            'Affine': 6,
            'H**o': 8
        }[para['trans']], para['std'] / 100.0
        style = para['style'] == 'Blue/Yellow'
        idx, msk, m = Matcher(dim, std).filter(kps1, feats1, kps2, feats2)
        picker1 = Pick(kps1, kps2, idx, msk, ips1, ips2, True, style)
        picker2 = Pick(kps1, kps2, idx, msk, ips1, ips2, False, style)
        ips1.tool, ips1.mark = picker1, picker1
        ips2.tool, ips2.mark = picker2, picker2
        if para['log']: self.log(kps1, kps2, msk, m, dim)
        ips1.update, ips2.update = True, True
Пример #26
0
    def on_cmapsel(self, event):
        key = self.cmapsel.GetValue()
        lut = ColorManager.get_lut(key)
        n = self.spn_num.GetValue() + 1
        idx = np.linspace(0, 255, n).astype(int)
        cs = list(lut[idx]) + [(128, 128, 128)] * (16 - n)
        for btn, c in zip(self.btns, cs):
            btn.SetBackgroundColour(c)

        ips = ImageManager.get()
        if ips is None: return
        newlut = lut * 0
        newlut[:n] = lut[idx]
        ips.lut = newlut
        ips.update()
Пример #27
0
    def run(self, ips, imgs, para=None, preview=False):
        if len(ips.imgs) == 1: ips.img[:] = ips.snap
        key = {'chans': None, 'grade': para['grade'], 'w': para['w']}
        key['items'] = [i for i in ['ori', 'blr', 'sob', 'eig'] if para[i]]
        slir, slic = ips.get_rect()
        labs = [i[slir, slic] for i in imgs]
        ori = ImageManager.get(para['img']).imgs
        if len(imgs) == 1: ori = [ImageManager.get(para['img']).img]
        oris = [i[slir, slic] for i in ori]

        IPy.set_info('extract features...')
        feat, lab, key = feature.get_feature(oris,
                                             labs,
                                             key,
                                             callback=self.progress)

        IPy.set_info('training data...')
        self.progress(None, 1)
        model = self.classify(para)
        model.fit(feat, lab)

        IPy.set_info('predict data...')
        if preview:
            return feature.get_predict(oris,
                                       model,
                                       key,
                                       labs,
                                       callback=self.progress)
        if len(imgs) == 1: ips.swap()
        outs = feature.get_predict(oris, model, key, callback=self.progress)
        nips = ImagePlus(outs, ips.title + 'rst')
        nips.range, nips.lut = ips.range, ips.lut
        nips.back, nips.chan_mode = ips.back, 0.4
        IPy.show_ips(nips)
        global model_para
        model_para = model, key
Пример #28
0
 def run(self, ips, snap, img, para=None):
     key = {'chans': None, 'grade': para['grade'], 'w': para['w']}
     key['items'] = [i for i in ['ori', 'blr', 'sob', 'eig'] if para[i]]
     ori = ImageManager.get(para['img']).img
     feat, lab, key = get_feature(ori, snap, key)
     feat_dic = {'sqrt': 'sqrt', 'log2': 'log2', 'None': None}
     max_depth = None if para['max_depth'] == 0 else para['max_depth']
     model = RandomForestClassifier(
         n_estimators=para['n_estimators'],
         max_features=feat_dic[para['max_features']],
         max_depth=max_depth)
     model.fit(feat, lab)
     get_predict(ori, model, key, out=img)
     global model_para
     model_para = model, key
Пример #29
0
    def runasyn(self, wb, info, key, para=None, callback=None):
        TaskManager.add(self)
        for i in para:
            if i in key and key[i][0] == 'img':
                ips = ImageManager.get(para[i])
                para[i] = ips if ips is None else ips.img

            if i in key and key[i][0] == 'tab':
                tps = TableManager.get(para[i])
                para[i] = tps if tps is None else tps.data

        start = time()
        xlreport.fill_value(wb, info, para)
        wb.save(para['path'])
        IPy.set_info('%s: cost %.3fs' % (self.title, time() - start))
        TaskManager.remove(self)
        if callback != None: callback()
Пример #30
0
    def run(self, ips, imgs, para=None):
        dis = ImageManager.get(para['dis']).imgs
        balls, ids, rs, graph = [], [], [], ips.data
        for idx in graph.nodes():
            ids.append(idx)
            balls.append(graph.node[idx]['o'])

        xs, ys, zs = [], [], []
        v1s, v2s = [], []
        for (s, e) in graph.edges():
            eds = graph[s][e]
            st, ed = graph.node[s]['o'], graph.node[e]['o']
            v1s.append(st)
            v2s.append(ed)
            for i in eds:
                pts = eds[i]['pts']
                xs.append(pts[:, 0])
                ys.append(pts[:, 1])
                zs.append(pts[:, 2])
        rs1 = dis[list(np.array(v1s).astype(np.int16).T)]
        rs2 = dis[list(np.array(v2s).astype(np.int16).T)]
        rs1 = list(np.clip(rs1, 2, 1e4) * 0.5)
        rs2 = list(np.clip(rs2, 2, 1e4) * 0.5)
        rs = dis[list(np.array(balls).astype(np.int16).T)]
        rs = list(np.clip(rs, 2, 1e4))
        cs = tuple(np.array(para['ncolor']) / 255.0)
        vts, fs, ns, cs = myvi.build_balls(balls, rs, cs)
        self.frame.viewer.add_surf_asyn('balls', vts, fs, ns, cs)
        meansize = sum(rs) / len(rs)
        vts, fs, pos, h, color = myvi.build_marks(['ID:%s' % i for i in ids],
                                                  balls, rs, meansize,
                                                  (1, 1, 1))
        self.frame.viewer.add_mark_asyn('txt', vts, fs, pos, h, color)

        css = tuple(np.array(para['lcolor']) / 255.0)
        vts, fs, ns, cs = myvi.build_lines(xs, ys, zs, css)
        self.frame.viewer.add_surf_asyn('paths', vts, fs, ns, cs, mode='grid')
        #vts, fs, ns, cs = myvi.build_lines(lxs, lys, lzs, (0,1,0))
        vts, fs, ns, cs = myvi.build_arrows(v1s, v2s, rs1, rs2, 0, 0, css)
        self.frame.viewer.add_surf_asyn('lines', vts, fs, ns, cs)
        self.frame.Raise()
        self.frame = None