Changeset 1142 in main


Ignore:
Timestamp:
05/30/12 15:28:24 (7 years ago)
Author:
pcosquer
Message:

document3D: add thumbnail generation of STEP file
/!\ new dependency : povray
Only works for undecomposed STEP files.
Testing in progress.

Location:
trunk
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/docs/admin/applications/document3D/index.rst

    r882 r1142  
    1414This application depends on `pythonOCC <http://www.pythonocc.org/>`_. It has been 
    1515tested with the version 0.5. 
     16 
     17.. versionchanged:: 1.1 
     18 
     19It also depends on `POV-Ray <http://www.povray.org/>`_ to generate thumbnails of 
     20STEP file. It has been tested with the version 3.6.1. 
    1621 
    1722 
  • trunk/openPLM/document3D/STP_converter_WebGL.py

    r1070 r1142  
    2626from OCC.TDataStd import Handle_TDataStd_Name ,TDataStd_Name_GetID 
    2727from OCC.Quantity import Quantity_Color 
     28import OCC.BRepTools 
    2829from mesh import * 
    2930from classes import * 
     
    109110                    pass 
    110111                    #print "Not information found for shape : ", GetLabelNom(shapes.Value(i+1))         
     112         
     113        roots = TDF_LabelSequence() 
     114        self.shape_tool.GetFreeShapes(roots) 
     115        self.thumbnail_valid = False 
     116        if roots.Length() == 1: 
     117            shape = self.shape_tool.GetShape(roots.Value(1)) 
     118            t = Topo(shape) 
     119            if t.number_of_vertices() > 0: 
     120                bbox = Bnd_Box() 
     121                gap = 0 
     122                bbox.SetGap(gap) 
     123 
     124                BRepMesh_Mesh(shape, get_mesh_precision(shape, 1)) 
     125                faces_iterator = Topo(shape).faces()   
     126                for F in faces_iterator: 
     127                    face_location = TopLoc_Location() 
     128                    triangulation = BRep_Tool_Triangulation(F, face_location) 
     129                BRepBndLib_Add(shape, bbox) 
     130                x_min,y_min,z_min,x_max,y_max,z_max = bbox.Get() 
     131                diagonal = max(x_max-x_min, y_max-y_min, z_max-z_min) 
     132                if diagonal > 0: 
     133                    self.scale = 200 / diagonal 
     134 
     135                    self.trans = ((x_max-x_min) / 2. -x_max, 
     136                            (y_max-y_min) / 2. -y_max, 
     137                            (z_max-z_min) / 2. -z_max) 
     138                    self.thumbnail_valid = True 
    111139 
    112140        ws=self.STEPReader.Reader().WS().GetObject() 
    113141        model=ws.Model().GetObject() 
    114142        model.Clear()           
    115     def procesing_geometrys(self,root_path): 
     143 
     144    def procesing_geometrys(self,root_path, pov_dir): 
    116145        """ 
    117146         
     
    130159        """ 
    131160        files_index="" 
     161        self.povs = [] 
    132162         
    133163        for index, shape in enumerate(self.shapes_simples): 
    134                 name=get_available_name(root_path,self.fileName+".geo") 
    135                 path=os.path.join(root_path, name) 
    136                 _index_id="_"+str(index+1)+"_"+str(self.id) 
    137                 mesh_shape(shape,path,_index_id) #index+1 
    138                 files_index+="GEO:"+name+" , "+str(index+1)+"\n" #index+1 
    139               
     164            name=get_available_name(root_path,self.fileName+".geo") 
     165            path=os.path.join(root_path, name) 
     166            _index_id="_"+str(index+1)+"_"+str(self.id) 
     167            qmt = mesh_shape(shape,path,_index_id, pov_dir) #index+1 
     168            files_index+="GEO:"+name+" , "+str(index+1)+"\n" #index+1 
     169            if qmt.triangle_count: 
     170                self.povs.append((os.path.basename(name + ".inc"), _index_id)) 
    140171      
    141172        return files_index         
  • trunk/openPLM/document3D/generate3D.py

    r1024 r1142  
    11import sys 
    22import os 
     3import tempfile 
    34from classes import data_for_product , get_available_name 
    45from STP_converter_WebGL import NEW_STEP_Import , MultiRoot_Error , OCC_ReadingStep_Error  
     
    67import django.utils.simplejson as json 
    78     
     9from pov import create_thumbnail 
    810 
    9  
    10 def generateGeometrys_Arborescense(doc_file_path,doc_file_id,location): 
     11def generateGeometrys_Arborescense(doc_file_path,doc_file_id,location, thumb_path): 
    1112    """ 
    1213     
     
    2223    """  
    2324    logging.getLogger("GarbageCollector").setLevel(logging.ERROR)     
    24     my_step_importer = NEW_STEP_Import(doc_file_path,doc_file_id)  
    25     product_arbre=my_step_importer.generate_product_arbre()    
    26     geo=my_step_importer.procesing_geometrys(location) 
     25    step_importer = NEW_STEP_Import(doc_file_path,doc_file_id)  
     26    product = step_importer.generate_product_arbre()    
     27    pov_dir = tempfile.mkdtemp(suffix="openplm_pov") 
     28    geo = step_importer.procesing_geometrys(location, pov_dir) 
    2729    print geo 
    28     print write_ArbFile_from_Product(product_arbre,my_step_importer.fileName,location) 
    29  
    30  
     30    print write_ArbFile_from_Product(product, step_importer.fileName,location) 
     31    if step_importer.thumbnail_valid and product: 
     32        create_thumbnail(product, step_importer, pov_dir, thumb_path) 
    3133 
    3234def write_ArbFile_from_Product(product,fileName,location): 
     
    5658if __name__ == "__main__":     
    5759    try:     
    58         generateGeometrys_Arborescense(sys.argv[1],sys.argv[2],sys.argv[3])         
     60        generateGeometrys_Arborescense(*sys.argv[1:])    
    5961    except Exception as excep: 
     62        raise 
    6063        if type(excep)==MultiRoot_Error: 
    6164            sys.exit(-1) 
     
    6467        sys.exit(-3) 
    6568 
    66      
  • trunk/openPLM/document3D/mesh.py

    r1034 r1142  
    4040import time 
    4141from OCC.GarbageCollector import garbage 
    42 def mesh_shape(shape,filename,_index_id): 
     42def mesh_shape(shape,filename,_index_id, pov_dir): 
    4343    """  
    4444 
     
    7171    output.write("var %s = new THREE.Geometry();\n"%_index_id)  
    7272    output.write("var material_for%s = new THREE.MeshBasicMaterial({opacity:%s,shading:THREE.SmoothShading});\n"%(_index_id,opacity)) 
     73    pov_file = open(os.path.join(pov_dir, os.path.basename(filename + ".inc")), "w") 
     74    pov_file.write(""" 
     75#declare m%s = mesh { 
     76""" % _index_id) 
    7377     
    7478    if shape.color: 
    7579        output.write("material_for%s.color.setRGB(%f,%f,%f);\n"%(_index_id,shape.color.Red(),shape.color.Green(),shape.color.Blue())) 
    7680      
    77     a_mesh.compute(output,_index_id) 
     81    a_mesh.compute(output, pov_file, _index_id) 
     82    if shape.color: 
     83        color = shape.color.Red(),shape.color.Green(),shape.color.Blue() 
     84    else: 
     85        color = 1, 1, 0 
     86    pov_file.write("""   
     87}; 
     88 
     89#declare t%s = texture { 
     90    pigment { 
     91        color <%f,%f, %f, 0.9> 
     92    } 
     93     finish {ambient 0.1 
     94         diffuse 0.9 
     95         phong 1} 
     96  } 
     97""" % ((_index_id, ) + color)) 
    7898     
    7999    output.close() 
     100    pov_file.close() 
    80101 
    81102    return a_mesh        
    82103 
    83  
     104triangle_fmt = """ smooth_triangle { 
     105        <%f, %f, %f>, <%f, %f, %f>, 
     106        <%f, %f, %f>, <%f, %f, %f>,  
     107        <%f, %f, %f>, <%f, %f, %f> 
     108      } 
     109    """ 
     110vertice_fmt = "%s.vertices.push(new THREE.Vertex(new THREE.Vector3(%.4f,%.4f,%.4f)));\n" 
     111face_fmt = "%s.faces.push( new THREE.Face3( %i, %i, %i, [ new THREE.Vector3( %.4f, %.4f, %.4f ), new THREE.Vector3( %.4f, %.4f, %.4f ), new THREE.Vector3( %.4f, %.4f, %.4f ) ]  ) );\n" 
     112 
     113def get_mesh_precision(shape, quality_factor): 
     114    bbox = Bnd_Box() 
     115    BRepBndLib_Add(shape, bbox)  
     116    x_min,y_min,z_min,x_max,y_max,z_max = bbox.Get() 
     117    diagonal_length = gp_Vec(gp_Pnt(x_min, y_min, z_min), 
     118                             gp_Pnt(x_max, y_max, z_max)).Magnitude() 
     119    return (diagonal_length / 20.) / quality_factor 
    84120 
    85121class QuickTriangleMesh(object): 
     
    104140 
    105141        self._shape = shape 
    106  
    107         bbox = Bnd_Box() 
    108         BRepBndLib_Add(self._shape, bbox)  
    109         x_min,y_min,z_min,x_max,y_max,z_max = bbox.Get() 
    110         diagonal_length = gp_Vec(gp_Pnt(x_min,y_min,z_min),gp_Pnt(x_max,y_max,z_max)).Magnitude() 
    111         self._precision = (diagonal_length / 20.)/quality_factor 
    112  
    113      
     142        self._precision = get_mesh_precision(shape, quality_factor) 
     143        self.triangle_count = 0 
     144             
    114145    def triangle_is_valid(self, P1,P2,P3): 
    115146 
     
    126157            return False 
    127158 
    128     def compute(self,output,_index_id): 
     159    def compute(self,output, pov_file, _index_id): 
    129160     
    130161        """ 
     
    136167         
    137168        """ 
    138         init_time = time.time() 
    139169        if self._shape is None: 
    140170            raise "Error: first set a shape" 
     
    175205                    p3_coord = P3.XYZ().Coord() 
    176206                    if self.triangle_is_valid(P1, P2, P3):                 
    177                         if not _points.has_key(p1_coord): 
    178                             _points.add(p1_coord,index) 
    179                             output.write("%s.vertices.push(new THREE.Vertex(new THREE.Vector3(%.4f,%.4f,%.4f)));\n"%(_index_id,p1_coord[0],p1_coord[1],p1_coord[2])) 
    180                             index+=1 
    181                         if not _points.has_key(p2_coord): 
    182                             _points.add(p2_coord,index) 
    183                             output.write("%s.vertices.push(new THREE.Vertex(new THREE.Vector3(%.4f,%.4f,%.4f)));\n"%(_index_id,p2_coord[0],p2_coord[1],p2_coord[2])) 
    184                             index+=1 
    185                         if not _points.has_key(p3_coord): 
    186                             _points.add(p3_coord,index) 
    187                             output.write("%s.vertices.push(new THREE.Vertex(new THREE.Vector3(%.4f,%.4f,%.4f)));\n"%(_index_id,p3_coord[0],p3_coord[1],p3_coord[2])) 
    188                             index+=1 
    189                         output.write("%s.faces.push( new THREE.Face3( %i, %i, %i, [ new THREE.Vector3( %.4f, %.4f, %.4f ), new THREE.Vector3( %.4f, %.4f, %.4f ), new THREE.Vector3( %.4f, %.4f, %.4f ) ]  ) );\n"%(_index_id,_points.neighbors(p1_coord)[0],_points.neighbors(p2_coord)[0],_points.neighbors(p3_coord)[0],the_normal(index1).X(),the_normal(index1).Y(), the_normal(index1).Z(),the_normal(index2).X(),the_normal(index2).Y(), the_normal(index2).Z(),the_normal(index3).X(),the_normal(index3).Y(), the_normal(index3).Z()))                             
     207                        for point in (p1_coord, p2_coord, p3_coord): 
     208                            if not _points.has_key(point): 
     209                                _points.add(point, index) 
     210                                output.write(vertice_fmt % (_index_id, point[0], point[1], point[2])) 
     211                                index+=1 
     212 
     213                        n1 = the_normal(index1) 
     214                        n2 = the_normal(index2) 
     215                        n3 = the_normal(index2) 
     216                        output.write(face_fmt %  
     217                                (_index_id, _points.neighbors(p1_coord)[0], 
     218                                            _points.neighbors(p2_coord)[0], 
     219                                            _points.neighbors(p3_coord)[0], 
     220                                            n1.X(), n1.Y(), n1.Z(), 
     221                                            n2.X(), n2.Y(), n2.Z(), 
     222                                            n3.X(), n3.Y(), n3.Z(), 
     223                                    ))                            
     224                        pov_file.write(triangle_fmt % ( 
     225                            p1_coord[0], p1_coord[1], p1_coord[2], 
     226                            n1.X(), n1.Y(), n1.Z(), 
     227                            p2_coord[0], p2_coord[1], p2_coord[2], 
     228                            n2.X(), n2.Y(), n2.Z(), 
     229                            p3_coord[0], p3_coord[1], p3_coord[2], 
     230                            n3.X(), n3.Y(), n3.Z(), 
     231                            )) 
     232                        self.triangle_count += 1 
    190233 
    191234          
  • trunk/openPLM/document3D/models.py

    r1134 r1142  
    129129    temp_file = tempfile.TemporaryFile() 
    130130    stdout = temp_file.fileno() 
    131     status=subprocess.call(["python", "document3D/generate3D.py",doc_file.file.path,str(doc_file.id),settings.MEDIA_ROOT+"3D/"],stdout=stdout) 
     131    name = "%s.png" % (doc_file_pk) 
     132    thumbnail_path = thumbnailfs.path(name) 
     133 
     134    status=subprocess.call(["python", "document3D/generate3D.py", doc_file.file.path, 
     135        str(doc_file.id), settings.MEDIA_ROOT+"3D/", thumbnail_path], 
     136        stdout=stdout) 
    132137    if status == 0: 
    133138        """ 
     
    138143        delete_GeometryFiles(doc_file) 
    139144        generate_relations_BD(doc_file,temp_file)# We associate the files generated to classes and the classes to the documentFile 
     145        if os.path.exists(thumbnail_path): 
     146            doc_file.thumbnail = os.path.basename(thumbnail_path) 
     147            doc_file.save() 
    140148 
    141149    elif status == -1: 
Note: See TracChangeset for help on using the changeset viewer.