Changeset 703 in main for branches


Ignore:
Timestamp:
02/02/12 13:13:04 (8 years ago)
Author:
agalech
Message:

Possibility of separating into its elements files step from the TAB BOMB-CHILD of a part. The file stp must be associated with one document3D associated with a part

Location:
branches/3D/openPLM
Files:
16 edited

Legend:

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

    r644 r703  
    5959            name = new_stp_jss.js.storage.get_available_name(fileName+".js") 
    6060            path = os.path.join(new_stp_jss.js.storage.location, name) 
    61             if(not mesh_to_3js(my_mesh,path.encode(),"_"+str(i))): 
     61            if(not mesh_to_3js(my_mesh,path.encode(),"_"+str(i)+"_"+str(doc_file.id),shape.nom)): 
    6262                print "Error generating fichier .JS for shape : " ,shape.nom  
    6363                return False     
     
    6666                new_stp_jss.js = name 
    6767                new_stp_jss.index = i 
     68                #new_stp_jss.count=shape.count 
    6869                new_stp_jss.save() 
    6970                 
     
    8081    By default, this argument is set to 1 : the default precision of the mesher is used. 
    8182    ''' 
    82     quality_factor=1 
     83    quality_factor=0.3 
    8384    a_mesh = QuickTriangleMesh(DISPLAY_LIST=True) 
    8485    a_mesh.set_shape(shape) 
     
    8990 
    9091 
    91 def mesh_to_3js(mesh,filename,name): 
     92def mesh_to_3js(mesh,filename,name,shape_nom): 
    9293    """ Take a mesh, exports to a three.js javascript file""" 
    9394 
     
    101102 
    102103        output = open(filename,"w") 
     104        output.write("//Computation for : %s"%shape_nom) 
    103105        output.write(""" 
    104106    var %s = function () { 
  • branches/3D/openPLM/document3D/STP_converter_WebGL.py

    r668 r703  
    2020import os, os.path 
    2121from openPLM.document3D.models import * 
     22from openPLM.plmapp.controllers.part import PartController 
     23from django.db.models import Q 
     24 
    2225from OCC.TDataStd import * 
    2326from OCC.STEPCAFControl import * 
     
    3336from OCC.XSControl import * 
    3437from OCC.STEPControl import * 
    35  
     38from OCC.TopLoc import TopLoc_Location 
    3639 
    3740 
     
    6669        return self._color_tool      
    6770         
    68     def read_file(self,doc_file):       
     71    def read_file(self,doc_file,user_to_load_part_reference=False):       
    6972        STEPReader = STEPCAFControl_Reader()         
    7073         
     
    114117           
    115118        #We are going to refill the tree with information 
     119         
     120         
    116121        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) 
    118        
     122            generate_arbre_shape(l_Labels_root.Value(i+1),shape_tool,self._shapes_arbre,color_tool,self._shapes_simples,doc_file.id) 
     123         
     124        if user_to_load_part_reference:# y si tengo varios root? 
     125            add_references_to_arbre(user_to_load_part_reference,self._shapes_arbre[0],doc_file)  
     126         
     127         
    119128        return True               
    120          
    121 def generate_arbre_shape(label,shape_tool,arbre_shape,color_tool,shapes_simples,doc_file): 
     129#def truncate_names(): 
     130 
     131 
     132 
     133 
     134 
     135 
     136 
     137def add_references_to_arbre(user,shapes_arbre,doc_file): 
     138 
     139     
     140    controller=Document3DController(doc_file.document,user) 
     141    #puede estar unido a mas de una parte? 
     142    part=controller.get_attached_parts()[0] 
     143    part_parent=part.part 
     144    #list_link=ParentChildLink.objects.filter(parent=part.part).values_list("id", flat=True) 
     145    list_link=ParentChildLink.objects.filter(parent=part_parent) 
     146    for i in range(len(list_link)): 
     147        list_loc=Location_link.objects.filter(link=list_link[i]) 
     148        if len(list_loc)>0:  
     149            part_child=list_link[i].child 
     150            part_controller=PartController(part_child,user) 
     151            list_doc=part_controller.get_attached_documents() 
     152            for Doc_Part_Link in list_doc: 
     153                if Doc_Part_Link.document.type=="Document3D":# y si hay mas de uno ?? tratar el caso 
     154                    STP_file=Doc_Part_Link.document.files.filter(Q(filename__iendswith=".stp") | Q(filename__iendswith=".step")) 
     155                    if STP_file.exists(): 
     156                        my_step_importer = NEW_STEP_Import( STP_file[0].file.path.encode())   #simple 
     157                        my_step_importer.read_file(STP_file[0],user) 
     158                        new_arbre=my_step_importer.get_shapes_arbre() 
     159                        new_arbre=new_arbre[0] #to get the root 
     160                        for t in range(len(list_loc)):                        
     161                            if t is 0: 
     162                                new_arbre.names[t]=list_loc[t].name_reference 
     163                                new_arbre.locations[t]=generate_location(list_loc[t]) 
     164                            else: 
     165                                new_arbre.names.append(list_loc[t].name_reference) 
     166                                new_arbre.locations.append(generate_location(list_loc[t]))     
     167                                new_arbre.quantity+=1 
     168                        new_arbre.root=False  
     169                        new_arbre.reference=True         
     170                        shapes_arbre.children.append(new_arbre) 
     171 
     172     
     173     
     174    #shapes_arbre.children.append() 
     175      
     176 
     177 
     178def generate_location(Location_link): 
     179    transformation=gp_Trsf() 
     180    direction=gp_Dir() 
     181    if Location_link.angle: # direction cant be 0 0 0 ,  
     182         
     183        direction.SetXYZ(gp_XYZ(Location_link.rx,Location_link.ry,Location_link.rz)) 
     184 
     185    transformation.SetRotation(gp_Ax1(gp_Pnt(gp_XYZ(0,0,0)),direction),Location_link.angle) 
     186    transformation.SetTranslationPart(gp_Vec(Location_link.x,Location_link.y,Location_link.z)) 
     187    location=TopLoc_Location(transformation) 
     188    return location 
     189        
     190def generate_arbre_shape(label,shape_tool,arbre_shape,color_tool,shapes_simples,doc_id): 
    122191 
    123192#buscamos los vecinos con el mismo ref 
     
    128197     
    129198        label_reference=TDF_Label() 
    130         shape_tool.GetReferredShape(label,label_reference) 
    131   
    132   
     199        shape_tool.GetReferredShape(label,label_reference)     
     200 
    133201        for i in range(len(arbre_shape)): 
    134202            if shape_tool.GetShape(arbre_shape[i].label_reference).IsPartner(shape_tool.GetShape(label_reference)):                       
     
    141209             
    142210        else: 
    143             arbre_shape.append(node_shape(label,GetLabelNom(label),shape_tool.GetLocation(label),label_reference,GetLabelNom(label_reference),shape_tool.IsTopLevel(label))) 
    144211            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             
    145215                                     
    146216    else: 
    147         label_to_expand=label     
    148         arbre_shape.append(node_shape(label,GetLabelNom(label),shape_tool.GetLocation(label),label,GetLabelNom(label),shape_tool.IsTopLevel(label))) 
     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)) 
    149220                 
    150221    if not reference_found: 
    151222     
    152223        if shape_tool.IsAssembly(label_to_expand): 
     224        
    153225                l_c = TDF_LabelSequence() 
    154226                shape_tool.GetComponents(label_to_expand,l_c)  
    155227                for i in range(l_c.Length()): 
    156                     generate_arbre_shape(l_c.Value(i+1),shape_tool,arbre_shape[len(arbre_shape)-1].children,color_tool,shapes_simples,doc_file) 
     228                    generate_arbre_shape(l_c.Value(i+1),shape_tool,arbre_shape[len(arbre_shape)-1].children,color_tool,shapes_simples,doc_id) 
    157229        else: 
    158230         
     
    161233            for s in range(len(shapes_simples)): 
    162234                if compShape.IsPartner(shapes_simples[s].shape): 
    163                     #incrementamos en 1 el contador de este new.jss 
    164                     #increase_reference(s,doc_file) 
    165                     arbre_shape[len(arbre_shape)-1].children.append(feuille_nom_shapes(GetLabelNom(label),colour_chercher(label,color_tool,shape_tool),s))  
     235                    arbre_shape[len(arbre_shape)-1].children.append(feuille_nom_shapes(GetLabelNom(label),colour_chercher(label,color_tool,shape_tool),s,doc_id))  
    166236                    break 
    167237         
    168238         
    169 #def increase_reference(s,doc_file): 
    170  
    171     #q1=stp_to_jss.objects.filter(stp=doc_file) 
    172     #q2=q1.filter(index=s) 
    173     #q2 
     239 
    174240 
    175241 
  • branches/3D/openPLM/document3D/aficher.py

    r668 r703  
    1919 
    2020    my_step_importer = NEW_STEP_Import(doc_file.file.path.encode())   #simple 
    21      
    22     if not my_step_importer.read_file(doc_file.id): 
     21    if not my_step_importer.read_file(doc_file): 
    2322        print "\n\n\nMAl, el fichero leido no es valido\n\n\n"  
    2423        return False 
    2524 
    26  
     25    # if truncate names, reecrire fichier step? escribir uno nuevo encima y volver a leerlo 
    2726 
    2827    procesing_simples_shapes(my_step_importer.get_shapes_simples(),doc_file) 
    2928     
    30  
    31  
    32      
    33     part_numeration , objects_numeration = generate_file_arborescense(my_step_importer.get_shapes_arbre(),doc_file) 
     29    generate_file_arborescense(my_step_importer.get_shapes_arbre(),doc_file) 
    3430 
    3531 
    3632 
    3733 
    38     #decomposer(doc_file,controller,part_numeration,objects_numeration) 
     34    #decomposer(doc_file,controller) 
    3935 
    4036 
  • branches/3D/openPLM/document3D/arborescense.py

    r661 r703  
    1414 
    1515 
    16  
    1716    graph=kjGraph() 
    1817    root=[] 
    1918    part_numeration=[0] 
    20     objects_numeration=[0] 
    2119    menu_generate_objects=["var object3D = new THREE.Object3D();\n"] 
    2220 
    23     for i in range(len(my_shapes_arbre)):#para evitar entrar en el root si este tiene cantidad superior a uno 
    24         ok=parcours_recursif(my_shapes_arbre[i],graph,part_numeration,objects_numeration,menu_generate_objects,[],"",root,doc_file.id) 
    25   
     21    for i in range(len(my_shapes_arbre)): 
     22        ok=parcours_recursif(my_shapes_arbre[i],graph,part_numeration,menu_generate_objects,[],"",root) 
     23     
     24     
     25    #add_references de otros shapes poniendo su etiqueta is reference a 1 
    2626    if ok: 
    27         generate_file(doc_file,graph,root,menu_generate_objects) 
    28  
     27        return generate_file(doc_file,graph,root,menu_generate_objects) 
     28     
    2929        
    30     return part_numeration, objects_numeration 
    31  
    32  
    33 def parcours_recursif(my_shapes_arbre,graph,part_numeration,objects_numeration,menu_generate_objects,loc,old_name,root,doc_id): 
    34      
     30 
     31 
     32 
     33def parcours_recursif(my_shapes_arbre,graph,part_numeration,menu_generate_objects,loc,old_name,root): 
     34     
     35     
     36     
     37    part_id=str(my_shapes_arbre.doc_id)#part id hace referencia el id de la rama, si es una referencia es el id del hijo 
    3538    if  isinstance(my_shapes_arbre,node_shape): 
    3639        for index in range(my_shapes_arbre.quantity): 
     
    4043            if not my_shapes_arbre.IsRoot(): 
    4144                nom=my_shapes_arbre.names[index] 
    42                 nom=nom+"."+str(part_numeration[0]) 
     45                nom=nom+"."+str(part_numeration[0])+"."+part_id 
    4346                graph.add(old_name,nom) 
    4447            else: 
    45                 nom=my_shapes_arbre.name_component+"."+str(part_numeration[0]) 
     48                nom=my_shapes_arbre.name_component+"."+str(part_numeration[0])+"."+part_id 
    4649                root.append(nom) 
    47             menu_generate_objects[0]+="var part%s_%s=new THREE.Object3D();\n"%(part_numeration[0],doc_id) 
     50            menu_generate_objects[0]+="var part%s_%s=new THREE.Object3D();\n"%(part_numeration[0],part_id) 
    4851            part_numeration[0]=part_numeration[0]+1 
    4952            for i in range(len(my_shapes_arbre.children)): 
    50                 parcours_recursif(my_shapes_arbre.children[i],graph,part_numeration,objects_numeration,menu_generate_objects,loc2,nom,root,doc_id) 
     53                parcours_recursif(my_shapes_arbre.children[i],graph,part_numeration,menu_generate_objects,loc2,nom,root) 
     54                 
    5155             
    5256             
     
    5458    else: #is instance of feuille_nom_shapes 
    5559    #var mesh = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { color: 0xffffff } )  ); 
    56         numeration=objects_numeration[0] 
     60        numeration=part_numeration[0] 
    5761        red=my_shapes_arbre.red 
    5862        green=my_shapes_arbre.green 
     
    7478            t=transformation.TranslationPart() 
    7579            if a:         
    76                 menu_generate_objects[0]+="object%s_%s.matrix.setRotationAxis(new THREE.Vector3( %s, %s, %s ), %s);\n"%(objects_numeration[0],doc_id,gp.X(),gp.Y(),gp.Z(),b) 
    77                  
    78             menu_generate_objects[0]+="object%s_%s.matrix.setPosition(new THREE.Vector3( %s, %s, %s ));\n"%(objects_numeration[0],doc_id,t.X(),t.Y(),t.Z()) 
    79             menu_generate_objects[0]+="object%s_%s.matrixAutoUpdate = false;\n"%(objects_numeration[0],doc_id) 
    80              
    81              
    82         graph.add(old_name,objects_numeration[0]) 
    83         objects_numeration[0]=objects_numeration[0]+1 
     80                menu_generate_objects[0]+="object%s_%s.matrix.setRotationAxis(new THREE.Vector3( %s, %s, %s ), %s);\n"%(part_numeration[0],part_id,gp.X(),gp.Y(),gp.Z(),b) 
     81                 
     82            menu_generate_objects[0]+="object%s_%s.matrix.setPosition(new THREE.Vector3( %s, %s, %s ));\n"%(part_numeration[0],part_id,t.X(),t.Y(),t.Z()) 
     83            menu_generate_objects[0]+="object%s_%s.matrixAutoUpdate = false;\n"%(part_numeration[0],part_id) 
     84             
     85             
     86        graph.add(old_name,str(part_numeration[0])+"."+part_id) #aqui meter algo mas? 
     87        #graph.add(old_name,part_numeration[0]) #aqui meter algo mas? 
     88        part_numeration[0]=part_numeration[0]+1 
    8489                       
    8590    return True      
     
    8792     
    8893 
    89  
     94function_generate_objects= """ 
     95 
     96var NewMaterial=new THREE.MeshBasicMaterial({opacity:1,shading:THREE.SmoothShading}); 
     97NewMaterial.color.setRGB(%(red)f,%(green)f,%(blue)f); 
     98var object%(numeration)s_%(part_id)s=new THREE.Mesh( new _%(reference)s_%(part_id)s(),NewMaterial ); 
     99object3D.add(object%(numeration)s_%(part_id)s);         
     100"""    
    90101  
    91102 
    92103def generate_file(doc_file,graph,root,menu_generate_objects): 
    93104 
     105 
     106     
     107 
     108    #remove possible previous arborescense cuando vengo desde decomposer tmb tengo que hacer remove 
     109    query_jss=stp_to_jss_arborescense.objects.filter(stp=doc_file) 
     110    arborescense_js=list(query_jss.values_list("js", flat=True)) 
     111    query_jss.delete()   
     112    eliminer_associes([],arborescense_js) 
     113     
     114     
    94115    fileName, fileExtension = os.path.splitext(doc_file.filename)  
    95116    new_stp_to_jss_arborescense= stp_to_jss_arborescense() 
     
    111132        ######Generate Menu javascript and objects##################################################################################         
    112133        output.write("function menu() {\nelement = document.createElement(\"div\");\nelement.id=\"root\";\nelement.innerHTML =\"")         
    113         generate_menu(graph,root,output,doc_file.id 
     134        generate_menu(graph,output,root 
    114135        output.write("\";\ndocument.getElementById('menu_').appendChild(element);\n}\n") 
    115136        ######End generate menu##################################################################################################### 
     
    122143                 
    123144        #####           Generate functions javascript 
    124         generate_functions(graph,root,output,doc_file.id) 
     145        generate_functions(graph,output,root) 
    125146        #####           End generate functions 
    126147         
     
    134155        return False 
    135156     
     157    return new_stp_to_jss_arborescense.js.name 
     158     
    136159 
    137160 
     
    143166  
    144167function_change_part_head = """ 
    145 function change_part%(part_id)s_%(doc_id)s(atribute) { 
     168function change_part%(part_numeration)s_%(part_id)s(atribute) { 
    146169    if (atribute==\"click\"){ 
    147170     
    148         part%(part_id)s_%(doc_id)s.visible=!part%(part_id)s_%(doc_id)s.visible; 
     171        part%(part_numeration)s_%(part_id)s.visible=!part%(part_numeration)s_%(part_id)s.visible; 
    149172         
    150173    } 
    151174    else{ 
    152         part%(part_id)s_%(doc_id)s.visible=atribute; 
     175        part%(part_numeration)s_%(part_id)s.visible=atribute; 
    153176    } 
    154177         
    155178"""  
    156179function_change_part = """ 
    157     change_part%(part_id_2)s_%(doc_id)s(part%(part_id)s_%(doc_id)s.visible)        
     180    change_part%(part_numeration_2)s_%(part_id_2)s(part%(part_numeration)s_%(part_id)s.visible)        
    158181""" 
    159182function_change_object = """ 
    160     object%(object_id)s_%(doc_id)s.visible=part%(part_id)s_%(doc_id)s.visible;    
     183    object%(object_numeration)s_%(object_id)s.visible=part%(part_numeration)s_%(part_id)s.visible;    
    161184"""                                     
    162185           
    163 def generate_functions(graph,root,output,doc_id,nom=''): 
    164  
    165  
    166     if not nom=='': #nom = '' only in first interaction 
    167         root=graph.neighbors(nom) 
    168  
     186def generate_functions(graph,output,root): 
     187 
     188         
     189               
    169190    for i in range(len(root)): 
    170191  
    171192         
     193        feuille=graph.neighbors(root[i]) 
     194        if not len(feuille)==0: 
     195         
     196         
     197            part, part_id = os.path.splitext(root[i])             
     198            part_name, part_numeration = os.path.splitext(part) 
     199            part_id=part_id.replace(".","") 
     200            part_numeration=part_numeration.replace(".","")         
     201 
     202            output.write(function_change_part_head % (locals()))  
     203 
     204            for t in range(len(feuille)): 
     205                feuille_2=graph.neighbors(feuille[t]) 
     206                 
     207                if feuille_2: 
     208                     
     209                    part, part_id_2 = os.path.splitext(feuille[t])             
     210                    part_name, part_numeration_2 = os.path.splitext(part) 
     211                    part_id_2=part_id_2.replace(".","") 
     212                    part_numeration_2=part_numeration_2.replace(".","") 
     213                    output.write(function_change_part % (locals()))  
     214                        
     215                else:   # si el numero de puntos es uno 
     216                                     
     217                    object_numeration, object_id = os.path.splitext(feuille[t])     
     218                    #el hijo tiene que tener el formato (int).(int), si no lo tiene y ese (str).(int).(int) no crea el hijo 
     219                    if "." not in str(object_numeration):  # para evitar generar objetos de instances arbresnom que no tienen hijos se puede dar el caso de shape sin informacion que no van a generar hijos 
     220                    #solo si se ha llegado a una hoja se genera el objeto, PROBLEMA que resuelve, nombres de shapes con el punto 
     221                    #sino se podria dar el caso de nombres de objetos no validos como 4dm-5 
     222    
     223                        object_id=object_id.replace(".","")  
     224                        output.write(function_change_object % (locals()))  
     225                    else:  # para evitar generar objetos de instances arbresnom que no tienen hijos se puede dar el caso de shape sin informacion que no van a generar hijos 
     226                    #solo si se ha llegado a una hoja se genera el objeto, PROBLEMA que resuelve, nombres de shapes con el punto 
     227                    #sino se podria dar el caso de nombres de objetos no validos como 4dm-5 
     228                        print "Eureka"      
     229  
     230             
     231 
     232            output.write("}\n") 
     233            generate_functions(graph,output,graph.neighbors(root[i])) 
     234 
     235#def generate_objects(): 
     236 
     237 
     238 
     239  
     240 
     241def generate_menu(graph,output,root): 
     242 
     243 
     244 
     245    output.write("<ul>")     
     246     
     247    for i in range(len(root)): 
     248  
    172249        feuille=graph.neighbors(root[i]) 
    173250        if not len(feuille)==0:  
    174             part_name, part_id = os.path.splitext(root[i]) 
     251            part, part_id = os.path.splitext(root[i])             
     252            part_name, part_numeration = os.path.splitext(part) 
    175253            part_id=part_id.replace(".","") 
    176             output.write(function_change_part_head % (locals()))  
    177  
    178             for t in range(len(feuille)): 
    179                 feuille_2=graph.neighbors(feuille[t]) 
    180                  
    181                 if feuille_2: 
    182                     part_name, part_id_2 = os.path.splitext(feuille[t]) 
    183                     part_id_2=part_id_2.replace(".","") 
    184                     output.write(function_change_part % (locals()))     
    185                 else: 
    186                     if "." not in str(feuille[t]):  # para evitar generar objetos de instances arbresnom que no tienen hijos se puede dar el caso de shape sin informacion que no van a generar hijos 
    187                         object_id=feuille[t] 
    188                         output.write(function_change_object % (locals()))  
    189        
    190   
    191              
    192  
    193             output.write("}\n") 
    194             generate_functions(graph,'',output,doc_id,root[i]) 
    195  
    196 #def generate_objects(): 
    197  
    198  
    199  
    200   
    201  
    202 def generate_menu(graph,root,output,doc_id,nom=''): 
    203  
    204  
    205  
    206     output.write("<ul>")     
    207      
    208     if not nom=='': #nom = '' only in first interaction 
    209         root=graph.neighbors(nom) 
    210  
    211     for i in range(len(root)): 
    212   
    213         feuille=graph.neighbors(root[i]) 
    214         if not len(feuille)==0:  
    215             part_name, part_extension = os.path.splitext(root[i]) 
    216             part_id=part_extension.replace(".","") 
    217  
    218             functio_onclick="change_part"+part_id+"_"+str(doc_id)+"(\\\"click\\\")" 
     254            part_numeration=part_numeration.replace(".","") 
     255             
     256             
     257            functio_onclick="change_part"+part_numeration+"_"+part_id+"(\\\"click\\\")" 
    219258            output.write("<li > <a href='#' onClick='%s'><b onClick='%s'></b>%s </a>"%(functio_onclick,functio_onclick,part_name)) 
    220259           
    221             generate_menu(graph,'',output,doc_id,root[i])        
     260            generate_menu(graph,output,graph.neighbors(root[i]))        
    222261            output.write("</li>") 
    223262 
     
    226265 
    227266  
    228 function_generate_objects= """ 
    229  
    230 var NewMaterial=new THREE.MeshBasicMaterial({opacity:1,shading:THREE.SmoothShading}); 
    231 NewMaterial.color.setRGB(%(red)f,%(green)f,%(blue)f); 
    232 var object%(numeration)s_%(doc_id)s=new THREE.Mesh( new _%(reference)s(),NewMaterial ); 
    233 object3D.add(object%(numeration)s_%(doc_id)s);         
    234 """    
     267 
    235268#el grafo para las partes tiene el nombre .id correlativa, para las hojas es directamente un ID             
    236269 
  • branches/3D/openPLM/document3D/composer.py

    r668 r703  
    1010     
    1111    my_step_importer = NEW_STEP_Import(new_doc_file.file.path.encode()) 
    12     my_step_importer.read_file(new_doc_file) 
     12    my_step_importer.read_file(new_doc_file.id) 
    1313    st=my_step_importer.get_shapes_tool() 
    1414    lr= TDF_LabelSequence() 
  • branches/3D/openPLM/document3D/decomposer.py

    r658 r703  
    66from openPLM.document3D.arborescense import * 
    77from OCC.TDF import * 
     8from django.db.models import Q 
    89import os, os.path 
    910 
    10 def decomposer(doc_file,controller,part_numeration,objects_numeration): 
     11 
     12 
     13#IMPORTANTE , y si hago un retroceder pagina y los datos han cambiado? asegurarse de que se generan los nuevos y se bloque el step 
     14def decomposer_all(doc_file,list_document3d_controller,user): 
    1115 
    1216 
     
    1418     
    1519    my_step_importer.read_file(doc_file) 
     20     
     21    old_controller=Document3DController(doc_file.document,user)  
     22    #anadir referencias al arbol mirando las dependencias 
     23 
     24     
    1625     
    1726    shape_tool=my_step_importer.get_shapes_tool() 
    1827    arbre=my_step_importer.get_shapes_arbre() 
    1928    labels_roots = TDF_LabelSequence() 
    20     shape_tool.GetFreeShapes(labels_roots) 
    21  
    22      
    23      
    24     diviser(shape_tool,arbre,controller,doc_file,part_numeration,objects_numeration) 
    25  
    26  
    27  
    28  
    29     return generate_step_decompose(doc_file,labels_roots,controller,arbre)#importante el labels root, asi solo coje los que habia antes 
    30      
    31  
    32  
    33  
    34  
    35  
    36  
    37 def diviser(shape_tool,arbre,controller,doc_file,part_numeration,objects_numeration): 
    38  
    39  
    40  
    41      
    42     #if isinstance(arbre,list): 
     29    shape_tool.GetFreeShapes(labels_roots) # il faut garder les root originaux avant faire modifications   
     30     
     31     
     32     
     33    l_possible_decomposition=get_decomposition_possibilities(arbre) 
     34     
     35    if len(l_possible_decomposition) == len(list_document3d_controller):  
     36        for i in range (len(l_possible_decomposition)): 
     37            diviser(l_possible_decomposition[i],list_document3d_controller[i],shape_tool,doc_file) 
     38    else: 
     39        raise  Document3D_decompose_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(In decomposer_all).Return to initiate the process\n",3)  
     40 
     41    #generate_file_arborescense(arbre,doc_file)  
     42    #BORRAR los link del padre 
     43 
     44 
     45    generate_step_decompose(doc_file,labels_roots,old_controller)#importante el labels root, asi solo coje los que habia antes 
     46 
     47 
     48def get_decomposition_possibilities(arbre): 
     49 
     50    list=[] 
    4351    for t in range(len(arbre)): 
    4452 
     
    4755            if isinstance(arbre[t].children[i],node_shape): 
    4856             
    49                 if not arbre[t].children[i].IsRoot() and not arbre[t].children[i].IsReference(): 
    50                     a_decomposer=arbre[t].children[i] 
    51                     WS = XSControl_WorkSession() 
    52                     writer = STEPCAFControl_Writer( WS.GetHandle(), False ) 
    53                     writer.Transfer(a_decomposer.label_reference, STEPControl_AsIs) 
    54                     status = writer.Write(settings.MEDIA_ROOT+a_decomposer.name_component+".stp")              
    55                     f=open(settings.MEDIA_ROOT+a_decomposer.name_component+".stp") 
    56                     myfile = File(f) 
    57                     myfile.name=GetLabelNom(a_decomposer.label_reference)+".stp" 
    58                     new_doc_file=controller.add_file(myfile,False) 
    59                     os.remove(settings.MEDIA_ROOT+a_decomposer.name_component+".stp") 
    60                     for m in range(a_decomposer.quantity): 
    61                         shape_tool.RemoveComponent(a_decomposer.labels[m]) 
    62  
     57                if  not arbre[t].children[i].IsReference(): 
     58                    list.append(arbre[t].children[i]) 
    6359                     
    64                     #borrar el archivo antiguo 
    65                      
    66                      
    67                     a_decomposer.path=True    
    68                     a_decomposer.ref_id=new_doc_file.id 
    69  
    70                     #crear el link entre partes 
    71                      
    72  
    73                     generate_newshape_arbre(a_decomposer,new_doc_file,doc_file,part_numeration,objects_numeration) 
    74  
    75                            
    76                 #else:para hacer varios niveles 
    77                     #diviser(shape_tool,arbre[i].children,controller,doc_file,part_numeration,objects_numeration)     
    78                   
    79              
     60    return list 
     61 
     62 
     63 
     64def diviser(old_branch,Doc_3d_controller,shape_tool,doc_file): 
     65 
     66 
     67 
     68 
     69    WS = XSControl_WorkSession() 
     70    writer = STEPCAFControl_Writer( WS.GetHandle(), False ) 
     71    writer.Transfer(old_branch.label_reference, STEPControl_AsIs) 
     72    status = writer.Write(settings.MEDIA_ROOT+old_branch.name_component+".stp")              
     73    f=open(settings.MEDIA_ROOT+old_branch.name_component+".stp") 
     74    myfile = File(f) 
     75    myfile.name=GetLabelNom(old_branch.label_reference)+".stp" 
     76    new_doc_file=Doc_3d_controller.add_file(myfile,False) 
     77    os.remove(settings.MEDIA_ROOT+old_branch.name_component+".stp") 
     78    for m in range(old_branch.quantity): 
     79        shape_tool.RemoveComponent(old_branch.labels[m]) 
     80 
     81     
     82 
     83     
     84     
     85    #a_decomposer.path=True    
     86    #a_decomposer.doc_id=new_doc_file.id 
     87 
     88    #crear el link entre partes 
     89    new_my_step_importer = NEW_STEP_Import(new_doc_file.file.path.encode())   #simple 
     90    if not new_my_step_importer.read_file(new_doc_file): 
     91        print "\n\n\nMAl, el fichero leido no es valido\n\n\n"  
     92        return False 
     93         
     94         
     95    new_arbre=new_my_step_importer.get_shapes_arbre() 
     96  
     97    generate_file_arborescense(new_arbre,new_doc_file)   
     98  
     99    new_arbre=new_arbre[0]# para que arbre corresponda con el root 
     100    #procesing_simples_shapes(new_my_step_importer.get_shapes_simples(),new_doc_file)   
     101     
     102    generate_new_links_whit_jss(old_branch,new_arbre,new_doc_file,doc_file)# es importante el nuevo index de los ficheros js, y el nuevo count?  
     103 
     104 
     105    """ 
     106    for attr in a.__slots__: setattr(a, attr, getattr(b, attr))  
     107    """ 
     108     
     109     
     110    #old_arbre 
     111    #elimino antes el fichero 
     112    #query_jss=stp_to_jss_arborescense.objects.filter(stp=doc_file) 
     113    #arborescense_js=list(query_jss.values_list("js", flat=True)) 
     114    #query_jss.delete()   
     115    #eliminer_associes([],arborescense_js) 
     116    #generate_file_arborescense(arbre,doc_file)    
     117        
     118    #meto en el arbol original el nuevo y genero la arborescencia del nuevo 
     119    #y meto la referencia              
     120    #borrar el archivo antiguo  y poner el descompuesto o generar el compuesto y ponerlo?          
    80121    return True 
    81122     
    82      
    83 def generate_step_decompose(doc_file,labels_roots,controller,arbre): 
    84  
    85     fileName, fileExtension = os.path.splitext(doc_file.filename)  
     123         
     124        
     125def generate_new_links_whit_jss(old_arbre,new_arbre,new_doc_file,old_doc_file): 
     126 
     127    if  isinstance(old_arbre,node_shape): 
     128        for i in range(len(old_arbre.children)): 
     129            if isinstance(old_arbre.children[i],feuille_nom_shapes): 
     130 
     131                 
     132                query_jss=stp_to_jss.objects.filter(stp=new_doc_file,index=new_arbre.children[i].reference) 
     133             
     134                if query_jss.count()==0:          # solo si no se habia generado previamente 
     135                # si ya existe no regenerarla 
     136                    fileName, fileExtension = os.path.splitext(new_doc_file.filename) 
     137                    #old_stp_js=stp_to_jss.objects.filter(stp=old_doc_file,index=old_arbre.children[i].reference)[0] #MIRAR, hago filter por que puede haber mas de uno, por que? 
     138                    old_stp_js=stp_to_jss.objects.get(stp=old_doc_file,index=old_arbre.children[i].reference)#solo deberia haber uno por index 
     139                    new_stp_js= stp_to_jss() 
     140                    new_name = new_stp_js.js.storage.get_available_name(fileName+".js")             
     141                    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,new_arbre.children[i].reference)            
     142                    new_stp_js.stp = new_doc_file 
     143                    new_stp_js.js = new_name 
     144                    ###hacemos que apunten al mismo## 
     145                    old_stp_js.js=new_stp_js.js 
     146                    old_stp_js.save() 
     147                    ################################# 
     148                    new_stp_js.index = new_arbre.children[i].reference 
     149                    new_stp_js.save() 
     150 
     151           
     152            else: 
     153             
     154                #para el new arbre seleccionar el q sea identico, nadie nos asegura que va a ser leido en igual orden pero si q sus datos de loc y otros son los mismos          #comparar_ramas IMPORTANTE FUNCION 
     155                #coje el hijo correspondiente 
     156                #get_children 
     157                generate_new_links_whit_jss(old_arbre.children[i],new_arbre.children[i],new_doc_file,old_doc_file) 
     158             
     159 
     160     
     161 
     162 
     163    return True 
     164 
     165def is_decomposable(document3D): 
     166 
     167 
     168    STP_file=document3D.files.filter(Q(filename__iendswith=".stp") | Q(filename__iendswith=".step")) 
     169    if STP_file.exists(): 
     170        return elements_decomposable(STP_file[0])       
     171    return False ,False 
     172          
     173def elements_decomposable(fileSTP): 
     174 
     175    my_step_importer = NEW_STEP_Import(fileSTP.file.path.encode())   #simple 
     176     
     177    my_step_importer.read_file(fileSTP) 
     178     
     179     
     180    #anadir referencias al arbol mirando las dependencias 
     181     
     182     
     183     
     184    shape_tool=my_step_importer.get_shapes_tool() 
     185    arbre=my_step_importer.get_shapes_arbre() 
     186 
     187     
     188     
     189    l_possible_decomposition=get_decomposition_possibilities(arbre) 
     190    if len(l_possible_decomposition)>0: 
     191        return fileSTP.filename  , l_possible_decomposition     
     192    return False ,False 
     193 
     194 
     195 
     196 
     197           
     198def copy_old_js_to_new_js(location,old_name,new_name,old_id, old_index,new_id,new_index): 
     199     
     200    path = os.path.join(location, old_name) 
     201    infile = open(path.encode(),"r") 
     202    path = os.path.join(location, new_name) 
     203    outfile = open(path.encode(),"w") 
     204    for line in infile.readlines():  
     205        new_line=line.replace("_%s_%s"%(old_index,old_id),"_%s_%s"%(new_index,new_id)) 
     206        outfile.write(new_line) 
     207 
     208    infile.close() 
     209    outfile.close() 
     210     
     211    return True      
     212     
     213     
     214     
     215def generate_step_decompose(doc_file,labels_roots,controller): 
     216 
     217    #fileName, fileExtension = os.path.splitext(doc_file.filename)  
     218 
     219 
    86220    WS = XSControl_WorkSession() 
    87221    writer = STEPCAFControl_Writer( WS.GetHandle(), False ) 
    88222    for i in range(labels_roots.Length()): 
     223         
    89224        writer.Transfer(labels_roots.Value(i+1), STEPControl_AsIs)  
    90     status = writer.Write(settings.MEDIA_ROOT+"descompuesto_"+str(fileName)+".stp")  
    91       
    92     f=open(settings.MEDIA_ROOT+"descompuesto_"+str(fileName)+".stp") 
    93     myfile = File(f) 
    94     myfile.name="descompuesto_"+str(fileName)+".stp" 
    95     new_doc_file=controller.add_file(myfile,False) 
    96     os.remove(settings.MEDIA_ROOT+"descompuesto_"+str(fileName)+".stp") 
    97     for i in range(len(arbre)): 
    98         generate_links_whit_jss(arbre[i],new_doc_file,doc_file)    
    99          
    100  
    101     new_stp_to_jss_arborescense= stp_to_jss_arborescense() 
    102     new_stp_to_jss_arborescense.stp = new_doc_file  
    103     q1=stp_to_jss_arborescense.objects.filter(stp=doc_file)            
    104     new_stp_to_jss_arborescense.js = q1[0].js 
    105     new_stp_to_jss_arborescense.save() 
    106     return new_doc_file   
    107      
    108         
    109 def generate_links_whit_jss(my_shapes_arbre,new_doc_file,doc_file): 
    110  
    111     if  isinstance(my_shapes_arbre,node_shape): 
    112         for i in range(len(my_shapes_arbre.children)): 
    113             if isinstance(my_shapes_arbre.children[i],feuille_nom_shapes): 
    114                 q1=stp_to_jss.objects.filter(stp=doc_file) 
    115                 q2=q1.filter(index=my_shapes_arbre.children[i].reference) 
    116  
    117                 new_stp_jss= stp_to_jss()            
    118                 new_stp_jss.stp = new_doc_file 
    119                 new_stp_jss.js = q2[0].js 
    120                 new_stp_jss.index = q2[0].index 
    121                 new_stp_jss.save() 
    122                 #si count es 0 se elimina y para todos los que sean mayores se decrementa en uno su indice para que corresponda con el nuevo arbre shape simples 
    123              
    124             else: 
    125                 generate_links_whit_jss(my_shapes_arbre.children[i],new_doc_file,doc_file) 
    126              
    127  
    128      
    129  
    130  
    131     return True 
    132      
    133      
    134 def generate_newshape_arbre(my_shapes_arbre,new_doc_file,doc_file,part_numeration,objects_numeration): 
    135  
    136  
    137     generate_links_whit_jss(my_shapes_arbre,new_doc_file,doc_file) 
    138  
    139  
    140     graph=kjGraph() 
    141  
    142     root=[] 
    143     menu_generate_objects=["var object3D = new THREE.Object3D();\n"] 
    144     nom=my_shapes_arbre.name_component+"."+str(part_numeration[0]) 
    145     root.append(nom) 
    146     menu_generate_objects[0]+="var part%s_%s=new THREE.Object3D();\n"%(part_numeration[0],new_doc_file.id) 
    147     part_numeration[0]=part_numeration[0]+1 
    148     for i in range(len(my_shapes_arbre.children)):#para evitar entrar en el root si este tiene cantidad superior a uno 
    149         ok=parcours_recursif(my_shapes_arbre.children[i],graph,part_numeration,objects_numeration,menu_generate_objects,[],nom,root,new_doc_file.id) 
    150      
    151  
    152     if ok: 
    153         generate_file(new_doc_file,graph,root,menu_generate_objects) 
    154          
    155  
    156  
    157     return True   
     225             
     226    os.chmod(doc_file.file.path, 0777)        
     227    status = writer.Write(doc_file.file.path.encode())  
     228    os.chmod(doc_file.file.path, 0400) 
     229 
     230    my_step_importer = NEW_STEP_Import(doc_file.file.path.encode())   #simple 
     231    my_step_importer.read_file(doc_file,controller._user) 
     232    generate_file_arborescense(my_step_importer.get_shapes_arbre(),doc_file) 
     233 
     234     
     235 
  • branches/3D/openPLM/document3D/forms.py

    r613 r703  
    22from openPLM.document3D.models import * 
    33from django.db.models import Q 
     4from django.db import models 
     5from openPLM.plmapp.models import get_all_plmparts_with_level 
     6from openPLM.plmapp.forms import group_types 
     7from django.forms.formsets import formset_factory 
     8 
     9 
     10 
     11 
     12class UserCreationForm(forms.Form): 
     13    username = forms.CharField(max_length=30) 
     14    password1 = forms.CharField(widget=forms.PasswordInput) 
     15    password2 = forms.CharField(widget=forms.PasswordInput) 
     16 
     17    def __init__(self, *args, **kwargs): 
     18        extra = kwargs.pop('extra') 
     19        super(UserCreationForm, self).__init__(*args, **kwargs) 
     20 
     21        for i, question in enumerate(extra): 
     22            self.fields['custom_%s' % i] = forms.CharField(label=question)             
     23              
     24class Doc_Part_type_Form(forms.Form): 
     25    LIST_parts = group_types(get_all_plmparts_with_level()) 
     26    type_part = forms.TypedChoiceField(choices=LIST_parts,label='') 
     27    type_part.widget.attrs["onchange"]="update_form()" 
     28    type_part.widget.attrs["class"]="selector" 
     29    #type_part.widget.attrs["onchange"]="this.options[this.selectedIndex].selected" 
     30 
     31       
     32    LIST_document3D = group_types(get_all_plmDocument3Dtypes_with_level())   
     33    type_document3D = forms.TypedChoiceField(choices=LIST_document3D,label='') 
     34    type_document3D.widget.attrs["onclick"]="this.form.submit()" 
     35     
     36     
     37     
     38class Order_Quantity_Form(forms.Form): 
     39 
     40    order = forms.FloatField() 
     41    quantity = forms.FloatField() 
     42 
     43 
     44class Ref_Rev_Name(forms.Form): 
     45 
     46    #reference = models.CharField(_("reference"), max_length=50, db_index=True) 
     47    #revision = models.CharField(_("revision"), max_length=50) 
     48    #name = models.CharField(_("name"), max_length=100, blank=True,help_text=_(u"Name of the product")) 
     49    reference = models.CharField( max_length=50, db_index=True) 
     50    revision = models.CharField( max_length=50) 
     51    name = models.CharField( max_length=100, blank=True) 
     52 
    453 
    554class Form3D(forms.ModelForm): 
     
    2372         
    2473        #queryset = document3D.files.filter(filename__endswith=".stp") 
    25         queryset = document3D.files.filter(Q(filename__endswith=".stp") | Q(filename__endswith=".step") | Q(filename__endswith=".STP") | Q(filename__endswith=".STEP")) 
     74        queryset = document3D.files.filter(Q(filename__iendswith=".stp") | Q(filename__iendswith=".step")) 
    2675        #a= stp_to_jss.objects.filter(stp__in=queryset) 
    2776        #a =document3D.files.filter(filename__endswith=".stp") 
     
    3685         
    3786 
    38     
     87 
     88 
     89     
     90        
  • branches/3D/openPLM/document3D/models.py

    r668 r703  
    55from OCC.TopLoc import TopLoc_Location 
    66from django.db.models import get_model 
     7from openPLM.plmapp.filehandlers import HandlersManager 
     8from OCC.gp import * 
     9#openPLM.plmapp.models.register_PCLE 
    710# Create your models here. 
    811 
     
    1013 
    1114#eliminar navegabilidad 
     15#delete del model elimina el stp de docs/stp/ ?? 
     16class Location_link(ParentChildLinkExtension): 
     17 
     18    x = models.FloatField(default=lambda: 0) 
     19    y = models.FloatField(default=lambda: 0) 
     20    z = models.FloatField(default=lambda: 0) 
     21    rx = models.FloatField(default=lambda: 0) 
     22    ry = models.FloatField(default=lambda: 0) 
     23    rz = models.FloatField(default=lambda: 0) 
     24    angle = models.FloatField(default=lambda: 0) 
     25    name_reference=models.CharField(max_length=100,default="no_name")     
     26 
     27                
     28         
     29         
     30    def __unicode__(self): 
     31        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) 
     32 
     33    @classmethod 
     34    def apply_to(cls, parent): 
     35        # only apply to all parts 
     36        return True 
     37 
     38    def clone(self, link, save, **data): 
     39        x = data.get("x", self.x) 
     40        y = data.get("y", self.y) 
     41        z = data.get("z", self.z) 
     42        rx = data.get("rx", self.rx) 
     43        ry = data.get("ry", self.ry) 
     44        rz = data.get("rz", self.rz) 
     45        angle = data.get("angle", self.angle) 
     46        name_reference=data.get("name_reference", self.name_reference) 
     47        clone = Location_link(link=link, x=x, y=y, z=z ,rx=rx, ry=ry, rz=rz ,angle=angle ,name_reference=name_reference) 
     48        if save: 
     49            clone.save() 
     50        return clone 
     51         
     52admin.site.register(Location_link) 
     53register_PCLE(Location_link) 
     54 
     55         
     56def generate_extra_location_links(node_arbre,link): 
     57 
     58 
     59    for i in range(node_arbre.quantity): 
     60        loc=Location_link() 
     61        loc.link=link 
     62        print "\n\n\n\n Aqui dentro vale" , node_arbre.locations[i].ShallowDumpToString() 
     63        transformation=node_arbre.locations[i].Transformation() 
     64        loc.name_reference=node_arbre.names[i] 
     65        gp=gp_XYZ()         
     66        a ,b =transformation.GetRotation(gp) 
     67        t=transformation.TranslationPart() 
     68        if a: 
     69            loc.rx=gp.X() 
     70            loc.ry=gp.Y() 
     71            loc.rz=gp.Z() 
     72            loc.angle=b  
     73        loc.x=t.X() 
     74        loc.y=t.Y() 
     75        loc.z=t.Z()                     
     76        print "\n\n\n\n X, Y Z" , loc.x , loc.y , loc.z , loc.rx ,loc.ry ,loc.rz ,loc.angle 
     77             
     78         
     79        loc.save() 
     80         
     81         
     82         
     83         
     84 
     85 
     86@memoize_noarg 
     87def get_all_plmDocument3Dtypes_with_level(): 
     88    lst = [] 
     89    level=">>" 
     90    get_all_subclasses_with_level(Document3D, lst , level) 
     91    return lst   
     92 
    1293 
    1394class Document3D(Document): 
     
    57138    stp = models.ForeignKey(DocumentFile) 
    58139    index = models.IntegerField() 
    59     count = models.IntegerField(default=0) 
     140    count = models.IntegerField(default=1) # no se utiliza, se puede quitar 
    60141 
    61142#sirve para algo el index? 
     
    73154 
    74155    """ 
    75     def __init__(self, nom,shape): 
     156    __slots__ = ("nom", "shape", "count") 
     157     
     158    def __init__(self, nom,shape,count=0): 
    76159        self.nom = nom 
    77160        self.shape = shape 
     161        self.count=count 
     162 
     163 
    78164 
    79165 
     
    97183 
    98184    """ 
    99     __slots__ = ("names", "locations", "children", "quantity","labels","path","root","label_reference","ref_id","name_component") 
    100      
    101      
    102     def __init__(self,label,name,location,label_reference,name_component,root,path=False): 
     185    __slots__ = ("names", "locations", "children", "quantity","labels","reference","root","label_reference","name_component","doc_id") 
     186     
     187     
     188    def __init__(self,label,name,location,label_reference,name_component,root,doc_id,reference=False): 
    103189        self.labels = [label]       
    104190        self.names = [name] 
     
    108194        self.quantity=1 
    109195        self.name_component=name_component 
    110         self.path=path 
     196        self.doc_id=doc_id   #cambiar por stp id 
     197        self.reference=reference 
    111198        self.root=root 
    112199 
     
    120207                     
    121208    def IsReference(self): 
    122         return self.path 
     209        return self.reference 
    123210         
    124211    def IsRoot(self): 
     
    156243    """ 
    157244     
    158     __slots__ = ("nom", "reference", "red", "green", "blue") 
    159      
    160     def __init__(self, nom,colour,ref): 
     245    __slots__ = ("nom", "reference", "red", "green", "blue","doc_id") 
     246     
     247    def __init__(self, nom,colour,ref,doc_id): 
    161248        self.nom = nom 
    162249        self.reference=ref 
     250        self.doc_id=doc_id 
    163251        if colour: 
    164252            self.red=colour.Red() 
     
    171259@task 
    172260def handle_step_file(doc_file_pk,object_id,user_id): 
     261 
    173262    import logging 
    174263    logging.getLogger("GarbageCollector").setLevel(logging.ERROR) 
     
    178267    object=Document3D.objects.get(id=object_id) 
    179268    controller=Document3DController(object,user)  
    180     fileName, fileExtension = os.path.splitext(doc_file.filename) 
    181  
    182      
    183     if fileExtension.upper() in ('.STP', '.STEP'): 
     269 
     270 
     271     
     272 
     273    query_jss=stp_to_jss.objects.filter(stp=doc_file) 
     274    files_js=list(query_jss.values_list("js", flat=True)) 
     275    query_jss=stp_to_jss_arborescense.objects.filter(stp=doc_file) 
     276    arborescense_js=list(query_jss.values_list("js", flat=True))  
     277    #neccesary in case of check-in           
     278    eliminer_associes(files_js,arborescense_js) 
     279    ok=convertir_STP_to_WebGL(doc_file,controller) 
     280         
     281    if not ok: 
     282             
    184283        query_jss=stp_to_jss.objects.filter(stp=doc_file) 
    185284        files_js=list(query_jss.values_list("js", flat=True)) 
    186285        query_jss=stp_to_jss_arborescense.objects.filter(stp=doc_file) 
    187286        arborescense_js=list(query_jss.values_list("js", flat=True))  
    188         #neccesary in case of check-in           
     287        #effacer touts les fichiers generes 
    189288        eliminer_associes(files_js,arborescense_js) 
    190         ok=convertir_STP_to_WebGL(doc_file,controller) 
    191          
    192         if not ok: 
    193                  
    194             query_jss=stp_to_jss.objects.filter(stp=doc_file) 
    195             files_js=list(query_jss.values_list("js", flat=True)) 
    196             query_jss=stp_to_jss_arborescense.objects.filter(stp=doc_file) 
    197             arborescense_js=list(query_jss.values_list("js", flat=True))  
    198             #effacer touts les fichiers generes 
    199             eliminer_associes(files_js,arborescense_js) 
    200              
    201             print "Error: It was not possible to generate a sight 3D of the file." 
    202             return False             
     289         
     290        print "Error: It was not possible to generate a sight 3D of the file." 
     291        return False             
    203292         
    204293         
     
    212301 
    213302 
    214  
     303#comprobar aue se elminan bien los ficheros de docs/stp 
    215304class Document3DController(DocumentController): 
    216305 
    217306    def handle_added_file(self, doc_file): 
    218      
    219         handle_step_file.delay(doc_file.pk,self.object.id,self._user.id)         
     307 
     308         
     309        fileName, fileExtension = os.path.splitext(doc_file.filename) 
     310        if fileExtension.upper() in ('.STP', '.STEP'):     
     311            handle_step_file.delay(doc_file.pk,self.object.id,self._user.id)         
    220312             
    221313    def delete_file(self, doc_file): 
     
    227319            files_js=list(query_jss.values_list("js", flat=True)) 
    228320            query_jss=stp_to_jss_arborescense.objects.filter(stp=doc_file) 
    229             arborescense_js=list(query_jss.values_list("js", flat=True))   
    230                        
     321            arborescense_js=list(query_jss.values_list("js", flat=True)) 
     322             
     323             
     324            #eliminar el var_X_X=_X_X del fichero js donde x = doc_file id             
     325            delete_reference_in_jss(doc_file.id,files_js)   
     326             
     327             
     328             
     329 
     330            #si en ese momento ningun js.name corresponde con instancia de la BD eliminar el fichero           
    231331        super(Document3DController, self).delete_file(doc_file) 
    232332        #il faut apeller super avant pour verifier droits de utilisateur 
     
    234334        if fileExtension.upper() in ('.STP', '.STEP'): 
    235335            eliminer_associes(files_js,arborescense_js) 
    236  
    237  
     336             
     337             
     338             
     339def delete_reference_in_jss(doc_id,files_js): 
     340 
     341    for name in files_js: 
     342        filename = settings.MEDIA_ROOT+"3D/"+ name  
     343        f=open(filename) 
     344        for line in reversed(f.readlines()):  
     345            if line.find("_%s=_"%doc_id): 
     346                 
     347                break 
     348            if line.find("."): 
     349                break 
     350        print line.rstrip() 
    238351#elimine les fichiers .jss associes a un fichier step  
     352class Document3D_decompose_Error(Exception): 
     353    """ 
     354    Exception raised when an import of a CSV file fails. 
     355 
     356    .. attribute: errors 
     357 
     358        dictionary (line -> :class:`~django.forms.util.ErrorList`) of all 
     359        detected errors. 
     360    """ 
     361 
     362    def __init__(self, errors , type_error,index_error): 
     363        self.errors = errors 
     364        self.type_error=type_error 
     365        self.index_error=index_error 
     366 
     367    def __unicode__(self): 
     368        return u"Document3D_decompose_Error type "+str(self.type_error)+" :\n\t" + self.errors 
    239369 
    240370def eliminer_associes(files_js,arborescense_js): 
     
    244374        filename = settings.MEDIA_ROOT+"3D/"+ name 
    245375        if os.path.exists(filename) and os.path.isfile(filename): 
    246             os.remove(filename) 
    247             print "Deleting geometry .jss associes:" , filename 
     376 
     377            query_jss=stp_to_jss.objects.filter(js=name) 
     378            #borrar solo si ningun stp tiene ese js 
     379            if query_jss.count()==0:  
     380                os.remove(filename) 
     381                print "Deleting geometry .jss associes:" , filename 
    248382 
    249383    for name in arborescense_js: 
     
    253387            print "Deleting arborescence .jss associe:" , filename 
    254388 
    255  
     389class Document3D_decompose_Error(Exception): 
     390    """ 
     391    Exception raised when an import of a CSV file fails. 
     392 
     393    .. attribute: errors 
     394 
     395        dictionary (line -> :class:`~django.forms.util.ErrorList`) of all 
     396        detected errors. 
     397    """ 
     398 
     399    def __init__(self, errors , type_error,index_error): 
     400        self.errors = errors 
     401        self.type_error=type_error 
     402        self.index_error=index_error 
     403 
     404    def __unicode__(self): 
     405        return u"Document3D_decompose_Error type "+str(self.type_error)+" :\n\t" + self.errors +" \n\t in elemenet indexed by : "+self.index_error 
  • branches/3D/openPLM/document3D/tests.py

    r668 r703  
    5757     
    5858     
    59     ############################################# test check-out     
     59    ############################################# test check-out   
     60     
     61     
     62    ############################################# test colores original y compuesto   
     63     
     64     
     65    ############################################# en decomposer ver si old arbre y new arbre son iguales o equivalentes IMPORTANTE 
    6066           
    6167     
  • branches/3D/openPLM/document3D/urls.py

    r592 r703  
    44urlpatterns = patterns('', 
    55    (r'^object/Document3D/([^/]+)/([^/]+)/3D/$', views.display_3d), 
     6    (r'^object/([^/]+)/([^/]+)/([^/]+)/BOM-child/$', views.display_object_child), 
     7    (r'^object/([^/]+)/([^/]+)/([^/]+)/decompose/([^/]+)/$', views.display_decompose), 
     8    (r'^ajax/decompose/$', views.ajax_decompose_form), 
    69                      ) 
     10 
  • branches/3D/openPLM/document3D/views.py

    r664 r703  
    11from openPLM.plmapp.base_views import handle_errors , get_generic_data 
    2 from openPLM.document3D.forms import Form3D 
     2from openPLM.document3D.forms import * 
    33from django.shortcuts import render_to_response 
    44from django.template import RequestContext 
    55from openPLM.document3D.models import * 
    6  
    7  
    8  
    9 """ 
    10 def v_3D(request, obj_ref, obj_revi): 
    11  
    12     obj_type = "Document3D"           
    13     return display_3d(request, obj_type , obj_ref, obj_revi) 
    14 """     
     6from openPLM.document3D.arborescense import generate_file_arborescense 
     7from openPLM.document3D.decomposer import * 
     8from openPLM.plmapp.forms import * 
     9import openPLM.plmapp.models as models 
     10from django.db import transaction 
     11from django.forms.formsets import formset_factory 
     12from django.forms.models import modelform_factory 
     13from django.http import HttpResponse ,HttpResponseRedirect 
     14from django.core.files import File 
     15from openPLM.plmapp.tasks import update_indexes 
     16# cambio en plmapp.part para return del link 
     17# cambio para devolver el formulario en crete_form_form 
     18 
     19 
    1520def r2r(template, dictionary, request): 
    1621    """ 
     
    2328                              context_instance=RequestContext(request)) 
    2429   
    25 #@handle_errors 
     30 
    2631 
    2732def display_3d(request, obj_ref, obj_revi): 
     
    4651        if form.is_valid(): 
    4752            options = form.cleaned_data 
    48             image = options["Display"] 
    49             multi_image=stp_to_jss.objects.filter(stp=image) 
     53            doc_file = options["Display"] 
     54            multi_image=stp_to_jss.objects.filter(stp=doc_file)     
     55            #menu_arborescense=generate_file_arborescense(doc_file) 
     56             
    5057            if multi_image.count()>0: 
    5158                #menu_arborescense=stp_to_jss_arborescense.objects.filter(stp=image)[0].js.name 
    52                 menu_arborescense=stp_to_jss_arborescense.objects.filter(stp=image) 
     59                menu_arborescense=stp_to_jss_arborescense.objects.filter(stp=doc_file) 
    5360                if menu_arborescense.count()>0: 
    5461                    menu_arborescense=menu_arborescense[0].js.name 
    5562                else: 
    56                     menu_arborescense=""      
     63                    menu_arborescense="" 
     64                          
    5765            else: 
    5866                #menu_arborescense=stp_to_jss_arborescense.objects.filter(stp=image)[0].js.name     
    5967                menu_arborescense="" 
     68             
    6069 
    6170            ctx.update({'select_stp_form': form, 'multi_image3D' : multi_image ,'menu_arborescense' : menu_arborescense, })     
     
    8998 
    9099 
    91      
    92      
    93      
    94     #print "el total es" 
    95     #print stps.count() 
    96     #print stps[0].file.path 
    97  
    98  
    99                  
    100                  
    101  
    102     #if not hasattr(obj, "files"): 
    103     #    raise TypeError() 
    104     #if request.method == "POST": 
    105     #    formset = get_file_formset(obj, request.POST) 
    106     #    if formset.is_valid(): 
    107     #        obj.update_file(formset) 
    108     #        return HttpResponseRedirect(".") 
    109     #else: 
    110     #    formset = get_file_formset(obj) 
    111     #ctx.update({'current_page':'3D',  
    112     #            'file_formset': formset}) 
    113     #return r2r('3d.htm', ctx, request) 
    114 ########################################################################################## 
     100def display_object_child(request, obj_type, obj_ref, obj_revi):     
     101     
     102     
     103    """ 
     104    Manage html page which displays the chidren of the selected object. 
     105    It computes a context dictionnary based on 
     106     
     107    .. include:: views_params.txt  
     108    """ 
     109 
     110 
     111 
     112 
     113 
     114 
     115    obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi) 
     116 
     117    if not hasattr(obj, "get_children"): 
     118        # TODO 
     119        raise TypeError() 
     120    date = None 
     121    level = "first" 
     122    if request.GET: 
     123        display_form = DisplayChildrenForm(request.GET) 
     124        if display_form.is_valid(): 
     125            date = display_form.cleaned_data["date"] 
     126            level = display_form.cleaned_data["level"] 
     127    else: 
     128        display_form = DisplayChildrenForm(initial={"date" : datetime.datetime.now(), 
     129                                                    "level" : "first"}) 
     130    max_level = 1 if level == "first" else -1 
     131    children = obj.get_children(max_level, date=date) 
     132    if level == "last" and children: 
     133        maximum = max(children, key=attrgetter("level")).level 
     134        children = (c for c in children if c.level == maximum) 
     135    children = list(children) 
     136    extra_columns = [] 
     137    extension_data = defaultdict(dict) 
     138    for PCLE in models.get_PCLEs(obj.object): 
     139        fields = PCLE.get_visible_fields() 
     140        if fields: 
     141            extra_columns.extend((f, PCLE._meta.get_field(f).verbose_name)  
     142                    for f in fields) 
     143            for child in children: 
     144                link = child.link 
     145                for field in fields: 
     146                    try: 
     147                        e = PCLE.objects.get(link=link) 
     148                        extension_data[link][field] = getattr(e, field) 
     149                    except PCLE.DoesNotExist: 
     150                        extension_data[link][field] = "" 
     151                         
     152                      
     153                         
     154 
     155 
     156    form=[]           
     157    list_doc=obj.get_attached_documents() 
     158    #solo el primero 
     159    for Doc_Part_Link in list_doc: 
     160        if Doc_Part_Link.document.type=="Document3D": 
     161             stp_name, list_elements_decomposables =is_decomposable(Doc_Part_Link.document) 
     162             if stp_name: 
     163                form.append((Doc_Part_Link.document.reference,stp_name,list_elements_decomposables[0].doc_id))  
     164                 
     165                 
     166           
     167 
     168    ctx.update({'current_page':'BOM-child', 
     169                'children': children, 
     170                'extra_columns' : extra_columns, 
     171                'extension_data': extension_data, 
     172                'decomposable' : form , 
     173                "display_form" : display_form})    
     174   
     175     
     176 
     177    return r2r('DisplayObjectChild3D.htm', ctx, request) 
     178     
     179     
     180     
     181@transaction.commit_on_success                
     182def display_decompose(request, obj_type, obj_ref, obj_revi, stp_id):     
     183     
     184    #incluir los script para autocompletar nombres y esos ole1 
     185    """ 
     186    Manage html page which displays the chidren of the selected object. 
     187    It computes a context dictionnary based on 
     188     
     189    .. include:: views_params.txt  
     190    """ 
     191    obj, ctx = get_generic_data(request, obj_type, obj_ref, obj_revi)                      
     192 
     193    new_stp_3D=DocumentFile.objects.get(id=stp_id)   
     194  
     195    if request.method == 'POST': 
     196     
     197        #poner aqui cerrojo 
     198        extra_errors="" 
     199        stp_name, list_elements_decomposables=elements_decomposable(new_stp_3D)        
     200        Select_Doc_Part_types = formset_factory(Doc_Part_type_Form) 
     201        Select_Order_Quantity_types = formset_factory(Order_Quantity_Form) 
     202        form_Doc_Part_types = Select_Doc_Part_types(request.POST) 
     203        form_Order_Quantity = Select_Order_Quantity_types(request.POST) 
     204        form_Doc_Part_attributes = [] 
     205  
     206  
     207         
     208    
     209        options=clear_form(request ,form_Doc_Part_types,form_Order_Quantity,form_Doc_Part_attributes) 
     210        # como casar que un form a dado no valido por eso?   
     211 
     212        if options and elements_decomposable:  
     213         
     214 
     215            #verrouiller! 
     216            #try: 
     217            list_doc3D_controller , instance =generate_part_doc_links(options,list_elements_decomposables,obj,request.user)                           
     218            decomposer_all(new_stp_3D,list_doc3D_controller,request.user)  
     219            instances = [] 
     220            for elem in instance:             
     221                instances.append((elem._meta.app_label,elem._meta.module_name, elem._get_pk_val())) 
     222            update_indexes.delay(instances)  
     223 
     224            return HttpResponseRedirect(obj.plmobject_url+"BOM-child/") 
     225 
     226               
     227            #except Exception as excep : 
     228                #print "aqui trato la exception" 
     229                #mostrar errores a la hora de generar los links 
     230                #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": 
     231                    #extra_errors=excep 
     232                #if excep.type_error==2: 
     233                    #extra_errors="Columns reference, type, revision are not unique for index : %s"%excep.index_error 
     234                                
     235         
     236    else: 
     237        stp_name, list_elements_decomposables=elements_decomposable(new_stp_3D) 
     238        Select_Doc_Part_types = formset_factory(Doc_Part_type_Form,extra=len(list_elements_decomposables)) 
     239        Select_Order_Quantity_types = formset_factory(Order_Quantity_Form,extra=len(list_elements_decomposables)) 
     240        form_Doc_Part_types = Select_Doc_Part_types()       
     241        form_Order_Quantity = Select_Order_Quantity_types() 
     242        extra_errors="" 
     243        form_Doc_Part_attributes = [] 
     244        names=[] 
     245        index=0 
     246        for form in form_Doc_Part_types.forms: 
     247            form.fields["type_part"].initial='Part' 
     248            form.fields["type_document3D"].initial='Document3D' 
     249 
     250            part_attributes=get_creation_form(request.user,models.get_all_plmobjects()[form.fields["type_part"].initial],None, index) 
     251            part_attributes.prefix=index*2 
     252            part_attributes.fields["group"].initial=obj.object.group 
     253            part_attributes.fields["name"].initial=list_elements_decomposables[index].name_component 
     254            doc_attributes=get_creation_form(request.user,models.get_all_plmobjects()[form.fields["type_document3D"].initial],None,index) 
     255            doc_attributes.prefix=index*2+1 
     256            doc_attributes.fields["name"].initial=list_elements_decomposables[index].name_component 
     257            doc_attributes.fields["group"].initial=obj.object.group 
     258            form_Doc_Part_attributes.append([part_attributes,doc_attributes])             
     259            index=index+1 
     260 
     261        index=0 
     262        for form in form_Order_Quantity.forms: 
     263            form.fields["order"].initial=(index+1)*10 
     264            form.fields["quantity"].initial=list_elements_decomposables[index].quantity        
     265            index=index+1 
     266 
     267 
     268             
     269    zip_list=zip(form_Doc_Part_types.forms,form_Doc_Part_attributes,form_Order_Quantity.forms) 
     270 
     271    ctx.update({'current_page':'decomposer',  # aqui cambiar 
     272                'object_type': 'Document3D',   
     273                'zip' : zip_list, 
     274                'form_Doc_Part_types' : form_Doc_Part_types, 
     275                'form_Order_Quantity' : form_Order_Quantity, 
     276                'extra_errors' :  extra_errors  
     277                #'formset2': formset2,        
     278                })    
     279     
     280 
     281    return r2r('DisplayDecompose.htm', ctx, request) 
     282 
     283 
     284 
     285 
     286    
     287 
     288def realize_transaction_to_separate(options,list_elements_decomposables,obj,user,new_stp_3D): 
     289 
     290    list_doc3D_controller , instances =generate_part_doc_links(options,list_elements_decomposables,obj,user)                           
     291    decomposer_all(new_stp_3D,list_doc3D_controller,user)   
     292    return instances   
     293    #obj.detach_document(new_stp_3D.document)  
     294 
     295 
     296 
     297def generate_part_doc_links(prepare_list,list_elements_decomposables,obj,user):           
     298    #comprobar que el tam de la lista es el mismo que el de prepara list, por si acaso alguien se ha entretenido en modificar mientras nosotros lo haciamos 
     299     
     300     
     301    if len(list_elements_decomposables) == len(prepare_list):   
     302        index=0 
     303        list_document3D_controller=[] 
     304        instances = [] 
     305        try : 
     306            for ord_quantity , part_doc_create_form  in prepare_list: 
     307                 
     308 
     309                part_controller=obj.create_from_form(part_doc_create_form[0],user,False,True)  
     310                instances.append(part_controller.object)    
     311                link = obj.add_child(part_controller.object,ord_quantity[1],ord_quantity[0])                 
     312                generate_extra_location_links(list_elements_decomposables[index],link)  
     313             
     314                doc_controller=obj.create_from_form(part_doc_create_form[1],user,False,True) 
     315                instances.append(doc_controller.object)   
     316                part_controller.attach_to_document(doc_controller.object)  
     317 
     318                controller=Document3DController(doc_controller.object,user) 
     319                list_document3D_controller.append(controller) 
     320       
     321                index+=1 
     322        except : 
     323            raise  Document3D_decompose_Error ("Columns reference, type, revision are not unique",2,index)                 
     324                
     325                 
     326        return list_document3D_controller , instances  
     327 
     328  
     329            #detacher   
     330     
     331 
     332    else: 
     333        raise  Document3D_decompose_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\n",1) 
     334 
     335 
     336 
     337 
     338 
     339 
     340 
     341 
     342 
     343 
     344 
     345 
     346               
     347def clear_form(request,form_Doc_Part_types,form_Order_Quantity,form_Doc_Part_attributes): 
     348         
     349     
     350    valid=True 
     351    if form_Order_Quantity.is_valid(): 
     352        order_quantity_extra_links=[] 
     353        for form in form_Order_Quantity.forms: 
     354            if form.is_valid():             
     355                options=form.cleaned_data 
     356                order_quantity_extra_links.append([options["order"],options["quantity"]]) 
     357            else: 
     358                valid=False 
     359    else: 
     360        valid=False         
     361     
     362 
     363    if form_Doc_Part_types.is_valid(): 
     364        index=0 
     365 
     366 
     367        for form in form_Doc_Part_types.forms: 
     368            if form.is_valid(): 
     369                options=form.cleaned_data 
     370                part = options["type_part"] 
     371                cls = models.get_all_plmobjects()[part] 
     372                part_form = get_creation_form(request.user, cls, request.POST,0,prefix=index*2) 
     373                doc = options["type_document3D"] 
     374                cls = models.get_all_plmobjects()[doc]                        
     375                doc_form = get_creation_form(request.user, cls, request.POST,0,prefix=index*2+1) 
     376                form_Doc_Part_attributes.append((part_form,doc_form))  
     377                 
     378                if not part_form.is_valid() or not doc_form.is_valid(): 
     379                 
     380                    valid=False 
     381 
     382                index=index+1 
     383            else: 
     384                valid=False 
     385    else: 
     386        valid=False 
     387     
     388     
     389    if valid: 
     390        return zip(order_quantity_extra_links,form_Doc_Part_attributes) 
     391    else: 
     392        return valid          
     393               
     394def ajax_decompose_form(request): 
     395 
     396    Select_Doc_Part_types = formset_factory(Doc_Part_type_Form) 
     397    form_Doc_Part_types = Select_Doc_Part_types(request.GET) 
     398    Select_Order_Quantity_types = formset_factory(Order_Quantity_Form) 
     399    form_Order_Quantity = Select_Order_Quantity_types(request.GET) 
     400     
     401     
     402     
     403    form_Doc_Part_attributes = [] 
     404    index=0 
     405    if form_Doc_Part_types.is_valid(): 
     406        for form in form_Doc_Part_types.forms: 
     407            if form.is_valid(): 
     408                options=form.cleaned_data 
     409                part = options["type_part"] 
     410                part_attributes=get_creation_form(request.user,models.get_all_plmobjects()[part]) 
     411                part_attributes.prefix=index*2 
     412                doc= options["type_document3D"] 
     413                doc_attributes=get_creation_form(request.user,models.get_all_plmobjects()[doc]) 
     414                doc_attributes.prefix=index*2+1            
     415                form_Doc_Part_attributes.append([part_attributes,doc_attributes])     
     416                index=index+1 
     417          
     418 
     419        zip_list=zip(form_Doc_Part_types.forms,form_Doc_Part_attributes,form_Order_Quantity.forms) 
     420 
     421 
     422             
     423 
     424 
     425        ctx={    
     426                'current_page':'BOM-child',  # aqui cambiar 
     427                'object_type': 'Document3D',   
     428                'zip' : zip_list, 
     429                'form_Doc_Part_types' : form_Doc_Part_types, 
     430                'form_Order_Quantity' : form_Order_Quantity,  
     431                }   
     432 
     433        #return r2r('DisplayDecompose.htm', ctx, request) 
     434        return r2r('GenerateSimple.htm', ctx, request)       
     435               
     436 
  • branches/3D/openPLM/media/js/navigate.js

    r662 r703  
    283283        } 
    284284        $("#FilterButton").button().click(function () { 
    285             $("#Navigate").showLoading(); 
    286285            $.post(uri, 
    287286                $("#FilterNav").find("form").serialize(), 
    288287                function (data) { 
    289288                    update_nav(null, data); 
    290                     $("#Navigate").hideLoading(); 
    291289                }); 
    292290            } ); 
  • branches/3D/openPLM/plmapp/controllers/part.py

    r674 r703  
    132132        self._save_histo(link.ACTION_NAME, 
    133133                         "parent : %s\nchild : %s" % (self.object, child)) 
     134        return link 
    134135 
    135136    def delete_child(self, child): 
     
    214215                ext = PCLE(link=link2, **extension_data[name]) 
    215216                ext.save() 
     217        return link2 
    216218 
    217219    def get_children(self, max_level=1, current_level=1, date=None): 
  • branches/3D/openPLM/plmapp/forms.py

    r674 r703  
    119119    if issubclass(cls, m.PLMObject): 
    120120        data = { 
    121                 'reference' : get_new_reference(cls),  
     121                'reference' : get_new_reference(cls, start),  
    122122                'revision' : 'a', 
    123123                'lifecycle' : str(m.get_default_lifecycle().pk), 
     
    127127    return data 
    128128 
    129 def get_creation_form(user, cls=m.PLMObject, data=None, start=0): 
     129def get_creation_form(user, cls=m.PLMObject, data=None, start=0, **kwargs): 
    130130    u""" 
    131131    Returns a creation form suitable to creates an object 
     
    161161        get_creation_form.cache[cls] = Form 
    162162    if data is None: 
    163         form = Form(initial=get_initial_creation_data(cls, start)) 
    164     else: 
    165         form = Form(data=data) 
     163        form = Form(initial=get_initial_creation_data(cls, start), **kwargs) 
     164    else: 
     165        form = Form(data=data, **kwargs) 
    166166    if issubclass(cls, m.PLMObject): 
    167167        # display only valid groups 
     
    208208    return res 
    209209 
     210 
    210211class TypeForm(forms.Form): 
    211212    LIST = group_types(m.get_all_users_and_plmobjects_with_level()) 
    212213    type = forms.TypedChoiceField(choices=LIST) 
     214 
     215 
     216 
     217 
    213218 
    214219class TypeFormWithoutUser(forms.Form): 
     
    388393        parent = form.instance.parent.get_leaf_object() 
    389394        for PCLE in m.get_PCLEs(parent): 
     395            if not PCLE.one_per_link(): 
     396                continue 
    390397            try: 
    391398                ext = PCLE.objects.get(link=form.instance) 
  • branches/3D/openPLM/plmapp/models.py

    r674 r703  
    13571357        return u"PLMObjectUserLink<%s, %s, %s>" % (self.plmobject, self.user, self.role) 
    13581358 
    1359  
    13601359def _get_all_subclasses_with_level(base, lst, level): 
    13611360    level = "=" + level 
     
    13641363    for part in base.__subclasses__(): 
    13651364        _get_all_subclasses_with_level(part, lst, level) 
     1365         
     1366get_all_subclasses_with_level = _get_all_subclasses_with_level 
    13661367 
    13671368@memoize_noarg 
     
    13781379    lst.append(("Group", "Group")) 
    13791380    return lst 
     1381     
     1382     
     1383@memoize_noarg 
     1384def get_all_plmparts_with_level(): 
     1385    lst = [] 
     1386    level=">>" 
     1387    _get_all_subclasses_with_level(Part, lst , level) 
     1388    return lst     
    13801389 
    13811390@memoize_noarg 
     
    13851394    _get_all_subclasses_with_level(User, list_of_choices, level) 
    13861395    return list_of_choices 
     1396 
     1397 
    13871398 
    13881399 
  • branches/3D/openPLM/templates/BaseDisplayHomePage.htm

    r662 r703  
    7171                            <li class="{{"Button"|button:"corner-right,state-active,state-focus"}}"  id="StudyButtonOn"> 
    7272                            {% endif %} 
    73                             <a href="../attributes/"> 
     73                            <a href="{{obj.plmobject_url}}attributes/"> 
    7474                                <span class="ui-button-text">{% trans "STUDY" %}</span> 
    7575                            </a> 
Note: See TracChangeset for help on using the changeset viewer.