Esempio n. 1
0
def getVectorsFromCanvas():
    e1 = (1,0,0); e2 = (0,1,0)
    node = Internal.getNodeFromName(CTK.t, 'CANVAS')
    if node is None: return e1,e2
    zones = Internal.getNodesFromType(node, 'Zone_t')
    if zones == []: return e1,e2
    zone = zones[0]
    if (Internal.getZoneType(zone) != 1): return e1,e2
    [x1,y1,z1] = C.getValue(zone, Internal.__GridCoordinates__, (1,1,1))
    [x2,y2,z2] = C.getValue(zone, Internal.__GridCoordinates__, (2,1,1))
    [x3,y3,z3] = C.getValue(zone, Internal.__GridCoordinates__, (1,2,1))
    e1 = (x2-x1, y2-y1, z2-z1)
    e2 = (x3-x1, y3-y1, z3-z1)
    e1 = Vector.normalize(e1)
    e2 = Vector.normalize(e2)
    return e1,e2
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()
Esempio n. 3
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')
Esempio n. 4
0
def travelRight(xr=0.1, N=100):
    import KCore.Vector as Vector
    posCam = getState('posCam')
    posEye = getState('posEye')
    dirCam = getState('dirCam')
    d1 = Vector.sub(posEye, posCam)
    R = Vector.norm(d1)
    L = 2. * 3.14 * R * xr * 0.5
    d2 = Vector.cross(d1, dirCam)
    d2 = Vector.normalize(d2)
    d2 = Vector.mul(L, d2)
    P2 = Vector.sub(posCam, d2)
    d3 = Vector.sub(posEye, P2)
    d4 = Vector.cross(d3, dirCam)
    d4 = Vector.normalize(d4)
    d4 = Vector.mul(L, d4)
    P3 = Vector.sub(P2, d4)
    checkPoints = [posCam, tuple(P2), tuple(P3)]
    moveCamera(checkPoints, N=N)
Esempio n. 5
0
def travelDown(xr=0.1, N=100):
    import KCore.Vector as Vector
    posCam = getState('posCam')
    posEye = getState('posEye')
    dirCam = getState('dirCam')
    d1 = Vector.sub(posEye, posCam)
    R = Vector.norm(d1)
    L = 2 * 3.14 * R * xr * 1.
    d2 = Vector.normalize(dirCam)
    d2 = Vector.mul(L, d2)
    P2 = Vector.sub(posCam, d2)
    checkPoints = [posCam, tuple(P2)]
    moveCamera(checkPoints, N=N)
Esempio n. 6
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('..')