コード例 #1
0
def getEdges2D(zone, factor):
    dim = Internal.getZoneDim(zone)
    ni = dim[1]; nj = dim[2]; nk = dim[3]
    l = CPlot.getActivePointIndex()
    if l == []: return None
    i = l[2]; j = l[3]; k = l[4]
    e1 = T.subzone(zone, (1,1,1), (ni,1,1))
    e2 = T.subzone(zone, (1,nj,1), (ni,nj,1))
    e3 = T.subzone(zone, (1,1,1), (1,nj,1))
    e4 = T.subzone(zone, (ni,1,1), (ni,nj,1))
    u = [e1,e2,e3,e4]
    (i,j,k) = forceIJK(i,j,k,ni,nj,nk)
    r = []
    if i == 1:
        ind = j-1
        m = [e3]; u.remove(e3)
        if factor != 1.: r = [e4]; u.remove(e4)
    elif i == ni:
        ind = j-1
        m = [e4]; u.remove(e4)
        if factor != 1.: r = [e3]; u.remove(e3)
    elif j == 1:
        ind = i-1
        m = [e1]; u.remove(e1)
        if factor != 1.: r = [e2]; u.remove(e2)
    elif j == nj:
        ind = i-1
        m = [e2]; u.remove(e2)
        if factor != 1.: r = [e1]; u.remove(e1)
    return m, r, u, ind
コード例 #2
0
def getValue():
    nz = CPlot.getSelectedZone()
    l = CPlot.getActivePointIndex()
    if l == []: return
    field = CPlot.getState('scalarField')
    if field == -1: return
    ind = CPlot.getActivePointIndex()
    nob = CTK.Nb[nz] + 1
    noz = CTK.Nz[nz]
    z = CTK.t[2][nob][2][noz]
    varNames = C.getVarNames(z)[0]
    if len(varNames) > field + 3:
        var = varNames[field + 3]
        val = C.getValue(z, var, ind[0])
        VARS[0].set(str(val))
    else:
        CTK.TXT.insert('START',
                       'Field %d not found. Use scalar mode.\n' % field)
        CTK.TXT.insert('START', 'Error: ', 'Error')
コード例 #3
0
def refineCells():
    if CTK.t == []: return
    if CTK.__MAINTREE__ <= 0:
        CTK.TXT.insert('START', 'Fail on a temporary tree.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error')
        return
    W = WIDGETS['refine']
    if CTK.__BUSY__ == False:
        CPlot.unselectAllZones()
        CTK.__BUSY__ = True
        TTK.sunkButton(W)
        CPlot.setState(cursor=1)
        while CTK.__BUSY__:
            l = []
            while l == []:
                nz = CPlot.getSelectedZone()
                l = CPlot.getActivePointIndex()
                CPlot.unselectAllZones()
                time.sleep(CPlot.__timeStep__)
                W.update()
                if CTK.__BUSY__ == False: break
            if CTK.__BUSY__:
                nob = CTK.Nb[nz] + 1
                noz = CTK.Nz[nz]
                CTK.saveTree()
                z = CTK.t[2][nob][2][noz]
                C._initVars(z, 'centers:__tag__', 0)
                C.setValue(z, 'centers:__tag__', l[1], 1)
                try:
                    z = P.refine(z, '__tag__')
                    CTK.replace(CTK.t, nob, noz, z)
                except:
                    pass
                CTK.TKTREE.updateApp()
                CPlot.render()
        CTK.__BUSY__ = False
        TTK.raiseButton(W)
        CPlot.setState(cursor=0)
    else:
        CTK.__BUSY__ = False
        TTK.raiseButton(W)
        CPlot.setState(cursor=0)
コード例 #4
0
def setSourceEdge():
    if CTK.t == []: return
    if CTK.__MAINTREE__ <= 0:
        CTK.TXT.insert('START', 'Fail on a temporary tree.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error'); return
    nzs = CPlot.getSelectedZones()
    if nzs == []:
        CTK.TXT.insert('START', 'Selection is empty.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error'); return
    selected = ''
    if len(nzs) > 1:
        CTK.TXT.insert('START', 'Only first zone is taken.\n')
        CTK.TXT.insert('START', 'Warning: ', 'Warning')
    nz = nzs[0]
    nob = CTK.Nb[nz]+1
    noz = CTK.Nz[nz]
    z = CTK.t[2][nob][2][noz]
    selected = CTK.t[2][nob][0]+'/'+z[0]
    # ajoute l'indice du point actif
    pt = CPlot.getActivePointIndex()
    selected += ';'+str(pt[2:])
    VARS[3].set(selected)
コード例 #5
0
def modifyPoint(event=None):
    if CTK.t == []: return
    nzs = CPlot.getSelectedZones()
    if nzs == []:
        CTK.TXT.insert('START', 'Selection is empty.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error')
        return
    if len(nzs) > 1:
        CTK.TXT.insert('START', 'Please, select only one zone.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error')
        return
    point = CTK.varsFromWidget(VARS[0].get(), type=1)
    if len(point) != 3:
        CTK.TXT.insert('START', 'Point coords are incorrect.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error')
        return

    nz = nzs[0]
    nob = CTK.Nb[nz] + 1
    noz = CTK.Nz[nz]
    z = CTK.t[2][nob][2][noz]
    ind = CPlot.getActivePointIndex()
    if ind == []:
        CTK.TXT.insert('START', 'No selected point.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error')
        return
    ind = ind[0]

    CTK.saveTree()
    zp = Internal.copyTree(z)
    C.setValue(zp, 'CoordinateX', ind, point[0])
    C.setValue(zp, 'CoordinateY', ind, point[1])
    C.setValue(zp, 'CoordinateZ', ind, point[2])

    CPlot.replace(CTK.t, nob, noz, zp)
    CTK.TXT.insert('START', 'Point modified.\n')
    CPlot.render()
コード例 #6
0
def paint():
    if CTK.t == []: return
    if CTK.__MAINTREE__ <= 0:
        CTK.TXT.insert('START', 'Fail on a temporary tree.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error')
        return

    # get patined var
    field = CPlot.getState('scalarField')
    if field == -1:
        CTK.TXT.insert('START', 'Scalar field is not set.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error')
        return
    CPlot.unselectAllZones()

    CTK.saveTree()
    w = WIDGETS['paint']
    if not CTK.__BUSY__:
        CTK.__BUSY__ = True
        TTK.sunkButton(w)
        CPlot.setState(cursor=1)

        while CTK.__BUSY__ == True:
            l = []
            while l == []:
                nz = CPlot.getSelectedZone()
                l = CPlot.getActivePointIndex()
                #time.sleep(CPlot.__timeStep__)
                w.update()
                if not CTK.__BUSY__: break
            if CTK.__BUSY__:
                nob = CTK.Nb[nz] + 1
                noz = CTK.Nz[nz]
                CTK.saveTree()
                value = float(WIDGETS['value'].get())
                #width = float(WIDGETS['width'].get())
                #brushType = VARS[2].get()
                z = CTK.t[2][nob][2][noz]
                posCam = CPlot.getState('posCam')
                posEye = CPlot.getState('posEye')
                vect = (posEye[0] - posCam[0], posEye[1] - posCam[1],
                        posEye[2] - posCam[2])

                click = CPlot.getActivePoint()
                point = (click[0], click[1], click[2])
                ind = CPlot.getActivePointIndex()
                #hook = C.createHook
                varNames = C.getVarNames(z)[0]
                if len(varNames) > field + 3:
                    var = varNames[field + 3]
                    C.setValue(z, var, ind[0], value)
                else:
                    CTK.TXT.insert(
                        'START',
                        'Field %d not found. Use scalar mode.\n' % field)
                    CTK.TXT.insert('START', 'Error: ', 'Error')
                CTK.replace(CTK.t, nob, noz, z)

                CTK.TKTREE.updateApp()
                CPlot.unselectAllZones()
                CPlot.render()
        CTK.__BUSY__ = False
        TTK.raiseButton(w)
        CPlot.setState(cursor=0)
    else:
        CTK.__BUSY__ = False
        TTK.raiseButton(w)
        CPlot.setState(cursor=0)
コード例 #7
0
def copyDistrib():
    if CTK.t == []: return
    if CTK.__MAINTREE__ <= 0:
        CTK.TXT.insert('START', 'Fail on a temporary tree.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error'); return
    nzs = CPlot.getSelectedZones()
    if nzs == []:
        CTK.TXT.insert('START', 'Selection is empty.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error'); return
    CTK.saveTree()
    # source edge
    v = VARS[3].get()
    v = v.split(';')
    try: pt = eval(v[1])
    except: pt = None
    v = v[0]
    v = v.lstrip(); v = v.rstrip()
    sname = v.split('/', 1)
    edge = []
    bases = Internal.getNodesFromName1(CTK.t, sname[0])
    if bases != []:
        nodes = Internal.getNodesFromType1(bases[0], 'Zone_t')
        for z in nodes:
            if z[0] == sname[1]: edge.append(z)
    if edge == []:
        CTK.TXT.insert('START', 'Invalid source edge.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error'); return
    source = edge[0]
    dimSource = Internal.getZoneDim(source)
    if dimSource[0] == 'Unstructured':
        CTK.TXT.insert('START', 'Invalid source edge.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error'); return

    # Get first selected zone
    nz = nzs[0]
    nob = CTK.Nb[nz]+1
    noz = CTK.Nz[nz]
    zone = CTK.t[2][nob][2][noz]
    dim = Internal.getZoneDim(zone)
    
    # subzone de source eventuellement
    if dimSource[4] == 2: # source est 2D
        ind = CPlot.getActivePointIndex()
        ni = dimSource[1]; nj = dimSource[2]
        deltai = min(ind[2]-ni,ind[2]-1)
        deltaj = min(ind[3]-nj,ind[3]-1)
        if deltai < deltaj:
            source = T.subzone(source, (1,pt[1],pt[2]),(ni,pt[1],pt[2]))
        else:
            source = T.subzone(source, (pt[0],1,pt[2]),(pt[0],nj,pt[2]))
    elif dimSource[4] == 3: # source est 3D
        ind = CPlot.getActivePointIndex()
        ni = dimSource[1]; nj = dimSource[2]; nk = dimSource[3]
        deltai = min(ind[2]-ni,ind[2]-1)
        deltaj = min(ind[3]-nj,ind[3]-1)
        deltak = min(ind[4]-nk,ind[4]-1)
        if deltai < deltaj and deltai < deltak:
            source = T.subzone(source, (1,pt[1],pt[2]),(ni,pt[1],pt[2]))
        elif deltaj < deltai and deltaj < deltak:
            source = T.subzone(source, (pt[0],1,pt[2]),(pt[0],nj,pt[2]))
        else:
            source = T.subzone(source, (pt[0],pt[1],1),(pt[0],pt[1],nk))
    # Extrait la distribution en i
    source = D.getCurvilinearAbscissa(source)
    C._initVars(source, '{CoordinateX}={s}')
    C._initVars(source, 'CoordinateY', 0)
    C._initVars(source, 'CoordinateZ', 0)
    source = C.rmVars(source, 's')
    
    # Traitement
    if dim[0] == 'Structured':
        if dim[2] != 1 and dim[3] != 1: 
            fail = apply3D(1., 1, source, ntype=3)
        elif dim[2] != 1 and dim[3] == 1: 
            fail = apply2D(1., 1, source, ntype=3)
        else: fail = copyDistrib1D(source)
    else: fail = copyDistrib1D(source) # all zones

    if not fail:
        CTK.TXT.insert('START', 'Distribution copy done.\n')
    else:
        CTK.TXT.insert('START', 'Distribution copy fails for at least one zone.\n')
        CTK.TXT.insert('START', 'Warning: ', 'Warning')
    #C._fillMissingVariables(CTK.t)
    (CTK.Nb, CTK.Nz) = CPlot.updateCPlotNumbering(CTK.t)
    CTK.TKTREE.updateApp()
    CPlot.render()
コード例 #8
0
def getEdges3D(zone, factor):
    dim = Internal.getZoneDim(zone)
    ni = dim[1]; nj = dim[2]; nk = dim[3]
    l = CPlot.getActivePointIndex()
    if l == []: return None
    i = l[2]; j = l[3]; k = l[4]
    e1 = T.subzone(zone, (1,1,1), (ni,1,1))
    e2 = T.subzone(zone, (1,nj,1), (ni,nj,1))
    e3 = T.subzone(zone, (1,1,1), (1,nj,1))
    e4 = T.subzone(zone, (ni,1,1), (ni,nj,1))

    e5 = T.subzone(zone, (1,1,nk), (ni,1,nk))
    e6 = T.subzone(zone, (1,nj,nk), (ni,nj,nk))
    e7 = T.subzone(zone, (1,1,nk), (1,nj,nk))
    e8 = T.subzone(zone, (ni,1,nk), (ni,nj,nk))

    e9 = T.subzone(zone, (1,1,1), (1,1,nk))
    e10 = T.subzone(zone, (ni,1,1), (ni,1,nk))
    e11 = T.subzone(zone, (1,nj,1), (1,nj,nk))
    e12 = T.subzone(zone, (ni,nj,1), (ni,nj,nk))

    f1 = T.subzone(zone, (1,1,1), (ni,nj,1))
    f2 = T.subzone(zone, (1,1,nk), (ni,nj,nk))
    f3 = T.subzone(zone, (1,1,1), (ni,1,nk))
    f4 = T.subzone(zone, (1,nj,1), (ni,nj,nk))
    f5 = T.subzone(zone, (1,1,1), (1,nj,nk))
    f6 = T.subzone(zone, (ni,1,1), (ni,nj,nk))
    
    ue = [e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12] # unmodified edges
    uf = [f1,f2,f3,f4,f5,f6] # unmodified faces

    #temp = C.newPyTree(['Base'])
    #temp[2][1][2] += ue
    #temp[2][1][2] += uf
    #C.convertPyTree2File(temp, 'edges.cgns')

    (i,j,k) = forceIJK(i,j,k,ni,nj,nk)

    r = [] # refined edges
    if (i == 1 and j == 1):
        ind = k-1
        m = [e9]
        f = [f3,f5]
        if (factor != 1.): r = [e11,e12,e10]; f += [f4,f6]

    elif (i == ni and j == 1):
        ind = k-1
        m = [e10]
        f = [f6,f3]
        if (factor != 1.): 
            r = [e9,e11,e12]
            f += [f5,f4]

    elif (i == 1 and j == nj):
        ind = k-1
        m = [e11]
        f = [f5,f4]
        if (factor != 1.): r = [e9,e10,e12]; f += [f3,f6]

    elif (i == ni and j == nj):
        ind = k-1
        m = [e12]
        f = [f6,f4]
        if (factor != 1.): r = [e10,e9,e11]; f += [f3,f5]

    elif (i == 1 and k == 1):
        ind = j-1
        m = [e3]
        f = [f1,f5]
        if (factor != 1.): r = [e4,e8,e7]; f += [f2,f6]

    elif (i == ni and k == 1):
        ind = j-1
        m = [e4]
        f = [f6,f1]
        if (factor != 1.): r = [e3,e8,e7]; f += [f2,f5]

    elif (i == 1 and k == nk):
        ind = j-1
        m = [e7]
        f = [f5,f2]
        if (factor != 1.): r = [e8,e4,e3]; f += [f6,f1]

    elif (i == ni and k == nk):
        ind = j-1
        m = [e8]
        f = [f6,f2]
        if (factor != 1.): r = [e7,e3,e4]; f += [f5,f1]

    elif (j == 1 and k == 1):
        ind = i-1
        m = [e1]
        f = [f1,f3]
        if (factor != 1.): r = [e2,e6,e5]; f += [f2,f4]

    elif (j == nj and k == 1):
        ind = i-1
        m = [e2]
        f = [f4,f1]
        if (factor != 1.): r = [e1,e6,e5]; f += [f2,f3]

    elif (j == 1 and k == nk):
        ind = i-1
        m = [e5]
        f = [f2,f3]
        if (factor != 1.): r = [e6,e2,e1]; f += [f1,f4]

    elif (j == nj and k == nk):
        ind = i-1
        m = [e6]
        f = [f2,f4]
        if (factor != 1.): r = [e5,e1,e2]; f += [f3,f1]

    for i in m+r: ue.remove(i)
    for i in f: uf.remove(i)
    return m, r, f, ue, uf, ind
コード例 #9
0
def stretch1D(h):
    fail = False
    nzs = CPlot.getSelectedZones()
    nz = nzs[0]
    nob = CTK.Nb[nz]+1
    noz = CTK.Nz[nz]
    z = CTK.t[2][nob][2][noz]
    dims = Internal.getZoneDim(z)
    try:
        if dims[0] == 'Unstructured': a = C.convertBAR2Struct(z)
        else: a = z
    except Exception as e:
        #print 'Error: stretch1D: %s.'%str(e)
        Panels.displayErrors([0,str(e)], header='Error: stretch1D')
        return True # Fail

    ind = CPlot.getActivePointIndex()
    if ind == []: return True # Fail
    ind = ind[0]
    
    l = D.getLength(a)
    a = D.getCurvilinearAbscissa(a)
    zp = D.getCurvilinearAbscissa(z)
    distrib = C.cpVars(a, 's', a, 'CoordinateX')
    C._initVars(distrib, 'CoordinateY', 0.)
    C._initVars(distrib, 'CoordinateZ', 0.)
    distrib = C.rmVars(distrib, 's')
    
    N = dims[1]
    val = C.getValue(zp, 's', ind)
    
    Xc = CPlot.getActivePoint()
    valf = val
    Pind = C.getValue(z, 'GridCoordinates', ind)
    if ind < N-1: # cherche avec indp1
        Pindp1 = C.getValue(z, 'GridCoordinates', ind+1)
        v1 = Vector.sub(Pindp1, Pind)
        v2 = Vector.sub(Xc, Pind)
        if Vector.dot(v1,v2) >= 0:
            val2 = C.getValue(zp, 's', ind+1)
            alpha = Vector.norm(v2)/Vector.norm(v1)
            valf = val+alpha*(val2-val)
    if ind > 0 and val == valf: # cherche avec indm1
        Pindm1 = C.getValue(z, 'GridCoordinates', ind-1)
        v1 = Vector.sub(Pindm1, Pind)
        v2 = Vector.sub(Xc, Pind)
        if Vector.dot(v1,v2) >= 0:
            val2 = C.getValue(zp, 's', ind-1)
            alpha = Vector.norm(v2)/Vector.norm(v1)
            valf = val+alpha*(val2-val)
    
    if h < 0: # enforce point
        distrib = G.enforcePoint(distrib, valf)
    else: # enforce h
        if val == 0: distrib = G.enforcePlusX(distrib, h/l, N/10, 1)
        elif val == 1: distrib = G.enforceMoinsX(distrib, h/l, N/10, 1)
        else: distrib = G.enforceX(distrib, valf, h/l, N/10, 1)
    try:
        a1 = G.map(a, distrib)
        CTK.replace(CTK.t, nob, noz, a1)
    except Exception as e:
        fail = True
        Panels.displayErrors([0,str(e)], header='Error: stretch1D')
    return fail
コード例 #10
0
def sculpt():
    if CTK.t == []: return
    if CTK.__MAINTREE__ <= 0:
        CTK.TXT.insert('START', 'Fail on a temporary tree.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error')
        return

    TOOLS = createTools()
    #CTK.display(TOOLS)

    bbox = G.bbox(CTK.t)
    size = max(bbox[3] - bbox[0], bbox[4] - bbox[1], bbox[5] - bbox[2])
    CPlot.unselectAllZones()

    w = WIDGETS['sculpt']
    if CTK.__BUSY__ == False:
        CTK.__BUSY__ = True
        TTK.sunkButton(w)
        CPlot.setState(cursor=1)
        while CTK.__BUSY__:
            l = []
            while l == []:
                nz = CPlot.getSelectedZone()
                l = CPlot.getActivePointIndex()
                time.sleep(CPlot.__timeStep__)
                w.update()
                if (CTK.__BUSY__ == False): break
            if CTK.__BUSY__:
                nob = CTK.Nb[nz] + 1
                noz = CTK.Nz[nz]
                CTK.saveTree()
                depth = 0.5 * WIDGETS['depth'].get() / 100.
                depth = size * depth
                width = 0.5 * WIDGETS['width'].get() / 100.
                width = size * width
                brushType = VARS[2].get()
                z = CTK.t[2][nob][2][noz]
                posCam = CPlot.getState('posCam')
                posEye = CPlot.getState('posEye')
                vect = (posEye[0] - posCam[0], posEye[1] - posCam[1],
                        posEye[2] - posCam[2])
                if brushType == 'Deform':
                    click = CPlot.getActivePoint()
                    point = (click[0], click[1], click[2])
                    z = T.deformPoint(z, point, vect, depth, width)
                    CTK.replace(CTK.t, nob, noz, z)
                elif brushType == 'Sphere':
                    click = CPlot.getActivePoint()
                    center = (click[0], click[1], click[2])
                    s = D.sphere(center, depth, N=10)
                    s = C.convertArray2Tetra(s)
                    s = G.close(s)
                    z = C.convertArray2Tetra(z)
                    z = G.close(z)
                    z = XOR.booleanMinus(z, s)
                    CTK.replace(CTK.t, nob, noz, z)
                elif brushType == 'Cube':
                    click = CPlot.getActivePoint()
                    center = (click[0], click[1], click[2])
                    s = D.sphere(center, depth, N=20)
                    s = C.convertArray2Tetra(s)
                    s = G.close(s)
                    z = C.convertArray2Tetra(z)
                    z = G.close(z)
                    z = XOR.booleanMinus(z, s)
                    CTK.replace(CTK.t, nob, noz, z)
                CTK.TKTREE.updateApp()
                CPlot.unselectAllZones()
                CPlot.render()
        CTK.__BUSY__ = False
        TTK.raiseButton(w)
        CPlot.setState(cursor=0)
    else:
        CTK.__BUSY__ = False
        TTK.raiseButton(w)
        CPlot.setState(cursor=0)
コード例 #11
0
def display1D(event=None):
    if CTK.t == []: return

    # Get slot
    try:
        slot = int(VARS[5].get())
    except:
        slot = 0
    # Get grid size
    try:
        gridSize = VARS[1].get()
        grids = gridSize.split(';')
        if (len(grids) == 1): gridSize = (int(grids[0]), 1)
        else: gridSize = (int(grids[0]), int(grids[1]))
    except:
        gridSize = (1, 1)
    CPlot.setState(gridSize=gridSize)
    # Get grid pos
    try:
        gridPos = VARS[2].get()
        grids = gridPos.split(';')
        if (len(grids) == 1): gridPos = (int(grids[0]), 1)
        else: gridPos = (int(grids[0]), int(grids[1]))
    except:
        gridPos = (0, 0)

    # Recupere la direction pour la coupe ou 'Elements'
    dir = VARS[0].get()
    if dir == 'None':
        CPlot.display1D([], slot=slot)
        return  # clear

    # Recupere le pt pour la coupe ou les elements 1D
    if dir == 'Elements':  # elements -> recupere les elements
        if CTK.__MAINTREE__ <= 0:
            CTK.TXT.insert('START', 'Fail on a temporary tree.\n')
            CTK.TXT.insert('START', 'Error: ', 'Error')
            return
        nzs = CPlot.getSelectedZones()
        if nzs == []:
            CTK.TXT.insert('START', 'Selection is empty.\n')
            CTK.TXT.insert('START', 'Error: ', 'Error')
            return
        points = []
        for nz in nzs:
            nob = CTK.Nb[nz] + 1
            noz = CTK.Nz[nz]
            z = CTK.t[2][nob][2][noz]
            selected = CTK.t[2][nob][0] + '/' + z[0]
            points.append(selected)
    elif (dir == 'I' or dir == 'J'
          or dir == 'K'):  # indice -> recupere les indices + la zone
        if (CTK.__MAINTREE__ <= 0):
            CTK.TXT.insert('START', 'Fail on a temporary tree.\n')
            CTK.TXT.insert('START', 'Error: ', 'Error')
            return
        nz = CPlot.getSelectedZone()
        if (nz == -1):
            CTK.TXT.insert('START', 'Selection is empty.\n')
            CTK.TXT.insert('START', 'Error: ', 'Error')
            return
        points = []
        nob = CTK.Nb[nz] + 1
        noz = CTK.Nz[nz]
        z = CTK.t[2][nob][2][noz]
        selected = CTK.t[2][nob][0] + '/' + z[0]
        index = CPlot.getActivePointIndex()
        points = (selected, index)
    else:  # les coupes -> recupere les coord du pt
        point = CPlot.getActivePoint()
        if point == []: point = (0., 0., 0.)

    # Recupere les variables a afficher
    var1 = VARS[3].get()
    var1 = var1.replace('centers:', '')
    var2 = VARS[4].get()
    var2 = var2.replace('centers:', '')

    # Recupere les zones actives
    actives = []
    zones = Internal.getZones(CTK.t)
    if CTK.__MAINTREE__ == 1:
        nzs = CPlot.getActiveZones()
        for nz in nzs:
            actives.append(zones[nz])
    else:
        actives = zones
    if actives == []: return

    if (dir == 'X (Y)'):
        elts = P.isoSurfMC(actives, 'CoordinateY', point[1])
        if elts != []:
            elts2 = P.isoSurfMC(elts, 'CoordinateZ', point[2])
            if (elts2 != []): elts = elts2
    elif (dir == 'Y (X)'):
        elts = P.isoSurfMC(actives, 'CoordinateX', point[0])
        if elts != []:
            elts2 = P.isoSurfMC(elts, 'CoordinateZ', point[2])
            if (elts2 != []): elts = elts2
    elif (dir == 'Z (X)'):
        elts = P.isoSurfMC(actives, 'CoordinateX', point[0])
        if (elts != []):
            elts2 = P.isoSurfMC(elts, 'CoordinateY', point[1])
            if (elts2 != []): elts = elts2
    elif (dir == 'X (Z)'):
        elts = P.isoSurfMC(actives, 'CoordinateZ', point[2])
        if elts != []:
            elts2 = P.isoSurfMC(elts, 'CoordinateY', point[1])
            if (elts2 != []): elts = elts2
    elif (dir == 'Y (Z)'):
        elts = P.isoSurfMC(actives, 'CoordinateZ', point[2])
        if elts != []:
            elts2 = P.isoSurfMC(elts, 'CoordinateX', point[0])
            if (elts2 != []): elts = elts2
    elif (dir == 'Z (Y)'):
        elts = P.isoSurfMC(actives, 'CoordinateY', point[1])
        if (elts != []):
            elts2 = P.isoSurfMC(elts, 'CoordinateX', point[0])
            if (elts2 != []): elts = elts2
    elif (dir == 'I'):
        v = points[0]
        ind = points[1]
        v = v.lstrip()
        v = v.rstrip()
        sname = v.split('/', 1)
        bases = Internal.getNodesFromName1(CTK.t, sname[0])
        elts = []
        if bases != []:
            zones = Internal.getNodesFromType1(bases[0], 'Zone_t')
            for z in zones:
                if (z[0] == sname[1]):
                    try:
                        zp = C.center2Node(z, Internal.__FlowSolutionCenters__)
                        zp = T.subzone(zp, (1, ind[3], ind[4]),
                                       (-1, ind[3], ind[4]))
                        elts.append(zp)
                    except:
                        pass
    elif (dir == 'J'):
        v = points[0]
        ind = points[1]
        v = v.lstrip()
        v = v.rstrip()
        sname = v.split('/', 1)
        bases = Internal.getNodesFromName1(CTK.t, sname[0])
        elts = []
        if bases != []:
            zones = Internal.getNodesFromType1(bases[0], 'Zone_t')
            for z in zones:
                if (z[0] == sname[1]):
                    try:
                        zp = C.center2Node(z, Internal.__FlowSolutionCenters__)
                        zp = T.subzone(zp, (ind[2], 1, ind[4]),
                                       (ind[2], -1, ind[4]))
                        elts.append(zp)
                    except:
                        pass
    elif (dir == 'K'):
        v = points[0]
        ind = points[1]
        v = v.lstrip()
        v = v.rstrip()
        sname = v.split('/', 1)
        bases = Internal.getNodesFromName1(CTK.t, sname[0])
        elts = []
        if bases != []:
            zones = Internal.getNodesFromType1(bases[0], 'Zone_t')
            for z in zones:
                if (z[0] == sname[1]):
                    try:
                        zp = C.center2Node(z, Internal.__FlowSolutionCenters__)
                        zp = T.subzone(zp, (ind[2], ind[3], 1),
                                       (ind[2], ind[3], -1))
                        elts.append(zp)
                    except:
                        pass
    elif (dir == 'Elements'):
        elts = []
        for v in points:
            v = v.lstrip()
            v = v.rstrip()
            sname = v.split('/', 1)
            bases = Internal.getNodesFromName1(CTK.t, sname[0])
            if (bases != []):
                zones = Internal.getNodesFromType1(bases[0], 'Zone_t')
                for z in zones:
                    if (z[0] == sname[1]): elts.append(z)
    if elts == []:
        CTK.TXT.insert('START', 'Nothing to display.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error')
        return

    try:
        elts = D.getCurvilinearAbscissa(elts)
    except:
        pass

    # Fit first axis
    pos = WIDGETS['rangePos'].get() / 50. - 1.
    zoom = WIDGETS['rangeZoom'].get() / 120.
    minv1 = C.getMinValue(elts, var1)
    maxv1 = C.getMaxValue(elts, var1)
    if (maxv1 - minv1 < 1.e-6):
        maxv1 += 5.e-7
        minv1 -= 5.e-7

    # active point localisation
    nz = CPlot.getSelectedZone()
    if (nz != -1):
        ind = CPlot.getActivePointIndex()
        nob = CTK.Nb[nz] + 1
        noz = CTK.Nz[nz]
        z = CTK.t[2][nob][2][noz]
        f1 = C.getValue(z, var1, ind[0])
        try:
            r1min = (f1 - minv1) * zoom + minv1 + pos * (1. - zoom) * (maxv1 -
                                                                       minv1)
            r1max = (f1 - maxv1) * zoom + maxv1 + pos * (1. - zoom) * (maxv1 -
                                                                       minv1)
        except:  # var1 not found in z, le cherche dans elts
            xf1 = C.getValue(z, 'CoordinateX', ind[0])
            yf1 = C.getValue(z, 'CoordinateY', ind[0])
            zf1 = C.getValue(z, 'CoordinateZ', ind[0])
            f1 = minv1 + 0.5 * (maxv1 - minv1)
            r1min = 0.5 * (maxv1 - minv1) * zoom + minv1 + pos * (
                1. - zoom) * (maxv1 - minv1)
            r1max = -0.5 * (maxv1 - minv1) * zoom + maxv1 + pos * (
                1. - zoom) * (maxv1 - minv1)
    else:
        f1 = minv1 + 0.5 * (maxv1 - minv1)
        r1min = 0.5 * (maxv1 - minv1) * zoom + minv1 + pos * (1. - zoom) * (
            maxv1 - minv1)
        r1max = -0.5 * (maxv1 - minv1) * zoom + maxv1 + pos * (1. - zoom) * (
            maxv1 - minv1)

    # Fit second axis
    p = P.selectCells(
        elts,
        '({%s} < %20.16g) & ({%s} > %20.16g)' % (var1, r1max, var1, r1min))
    minv2 = C.getMinValue(p, var2)
    maxv2 = C.getMaxValue(p, var2)

    # display
    CPlot.display1D(p,
                    slot=slot,
                    bgBlend=0.,
                    gridPos=gridPos,
                    var1=var1,
                    var2=var2,
                    r1=(r1min, r1max),
                    r2=(minv2, maxv2))
    CTK.TXT.insert('START', 'Plot displayed.\n')