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

Revision 1007, 8.4 KB checked in by agalech, 11 years ago (diff)

New algorithm of decomposition

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