- Timestamp:
- 02/02/12 13:13:04 (8 years ago)
- Location:
- branches/3D/openPLM
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/3D/openPLM/document3D/Mesh.py
r644 r703 59 59 name = new_stp_jss.js.storage.get_available_name(fileName+".js") 60 60 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)): 62 62 print "Error generating fichier .JS for shape : " ,shape.nom 63 63 return False … … 66 66 new_stp_jss.js = name 67 67 new_stp_jss.index = i 68 #new_stp_jss.count=shape.count 68 69 new_stp_jss.save() 69 70 … … 80 81 By default, this argument is set to 1 : the default precision of the mesher is used. 81 82 ''' 82 quality_factor= 183 quality_factor=0.3 83 84 a_mesh = QuickTriangleMesh(DISPLAY_LIST=True) 84 85 a_mesh.set_shape(shape) … … 89 90 90 91 91 def mesh_to_3js(mesh,filename,name ):92 def mesh_to_3js(mesh,filename,name,shape_nom): 92 93 """ Take a mesh, exports to a three.js javascript file""" 93 94 … … 101 102 102 103 output = open(filename,"w") 104 output.write("//Computation for : %s"%shape_nom) 103 105 output.write(""" 104 106 var %s = function () { -
branches/3D/openPLM/document3D/STP_converter_WebGL.py
r668 r703 20 20 import os, os.path 21 21 from openPLM.document3D.models import * 22 from openPLM.plmapp.controllers.part import PartController 23 from django.db.models import Q 24 22 25 from OCC.TDataStd import * 23 26 from OCC.STEPCAFControl import * … … 33 36 from OCC.XSControl import * 34 37 from OCC.STEPControl import * 35 38 from OCC.TopLoc import TopLoc_Location 36 39 37 40 … … 66 69 return self._color_tool 67 70 68 def read_file(self,doc_file ):71 def read_file(self,doc_file,user_to_load_part_reference=False): 69 72 STEPReader = STEPCAFControl_Reader() 70 73 … … 114 117 115 118 #We are going to refill the tree with information 119 120 116 121 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 119 128 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 137 def 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 178 def 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 190 def generate_arbre_shape(label,shape_tool,arbre_shape,color_tool,shapes_simples,doc_id): 122 191 123 192 #buscamos los vecinos con el mismo ref … … 128 197 129 198 label_reference=TDF_Label() 130 shape_tool.GetReferredShape(label,label_reference) 131 132 199 shape_tool.GetReferredShape(label,label_reference) 200 133 201 for i in range(len(arbre_shape)): 134 202 if shape_tool.GetShape(arbre_shape[i].label_reference).IsPartner(shape_tool.GetShape(label_reference)): … … 141 209 142 210 else: 143 arbre_shape.append(node_shape(label,GetLabelNom(label),shape_tool.GetLocation(label),label_reference,GetLabelNom(label_reference),shape_tool.IsTopLevel(label)))144 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 145 215 146 216 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)) 149 220 150 221 if not reference_found: 151 222 152 223 if shape_tool.IsAssembly(label_to_expand): 224 153 225 l_c = TDF_LabelSequence() 154 226 shape_tool.GetComponents(label_to_expand,l_c) 155 227 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) 157 229 else: 158 230 … … 161 233 for s in range(len(shapes_simples)): 162 234 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)) 166 236 break 167 237 168 238 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 174 240 175 241 -
branches/3D/openPLM/document3D/aficher.py
r668 r703 19 19 20 20 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): 23 22 print "\n\n\nMAl, el fichero leido no es valido\n\n\n" 24 23 return False 25 24 26 25 # if truncate names, reecrire fichier step? escribir uno nuevo encima y volver a leerlo 27 26 28 27 procesing_simples_shapes(my_step_importer.get_shapes_simples(),doc_file) 29 28 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) 34 30 35 31 36 32 37 33 38 #decomposer(doc_file,controller ,part_numeration,objects_numeration)34 #decomposer(doc_file,controller) 39 35 40 36 -
branches/3D/openPLM/document3D/arborescense.py
r661 r703 14 14 15 15 16 17 16 graph=kjGraph() 18 17 root=[] 19 18 part_numeration=[0] 20 objects_numeration=[0]21 19 menu_generate_objects=["var object3D = new THREE.Object3D();\n"] 22 20 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 26 26 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 29 29 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 33 def 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 35 38 if isinstance(my_shapes_arbre,node_shape): 36 39 for index in range(my_shapes_arbre.quantity): … … 40 43 if not my_shapes_arbre.IsRoot(): 41 44 nom=my_shapes_arbre.names[index] 42 nom=nom+"."+str(part_numeration[0]) 45 nom=nom+"."+str(part_numeration[0])+"."+part_id 43 46 graph.add(old_name,nom) 44 47 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 46 49 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) 48 51 part_numeration[0]=part_numeration[0]+1 49 52 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 51 55 52 56 … … 54 58 else: #is instance of feuille_nom_shapes 55 59 #var mesh = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { color: 0xffffff } ) ); 56 numeration= objects_numeration[0]60 numeration=part_numeration[0] 57 61 red=my_shapes_arbre.red 58 62 green=my_shapes_arbre.green … … 74 78 t=transformation.TranslationPart() 75 79 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 84 89 85 90 return True … … 87 92 88 93 89 94 function_generate_objects= """ 95 96 var NewMaterial=new THREE.MeshBasicMaterial({opacity:1,shading:THREE.SmoothShading}); 97 NewMaterial.color.setRGB(%(red)f,%(green)f,%(blue)f); 98 var object%(numeration)s_%(part_id)s=new THREE.Mesh( new _%(reference)s_%(part_id)s(),NewMaterial ); 99 object3D.add(object%(numeration)s_%(part_id)s); 100 """ 90 101 91 102 92 103 def generate_file(doc_file,graph,root,menu_generate_objects): 93 104 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 94 115 fileName, fileExtension = os.path.splitext(doc_file.filename) 95 116 new_stp_to_jss_arborescense= stp_to_jss_arborescense() … … 111 132 ######Generate Menu javascript and objects################################################################################## 112 133 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) 114 135 output.write("\";\ndocument.getElementById('menu_').appendChild(element);\n}\n") 115 136 ######End generate menu##################################################################################################### … … 122 143 123 144 ##### Generate functions javascript 124 generate_functions(graph, root,output,doc_file.id)145 generate_functions(graph,output,root) 125 146 ##### End generate functions 126 147 … … 134 155 return False 135 156 157 return new_stp_to_jss_arborescense.js.name 158 136 159 137 160 … … 143 166 144 167 function_change_part_head = """ 145 function change_part%(part_ id)s_%(doc_id)s(atribute) {168 function change_part%(part_numeration)s_%(part_id)s(atribute) { 146 169 if (atribute==\"click\"){ 147 170 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; 149 172 150 173 } 151 174 else{ 152 part%(part_ id)s_%(doc_id)s.visible=atribute;175 part%(part_numeration)s_%(part_id)s.visible=atribute; 153 176 } 154 177 155 178 """ 156 179 function_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) 158 181 """ 159 182 function_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; 161 184 """ 162 185 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 186 def generate_functions(graph,output,root): 187 188 189 169 190 for i in range(len(root)): 170 191 171 192 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 241 def generate_menu(graph,output,root): 242 243 244 245 output.write("<ul>") 246 247 for i in range(len(root)): 248 172 249 feuille=graph.neighbors(root[i]) 173 250 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) 175 253 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\\\")" 219 258 output.write("<li > <a href='#' onClick='%s'><b onClick='%s'></b>%s </a>"%(functio_onclick,functio_onclick,part_name)) 220 259 221 generate_menu(graph, '',output,doc_id,root[i])260 generate_menu(graph,output,graph.neighbors(root[i])) 222 261 output.write("</li>") 223 262 … … 226 265 227 266 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 235 268 #el grafo para las partes tiene el nombre .id correlativa, para las hojas es directamente un ID 236 269 -
branches/3D/openPLM/document3D/composer.py
r668 r703 10 10 11 11 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) 13 13 st=my_step_importer.get_shapes_tool() 14 14 lr= TDF_LabelSequence() -
branches/3D/openPLM/document3D/decomposer.py
r658 r703 6 6 from openPLM.document3D.arborescense import * 7 7 from OCC.TDF import * 8 from django.db.models import Q 8 9 import os, os.path 9 10 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 14 def decomposer_all(doc_file,list_document3d_controller,user): 11 15 12 16 … … 14 18 15 19 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 16 25 17 26 shape_tool=my_step_importer.get_shapes_tool() 18 27 arbre=my_step_importer.get_shapes_arbre() 19 28 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 48 def get_decomposition_possibilities(arbre): 49 50 list=[] 43 51 for t in range(len(arbre)): 44 52 … … 47 55 if isinstance(arbre[t].children[i],node_shape): 48 56 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]) 63 59 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 64 def 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? 80 121 return True 81 122 82 83 def generate_step_decompose(doc_file,labels_roots,controller,arbre): 84 85 fileName, fileExtension = os.path.splitext(doc_file.filename) 123 124 125 def 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 165 def 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 173 def 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 198 def 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 215 def generate_step_decompose(doc_file,labels_roots,controller): 216 217 #fileName, fileExtension = os.path.splitext(doc_file.filename) 218 219 86 220 WS = XSControl_WorkSession() 87 221 writer = STEPCAFControl_Writer( WS.GetHandle(), False ) 88 222 for i in range(labels_roots.Length()): 223 89 224 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 2 2 from openPLM.document3D.models import * 3 3 from django.db.models import Q 4 from django.db import models 5 from openPLM.plmapp.models import get_all_plmparts_with_level 6 from openPLM.plmapp.forms import group_types 7 from django.forms.formsets import formset_factory 8 9 10 11 12 class 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 24 class 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 38 class Order_Quantity_Form(forms.Form): 39 40 order = forms.FloatField() 41 quantity = forms.FloatField() 42 43 44 class 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 4 53 5 54 class Form3D(forms.ModelForm): … … 23 72 24 73 #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")) 26 75 #a= stp_to_jss.objects.filter(stp__in=queryset) 27 76 #a =document3D.files.filter(filename__endswith=".stp") … … 36 85 37 86 38 87 88 89 90 -
branches/3D/openPLM/document3D/models.py
r668 r703 5 5 from OCC.TopLoc import TopLoc_Location 6 6 from django.db.models import get_model 7 from openPLM.plmapp.filehandlers import HandlersManager 8 from OCC.gp import * 9 #openPLM.plmapp.models.register_PCLE 7 10 # Create your models here. 8 11 … … 10 13 11 14 #eliminar navegabilidad 15 #delete del model elimina el stp de docs/stp/ ?? 16 class 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 52 admin.site.register(Location_link) 53 register_PCLE(Location_link) 54 55 56 def 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 87 def get_all_plmDocument3Dtypes_with_level(): 88 lst = [] 89 level=">>" 90 get_all_subclasses_with_level(Document3D, lst , level) 91 return lst 92 12 93 13 94 class Document3D(Document): … … 57 138 stp = models.ForeignKey(DocumentFile) 58 139 index = models.IntegerField() 59 count = models.IntegerField(default= 0)140 count = models.IntegerField(default=1) # no se utiliza, se puede quitar 60 141 61 142 #sirve para algo el index? … … 73 154 74 155 """ 75 def __init__(self, nom,shape): 156 __slots__ = ("nom", "shape", "count") 157 158 def __init__(self, nom,shape,count=0): 76 159 self.nom = nom 77 160 self.shape = shape 161 self.count=count 162 163 78 164 79 165 … … 97 183 98 184 """ 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): 103 189 self.labels = [label] 104 190 self.names = [name] … … 108 194 self.quantity=1 109 195 self.name_component=name_component 110 self.path=path 196 self.doc_id=doc_id #cambiar por stp id 197 self.reference=reference 111 198 self.root=root 112 199 … … 120 207 121 208 def IsReference(self): 122 return self. path209 return self.reference 123 210 124 211 def IsRoot(self): … … 156 243 """ 157 244 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): 161 248 self.nom = nom 162 249 self.reference=ref 250 self.doc_id=doc_id 163 251 if colour: 164 252 self.red=colour.Red() … … 171 259 @task 172 260 def handle_step_file(doc_file_pk,object_id,user_id): 261 173 262 import logging 174 263 logging.getLogger("GarbageCollector").setLevel(logging.ERROR) … … 178 267 object=Document3D.objects.get(id=object_id) 179 268 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 184 283 query_jss=stp_to_jss.objects.filter(stp=doc_file) 185 284 files_js=list(query_jss.values_list("js", flat=True)) 186 285 query_jss=stp_to_jss_arborescense.objects.filter(stp=doc_file) 187 286 arborescense_js=list(query_jss.values_list("js", flat=True)) 188 # neccesary in case of check-in287 #effacer touts les fichiers generes 189 288 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 203 292 204 293 … … 212 301 213 302 214 303 #comprobar aue se elminan bien los ficheros de docs/stp 215 304 class Document3DController(DocumentController): 216 305 217 306 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) 220 312 221 313 def delete_file(self, doc_file): … … 227 319 files_js=list(query_jss.values_list("js", flat=True)) 228 320 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 231 331 super(Document3DController, self).delete_file(doc_file) 232 332 #il faut apeller super avant pour verifier droits de utilisateur … … 234 334 if fileExtension.upper() in ('.STP', '.STEP'): 235 335 eliminer_associes(files_js,arborescense_js) 236 237 336 337 338 339 def 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() 238 351 #elimine les fichiers .jss associes a un fichier step 352 class 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 239 369 240 370 def eliminer_associes(files_js,arborescense_js): … … 244 374 filename = settings.MEDIA_ROOT+"3D/"+ name 245 375 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 248 382 249 383 for name in arborescense_js: … … 253 387 print "Deleting arborescence .jss associe:" , filename 254 388 255 389 class 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 57 57 58 58 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 60 66 61 67 -
branches/3D/openPLM/document3D/urls.py
r592 r703 4 4 urlpatterns = patterns('', 5 5 (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), 6 9 ) 10 -
branches/3D/openPLM/document3D/views.py
r664 r703 1 1 from openPLM.plmapp.base_views import handle_errors , get_generic_data 2 from openPLM.document3D.forms import Form3D2 from openPLM.document3D.forms import * 3 3 from django.shortcuts import render_to_response 4 4 from django.template import RequestContext 5 5 from 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 """ 6 from openPLM.document3D.arborescense import generate_file_arborescense 7 from openPLM.document3D.decomposer import * 8 from openPLM.plmapp.forms import * 9 import openPLM.plmapp.models as models 10 from django.db import transaction 11 from django.forms.formsets import formset_factory 12 from django.forms.models import modelform_factory 13 from django.http import HttpResponse ,HttpResponseRedirect 14 from django.core.files import File 15 from 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 15 20 def r2r(template, dictionary, request): 16 21 """ … … 23 28 context_instance=RequestContext(request)) 24 29 25 #@handle_errors 30 26 31 27 32 def display_3d(request, obj_ref, obj_revi): … … 46 51 if form.is_valid(): 47 52 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 50 57 if multi_image.count()>0: 51 58 #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) 53 60 if menu_arborescense.count()>0: 54 61 menu_arborescense=menu_arborescense[0].js.name 55 62 else: 56 menu_arborescense="" 63 menu_arborescense="" 64 57 65 else: 58 66 #menu_arborescense=stp_to_jss_arborescense.objects.filter(stp=image)[0].js.name 59 67 menu_arborescense="" 68 60 69 61 70 ctx.update({'select_stp_form': form, 'multi_image3D' : multi_image ,'menu_arborescense' : menu_arborescense, }) … … 89 98 90 99 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 ########################################################################################## 100 def 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 182 def 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 288 def 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 297 def 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 347 def 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 394 def 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 283 283 } 284 284 $("#FilterButton").button().click(function () { 285 $("#Navigate").showLoading();286 285 $.post(uri, 287 286 $("#FilterNav").find("form").serialize(), 288 287 function (data) { 289 288 update_nav(null, data); 290 $("#Navigate").hideLoading();291 289 }); 292 290 } ); -
branches/3D/openPLM/plmapp/controllers/part.py
r674 r703 132 132 self._save_histo(link.ACTION_NAME, 133 133 "parent : %s\nchild : %s" % (self.object, child)) 134 return link 134 135 135 136 def delete_child(self, child): … … 214 215 ext = PCLE(link=link2, **extension_data[name]) 215 216 ext.save() 217 return link2 216 218 217 219 def get_children(self, max_level=1, current_level=1, date=None): -
branches/3D/openPLM/plmapp/forms.py
r674 r703 119 119 if issubclass(cls, m.PLMObject): 120 120 data = { 121 'reference' : get_new_reference(cls ),121 'reference' : get_new_reference(cls, start), 122 122 'revision' : 'a', 123 123 'lifecycle' : str(m.get_default_lifecycle().pk), … … 127 127 return data 128 128 129 def get_creation_form(user, cls=m.PLMObject, data=None, start=0 ):129 def get_creation_form(user, cls=m.PLMObject, data=None, start=0, **kwargs): 130 130 u""" 131 131 Returns a creation form suitable to creates an object … … 161 161 get_creation_form.cache[cls] = Form 162 162 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) 166 166 if issubclass(cls, m.PLMObject): 167 167 # display only valid groups … … 208 208 return res 209 209 210 210 211 class TypeForm(forms.Form): 211 212 LIST = group_types(m.get_all_users_and_plmobjects_with_level()) 212 213 type = forms.TypedChoiceField(choices=LIST) 214 215 216 217 213 218 214 219 class TypeFormWithoutUser(forms.Form): … … 388 393 parent = form.instance.parent.get_leaf_object() 389 394 for PCLE in m.get_PCLEs(parent): 395 if not PCLE.one_per_link(): 396 continue 390 397 try: 391 398 ext = PCLE.objects.get(link=form.instance) -
branches/3D/openPLM/plmapp/models.py
r674 r703 1357 1357 return u"PLMObjectUserLink<%s, %s, %s>" % (self.plmobject, self.user, self.role) 1358 1358 1359 1360 1359 def _get_all_subclasses_with_level(base, lst, level): 1361 1360 level = "=" + level … … 1364 1363 for part in base.__subclasses__(): 1365 1364 _get_all_subclasses_with_level(part, lst, level) 1365 1366 get_all_subclasses_with_level = _get_all_subclasses_with_level 1366 1367 1367 1368 @memoize_noarg … … 1378 1379 lst.append(("Group", "Group")) 1379 1380 return lst 1381 1382 1383 @memoize_noarg 1384 def get_all_plmparts_with_level(): 1385 lst = [] 1386 level=">>" 1387 _get_all_subclasses_with_level(Part, lst , level) 1388 return lst 1380 1389 1381 1390 @memoize_noarg … … 1385 1394 _get_all_subclasses_with_level(User, list_of_choices, level) 1386 1395 return list_of_choices 1396 1397 1387 1398 1388 1399 -
branches/3D/openPLM/templates/BaseDisplayHomePage.htm
r662 r703 71 71 <li class="{{"Button"|button:"corner-right,state-active,state-focus"}}" id="StudyButtonOn"> 72 72 {% endif %} 73 <a href=" ../attributes/">73 <a href="{{obj.plmobject_url}}attributes/"> 74 74 <span class="ui-button-text">{% trans "STUDY" %}</span> 75 75 </a>
Note: See TracChangeset
for help on using the changeset viewer.