source: main/trunk/openPLM/document3D/arborescense.py @ 1005

Revision 1005, 8.7 KB checked in by agalech, 11 years ago (diff)

Decomposition multi-level for document3D

Line 
1import os, os.path
2from OCC.gp import *
3from openPLM.plmapp.controllers.part import PartController
4from classes import *
5import classes as classes
6from openPLM.plmapp.models import *
7from openPLM.plmapp.models import DocumentFile
8import django.utils.simplejson as json
9   
10def generate_javascript_for_3D(product):
11
12    if product:
13        numeration=[0]
14        javascript=['var object3D = new THREE.Object3D();\n']       
15
16
17       
18        javascript_menu=['function menu() {\nelement = document.createElement("div");\nelement.id="root";\nelement.innerHTML ="']
19
20
21       
22        javascript[0]+='var part%s=new THREE.Object3D();\n'%numeration[0]
23        javascript_menu[0]+=function_generate_menu(numeration[0],product.name)         
24
25        ok=generate_javascript(product,numeration,javascript,[],javascript_menu,numeration[0])
26       
27        javascript_menu[0]+='</li></ul>'
28        javascript_menu[0]+='";\ndocument.getElementById("menu_").appendChild(element);\n}\n'
29
30        return javascript_menu[0]+javascript[0]
31    else:
32        return False
33   
34       
35def generate_javascript(product,numeration,javascript,loc,javascript_menu,old_numeration):
36   
37   
38    numeration[0]+=1     
39
40    javascript_menu[0]+="<ul>"
41       
42    if product.geometry==None:
43        parts_generated=[]
44             
45        for link in product.links:
46       
47           
48           
49            for i in range(link.quantity):
50
51                loc2=loc[:]
52                loc2.append(link.locations[i])
53                parts_generated.append(numeration[0])
54                                 
55                javascript_menu[0]+=function_generate_menu(numeration[0],link.names[i])               
56                     
57                generate_javascript(link.product,numeration,javascript,loc2,javascript_menu,numeration[0])
58       
59                javascript_menu[0]+="</li>"
60           
61               
62        javascript[0]+=generate_functions_visibilty_parts(old_numeration,parts_generated)
63   
64    else:       
65 
66        javascript[0]+=generate_functions_visibilty_object(old_numeration,numeration[0],product,loc)
67             
68
69    javascript_menu[0]+="</ul>"       
70       
71                           
72           
73
74
75
76def generate_functions_visibilty_parts(numeration,parts_generated):
77
78
79    parts_definition=""
80    function=str(function_head % (locals()))
81    for part_numeration_child in parts_generated:
82        parts_definition+="var part%s=new THREE.Object3D();\n"%part_numeration_child
83        function+=str(function_change_part % (locals()))
84    function+="}\n"
85    return parts_definition+function       
86
87
88
89 
90def generate_functions_visibilty_object(numeration,object_numeration,product,loc):
91
92
93           
94    reference=product.geometry
95    part_id=str(product.doc_id)       
96                                           
97    function=str(function_head % (locals()))+str(function_change_object % (locals()))+"}\n"
98 
99    return generate_object(loc,object_numeration,reference,part_id)+function     
100
101
102
103
104def generate_object(loc,numeration,reference,part_id):
105
106   
107
108
109    locate="var object%s=new THREE.Mesh(_%s_%s,material_for_%s_%s );\n"%(numeration,reference,part_id,reference,part_id)
110    locate+="object%s.matrixAutoUpdate = false;\n"%numeration
111    if len(loc)>0:
112        transformation=gp_Trsf()
113        gp=gp_XYZ()
114        for g in range(len(loc)):
115            if g==0:
116                transformation=loc[g].Transformation()
117            else:
118                transformation.Multiply(loc[g].Transformation())
119               
120        a ,b =transformation.GetRotation(gp)
121        t=transformation.TranslationPart()
122
123
124
125        if a:       
126            locate+="object%s.matrix.setRotationAxis(new THREE.Vector3( %s, %s, %s ), %s);\n"%(numeration,gp.X(),gp.Y(),gp.Z(),b)
127                 
128        locate+="object%s.matrix.setPosition(new THREE.Vector3( %s, %s, %s ));\n"%(numeration,t.X(),t.Y(),t.Z())
129       
130    locate+="object3D.add(object%s);\n"%numeration   
131         
132       
133   
134     
135    return locate
136   
137def read_ArbreFile(doc_file,recursif=None):
138
139    from models import  ArbreFile
140    try:
141        new_ArbreFile=ArbreFile.objects.get(stp=doc_file)
142    except:
143        return False
144
145    #product , visited =generateArbre(json.loads(new_ArbreFile.file.read()))
146    product =generateArbre(json.loads(new_ArbreFile.file.read()))
147    if recursif and product:
148        add_child_ArbreFile(doc_file,product,product_root=product,deep=1)       
149           
150    return product
151   
152
153   
154   
155def add_child_GeometryFiles(doc_file,files_to_add):
156#ahora puede tener 2 veces el mismo recorrido
157    from models import  GeometryFile
158    stp_related ,list_loc=get_step_related(doc_file)
159    for stp in stp_related:
160        files_to_add+=list(GeometryFile.objects.filter(stp=stp))
161        add_child_GeometryFiles(stp,files_to_add)
162                       
163                           
164                           
165def add_child_ArbreFile(doc_file,product,product_root,deep):
166
167    from models import  ArbreFile
168    stp_related,list_loc=get_step_related(doc_file)
169
170    for i,stp in enumerate(stp_related):   
171        #try:
172       
173        new_ArbreFile=ArbreFile.objects.get(stp=stp)
174        #new_product, visited =generateArbre(json.loads(new_ArbreFile.file.read()),product=False,product_root=product_root,deep=deep,from_child_ArbreFile=product)
175        new_product=generateArbre(json.loads(new_ArbreFile.file.read()),product=False,product_root=product_root,deep=deep,from_child_ArbreFile=product)                                                                                     
176        for location in list_loc[i]:
177            product.links[-1].add_occurrence(location.name,Matrix_rotation(location.to_array()))
178           
179        if new_product:
180            add_child_ArbreFile(stp,new_product,product_root,deep+1)                       
181        #except:
182
183            #pass
184
185                             
186
187def get_step_related(doc_file,locations=None):
188    from models import Document3D ,Location_link , is_stp
189    stp_related=[]
190    list_loc=[]
191    Doc3D=Document3D.objects.get(id=doc_file.document.id)
192    part=Doc3D.PartDecompose
193   
194    if part:
195        list_link=ParentChildLink.objects.filter(parent=part, end_time=None)
196        for i in range(len(list_link)):
197            locations=list(Location_link.objects.filter(link=list_link[i]))
198            if locations:
199                part_child=list_link[i].child
200                part_controller=PartController(part_child,None)
201                list_doc=part_controller.get_attached_documents()
202               
203                for Doc_Part_Link in list_doc:
204                    if Doc_Part_Link.document.type=="Document3D":
205                        STP_file=Doc_Part_Link.document.files.filter(is_stp)
206                        if STP_file.exists():
207                            stp_related.append(STP_file[0])
208                            list_loc.append(locations)
209                        else:
210                            pass
211                            #raise Document3D_link_Error
212                           
213                        break
214
215    return stp_related , list_loc
216                           
217                                                       
218
219   
220   
221
222       
223def generate_ArbreFile(product,doc_file):
224
225
226    from models import  ArbreFile
227    #delete_ArbreFile(doc_file)
228   
229   
230    data=data_for_product(product)
231
232    fileName, fileExtension = os.path.splitext(doc_file.filename)
233    new_ArbreFile= ArbreFile(decomposable=bool(product.links))
234    new_ArbreFile.stp = doc_file
235    name = new_ArbreFile.file.storage.get_available_name(fileName+".arb")
236    path = os.path.join(new_ArbreFile.file.storage.location, name)
237    new_ArbreFile.file = name
238    new_ArbreFile.save()
239    directory = os.path.dirname(path.encode())       
240    if not os.path.exists(directory):
241        os.makedirs(directory)
242    output = open(path.encode(),"w")
243    output.write(json.dumps(data))       
244    output.close()
245    return new_ArbreFile.file.path         
246   
247   
248   
249               
250 
251   
252   
253
254     
255def function_generate_menu(numeration,name):
256
257    onclick="change_part"+str(numeration)+"(\\\"click\\\")"
258    return "<li > <a href='#' onClick='%s'><b onClick='%s'></b>%s </a>"%(onclick,onclick,name)
259   
260   
261         
262function_head = """
263function change_part%(numeration)s(atribute) {
264    if (atribute==\"click\"){
265   
266        part%(numeration)s.visible=!part%(numeration)s.visible;
267       
268    }
269    else{
270        part%(numeration)s.visible=atribute;
271    }       
272"""
273
274
275function_change_part = """
276    change_part%(part_numeration_child)s(part%(numeration)s.visible)       
277"""
278function_change_object = """
279    object%(object_numeration)s.visible=part%(numeration)s.visible;   
280"""                                   
281   
282
283
284
285
286#var NewMaterial=new THREE.MeshFaceMaterial({opacity:0.5,shading:THREE.SmoothShading});
287 
288   
289   
290   
291   
Note: See TracBrowser for help on using the repository browser.