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

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

New algorithm of decomposition

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