예제 #1
0
def getInfo(event=None):
    posCam = CPlot.getState('posCam')
    posEye = CPlot.getState('posEye')
    dirCam = CPlot.getState('dirCam')
    VARS[0].set('(%f,% f, %f)'%(posCam[0],posCam[1],posCam[2]))
    VARS[1].set('(%f, %f, %f)'%(posEye[0],posEye[1],posEye[2]))
    VARS[2].set('(%f, %f, %f)'%(dirCam[0],dirCam[1],dirCam[2]))
예제 #2
0
def rotate(event=None):
    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
    axis = VARS[2].get()
    angle = CTK.varsFromWidget(VARS[3].get(), type=1)
    if len(angle) == 1:
        angle = angle[0]
        X = None
    elif len(angle) == 4:
        X = (angle[1], angle[2], angle[3])
        angle = angle[0]
    else:
        CTK.TXT.insert('START', 'Invalid angle or angle+rotation center.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error')
        return
    if axis == 'around X': axe = (1., 0., 0.)
    elif axis == 'around Y': axe = (0., 1., 0.)
    elif axis == 'around Z': axe = (0., 0., 1.)
    elif axis == 'around view':
        pos = CPlot.getState('posCam')
        eye = CPlot.getState('posEye')
        axe = (eye[0] - pos[0], eye[1] - pos[1], eye[2] - pos[2])
    else:
        axe = (0., 0., 1.)
    try:
        angle = float(angle)
    except:
        angle = 0.

    nzs = CPlot.getSelectedZones()
    if nzs == []:
        CTK.TXT.insert('START', 'Selection is empty.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error')
        return

    CTK.saveTree()
    if X is None:
        sel = []
        for nz in nzs:
            nob = CTK.Nb[nz] + 1
            noz = CTK.Nz[nz]
            z = CTK.t[2][nob][2][noz]
            sel.append(z)
        X = G.barycenter(sel)

    for nz in nzs:
        nob = CTK.Nb[nz] + 1
        noz = CTK.Nz[nz]
        a = T.rotate(CTK.t[2][nob][2][noz], (X[0], X[1], X[2]), axe, angle)
        CTK.replace(CTK.t, nob, noz, a)
    CTK.TXT.insert('START', 'Zones have been rotated.\n')
    CTK.TKTREE.updateApp()
    CPlot.render()
예제 #3
0
def find(event=None):
    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
    if len(nzs) != 1:
        CTK.TXT.insert('START', 'Only one block must be selected.\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]
    type = VARS[0].get()
    if type == 'Node index':
        inds = CTK.varsFromWidget(VARS[1].get(), type=3)
        if len(inds) == 0:
            CTK.TXT.insert('START', 'Invalid index.\n')
            CTK.TXT.insert('START', 'Error: ', 'Error')
            return
        [px, py, pz] = C.getValue(z, Internal.__GridCoordinates__, inds[0])
        CTK.TXT.insert('START', 'Node %s found.\n' % VARS[1].get())
    elif type == 'Coordinates':
        vars = CTK.varsFromWidget(VARS[1].get(), type=1)
        if len(vars) != 3:
            CTK.TXT.insert('START', 'Invalid coordinates.\n')
            CTK.TXT.insert('START', 'Error: ', 'Error')
            return
        [px, py, pz] = vars
        CTK.TXT.insert('START', 'Coordinates %s found.\n' % VARS[1].get())
    else:  # type = element index
        inds = CTK.varsFromWidget(VARS[1].get(), type=3)
        if len(inds) == 0:
            CTK.TXT.insert('START', 'Invalid index.\n')
            CTK.TXT.insert('START', 'Error: ', 'Error')
            return
        zp = Internal.copyRef(z)
        C._deleteAllBCAndSolutions__(zp)
        zp = C.node2Center(z)
        [px, py, pz] = C.getValue(zp, Internal.__GridCoordinates__, inds[0])
        CTK.TXT.insert('START', 'Element %s found.\n' % VARS[1].get())

    (xeye, yeye, zeye) = CPlot.getState('posEye')
    (xcam, ycam, zcam) = CPlot.getState('posCam')
    dx = xcam - xeye
    dy = ycam - yeye
    dz = zcam - zeye
    CPlot.setState(posEye=(px, py, pz))
    CPlot.setState(posCam=(px + dx, py + dy, pz + dz))
    CPlot.setActivePoint(px, py, pz)
예제 #4
0
def createText(event=None):
    CTK.saveTree()
    text = VARS[0].get()
    type = VARS[1].get()
    font = VARS[3].get()

    smoothness = VARS[2].get()
    smooth = 0
    if smoothness == 'Regular': smooth = 0
    elif smoothness == 'Smooth': smooth = 2
    elif smoothness == 'Very smooth': smooth = 4
    CTK.t = C.addBase2PyTree(CTK.t, 'TEXT', 3)
    nodes = Internal.getNodesFromName1(CTK.t, 'TEXT')
    base = nodes[0]
    if type == '3D': a = D.text3D(text, smooth=smooth, font=font)
    elif type == '2D': a = D.text2D(text, smooth=smooth, font=font)
    elif type == '1D':
        a = D.text1D(text, smooth=smooth, font=font)
        a = C.convertArray2Tetra(a)
        a = T.join(a)

    # Modification de l'angle, de la position et de la taille du texte
    # en fonction du point de vue
    posCam = CPlot.getState('posCam')
    posEye = CPlot.getState('posEye')
    dirCam = CPlot.getState('dirCam')
    BB = G.bbox(a)
    xc = 0.5 * (BB[3] + BB[0])
    yc = 0.5 * (BB[4] + BB[1])
    zc = 0.5 * (BB[5] + BB[2])
    a = T.translate(a, (posEye[0] - xc, posEye[1] - yc, posEye[2] - zc))
    lx = posEye[0] - posCam[0]
    ly = posEye[1] - posCam[1]
    lz = posEye[2] - posCam[2]
    if (lx * lx + ly * ly + lz * lz == 0.): lx = -1
    if (dirCam[0] * dirCam[0] + dirCam[1] * dirCam[1] +
            dirCam[2] * dirCam[2] == 0.):
        dirCam = (0, 0, 1)
    ll = math.sqrt(lx * lx + ly * ly + lz * lz)
    a = T.homothety(a, (posEye[0], posEye[1], posEye[2]), 0.01 * ll)
    ux = dirCam[1] * lz - dirCam[2] * ly
    uy = dirCam[2] * lx - dirCam[0] * lz
    uz = dirCam[0] * ly - dirCam[1] * lx
    a = T.rotate(a, (posEye[0], posEye[1], posEye[2]),
                 ((1, 0, 0), (0, 1, 0), (0, 0, 1)),
                 ((-ux, -uy, -uz), dirCam, (lx, ly, lz)))

    nob = C.getNobOfBase(base, CTK.t)
    CTK.add(CTK.t, nob, -1, a)
    #C._fillMissingVariables(CTK.t)
    CTK.TXT.insert('START', 'Text created.\n')
    (CTK.Nb, CTK.Nz) = CPlot.updateCPlotNumbering(CTK.t)
    CTK.TKTREE.updateApp()
    CPlot.render()
def dirProject():
    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
    # surfaces
    name = VARS[0].get()
    names = name.split(';')
    surfaces = []
    for v in names:
        v = v.lstrip()
        v = v.rstrip()
        sname = v.split('/', 1)
        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]): surfaces.append(z)
    if (surfaces == []):
        CTK.TXT.insert('START', 'Projection surface is empty.\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

    eye = CPlot.getState('posEye')
    cam = CPlot.getState('posCam')
    dir = (eye[0] - cam[0], eye[1] - cam[1], eye[2] - cam[2])
    CTK.saveTree()
    fail = False
    errors = []
    for nz in nzs:
        nob = CTK.Nb[nz] + 1
        noz = CTK.Nz[nz]
        z = CTK.t[2][nob][2][noz]
        try:
            a = T.projectDir(z, surfaces, dir)
            CTK.replace(CTK.t, nob, noz, a)
        except Exception as e:
            fail = True
            errors += [0, str(e)]

    if (fail == False):
        CTK.TXT.insert('START', 'Zones projected.\n')
    else:
        Panels.displayErrors(errors, header='Error: projectDir')
        CTK.TXT.insert('START', 'Projection fails for at least one zone.\n')
        CTK.TXT.insert('START', 'Warning: ', 'Warning')
    CTK.TKTREE.updateApp()
    CPlot.render()
예제 #6
0
def rotate():
    if CTK.t == []: return
    if not CTK.__BUSY__:
        bb = G.bbox(CTK.t)
        xc = 0.5 * (bb[3] + bb[0])
        yc = 0.5 * (bb[4] + bb[1])
        zc = 0.5 * (bb[5] + bb[2])
        pos = CPlot.getState('posCam')
        posCam = [pos[0], pos[1], pos[2]]
        posEye = [xc, yc, zc]
        dirCam = [0, 0, 1]
        CTK.__BUSY__ = True
        TTK.sunkButton(WIDGETS['rotate'])
        CPlot.setState(cursor=2)
        i = 0
        while CTK.__BUSY__:
            speed = WIDGETS['speed'].get() * 0.0006 / 100.
            cs = math.cos(speed * i * math.pi / 180)
            ss = math.sin(speed * i * math.pi / 180)
            px = cs * (posCam[0] - xc) + ss * (posCam[1] - yc) + xc
            py = -ss * (posCam[0] - xc) + cs * (posCam[1] - yc) + yc
            posCam[0] = px
            posCam[1] = py
            CPlot.setState(posCam=posCam)
            time.sleep(CPlot.__timeStep__)
            WIDGETS['rotate'].update()
            i += 1
        CTK.__BUSY__ = False
        TTK.raiseButton(WIDGETS['rotate'])
        CPlot.setState(cursor=0)
    else:
        CTK.__BUSY__ = False
        TTK.raiseButton(WIDGETS['rotate'])
        CPlot.setState(cursor=0)
예제 #7
0
def translate():
    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
    v = CTK.varsFromWidget(VARS[0].get(), type=1)
    if len(v) != 3:
        CTK.TXT.insert('START', 'Translation vector is incorrect.\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()
    axis = VARS[6].get()
    if axis == 'along view':
        posCam = CPlot.getState('posCam')
        posEye = CPlot.getState('posEye')
        dirCam = CPlot.getState('dirCam')
        axe1 = (posEye[0] - posCam[0], posEye[1] - posCam[1],
                posEye[2] - posCam[2])
        axe2 = dirCam
        axe3 = (axe1[1] * axe2[2] - axe1[2] * axe2[1],
                axe1[2] * axe2[0] - axe1[0] * axe2[2],
                axe1[0] * axe2[1] - axe1[1] * axe2[0])
        axe1 = Vector.normalize(axe1)
        axe2 = Vector.normalize(axe2)
        axe3 = Vector.normalize(axe3)
        ax = v[0] * axe1[0] + v[1] * axe2[0] + v[2] * axe3[0]
        ay = v[0] * axe1[1] + v[1] * axe2[1] + v[2] * axe3[1]
        az = v[0] * axe1[2] + v[1] * axe2[2] + v[2] * axe3[2]
        v[0] = ax
        v[1] = ay
        v[2] = az

    for nz in nzs:
        nob = CTK.Nb[nz] + 1
        noz = CTK.Nz[nz]
        a = T.translate(CTK.t[2][nob][2][noz], (v[0], v[1], v[2]))
        CTK.replace(CTK.t, nob, noz, a)
    CTK.TXT.insert('START', 'Zones have been translated.\n')
    CTK.TKTREE.updateApp()
    CPlot.render()
예제 #8
0
def writeCassiopeeLamps(file):
    type = VARS[2].get()

    eye = CPlot.getState('posEye')
    cam = CPlot.getState('posCam')
    dir = CPlot.getState('dirCam')
    d = Vector.sub(eye, cam)
    n = Vector.cross(d, dir)
    dir = Vector.normalize(dir)
    n = Vector.normalize(n)
    norm = Vector.norm(d)
    d = Vector.normalize(d)
    n = Vector.sub(n, dir)
    n = Vector.add(n, d)
    n = Vector.mul(0.4 * norm, n)
    pos = Vector.sub(eye, n)

    if type == 'Interior':
        pass
        ##         # distant light
        ##         file.write('AttributeBegin\n')
        ##         file.write('LightGroup "default"\n')
        ##         file.write('Exterior "world"\n')
        ##         file.write('LightSource "distant"\n')
        ##         file.write('      "point from" ['+
        ##                    str(pos[0])+' '+str(pos[1])+' '+str(pos[2])+
        ##                    '] "point to" ['+
        ##                    str(eye[0])+' '+str(eye[1])+' '+str(eye[2])+']\n')
        ##         file.write('      "color L" [5 5 5]\n')
        ##         file.write('AttributeEnd\n')

    else:  # Exterior
        # sun/sky
        sundir = Vector.sub(pos, eye)
        sundir = Vector.normalize(sundir)
        file.write('AttributeBegin\n')
        file.write('LightGroup "default"\n')
        file.write('Exterior "world"\n')
        file.write('LightSource "sunsky"\n')
        file.write('      "vector sundir" [' + str(sundir[0]) + ' ' +
                   str(sundir[1]) + ' ' + str(sundir[2]) + ']\n')
        file.write('      "float turbidity" [2.0]\n')
        file.write('      "float gain" [0.005]\n')
        file.write('AttributeEnd\n')
예제 #9
0
def fly():
    if CTK.t == []: return
    if not CTK.__BUSY__:
        bb = G.bbox(CTK.t)
        xc = 0.5 * (bb[3] + bb[0])
        yc = 0.5 * (bb[4] + bb[1])
        zc = 0.5 * (bb[5] + bb[2])
        pos = CPlot.getState('posCam')
        posCam = [pos[0], pos[1], pos[2]]
        step = 0.0001
        sigma = 10
        beta = 8 / 3
        ro = 28
        CTK.__BUSY__ = True
        TTK.sunkButton(WIDGETS['fly'])
        CPlot.setState(cursor=2)
        i = 0
        while CTK.__BUSY__:
            speed = WIDGETS['speed'].get() / 50.
            CPlot.setState(posCam=posCam)
            time.sleep(CPlot.__timeStep__)
            x = posCam[0] - xc
            y = posCam[2] - yc
            z = posCam[1] - zc
            x = 10 * x / max((bb[3] - bb[0]), 1.e-10)
            y = 10 * y / max((bb[4] - bb[1]), 1.e-10)
            z = 30 * z / max((bb[5] - bb[2]), 1.e-10)
            xp = x + step * speed * sigma * (y - x)
            yp = y + step * speed * (ro * x - y - x * z)
            zp = z + step * speed * (x * y - beta * z)
            xp = xp * (bb[3] - bb[0]) * 0.1 + xc
            yp = yp * (bb[4] - bb[1]) * 0.1 + yc
            zp = zp * (bb[5] - bb[2]) / 30. + zc
            posCam[0] = xp
            posCam[1] = zp
            posCam[2] = yp
            WIDGETS['fly'].update()
            i += 1
        CTK.__BUSY__ = False
        TTK.raiseButton(WIDGETS['fly'])
        CPlot.setState(cursor=0)
    else:
        CTK.__BUSY__ = False
        TTK.raiseButton(WIDGETS['fly'])
        CPlot.setState(cursor=0)
예제 #10
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')
예제 #11
0
def createBox(half=0, zpos=0):
    alpha = CTK.varsFromWidget(VARS[1].get(), type=2)
    if len(alpha) == 1:
        ax = alpha[0]
        ay = alpha[0]
        az = alpha[0]
        bx = alpha[0]
        by = alpha[0]
        bz = alpha[0]
    elif len(alpha) == 3:
        ax = alpha[0]
        ay = alpha[1]
        az = alpha[2]
        bx = alpha[0]
        by = alpha[1]
        bz = alpha[2]
    elif len(alpha) == 6:
        ax = alpha[0]
        ay = alpha[1]
        az = alpha[2]
        bx = alpha[3]
        by = alpha[4]
        bz = alpha[5]
    else:
        CTK.TXT.insert('START', 'Borders factor incorrect.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error')
        return

    if zpos == 1: az = 0  # force zmin

    posCam = CPlot.getState('posCam')
    posEye = CPlot.getState('posEye')
    LX = posEye[0] - posCam[0]
    LY = posEye[1] - posCam[1]
    LZ = posEye[2] - posCam[2]

    try:
        box = G.bbox(CTK.t)
    except:
        box = [0, 0, 0, 1, 1, 1]
    hx = box[3] - box[0]
    hy = box[4] - box[1]
    hz = box[5] - box[2]
    if hx < 1.e-10: hx = 0.1
    if hy < 1.e-10: hy = 0.1
    if hz < 1.e-10: hz = 0.1
    hx = hx * 0.5
    hy = hy * 0.5
    hz = hz * 0.5
    ni = 3 + ax + bx
    nj = 3 + ay + by
    nk = 3 + az + bz

    if LX < 0:
        # plan xmin
        b1 = G.cart((box[0] - ax * hx, box[1] - ay * hy, box[2] - az * hz),
                    (hx, hy, hz), (1, nj, nk))
    else:
        # plan xmax
        b1 = G.cart((box[3] + bx * hx, box[1] - ay * hy, box[2] - az * hz),
                    (hx, hy, hz), (1, nj, nk))
    b1 = CPlot.addRender2Zone(b1,
                              material='Solid',
                              color='White',
                              meshOverlay=1)

    if LY < 0:
        # plan ymin
        b2 = G.cart((box[0] - ax * hx, box[1] - ay * hy, box[2] - az * hz),
                    (hx, hy, hz), (ni, 1, nk))
    else:
        # plan ymax
        b2 = G.cart((box[0] - ax * hx, box[4] + by * hy, box[2] - az * hz),
                    (hx, hy, hz), (ni, 1, nk))
    b2 = CPlot.addRender2Zone(b2,
                              material='Solid',
                              color='White',
                              meshOverlay=1)
    if LZ < 0:
        # plan zmin
        b3 = G.cart((box[0] - ax * hx, box[1] - ay * hy, box[2] - az * hz),
                    (hx, hy, hz), (ni, nj, 1))
    else:
        b3 = G.cart((box[0] - ax * hx, box[1] - ay * hy, box[5] + bz * hz),
                    (hx, hy, hz), (ni, nj, 1))
    b3 = CPlot.addRender2Zone(b3,
                              material='Solid',
                              color='White',
                              meshOverlay=1)

    if half == 1: return [b1, b2, b3]

    if LX >= 0:
        # plan xmin
        b4 = G.cart((box[0] - ax * hx, box[1] - ay * hy, box[2] - az * hz),
                    (hx, hy, hz), (1, nj, nk))
    else:
        # plan xmax
        b4 = G.cart((box[3] + bx * hx, box[1] - ay * hy, box[2] - az * hz),
                    (hx, hy, hz), (1, nj, nk))
    b4 = CPlot.addRender2Zone(b4,
                              material='Solid',
                              color='White',
                              meshOverlay=1)

    if LY >= 0:
        # plan ymin
        b5 = G.cart((box[0] - ax * hx, box[1] - ay * hy, box[2] - az * hz),
                    (hx, hy, hz), (ni, 1, nk))
    else:
        # plan ymax
        b5 = G.cart((box[0] - ax * hx, box[4] + by * hy, box[2] - az * hz),
                    (hx, hy, hz), (ni, 1, nk))
    b5 = CPlot.addRender2Zone(b5,
                              material='Solid',
                              color='White',
                              meshOverlay=1)
    if LZ >= 0:
        # plan zmin
        b6 = G.cart((box[0] - ax * hx, box[1] - ay * hy, box[2] - az * hz),
                    (hx, hy, hz), (ni, nj, 1))
    else:
        b6 = G.cart((box[0] - ax * hx, box[1] - ay * hy, box[5] + bz * hz),
                    (hx, hy, hz), (ni, nj, 1))
    b6 = CPlot.addRender2Zone(b6,
                              material='Solid',
                              color='White',
                              meshOverlay=1)
    return [b1, b2, b3, b4, b5, b6]
예제 #12
0
def replaceText(event=None):
    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()
    # Recupere l'OBB de la selection
    Z = []
    dels = []
    for nz in nzs:
        nob = CTK.Nb[nz] + 1
        noz = CTK.Nz[nz]
        Z.append(CTK.t[2][nob][2][noz])
        dels.append(CTK.t[2][nob][0] + Internal.SEP1 +
                    CTK.t[2][nob][2][noz][0])
    nob0 = CTK.Nb[nzs[0]] + 1
    try:
        a = T.join(Z)
    except:
        a = Z[0]
    OBB = G.BB(a, method='OBB')

    P0 = C.getValue(OBB, 'GridCoordinates', 0)
    P1 = C.getValue(OBB, 'GridCoordinates', 1)
    P2 = C.getValue(OBB, 'GridCoordinates', 2)
    P3 = C.getValue(OBB, 'GridCoordinates', 4)
    v1 = Vector.sub(P1, P0)
    n1 = Vector.norm(v1)
    v2 = Vector.sub(P2, P0)
    n2 = Vector.norm(v2)
    v3 = Vector.sub(P3, P0)
    n3 = Vector.norm(v3)
    v1p = v1
    v2p = v2
    v3p = v3
    if abs(n1) < 1.e-12:
        v1 = Vector.cross(v2, v3)
        v1p = (0., 0., 0.)
    elif abs(n2) < 1.e-12:
        v2 = Vector.cross(v1, v3)
        v2p = (0., 0., 0.)
    elif abs(n3) < 1.e-12:
        v3 = Vector.cross(v2, v3)
        v3p = (0., 0., 0.)

    # Essaie de matcher les vecteur sur la vue p1,p2,p3
    # On suppose que dirCam doit etre e2, ...
    posCam = CPlot.getState('posCam')
    posEye = CPlot.getState('posEye')
    dirCam = CPlot.getState('dirCam')
    e2 = dirCam
    e3 = Vector.sub(posCam, posEye)
    e1 = Vector.cross(e2, e3)

    f1 = None
    f2 = None
    f3 = None
    Pt = P0
    s1 = Vector.dot(e1, v1)
    s2 = Vector.dot(e1, v2)
    s3 = Vector.dot(e1, v3)
    if abs(s1) > abs(s2) and abs(s1) > abs(s3):
        if s1 > 0: f1 = v1
        else:
            f1 = Vector.mul(-1., v1)
            Pt = Vector.add(Pt, v1p)
    elif abs(s2) > abs(s1) and abs(s2) > abs(s3):
        if s2 > 0: f1 = v2
        else:
            f1 = Vector.mul(-1., v2)
            Pt = Vector.add(Pt, v2p)
    elif abs(s3) > abs(s1) and abs(s3) > abs(s2):
        if s3 > 0: f1 = v3
        else:
            f1 = Vector.mul(-1., v3)
            Pt = Vector.add(Pt, v3p)
    s1 = Vector.dot(e2, v1)
    s2 = Vector.dot(e2, v2)
    s3 = Vector.dot(e2, v3)
    if abs(s1) > abs(s2) and abs(s1) > abs(s3):
        if s1 > 0: f2 = v1
        else:
            f2 = Vector.mul(-1., v1)
            Pt = Vector.add(Pt, v1p)
    elif abs(s2) > abs(s1) and abs(s2) > abs(s3):
        if s2 > 0: f2 = v2
        else:
            f2 = Vector.mul(-1., v2)
            Pt = Vector.add(Pt, v2p)
    elif abs(s3) > abs(s1) and abs(s3) > abs(s2):
        if s3 > 0: f2 = v3
        else:
            f2 = Vector.mul(-1., v3)
            Pt = Vector.add(Pt, v3p)
    s1 = Vector.dot(e3, v1)
    s2 = Vector.dot(e3, v2)
    s3 = Vector.dot(e3, v3)
    if abs(s1) > abs(s2) and abs(s1) > abs(s3):
        if s1 > 0: f3 = v1
        else:
            f3 = Vector.mul(-1., v1)
            Pt = Vector.add(Pt, v1p)
    elif abs(s2) > abs(s1) and abs(s2) > abs(s3):
        if s2 > 0: f3 = v2
        else:
            f3 = Vector.mul(-1., v2)
            Pt = Vector.add(Pt, v2p)
    elif abs(s3) > abs(s1) and abs(s3) > abs(s2):
        if s3 > 0: f3 = v3
        else:
            f3 = Vector.mul(-1., v3)
            Pt = Vector.add(Pt, v3p)
    (x0, y0, z0) = Pt
    n2 = Vector.norm(f2)

    # Cree le texte
    text = VARS[0].get()
    type = VARS[1].get()
    font = VARS[3].get()

    smoothness = VARS[2].get()
    smooth = 0
    if smoothness == 'Regular': smooth = 0
    elif smoothness == 'Smooth': smooth = 2
    elif smoothness == 'Very smooth': smooth = 4
    if type == '3D': a = D.text3D(text, smooth=smooth, font=font)
    elif type == '2D': a = D.text2D(text, smooth=smooth, font=font)
    elif type == '1D':
        a = D.text1D(text, smooth=smooth, font=font)
        a = C.convertArray2Tetra(a)
        a = T.join(a)
    BB = G.bbox(a)
    h2 = BB[4] - BB[1]

    # Scale, positionne le texte
    factor = n2 / h2
    a = T.homothety(a, (BB[0], BB[1], BB[2]), factor)
    a = T.translate(a, (x0 - BB[0], y0 - BB[1], z0 - BB[2]))
    a = T.rotate(a, (x0, y0, z0), ((1, 0, 0), (0, 1, 0), (0, 0, 1)),
                 ((f1, f2, f3)))

    CTK.t = CPlot.deleteSelection(CTK.t, CTK.Nb, CTK.Nz, nzs)
    CPlot.delete(dels)
    CTK.add(CTK.t, nob0, -1, a)
    #C._fillMissingVariables(CTK.t)
    CTK.TXT.insert('START', 'Text replaced.\n')
    (CTK.Nb, CTK.Nz) = CPlot.updateCPlotNumbering(CTK.t)
    CTK.TKTREE.updateApp()
    CPlot.render()
예제 #13
0
def scale():
    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
    v = CTK.varsFromWidget(VARS[1].get(), type=1)
    if len(v) != 1 and len(v) != 3 and len(v) != 6:
        CTK.TXT.insert('START', 'Scale factor is incorrect.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error')
        return

    axis = VARS[5].get()
    if axis == 'along XYZ':
        axe1 = (1, 0, 0)
        axe2 = (0, 1, 0)
        axe3 = (0, 0, 1)
    else:  # view
        posCam = CPlot.getState('posCam')
        posEye = CPlot.getState('posEye')
        dirCam = CPlot.getState('dirCam')
        axe1 = (posEye[0] - posCam[0], posEye[1] - posCam[1],
                posEye[2] - posCam[2])
        axe2 = dirCam
        axe3 = (axe1[1] * axe2[2] - axe1[2] * axe2[1],
                axe1[2] * axe2[0] - axe1[0] * axe2[2],
                axe1[0] * axe2[1] - axe1[1] * axe2[0])

    nzs = CPlot.getSelectedZones()
    if nzs == []:
        CTK.TXT.insert('START', 'Selection is empty.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error')
        return
    CTK.saveTree()

    selection = []
    for nz in nzs:
        nob = CTK.Nb[nz] + 1
        noz = CTK.Nz[nz]
        z = CTK.t[2][nob][2][noz]
        selection.append(z)
    if len(v) == 6:  # center is given
        X = [v[3], v[4], v[5]]
    else:
        X = G.barycenter(selection)
    if len(v) == 1 and v[0] == 0.:  # scale unitaire
        bbox = G.bbox(selection)
        dx = bbox[3] - bbox[0]
        dy = bbox[4] - bbox[1]
        dz = bbox[5] - bbox[2]
        if dx >= dy and dx >= dz: v[0] = 1. / dx
        if dy >= dx and dy >= dz: v[0] = 1. / dy
        if dz >= dy and dz >= dx: v[0] = 1. / dz

    list = []
    for nz in nzs:
        nob = CTK.Nb[nz] + 1
        noz = CTK.Nz[nz]
        list.append((nob, noz, nz))
        z = CTK.t[2][nob][2][noz]
        if len(v) == 1:
            a = T.homothety(z, (X[0], X[1], X[2]), v[0])
        else:
            z = T.contract(z, (X[0], X[1], X[2]), axe2, axe3, v[0])
            z = T.contract(z, (X[0], X[1], X[2]), axe1, axe3, v[1])
            a = T.contract(z, (X[0], X[1], X[2]), axe1, axe2, v[2])
        CTK.replace(CTK.t, nob, noz, a)
    CTK.TXT.insert('START', 'Zones have been scaled.\n')
    CTK.TKTREE.updateApp()
    CPlot.render()
예제 #14
0
def symetrize():
    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
    axis = VARS[4].get()
    nzs = CPlot.getSelectedZones()
    if nzs == []:
        CTK.TXT.insert('START', 'Selection is empty.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error')
        return

    sel = []
    for nz in nzs:
        nob = CTK.Nb[nz] + 1
        noz = CTK.Nz[nz]
        z = CTK.t[2][nob][2][noz]
        sel.append(z)
    bb = G.bbox(sel)

    xmin = bb[0]
    ymin = bb[1]
    zmin = bb[2]
    xmax = bb[3]
    ymax = bb[4]
    zmax = bb[5]
    if axis == 'around XY-':
        X = ((xmin + xmax) * 0.5, (ymin + ymax) * 0.5, zmin)
        axe1 = (1., 0., 0.)
        axe2 = (0., 1., 0.)
    elif axis == 'XY+':
        X = ((xmin + xmax) * 0.5, (ymin + ymax) * 0.5, zmax)
        axe1 = (1., 0., 0.)
        axe2 = (0., 1., 0.)
    elif axis == 'around XZ-':
        X = ((xmin + xmax) * 0.5, ymin, (zmin + zmax) * 0.5)
        axe1 = (1., 0., 0.)
        axe2 = (0., 0., 1.)
    elif axis == 'around XZ+':
        X = ((xmin + xmax) * 0.5, ymax, (zmin + zmax) * 0.5)
        axe1 = (1., 0., 0.)
        axe2 = (0., 0., 1.)
    elif axis == 'around YZ-':
        X = (xmin, (ymin + ymax) * 0.5, (zmin + zmax) * 0.5)
        axe1 = (0., 1., 0.)
        axe2 = (0., 0., 1.)
    elif axis == 'around YZ+':
        X = (xmax, (ymin + ymax) * 0.5, (zmin + zmax) * 0.5)
        axe1 = (0., 1., 0.)
        axe2 = (0., 0., 1.)
    elif axis == 'around view':
        X = CPlot.getState('posEye')
        Y = CPlot.getState('posCam')
        axe1 = (X[0] - Y[0], X[1] - Y[1], X[2] - Y[2])
        axe2 = CPlot.getState('dirCam')
    else:
        X = (0., 0., 0.)
        axe1 = (1., 0., 0.)
        axe2 = (0., 1., 0.)

    CTK.saveTree()
    for nz in nzs:
        nob = CTK.Nb[nz] + 1
        noz = CTK.Nz[nz]
        a = T.symetrize(CTK.t[2][nob][2][noz], (X[0], X[1], X[2]), axe1, axe2)
        CTK.replace(CTK.t, nob, noz, a)
    CTK.TXT.insert('START', 'Zones have been symmetrized.\n')
    CTK.TKTREE.updateApp()
    CPlot.render()
예제 #15
0
def createLxs(rep):

    # File open
    name = VARS[1].get()
    file = open(rep + '/' + name + '.lxs', 'w')
    file.write('# Lux Render main file - written by Cassiopee -\n')

    # Sampler
    file.write('Renderer "sampler"\n')
    file.write('\n')
    file.write('Sampler "metropolis"\n')
    file.write('    "float largemutationprob" [0.4]\n')
    file.write('\n')
    file.write('Accelerator "qbvh"\n')
    file.write('\n')

    # Integrators
    file.write('SurfaceIntegrator "bidirectional"\n')
    file.write('      "integer eyedepth" [48]\n')
    file.write('      "integer lightdepth" [48]\n')
    file.write('      "string lightpathstrategy" ["auto"]\n')
    file.write('      "string lightstrategy" ["auto"]\n')
    file.write('\n')
    file.write('VolumeIntegrator "multi"\n')
    file.write('      "float stepsize" [1.0]\n')
    file.write('\n')

    # Pixel filter
    file.write('PixelFilter "mitchell"\n')
    file.write('      "bool supersample" ["true"]\n')
    file.write('      "float B" [0.3333333]\n')
    file.write('      "float C" [0.3333333]\n')
    file.write('\n')

    # Camera
    eye = CPlot.getState('posEye')
    cam = CPlot.getState('posCam')
    dir = CPlot.getState('dirCam')

    file.write('LookAt ' + str(cam[0]) + ' ' + str(cam[1]) + ' ' +
               str(cam[2]) + ' ' + str(eye[0]) + ' ' + str(eye[1]) + ' ' +
               str(eye[2]) + ' ' + str(dir[0]) + ' ' + str(dir[1]) + ' ' +
               str(dir[2]) + '\n')
    file.write('Camera "perspective" "float fov" [50]\n')
    file.write('\n')

    # Film
    resolution = VARS[0].get()
    size = resolution.split('x')
    xres = size[0]
    yres = size[1]
    file.write('Film "fleximage"\n')
    file.write('       "integer xresolution" [' + xres + ']\n')
    file.write('       "integer yresolution" [' + yres + ']\n')
    file.write('\n')

    # World
    file.write('WorldBegin\n')
    file.write('Include "Scene/Materials.lxm"\n')
    file.write('Include "Scene/Geometry.lxo"\n')
    file.write('Include "Scene/Volumes.lxv"\n')
    file.write('\n')

    # Lights
    writeCassiopeeLamps(file)

    file.write('\n')
    file.write('Exterior "world"\n')
    file.write('WorldEnd\n')
    file.close()
    return
예제 #16
0
def generate(event=None):

    CTK.saveTree()
    N = CTK.varsFromWidget(VARS[0].get(), type=2)
    if len(N) != 1:
        CTK.TXT.insert('START', 'NPts is incorrect.\n')
        return
    N = N[0]
    eltType = VARS[1].get()
    surfType = VARS[2].get()

    if surfType == 'Sphere':
        s = D.sphere6((0, 0, 0), 0.5, N=N)
        xc = 0
        yc = 0
        zc = 0
    elif surfType == 'Plane':
        h = 1. / (N - 1)
        s1 = G.cart((-0.5, -0.5, -0.5), (h, h, h), (N, 1, N))
        s = [s1]
        xc = 0
        yc = 0
        zc = 0
    elif surfType == 'Cube':
        h = 1. / (N - 1)
        s1 = G.cart((-0.5, -0.5, -0.5), (h, h, h), (N, N, 1))
        s1 = T.reorder(s1, (-1, 2, 3))
        s2 = G.cart((-0.5, -0.5, 0.5), (h, h, h), (N, N, 1))
        s3 = G.cart((-0.5, -0.5, -0.5), (h, h, h), (N, 1, N))
        s4 = G.cart((-0.5, 0.5, -0.5), (h, h, h), (N, 1, N))
        s4 = T.reorder(s4, (-1, 2, 3))
        s5 = G.cart((-0.5, -0.5, -0.5), (h, h, h), (1, N, N))
        s5 = T.reorder(s5, (1, -2, 3))
        s6 = G.cart((0.5, -0.5, -0.5), (h, h, h), (1, N, N))
        s = [s1, s2, s3, s4, s5, s6]
        xc = 0
        yc = 0
        zc = 0
    elif surfType == 'Tetra':
        m1 = meshTri([0, 0, 0], [1, 0, 0], [0, 1, 0], N=N)
        m1 = T.reorder(m1, (-1, 2, 3))
        m2 = meshTri([0, 0, 0], [1, 0, 0], [0, 0, 1], N=N)
        m3 = meshTri([0, 0, 0], [0, 1, 0], [0, 0, 1], N=N)
        m3 = T.reorder(m3, (-1, 2, 3))
        m4 = meshTri([1, 0, 0], [0, 1, 0], [0, 0, 1], N=N)
        s = m1 + m2 + m3 + m4
        xc = 0.5
        yc = 0.5
        zc = 0.5
    elif surfType == 'Pyramid':
        h = 1. / (2 * N - 2)
        m0 = G.cart((-0.5, -0.5, -0.5), (h, h, h), (2 * N - 1, 2 * N - 1, 1))
        m0 = T.reorder(m0, (-1, 2, 3))
        m1 = meshTri([-0.5, -0.5, -0.5], [0.5, -0.5, -0.5], [0, 0, 0.5], N=N)
        m2 = meshTri([-0.5, -0.5, -0.5], [-0.5, 0.5, -0.5], [0, 0, 0.5], N=N)
        m2 = T.reorder(m2, (-1, 2, 3))
        m3 = meshTri([-0.5, 0.5, -0.5], [0.5, 0.5, -0.5], [0, 0, 0.5], N=N)
        m3 = T.reorder(m3, (-1, 2, 3))
        m4 = meshTri([0.5, -0.5, -0.5], [0.5, 0.5, -0.5], [0, 0, 0.5], N=N)
        s = [m0] + m1 + m2 + m3 + m4
        xc = 0.
        yc = 0.
        zc = 0.
    elif surfType == 'Cylinder':
        m0 = meshCircle((0, 0, -0.5), 0.5, N)
        m1 = meshCircle((0, 0, 0.5), 0.5, N)
        m1 = T.reorder(m1, (-1, 2, 3))
        m2 = D.circle((0, 0, -0.5),
                      0.5,
                      tetas=-45,
                      tetae=-45 + 360,
                      N=4 * N - 3)
        l = D.line((0, 0, -0.5), (0, 0, 0.5), N=N)
        m2 = D.lineDrive(m2, l)
        s = m0 + m1 + [m2]
        xc = 0.
        yc = 0.
        zc = 0.
    elif surfType == 'Cone':
        s = [D.cone((0., 0, 0), 1, 0.1, 1, N=N)]
        (xc, yc, zc) = G.barycenter(s)
    else:  # Geom parametrics surfaces
        formula = base[surfType]
        if formula.replace('{u}', '') == formula:  # curve
            s = D.curve(base[surfType], N)
        else:
            s = D.surface(base[surfType], N)
        (xc, yc, zc) = G.barycenter(s)
        s = [s]

    if eltType == 'TRI':
        s = C.convertArray2Tetra(s)
        s = T.join(s)
        s = G.close(s)
    elif eltType == 'QUAD':
        s = C.convertArray2Hexa(s)
        s = T.join(s)
        s = G.close(s)

    posCam = CPlot.getState('posCam')
    posEye = CPlot.getState('posEye')
    dirCam = CPlot.getState('dirCam')

    s = T.translate(s, (posEye[0] - xc, posEye[1] - yc, posEye[2] - zc))
    lx = posEye[0] - posCam[0]
    ly = posEye[1] - posCam[1]
    lz = posEye[2] - posCam[2]
    if lx * lx + ly * ly + lz * lz < 1.e-10: lx = -1
    if (dirCam[0] * dirCam[0] + dirCam[1] * dirCam[1] +
            dirCam[2] * dirCam[2] == 0.):
        dirCam = (0, 0, 1)
    ll = math.sqrt(lx * lx + ly * ly + lz * lz)
    s = T.homothety(s, (posEye[0], posEye[1], posEye[2]), 0.5 * ll)

    ux = dirCam[1] * lz - dirCam[2] * ly
    uy = dirCam[2] * lx - dirCam[0] * lz
    uz = dirCam[0] * ly - dirCam[1] * lx
    s = T.rotate(s, (posEye[0], posEye[1], posEye[2]),
                 ((1, 0, 0), (0, 1, 0), (0, 0, 1)),
                 ((-ux, -uy, -uz), (lx, ly, lz), dirCam))

    CTK.t = C.addBase2PyTree(CTK.t, 'SURFACES', 2)
    b = Internal.getNodeFromName1(CTK.t, 'SURFACES')

    if eltType == 'TRI' or eltType == 'QUAD':
        nob = C.getNobOfBase(b, CTK.t)
        CTK.add(CTK.t, nob, -1, s)
    else:
        nob = C.getNobOfBase(b, CTK.t)
        if CP.__slot__ is None:
            CTK.t[2][nob][2] += s
            CTK.display(CTK.t)
        else:
            for i in s:
                CTK.add(CTK.t, nob, -1, i)

    #C._fillMissingVariables(CTK.t)
    CTK.TXT.insert('START', 'Surface created.\n')
    (CTK.Nb, CTK.Nz) = CPlot.updateCPlotNumbering(CTK.t)
    CTK.TKTREE.updateApp()
    CPlot.render()
예제 #17
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)
예제 #18
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)
예제 #19
0
def savePovFile():
    if CTK.t == []: return

    # Sauvegarde toutes les zones au format pov
    rep = VARS[2].get()
    dir = os.path.dirname(CTK.FILE)
    rep = os.path.join(dir, rep)
    os.chdir(rep)
    zones = Internal.getZones(CTK.t)
    c = 0; files = []
    colors = []; materials = []; blendings = []; shader1s = []
    scales = []; centers = []
    for z in zones:
        z = C.convertArray2Tetra(z)

        # Scale (utlise pour scaler les textures)
        bb = G.bbox(z)
        rx = bb[3]-bb[0]; ry = bb[4]-bb[1]; rz = bb[5]-bb[2]
        scale = min(rx, ry, rz)
        scales.append(scale)
        centers.append([bb[0]+0.5*rx, bb[1]+0.5*ry, bb[2]+0.5*rz])
        
        # Material/Color/Blending
        material = 'Solid'; color = 'White'; mode = 0;
        blending = 1; shader1 = 1.
        ri = Internal.getNodesFromName1(z, '.RenderInfo')
        if (ri != []):
            # Material
            mt = Internal.getNodesFromName1(ri[0], 'Material')
            if (mt != []): material = Internal.getValue(mt[0])
            # Color
            co = Internal.getNodesFromName1(ri[0], 'Color')
            if (co != []): color = Internal.getValue(co[0])
            # Blending
            co = Internal.getNodesFromName1(ri[0], 'Blending')
            if (co != []): blending = Internal.getValue(co[0])
            # Shader parameter 1
            co = Internal.getNodesFromName1(ri[0], 'ShaderParameters')
            if (co != []): shader1 = co[0][1][0]
            else: shader1 = 1.
        s = color.split(':')
        if (len(s) == 2 and s[0] == 'Iso'): # couleur = iso field
            vref = C.getVarNames(z)[0]
            for pos in xrange(len(vref)):
                if (vref[pos] == s[1]): break
            
            if (pos == len(vref)): color = 'White'; mode = 0
            else: color = 'Iso'; mode = pos+1
        # traduction color si #FFFFFF
        if (color[0] == '#'):
            colorR = color[1:3]; colorG = color[3:5]; colorB = color[5:]
            colorR = int(colorR, 16); colorR = colorR / 255.
            colorG = int(colorG, 16); colorG = colorG / 255.
            colorB = int(colorB, 16); colorB = colorB / 255.
            color = 'rgbf<'+str(colorR)+','+str(colorG)+','+str(colorB)+'>'
        colors.append(color); materials.append(material)
        blendings.append(blending); shader1s.append(shader1)
        
        nt = C.newPyTree(['Base'])
        nt[2][1][2].append(z)
        try:
            if (mode == 0):
                C.convertPyTree2File(nt, 'mesh_'+str(c)+'.pov')
            else:
                C.convertPyTree2File(nt, 'mesh_'+str(c)+'.pov',
                                     colormap=mode) # avec iso
            files.append('mesh_'+str(c)+'.pov')
            c += 1
        except: pass

    # Cam position
    eye = CPlot.getState('posEye')
    cam = CPlot.getState('posCam')
    dir = CPlot.getState('dirCam')

    # Ecriture du fichier PovRay
    file = open('scene.pov', 'w')
    file.write('// POV-Ray version 3.6 scenery file written by *Cassiopee*\n')
    file.write('// Please render this file with :\n')
    file.write('// povray -W800 -H600 +a0.3 +SP16 scene.pov +P\n')
    file.write('#version 3.6;\n')
    file.write('#include "colors.inc"\n')
    file.write('#include "textures.inc"\n')
    file.write('#include "woods.inc"\n')
    file.write('#include "stones.inc"\n')
    
    # Brushed metal texture
    file.write('#declare Brushed_Depth = 10; // Bump size\n')
    file.write('#declare Brushed_Pigment = pigment {colour rgb 0.73} \n')
    file.write('#declare Brushed_Finish = finish {ambient 0 diffuse 0.95 specular 0.96 roughness 0.0005 phong 0.43 phong_size 25 brilliance 3.15 reflection 0.33 metallic metallic on }\n')
    file.write('// The brushed metal texture.\n')
    file.write('#declare Brushed_Texture = texture { average texture_map { [ pigment {Brushed_Pigment} normal {wood +Brushed_Depth ramp_wave rotate 90*x scale 50} finish {Brushed_Finish} ] [pigment {Brushed_Pigment} normal {wood -Brushed_Depth ramp_wave rotate 90*x scale 50} finish {Brushed_Finish} ] } }\n')

    # XRay texture
    file.write('#declare XRayTexture2 = texture { pigment { slope{'+'<'
               +str(cam[0])+' , '+str(cam[1])+' , '+str(cam[2])+'> - <'
               +str(eye[0])+' , '+str(eye[1])+' , '+str(eye[2])+'>}\n')
    file.write('pigment_map {[0 color rgbt 2*<1,1,1,0.1>] [0.75 color rgbt <0.1,0.6,2,1>*1] [1    color rgbt <1,1,1,1>] } } finish {ambient 3} }\n')

    # - Radiosity -
    #file.write('global_settings { assumed_gamma 1 radiosity { \n')
    #file.write('pretrace_start 0.08 \n')
    #file.write('pretrace_end   0.02 \n')
    #file.write('count 50 \n')
    #file.write('error_bound 0.5 \n')
    #file.write('recursion_limit 1 } } \n')
    
    # - Camera -
    file.write('#declare Cam0 = camera {angle 50 \n')
    file.write('#location  <'+str(cam[0])+' , '+str(cam[1])+' , '+
               str(cam[2])+'> \n')
    file.write('#look_at <'+str(eye[0])+' , '+str(eye[1])+' , '+
               str(eye[2])+'>\n')
    file.write('#direction <-1,0,0>\n')
    file.write('#sky <'+str(dir[0])+','+str(dir[1])+','+str(dir[2])+'> }\n')
    # focal blur (experimental)
    #file.write('#focal_point <'+str(eye[0])+' , '+str(eye[1])+' , '+
    #           str(eye[2])+'>\n')
    #file.write('#aperture 0.4\n')
    #file.write('#blur_samples 20 }\n')
    file.write('camera{Cam0}\n')

    # - Lumieres: point -
    #d = Vector.sub(eye, cam)
    #n = Vector.cross(d, dir)
    dir = Vector.normalize(dir)
    #n = Vector.normalize(n)
    #norm = Vector.norm(d)
    #d = Vector.normalize(d)
    #n = Vector.sub(n, dir)
    #n = Vector.add(n, d)
    #n = Vector.mul(0.4*norm, n)
    #pos = Vector.sub(eye, n)

    dir = Vector.mul(0.1, dir)
    pos = Vector.add(cam, dir)
    
    c = 0; light = 0
    for f in files:
        material = materials[c]
        if (material == 'Light'):
            xc = centers[c]; color = colors[c]
            light = 1
            intensity = shader1s[c]*5.
            file.write('light_source{<'+str(xc[0])+' , '+str(xc[1])+' , '+
                       str(xc[2])+'> color '+color+'*'+str(intensity)+'}\n')
        c += 1

    if (light == 0): # pas de lumiere dans l'arbre, on met celle par defaut
        file.write('light_source{<'+str(pos[0])+' , '+str(pos[1])+' , '+
                   str(pos[2])+'> color White*4}\n')
        
    # - Background -
    bckgrd = VARS[0].get()
    if (bckgrd == 'Blue sky'):
        # Ciel bleu
        file.write('sky_sphere { pigment { gradient <0,0,1> turbulence 0\n')
        file.write('       color_map { [0.00 rgb <0.6,0.7,1.0>]\n')
        file.write('                   [0.35 rgb <0.1,0.2,0.8>]\n')
        file.write('                   [0.65 rgb <0.1,0.2,0.8>]\n')
        file.write('                   [1.00 rgb <0.6,0.7,1.0>]\n')
        file.write('                 }\n')
        file.write('       scale 2\n')     
        file.write('     } // end of pigment\n')
        file.write('  } //end of skysphere\n')
    elif (bckgrd == 'Cloudy sky'): # on pourrait faire beaucoup mieux
        file.write('sky_sphere { \n')
        file.write('pigment{ bozo turbulence 0.76\n')
        file.write('       color_map { [0.5 rgb <0.20, 0.20, 1.0>]\n')
        file.write('                   [0.6 rgb <1,1,1>]\n')
        file.write('                   [1.0 rgb <0.5,0.5,0.5>]\n')
        file.write('                 }\n')
        file.write('     } // end of pigment\n')
        file.write('  } //end of skysphere\n')

        # Avec les macros de pov, pas satisfaisant
        #file.write('#include "skies.inc" \n')
        #file.write("object{ O_Cloud1 rotate 90*x}\n")
        #file.write("sphere { <0,0,0>, 100 \n")
        #file.write("texture {T_Cloud3} scale 100 }\n")
        
    elif (bckgrd == 'Starfield'):
        file.write('#include "stars.inc"\n')
        file.write('sphere { <0,0,0>, 1\n')
        file.write('texture { Starfield1 }\n')
        file.write('scale 10000\n')
        file.write('  } //end of sphere\n')
        
    elif (bckgrd == 'White'):
        file.write('sky_sphere { pigment { White } }\n')

    # Objets
    c = 0
    for f in files:
        color = colors[c]; material = materials[c]
        blend = str(1.-blendings[c])
        
        if (material == 'Solid' or material == 'None'): # OK
            file.write('#include "'+f+'"\n')
            file.write('object {mesh_'+str(c)+'\n')
            if (color != 'Iso'):
                file.write('texture{pigment{color '+color+' filter '+
                           blend+'}\n')
            else:
                file.write('texture{pigment{filter '+
                           blend+'}\n')
            file.write('finish {ambient 0.1 diffuse 0.1 reflection 0.05 phong 0.5 }}\n')
            file.write('}\n')
        elif (material == 'Flat'):
            file.write('#include "'+f+'"\n')
            file.write('object {mesh_'+str(c)+'\n')
            if (color != 'Iso'):
                file.write('texture{pigment{color '+color+' filter '+
                           blend+'}\n')
            else:
                file.write('texture{pigment{filter '+
                           blend+'}\n')
            file.write('finish {ambient 0.1 diffuse 0.1 reflection 0.0 phong 0.0 }}\n')
            file.write('}\n')
        elif (material == 'Glass'): # OK
            file.write('#include "'+f+'"\n')
            file.write('object {mesh_'+str(c)+'\n')
            if (color != 'Iso'):
                file.write('texture{pigment{color '+color+' filter '+
                           str(-0.1*blendings[c] +1.)+' }\n')
            else:
                 file.write('texture{pigment{filter '+
                            str(-0.1*blendings[c] +1.)+' }\n')
            file.write('finish {reflection 0.2 phong 0.7 }}\n')
            file.write('interior { ior 1.3 }\n')
            file.write('}\n')
        elif (material == 'Chrome'): # OK
            file.write('#include "'+f+'"\n')
            file.write('object {mesh_'+str(c)+'\n')
            if (color != 'Iso'):
                file.write('texture{pigment{color '+color+' filter '+
                           blend+'}\n')
            else:
                file.write('texture{pigment{filter '+
                           blend+'}\n')
            file.write('finish {ambient 0.25 brilliance 4 diffuse 0.5 reflection 0.4 specular 0.2 metallic roughness 1/80 }}\n')
            file.write('}\n')
        elif (material == 'Metal'):
            file.write('#include "'+f+'"\n')
            file.write('object {mesh_'+str(c)+'\n')
            if (color == 'White'):
                file.write('texture {pigment{color rgb 0.73}\n')
            elif (color != 'Iso'):
                file.write('texture {pigment{color '+color+' filter '+
                           blend+'}\n')
            else:
                file.write('texture {pigment{filter '+
                           blend+'}\n')
            file.write('finish {ambient 0 diffuse 0.95 specular 0.26 roughness 0.0005 phong 0.33 phong_size 2 brilliance 3.15 reflection 0.33 metallic metallic on } }\n')
            file.write('}\n')
        elif (material == 'XRay'):
            file.write('#include "'+f+'"\n')
            file.write('object {mesh_'+str(c)+'\n')
            file.write('texture { XRayTexture2 } }\n')
        elif (material == 'Wood'): # OK
            file.write('#include "'+f+'"\n')
            file.write('object {mesh_'+str(c)+'\n')
            if (color == 'White'):
                file.write('texture{T_Wood3 \n')
            elif (color == 'Black'):
                file.write('texture{T_Wood2 \n')
            elif (color == 'Blue'):
                file.write('texture{T_Wood31 \n')
            elif (color == 'Red'):
                file.write('texture{T_Wood6 \n')
            elif (color == 'Green'):
                file.write('texture{T_Wood32 \n')
            elif (color == 'Yellow'):
                file.write('texture{T_Wood35 \n')
            elif (color == 'Orange'):
                file.write('texture{T_Wood7 \n')
            elif (color == 'Magenta'):
                file.write('texture{T_Wood4 \n')
            else: file.write('texture{T_Wood32 \n')
            file.write("scale "+str(scales[c])+"\n");
            file.write('finish {ambient 0.7 brilliance 0.2 diffuse 0.1 reflection 0.01 specular 0.1 roughness 1/20 }}\n')
            file.write('}\n')
        elif (material == 'Marble' or material == 'Granite'):
            file.write('#include "'+f+'"\n')
            file.write('object {mesh_'+str(c)+'\n')
            if (color == 'White'):
                #file.write('texture{T_Grnt20 \n')
                file.write('texture{White_Marble \n')
            elif (color == 'Black'):
                file.write('texture{T_Grnt15 \n')
            elif (color == 'Blue'):
                file.write('texture{T_Wood6 \n')
            elif (color == 'Red'):
                file.write('texture{T_Wood28 \n')
            elif (color == 'Green'):
                file.write('texture{T_Grnt21 \n')
            elif (color == 'Yellow'):
                file.write('texture{T_Wood1 \n')
            elif (color == 'Orange'):
                file.write('texture{T_Wood13 \n')
            elif (color == 'Magenta'):
                file.write('texture{T_Grnt14 \n')
            else: file.write('texture{T_Grnt20 \n')
            file.write('scale '+str(scales[c])+'\n');
            file.write('finish {ambient 0.3 brilliance 0.3 diffuse 0.1 reflection 0.1 specular 0.1 }}\n')
            file.write('}\n')
        elif (material == 'Smoke'):
            file.write('#include "'+f+'"\n')
            file.write('object {mesh_'+str(c)+'\n')
            file.write('texture{pigment{color '+color+' filter 1.}\n')
            #file.write('texture{pigment { rgbt 1 }\n') 
            file.write('finish {ambient 0.1 diffuse 0.1  }}\n')
            file.write('hollow\n')
            file.write('interior{ //---------------------\n')
            file.write('media{ method 2 \n')
            file.write('emission 0. \n')
            file.write('scattering{ 1, // Type \n')
            file.write('<1,1,1>*0.2 // color of scattering haze \n')
            file.write('extinction  1. \n')
            file.write('// how fast the scattering media absorbs light \n')
            file.write('// useful if the media absorbs too much light \n')
            file.write('} // end scattering \n')
            file.write('density{ bozo \n')
            file.write('turbulence 8.0 \n')
            file.write('        color_map { \n')
            file.write('        [0.00 rgb 0] \n')
            file.write('        [0.05 rgb 0] \n')
            file.write('        [0.20 rgb 0.2] \n')
            file.write('        [0.30 rgb 0.6] \n')
            file.write('        [0.40 rgb 1] \n')
            file.write('        [1.00 rgb 1] \n')
            file.write('       } // end color_map \n')
            file.write('scale '+str(scales[c])+'\n');
            file.write('} // end of density  \n')
            file.write('samples 1,1   // 3,3 for adaptive sampling \n')
            file.write('intervals 10   // increase up to 15 \n')
            file.write('} // end of media --------------------------- \n')
            file.write('} // end of interior \n')

            file.write('}\n')
        c += 1

    file.close()
    os.chdir('..')
예제 #20
0
def initCanvas(event=None):
    dir = VARS[0].get()
    if dir == 'None' and CTK.t == []: return

    global CANVASSIZE, XC, YC, ZC, UX, UY, UZ, LX, LY, LZ, DIRX, DIRY, DIRZ
    if CANVASSIZE == -1:
        try:
            bb = G.bbox(CTK.t)
            CANVASSIZE = max(bb[3] - bb[0], bb[4] - bb[1], bb[5] - bb[2])
        except:
            CANVASSIZE = 1

    nzs = CPlot.getSelectedZones()
    if (nzs != [] and dir != 'None'):
        point = CPlot.getActivePoint()
        if point != []:
            XC = point[0]
            YC = point[1]
            ZC = point[2]

    if dir == 'None':
        deleteCanvasBase()
        (CTK.Nb, CTK.Nz) = CPlot.updateCPlotNumbering(CTK.t)
        CTK.TKTREE.updateApp()
        CPlot.render()
        return
    elif dir == 'View':
        posCam = CPlot.getState('posCam')
        posEye = CPlot.getState('posEye')
        dirCam = CPlot.getState('dirCam')
        if nzs == []:
            XC = posEye[0]
            YC = posEye[1]
            ZC = posEye[2]
        LX = posEye[0] - posCam[0]
        LY = posEye[1] - posCam[1]
        LZ = posEye[2] - posCam[2]
        if LX * LX + LY * LY + LZ * LZ < 1.e-10: LX = -1
        if dirCam[0] * dirCam[0] + dirCam[1] * dirCam[1] + dirCam[2] * dirCam[
                2] == 0.:
            dirCam = (0, 0, 1)
        DIRX = dirCam[0]
        DIRY = dirCam[1]
        DIRZ = dirCam[2]

        UX = dirCam[1] * LZ - dirCam[2] * LY
        UY = dirCam[2] * LX - dirCam[0] * LZ
        UZ = dirCam[0] * LY - dirCam[1] * LX

    elif dir == 'YZ':
        DIRX = 1
        DIRY = 0
        DIRZ = 0
        UX = 0
        UY = 1
        UZ = 0
        LX = 0
        LY = 0
        LZ = 1
    elif dir == 'XZ':
        DIRX = 0
        DIRY = 1
        DIRZ = 0
        UX = 1
        UY = 0
        UZ = 0
        LX = 0
        LY = 0
        LZ = 1
    else:
        DIRX = 0
        DIRY = 0
        DIRZ = 1
        UX = 1
        UY = 0
        UZ = 0
        LX = 0
        LY = 0
        LZ = 1
    CTK.TXT.insert('START', 'Set a canvas.\n')
    setCanvas()
예제 #21
0
# - getState (pyTree) -
import Generator.PyTree as G
import CPlot.PyTree as CPlot

a = G.cart((0, 0, 0), (1, 1, 1), (5, 5, 5))
CPlot.display(a)

print('dim=', CPlot.getState('dim'))
print('mode=', CPlot.getState('mode'))
print('displayInfo=', CPlot.getState('displayInfo'))
print('meshStyle=', CPlot.getState('meshStyle'))
print('solidStyle=', CPlot.getState('solidStyle'))
print('isoEdges=', CPlot.getState('isoEdges'))
print('win=', CPlot.getState('win'))
print('posCam=', CPlot.getState('posCam'))
print('posEye=', CPlot.getState('posEye'))
print('dirCam=', CPlot.getState('dirCam'))