Changeset 842 in main for branches


Ignore:
Timestamp:
03/06/12 16:13:57 (8 years ago)
Author:
agalech
Message:

Added decomposition and composition for files step

Location:
branches/3D/openPLM
Files:
3 added
13 edited

Legend:

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

    r813 r842  
    1919 
    2020import os, os.path 
    21  
    22 from openPLM.plmapp.controllers.part import PartController 
    23 from django.db.models import Q 
     21import time 
    2422 
    2523from OCC.TDataStd import * 
     
    3735from OCC.TopLoc import TopLoc_Location 
    3836from OCC.TDF import * 
    39  
     37from openPLM.document3D.Mesh import * 
     38from openPLM.document3D.models import * 
    4039""" 
    4140l_SubShapes = TDF_LabelSequence() 
     
    4948    
    5049     
    51     def __init__(self, filename): 
    52         self.filename = filename 
     50    def __init__(self, doc_file): 
     51        self.doc_file = doc_file 
    5352        self.shapes_simples = [] #an empty string 
    54         self.shapes_arbre= [] 
    55  
    56     def get_color_tool(self): 
    57         return self.color_tool     
    58     def get_shapes_simples(self): 
    59         return self.shapes_simples   
    60     def get_shapes_arbre(self): 
    61         return self.shapes_arbre 
    62     def get_shapes_tool(self): 
    63         return self.shape_tool         
    64    
    65     def get_color_tool(self): 
    66         return self._color_tool      
    67     def read_file(self,doc_file,user_to_load_part_reference=False):           
     53        self.product_relationship_arbre=None 
     54        self.shapes_simples=[] 
     55 
     56        
    6857        STEPReader = STEPCAFControl_Reader()         
    6958         
    70         if not STEPReader.ReadFile(self.filename) is 1: 
     59        if not STEPReader.ReadFile(self.doc_file.file.path.encode()) is 1: 
    7160            return False 
    7261                
     
    8170        h_shape_tool = XCAFDoc.XCAFDoc_DocumentTool_ShapeTool(doc.Main()) 
    8271        h_colors_tool = XCAFDoc.XCAFDoc_DocumentTool_ColorTool(doc.Main()) 
    83         shape_tool = h_shape_tool.GetObject() 
    84         color_tool=h_colors_tool.GetObject() 
    85         self.color_tool=color_tool 
    86         self.shape_tool=shape_tool         
    87          
    88  
    89          
    90         ColorLabels = TDF_LabelSequence() 
    91         l=color_tool.BaseLabel() 
    92         color_tool.GetColors(ColorLabels) 
    93  
    94  
    95  
    96         l_Labels_root = TDF_LabelSequence() 
    97         l_LabelShapes = TDF_LabelSequence() 
    98         shape_tool.GetShapes(l_LabelShapes) 
    99         shape_tool.GetFreeShapes(l_Labels_root) 
    100      
    101  
    102         # We generate the list of nodes with geometry (SimpleShape) 
    103         # if we found a shape without vertex we dont include on the list   
    104         for i in range(l_LabelShapes.Length()): 
    105             if shape_tool.IsSimpleShape(l_LabelShapes.Value(i+1)): 
    106                 compShape=shape_tool.GetShape(l_LabelShapes.Value(i+1)) 
    107                 t=Topo(compShape)     
     72        self.shape_tool = h_shape_tool.GetObject() 
     73        self.color_tool=h_colors_tool.GetObject() 
     74 
     75        shapes = TDF_LabelSequence() 
     76        self.shape_tool.GetShapes(shapes)         
     77        for i in range(shapes.Length()): 
     78            if self.shape_tool.IsSimpleShape(shapes.Value(i+1)): 
     79                compShape=self.shape_tool.GetShape(shapes.Value(i+1)) 
     80                t=Topo(compShape) 
    10881                if t.number_of_vertices() > 0: 
    109                     self.shapes_simples.append(simple_shape(GetLabelNom(l_LabelShapes.Value(i+1)),compShape)) 
     82                    self.shapes_simples.append(simple_shape(GetLabelNom(shapes.Value(i+1)),compShape)) 
    11083                else: 
    111                     print "Not information found for shape : ", GetLabelNom(l_LabelShapes.Value(i+1)) 
    112            
    113         #We are going to refill the tree with information 
    114          
    115          
    116         for i in range(l_Labels_root.Length()): 
    117             generate_arbre_shape(l_Labels_root.Value(i+1),shape_tool,self.shapes_arbre,color_tool,self.shapes_simples,doc_file.id) 
    118             #generate_arbre_shape(l_Labels_root.Value(i+1),shape_tool,self._shapes_arbre,color_tool,self._shapes_simples,"5") 
    119         if user_to_load_part_reference:# y si tengo varios root? 
    120             add_references_to_arbre(user_to_load_part_reference,self._shapes_arbre[0],doc_file)  
    121          
    122          
    123         return True 
     84                    print "Not information found for shape : ", GetLabelNom(shapes.Value(i+1))         
     85 
    12486            
    125             
    126 #def truncate_names(): 
    127  
    128  
     87    def procesing_simples_shapes(self): 
     88        from openPLM.document3D.models import stp_to_jss 
     89         
     90 
     91 
     92        fileName, fileExtension = os.path.splitext(self.doc_file.filename) 
     93        init_time = time.time()     
     94        for i, shape in enumerate(self.shapes_simples): 
     95                new_stp_jss= stp_to_jss() 
     96                new_stp_jss.stp = self.doc_file 
     97                print "processing mesh " ,shape.nom ,   " " , i+1 , "/" ,len(self.shapes_simples) 
     98                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) 
     101                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  
     103                    return False     
     104                else: 
     105 
     106                    new_stp_jss.js = name 
     107                    new_stp_jss.index = i 
     108                    new_stp_jss.save() 
     109                     
     110        print '\n\nFinisehd computation of all shapes in %fs'%(time.time()-init_time)            
     111 
     112 
     113    def generate_product_relationship_arbre(self): 
     114     
     115        roots = TDF_LabelSequence() 
     116        self.shape_tool.GetFreeShapes(roots) 
     117             
     118        for i in range(roots.Length()): 
     119            self.product_relationship_arbre=Product(GetLabelNom(roots.Value(i+1)),self.doc_file.id,roots.Value(i+1))  
     120            parcour_product_relationship_arbre(roots.Value(i+1),self.shape_tool,self.product_relationship_arbre,self.color_tool,self.shapes_simples,self.doc_file.id) 
     121        
     122        return self.product_relationship_arbre 
     123         
     124 
     125 
     126       
     127 
     128 
     129          
    129130class simple_shape(): 
    130131 
     
    136137 
    137138 
    138 def add_references_to_arbre(user,shapes_arbre,doc_file): 
    139  
    140      
    141     controller=Document3DController(doc_file.document,user) 
    142     #puede estar unido a mas de una parte? 
    143     part=controller.get_attached_parts()[0] 
    144     part_parent=part.part 
    145     #list_link=ParentChildLink.objects.filter(parent=part.part).values_list("id", flat=True) 
    146     list_link=ParentChildLink.objects.filter(parent=part_parent) 
    147     for i in range(len(list_link)): 
    148         list_loc=Location_link.objects.filter(link=list_link[i]) 
    149         if len(list_loc)>0:  
    150             part_child=list_link[i].child 
    151             part_controller=PartController(part_child,user) 
    152             list_doc=part_controller.get_attached_documents() 
    153             for Doc_Part_Link in list_doc: 
    154                 if Doc_Part_Link.document.type=="Document3D":# y si hay mas de uno ?? tratar el caso 
    155                     STP_file=Doc_Part_Link.document.files.filter(Q(filename__iendswith=".stp") | Q(filename__iendswith=".step")) 
    156                     if STP_file.exists(): 
    157                         my_step_importer = NEW_STEP_Import( STP_file[0].file.path.encode())   #simple 
    158                         my_step_importer.read_file(STP_file[0],user) 
    159                         new_arbre=my_step_importer.get_shapes_arbre() 
    160                         new_arbre=new_arbre[0] #to get the root 
    161                         for t in range(len(list_loc)):                        
    162                             if t is 0: 
    163                                 new_arbre.names[t]=list_loc[t].name_reference 
    164                                 new_arbre.locations[t]=generate_location(list_loc[t]) 
    165                             else: 
    166                                 new_arbre.names.append(list_loc[t].name_reference) 
    167                                 new_arbre.locations.append(generate_location(list_loc[t]))     
    168                                 new_arbre.quantity+=1 
    169                         new_arbre.root=False  
    170                         new_arbre.reference=True         
    171                         shapes_arbre.children.append(new_arbre) 
    172  
    173      
    174      
    175     #shapes_arbre.children.append() 
     139 
    176140      
    177141 
     
    187151    location=TopLoc_Location(transformation) 
    188152    return location 
    189         
    190 def generate_arbre_shape(label,shape_tool,arbre_shape,color_tool,shapes_simples,doc_id): 
    191  
    192 #buscamos los vecinos con el mismo ref 
    193 #si es una referencia buscamos si algun vecino tiene la misma referencia 
    194     reference_found=False  
    195     if shape_tool.IsReference(label): 
    196      
    197      
    198         label_reference=TDF_Label() 
    199         shape_tool.GetReferredShape(label,label_reference)     
    200  
    201         for i in range(len(arbre_shape)): 
    202             if shape_tool.GetShape(arbre_shape[i].label_reference).IsPartner(shape_tool.GetShape(label_reference)):                       
    203                 reference_found=i 
    204                 break 
    205                  
     153     
     154     
     155     
     156def parcour_product_relationship_arbre(label,shape_tool,product,color_tool,shapes_simples,doc_id): 
     157 
     158 
     159 
     160    if shape_tool.IsAssembly(label): 
     161 
     162        l_c = TDF_LabelSequence() 
     163        shape_tool.GetComponents(label,l_c) 
     164        for i in range(l_c.Length()): 
     165            if shape_tool.IsReference(l_c.Value(i+1)): 
     166                label_reference=TDF_Label()             
     167                shape_tool.GetReferredShape(l_c.Value(i+1),label_reference)          
     168                reference_found=False 
     169                for link in product.links: 
     170                    if shape_tool.GetShape(link.product.label_reference).IsPartner(shape_tool.GetShape(label_reference)):                       
     171                        reference_found=True 
     172                        break 
     173                if reference_found: 
     174                        link.add_occurrence(GetLabelNom(l_c.Value(i+1)),Matrix_rotation(shape_tool.GetLocation(l_c.Value(i+1)).Transformation())) 
     175                else: 
     176                         
     177                    product.links.append(Link(Product(GetLabelNom(label_reference),doc_id,label_reference))) 
     178                    product.links[-1].add_occurrence(GetLabelNom(l_c.Value(i+1)),Matrix_rotation(shape_tool.GetLocation(l_c.Value(i+1)).Transformation())) 
     179                                 
     180                    parcour_product_relationship_arbre(label_reference,shape_tool,product.links[-1].product,color_tool,shapes_simples,doc_id) 
     181 
     182    else:             
     183        compShape=shape_tool.GetShape(label) 
     184        #nous cherchons sa correspondance dans la liste de shapes simples / si le shape navais pas de vertices on ne trouvera aucun shape                          
     185        for s in range(len(shapes_simples)): 
     186            if compShape.IsPartner(shapes_simples[s].shape): 
     187                product.set_shape_geometry_related(Geometry(colour_chercher(label,color_tool,shape_tool),s))  
    206188                  
    207         if reference_found: 
    208             arbre_shape[reference_found].Add_reference(label,GetLabelNom(label),shape_tool.GetLocation(label)) 
    209              
    210         else: 
    211             label_to_expand=label_reference 
    212             SetLabelNom(label_to_expand,GetLabelNom(label_to_expand))              
    213             arbre_shape.append(node_shape(label,GetLabelNom(label),shape_tool.GetLocation(label),label_to_expand,GetLabelNom(label_to_expand),shape_tool.IsTopLevel(label),doc_id)) 
    214              
    215                                      
    216     else: 
    217         label_to_expand=label 
    218         SetLabelNom(label_to_expand,GetLabelNom(label_to_expand))    
    219         arbre_shape.append(node_shape(label_to_expand,GetLabelNom(label_to_expand),shape_tool.GetLocation(label_to_expand),label_to_expand,GetLabelNom(label_to_expand),shape_tool.IsTopLevel(label_to_expand),doc_id)) 
    220                  
    221     if not reference_found: 
    222      
    223         if shape_tool.IsAssembly(label_to_expand): 
    224         
    225                 l_c = TDF_LabelSequence() 
    226                 shape_tool.GetComponents(label_to_expand,l_c)  
    227                 for i in range(l_c.Length()): 
    228                     generate_arbre_shape(l_c.Value(i+1),shape_tool,arbre_shape[len(arbre_shape)-1].children,color_tool,shapes_simples,doc_id) 
    229         else: 
    230          
    231             compShape=shape_tool.GetShape(label) 
    232             #nous cherchons sa correspondance dans la liste de shapes simples / si le shape navais pas de vertices on ne trouvera aucun shape                          
    233             for s in range(len(shapes_simples)): 
    234                 if compShape.IsPartner(shapes_simples[s].shape): 
    235                     arbre_shape[len(arbre_shape)-1].children.append(feuille_nom_shapes(GetLabelNom(label),colour_chercher(label,color_tool,shape_tool),s,doc_id))  
    236                     break 
    237          
    238          
    239  
    240  
     189                    
     190 
     191                
    241192 
    242193 
     
    250201            lab.FindAttribute(TDataStd_Name_GetID(),N) 
    251202            n=N.GetObject() 
    252             return n.Get().PrintToString()#.decode("latin-1") 
     203            return unicode(n.Get().PrintToString(),errors='ignore')#.decode("latin-1") 
     204             
     205             
    253206def SetLabelNom(lab,nom): 
    254207 
     
    258211    lab.FindAttribute(TDataStd_Name_GetID(),N) 
    259212    n=N.GetObject() 
    260     n.Set(TCollection_ExtendedString(nom))#.encode("latin-1"))) 
     213    n.Set(TCollection_ExtendedString(nom.encode("latin-1"))) 
    261214    return True 
    262215  
     
    281234                    
    282235 
    283 #la referencia deberia ser un nombre de fichero o un docfile completo? 
    284 class node_shape(object): 
    285     u""" 
    286     Representation of a node (component) not leaf in the arborescense of the file STEP 
    287  
    288     :key attributes: 
    289         .. attribute:: nom 
    290  
    291             Reference the nom of a STEP component (A component can be composed of other components or of shapes) 
    292              
    293         .. attribute:: children=[] 
    294  
    295             Link to the children of the node (A children can be a component or a shape) 
    296              
    297         .. attribute:: loc 
    298  
    299             It stores the location relative of a component:Virement rotation and axis of rotation 
    300  
    301     """ 
    302     __slots__ = ("names", "location_relations", "children", "quantity","labels","reference","root","label_reference","name_product","doc_id") 
    303      
    304      
    305     def __init__(self,label,name,location,label_reference,name_product,root,doc_id,reference=False): 
    306         self.labels = [label]       
    307         self.names = [name] 
    308         self.location_relations = [location] 
    309         self.label_reference=label_reference 
    310         self.children=[] 
    311         self.quantity=1 
    312         self.name_product=name_product 
    313         self.doc_id=doc_id   #cambiar por stp id 
    314         self.reference=reference 
    315         self.root=root 
    316  
    317          # para meter la referencia y asi tener componentes 
    318  
    319     def Add_reference(self,label,name,location): 
    320         self.labels.append(label)       
    321         self.names.append(name) 
    322         self.location_relations.append(location) 
    323         self.quantity=self.quantity+1  
    324                      
    325     def IsReference(self): 
    326         return self.reference 
    327          
    328     def IsRoot(self): 
    329         return self.root 
    330          
    331           
    332 class feuille_nom_shapes(object): 
    333     u""" 
    334     Representation of a leaf (shape geometry) in the arborescense of the file STEP,this representation is not direct, stores a reference that allows to obtain the    geometry 
    335  
    336     :key attributes: 
    337         .. attribute:: nom 
    338  
    339             Reference the nom of a STEP geometry  
    340         .. attribute:: reference 
    341  
    342             During the treatment of files STEP we are going to generate a vector with all the different simple geometries, this reference is an entire number that    indicates the index inside the vector where we will find the geometry (more ahead it will be necessarily to combine the locations to place the geometry in the space)     
    343          
    344  
    345          
    346         .. attribute:: red 
    347  
    348             In case of shapes with color, it stores the component of red between 0 and 1 
    349          
    350         .. attribute:: green 
    351  
    352             In case of shapes with color, it stores the component of green between 0 and 1 
    353          
    354         .. attribute:: blue 
    355  
    356             In case of shapes with color, it stores the component of blue between 0 and 1 
    357  
    358     """ 
    359      
    360     __slots__ = ("nom", "reference", "red", "green", "blue","doc_id") 
    361      
    362     def __init__(self, nom,colour,ref,doc_id): 
    363         self.nom = nom 
    364         self.reference=ref 
    365         self.doc_id=doc_id 
    366         if colour: 
    367             self.red=colour.Red() 
    368             self.green=colour.Green() 
    369             self.blue=colour.Blue() 
    370         else: 
    371             self.red = self.green = self.blue = 0 
     236 
     237             
     238             
     239            
     240 
  • branches/3D/openPLM/document3D/arborescense.py

    r813 r842  
    1 from kjbuckets import kjGraph 
    21from OCC.TopLoc import TopLoc_Location 
    3 from OCC.Utils.DataExchange.STEP import StepOCAF_Export 
    4 from django.core.files import File 
    52from OCC.TDF import * 
    63import os, os.path 
    7 import time 
    8  
    9 from openPLM.plmapp.models import * 
    10 from openPLM.document3D.STP_converter_WebGL import node_shape 
     4import simplejson as json  
    115from OCC.gp import * 
    12 from openPLM.document3D.Mesh import * 
    13 import numpy as numpy 
    14 import math 
    15  
    16 #: storage location for files .js that were representing the geometries of the file step 
    17 media3Djs = DocumentStorage(location=settings.MEDIA_ROOT+"3D/") 
    18  
    19  
    20 #: storage location for files .js that were representing the arborescence of the file step     
    21 media3Djs_arborescense = DocumentStorage(location=settings.MEDIA_ROOT+"3D/arborescence") 
    22  
    23  
    24 class stp_to_jss_arborescense(models.Model): 
    25     u""" 
    26     Link between file STEP present in a Document3D and a file .js that represents his arborescense   1..1 
    27     """ 
    28     js = models.FileField(upload_to='.',storage=media3Djs_arborescense) 
    29     stp = models.ForeignKey(DocumentFile)  
    30  
    31  
    32 #Link between file step and his geometries   1 for *          
    33 class stp_to_jss(models.Model): 
    34     u""" 
    35     Link between file STEP present in a Document3D and  files .js that represents his geometries   1..* 
    36     """ 
    37     js = models.FileField(upload_to='.',storage=media3Djs) 
    38     stp = models.ForeignKey(DocumentFile) 
    39     index = models.IntegerField() 
    40     count = models.IntegerField(default=1) # no se utiliza, se puede quitar 
    41      
    42      
    43      
    44 def procesing_simples_shapes(my_shapes_simples,doc_file): 
    45  
    46  
    47     fileName, fileExtension = os.path.splitext(doc_file.filename) 
    48     init_time = time.time()     
    49     for i, shape in enumerate(my_shapes_simples): 
    50             new_stp_jss= stp_to_jss() 
    51             new_stp_jss.stp = doc_file 
    52             print "processing mesh " ,shape.nom ,   " " , i+1 , "/" ,len(my_shapes_simples) 
    53             my_mesh = mesh_shape(shape.shape) 
    54             name = new_stp_jss.js.storage.get_available_name(fileName+".js") 
    55             path = os.path.join(new_stp_jss.js.storage.location, name) 
    56             if(not mesh_to_3js(my_mesh,path.encode(),"_"+str(i)+"_"+str(doc_file.id),shape.nom)): 
    57                 print "Error generating fichier .JS for shape : " ,shape.nom  
    58                 return False     
     6from openPLM.plmapp.controllers.part import PartController 
     7from django.db.models import Q 
     8from openPLM.document3D.models import *  
     9    
     10def generate_javascript_for_3D(product): 
     11 
     12    if product: 
     13        numeration=[0] 
     14         
     15        javascript=['var object3D = new THREE.Object3D();\n'] 
     16         
     17        javascript_menu=['function menu() {\nelement = document.createElement("div");\nelement.id="root";\nelement.innerHTML ="'] 
     18 
     19 
     20         
     21        javascript[0]+='var part%s=new THREE.Object3D();\n'%numeration[0] 
     22        javascript_menu[0]+=function_generate_menu(numeration[0],product.name)          
     23 
     24        ok=generate_javascript(product,numeration,javascript,[],javascript_menu,numeration[0]) 
     25         
     26        javascript_menu[0]+='</li></ul>' 
     27 
     28         
     29        javascript_menu[0]+='";\ndocument.getElementById("menu_").appendChild(element);\n}\n' 
     30 
     31 
     32        return javascript_menu[0]+javascript[0] 
     33    else: 
     34        return False 
     35     
     36        
     37def generate_javascript(product,numeration,javascript,loc,javascript_menu,old_numeration): 
     38     
     39     
     40    numeration[0]+=1      
     41 
     42    javascript_menu[0]+="<ul>" 
     43         
     44    if  not product.geometry: 
     45        parts_generated=[] 
     46              
     47        for link in product.links: 
     48         
     49             
     50             
     51            for i in range(link.quantity): 
     52 
     53                loc2=loc[:] 
     54                loc2.append(link.locations[i]) 
     55                parts_generated.append(numeration[0]) 
     56                                  
     57                javascript_menu[0]+=function_generate_menu(numeration[0],link.names[i])                 
     58                       
     59                generate_javascript(link.product,numeration,javascript,loc2,javascript_menu,numeration[0])  
     60        
     61                javascript_menu[0]+="</li>" 
     62             
     63                 
     64        javascript[0]+=generate_functions_visibilty_parts(old_numeration,parts_generated) 
     65     
     66    else:        
     67   
     68        javascript[0]+=generate_functions_visibilty_object(old_numeration,numeration[0],product,loc) 
     69               
     70 
     71    javascript_menu[0]+="</ul>"         
     72         
     73                             
     74             
     75 
     76 
     77 
     78def generate_functions_visibilty_parts(numeration,parts_generated): 
     79 
     80 
     81        parts_definition="" 
     82        function=str(function_head % (locals())) 
     83        for part_numeration_child in parts_generated: 
     84            parts_definition+="var part%s=new THREE.Object3D();\n"%part_numeration_child 
     85            function+=str(function_change_part % (locals())) 
     86        function+="}\n" 
     87        return parts_definition+function         
     88 
     89 
     90 
     91  
     92def generate_functions_visibilty_object(numeration,object_numeration,product,loc): 
     93 
     94 
     95        red=product.geometry.red 
     96        green=product.geometry.green 
     97        blue=product.geometry.blue 
     98        reference=product.geometry.reference 
     99        part_id=str(product.doc_id)         
     100                                
     101        object_generate=str(function_generate_objects % (locals()))         
     102        object_generate+=locate_object(loc,object_numeration) 
     103         
     104     
     105        function=str(function_head % (locals())) 
     106        function+=str(function_change_object % (locals()))      
     107        function+="}\n"            
     108        return object_generate+function  
     109 
     110 
     111 
     112 
     113def locate_object(loc,numeration): 
     114 
     115     
     116    locate="" 
     117    if len(loc)>0: 
     118        transformation=gp_Trsf() 
     119        gp=gp_XYZ() 
     120        for g in range(len(loc)): 
     121            if g==0: 
     122                transformation=loc[g].Transformation() 
    59123            else: 
    60  
    61                 new_stp_jss.js = name 
    62                 new_stp_jss.index = i 
    63                 #new_stp_jss.count=shape.count 
    64                 new_stp_jss.save() 
     124                transformation.Multiply(loc[g].Transformation()) 
    65125                 
    66     print '\n\nFinisehd computation of all shapes in %fs'%(time.time()-init_time) 
    67 def generate_file_arborescense(my_shapes_arbre,doc_file): 
    68  
    69  
    70     graph=kjGraph() 
    71     root=[] 
    72     part_numeration=[0] 
    73     menu_generate_objects=["var object3D = new THREE.Object3D();\n"] 
    74  
    75     for i in range(len(my_shapes_arbre)): 
    76         ok=parcours_recursif(my_shapes_arbre[i],graph,part_numeration,menu_generate_objects,[],"",root) 
    77      
    78  
    79     if ok: 
    80         return generate_file(doc_file,graph,root,menu_generate_objects) 
    81      
    82         
    83  
    84  
    85  
    86 def parcours_recursif(my_shapes_arbre,graph,part_numeration,menu_generate_objects,loc,old_name,root): 
    87      
    88      
    89      
    90  
    91     if  isinstance(my_shapes_arbre,node_shape): 
    92         for index in range(my_shapes_arbre.quantity): 
    93             loc2=loc[:] 
     126        a ,b =transformation.GetRotation(gp) 
     127        t=transformation.TranslationPart() 
     128     
     129        if a:         
     130            locate+="object%s.matrix.setRotationAxis(new THREE.Vector3( %s, %s, %s ), %s);\n"%(numeration,gp.X(),gp.Y(),gp.Z(),b) 
     131                             
     132        locate+="object%s.matrix.setPosition(new THREE.Vector3( %s, %s, %s ));\n"%(numeration,t.X(),t.Y(),t.Z())                      
     133        locate+="object%s.matrixAutoUpdate = false;\n"%numeration 
     134     
     135      
     136    return locate 
     137     
     138def read_arbrefile(doc_file,user=None): 
     139 
     140    try:      
     141        new_arbrefile_documentFile_stp=arbrefile_documentFile_stp.objects.get(stp=doc_file) 
     142    except: 
     143        return False 
     144    arbre=json.loads(new_arbrefile_documentFile_stp.arbrefile.read()) 
     145    product=generate_product(arbre) 
     146    if user: 
     147        add_links(user,doc_file,product)         
     148             
     149         
     150 
     151         
     152    return product  
     153 
     154def add_links(user,doc_file,product): 
     155 
     156     
     157    controller=Document3DController(doc_file.document,user) 
     158    #puede estar unido a mas de una parte? 
     159    part=controller.get_attached_parts() 
     160    if part: 
     161        part=controller.get_attached_parts()[0] 
     162        part_parent=part.part 
     163        #list_link=ParentChildLink.objects.filter(parent=part.part).values_list("id", flat=True) 
     164        list_link=ParentChildLink.objects.filter(parent=part_parent) 
     165        for i in range(len(list_link)): 
     166            list_loc=Location_link.objects.filter(link=list_link[i]) 
     167            if len(list_loc)>0:  
     168                part_child=list_link[i].child 
     169                part_controller=PartController(part_child,user) 
     170                list_doc=part_controller.get_attached_documents() 
     171                for Doc_Part_Link in list_doc: 
     172                    if Doc_Part_Link.document.type=="Document3D":# y si hay mas de uno ?? tratar el caso 
     173                        STP_file=Doc_Part_Link.document.files.filter(Q(filename__iendswith=".stp") | Q(filename__iendswith=".step")) 
     174                        if STP_file.exists(): 
     175                            try: 
     176                                new_arbrefile_documentFile_stp=arbrefile_documentFile_stp.objects.get(stp=STP_file[0]) 
     177                                arbre=json.loads(new_arbrefile_documentFile_stp.arbrefile.read()) 
     178                                new_product=generate_product(arbre)                                                       
     179                                product.links.append(Link(new_product))                             
     180                                for location in list_loc: 
     181                                    product.links[-1].add_occurrence(location.name,Matrix_rotation(location.Transforms())) 
     182                                add_links(user,STP_file[0],new_product)                        
     183                            except: 
     184                                pass 
     185    else: 
     186        pass 
     187                                 
     188                                 
     189 
     190                                                        
     191def generate_product(arbre):     
     192 
     193    product=Product(arbre[0][0],arbre[0][1],False,arbre[0][2]) 
     194    for i in range(len(arbre)-1): 
     195        product.links.append(generate_link(arbre[i+1]))      
     196    return product 
     197 
     198         
     199def generate_link(arbre): 
     200   
     201    product=generate_product(arbre[1]) 
     202    link=Link(product) 
     203    for i in range(len(arbre[0])): 
     204        link.add_occurrence(arbre[0][i][0],Matrix_rotation(False,arbre[0][i][1]))      
     205    return link 
     206     
     207     
     208     
     209def write_arbrefile(product,doc_file): 
     210 
     211 
     212 
     213    delete_arbrefile(doc_file) 
     214     
     215     
     216    data=data_for_product(product) 
     217 
     218    fileName, fileExtension = os.path.splitext(doc_file.filename)  
     219    new_arbrefile_documentFile_stp= arbrefile_documentFile_stp() 
     220    new_arbrefile_documentFile_stp.stp = doc_file 
     221    name = new_arbrefile_documentFile_stp.arbrefile.storage.get_available_name(fileName+".txt") 
     222    path = os.path.join(new_arbrefile_documentFile_stp.arbrefile.storage.location, name) 
     223    new_arbrefile_documentFile_stp.arbrefile = name 
     224    new_arbrefile_documentFile_stp.save() 
     225    #try: 
     226    directory = os.path.dirname(path.encode())         
     227    if not os.path.exists(directory): 
     228        os.makedirs(directory) 
     229    output = open(path.encode(),"w") 
     230    output.write(json.dumps(data))         
     231    output.close()  
     232             
     233    #except:           
     234        #raise  Document3D_generate_file_Error()     
     235     
     236     
     237                 
     238def data_for_product(product): 
     239    output=[] 
     240     
     241    if product.geometry: 
    94242           
    95  
    96             if not my_shapes_arbre.IsRoot(): 
    97                 loc2.append(my_shapes_arbre.location_relations[index])    
    98                 nom=my_shapes_arbre.names[index] 
    99                 nom=nom+"."+str(part_numeration[0]) 
    100                 graph.add(old_name,nom) 
    101             else: 
    102                 nom=my_shapes_arbre.name_product+"."+str(part_numeration[0]) 
    103                 root.append(nom) 
     243        output.append([product.name,product.doc_id,product.geometry.reference])         
     244    else:  
     245        output.append([product.name,product.doc_id,None]) 
     246         
     247    for link in product.links: 
     248        output.append(data_for_link(link))     
     249    return output             
     250 
    104251                
    105                  
    106                  
    107             menu_generate_objects[0]+="var part%s=new THREE.Object3D();\n"%part_numeration[0] 
    108             part_numeration[0]=part_numeration[0]+1 
    109             for i in range(len(my_shapes_arbre.children)): 
    110                 parcours_recursif(my_shapes_arbre.children[i],graph,part_numeration,menu_generate_objects,loc2,nom,root) 
    111                  
    112              
    113              
    114              
    115     else:  
    116  
    117         numeration=part_numeration[0] 
    118         red=my_shapes_arbre.red 
    119         green=my_shapes_arbre.green 
    120         blue=my_shapes_arbre.blue 
    121         reference=my_shapes_arbre.reference 
    122         part_id=str(my_shapes_arbre.doc_id) 
    123         menu_generate_objects[0]+=str(function_generate_objects % (locals())) 
    124  
    125  
    126         if len(loc)>0: 
    127             transformation=gp_Trsf() 
    128             gp=gp_XYZ() 
    129             for g in range(len(loc)): 
    130                 if g==0: 
    131                     transformation=loc[g].Transformation() 
    132                 else: 
    133                     transformation.Multiply(loc[g].Transformation()) 
    134                      
    135             a ,b =transformation.GetRotation(gp) 
    136             t=transformation.TranslationPart() 
    137  
    138             if a:         
    139                 menu_generate_objects[0]+="object%s.matrix.setRotationAxis(new THREE.Vector3( %s, %s, %s ), %s);\n"%(part_numeration[0],gp.X(),gp.Y(),gp.Z(),b) 
    140                  
    141              
    142             menu_generate_objects[0]+="object%s.matrix.setPosition(new THREE.Vector3( %s, %s, %s ));\n"%(part_numeration[0],t.X(),t.Y(),t.Z()) 
    143              
    144              
    145             #menu_generate_objects[0]+="var rotate = new THREE.Matrix4(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 );\n" 
    146             #menu_generate_objects[0]+="object%s.matrix.multiplySelf( rotate );\n"%part_numeration[0] 
    147             menu_generate_objects[0]+="object%s.matrixAutoUpdate = false;\n"%part_numeration[0] 
    148              
    149              
    150         graph.add(old_name,str(part_numeration[0])) 
    151         part_numeration[0]=part_numeration[0]+1 
    152                        
    153     return True      
     252def data_for_link(link): 
     253 
     254     
     255    output=[]     
     256    name_loc=[] 
     257    for i in range(link.quantity):              
     258        name_loc.append([link.names[i],link.locations[i].to_array()])  
     259                
     260    output.append(name_loc)         
     261    output.append(data_for_product(link.product)) 
     262         
     263    return output     
     264     
    154265    
    155      
    156  
    157 function_generate_objects= """ 
    158  
    159 var NewMaterial=new THREE.MeshBasicMaterial({opacity:1,shading:THREE.SmoothShading}); 
    160 NewMaterial.color.setRGB(%(red)f,%(green)f,%(blue)f); 
    161 var object%(numeration)s=new THREE.Mesh( new _%(reference)s_%(part_id)s(),NewMaterial ); 
    162 object3D.add(object%(numeration)s);         
    163 """    
    164   
    165  
    166 def generate_file(doc_file,graph,root,menu_generate_objects): 
    167  
    168  
    169      
    170  
    171     #remove possible previous arborescense cuando vengo desde decomposer tmb tengo que hacer remove 
    172  
    173     arborescense_js=stp_to_jss_arborescense.objects.filter(stp=doc_file) 
    174     if arborescense_js: 
    175         js_to_delete="arborescence/"+str(arborescense_js[0].js) 
    176         arborescense_js.delete()    
    177     else: 
    178         js_to_delete=""               
    179       
    180   
    181     #eliminer_associes([],arborescense_js) 
    182  
    183     ### 
    184      
    185     fileName, fileExtension = os.path.splitext(doc_file.filename)  
    186     new_stp_to_jss_arborescense= stp_to_jss_arborescense() 
    187     new_stp_to_jss_arborescense.stp = doc_file 
    188      
    189     #si ya existe sobreescribimos, sino uno nuevo 
    190     name = new_stp_to_jss_arborescense.js.storage.get_available_name(fileName+".js") 
    191     path = os.path.join(new_stp_to_jss_arborescense.js.storage.location, name) 
    192     new_stp_to_jss_arborescense.js = name 
    193     new_stp_to_jss_arborescense.save() 
    194     try: 
    195  
    196         directory = os.path.dirname(path.encode())         
    197         if not os.path.exists(directory): 
    198             os.makedirs(directory) 
    199              
    200            
    201         output = open(path.encode(),"w") 
    202          
    203          
    204         ######Generate Menu javascript and objects##################################################################################         
    205         output.write("function menu() {\nelement = document.createElement(\"div\");\nelement.id=\"root\";\nelement.innerHTML =\"")         
    206         generate_menu(graph,output,root)   
    207         output.write("\";\ndocument.getElementById('menu_').appendChild(element);\n}\n") 
    208         ######End generate menu##################################################################################################### 
    209          
    210          
    211         #####           Generate objects javascript 
    212         output.write(menu_generate_objects[0]) 
    213         #####           End generate objects 
    214          
    215                  
    216         #####           Generate functions javascript 
    217         generate_functions(graph,output,root) 
    218         #####           End generate functions 
    219          
    220          
    221  
    222                 
    223         output.close()  
    224              
    225     except:           
    226         raise  Document3D_generate_file_Error()     
    227      
    228     return js_to_delete  
    229  
    230  
    231  
    232  
    233  
    234  
    235   
    236 function_change_part_head = """ 
    237 function change_part%(part_numeration)s(atribute) { 
     266 
     267       
     268def function_generate_menu(numeration,name): 
     269 
     270    onclick="change_part"+str(numeration)+"(\\\"click\\\")"  
     271    return "<li > <a href='#' onClick='%s'><b onClick='%s'></b>%s </a>"%(onclick,onclick,name) 
     272     
     273     
     274          
     275function_head = """ 
     276function change_part%(numeration)s(atribute) { 
    238277    if (atribute==\"click\"){ 
    239278     
    240         part%(part_numeration)s.visible=!part%(part_numeration)s.visible; 
     279        part%(numeration)s.visible=!part%(numeration)s.visible; 
    241280         
    242281    } 
    243282    else{ 
    244         part%(part_numeration)s.visible=atribute; 
    245     } 
    246          
     283        part%(numeration)s.visible=atribute; 
     284    }        
    247285"""  
     286 
     287 
    248288function_change_part = """ 
    249     change_part%(part_numeration_2)s(part%(part_numeration)s.visible)        
     289    change_part%(part_numeration_child)s(part%(numeration)s.visible)        
    250290""" 
    251291function_change_object = """ 
    252     object%(object_numeration)s.visible=part%(part_numeration)s.visible;    
     292    object%(object_numeration)s.visible=part%(numeration)s.visible;    
    253293"""                                     
    254            
    255 def generate_functions(graph,output,root): 
    256  
    257          
    258                
    259     for i in range(len(root)): 
    260   
    261          
    262         feuille=graph.neighbors(root[i]) 
    263         if not len(feuille)==0: 
    264          
    265           
    266             part_name, part_numeration = os.path.splitext(root[i]) 
    267             part_numeration=part_numeration.replace(".","")         
    268  
    269             output.write(function_change_part_head % (locals()))  
    270  
    271             for t in range(len(feuille)): 
    272                 feuille_2=graph.neighbors(feuille[t]) 
    273                  
    274                 if feuille_2: 
    275                      
    276             
    277                     part_name, part_numeration_2 = os.path.splitext(feuille[t]) 
    278                     part_numeration_2=part_numeration_2.replace(".","") 
    279                     output.write(function_change_part % (locals()))  
    280                         
    281                 else:   # si el numero de puntos es uno #revisar 
    282                                      
    283                     object_numeration = feuille[t]     
    284  
    285                     if "." not in str(object_numeration):  
    286     
    287                         output.write(function_change_object % (locals()))  
    288  
    289   
    290              
    291  
    292             output.write("}\n") 
    293             generate_functions(graph,output,graph.neighbors(root[i])) 
    294  
    295  
    296  
    297  
    298  
    299   
    300  
    301 def generate_menu(graph,output,root): 
    302  
    303  
    304  
    305     output.write("<ul>")     
    306      
    307     for i in range(len(root)): 
    308   
    309         feuille=graph.neighbors(root[i]) 
    310         if not len(feuille)==0:  
    311           
    312             part_name, part_numeration = os.path.splitext(root[i]) 
    313             part_numeration=part_numeration.replace(".","") 
    314              
    315              
    316             functio_onclick="change_part"+part_numeration+"(\\\"click\\\")" 
    317             output.write("<li > <a href='#' onClick='%s'><b onClick='%s'></b>%s </a>"%(functio_onclick,functio_onclick,part_name)) 
    318            
    319             generate_menu(graph,output,graph.neighbors(root[i]))        
    320             output.write("</li>") 
    321  
    322     
    323     output.write("</ul>") 
    324      
    325      
    326      
    327      
    328      
    329 def rotation_from_matrix(matrix): 
    330     """Return rotation angle and axis from rotation matrix. 
    331  
    332     >>> angle = (random.random() - 0.5) * (2*math.pi) 
    333     >>> direc = numpy.random.random(3) - 0.5 
    334     >>> point = numpy.random.random(3) - 0.5 
    335     >>> R0 = rotation_matrix(angle, direc, point) 
    336     >>> angle, direc, point = rotation_from_matrix(R0) 
    337     >>> R1 = rotation_matrix(angle, direc, point) 
    338     >>> is_same_transform(R0, R1) 
    339     True 
    340  
    341     """ 
    342     R = numpy.array(matrix, dtype=numpy.float64, copy=False) 
    343     R33 = R[:3, :3] 
    344     # direction: unit eigenvector of R33 corresponding to eigenvalue of 1 
    345     w, W = numpy.linalg.eig(R33.T) 
    346     i = numpy.where(abs(numpy.real(w) - 1.0) < 1e-7)[0] 
    347     if not len(i): 
    348         raise ValueError("no unit eigenvector corresponding to eigenvalue 1") 
    349     direction = numpy.real(W[:, i[-1]]).squeeze() 
    350     # point: unit eigenvector of R33 corresponding to eigenvalue of 1 
    351     w, Q = numpy.linalg.eig(R) 
    352     i = numpy.where(abs(numpy.real(w) - 1.0) < 1e-7)[0] 
    353     if not len(i): 
    354         raise ValueError("no unit eigenvector corresponding to eigenvalue 1") 
    355     point = numpy.real(Q[:, i[-1]]).squeeze() 
    356     point /= point[3] 
    357     # rotation angle depending on direction 
    358     cosa = (numpy.trace(R33) - 1.0) / 2.0 
    359     if abs(direction[2]) > 1e-7: 
    360         sina = (R[1, 0] + (cosa-1.0)*direction[0]*direction[1]) / direction[2] 
    361     elif abs(direction[1]) > 1e-7: 
    362         sina = (R[0, 2] + (cosa-1.0)*direction[0]*direction[2]) / direction[1] 
    363     else: 
    364         sina = (R[2, 1] + (cosa-1.0)*direction[1]*direction[2]) / direction[0] 
    365     angle = math.atan2(sina, cosa) 
    366     return angle, direction, point 
     294function_generate_objects= """ 
     295var NewMaterial=new THREE.MeshBasicMaterial({opacity:0.5,shading:THREE.SmoothShading}); 
     296NewMaterial.color.setRGB(%(red)f,%(green)f,%(blue)f); 
     297var object%(object_numeration)s=new THREE.Mesh( new _%(reference)s_%(part_id)s(),NewMaterial ); 
     298object3D.add(object%(object_numeration)s);         
     299"""          
     300   
     301 
     302 
     303 
     304 
     305   
     306     
     307     
     308     
     309     
  • branches/3D/openPLM/document3D/data_test/stp_false.stp

    r669 r842  
     1fzegzegze 
  • branches/3D/openPLM/document3D/decomposer.py

    r817 r842  
    88from django.db.models import Q 
    99import os, os.path 
     10import openPLM.plmapp.models as models 
    1011#from openPLM.document3D.step_reader import *  
    1112 
    1213 
    1314 
    14 def decomposer_all(doc_file,list_document_controller,user,list_branchs_decomposables,arbre,parent_controller): 
    15  
    16  
    17     for i in range (len(list_branchs_decomposables)): 
    18         diviser(list_branchs_decomposables[i],list_document_controller[i],doc_file,parent_controller)             
    19     return True 
     15def decomposer_all(doc_file,list_document_controller,user,links): 
     16 
     17    my_step_importer = NEW_STEP_Import(doc_file)  
     18    product=my_step_importer.generate_product_relationship_arbre() 
     19 
     20     
     21     
     22     
     23    i=0 
     24    for link in product.links: 
     25        diviser(link.product,list_document_controller[i],doc_file) 
     26        i+=1 
     27 
     28         
     29    #WS = XSControl_WorkSession() 
     30    #writer = STEPCAFControl_Writer( WS.GetHandle(), False ) 
     31     
     32     
     33                     
     34    return my_step_importer 
    2035 
    2136 
     
    2338 
    2439    list=[] 
    25     for t in range(len(arbre)): 
    26  
    27         for i in range(len(arbre[t].children)): 
    28             list.append(arbre[t].children[i]) 
    29             """ 
    30             if isinstance(arbre[t].children[i],node_shape): 
     40    for link in arbre[0].links:  
     41        list.append(link) 
    3142             
    32                 if  not arbre[t].children[i].IsReference(): 
    33                     list.append(arbre[t].children[i]) 
    34            """  
    3543    return list 
    3644 
    3745 
    3846 
    39 def diviser(old_branch,Doc_controller,doc_file,parent_controller): 
     47def diviser(product,Doc_controller,doc_file): 
    4048 
    4149 
     
    4452    WS = XSControl_WorkSession() 
    4553    writer = STEPCAFControl_Writer( WS.GetHandle(), False ) 
    46     writer.Transfer(old_branch.label_reference, STEPControl_AsIs) 
    47     status = writer.Write(settings.MEDIA_ROOT+old_branch.name_product+".stp")              
    48     f=open(settings.MEDIA_ROOT+old_branch.name_product+".stp") 
    49     myfile = File(f) 
    50     myfile.name=GetLabelNom(old_branch.label_reference)+".stp" 
    51      
    52  
    53     if parent_controller.type==u'Document3D' and  Doc_controller.type==u'Document3D': 
    54         #se recorren de la misma manera?  
    55         new_doc_file=Doc_controller.add_file(myfile,False) 
    56         index_reference=[0] 
    57         assigned_index=[] 
    58         Doc_controller.update_links_whit_jss_and_branch(old_branch,index_reference,new_doc_file,doc_file,assigned_index)    
    59         old_branch.root=True 
    60         save_quantity=old_branch.quantity 
    61         old_branch.quantity=1            
    62         generate_file_arborescense([old_branch],new_doc_file)                   
    63     elif Doc_controller.type!=u'Document3D': 
    64         new_doc_file=Doc_controller.add_file(myfile) 
    65     elif Doc_controller.type==u'Document3D': 
    66         Doc_controller=Document3DController(Doc_controller.object,Doc_controller._user) 
    67         new_doc_file=Doc_controller.add_file(myfile)             
    68  
     54    writer.Transfer(product.label_reference, STEPControl_AsIs) 
     55     
     56    new_doc_file=DocumentFile() 
     57    name = new_doc_file.file.storage.get_available_name(product.name+".stp") 
     58    path = os.path.join(new_doc_file.file.storage.location, name) 
     59     
     60    f = open(path.encode(), 'w') 
     61    f = File(f)     
     62    status = writer.Write(f.name) 
     63     
     64    f = open(path.encode(), 'r') 
     65    f = File(f) 
     66    f.name = f.name.encode("utf-8")      
     67    new_doc_file = models.DocumentFile.objects.create(filename=product.name+".stp", size=f.size, 
     68                        file=models.docfs.save(f.name, f), document=Doc_controller.object)  
     69    index_reference=[0] 
     70    assigned_index=[] 
     71    update_product(product,new_doc_file,doc_file,index_reference,assigned_index) 
     72    write_arbrefile(product,new_doc_file) 
     73    
     74     
     75     
     76     
     77 
     78 
     79     
    6980          
    7081    return True 
     
    7889 
    7990    STP_file=DocumentController.files.filter(Q(filename__iendswith=".stp") | Q(filename__iendswith=".step")) 
    80     if STP_file.exists() and elements_decomposable(STP_file[0]): 
     91    if STP_file.exists() and elements_decomposable(STP_file[0]) and STP_file[0].checkout_valid and not STP_file[0].locked: 
    8192        return STP_file[0]       
    8293    return False 
     
    8697          
    8798def elements_decomposable(fileSTP): 
    88     #aqui meter la forma nueva sin OCC 
    89     my_step_importer = NEW_STEP_Import(fileSTP.file.path.encode())   #simple 
    90      
    91     my_step_importer.read_file(fileSTP) 
    92                     
    93     arbre=my_step_importer.get_shapes_arbre() 
    94     #arbre , graph = generate_structure(fileSTP.file.path.encode()) 
    95     decomposition_possibilities=get_decomposition_possibilities(arbre) 
    96      
    97     if decomposition_possibilities: 
    98         return decomposition_possibilities , arbre 
    99     else: 
    100         return False  
    101  
    102  
    103  
    104  
    105  
    106  
     99 
     100    product=read_arbrefile(fileSTP)                
     101    if product: 
     102        return product.links 
     103    return False  
     104 
     105 
     106 
     107def update_product(product,new_doc_file,old_doc_file,index_reference,assigned_index): 
     108 
     109    product.doc_id=new_doc_file.id 
     110    
     111    if product.geometry: 
     112        copy_js(product,old_doc_file,new_doc_file,index_reference,assigned_index)            
     113       
     114    else:             
     115        for link in product.links: 
     116            update_product(link.product,new_doc_file,old_doc_file,index_reference,assigned_index)   
     117    return True 
     118 
     119 
     120def copy_js(product,old_doc_file,new_doc_file,index_reference,assigned_index): 
     121     
     122 
     123 
     124 
     125    if not assigned_index.count(product.geometry.reference): 
     126        old_stp_js=stp_to_jss.objects.get(stp=old_doc_file,index=product.geometry.reference) 
     127        new_stp_js= stp_to_jss()          
     128        location=new_stp_js.js.storage.location     
     129        new_stp_js.stp = new_doc_file 
     130        fileName, fileExtension = os.path.splitext(new_doc_file.filename) 
     131        new_name = new_stp_js.js.storage.get_available_name(fileName+".js")    
     132        new_stp_js.js = new_name 
     133        new_stp_js.index = index_reference[0] 
     134         
     135        new_stp_js.save()  
     136          
     137        path = os.path.join(location, old_stp_js.js.name) 
     138        infile = open(path.encode(),"r") 
     139        path = os.path.join(location, new_name) 
     140        outfile = open(path.encode(),"w") 
     141        for line in infile.readlines():  
     142            new_line=line.replace("_%s_%s"%(product.geometry.reference,old_doc_file.id),"_%s_%s"%(index_reference[0],new_doc_file.id)) 
     143            outfile.write(new_line) 
     144        infile.close() 
     145        outfile.close() 
     146        assigned_index.append(product.geometry.reference) 
     147        product.geometry.reference=index_reference[0] 
     148        index_reference[0]+=1 
     149 
     150     
     151 
     152 
     153 
     154def decomposer_product(my_step_importer,stp_file): 
     155 
     156    product=my_step_importer.generate_product_relationship_arbre() 
     157    shape_tool=my_step_importer.shape_tool 
     158    labels_roots = TDF_LabelSequence() 
     159    shape_tool.GetFreeShapes(labels_roots) 
     160     
     161     
     162 
     163 
     164    delete_stp_to_jss(stp_file) 
     165    delete_arbrefile(stp_file)           
     166    stp_file.deprecated=True 
     167    stp_file.save(False) 
     168      
     169 
     170 
     171     
     172     
     173    for i in range(labels_roots.Length()): 
     174        if shape_tool.IsAssembly(labels_roots.Value(i+1)): 
     175            l_c = TDF_LabelSequence() 
     176            shape_tool.GetComponents(labels_roots.Value(i+1),l_c) 
     177            for e in range(l_c.Length()): 
     178                shape_tool.RemoveComponent(l_c.Value(e+1)) 
     179 
     180 
     181    new_doc_file=DocumentFile() 
     182    name = new_doc_file.file.storage.get_available_name(product.name+".stp") 
     183    path = os.path.join(new_doc_file.file.storage.location, name) 
     184 
     185 
     186 
     187     
     188     
     189 
     190    WS = XSControl_WorkSession() 
     191    writer = STEPCAFControl_Writer( WS.GetHandle(), False ) 
     192    for i in range(labels_roots.Length()): 
     193        writer.Transfer(labels_roots.Value(i+1), STEPControl_AsIs)  
     194     
     195     
     196    f = open(path.encode(), 'w') 
     197    f = File(f)     
     198    status = writer.Write(f.name) 
     199     
     200    f = open(path.encode(), 'r') 
     201    f = File(f) 
     202    f.name = f.name.encode("utf-8")       
     203     
    107204           
    108      
    109      
    110      
    111      
    112  
    113  
    114      
    115  
     205    new_doc_file = models.DocumentFile.objects.create(filename=product.name+".stp", size=f.size, 
     206                        file=models.docfs.save(f.name, f), document=stp_file.document)  
     207 
     208    stp_file.document.save(False) 
     209    product.links=[] 
     210    product.doc_id=new_doc_file.id 
     211    write_arbrefile(product,new_doc_file) 
     212     
     213     
     214    
     215 
     216     
     217 
     218 
     219     
     220 
  • branches/3D/openPLM/document3D/models.py

    r813 r842  
    11from django.db import models 
    22from django.contrib import admin 
    3  
    43from openPLM.plmapp.controllers import DocumentController 
    5  
    6  
    7  
    8  
    9 from openPLM.document3D.STP_converter_WebGL import * 
    10 from openPLM.document3D.arborescense import * 
    11  
    12  
    13  
    14 from OCC.TopLoc import TopLoc_Location 
    15 from django.db.models import get_model 
    16 from openPLM.plmapp.filehandlers import HandlersManager 
     4from openPLM.plmapp.models import * 
     5#from openPLM.plmapp.filehandlers import HandlersManager 
     6from OCC.gp import * 
     7 
     8 
     9 
     10 
     11#from django.db.models import get_model 
     12 
    1713 
    1814 
     
    2016#eliminar navegabilidad 
    2117#delete del model elimina el stp de docs/stp/ ?? 
    22 class Location_link(ParentChildLinkExtension): 
    23  
    24     x = models.FloatField(default=lambda: 0) 
    25     y = models.FloatField(default=lambda: 0) 
    26     z = models.FloatField(default=lambda: 0) 
    27     rx = models.FloatField(default=lambda: 0) 
    28     ry = models.FloatField(default=lambda: 0) 
    29     rz = models.FloatField(default=lambda: 0) 
    30     angle = models.FloatField(default=lambda: 0) 
    31     name_reference=models.CharField(max_length=100,default="no_name")     
    32  
    33                 
    34          
    35          
    36     def __unicode__(self): 
    37         return u"<Location <translation<%f, %f, %f>> <rotation axis <%f , %f ,%f>> <rotation angle < %f >> <name reference <%s> > >" % (self.x, self.y, self.z,self.rx, self.ry, self.rz,self.angle,self.name_reference) 
    38  
    39     @classmethod 
    40     def apply_to(cls, parent): 
    41         # only apply to all parts 
    42         return True 
    43  
    44     def clone(self, link, save, **data): 
    45         x = data.get("x", self.x) 
    46         y = data.get("y", self.y) 
    47         z = data.get("z", self.z) 
    48         rx = data.get("rx", self.rx) 
    49         ry = data.get("ry", self.ry) 
    50         rz = data.get("rz", self.rz) 
    51         angle = data.get("angle", self.angle) 
    52         name_reference=data.get("name_reference", self.name_reference) 
    53         clone = Location_link(link=link, x=x, y=y, z=z ,rx=rx, ry=ry, rz=rz ,angle=angle ,name_reference=name_reference) 
    54         if save: 
    55             clone.save() 
    56         return clone 
    57          
    58 admin.site.register(Location_link) 
    59 register_PCLE(Location_link) 
    60  
    61 def generate_extra_location_links(node_arbre,link): 
    62  
    63  
    64     for i in range(node_arbre.quantity): 
    65         loc=Location_link() 
    66         loc.link=link 
    67         transformation=node_arbre.location_relations[i].Transformation() 
    68         loc.name_reference=node_arbre.names[i] 
    69         gp=gp_XYZ()         
    70         a ,b =transformation.GetRotation(gp) 
    71         t=transformation.TranslationPart() 
    72         if a: 
    73             loc.rx=gp.X() 
    74             loc.ry=gp.Y() 
    75             loc.rz=gp.Z() 
    76             loc.angle=b  
    77         loc.x=t.X() 
    78         loc.y=t.Y() 
    79         loc.z=t.Z()                     
    80              
    81          
    82         loc.save()        
    83          
    84  
    85         
    86  
    87 @memoize_noarg 
    88 def get_all_plmDocument3Dtypes_with_level(): 
    89     lst = [] 
    90     level=">>" 
    91     get_all_subclasses_with_level(Document3D, lst , level) 
    92     return lst   
     18 
    9319 
    9420 
     
    10430 
    10531         
    106     def update_links_whit_jss_and_branch(self,old_arbre,index_reference,new_doc_file,old_doc_file,assigned_index): 
    107      
    108         if  isinstance(old_arbre,node_shape): 
    109             for i in range(len(old_arbre.children)): 
    110                 old_arbre.children[i].doc_id=new_doc_file.id 
    111                 if isinstance(old_arbre.children[i],feuille_nom_shapes): 
    112                     if not assigned_index.count(old_arbre.children[i].reference): 
    113                         assigned_index.append(old_arbre.children[i].reference) 
    114                         fileName, fileExtension = os.path.splitext(new_doc_file.filename) 
    115                         old_stp_js=stp_to_jss.objects.get(stp=old_doc_file,index=old_arbre.children[i].reference) 
    116                         new_stp_js= stp_to_jss() 
    117                         new_name = new_stp_js.js.storage.get_available_name(fileName+".js")             
    118                         copy_old_js_to_new_js(new_stp_js.js.storage.location,old_stp_js.js.name,new_name,old_doc_file.id, old_stp_js.index,new_doc_file.id,index_reference[0])            
    119                         new_stp_js.stp = new_doc_file 
    120                         new_stp_js.js = new_name 
    121  
    122                         new_stp_js.index = index_reference[0] 
    123                         new_stp_js.save() 
    124                         old_arbre.children[i].reference=index_reference[0] 
    125                         index_reference[0]+=1 
    126  
    127                
    128                 else: 
    129                  
    130                     #presupongo que el arbol generado y el antiguo son iguales 
    131                     self.update_links_whit_jss_and_branch(old_arbre.children[i],index_reference,new_doc_file,old_doc_file,assigned_index)             
     32         
    13233         
    13334         
     
    13839 
    13940 
    140 #from celery.task import task 
    141 #@task 
     41from celery.task import task 
     42@task 
    14243def handle_step_file(doc_file_pk,object_id,user_id): 
    143 #mirar aqui lo de commit on succes , hacer un try para eliminar fisicamente los ficheros 
    144     #import logging 
    145     #logging.getLogger("GarbageCollector").setLevel(logging.ERROR) 
     44 
     45    import logging 
     46    logging.getLogger("GarbageCollector").setLevel(logging.ERROR) 
     47    from openPLM.document3D.STP_converter_WebGL import NEW_STEP_Import 
     48    from openPLM.document3D.arborescense import write_arbrefile 
    14649    doc_file = DocumentFile.objects.get(pk=doc_file_pk) 
    14750    user=User.objects.get(id=user_id) 
     
    14952    controller=Document3DController(object,user)  
    15053 
    151  
    152      
    153  
    154     files_js=stp_to_jss.objects.filter(stp=doc_file) 
    155     arborescense_js=stp_to_jss_arborescense.objects.filter(stp=doc_file) 
    156     #neccesary in case of check-in           
    157     delete_all_associes(files_js,arborescense_js) 
    158  
    159  
    160  
    161     my_step_importer = NEW_STEP_Import(doc_file.file.path.encode())  
    162     if not my_step_importer.read_file(doc_file): 
    163         print "\n\n\nMAl, el fichero leido no es valido\n\n\n"  
    164         return False     
    165     procesing_simples_shapes(my_step_importer.get_shapes_simples(),doc_file)   
    166     generate_file_arborescense(my_step_importer.get_shapes_arbre(),doc_file)     
    167      
    168     #ok=convertir_STP_to_WebGL(doc_file,controller) 
    169     """ 
    170     if not ok: 
    171              
    172         files_js=stp_to_jss.objects.filter(stp=doc_file) 
    173         arborescense_js=stp_to_jss_arborescense.objects.filter(stp=doc_file) 
    174         #effacer touts les fichiers generes 
    175         delete_all_associes(files_js,arborescense_js) 
    176          
    177         print "Error: It was not possible to generate a sight 3D of the file." 
    178         return False             
    179     """         
     54    delete_stp_to_jss(doc_file) 
     55 
     56    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) 
     60     
     61    #y si fallo?       
    18062    print "\n\n\nTerMina saliEndO BiEN y CoRrecTo\n\n\n"          
    18163    return True 
     
    18567 
    18668     
    187  
    188  
    189  
    190 #comprobar aue se elminan bien los ficheros de docs/stp 
    19169class Document3DController(DocumentController): 
    19270 
    193                  
    194     @property         
    195     def files(self): 
    196  
    197         return self.documentfile_set.all()     
     71                   
    19872      
    19973                       
    20074    def handle_added_file(self, doc_file): 
    20175 
    202         print "\n\n\nENTRA AQUI OSTIAS\n\n\n" 
    20376        fileName, fileExtension = os.path.splitext(doc_file.filename) 
    20477        if fileExtension.upper() in ('.STP', '.STEP'): 
    205             #handle_step_file.delay(doc_file.pk,self.object.id,self._user.id) 
    20678            handle_step_file(doc_file.pk,self.object.id,self._user.id) 
    20779            
     
    21587        if fileExtension.upper() in ('.STP', '.STEP'): 
    21688            Document3D=self.object              
    217             query_jss=stp_to_jss.objects.filter(stp=doc_file) 
    218             files_js=list(query_jss.values_list("js", flat=True)) 
    219             query_jss=stp_to_jss_arborescense.objects.filter(stp=doc_file) 
    220             arborescense_js=list(query_jss.values_list("js", flat=True)) 
    221              
    222              
    223         #document3D=Document3D(self)    
    224  
    225             #si en ese momento ningun js.name corresponde con instancia de la BD eliminar el fichero           
     89            delete_stp_to_jss(doc_file) 
     90            
    22691        super(Document3DController, self).delete_file(doc_file) 
    227         #il faut apeller super avant pour verifier droits de utilisateur 
    228          
    229         if fileExtension.upper() in ('.STP', '.STEP'): 
    230             delete_file_associes(files_js,arborescense_js) 
     92         
     93 
    23194             
    23295      
    23396 
    234                  
    235  
    236          
    237  
    238  
    23997        return True      
    24098 
     
    242100 
    243101     
    244 def delete_file_associes(files_js,arborescense_js): 
    245  
    246  
    247     for name in files_js: 
    248         filename = settings.MEDIA_ROOT+"3D/"+ name 
     102 
     103  
     104 
     105   
     106media3Djs = DocumentStorage(location=settings.MEDIA_ROOT+"3D/")       
     107class stp_to_jss(models.Model): 
     108    u""" 
     109    Link between file STEP present in a Document3D and  files .js that represents his geometries   1..* 
     110    """ 
     111    js = models.FileField(upload_to='.',storage=media3Djs) 
     112    stp = models.ForeignKey(DocumentFile) 
     113    index = models.IntegerField() 
     114    count = models.IntegerField(default=1) # no se utiliza, se puede quitar 
     115def 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)) 
     120    for name in list_files: 
     121        filename = media3Djs.location +"/"+ name 
    249122        if os.path.exists(filename) and os.path.isfile(filename): 
    250123            os.remove(filename) 
    251             print "Deleting geometry .jss associes:" , filename 
    252  
    253     for name in arborescense_js: 
    254         filename = settings.MEDIA_ROOT+"3D/arborescence/"+name 
     124    to_delete.delete() 
     125     
     126  
     127           
     128media3D_arbrefile = DocumentStorage(location=settings.MEDIA_ROOT+"3D/arborescence") 
     129class arbrefile_documentFile_stp(models.Model): 
     130    arbrefile = models.FileField(upload_to='.',storage=media3D_arbrefile) 
     131    stp = models.ForeignKey(DocumentFile) 
     132      
     133def 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 
    255140        if os.path.exists(filename) and os.path.isfile(filename): 
    256141            os.remove(filename) 
    257             print "Deleting arborescence .jss associe:" , filename 
    258              
    259              
    260  
    261  
    262 def delete_all_associes(files_js,arborescense_js): 
    263  
    264  
    265     for element in files_js: 
    266         element.delete() 
    267         filename = settings.MEDIA_ROOT+"3D/"+ str(element.js) 
    268         if os.path.exists(filename) and os.path.isfile(filename): 
    269             os.remove(filename) 
    270             print "Deleting geometry .jss associes:" , filename 
    271  
    272     for element in arborescense_js: 
    273         filename = settings.MEDIA_ROOT+"3D/arborescence/"+str(element.js) 
    274         element.delete() 
    275         if os.path.exists(filename) and os.path.isfile(filename): 
    276             os.remove(filename) 
    277             print "Deleting arborescence .jss associe:" , filename 
    278   
    279  
    280 def copy_old_js_to_new_js(location,old_name,new_name,old_id, old_index,new_id,new_index): 
    281      
    282     path = os.path.join(location, old_name) 
    283     infile = open(path.encode(),"r") 
    284     path = os.path.join(location, new_name) 
    285     outfile = open(path.encode(),"w") 
    286     for line in infile.readlines():  
    287         new_line=line.replace("_%s_%s"%(old_index,old_id),"_%s_%s"%(new_index,new_id)) 
    288         outfile.write(new_line) 
    289  
    290     infile.close() 
    291     outfile.close() 
    292      
    293     return True  
    294  
    295   
     142            print "removing : " ,filename 
     143    to_delete.delete()    
     144     
    296145             
    297146class Document_decompose_Error(Exception):   
     
    308157         
    309158         
    310          
    311  
    312  
    313            
    314      
     159class Product(object): 
     160 
     161    __slots__ = ("label_reference","name","doc_id","links","geometry") 
     162     
     163     
     164    def __init__(self,name,doc_id,label_reference=False,geometry_ref=None): 
     165        #no tiene location 
     166        self.links = [] 
     167        self.label_reference=label_reference 
     168        self.name=name 
     169        self.doc_id=doc_id   #cambiar por step product id 
     170        if not geometry_ref==None: 
     171            self.geometry=Geometry(False,geometry_ref) 
     172        else: 
     173            self.geometry=False 
     174    def set_shape_geometry_related(self,geometry_ref): 
     175        self.geometry=geometry_ref 
     176     
     177class Link(object): 
     178 
     179    __slots__ = ("names","locations","product","quantity") 
     180     
     181     
     182    def __init__(self,product): 
     183   
     184        self.names=[]            
     185        self.locations=[] 
     186        self.product=product 
     187        self.quantity=0 
     188 
     189 
     190    def add_occurrence(self,name,Matrix_rotation): 
     191        if name==u' ' or name==u'': 
     192            self.names.append(self.product.name)     
     193        else: 
     194            self.names.append(name) 
     195        self.locations.append(Matrix_rotation) 
     196        self.quantity=self.quantity+1 
     197 
     198         
     199class Matrix_rotation(object): 
     200 
     201    __slots__ = ("x1","x2","x3","x4","y1","y2","y3","y4","z1","z2","z3","z4") 
     202     
     203     
     204    def __init__(self,transformation,list_coord=False): 
     205     
     206        if list_coord: 
     207            self.x1=list_coord[0]            
     208            self.x2=list_coord[1]  
     209            self.x3=list_coord[2]  
     210            self.x4=list_coord[3]  
     211            self.y1=list_coord[4]          
     212            self.y2=list_coord[5]  
     213            self.y3=list_coord[6]  
     214            self.y4=list_coord[7]  
     215            self.z1=list_coord[8]          
     216            self.z2=list_coord[9]  
     217            self.z3=list_coord[10]  
     218            self.z4=list_coord[11]     
     219 
     220        else:    
     221 
     222            m=transformation.VectorialPart() 
     223            gp=m.Row(1) 
     224            self.x1=gp.X()            
     225            self.x2=gp.Y() 
     226            self.x3=gp.Z() 
     227            self.x4=transformation.Transforms()[0] 
     228            gp=m.Row(2) 
     229            self.y1=gp.X()           
     230            self.y2=gp.Y() 
     231            self.y3=gp.Z() 
     232            self.y4=transformation.Transforms()[1] 
     233            gp=m.Row(3) 
     234            self.z1=gp.X()          
     235            self.z2=gp.Y() 
     236            self.z3=gp.Z() 
     237            self.z4=transformation.Transforms()[2]    
     238    def Transformation(self): 
     239        transformation=gp_Trsf() 
     240        transformation.SetValues(self.x1,self.x2,self.x3,self.x4,self.y1,self.y2,self.y3,self.y4,self.z1,self.z2,self.z3,self.z4,1,1) 
     241        return transformation      
     242         
     243    def to_array(self):     
     244        return [self.x1,self.x2,self.x3,self.x4,self.y1,self.y2,self.y3,self.y4,self.z1,self.z2,self.z3,self.z4]  
     245                     
     246class Geometry(object): 
     247     
     248    __slots__ = ("reference", "red", "green", "blue") 
     249     
     250    def __init__(self,colour,ref): 
     251        self.reference=ref 
     252        if colour: 
     253            self.red=colour.Red() 
     254            self.green=colour.Green() 
     255            self.blue=colour.Blue() 
     256        else: 
     257            self.red = self.green = self.blue = 0         
     258 
     259 
     260class Location_link(ParentChildLinkExtension): 
     261 
     262    x1=models.FloatField(default=lambda: 0)           
     263    x2=models.FloatField(default=lambda: 0)  
     264    x3=models.FloatField(default=lambda: 0)  
     265    x4=models.FloatField(default=lambda: 0)  
     266    y1=models.FloatField(default=lambda: 0)          
     267    y2=models.FloatField(default=lambda: 0)  
     268    y3=models.FloatField(default=lambda: 0)  
     269    y4=models.FloatField(default=lambda: 0)  
     270    z1=models.FloatField(default=lambda: 0)          
     271    z2=models.FloatField(default=lambda: 0)  
     272    z3=models.FloatField(default=lambda: 0)  
     273    z4=models.FloatField(default=lambda: 0)    
     274 
     275    name=models.CharField(max_length=100,default="no_name")     
     276 
     277                
     278    def Transforms(self): 
     279     
     280        transformation=gp_Trsf() 
     281        transformation.SetValues(self.x1,self.x2,self.x3,self.x4,self.y1,self.y2,self.y3,self.y4,self.z1,self.z2,self.z3,self.z4,1,1) 
     282        return transformation       
     283         
     284 
     285    @classmethod 
     286    def apply_to(cls, parent): 
     287        # only apply to all parts 
     288        return True 
     289 
     290    def clone(self, link, save, **data): 
     291     
     292        x1=data.get("x1", self.x1)          
     293        x2=data.get("x2", self.x2) 
     294        x3=data.get("x3", self.x3)  
     295        x4=data.get("x4", self.x4) 
     296        y1=data.get("y1", self.y1)          
     297        y2=data.get("y2", self.y2)  
     298        y3=data.get("y3", self.y3) 
     299        y4=data.get("y4", self.y4)  
     300        z1=data.get("z1", self.z1)          
     301        z2=data.get("z2", self.z2)  
     302        z3=data.get("z3", self.z3)  
     303        z4=data.get("z4", self.z4)    
     304 
     305        name=data.get("name", self.name) 
     306        clone = Location_link(link=link, x1=x1,x2=x2,x3=x3,x4=x4, y1=y1,y2=y2,y3=y3,y4=y4,z1=z1,z2=z2,z3=z3,z4=z4,name=name) 
     307        if save: 
     308            clone.save() 
     309        return clone 
     310         
     311         
     312admin.site.register(Location_link) 
     313register_PCLE(Location_link) 
     314 
     315def generate_extra_location_links(link,ParentChildLink): 
     316 
     317 
     318    for i in range(link.quantity): 
     319        loc=Location_link() 
     320        loc.link=ParentChildLink 
     321         
     322        array=link.locations[i].to_array() 
     323         
     324        loc.name=link.names[i] 
     325        loc.x1=array[0]         
     326        loc.x2=array[1] 
     327        loc.x3=array[2]  
     328        loc.x4=array[3] 
     329        loc.y1=array[4]          
     330        loc.y2=array[5]  
     331        loc.y3=array[6] 
     332        loc.y4=array[7] 
     333        loc.z1=array[8]          
     334        loc.z2=array[9]  
     335        loc.z3=array[10]  
     336        loc.z4=array[11]    
     337                
     338                    
     339        loc.save()        
     340                
     341 
     342@memoize_noarg 
     343def get_all_plmDocument3Dtypes_with_level(): 
     344    lst = [] 
     345    level=">>" 
     346    get_all_subclasses_with_level(Document3D, lst , level) 
     347    return lst             
     348     
  • branches/3D/openPLM/document3D/step_models.py

    r815 r842  
    55def is_end_stmt(line): 
    66    return line.endswith(");\r\n") 
     7 
     8 
     9 
    710 
    811def read_structure_noms(file_step): 
  • branches/3D/openPLM/document3D/templates/Display3D.htm

    r817 r842  
    225225         
    226226                <script type="text/javascript" src="/media/js/Three.js"></script>  
    227                 {% for item in multi_image3D %} 
     227                {% for item in file_geometry_js %} 
    228228                <script type="text/javascript" src="/media/3D/{{ item.js.name}}"></script> 
    229229                {% endfor %} 
    230                 <script type="text/javascript" src="/media/3D/arborescence/{{menu_arborescense}}"></script>  
     230 
    231231 
    232232  
    233233  
    234   
     234      
    235235 
    236236                <script type="text/javascript"> 
    237237                 
     238                 
     239            {% if javascript_arborescense %} 
     240                {{javascript_arborescense|safe}}                 
     241            {% endif %} 
     242             
     243             
    238244                    var camera, scene, renderer;//object3D; 
    239245                    var geometry ; 
     
    242248                     
    243249                      var targetXRotation             = 0; 
     250                       
    244251  var targetXRotationOnMouseDown  = 0; 
    245252  var mouseX                      = 0; 
  • branches/3D/openPLM/document3D/tests.py

    r817 r842  
    2424         
    2525    def test_3D_form(self): 
     26        """ 
     27        Verifies that the form for the view 3D is correct 
     28        """ 
    2629        f=open("document3D/data_test/test.stp") 
    2730        myfile = File(f) 
     
    3235 
    3336     
    34          
     37             
    3538    def test_3D_form_post(self): 
     39        """ 
     40        Verifies that the form for the view 3D is correct when we post 
     41        """ 
    3642        f=open("document3D/data_test/test2.stp") 
    3743        myfile = File(f) 
     
    4147        response_post = self.post(self.document.object.plmobject_url+"3D/",  
    4248                            data)      
    43         self.assertEqual(5, len(list(response_post.context["multi_image3D"]))) 
    44         self.assertNotEqual(response_post.context["menu_arborescense"],'')         
     49        self.assertEqual(5, len(list(response_post.context["file_geometry_js"]))) 
     50        self.assertNotEqual(response_post.context["javascript_arborescense"],False)         
    4551                
    4652    def test_3D_form_post_no_arborescense(self): 
     53        """ 
     54        Verifies that the form for the view 3D is correct (nothing to show) when we try show stp file without a file arborescense linked 
     55        """ 
    4756        f=open("document3D/data_test/test2.stp") 
    4857        myfile = File(f) 
    4958        new_doc_file=self.document.add_file(myfile)           
    5059        form=Form3D(document=self.document) 
    51         stp=stp_to_jss_arborescense.objects.get(stp=new_doc_file) 
    52         stp.delete() 
    53         response_post = self.post(self.document.object.plmobject_url+"3D/",  
    54                             {"select_stp_form" : form})      
    55         self.assertEqual(5, len(list(response_post.context["multi_image3D"]))) 
    56         self.assertEqual(response_post.context["menu_arborescense"], '')         
     60        arbrefile_documentFile_stp.objects.get(stp=new_doc_file).delete() 
     61        data={u'csrfmiddlewaretoken': [u'6a0951fed02461061f796c63d98bb430'], u'Display': [new_doc_file.id],u'select_stp_form' : form} 
     62        response_post = self.post(self.document.object.plmobject_url+"3D/",data)   
     63        self.assertEqual(5, len(list(response_post.context["file_geometry_js"]))) 
     64        self.assertEqual(response_post.context["javascript_arborescense"], False)         
    5765         
    5866    def test_3D_no_stp_associe(self):    
    5967     
    6068        response = self.get(self.document.object.plmobject_url+"3D/") 
    61         self.assertEqual(response.context["menu_arborescense"], '') 
    62         self.assertEqual(response.context["multi_image3D"], '') 
    63          
    64     def test_3D_stp_associe_sans_arborescense(self):   #ca doit jamais arriver, mais... 
     69        self.assertEqual(response.context["file_geometry_js"], []) 
     70        self.assertEqual(response.context["javascript_arborescense"], False) 
     71         
     72    def test_3D_stp_associe_sans_arborescense(self):    
    6573        f=open("document3D/data_test/test.stp") 
    6674        myfile = File(f) 
    6775        new_doc_file=self.document.add_file(myfile)        
    68         stp=stp_to_jss_arborescense.objects.get(stp=new_doc_file) 
    69         stp.delete() 
     76        arbrefile_documentFile_stp.objects.get(stp=new_doc_file).delete() 
    7077        response = self.get(self.document.object.plmobject_url+"3D/")     
    71         self.assertNotEqual(response.context["multi_image3D"],'') 
    72         self.assertEqual(response.context["menu_arborescense"], '') 
    73  
    74     def test_3D_stp_valide_no_info(self):   #ca doit jamais arriver, mais... 
     78        self.assertEqual(3, len(list(response.context["file_geometry_js"]))) 
     79        self.assertEqual(response.context["javascript_arborescense"], False) 
     80 
     81    def test_3D_stp_valide_no_info(self):    
    7582        f=open("document3D/data_test/valid_sans_information.stp") 
    7683        myfile = File(f) 
    7784        new_doc_file=self.document.add_file(myfile)        
    7885        response = self.get(self.document.object.plmobject_url+"3D/")     
    79         self.assertEqual(len(response.context["multi_image3D"]),0) 
    80         self.assertNotEqual(response.context["menu_arborescense"], '')     
     86        self.assertEqual(response.context["file_geometry_js"],[]) 
     87        self.assertNotEqual(response.context["javascript_arborescense"], False)     
    8188                 
    82 #bomb child con loink editables????      
     89    def test_3D_stp_associe_sans_geometry_with_arborescense(self):    
     90        f=open("document3D/data_test/test.stp") 
     91        myfile = File(f) 
     92        new_doc_file=self.document.add_file(myfile)        
     93        stp_to_jss.objects.filter(stp=new_doc_file).delete() 
     94        response = self.get(self.document.object.plmobject_url+"3D/")     
     95        self.assertEqual([], response.context["file_geometry_js"]) 
     96        self.assertNotEqual(response.context["javascript_arborescense"], False)   
    8397        
    8498class display_bomb_childTest(CommonViewTest): 
     
    95109        response = self.get(self.base_url + "BOM-child/", page="BOM-child") 
    96110        self.assertEqual(2, len(list(response.context["children"]))) 
    97         self.assertEqual(0, len(list(response.context["decomposable"])))  
     111        self.assertEqual(0, len(list(response.context["decomposable_valide"])))  
    98112         
    99113         
     
    105119        response = self.get(self.base_url + "BOM-child/", page="BOM-child")   
    106120        self.assertEqual(0, len(list(response.context["children"]))) 
    107         self.assertEqual(1, len(list(response.context["decomposable"]))) 
    108          
    109          
    110         
    111                   
     121        self.assertEqual(1, len(list(response.context["decomposable_valide"]))) 
     122         
     123         
     124    def test_decompose_bomb_child_whit_child_decomposable(self): 
     125        child2 = PartController.create("c2", "Part", "a", self.user, self.DATA) 
     126        self.controller.add_child(child2, 10, 20) 
     127        f=open("document3D/data_test/test.stp") 
     128        myfile = File(f) 
     129        new_doc_file=self.document.add_file(myfile)  
     130        child2.attach_to_document(self.document.object) 
     131        self.controller.attach_to_document(self.document.object) 
     132        response = self.get(self.base_url + "BOM-child/", page="BOM-child")   
     133        self.assertEqual(1, len(list(response.context["children"]))) 
     134        self.assertEqual(1, len(list(response.context["decomposable_valide"]))) 
     135        self.assertEqual(True, response.context["children"][0][1])         
     136         
     137    def test_try_decompose_bomb_child_whit_no_links(self): 
     138        f=open("document3D/data_test/valid_sans_information.stp") 
     139        myfile = File(f) 
     140        new_doc_file=self.document.add_file(myfile)  
     141        self.controller.attach_to_document(self.document.object) 
     142        response = self.get(self.base_url+"decompose/"+str(new_doc_file.id)+"/")   
     143        self.assertRedirects(response, self.base_url + "BOM-child/") 
     144                          
    112145class display_decomposeTest(CommonViewTest): 
    113146 
     
    116149        self.document = Document3DController.create('doc1', 'Document3D', 
    117150                'a', self.user, self.DATA) 
    118                   
     151 
     152 
     153    def update_time(self,data): 
     154        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)], 
     155           u'last_modif_microseconds' : [u'%s'%self.document.mtime.microsecond] 
     156           })                    
    119157    #verificar los links creados en las buenas coordenadas       
    120158    def test_display_decompose_form_initial(self): 
     
    124162        self.controller.attach_to_document(self.document.object)   
    125163                
    126         response = self.get(self.base_url+"decompose/"+str(new_doc_file.id)+"/")     
    127          
    128         Select_Doc_Part_types = formset_factory(Doc_Part_type_Form,extra=2) 
    129         Select_Order_Quantity_types = formset_factory(Order_Quantity_Form,extra=2) 
    130         form_Doc_Part_types = Select_Doc_Part_types()       
    131         form_Order_Quantity = Select_Order_Quantity_types()    
    132         for form in form_Doc_Part_types.forms: 
    133             form.fields["type_part"].initial='Part' 
    134             form.fields["type_document3D"].initial='Document3D' 
    135              
    136         quantity=[1,3]     
    137         index=0     
    138         for form in form_Order_Quantity.forms: 
    139             form.fields["order"].initial=(index+1)*10 
    140             form.fields["quantity"].initial=quantity[index]        
    141             index=index+1         
     164          
     165            
     166        Select_Doc_Part_types = formset_factory(Doc_Part_type_Form) 
     167        Select_Order_Quantity_types = formset_factory(Order_Quantity_Form) 
     168        data = { 
     169        'form-TOTAL_FORMS': u'2', 
     170        'form-INITIAL_FORMS': u'2', 
     171        'form-MAX_NUM_FORMS': u'2', 
     172        } 
     173        quantity=[1,3] 
     174        for i in range(2): 
     175            order=(i+1)*10 
     176            data.update({'form-%s-order'%i :u'%s'%order, 
     177                         'form-%s-quantity'%i : u'%s'%quantity[i], 
     178                         'form-%s-type_part'%i :u'Part', 
     179                         'form-%s-type_document3D'%i : u'Document3D', 
     180                        })  
     181        form_Doc_Part_types = Select_Doc_Part_types(data)       
     182        form_Order_Quantity = Select_Order_Quantity_types(data)  
     183         
     184         
     185        response = self.get(self.base_url+"decompose/"+str(new_doc_file.id)+"/") 
     186 
    142187        self.assertEqual(response.context["form_Doc_Part_types"].as_table(), form_Doc_Part_types.as_table()) 
    143188        self.assertEqual(response.context["form_Order_Quantity"].as_table(), form_Order_Quantity.as_table())  
     
    145190                   
    146191                
    147    
     192  
    148193    def test_display_decompose_form_post(self): 
    149194        f=open("document3D/data_test/test.stp") 
    150195        myfile = File(f) 
    151196        new_doc_file=self.document.add_file(myfile)      
    152         self.controller.attach_to_document(self.document.object)                                           
    153         data = data1       
     197        self.controller.attach_to_document(self.document.object)                                                           
     198        data = data1 
     199        self.update_time(data) 
    154200        response_post = self.post(self.base_url+"decompose/"+str(new_doc_file.id)+"/",data) 
    155201        self.assertRedirects(response_post, self.base_url + "BOM-child/") 
    156202        
    157             
     203             
    158204    def test_display_decompose_form_Order_Quantity_error_post(self): 
    159205        f=open("document3D/data_test/test.stp") 
     
    161207        new_doc_file=self.document.add_file(myfile)      
    162208        self.controller.attach_to_document(self.document.object)                                           
    163         data = data2       
     209        data = data2 
     210        self.update_time(data)              
    164211        response_post = self.post(self.base_url+"decompose/"+str(new_doc_file.id)+"/",data) 
    165212        self.assertEqual(response_post.context["form_Order_Quantity"].errors,[{'quantity': [u'This field is required.']}, {}]) 
    166         #self.assertFormError(response_post, "form_Order_Quantity", "quantity", [u'This field is required.']) 
    167         #self.assertFormError(response_post) 
    168         #self.assertRedirects(response_post, self.base_url+"decompose/"+str(new_doc_file.id)+"/") 
     213 
    169214     
    170215     
     
    174219        new_doc_file=self.document.add_file(myfile)      
    175220        self.controller.attach_to_document(self.document.object)                                           
    176         data = data3       
     221        data = data3 
     222        self.update_time(data)        
    177223        response_post = self.post(self.base_url+"decompose/"+str(new_doc_file.id)+"/",data) 
    178224        self.assertEqual(response_post.context["form_Doc_Part_types"].errors,[{}, {'type_document3D': [u'Select a valid choice. not_exits_Document4D362182 is not one of the available choices.']}] 
     
    184230        new_doc_file=self.document.add_file(myfile)      
    185231        self.controller.attach_to_document(self.document.object)                                           
    186         data = data4      
    187         response_post = self.post(self.base_url+"decompose/"+str(new_doc_file.id)+"/",data) 
    188         zip=response_post.context["zip"]  
     232        data = data4  
     233        self.update_time(data)     
     234        response_post = self.post(self.base_url+"decompose/"+str(new_doc_file.id)+"/",data) 
     235        zip=response_post.context["zip"]          
    189236        index=0 
    190237        for type, atributes , ord_qty in zip: 
     
    203250        for type, atributes , ord_qty in zip: 
    204251            if index==1: 
     252                print atributes[0].as_table() 
    205253                self.assertEqual(atributes[0].as_table() ,data5_1) 
    206254            index+=1                                      
     
    208256 
    209257 
    210 data1 ={u'2-lifecycle': [u'draft_official_deprecated'], u'3-lifecycle': [u'draft_official_deprecated'], u'reference': [u'PART_00006'], 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'1-lifecycle': [u'draft_official_deprecated'], u'3-group': [u'2'], u'group': [u'2'], u'1-revision': [u'a'], u'lifecycle': [u'draft_official_deprecated'], u'2-name': [u'NUT'], u'form-0-type_part': [u'Part'], u'csrfmiddlewaretoken': [u'6a0951fed02461061f796c63d98bb430', u'6a0951fed02461061f796c63d98bb430'], u'3-name': [u'NUT'], u'revision': [u'a'], u'initial-2-lifecycle': [u'draft_official_deprecated'], u'initial-1-lifecycle': [u'draft_official_deprecated'], u'1-name': [u'BOLT'], u'form-TOTAL_FORMS': [u'2', u'2'], u'2-reference': [u'PART_00007'], u'2-revision': [u'a'], u'form-INITIAL_FORMS': [u'0', u'0'], u'form-1-quantity': [u'1'], u'initial-lifecycle': [u'draft_official_deprecated'], u'3-reference': [u'DOC_00008'], u'name': [u'BOLT'], u'form-MAX_NUM_FORMS': [u'', u''], 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_00007']} 
    211  
    212 # u'form-0-quantity': [u''], 
    213 data2 ={u'2-lifecycle': [u'draft_official_deprecated'], u'3-lifecycle': [u'draft_official_deprecated'], u'reference': [u'PART_00006'], u'form-0-quantity': [u''], 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'1-lifecycle': [u'draft_official_deprecated'], u'3-group': [u'2'], u'group': [u'2'], u'1-revision': [u'a'], u'lifecycle': [u'draft_official_deprecated'], u'2-name': [u'NUT'], u'form-0-type_part': [u'Part'], u'csrfmiddlewaretoken': [u'6a0951fed02461061f796c63d98bb430', u'6a0951fed02461061f796c63d98bb430'], u'3-name': [u'NUT'], u'revision': [u'a'], u'initial-2-lifecycle': [u'draft_official_deprecated'], u'initial-1-lifecycle': [u'draft_official_deprecated'], u'1-name': [u'BOLT'], u'form-TOTAL_FORMS': [u'2', u'2'], u'2-reference': [u'PART_00007'], u'2-revision': [u'a'], u'form-INITIAL_FORMS': [u'0', u'0'], u'form-1-quantity': [u'1'], u'initial-lifecycle': [u'draft_official_deprecated'], u'3-reference': [u'DOC_00008'], u'name': [u'BOLT'], u'form-MAX_NUM_FORMS': [u'', u''], 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_00007']} 
    214  
    215 #u'form-1-type_document3D': [u'not_exits_Document4D362182'] 
    216 data3 ={u'2-lifecycle': [u'draft_official_deprecated'], u'3-lifecycle': [u'draft_official_deprecated'], u'reference': [u'PART_00006'], u'form-0-quantity': [u'1'], 
    217  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'1-lifecycle': [u'draft_official_deprecated'], u'3-group': [u'2'], u'group': [u'2'], u'1-revision': [u'a'], u'lifecycle': [u'draft_official_deprecated'], u'2-name': [u'NUT'], u'form-0-type_part': [u'Part'], u'csrfmiddlewaretoken': [u'6a0951fed02461061f796c63d98bb430', u'6a0951fed02461061f796c63d98bb430'], u'3-name': [u'NUT'], u'revision': [u'a'], u'initial-2-lifecycle': [u'draft_official_deprecated'], u'initial-1-lifecycle': [u'draft_official_deprecated'], u'1-name': [u'BOLT'], u'form-TOTAL_FORMS': [u'2', u'2'], u'2-reference': [u'PART_00007'], u'2-revision': [u'a'], u'form-INITIAL_FORMS': [u'0', u'0'], u'form-1-quantity': [u'1'], u'initial-lifecycle': [u'draft_official_deprecated'], u'3-reference': [u'DOC_00008'], u'name': [u'BOLT'], u'form-MAX_NUM_FORMS': [u'', u''], u'1-group': [u'2'], u'form-0-type_document3D': [u'Document3D'], u'form-0-order': [u'10'], u'form-1-type_document3D': [u'not_exits_Document4D362182'], u'1-reference': [u'DOC_00007']} 
     258 
     259data1={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']} 
     260 
     261 
     262data2={u'2-lifecycle': [u'draft_official_deprecated'], u'3-lifecycle': [u'draft_official_deprecated'], u'reference': [u'PART_00002'], u'form-0-quantity': [u''], 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']} 
     263 
     264 
     265 
     266data3 ={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'not_exits_Document4D362182'], u'1-reference': [u'DOC_00002']} 
    218267  
    219268#u'2-group': [u'1']  
    220 data4 ={u'2-lifecycle': [u'draft_official_deprecated'], u'3-lifecycle': [u'draft_official_deprecated'], u'reference': [u'PART_00006'], u'form-0-quantity': [u'1'], 
    221  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'1'], u'1-lifecycle': [u'draft_official_deprecated'], u'3-group': [u'2'], u'group': [u'2'], u'1-revision': [u'a'], u'lifecycle': [u'draft_official_deprecated'], u'2-name': [u'NUT'], u'form-0-type_part': [u'Part'], u'csrfmiddlewaretoken': [u'6a0951fed02461061f796c63d98bb430', u'6a0951fed02461061f796c63d98bb430'], u'3-name': [u'NUT'], u'revision': [u'a'], u'initial-2-lifecycle': [u'draft_official_deprecated'], u'initial-1-lifecycle': [u'draft_official_deprecated'], u'1-name': [u'BOLT'], u'form-TOTAL_FORMS': [u'2', u'2'], u'2-reference': [u'PART_00007'], u'2-revision': [u'a'], u'form-INITIAL_FORMS': [u'0', u'0'], u'form-1-quantity': [u'1'], u'initial-lifecycle': [u'draft_official_deprecated'], u'3-reference': [u'DOC_00008'], u'name': [u'BOLT'], u'form-MAX_NUM_FORMS': [u'', u''], 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_00007']} 
     269data4 ={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'1'], 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'not_exits_Document4D362182'], u'1-reference': [u'DOC_00002']} 
    222270  
    223271#form-1-type_part=SinglePart  
    224 data5 ="""?csrfmiddlewaretoken=6a0951fed02461061f796c63d98bb430&form-TOTAL_FORMS=2&form-INITIAL_FORMS=0&form-MAX_NUM_FORMS=&form-TOTAL_FORMS=2&form-INITIAL_FORMS=0&form-MAX_NUM_FORMS=&form-0-order=10&form-0-quantity=1&reference=PART_00009&revision=a&form-0-type_part=SinglePart&lifecycle=draft_official_deprecated&initial-lifecycle=draft_official_deprecated&name=L-BRACKET&group=1&1-reference=DOC_00010&1-revision=a&form-0-type_document3D=Document3D&1-lifecycle=draft_official_deprecated&initial-1-lifecycle=draft_official_deprecated&1-name=L-BRACKET&1-group=1&form-1-order=20&form-1-quantity=3&2-reference=PART_00010&2-revision=a&form-1-type_part=SinglePart&2-lifecycle=draft_official_deprecated&initial-2-lifecycle=draft_official_deprecated&2-name=NBA_ASM&2-group=1&3-reference=DOC_00011&3-revision=a&form-1-type_document3D=Document3D&3-lifecycle=draft_official_deprecated&initial-3-lifecycle=draft_official_deprecated&3-name=NBA_ASM&3-group=1 HTTP/1.1""" 
     272data5 ="""?csrfmiddlewaretoken=6a0951fed02461061f796c63d98bb430&form-TOTAL_FORMS=2&form-INITIAL_FORMS=2&form-MAX_NUM_FORMS=2&form-TOTAL_FORMS=2&form-INITIAL_FORMS=2&form-MAX_NUM_FORMS=2&last_modif_time=2012-03-06+16%3A43%3A01&last_modif_microseconds=705294&form-0-order=10&form-0-quantity=1&form-0-type_part=Part&reference=PART_00004&revision=a&name=L-BRACKET&lifecycle=draft_official_deprecated&initial-lifecycle=draft_official_deprecated&group=2&form-0-type_document3D=Document3D&1-reference=DOC_00007&1-revision=a&1-name=L-BRACKET&1-lifecycle=draft_official_deprecated&initial-1-lifecycle=draft_official_deprecated&1-group=2&form-1-order=20&form-1-quantity=3&form-1-type_part=SinglePart&2-reference=PART_00005&2-revision=a&2-name=NEW_BOLT&2-lifecycle=draft_official_deprecated&initial-2-lifecycle=draft_official_deprecated&2-group=2&2-supplier=&2-tech_details=Ubuntu&form-1-type_document3D=Document3D&3-reference=DOC_00008&3-revision=a&3-name=NBA_ASM&3-lifecycle=draft_official_deprecated&initial-3-lifecycle=draft_official_deprecated&3-group=2 HTTP/1.1""" 
    225273#u'form-1-type_part': [u'SinglePart'] u'1-name': [u'BOLT_NEW'] 
    226274data5_1 ="""<tr><th><label for="id_2-reference">Reference:</label></th><td><input id="id_2-reference" type="text" name="2-reference" value="PART_00002" maxlength="50" /></td></tr> 
     
    228276<tr><th><label for="id_2-lifecycle">Lifecycle:</label></th><td><select name="2-lifecycle" id="id_2-lifecycle"> 
    229277<option value="draft_official_deprecated" selected="selected">Lifecycle&lt;draft_official_deprecated&gt;</option> 
    230 <option value="draft_official">Lifecycle&lt;draft_official&gt;</option> 
    231278</select><input type="hidden" name="initial-2-lifecycle" value="draft_official_deprecated" id="initial-2-id_2-lifecycle" /></td></tr> 
    232279<tr><th><label for="id_2-name">Name:</label></th><td><input type="text"  autocomplete="off" name="2-name" id="id_2-name"/> 
  • branches/3D/openPLM/document3D/urls.py

    r817 r842  
    2020    (r'^object/([^/]+)/([^/]+)/([^/]+)/decompose/([^/]+)/$', views.display_decompose), 
    2121    (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), 
    2224 
    2325) 
    2426 
    2527 
    26 #urlpatterns += patterns2('', object_url,     
    27     #(r'files/$', views.display_files3D), 
    28 #) 
  • branches/3D/openPLM/document3D/views.py

    r813 r842  
    44from django.template import RequestContext 
    55from openPLM.document3D.models import * 
    6 from openPLM.document3D.arborescense import generate_file_arborescense 
     6from openPLM.document3D.arborescense import * 
    77from openPLM.document3D.decomposer import * 
    88from openPLM.plmapp.forms import * 
     
    1515from openPLM.plmapp.tasks import update_indexes 
    1616from openPLM.plmapp.exceptions import LockError 
    17 # cambio en plmapp.part para return del link 
    18 # cambio para devolver el formulario en crete_form_form 
    19  
     17from mimetypes import guess_type 
     18from openPLM.document3D.composer import composer 
    2019 
    2120def r2r(template, dictionary, request): 
     
    5453            options = form.cleaned_data 
    5554            doc_file = options["Display"] 
    56             multi_image=list(stp_to_jss.objects.filter(stp=doc_file))  
    57             #get al links js 
    58             more_multi_image=[]    
    59             add_references_multi_image(request.user,doc_file,more_multi_image) 
    60             menu_arborescense=stp_to_jss_arborescense.objects.filter(stp=doc_file) 
    61             if menu_arborescense.count()>0: 
    62                 menu_arborescense=menu_arborescense[0].js.name 
    63             else: 
    64                 menu_arborescense="" 
     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) 
     57             
     58             
     59            product=read_arbrefile(doc_file,request.user) 
     60            javascript_arborescense=generate_javascript_for_3D(product) 
     61 
    6562                          
    6663 
    67              
    68  
    69             ctx.update({'select_stp_form': form, 'multi_image3D' : multi_image+more_multi_image ,'menu_arborescense' : menu_arborescense, })     
     64            ctx.update({'select_stp_form': form, 'file_geometry_js' : file_geometry_js,'javascript_arborescense' : javascript_arborescense, })     
    7065            return r2r('Display3D.htm', ctx, request) 
    7166         
     
    7570         
    7671   
    77     image = form.fields["Display"].initial 
    78  
    79     if image is None: 
    80         multi_image=[] 
    81         menu_arborescense=[] 
    82         more_multi_image=[] 
    83     else: 
    84  
    85         multi_image=list(stp_to_jss.objects.filter(stp=image)) 
    86         more_multi_image=[]    
    87         add_references_multi_image(request.user,image,more_multi_image)  
    88         #menu_arborescense=stp_to_jss_arborescense.objects.filter(stp=image)[0].js.name 
    89         menu_arborescense=stp_to_jss_arborescense.objects.filter(stp=image) 
    90         if menu_arborescense.count()>0: 
    91             menu_arborescense=menu_arborescense[0].js.name 
    92         else: 
    93             menu_arborescense=""  
    94             #aqui decir algo raro, por que no es normal tener stp sin arborescencia asociados 
    95         #print "EL numero de ficheros es " ,multi_image.count() 
    96  
    97          
    98     ctx.update({'select_stp_form': form , 'multi_image3D' : multi_image+more_multi_image , 'menu_arborescense' : menu_arborescense , }) 
     72    doc_file = form.fields["Display"].initial 
     73 
     74     
     75    if doc_file is None: 
     76        file_geometry_js=[] 
     77        more_file_geometry_js=[] 
     78        javascript_arborescense=False 
     79    else: 
     80 
     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)    
     84        javascript_arborescense=generate_javascript_for_3D(product) 
     85 
     86         
     87    ctx.update({'select_stp_form': form , 'file_geometry_js' : file_geometry_js , 'javascript_arborescense' : javascript_arborescense , }) 
    9988  
    10089    return r2r('Display3D.htm', ctx, request) 
     
    157146        for Doc_Part_Link in list_doc: 
    158147            controller=DocumentController(Doc_Part_Link.document,request.user) 
    159             file_stp =is_decomposable(controller)        
    160             if file_stp and not file_stp.locked: 
     148            if is_decomposable(controller):        
    161149                is_children_decomposable[index]=True 
    162150                     
     
    169157                         
    170158 
    171  
    172159    decompose_valid=[]      
    173160    list_doc=obj.get_attached_documents() 
    174     #solo el primero 
    175161    for Doc_Part_Link in list_doc: 
    176162        controller=DocumentController(Doc_Part_Link.document,request.user) 
    177163        file_stp =is_decomposable(controller) 
    178         if file_stp and not file_stp.locked:              
     164        if file_stp:              
    179165            decompose_valid.append((Doc_Part_Link.document,file_stp))  
    180166 
     
    208194 
    209195    stp_file=DocumentFile.objects.get(id=stp_id)   
    210   
    211196    if request.method == 'POST': 
    212197     
    213198 
    214199        extra_errors="" 
    215         list_branchs_decomposables , arbre =elements_decomposable(stp_file)        
     200        links=elements_decomposable(stp_file)        
    216201        Select_Doc_Part_types = formset_factory(Doc_Part_type_Form) 
    217202        Select_Order_Quantity_types = formset_factory(Order_Quantity_Form) 
     
    220205        form_Doc_Part_attributes = [] 
    221206        last_time_modification=Form_save_time_last_modification(request.POST) 
     207 
    222208        if last_time_modification.is_valid(): 
     209 
    223210            old_modification_data_time=last_time_modification.cleaned_data['last_modif_time'] 
    224211            old_modification_data_microsecond=last_time_modification.cleaned_data['last_modif_microseconds'] 
    225            
     212 
    226213            options=clear_form(request ,form_Doc_Part_types,form_Order_Quantity,form_Doc_Part_attributes) 
    227             document_controller=DocumentController(stp_file.document,request.user)  
     214            document_controller=DocumentController(stp_file.document,request.user) 
     215 
    228216            # como casar que un form a dado no valido por eso? 
    229217            if options: 
    230218 
    231219                #django Datetimefields does not suport micro seconds 
    232                 if same_time(old_modification_data_time,old_modification_data_microsecond,document_controller.mtime):  
    233                  
     220                # 
     221                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 and not stp_file.locked :  
     222 
    234223 
    235224                    try: 
     
    237226                         
    238227                        try: 
    239                             files_to_delete=decomposer_stp(stp_file,options,list_branchs_decomposables,obj,request.user,arbre) 
     228                            product=decomposer_stp(stp_file,options,links,obj,request.user) 
    240229                             
    241230 
    242231                        except Document_decompose_Error as excep: 
    243                             #restaurar el antiguo arborescense , si he creado un nuevo arbol , deberia de borrarlo, en la excepciones de decomposer hacer exepcion si fallo mientras genero el nuevo arborescensia y en ese caso borrar el fichero nuevo generado 
    244232                            extra_errors="Columns reference, type, revision are not unique for index : %s"%excep.index_error 
    245233                        except Document3D_generate_file_Error as excep: 
     
    247235                             
    248236                        else: 
     237                            decomposer_product(product,stp_file) 
    249238                            return HttpResponseRedirect(obj.plmobject_url+"BOM-child/")                                                       
    250239                        finally: 
     
    259248                    extra_errors="The Document3D associated with the file STEP to decompose has been modified by another user while the forms were refilled:Please restart the process" 
    260249        else: 
     250                    print last_time_modification.errors  
    261251                    extra_errors="Mistake reading of the last modification of the document, please restart the task"                                           
    262             #except Exception as excep : 
    263                 #print "aqui trato la exception" 
    264                 #mostrar errores a la hora de generar los links 
    265                 #if excep.type_error=="The file STEP to decompose has been modified by another user while the forms were refilled: the length of elements to decompose into its elements does not correspond with the form.Return to initiate the process": 
    266                     #extra_errors=excep 
     252 
    267253 
    268254                                
     
    274260 
    275261        last_time_modification=Form_save_time_last_modification() 
    276         last_time_modification.fields["last_modif_time"].initial=document_controller.mtime   
     262        last_time_modification.fields["last_modif_time"].initial=document_controller.mtime 
     263 
    277264        last_time_modification.fields["last_modif_microseconds"].initial=document_controller.mtime.microsecond              
    278         list_branchs_decomposables , arbre =elements_decomposable(stp_file) 
    279           
     265        links=elements_decomposable(stp_file) 
     266        if not links: 
     267            return HttpResponseRedirect(obj.plmobject_url+"BOM-child/")               
    280268        Select_Doc_Part_types = formset_factory(Doc_Part_type_Form) 
    281269        Select_Order_Quantity_types = formset_factory(Order_Quantity_Form) 
    282270        data = { 
    283         'form-TOTAL_FORMS': u'%s'%len(list_branchs_decomposables), 
    284         'form-INITIAL_FORMS': u'%s'%len(list_branchs_decomposables), 
    285         'form-MAX_NUM_FORMS': u'%s'%len(list_branchs_decomposables), 
    286         }  
    287         for index in range(len(list_branchs_decomposables)): 
     271        'form-TOTAL_FORMS': u'%s'%len(links), 
     272        'form-INITIAL_FORMS': u'%s'%len(links), 
     273        'form-MAX_NUM_FORMS': u'%s'%len(links), 
     274        } 
     275        index=0  
     276        for link in links: 
    288277            order=(index+1)*10 
    289278            data.update({'form-%s-order'%index :u'%s'%order, 
    290                          'form-%s-quantity'%index : u'%s'%list_branchs_decomposables[index].quantity, 
     279                         'form-%s-quantity'%index : u'%s'%link.quantity, 
    291280                         'form-%s-type_part'%index :u'Part', 
    292281                         'form-%s-type_document3D'%index : u'Document3D', 
    293                         })       
     282                        })  
     283            index=index+1      
    294284 
    295285                      
     
    310300            part_attributes.prefix=index*2 
    311301            part_attributes.fields["group"].initial=obj.object.group 
    312             part_attributes.fields["name"].initial=list_branchs_decomposables[index].name_product 
     302            part_attributes.fields["name"].initial=links[index].product.name 
    313303            doc_attributes=get_creation_form(request.user,models.get_all_plmobjects()["Document3D"],None,index) 
    314304            doc_attributes.prefix=index*2+1 
    315             doc_attributes.fields["name"].initial=list_branchs_decomposables[index].name_product 
     305            doc_attributes.fields["name"].initial=links[index].product.name 
    316306            doc_attributes.fields["group"].initial=obj.object.group 
    317307            form_Doc_Part_attributes.append([part_attributes,doc_attributes])             
     
    341331 
    342332 
    343 def generate_part_doc_links(prepare_list,list_branchs_decomposables,obj,user):           
     333def generate_part_doc_links(prepare_list,links,obj,user):           
    344334    index=0 
    345335    list_document_controller=[] 
     
    352342        instances.append((part_controller.object._meta.app_label,part_controller.object._meta.module_name, part_controller.object._get_pk_val()))  
    353343 
    354         link = obj.add_child(part_controller.object,ord_quantity[1],ord_quantity[0],ord_quantity[2])                 
    355         generate_extra_location_links(list_branchs_decomposables[index],link)  
     344        ParentChildLink = obj.add_child(part_controller.object,ord_quantity[1],ord_quantity[0],ord_quantity[2])                 
     345        generate_extra_location_links(links[index],ParentChildLink)  
    356346     
    357347        doc_controller=obj.create_from_form(part_doc_create_form[1],user,False,True) 
     
    359349        part_controller.attach_to_document(doc_controller.object)  
    360350 
    361         controller=DocumentController(doc_controller.object,user) 
    362         list_document_controller.append(controller) 
     351        list_document_controller.append(doc_controller) 
    363352 
    364353        index+=1 
     
    437426               
    438427def ajax_decompose_form(request): 
     428 
     429 
    439430    Select_Doc_Part_types = formset_factory(Doc_Part_type_Form) 
    440431    form_Doc_Part_types = Select_Doc_Part_types(request.GET) 
     
    442433    form_Order_Quantity = Select_Order_Quantity_types(request.GET) 
    443434    last_time_modification=Form_save_time_last_modification(request.GET) 
    444      
    445435     
    446436    form_Doc_Part_attributes = [] 
     
    458448                form_Doc_Part_attributes.append([part_attributes,doc_attributes])     
    459449                index=index+1 
     450                 
    460451          
    461    
    462452        zip_list=zip(form_Doc_Part_types.forms,form_Doc_Part_attributes,form_Order_Quantity.forms) 
    463453 
     
    483473    return False       
    484474 
    485 def add_references_multi_image(user,doc_file,files_to_add): 
     475def add_references_file_geometry_js(user,doc_file,files_to_add): 
    486476 
    487477    controller=DocumentController(doc_file.document,user) 
     
    507497                            for t in range(len(to_add)): 
    508498                                files_to_add.append(to_add[t])  
    509                             add_references_multi_image(user,STP_file[0],files_to_add) 
    510  
    511  
    512  
    513 @handle_errors 
    514 def display_files3D(request, obj_type, obj_ref, obj_revi): 
    515     """ 
    516     Manage html page which displays the files (:class:`DocumentFile`) uploaded in the selected object. 
    517     It computes a context dictionnary based on 
    518      
    519     .. include:: views_params.txt  
    520     """ 
    521     obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) 
    522  
    523     if not hasattr(obj, "files"): 
    524         raise TypeError() 
    525     if request.method == "POST": 
    526         formset = get_file_formset(obj, request.POST) 
    527         if formset.is_valid(): 
    528             obj.update_file(formset) 
    529             return HttpResponseRedirect(".") 
    530     else: 
    531         formset = get_file_formset(obj) 
    532      
    533          
    534     is_stp=[] 
    535     for form in formset.forms: 
    536         doc_file_id=form.fields["id"].initial 
    537         doc_file=DocumentFile.objects.get(id=doc_file_id) 
    538         fileName, fileExtension = os.path.splitext(doc_file.filename) 
    539         natif_trouve=False 
    540         if fileExtension.upper() in ('.STP', '.STEP'): 
    541             list_doc_files=obj.files 
    542             list_doc_files=list_doc_files.exclude(id=doc_file.id) 
    543             list_doc_files=list_doc_files.exclude(deprecated=True) 
    544             list_doc_files=list(list_doc_files) 
    545             for doc in list_doc_files: 
    546                 new_fileName, new_fileExtension = os.path.splitext(doc.filename) 
    547                 print new_fileName , fileName               
    548                 if new_fileName==fileName: 
    549                     natif_trouve=True 
    550                     break                         
    551         if natif_trouve: 
    552             is_stp.append(True)              
    553         else: 
    554             is_stp.append(False)    
    555  
    556     zip_list=zip(formset.forms,is_stp) 
    557     archive_form = ArchiveForm() 
    558     ctx.update({'current_page':'files',  
    559                 'file_formset': formset, 
    560                 'zip':zip_list, 
    561                 'archive_form' : archive_form, 
    562                }) 
    563     return r2r('DisplayObjectFiles3D.htm', ctx, request) 
     499                            add_references_file_geometry_js(user,STP_file[0],files_to_add) 
     500 
     501 
     502@handle_errors  
     503def download(request, docfile_id, filename=""): 
     504    """ 
     505    View to download a document file. 
     506     
     507    :param request: :class:`django.http.QueryDict` 
     508    :param docfile_id: :attr:`.DocumentFile.id` 
     509    :type docfile_id: str 
     510    :return: a :class:`django.http.HttpResponse` 
     511    """ 
     512     
     513    doc_file = DocumentFile.objects.get(id=docfile_id) 
     514    ctrl=DocumentController(doc_file.document,request.user) 
     515    ctrl.check_readable() 
     516    name = doc_file.filename.encode("utf-8", "ignore") 
     517    mimetype = guess_type(name, False)[0]     
     518    if not mimetype: 
     519        mimetype = 'application/octet-stream'  
     520         
     521            
     522    fileName, fileExtension = os.path.splitext(doc_file.filename)  
     523    if fileExtension.upper() in ('.STP', '.STEP'): 
     524        composer(doc_file,request.user) 
     525        response = HttpResponse(file(doc_file.file.path), mimetype=mimetype) 
     526        response["Content-Length"] = doc_file.file.size         
     527    else:     
     528        response = HttpResponse(file(doc_file.file.path), mimetype=mimetype) 
     529        response["Content-Length"] = doc_file.file.size 
     530 
     531 
     532 
     533     
     534    if not filename: 
     535        response['Content-Disposition'] = 'attachment; filename="%s"' % name 
     536    return response 
    564537 
    565538 
    566539      
    567540@transaction.commit_on_success         
    568 def decomposer_stp(stp_file,options,list_branchs_decomposables,obj,user,arbre):   
     541def decomposer_stp(stp_file,options,links,obj,user):   
    569542   
    570     list_doc3D_controller , instances =generate_part_doc_links(options,list_branchs_decomposables,obj,user)                           
    571     files_to_delete=decomposer_all(stp_file,list_doc3D_controller,user,list_branchs_decomposables,arbre,obj) 
     543    list_doc3D_controller , instances =generate_part_doc_links(options,links,obj,user)                           
     544    product=decomposer_all(stp_file,list_doc3D_controller,user,links) 
    572545    update_indexes.delay(instances) 
    573     return files_to_delete  
    574      
    575 """     
    576 @handle_errors  
    577 def deprecated(request, obj_type, obj_ref, obj_revi, docfile_id): 
    578  
    579     obj = get_obj(obj_type, obj_ref, obj_revi, request.user) 
    580     doc_file = models.DocumentFile.objects.get(id=docfile_id) 
    581     obj.lock(doc_file) 
    582     return download(request, docfile_id) 
    583 """ 
     546    return product  
     547     
     548 
  • branches/3D/openPLM/media/js/3D.js

    r817 r842  
    33 
    44            var params = $("#decompose_form").serialize(); 
    5  
    6  
    75            $.ajax({ 
    86                url: "/ajax/decompose/?" + params, 
    97                success: function( new_data ) { 
    108 
    11  
     9                 
    1210                var $new_form = jQuery(new_data); 
    1311                 
     
    6159 
    6260                }); 
    63                 //lo pongo visible y el boton en - 
    64                  
    65                  
    66                 //copiar el value anterior del boton 
     61 
    6762                $('#decompose_form').empty(); 
    6863                $("#decompose_form").append($new_form); 
  • branches/3D/openPLM/plmapp/controllers/document.py

    r817 r842  
    9191            raise ValueError("Bad file's document") 
    9292        if not doc_file.checkout_valid: 
    93             raise ValueError("Check-out impossible, native related file is locked")  
     93            raise LockError("Check-out impossible, native related file is locked") 
     94        if doc_file.deprecated: 
     95            raise LockError("Check-out impossible,  file is deprecated")   
    9496        if not doc_file.locked: 
    9597            doc_file.locked = True 
  • branches/3D/openPLM/plmapp/models.py

    r817 r842  
    878878                native, native_ext = os.path.splitext(doc.filename)            
    879879                if native == name and ext in native_to_standards[native_ext.lower()]: 
    880                     return False 
     880                    return False                                 
    881881        return True 
    882882         
Note: See TracChangeset for help on using the changeset viewer.