source: main/branches/3D/openPLM/document3D/aficher.py @ 597

Revision 597, 9.9 KB checked in by agalech, 9 years ago (diff)

branch 3D: 3D view: make it possible to show/hide each shape of a stp file

Line 
1
2from openPLM.document3D.STP_converter_JSS import *
3from openPLM.document3D.models import *
4from OCC.MSH.Mesh import QuickTriangleMesh
5from kjbuckets import kjGraph
6# si sale mal de mes3js borrar el new_stp_js para que no se muestre   
7
8
9
10       
11def convertir_STP_to_JSS(doc_file):
12
13
14   
15
16    my_step_importer = NEW_STEP_Import(doc_file.file.path.encode())   #simple
17   
18   
19    if not my_step_importer.read_file():
20        return False
21
22   
23    my_shape = my_step_importer.get_shapes_avec_nom()
24   
25
26
27    ###     Remplir my_shape avec information sur vertex, faces et graph avec l' arbre de nom de parts, root avec nom de parts roots.
28    graph=kjGraph()
29    fileName, fileExtension = os.path.splitext(doc_file.filename)
30    root=[]
31    part_numeration=[]
32    part_numeration.append(0)
33    ok=parcours_recursif(my_shape,fileName,doc_file,graph,part_numeration,root)
34    ###
35
36   
37
38    new_stp_to_jss_navigabilite= stp_to_jss_navigabilite()
39    new_stp_to_jss_navigabilite.stp = doc_file
40    name = new_stp_to_jss_navigabilite.js.storage.get_available_name(fileName+".js")
41    path = os.path.join(new_stp_to_jss_navigabilite.js.storage.location, name)
42    new_stp_to_jss_navigabilite.js = name
43    new_stp_to_jss_navigabilite.save()
44   
45    if ok:
46        try:
47            directory = os.path.dirname(path.encode())       
48            if not os.path.exists(directory):
49                os.makedirs(directory)
50               
51             
52            output = open(path.encode(),"w")
53           
54           
55            ######          Generate Menu javascript       
56            output.write("function menu() {\nelement = document.createElement(\"div\");\nelement.id=\"root\";\nelement.innerHTML =\"")       
57            generate_menu(graph,root,output) 
58            output.write("\";\ndocument.getElementById('menu_').appendChild(element);\n}\n")
59            ######          End generate menu
60           
61           
62            #####           Generate objects javascript
63            generate_objects(graph,root,output)
64            #####           End generate objects
65           
66                   
67            #####           Generate functions javascript
68            generate_functions(graph,root,output)
69            #####           End generate functions
70           
71           
72
73                   
74            output.close()
75           
76        except IOError as (errno, strerror):
77            print "I/O error({0}): {1}".format(errno, strerror)
78            return False
79    return ok
80
81   
82   
83   
84def generate_objects(graph,root,output,nom=''):
85
86    if not nom=='': #nom = '' only in first interaction
87        root=graph.neighbors(nom)
88
89
90    for i in range(len(root)):
91 
92       
93        feuille=graph.neighbors(root[i])
94        if not len(feuille)==0:
95            part_name, part_id = os.path.splitext(root[i])
96            part_id=part_id.replace(".","")
97            output.write("var part%s=new THREE.Object3D();\n"%part_id)
98            generate_objects(graph,'',output,root[i])
99        else:
100            output.write("var object%s=new THREE.Mesh( new _%s(), new THREE.MeshNormalMaterial({opacity:0.5,shading:THREE.SmoothShading}) );\n"%(root[i],root[i])) 
101           
102def generate_functions(graph,root,output,nom=''):
103
104
105    if not nom=='': #nom = '' only in first interaction
106        root=graph.neighbors(nom)
107
108
109
110    for i in range(len(root)):
111 
112       
113        feuille=graph.neighbors(root[i])
114        if not len(feuille)==0:
115            part_name, part_id = os.path.splitext(root[i])
116            part_id=part_id.replace(".","")
117            output.write("function change_part%s(atribute) { \n"%part_id)
118            output.write("if (atribute==\"click\"){\n")
119            output.write("part%s.visible=!part%s.visible;\n"%(part_id,part_id))
120            output.write("}\n")
121            output.write("else{\n")
122            output.write("part%s.visible=atribute;\n"%part_id)
123            output.write("}\n") 
124            for t in range(len(feuille)):
125                feuille_2=graph.neighbors(feuille[t])
126               
127                if not len(feuille_2)==0:
128                    part_name, part_id_2 = os.path.splitext(feuille[t])
129                    part_id_2=part_id_2.replace(".","")
130                    output.write("change_part%s(part%s.visible);\n"%(part_id_2,part_id))   
131                else: 
132                    output.write("object%s.visible=part%s.visible;\n"%(feuille[t],part_id))
133     
134 
135           
136
137            output.write("}\n")
138            generate_functions(graph,'',output,root[i])
139
140
141
142   
143def generate_menu(graph,root,output,nom=''):
144
145
146
147    output.write("<ul>")   
148   
149    if not nom=='': #nom = '' only in first interaction
150        root=graph.neighbors(nom)
151
152    for i in range(len(root)):
153 
154        feuille=graph.neighbors(root[i])
155        if not len(feuille)==0:
156            part_name, part_extension = os.path.splitext(root[i])
157            part_id=part_extension.replace(".","")
158            functio_onclick="change_part"+part_id+"(\\\"click\\\")"
159            output.write("<li > <a href='#' onClick='%s'><b onClick='%s'></b>%s </a>"%(functio_onclick,functio_onclick,part_name))           
160            generate_menu(graph,'',output,root[i])       
161            output.write("</li>")
162
163   
164    output.write("</ul>")
165
166 
167 
168#el grafo para las partes tiene el nombre .id correlativa, para las hojas es directamente un ID           
169def parcours_recursif(my_shape,fileName,doc_file,graph,part_numeration,root,old_name=''):
170   
171    for i in range(len(my_shape)):
172 
173       
174       
175        if  isinstance(my_shape[i],arbre_nom_shapes):
176            nom=my_shape[i].nom
177            nom=nom+"."+str(part_numeration[0])
178            part_numeration[0]=part_numeration[0]+1
179            if not old_name == '':
180                graph.add(old_name,nom)
181            else:  #nom=root
182                root.append(nom) 
183            parcours_recursif(my_shape[i].children,fileName,doc_file,graph,part_numeration,root,nom)
184           
185           
186
187        else:
188            new_stp_jss= stp_to_jss()
189            new_stp_jss.stp = doc_file
190            new_stp_jss.save()
191            my_mesh = mesh_shape(my_shape[i])
192            name = new_stp_jss.js.storage.get_available_name(fileName+".js")
193            path = os.path.join(new_stp_jss.js.storage.location, name)
194            if(not mesh_to_3js(my_mesh,path.encode(),"_"+str(new_stp_jss.id))):
195                new_stp_jss.delete()
196                return False   
197                #exception
198            else:
199                graph.add(old_name,new_stp_jss.id)
200                new_stp_jss.js = name
201                new_stp_jss.save()
202           
203           
204    return True         
205
206
207   
208def mesh_shape(shape):
209    """ Take a topods_shape instance, returns the tesselated object"""
210    a_mesh = QuickTriangleMesh(DISPLAY_LIST=True)
211    a_mesh.set_shape(shape)
212    # define precision for the mesh
213    a_mesh.set_precision(a_mesh.get_precision()/2.)
214    # then compute the mesh
215    a_mesh.compute()
216    return a_mesh       
217
218    return True
219
220
221
222   
223def mesh_to_3js(mesh,filename,name):
224    """ Take a mesh, exports to a three.js javascript file"""
225
226
227   
228    try:
229        directory = os.path.dirname(filename)
230       
231        if not os.path.exists(directory):
232            os.makedirs(directory)
233
234        output = open(filename,"w")
235        output.write("""
236    var %s = function () {
237
238    var scope = this;
239    THREE.Geometry.call( this );
240        """%name)
241        # export vertices
242        for vertex in mesh.get_vertices():
243
244           output.write('v(%.4f,%.4f,%.4f);\n'%(vertex[0],vertex[1],vertex[2]))
245        # export faces
246        index = 0
247        faces = mesh.get_faces()
248        normals = mesh.get_normals()
249        while index<len(faces)-2:
250            n1 = normals[index]
251            n2 = normals[index+1]
252            n3 = normals[index+2]
253            output.write('f3(%i,%i,%i,%.4f,%.4f,%.4f,%.4f,%.4f,%.4f,%.4f,%.4f,%.4f);\n'%(faces[index],faces[index+1],faces[index+2],n1[0],n1[1],n1[2],n2[0],n2[1],n2[2],n3[0],n3[1],n3[2]))
254           
255            index += 3
256       
257        #closing file
258        #this.sortFacesByMaterial();
259        output.write("""
260   
261    function v( x, y, z ) {
262        scope.vertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z )  ) );
263        }
264    function f3( a, b, c, n1_x,n1_y,n1_z,n2_x,n2_y,n2_z,n3_x,n3_y,n3_z ) {
265        scope.faces.push( new THREE.Face3( a, b, c, [ new THREE.Vector3( n1_x, n1_y, n1_z ), new THREE.Vector3( n2_x, n2_y, n2_z ), new THREE.Vector3( n3_x, n3_y, n3_z ) ]  ) );
266        }
267        }
268
269    %s.prototype = new THREE.Geometry();
270    %s.prototype.constructor = %s;
271        """%(name,name,name))
272        output.close()
273        return True
274    except IOError as (errno, strerror):
275        print "I/O error({0}): {1}".format(errno, strerror)
276        return False
277       
278       
279
280   
281"""
282def parcours_recursif2(my_shape,fileName,doc_file,graph,root,part_numeration,old_name=''):
283   
284    for i in range(len(my_shape)):
285        nom=my_shape[i].nom
286        new_stp_jss= stp_to_jss()
287        new_stp_jss.stp = doc_file
288        new_stp_jss.save()
289        nom=nom+"."+str(part_numeration+i)
290        if not old_name == '':
291            graph.add(old_name,nom)
292        else:  #nom=root
293            root.append(nom)   
294        if  len(my_shape[i].children)==1:
295            my_mesh = mesh_shape(my_shape[i].children[0])
296
297
298            name = new_stp_jss.js.storage.get_available_name(fileName+".js")
299            path = os.path.join(new_stp_jss.js.storage.location, name)
300            if(not mesh_to_3js(my_mesh,path.encode(),"_"+str(new_stp_jss.id))):
301                new_stp_jss.delete()
302
303                return False   
304                #exception
305            else:
306                graph.add(nom,new_stp_jss.id)
307                new_stp_jss.js = name
308                new_stp_jss.save()
309
310        else:
311
312            new_stp_jss.delete()#j avais besoin de generer pour obtenir une id
313            return parcours_recursif2(my_shape[i].children,fileName,doc_file,graph,root,(part_numeration+len(my_shape)),nom)
314           
315    return True
316"""
317   
318
319   
320   
321   
322   
Note: See TracBrowser for help on using the repository browser.