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

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

Decomposition multi-level for document3D

Line 
1from OCC.gp import gp_Trsf
2from OCC.GarbageCollector import garbage
3import hashlib
4import string
5import random
6import os
7import django.utils.simplejson as json
8import sys
9
10def new_collect_object(self, obj_deleted):
11        self._kill_pointed()
12
13garbage.collect_object=new_collect_object
14
15
16def get_available_name(location, name):
17
18   
19    def rand():
20        r = ""
21        for i in xrange(7):
22            r += random.choice(string.ascii_lowercase + string.digits)
23        return r
24    basename = os.path.basename(name)
25    base, ext = os.path.splitext(basename)
26    ext2 = ext.lstrip(".").lower() or "no_ext"
27    md5 = hashlib.md5()
28    md5.update(basename)
29    md5_value = md5.hexdigest() + "-%s" + ext
30    path = os.path.join(ext2, md5_value % rand())
31    while os.path.exists(os.path.join(location, path)):
32        path = os.path.join(ext2, md5_value % rand())
33    return path   
34
35class Product(object):
36
37    __slots__ = ("label_reference","name","doc_id","links","geometry","deep","doc_path","visited","part_to_decompose")
38   
39   
40    def __init__(self,name,deep,label_reference,doc_id,doc_path=None,geometry=None):
41        #no tiene location
42        self.links = []
43        self.label_reference=label_reference
44        self.name=name
45        self.doc_id=doc_id
46        self.doc_path=doc_path # indica tmb si el elemento ya ha sido descompuesto
47        self.part_to_decompose=False
48        self.geometry=geometry
49        self.deep=deep
50        self.visited=False
51    def set_geometry(self,geometry):
52        self.geometry=geometry
53   
54       
55    @property       
56    def is_decomposed(self):
57        for link in self.links:
58            if not link.product.doc_id == self.doc_id:
59                return True
60        return False
61    @property 
62    def is_assembly(self):
63        if self.links:
64            return self.name
65        return False
66class Link(object):
67
68    __slots__ = ("names","locations","product","quantity","visited")
69   
70   
71    def __init__(self,product):
72 
73        self.names=[]           
74        self.locations=[]
75        self.product=product
76        self.quantity=0
77        self.visited=False#used only in multi-level decomposition
78
79
80    def add_occurrence(self,name,Matrix_rotation):
81        if name==u' ' or name==u'':
82            self.names.append(self.product.name)   
83        else:
84            self.names.append(name)
85        self.locations.append(Matrix_rotation)
86        self.quantity=self.quantity+1
87
88       
89class Matrix_rotation(object):
90
91    __slots__ = ("x1","x2","x3","x4","y1","y2","y3","y4","z1","z2","z3","z4")
92   
93   
94    def __init__(self,list_coord):
95   
96        if list_coord:
97            self.x1=list_coord[0]           
98            self.x2=list_coord[1]
99            self.x3=list_coord[2]
100            self.x4=list_coord[3]
101            self.y1=list_coord[4]         
102            self.y2=list_coord[5]
103            self.y3=list_coord[6]
104            self.y4=list_coord[7]
105            self.z1=list_coord[8]         
106            self.z2=list_coord[9]
107            self.z3=list_coord[10]
108            self.z4=list_coord[11]   
109
110   
111    def Transformation(self):
112        transformation=gp_Trsf()
113        transformation.SetValues(self.x1,self.x2,self.x3,self.x4,self.y1,self.y2,self.y3,self.y4,self.z1,self.z2,self.z3,self.z4,1,1)
114        return transformation     
115         
116    def to_array(self):   
117        return [self.x1,self.x2,self.x3,self.x4,self.y1,self.y2,self.y3,self.y4,self.z1,self.z2,self.z3,self.z4]
118       
119
120
121
122def generateArbre(arbre,product=False,product_root=False,deep=0,from_child_ArbreFile=False):   
123    label_reference=False
124
125
126         
127    if not product_root:
128        product=generate_product(arbre,deep)
129        product_root=product
130    elif from_child_ArbreFile:
131        product=generate_product(arbre,deep)
132        product_assembly=search_assembly(product.name,label_reference,product.doc_id,product_root,product.geometry)
133        if product_assembly:
134            from_child_ArbreFile.links.append(Link(product_assembly))
135            return False
136        else:
137            from_child_ArbreFile.links.append(Link(product))
138         
139                   
140    for i in range(len(arbre)-1):
141       
142        product_child=generate_product(arbre[i+1][1],deep+1)
143        product_assembly=search_assembly(product_child.name,label_reference,product_child.doc_id,product_root,product_child.geometry)
144
145           
146        if product_assembly:
147            product_child=product_assembly
148                                   
149        generate_link(arbre[i+1],product,product_child)
150               
151        if not product_assembly:
152            generateArbre(arbre[i+1][1],product_child,product_root,deep+1) 
153           
154           
155    return product
156
157
158       
159def generate_link(arbre,product,product_child):
160    product.links.append(Link(product_child))
161    for i in range(len(arbre[0])):
162        product.links[-1].add_occurrence(arbre[0][i][0],Matrix_rotation(arbre[0][i][1]))
163       
164                 
165def generate_product(arbre,deep):
166    label_reference=False
167    return Product(arbre[0][0],deep,label_reference,arbre[0][1],arbre[0][3],arbre[0][2])   
168
169
170
171
172def search_assembly(name,label,id,product_root,geometry=False): # 2 modos , con geometrias y sin geometrias, si hay labels o si no las hay
173
174 
175    if product_root:
176        for link in product_root.links:
177
178               
179            if name and link.product.name==name:
180                           
181                if label:
182
183                    if link.product.label_reference==label:
184                        print "Encontrado : " , link.product.name
185                        return link.product
186                   
187                elif id==link.product.doc_id and geometry==link.product.geometry:
188                    print "Encontrado : " , link.product.name
189                    return link.product                                       
190
191                #else:
192                    #pass
193                    #raise "FATAL ERROR , 2 assembly diferente shape , FATAL FATALTALTALTALTATLA"
194               
195            else:
196 
197                product=search_assembly(name,label,id,link.product,geometry)
198                if product:
199                    return product
200
201   
202def getMatrixFromLocation(Location):
203
204
205    m=Location.VectorialPart()
206    gp=m.Row(1)
207    x1=gp.X()           
208    x2=gp.Y()
209    x3=gp.Z()
210    x4=Location.Transforms()[0]
211    gp=m.Row(2)
212    y1=gp.X()         
213    y2=gp.Y()
214    y3=gp.Z()
215    y4=Location.Transforms()[1]
216    gp=m.Row(3)
217    z1=gp.X()         
218    z2=gp.Y()
219    z3=gp.Z()
220    z4=Location.Transforms()[2]   
221    return [x1,x2,x3,x4,y1,y2,y3,y4,z1,z2,z3,z4]     
222   
223           
224def data_for_product(product):
225    output=[]
226
227    output.append([product.name,product.doc_id,product.geometry,product.doc_path]) 
228   
229    for link in product.links:
230        output.append(data_for_link(link))   
231    return output           
232
233               
234def data_for_link(link):
235
236   
237    output=[]   
238    name_loc=[]
239    for i in range(link.quantity):             
240        name_loc.append([link.names[i],link.locations[i].to_array()])
241               
242    output.append(name_loc)       
243    output.append(data_for_product(link.product))
244       
245    return output
246 
Note: See TracBrowser for help on using the repository browser.