Changeset 867 in main for branches


Ignore:
Timestamp:
03/09/12 10:09:06 (8 years ago)
Author:
agalech
Message:

3D compose and decompose

Location:
branches/3D/openPLM
Files:
2 added
11 edited

Legend:

Unmodified
Added
Removed
  • branches/3D/openPLM/document3D/STP_converter_WebGL.py

    r855 r867  
    8585 
    8686            
    87     def procesing_simples_shapes(self): 
    88         from openPLM.document3D.models import stp_to_jss 
     87    def procesing_geometrys(self): 
     88        from openPLM.document3D.models import GeometryFile 
    8989         
    9090 
     
    9393        init_time = time.time()     
    9494        for i, shape in enumerate(self.shapes_simples): 
    95                 new_stp_jss= stp_to_jss() 
    96                 new_stp_jss.stp = self.doc_file 
     95                new_GeometryFile= GeometryFile() 
     96                new_GeometryFile.stp = self.doc_file 
    9797                print "processing mesh " ,shape.nom ,   " " , i+1 , "/" ,len(self.shapes_simples) 
    9898                my_mesh = mesh_shape(shape.shape) 
    99                 name = new_stp_jss.js.storage.get_available_name(fileName+".js") 
    100                 path = os.path.join(new_stp_jss.js.storage.location, name) 
     99                name = new_GeometryFile.file.storage.get_available_name(fileName+".geo") 
     100                path = os.path.join(new_GeometryFile.file.storage.location, name) 
    101101                if(not mesh_to_3js(my_mesh,path.encode(),"_"+str(i)+"_"+str(self.doc_file.id),shape.nom)): 
    102                     print "Error generating fichier .JS for shape : " ,shape.nom  
     102                    print "Error generating file .geo for shape : " ,shape.nom  
    103103                    return False     
    104104                else: 
    105105 
    106                     new_stp_jss.js = name 
    107                     new_stp_jss.index = i 
    108                     new_stp_jss.save() 
     106                    new_GeometryFile.file = name 
     107                    new_GeometryFile.index = i 
     108                    new_GeometryFile.save() 
    109109                     
    110110        print '\n\nFinisehd computation of all shapes in %fs'%(time.time()-init_time)            
    111111 
    112112 
    113     def generate_product_relationship_arbre(self): 
     113    def generate_product_arbre(self): 
    114114     
    115115        roots = TDF_LabelSequence() 
  • branches/3D/openPLM/document3D/arborescense.py

    r850 r867  
    136136    return locate 
    137137     
    138 def read_arbrefile(doc_file,user=None): 
     138def read_ArbreFile(doc_file,user=None): 
    139139 
    140140    try:      
    141         new_arbrefile_documentFile_stp=arbrefile_documentFile_stp.objects.get(stp=doc_file) 
     141        new_ArbreFile=ArbreFile.objects.get(stp=doc_file) 
    142142    except: 
    143143        return False 
    144     arbre=json.loads(new_arbrefile_documentFile_stp.arbrefile.read()) 
    145     product=generate_product(arbre) 
     144    product=generate_product(json.loads(new_ArbreFile.file.read())) 
    146145    if user: 
    147         add_links(user,doc_file,product)         
    148              
    149          
     146        add_child_ArbreFile(user,doc_file,product)         
     147             
    150148 
    151149         
     
    153151     
    154152      
    155 def add_references_file_geometry_js(user,doc_file,files_to_add): 
     153def add_child_GeometryFiles(user,doc_file,files_to_add): 
    156154 
    157155    controller=DocumentController(doc_file.document,user) 
    158     #puede estar unido a mas de una parte? 
    159156    part=controller.get_attached_parts() 
    160157    if part: 
    161158        part=part[0] 
    162159        part_parent=part.part 
    163         #list_link=ParentChildLink.objects.filter(parent=part.part).values_list("id", flat=True) 
    164160        list_link=ParentChildLink.objects.filter(parent=part_parent) 
    165161        for i in range(len(list_link)): 
     
    174170                        STP_file=Doc_Part_Link.document.files.filter(Q(filename__iendswith=".stp") | Q(filename__iendswith=".step")) 
    175171                        if STP_file.exists(): 
    176                             to_add=stp_to_jss.objects.filter(stp=STP_file[0]) 
     172                            print "\n\nEncuentra un hijo\n\n" 
     173                            to_add=GeometryFile.objects.filter(stp=STP_file[0]) 
    177174                            for t in range(len(to_add)): 
    178175                                files_to_add.append(to_add[t])  
    179                             add_references_file_geometry_js(user,STP_file[0],files_to_add) 
    180 def add_links(user,doc_file,product): 
     176                            add_child_GeometryFiles(user,STP_file[0],files_to_add) 
     177                             
     178                             
     179def add_child_ArbreFile(user,doc_file,product): 
    181180 
    182181     
     
    187186        part=controller.get_attached_parts()[0] 
    188187        part_parent=part.part 
    189         #list_link=ParentChildLink.objects.filter(parent=part.part).values_list("id", flat=True) 
    190188        list_link=ParentChildLink.objects.filter(parent=part_parent) 
    191189        for i in range(len(list_link)): 
     
    200198                        if STP_file.exists(): 
    201199                            try: 
    202                                 new_arbrefile_documentFile_stp=arbrefile_documentFile_stp.objects.get(stp=STP_file[0]) 
    203                                 arbre=json.loads(new_arbrefile_documentFile_stp.arbrefile.read()) 
    204                                 new_product=generate_product(arbre)                                                       
     200                                new_ArbreFile=ArbreFile.objects.get(stp=STP_file[0]) 
     201                                new_product=generate_product(json.loads(new_ArbreFile.file.read()))                                                       
    205202                                product.links.append(Link(new_product))                             
    206203                                for location in list_loc: 
    207204                                    product.links[-1].add_occurrence(location.name,Matrix_rotation(location.Transforms())) 
    208                                 add_links(user,STP_file[0],new_product)                        
     205                                add_child_ArbreFile(user,STP_file[0],new_product)                        
    209206                            except: 
    210207                                pass 
     
    233230     
    234231     
    235 def write_arbrefile(product,doc_file): 
    236  
    237  
    238  
    239     delete_arbrefile(doc_file) 
     232def write_ArbreFile(product,doc_file): 
     233 
     234 
     235 
     236    delete_ArbreFile(doc_file) 
    240237     
    241238     
     
    243240 
    244241    fileName, fileExtension = os.path.splitext(doc_file.filename)  
    245     new_arbrefile_documentFile_stp= arbrefile_documentFile_stp() 
    246     new_arbrefile_documentFile_stp.stp = doc_file 
    247     name = new_arbrefile_documentFile_stp.arbrefile.storage.get_available_name(fileName+".txt") 
    248     path = os.path.join(new_arbrefile_documentFile_stp.arbrefile.storage.location, name) 
    249     new_arbrefile_documentFile_stp.arbrefile = name 
    250     new_arbrefile_documentFile_stp.save() 
    251     #try: 
     242    new_ArbreFile= ArbreFile() 
     243    new_ArbreFile.stp = doc_file 
     244    name = new_ArbreFile.file.storage.get_available_name(fileName+".arb") 
     245    path = os.path.join(new_ArbreFile.file.storage.location, name) 
     246    new_ArbreFile.file = name 
     247    new_ArbreFile.save() 
    252248    directory = os.path.dirname(path.encode())         
    253249    if not os.path.exists(directory): 
     
    256252    output.write(json.dumps(data))         
    257253    output.close()  
    258              
    259     #except:           
    260         #raise  Document3D_generate_file_Error()     
     254    return new_ArbreFile.file.path           
     255    
    261256     
    262257     
  • branches/3D/openPLM/document3D/composer.py

    r855 r867  
    66from OCC.Utils.DataExchange.STEP import StepOCAF_Export 
    77#from OCC import XCAFApp, STEPCAFControl, TDocStd, TCollection, XCAFDoc,  STEPControl 
     8from tempfile import NamedTemporaryFile 
    89 
    9 import time 
    1010 
    1111def composer(doc_file,user): 
    1212 
    13     init_time = time.time()    
     13 
    1414    my_step_importer = NEW_STEP_Import(doc_file) 
    15     product=read_arbrefile(doc_file,user) 
     15    product=read_ArbreFile(doc_file,user) 
    1616 
    1717     
    18     data=data_for_product(product) 
    19     output = open(settings.MEDIA_ROOT+"texto.txt","w") 
    20     output.write(json.dumps(data))         
    21     output.close()  
    22  
    23  
    2418 
    2519    st=my_step_importer.shape_tool 
     
    2822     
    2923    add_labels(product,lr.Value(1),st) 
    30     print "Sale"    
     24 
    3125 
    3226    WS = XSControl_WorkSession() 
    3327    writer = STEPCAFControl_Writer( WS.GetHandle(), False ) 
    3428    for i in range(lr.Length()): 
    35         writer.Transfer(lr.Value(i+1), STEPControl_AsIs)   
    36     status = writer.Write(settings.MEDIA_ROOT+"Compuesto.stp") 
     29        writer.Transfer(lr.Value(i+1), STEPControl_AsIs) 
     30         
     31    f = NamedTemporaryFile(delete=False) 
     32         
     33    status = writer.Write(f.name)  
     34    return TemplateFiletoDownload(f.name) 
    3735     
    3836    
    3937     
    4038def add_labels(product,lr,st): 
    41 #/home/linux/openPLM/branches/3D/openPLM/docs/stp/c818eb4e4353e4ceb5f250227ef2c6d2-rqssooy.stp 
    42 #DocumentFile<53.8394.10.stp, Document<DOC_00082/Document3D/a>> 
    43 #      ...    Step File Reading : /home/linux/openPLM/branches/3D/openPLM/docs/stp/c818eb4e4353e4ceb5f250227ef2c6d2-rqssooy.stp 
    4439 
    45     print "\n\n\nentra para product : " , product.name ,"\n\n\n"   
    4640    for link in product.links: 
    4741        if link.product.doc_id!= product.doc_id: 
     
    4943            print q1 
    5044            my_step_importer = NEW_STEP_Import(q1) 
    51             print "Sale 2" 
     45 
    5246            lr_2= TDF_LabelSequence() 
    53             print "Sale 2,5" 
     47 
    5448            my_step_importer.shape_tool.GetFreeShapes(lr_2) 
    5549            add_labels(link.product,lr_2.Value(1),my_step_importer.shape_tool) 
    56             print "sale 3"                     
     50                
    5751            for d in range(link.quantity): 
    58                 init_time = time.time()    
    59                 print "add : ",link.names[d] 
     52  
     53 
    6054                new_label=st.AddComponent(lr,lr_2.Value(1),TopLoc_Location(link.locations[d].Transformation())) 
    6155                SetLabelNom(new_label,link.names[d]) 
    62                 print 'Finisehd mesh computation of %s in %fs'%(link.names[d],(time.time()-init_time))                                
     56                             
    6357                 
    6458     
  • branches/3D/openPLM/document3D/decomposer.py

    r855 r867  
    1010import openPLM.plmapp.models as models 
    1111#from openPLM.document3D.step_reader import *  
    12  
    13  
    14  
    15 def decomposer_all(doc_file,list_document_controller,user,links): 
     12from openPLM.plmapp.controllers import get_controller 
     13 
     14 
     15def decomposer_all(doc_file,list_document_controller,links,user): 
    1616 
    1717    try: 
    1818        my_step_importer = NEW_STEP_Import(doc_file)  
    19         product=my_step_importer.generate_product_relationship_arbre() 
    20  
    21          
    22          
    23          
    24         i=0 
    25         for link in product.links: 
    26             diviser(link.product,list_document_controller[i],doc_file) 
    27             i+=1 
    28                                             
    29         return my_step_importer 
     19        product=my_step_importer.generate_product_arbre() 
     20        to_delete=[] 
     21 
     22 
     23 
     24 
     25        for i,link in enumerate(product.links): 
     26            diviser(link.product,list_document_controller[i],doc_file,to_delete) 
     27 
     28 
     29 
     30        decomposer_product(my_step_importer,doc_file,user,to_delete)                                 
    3031    except: 
    31         raise  Document3D_decomposer_Error 
    32  
    33  
    34  
    35  
    36  
    37  
    38 def diviser(product,Doc_controller,doc_file): 
    39  
    40  
    41  
    42  
    43     WS = XSControl_WorkSession() 
    44     writer = STEPCAFControl_Writer( WS.GetHandle(), False ) 
    45     writer.Transfer(product.label_reference, STEPControl_AsIs) 
    46      
    47     new_doc_file=DocumentFile() 
    48     name = new_doc_file.file.storage.get_available_name(product.name+".stp") 
    49     path = os.path.join(new_doc_file.file.storage.location, name) 
    50      
    51     f = open(path.encode(), 'w') 
    52     f = File(f)     
    53     status = writer.Write(f.name) 
    54      
    55     f = open(path.encode(), 'r') 
    56     f = File(f) 
    57     f.name = f.name.encode("utf-8")      
    58     new_doc_file = models.DocumentFile.objects.create(filename=product.name+".stp", size=f.size, 
    59                         file=models.docfs.save(f.name, f), document=Doc_controller.object)  
     32        raise  Document3D_decomposer_Error(to_delete) 
     33 
     34 
     35 
     36 
     37 
     38 
     39def diviser(product,Doc_controller,doc_file,to_delete): 
     40 
     41 
     42 
     43    new_doc_file=generate_DocumentFile(product,Doc_controller,product.label_reference,product.name+".stp".encode("utf-8"),to_delete) 
     44   
    6045    index_reference=[0] 
    6146    assigned_index=[] 
    62     update_product(product,new_doc_file,doc_file,index_reference,assigned_index) 
    63     write_arbrefile(product,new_doc_file) 
    64              
    65     return True 
     47    update_product(product,new_doc_file,doc_file,index_reference,assigned_index,to_delete) 
     48    to_delete.append(write_ArbreFile(product,new_doc_file)) 
     49                
     50 
    6651     
    6752         
     
    8267def elements_decomposable(fileSTP): 
    8368 
    84     product=read_arbrefile(fileSTP)                
     69    product=read_ArbreFile(fileSTP)                
    8570    if product: 
    8671        return product.links 
     
    8974 
    9075 
    91 def update_product(product,new_doc_file,old_doc_file,index_reference,assigned_index): 
     76def update_product(product,new_doc_file,old_doc_file,index_reference,assigned_index,to_delete): 
    9277 
    9378    product.doc_id=new_doc_file.id 
    9479    
    9580    if product.geometry: 
    96         copy_js(product,old_doc_file,new_doc_file,index_reference,assigned_index)            
     81        copy_js(product,old_doc_file,new_doc_file,index_reference,assigned_index,to_delete)            
    9782       
    9883    else:             
    9984        for link in product.links: 
    100             update_product(link.product,new_doc_file,old_doc_file,index_reference,assigned_index 
     85            update_product(link.product,new_doc_file,old_doc_file,index_reference,assigned_index,to_delete 
    10186    return True 
    10287 
    10388 
    104 def copy_js(product,old_doc_file,new_doc_file,index_reference,assigned_index): 
     89def copy_js(product,old_doc_file,new_doc_file,index_reference,assigned_index,to_delete): 
    10590     
    10691 
     
    10994    if not assigned_index.count(product.geometry.reference): 
    11095 
    111         old_stp_js=stp_to_jss.objects.get(stp=old_doc_file,index=product.geometry.reference) 
    112         new_stp_js= stp_to_jss()          
    113         location=new_stp_js.js.storage.location     
    114         new_stp_js.stp = new_doc_file 
     96        old_GeometryFile=GeometryFile.objects.get(stp=old_doc_file,index=product.geometry.reference) 
     97        new_GeometryFile= GeometryFile()            
     98 
    11599        fileName, fileExtension = os.path.splitext(new_doc_file.filename) 
    116         new_name = new_stp_js.js.storage.get_available_name(fileName+".js")    
    117         new_stp_js.js = new_name 
    118         new_stp_js.index = index_reference[0] 
    119          
    120         new_stp_js.save()  
    121           
    122         path = os.path.join(location, old_stp_js.js.name) 
    123         infile = open(path.encode(),"r") 
    124         path = os.path.join(location, new_name) 
    125         outfile = open(path.encode(),"w") 
     100         
     101            
     102        new_GeometryFile.file = new_GeometryFile.file.storage.get_available_name(fileName+".geo") 
     103        new_GeometryFile.stp = new_doc_file 
     104        new_GeometryFile.index = index_reference[0] 
     105        new_GeometryFile.save()  
     106        to_delete.append(new_GeometryFile.file.path)  
     107         
     108         
     109                        
     110        infile = open(old_GeometryFile.file.path,"r") 
     111        outfile = open(new_GeometryFile.file.path,"w") 
     112         
    126113        for line in infile.readlines():  
    127114            new_line=line.replace("_%s_%s"%(product.geometry.reference,old_doc_file.id),"_%s_%s"%(index_reference[0],new_doc_file.id)) 
    128115            outfile.write(new_line) 
    129         infile.close() 
    130         outfile.close() 
     116             
     117             
    131118        assigned_index.append(product.geometry.reference) 
    132119        product.geometry.reference=index_reference[0] 
     
    137124 
    138125 
    139 def decomposer_product(my_step_importer,stp_file): 
    140  
    141     product=my_step_importer.generate_product_relationship_arbre() 
     126def decomposer_product(my_step_importer,stp_file,user,to_delete): 
     127 
     128    product=my_step_importer.generate_product_arbre() 
    142129    shape_tool=my_step_importer.shape_tool 
    143130    labels_roots = TDF_LabelSequence() 
     
    145132     
    146133     
    147  
    148  
    149     delete_stp_to_jss(stp_file) 
    150     delete_arbrefile(stp_file)           
    151     stp_file.deprecated=True 
    152     stp_file.save(False) 
    153       
    154  
    155  
    156      
     134    Doc_controller=get_controller(stp_file.document.type) 
     135    Doc_controller=Doc_controller(stp_file.document,user) 
     136 
     137 
     138 
     139 
     140        
    157141     
    158142    for i in range(labels_roots.Length()): 
     
    164148 
    165149 
     150    new_doc_file=generate_DocumentFile(product,Doc_controller,labels_roots.Value(1),stp_file.filename,to_delete) 
     151    product.links=[] 
     152    product.doc_id=new_doc_file.id 
     153    to_delete.append(write_ArbreFile(product,new_doc_file))     
     154     
     155 
     156def already_decompose(ctrl_part): 
     157 
     158    list_link=ParentChildLink.objects.filter(parent=ctrl_part) 
     159    for link in list_link: 
     160        if Location_link.objects.filter(link=link):  
     161            return True 
     162    return False 
     163 
     164     
     165     
     166def generate_DocumentFile(product,Doc_controller,label,new_name,to_delete): 
     167 
    166168    new_doc_file=DocumentFile() 
    167169    name = new_doc_file.file.storage.get_available_name(product.name+".stp") 
    168170    path = os.path.join(new_doc_file.file.storage.location, name) 
    169171 
    170  
    171  
    172      
    173      
    174  
    175172    WS = XSControl_WorkSession() 
    176173    writer = STEPCAFControl_Writer( WS.GetHandle(), False ) 
    177     for i in range(labels_roots.Length()): 
    178         writer.Transfer(labels_roots.Value(i+1), STEPControl_AsIs)  
    179      
    180      
    181     f = open(path.encode(), 'w') 
    182     f = File(f)     
     174         
     175    writer.Transfer(label, STEPControl_AsIs)  
     176 
     177 
     178    f = File(open(path.encode(), 'w'))    
    183179    status = writer.Write(f.name) 
    184      
    185     f = open(path.encode(), 'r') 
    186     f = File(f) 
    187     f.name = f.name.encode("utf-8")       
    188      
    189            
    190     new_doc_file = models.DocumentFile.objects.create(filename=product.name+".stp", size=f.size, 
    191                         file=models.docfs.save(f.name, f), document=stp_file.document)  
    192  
    193     stp_file.document.save(False) 
    194     product.links=[] 
    195     product.doc_id=new_doc_file.id 
    196     write_arbrefile(product,new_doc_file) 
    197      
    198      
    199     
    200  
    201      
    202  
    203  
    204      
    205  
     180    f = File(open(path.encode(), 'r')) 
     181     
     182      
     183    Doc_controller.check_permission("owner") 
     184    Doc_controller.check_editable() 
     185     
     186    if settings.MAX_FILE_SIZE != -1 and f.size > settings.MAX_FILE_SIZE: 
     187        raise ValueError("File too big, max size : %d bytes" % settings.MAX_FILE_SIZE) 
     188             
     189    if Doc_controller.has_standard_related_locked(f.name): 
     190        raise ValueError("Native file has a standard related locked file.")  
     191    
     192    
     193    #file=name 
     194    """     
     195        new_GeometryFile.file = new_GeometryFile.file.storage.get_available_name(fileName+".geo") 
     196        new_GeometryFile.stp = new_doc_file 
     197        new_GeometryFile.index = index_reference[0] 
     198        new_GeometryFile.save()  
     199        to_delete.append(new_GeometryFile.file.path)  
     200    """     
     201     
     202          
     203    new_doc_file.filename=new_name 
     204    new_doc_file.size=f.size 
     205    new_doc_file.file=f 
     206    new_doc_file.document=Doc_controller.object 
     207    new_doc_file.save() 
     208    to_delete.append(new_doc_file.file.path)        
     209    os.chmod(new_doc_file.file.path, 0400) 
     210    os.remove(path.encode()) 
     211    Doc_controller._save_histo("File added", "file : %s" % new_doc_file.filename) 
     212 
     213 
     214    return new_doc_file  
     215     
     216     
     217    
     218 
     219     
     220 
     221 
     222     
     223 
  • branches/3D/openPLM/document3D/forms.py

    r813 r867  
    3636 
    3737 
    38     Display = forms.ModelChoiceField(queryset=stp_to_jss.objects.none(), empty_label=None) 
     38    Display = forms.ModelChoiceField(queryset=GeometryFile.objects.none(), empty_label=None) 
    3939    Display.widget.attrs["onchange"]="this.form.submit()" 
    4040     
  • branches/3D/openPLM/document3D/models.py

    r850 r867  
    2323    This model of document allows to treat files STEP for his later visualization. It extends Document with the attribute/tab 3D 
    2424    """ 
     25     
     26    PartDecompose = models.ForeignKey(Part,null=True) 
     27     
     28     
    2529    @property 
    2630    def menu_items(self): 
     
    4650    logging.getLogger("GarbageCollector").setLevel(logging.ERROR) 
    4751    from openPLM.document3D.STP_converter_WebGL import NEW_STEP_Import 
    48     from openPLM.document3D.arborescense import write_arbrefile 
     52    from openPLM.document3D.arborescense import write_ArbreFile 
    4953    doc_file = DocumentFile.objects.get(pk=doc_file_pk) 
    5054    user=User.objects.get(id=user_id) 
     
    5256    controller=Document3DController(object,user)  
    5357 
    54     delete_stp_to_jss(doc_file) 
     58    #solo si ha tenido exito los borra, sino deja los viejos 
     59    delete_GeometryFiles(doc_file) 
    5560 
    5661    my_step_importer = NEW_STEP_Import(doc_file)  
    57     my_step_importer.procesing_simples_shapes() 
    58     product_relationship=my_step_importer.generate_product_relationship_arbre() 
    59     write_arbrefile(product_relationship,doc_file) 
     62    my_step_importer.procesing_geometrys() 
     63    product_arbre=my_step_importer.generate_product_arbre() 
     64    write_ArbreFile(product_arbre,doc_file) 
    6065     
    6166    #y si fallo?       
     
    8792        if fileExtension.upper() in ('.STP', '.STEP'): 
    8893            Document3D=self.object              
    89             delete_stp_to_jss(doc_file) 
    90             
     94            delete_GeometryFiles(doc_file) 
     95            delete_ArbreFile(doc_file) 
     96                        
    9197        super(Document3DController, self).delete_file(doc_file) 
    9298         
    9399 
    94              
     100    def deprecate_file(self, doc_file): 
     101     
     102     
     103     
     104        self.check_permission("owner") 
     105        self.check_editable() 
     106        delete_GeometryFiles(doc_file) 
     107        delete_ArbreFile(doc_file)           
     108        doc_file.deprecated=True 
     109        self._save_histo("File deprecated", "file : %s" % doc_file.filename)            
    95110      
    96111 
    97         return True      
    98  
    99  
    100  
    101      
    102  
    103   
    104112 
    105113   
    106 media3Djs = DocumentStorage(location=settings.MEDIA_ROOT+"3D/")       
    107 class stp_to_jss(models.Model): 
     114media3DGeometryFile = DocumentStorage(location=settings.MEDIA_ROOT+"3D/")       
     115class GeometryFile(models.Model): 
    108116    u""" 
    109117    Link between file STEP present in a Document3D and  files .js that represents his geometries   1..* 
    110118    """ 
    111     js = models.FileField(upload_to='.',storage=media3Djs) 
     119    file = models.FileField(upload_to='.',storage=media3DGeometryFile) 
    112120    stp = models.ForeignKey(DocumentFile) 
    113121    index = models.IntegerField() 
    114     count = models.IntegerField(default=1) # no se utiliza, se puede quitar 
    115 def delete_stp_to_jss(doc_file): 
    116  
    117  
    118     to_delete=stp_to_jss.objects.filter(stp=doc_file)  
    119     list_files=list(to_delete.values_list("js", flat=True)) 
     122 
     123def delete_GeometryFiles(doc_file): 
     124 
     125 
     126    to_delete=GeometryFile.objects.filter(stp=doc_file)  
     127    list_files=list(to_delete.values_list("file", flat=True)) 
     128    delete_files(list_files,media3DGeometryFile.location) 
     129    to_delete.delete() 
     130     
     131  
     132           
     133media3DArbreFile = DocumentStorage(location=settings.MEDIA_ROOT+"3D/") 
     134class ArbreFile(models.Model): 
     135    file = models.FileField(upload_to='.',storage=media3DArbreFile) 
     136    stp = models.ForeignKey(DocumentFile) 
     137      
     138def delete_ArbreFile(doc_file): 
     139 
     140 
     141    to_delete=ArbreFile.objects.filter(stp=doc_file)  
     142    list_files=list(to_delete.values_list("file", flat=True)) 
     143    delete_files(list_files,media3DArbreFile.location) 
     144    to_delete.delete()    
     145     
     146def delete_files(list_files,ext=""): 
    120147    for name in list_files: 
    121         filename = media3Djs.location +"/"+ name 
     148        filename=ext+name 
    122149        if os.path.exists(filename) and os.path.isfile(filename): 
    123150            os.remove(filename) 
    124     to_delete.delete() 
    125      
    126   
    127            
    128 media3D_arbrefile = DocumentStorage(location=settings.MEDIA_ROOT+"3D/arborescence") 
    129 class arbrefile_documentFile_stp(models.Model): 
    130     arbrefile = models.FileField(upload_to='.',storage=media3D_arbrefile) 
    131     stp = models.ForeignKey(DocumentFile) 
    132       
    133 def delete_arbrefile(doc_file): 
    134  
    135  
    136     to_delete=arbrefile_documentFile_stp.objects.filter(stp=doc_file)  
    137     list_files=list(to_delete.values_list("arbrefile", flat=True)) 
    138     for name in list_files: 
    139         filename = media3D_arbrefile.location +"/"+ name 
    140         if os.path.exists(filename) and os.path.isfile(filename): 
    141             os.remove(filename) 
    142     to_delete.delete()    
    143      
    144              
     151"""                         
    145152class Document_decompose_Error(Exception):   
    146153    def __init__(self, index_error): 
     
    149156    def __unicode__(self): 
    150157        return u"Columns reference, type, revision are not unique for index : %s"%self.index_error 
    151          
     158"""         
    152159class Document3D_decomposer_Error(Exception): 
     160    def __init__(self, to_delete=None):   
     161        self.to_delete=to_delete 
    153162    def __unicode__(self): 
    154163        return u"Error while the file step was decomposed" 
     
    339348                    
    340349        loc.save()        
    341                 
     350 
     351class TemplateFiletoDownload(object): 
     352    def __init__(self, path):  
     353        self.path = path 
     354    def __iter__(self):   
     355        try:  
     356            with open(self.path, "rb") as f: 
     357                for line in f: 
     358                    yield line  
     359        finally: 
     360            os.remove(self.path)                    
    342361 
    343362@memoize_noarg 
  • branches/3D/openPLM/document3D/templates/Display3D.htm

    r842 r867  
    198198 
    199199 
    200          // 
     200 
    201201    //Me faltan los margenes para cuadrar bien todo 
    202202    //Me falta desactivar la rueda dentro de la division 
     
    225225         
    226226                <script type="text/javascript" src="/media/js/Three.js"></script>  
    227                 {% for item in file_geometry_js %} 
    228                 <script type="text/javascript" src="/media/3D/{{ item.js.name}}"></script> 
     227                {% for item in GeometryFiles %} 
     228                <script type="text/javascript" src="/media/3D/{{ item.file.name}}"></script> 
    229229                {% endfor %} 
    230230 
  • branches/3D/openPLM/document3D/tests/views.py

    r855 r867  
    4848        self.post(self.base_url+"decompose/"+str(new_doc_file.id)+"/",data)  
    4949        response = self.get(self.document.object.plmobject_url+"3D/")         
    50         self.assertEqual(len(response.context["file_geometry_js"]), 3) 
     50        self.assertEqual(len(response.context["GeometryFiles"]), 3) 
    5151        #self.assertEqual(response.context["select_stp_form"].as_table(), form.as_table())     
    5252             
     
    6262        response_post = self.post(self.document.object.plmobject_url+"3D/",  
    6363                            data)      
    64         self.assertEqual(5, len(response_post.context["file_geometry_js"])) 
     64        self.assertEqual(5, len(response_post.context["GeometryFiles"])) 
    6565        self.assertNotEqual(response_post.context["javascript_arborescense"],False)         
    6666                
     
    7373        new_doc_file=self.document.add_file(myfile)           
    7474        form=Form3D(document=self.document) 
    75         arbrefile_documentFile_stp.objects.get(stp=new_doc_file).delete() 
     75        ArbreFile.objects.get(stp=new_doc_file).delete() 
    7676        data={u'csrfmiddlewaretoken': [u'6a0951fed02461061f796c63d98bb430'], u'Display': [new_doc_file.id],u'select_stp_form' : form} 
    7777        response_post = self.post(self.document.object.plmobject_url+"3D/",data)   
    78         self.assertEqual(5, len(list(response_post.context["file_geometry_js"]))) 
     78        self.assertEqual(5, len(list(response_post.context["GeometryFiles"]))) 
    7979        self.assertEqual(response_post.context["javascript_arborescense"], False)         
    8080         
     
    8282     
    8383        response = self.get(self.document.object.plmobject_url+"3D/") 
    84         self.assertEqual(response.context["file_geometry_js"], []) 
     84        self.assertEqual(response.context["GeometryFiles"], []) 
    8585        self.assertEqual(response.context["javascript_arborescense"], False) 
    8686         
     
    8989        myfile = File(f) 
    9090        new_doc_file=self.document.add_file(myfile)        
    91         arbrefile_documentFile_stp.objects.get(stp=new_doc_file).delete() 
     91        ArbreFile.objects.get(stp=new_doc_file).delete() 
    9292        response = self.get(self.document.object.plmobject_url+"3D/")     
    93         self.assertEqual(3, len(list(response.context["file_geometry_js"]))) 
     93        self.assertEqual(3, len(list(response.context["GeometryFiles"]))) 
    9494        self.assertEqual(response.context["javascript_arborescense"], False) 
    9595 
     
    9999        new_doc_file=self.document.add_file(myfile)        
    100100        response = self.get(self.document.object.plmobject_url+"3D/")     
    101         self.assertEqual(response.context["file_geometry_js"],[]) 
     101        self.assertEqual(response.context["GeometryFiles"],[]) 
    102102        self.assertNotEqual(response.context["javascript_arborescense"], False)     
    103103                 
     
    106106        myfile = File(f) 
    107107        new_doc_file=self.document.add_file(myfile)        
    108         stp_to_jss.objects.filter(stp=new_doc_file).delete() 
     108        GeometryFile.objects.filter(stp=new_doc_file).delete() 
    109109        response = self.get(self.document.object.plmobject_url+"3D/")     
    110         self.assertEqual([], response.context["file_geometry_js"]) 
     110        self.assertEqual([], response.context["GeometryFiles"]) 
    111111        self.assertNotEqual(response.context["javascript_arborescense"], False)   
    112112        
     
    268268        data = data1 
    269269        self.update_time(data) 
    270         stp_to_jss.objects.filter(stp=new_doc_file).delete() 
     270        GeometryFile.objects.filter(stp=new_doc_file).delete() 
    271271        reponse=self.post(self.base_url+"decompose/"+str(new_doc_file.id)+"/",data) 
    272272        self.assertEqual(reponse.context["extra_errors"],u"Error while the file step was decomposed")         
     
    325325 
    326326 
     327class more_3dTest(CommonViewTest): 
     328 
     329    def setUp(self): 
     330        super(view_3dTest, self).setUp() 
     331        self.document = Document3DController.create('doc1', 'Document3D', 
     332                'a', self.user, self.DATA) 
     333 
     334    def update_time(self,data): 
     335        data.update({u'last_modif_time': [u'%s-%s-%s %s:%s:%s'%(self.document.mtime.year,self.document.mtime.month,self.document.mtime.day,self.document.mtime.hour,self.document.mtime.minute,self.document.mtime.second)], 
     336           u'last_modif_microseconds' : [u'%s'%self.document.mtime.microsecond] 
     337           }) 
     338 
    327339 
    328340 
    329341data1={u'2-lifecycle': [u'draft_official_deprecated'], u'3-lifecycle': [u'draft_official_deprecated'], u'reference': [u'PART_00002'], u'form-0-quantity': [u'1'], u'form-1-order': [u'20'], u'3-revision': [u'a'], u'form-1-type_part': [u'Part'], u'initial-3-lifecycle': [u'draft_official_deprecated'], u'2-group': [u'2'], u'form-0-unit': [u'-'], u'1-lifecycle': [u'draft_official_deprecated'], u'3-group': [u'2'], u'group': [u'2'], u'1-revision': [u'a'], u'form-1-quantity': [u'3'], u'2-name': [u'NBA_ASM'], u'form-0-type_part': [u'Part'], u'csrfmiddlewaretoken': [u'6a0951fed02461061f796c63d98bb430', u'6a0951fed02461061f796c63d98bb430'], u'3-name': [u'NBA_ASM'], u'revision': [u'a'], u'initial-2-lifecycle': [u'draft_official_deprecated'], u'initial-1-lifecycle': [u'draft_official_deprecated'], u'form-1-unit': [u'-'], u'1-name': [u'L-BRACKET'], u'form-TOTAL_FORMS': [u'2', u'2'], u'2-reference': [u'PART_00003'], u'2-revision': [u'a'], u'form-INITIAL_FORMS': [u'2', u'2'],  u'lifecycle': [u'draft_official_deprecated'], u'initial-lifecycle': [u'draft_official_deprecated'], u'3-reference': [u'DOC_00003'], u'name': [u'L-BRACKET'], u'form-MAX_NUM_FORMS': [u'2', u'2'], u'1-group': [u'2'], u'form-0-type_document3D': [u'Document3D'], u'form-0-order': [u'10'], u'form-1-type_document3D': [u'Document3D'], u'1-reference': [u'DOC_00002']} 
    330342 
     343 
     344#u'reference': [u'PART_00001'] 
    331345data6={u'2-lifecycle': [u'draft_official_deprecated'], u'3-lifecycle': [u'draft_official_deprecated'], u'reference': [u'PART_00001'], u'form-0-quantity': [u'1'], u'form-1-order': [u'20'], u'3-revision': [u'a'], u'form-1-type_part': [u'Part'], u'initial-3-lifecycle': [u'draft_official_deprecated'], u'2-group': [u'2'], u'form-0-unit': [u'-'], u'1-lifecycle': [u'draft_official_deprecated'], u'3-group': [u'2'], u'group': [u'2'], u'1-revision': [u'a'], u'form-1-quantity': [u'3'], u'2-name': [u'NBA_ASM'], u'form-0-type_part': [u'Part'], u'csrfmiddlewaretoken': [u'6a0951fed02461061f796c63d98bb430', u'6a0951fed02461061f796c63d98bb430'], u'3-name': [u'NBA_ASM'], u'revision': [u'a'], u'initial-2-lifecycle': [u'draft_official_deprecated'], u'initial-1-lifecycle': [u'draft_official_deprecated'], u'form-1-unit': [u'-'], u'1-name': [u'L-BRACKET'], u'form-TOTAL_FORMS': [u'2', u'2'], u'2-reference': [u'PART_00001'], u'2-revision': [u'a'], u'form-INITIAL_FORMS': [u'2', u'2'],  u'lifecycle': [u'draft_official_deprecated'], u'initial-lifecycle': [u'draft_official_deprecated'], u'3-reference': [u'DOC_00003'], u'name': [u'L-BRACKET'], u'form-MAX_NUM_FORMS': [u'2', u'2'], u'1-group': [u'2'], u'form-0-type_document3D': [u'Document3D'], u'form-0-order': [u'10'], u'form-1-type_document3D': [u'Document3D'], u'1-reference': [u'DOC_00002']} 
    332346 
  • branches/3D/openPLM/document3D/urls.py

    r842 r867  
    1919    (r'^object/([^/]+)/([^/]+)/([^/]+)/BOM-child/$', views.display_bomb_child), 
    2020    (r'^object/([^/]+)/([^/]+)/([^/]+)/decompose/([^/]+)/$', views.display_decompose), 
     21    (r'^object/Document3D/([^/]+)/([^/]+)/files/$', views.display_files), 
     22    (r'^file/3D/(?P<docfile_id>\d+)/(?P<filename>.*)$', views.download), 
    2123    (r'^ajax/decompose/$', views.ajax_decompose_form), 
    22     (r'^file/(?P<docfile_id>\d+)/$', views.download), 
    23     (r'^file/stp/(?P<docfile_id>\d+)/(?P<filename>.*)$', views.download), 
    24  
    2524) 
    2625 
  • branches/3D/openPLM/document3D/views.py

    r852 r867  
    1717from mimetypes import guess_type 
    1818from openPLM.document3D.composer import composer 
     19from openPLM.plmapp.controllers import get_controller 
     20import openPLM.plmapp.forms as forms 
     21 
     22from django.conf import settings 
     23 
    1924 
    2025def r2r(template, dictionary, request): 
     
    5358            options = form.cleaned_data 
    5459            doc_file = options["Display"] 
    55             file_geometry_js=list(stp_to_jss.objects.filter(stp=doc_file))    
    56             add_references_file_geometry_js(request.user,doc_file,file_geometry_js) 
     60            GeometryFiles=list(GeometryFile.objects.filter(stp=doc_file))    
     61            add_child_GeometryFiles(request.user,doc_file,GeometryFiles) 
    5762             
    5863             
    59             product=read_arbrefile(doc_file,request.user) 
     64            product=read_ArbreFile(doc_file,request.user) 
    6065            javascript_arborescense=generate_javascript_for_3D(product) 
    6166 
    6267                          
    6368 
    64             ctx.update({'select_stp_form': form, 'file_geometry_js' : file_geometry_js,'javascript_arborescense' : javascript_arborescense, })     
     69            ctx.update({'select_stp_form': form, 'GeometryFiles' : GeometryFiles,'javascript_arborescense' : javascript_arborescense, })     
    6570            return r2r('Display3D.htm', ctx, request) 
    6671         
     
    7479     
    7580    if doc_file is None: 
    76         file_geometry_js=[] 
    77         more_file_geometry_js=[] 
     81        GeometryFiles=[] 
    7882        javascript_arborescense=False 
    7983    else: 
    8084 
    81         file_geometry_js=list(stp_to_jss.objects.filter(stp=doc_file))   
    82         add_references_file_geometry_js(request.user,doc_file,file_geometry_js) 
    83         product=read_arbrefile(doc_file,request.user)    
     85        GeometryFiles=list(GeometryFile.objects.filter(stp=doc_file))   
     86        add_child_GeometryFiles(request.user,doc_file,GeometryFiles) 
     87        product=read_ArbreFile(doc_file,request.user)    
    8488        javascript_arborescense=generate_javascript_for_3D(product) 
    8589 
    8690         
    87     ctx.update({'select_stp_form': form , 'file_geometry_js' : file_geometry_js , 'javascript_arborescense' : javascript_arborescense , }) 
     91    ctx.update({'select_stp_form': form , 'GeometryFiles' : GeometryFiles , 'javascript_arborescense' : javascript_arborescense , }) 
    8892  
    8993    return r2r('Display3D.htm', ctx, request) 
     
    157161                         
    158162 
    159     decompose_valid=[]      
    160     list_doc=obj.get_attached_documents() 
    161     for Doc_Part_Link in list_doc: 
    162         controller=DocumentController(Doc_Part_Link.document,request.user) 
    163         file_stp =is_decomposable(controller) 
    164         if file_stp:              
    165             decompose_valid.append((Doc_Part_Link.document,file_stp))  
     163    decompose_valid=[] 
     164    if not already_decompose(obj):      
     165        list_doc=obj.get_attached_documents() 
     166        for Doc_Part_Link in list_doc: 
     167            controller=DocumentController(Doc_Part_Link.document,request.user) 
     168            file_stp =is_decomposable(controller) 
     169            if file_stp:              
     170                decompose_valid.append((Doc_Part_Link.document,file_stp))  
    166171 
    167172                             
     
    214219            document_controller=DocumentController(stp_file.document,request.user) 
    215220 
    216             # como casar que un form a dado no valido por eso? 
     221 
    217222            if options: 
    218223 
    219                 #django Datetimefields does not suport micro seconds 
    220                 # 
     224                # y si tiene un nativo   que hago con el 
    221225                if  same_time(old_modification_data_time,old_modification_data_microsecond,document_controller.mtime) and links and len(links)==len(options) and stp_file.checkout_valid:  
    222226 
    223227 
    224228                    try: 
     229                        native_related=stp_file.native_related 
     230                        if native_related: 
     231                            native_related.deprecated=True     
    225232                        document_controller.lock(stp_file) 
    226233                         
    227234                        try: 
    228                             my_step_importer=decomposer_stp(stp_file,options,links,obj,request.user) 
     235                         
     236                         
     237                            decomposer_stp(stp_file,options,links,obj) 
     238                         
     239                         
    229240                             
    230241                        except Exception as excep: 
    231                             extra_errors=excep.__unicode__()#"Columns reference, type, revision are not unique"                            
     242                            if type(excep) == Document3D_decomposer_Error:  
     243                                delete_files(excep.to_delete) 
     244                            extra_errors=excep.__unicode__()                                                        
    232245                        else: 
    233                             decomposer_product(my_step_importer,stp_file) 
     246                            ctrl=get_controller(stp_file.document.type) 
     247                            ctrl=ctrl(stp_file.document,obj._user) 
     248                            ctrl.deprecate_file(stp_file) 
    234249                            return HttpResponseRedirect(obj.plmobject_url+"BOM-child/")                                                       
    235250                        finally: 
     251 
    236252                            document_controller.unlock(stp_file) 
    237253                             
     
    239255                    except LockError as excep: 
    240256                                extra_errors="Documentfile is locked" 
    241                    
     257                    finally: 
     258 
     259                        if native_related: 
     260                            native_related.deprecated=False 
     261                            native_related.save(False) 
     262               
    242263 
    243264                else: 
     
    327348 
    328349 
    329 def generate_part_doc_links(prepare_list,links,obj,user):           
     350def generate_part_doc_links(prepare_list,links,obj):           
    330351    index=0 
    331352    list_document_controller=[] 
     
    335356 
    336357        try:  
    337             part_controller=obj.create_from_form(part_doc_create_form[0],user,False,True) 
     358            part_controller=obj.create_from_form(part_doc_create_form[0],obj._user,False,True) 
    338359            instances.append((part_controller.object._meta.app_label,part_controller.object._meta.module_name, part_controller.object._get_pk_val()))  
    339360 
    340361            ParentChildLink = obj.add_child(part_controller.object,ord_quantity[1],ord_quantity[0],ord_quantity[2])                 
    341362            generate_extra_location_links(links[index],ParentChildLink)  
    342          
    343             doc_controller=obj.create_from_form(part_doc_create_form[1],user,False,True) 
     363            doc_controller=obj.create_from_form(part_doc_create_form[1],obj._user,False,True)             
    344364            instances.append((doc_controller.object._meta.app_label,doc_controller.object._meta.module_name, doc_controller.object._get_pk_val())) 
    345             part_controller.attach_to_document(doc_controller.object)  
    346  
    347             list_document_controller.append(doc_controller) 
     365            part_controller.attach_to_document(doc_controller.object) 
     366            controller_cls = get_controller(doc_controller.object.type) 
     367            list_document_controller.append(controller_cls(doc_controller.object,obj._user)) 
    348368 
    349369            index+=1 
     
    482502    :return: a :class:`django.http.HttpResponse` 
    483503    """ 
    484      
     504 
     505         
    485506    doc_file = DocumentFile.objects.get(id=docfile_id) 
    486507    ctrl=DocumentController(doc_file.document,request.user) 
     
    491512        mimetype = 'application/octet-stream'  
    492513         
    493             
     514        
    494515    fileName, fileExtension = os.path.splitext(doc_file.filename)  
    495     if fileExtension.upper() in ('.STP', '.STEP'): 
    496         composer(doc_file,request.user) 
    497         response = HttpResponse(file(doc_file.file.path), mimetype=mimetype) 
    498         response["Content-Length"] = doc_file.file.size         
     516    if fileExtension.upper() in ('.STP', '.STEP') and not doc_file.deprecated: 
     517 
     518        tempfile=composer(doc_file,request.user) 
     519        size=os.path.getsize(tempfile.path) 
     520         
     521        response = HttpResponse(tempfile, mimetype=mimetype) 
     522        response["Content-Length"] = size 
     523      
    499524    else:     
    500525        response = HttpResponse(file(doc_file.file.path), mimetype=mimetype) 
     
    506531    if not filename: 
    507532        response['Content-Disposition'] = 'attachment; filename="%s"' % name 
     533     
    508534    return response 
    509535 
    510  
    511       
     536####################################################################### 
     537@handle_errors 
     538def display_files(request,  obj_ref, obj_revi): 
     539    """ 
     540    Manage html page which displays the files (:class:`DocumentFile`) uploaded in the selected object. 
     541    It computes a context dictionnary based on 
     542     
     543    .. include:: views_params.txt  
     544    """ 
     545    obj_type="Document3D" 
     546    obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) 
     547 
     548    if not hasattr(obj, "files"): 
     549        raise TypeError() 
     550    if request.method == "POST": 
     551        formset = get_file_formset(obj, request.POST) 
     552        if formset.is_valid(): 
     553            obj.update_file(formset) 
     554            return HttpResponseRedirect(".") 
     555    else: 
     556        formset = get_file_formset(obj) 
     557 
     558    archive_form = forms.ArchiveForm() 
     559     
     560    ctx.update({'current_page':'files',  
     561                'file_formset': formset, 
     562                'archive_form' : archive_form, 
     563                'deprecated_files' : obj.deprecated_files, 
     564               }) 
     565    return r2r('displayfiles3D.html', ctx, request) 
     566########################################################################      
    512567@transaction.commit_on_success         
    513 def decomposer_stp(stp_file,options,links,obj,user):   
     568def decomposer_stp(stp_file,options,links,obj):   
    514569   
    515     list_doc3D_controller , instances =generate_part_doc_links(options,links,obj,user)                           
    516     my_step_importer=decomposer_all(stp_file,list_doc3D_controller,user,links) 
     570    list_doc3D_controller , instances =generate_part_doc_links(options,links,obj)                           
     571    my_step_importer=decomposer_all(stp_file,list_doc3D_controller,links,obj._user)                     
    517572    update_indexes.delay(instances) 
    518     return my_step_importer  
    519      
    520  
     573  
     574     
     575 
  • branches/3D/openPLM/plmapp/tests/base.py

    r817 r867  
    5656            try: 
    5757                os.remove(df.file.path) 
    58             except IOError: 
     58            except (IOError, OSError): 
    5959                pass 
    6060 
Note: See TracChangeset for help on using the changeset viewer.