source: inundation/pmesh/test_mesh.py @ 2778

Last change on this file since 2778 was 2778, checked in by steve, 18 years ago

On our 64 bit machine, ran into problem in pmesh/mesh.py where seg[0], seg[1], triangle,
and neighbor where not seen as integers. Had to wrap them in int(..)

File size: 70.7 KB
Line 
1#!/usr/bin/env python
2#
3import tempfile
4import unittest
5
6try:
7    from pmesh.mesh import *
8except ImportError: 
9    from mesh import *
10   
11from mesh import *
12from load_mesh.loadASCII import *
13from coordinate_transforms.geo_reference import Geo_reference
14from utilities.polygon import inside_polygon
15
16class meshTestCase(unittest.TestCase):
17    def setUp(self):
18        pass
19   
20    def tearDown(self):
21        pass
22
23    def testPointDistance(self):
24        a = Point(0.0, 0.0)
25        b = Point(0.0, 10.0)
26       
27        self.failUnless( a.DistanceToPoint(b) == 10.0,
28                        'Point DistanceToPoint is wrong!')
29   
30    def testVertexDistance(self):
31        a = Vertex (0.0, 0.0)
32        b = Vertex (0.0, 10.0)
33       
34        self.failUnless( a.DistanceToPoint(b) == 10.0,
35                        'Point DistanceToPoint is wrong!')
36       
37    def testTriangle(self):
38        a = Vertex (0.0, 0.0)
39        b = Vertex (0.0, 2.0)
40        c = Vertex (2.0,0.0)
41        d = Vertex (0.0, 4.0)
42        e = Vertex (2.0, 2.0)
43        f = Vertex (4.0,0.0)
44       
45        t1 = Triangle(b,a,c)       
46        t2 = Triangle(b,c,e)     
47        t3 = Triangle(e,c,f)     
48        t4 = Triangle(d,b,e)
49        t2.setNeighbors(t3,t4,t1)
50       
51        self.failUnless( t2.neighbors[2].vertices[0] == b, 'Triangle initialisation is wrong!')
52   
53       
54    def testSegment(self):
55        a = Vertex (0.0, 0.0)
56        b = Vertex (0.0, 10.0)
57        s = Segment(a,b, tag = 20)     
58       
59        self.failUnless( s.vertices[0].DistanceToPoint(s.vertices[1]) == 10.0,
60                        'vertices in a segment are wrong')
61       
62        self.failUnless( s.tag == 20.0,
63                        'tag in a segment are wrong')
64
65    def testdeleteUserVertex(self):
66
67       
68        mesh = Mesh()
69        a = mesh.addUserVertex(0.0, 0.0)
70        b = mesh.addUserVertex (0.0, 2.0)
71        c = mesh.addUserVertex (2.0,0.0)
72       
73        s1 = mesh.addUserSegment(a,b)
74        s2 = mesh.addUserSegment(a,c)
75        s3 = mesh.addUserSegment(c,b)
76
77        mesh.deleteMeshObject (a) 
78        self.failUnless(mesh.userSegments[0] == s3,
79                        'Bad segment. ')       
80        self.failUnless(len(mesh.userSegments) ==1,
81                        'Segments not deleted.')
82        self.failUnless(len(mesh.userVertices) == 2,
83                        'Vertex not deleted.')
84       
85 
86    # FIXME add test for minAngle   
87    def testgenerateMesh(self):
88        a = Vertex (0.0, 0.0)
89        d = Vertex (0.0, 4.0)
90        f = Vertex (4.0,0.0)
91
92        s1 = Segment(a,d)
93        s2 = Segment(d,f)
94        s3 = Segment(a,f)
95
96        r1 = Region(0.3, 0.3,tag = 1.3,maxArea = .6)
97        #print r1
98        m = Mesh(userVertices=[a,d,f], userSegments=[s1,s2,s3], regions=[r1] )
99       
100        m.generateMesh("Q", maxArea = 2.1 )         
101
102        #print m
103
104        #m.plotMeshTriangle()
105
106        result = 1.414214
107        delta  = 0.00001
108       
109        self.failUnless((m.meshTriangles[1].vertices[0].x < result + delta) or
110                        (m.meshTriangles[1].vertices[0].x > result - delta),
111                        'generated mesh is wrong!')
112
113    def test_regionalMaxArea(self):
114        v0 = Vertex (0.0, 0.0)
115        v1 = Vertex (6.0, 0.0)
116        v2 = Vertex (6.0,6.0)
117        v3 = Vertex (0.0,6.0)
118
119        s1 = Segment(v0,v1)
120        s2 = Segment(v1,v2)
121        s3 = Segment(v3,v2)
122        s4 = Segment(v3,v0)
123        s5 = Segment(v2,v0)
124
125        r1 = Region(3, 1,tag = 1.3)
126        #print r1
127        m = Mesh(userVertices=[v0,v1,v2,v3], userSegments=[s1,s2,s3,s4,s5], regions=[r1] )
128       
129        m.generateMesh("Q", maxArea = 36 )         
130
131        #m.plotMeshTriangle()
132        #print "len(m.meshTriangles)",len(m.meshTriangles)
133
134        self.failUnless(len(m.meshTriangles) == 2, 
135                        'test_regionalMaxArea 1:generated mesh is wrong!')
136       
137        ## Another test case
138        r1 = Region(3, 1,tag = 1.3)
139        r2 = Region(1, 3,tag = 1.3, maxArea = 8)
140        m = Mesh(userVertices=[v0,v1,v2,v3], userSegments=[s1,s2,s3,s4,s5],
141                 regions=[r1,r2] )
142        m.generateMesh("Q", maxArea = 36 )
143       
144        self.failUnless(len(m.meshTriangles) >= 6,
145                        'testregion_with_maxarea 2: # of tris is wrong!')   
146       
147               
148        ## Another test case
149        r1 = Region(3, 1, tag = 1.3, maxArea = 8)
150        r2 = Region(1, 3, tag = 1.3, maxArea = 8)
151        m = Mesh(userVertices=[v0,v1,v2,v3], userSegments=[s1,s2,s3,s4,s5],
152                 regions=[r1,r2] )
153        m.generateMesh("Q", maxArea = 36 ) 
154        #print "len(m.meshTriangles)",len(m.meshTriangles)
155       
156        self.failUnless(len(m.meshTriangles) >= 8,
157                        'testregion_with_maxarea 3: # of tris is wrong!')
158               
159               
160        ## Another test case
161        r1 = Region(3, 1, tag = 1.3 )
162        r2 = Region(1, 3, tag = 1.3, maxArea = 8)
163        m = Mesh(userVertices=[v0,v1,v2,v3], userSegments=[s1,s2,s3,s4,s5],
164                 regions=[r1,r2] )
165        m.generateMesh("Q", maxArea = 8 ) 
166        self.failUnless(len(m.meshTriangles) >= 8,
167                        'testregion_with_maxarea 4: # of tris is wrong!')   
168
169       
170        ## Another test case
171        r1 = Region(3, 1,tag = 1.3, maxArea = 8)
172        r2 = Region(1, 3,tag = 1.3, maxArea = 8)
173        m = Mesh(userVertices=[v0,v1,v2,v3], userSegments=[s1,s2,s3,s4,s5],
174                 regions=[r1,r2] )
175        m.generateMesh("Q", maxArea = 36,isRegionalMaxAreas = False )     
176        self.failUnless(len(m.meshTriangles) == 2, 
177                        'test_regionalMaxArea 5:generated mesh is wrong!')
178       
179    def testdeleteUserVertex(self):
180        mesh = Mesh()
181        a = mesh.addUserVertex(0.0, 0.0)
182        b = mesh.addUserVertex (0.0, 2.0)
183        c = mesh.addUserVertex (2.0,0.0)
184       
185        s1 = mesh.addUserSegment(a,b)
186        s2 = mesh.addUserSegment(a,c)
187        s3 = mesh.addUserSegment(c,b)
188
189        mesh.deleteMeshObject (s2)
190       
191        #print ",s2 in mesh.userSegments" ,s2 in mesh.userSegments
192        self.failUnless(not(s2 in mesh.userSegments),
193                        'Bad segment. ')       
194        self.failUnless(len(mesh.userSegments) ==2,
195                        'Segments not deleted.')
196        self.failUnless(len(mesh.userVertices) == 3,
197                        'Vertex deleted, instead of segment.')
198
199    def testTriangleArea(self):
200        a = Vertex (10.0, 10.0)
201        b = Vertex (10.0, 20.0)
202        c = Vertex (20.0,10.0)
203       
204        d = Vertex (-20.0, 0.0)
205        e = Vertex (-20.0, -20.0)
206        f = Vertex (20.0,-20.0)
207       
208        t1 = Triangle(b,a,c)     
209        t2 = Triangle(e,d,f)
210       
211#         print "t1", t1
212#         print "t1 area ", t1.calcArea()
213#         print "t2", t2
214#         print "t2 area ", t2.calcArea()
215        self.failUnless( t1.calcArea() == 50 and t2.calcArea() == 400, 'Triangle area is wrong!')
216    def testisUserSegmentNew (self):
217        mesh = Mesh()
218        a = mesh.addUserVertex(0.0, 0.0)
219        b = mesh.addUserVertex (0.0, 2.0)
220        c = mesh.addUserVertex (2.0,0.0)
221        d = mesh.addUserVertex (2.0,3.0)
222       
223        s1 = mesh.addUserSegment(a,b)
224        s2 = mesh.addUserSegment(a,c)
225        s3 = mesh.addUserSegment(c,b)
226
227        self.failUnless(mesh.isUserSegmentNew(a,d) ,
228                        'Segment should be new. ')
229        self.failUnless(not(mesh.isUserSegmentNew(a,b)) ,
230                        'Segment should not be new. ')
231
232
233    def testisUserSegmentNew (self):
234        mesh = Mesh()
235        a = mesh.addUserVertex(0.0, 0.0)
236        b = mesh.addUserVertex (0.0, 2.0)
237        c = mesh.addUserVertex (2.0,0.0)
238        d = mesh.addUserVertex (2.0,3.0)
239       
240        s1 = mesh.addUserSegment(a,b)
241        s2 = mesh.addUserSegment(a,c)
242        s3 = mesh.addUserSegment(c,b)
243
244        self.failUnless(mesh.representedUserSegment(a,d) == None,
245                        'Segment should be new. ')
246        self.failUnless(mesh.representedUserSegment(a,b) == s1 ,
247                        'Segment should not be new. ')
248       
249    def testautoSegment(self):
250        p0 = Vertex (0.0, 0.0)
251        p1 = Vertex (0.0, 4.0)
252        p2 = Vertex (4.0,4.0)
253        p3 = Vertex (4.0,0.0)
254
255        s1 = Segment(p0,p1)
256       
257        m = Mesh(userVertices=[p0, p1, p2, p3], userSegments=[s1] ) 
258        m.autoSegment()
259       
260        #print 'Len', len(m.userSegments)
261        self.failUnless(len(m.getUserSegments()) == 4 ,
262                        'userSegments is wrong!')
263     
264        m.autoSegment()
265        self.failUnless(len(m.getUserSegments()) == 4 ,
266                        'userSegments is wrong!')
267     
268    def testautoSegmentII(self):
269        p1 = Vertex (3.0, 4.0)
270        p2 = Vertex (3.0,2.0)
271        p3 = Vertex (3.0,0.0)
272        p4 = Vertex (6.0, 4.0)
273        p5 = Vertex (6.0,2.0)
274        p0 = Vertex (6.0,0.0)
275
276
277        s1 = Segment(p2,p3)
278        s2 = Segment(p4,p5)
279       
280        m = Mesh(userVertices=[p0, p1, p2, p3, p4, p5],
281                 userSegments=[s1, s2])     
282
283        m.autoSegment()
284       
285        s3 = m.representedAlphaUserSegment(p3,p0)
286        self.failUnless(not (s3 == None) ,
287                        'userSegments is wrong!')
288
289       
290        s6 = m.representedAlphaUserSegment(p1,p4)       
291        self.failUnless(not (s6 == None) ,
292                        'userSegments is wrong!')
293       
294        # remove a segment, add a point, autosegment
295        m.alphaUserSegments.remove(s3)
296        p6 = Vertex (1.0, 2.0)
297        m.userVertices.append(p6)
298       
299        m.autoSegment()
300       
301        s1_now = m.representedUserSegment(p3,p2)
302        self.failUnless(s1_now == s1 ,
303                        'userSegments is wrong!')
304       
305        s2_now = m.representedUserSegment(p5,p4)       
306        self.failUnless(s2_now == s2 ,
307                        'userSegments is wrong!')
308       
309        s3 = m.representedAlphaUserSegment(p3,p6)       
310        self.failUnless(not (s3 == None) ,
311                        'userSegments is wrong!')
312       
313        s4 = m.representedAlphaUserSegment(p3,p6)       
314        self.failUnless(not (s4 == None) ,
315                        'userSegments is wrong!')
316       
317        s5 = m.representedAlphaUserSegment(p4,p6)       
318        self.failUnless(s5 == None ,
319                        'userSegments is wrong!')
320        #print m
321       
322    def testRegions(self):
323        a = Vertex (0.0, 0.0)
324        b = Vertex (0.0, 2.0)
325        c = Vertex (2.0,0.0)
326        d = Vertex (0.0, 4.0)
327        e = Vertex (2.0, 2.0)
328        f = Vertex (4.0,0.0)
329        g = Vertex (0.0,-2.0)
330       
331        Segment.set_default_tag("")
332        s1 = Segment(a,b)
333        s2 = Segment(b,e)
334        s3 = Segment(e,c)
335        s4 = Segment(c,a)
336        s5 = Segment(b,d)
337        s6 = Segment(e,d)
338        s7 = Segment(e,f)
339        s8 = Segment(c,f)
340        s9 = Segment(g,c)
341        s10 = Segment(g,a)
342
343        r1 = Region(0.1,0.1,tag="22")
344        r2 = Region(0.1,2.1,tag="11")
345        r3 = Region(2.1,0.1)
346       
347        m = Mesh(userVertices=[a,b,c,d,e,f,g], userSegments=[s1,s2,s3,s4,s5,s6,s7,s8,s9,s10], regions=[r1,r2,r3] )
348        m.generateMesh("Q", maxArea = 2.1 )
349        #print m
350        Triangulation =  m.getTriangulation()
351        #print Triangulation[0].attribute
352        #print Triangulation[1].attribute
353        #print Triangulation[2].attribute
354        #print Triangulation[3].attribute
355        #print Triangulation[4].attribute
356       
357        self.failUnless(Triangulation[0].attribute == "" and
358                        Triangulation[1].attribute == "22" and
359                        Triangulation[2].attribute == "" and
360                        Triangulation[3].attribute == "11" and
361                        Triangulation[4].attribute == "22" ,
362                        'region attributes are wrong!')   
363
364    def test_vertexAttribs(self):
365        a = Vertex (0.0, 0.0, attributes = [12.0,2.0])
366        d = Vertex (0.0, 4.0, attributes = [9.0,7.0])
367        f = Vertex (4.0,0.0, attributes = [14.0,3.0])
368   
369        Segment.set_default_tag("")
370        s1 = Segment(a,d)
371        s2 = Segment(d,f)
372        s3 = Segment(a,f)
373     
374        r1 = Region(0.3, 0.3, tag = 88.9)
375     
376        m = Mesh(userVertices=[a,d,f], userSegments=[s1,s2,s3], regions=[r1])
377
378        m.generateMesh("Q", maxArea = 2.1)
379
380        vert = m.getMeshVertices()
381       
382        self.failUnless(vert[0].attributes == [12.0, 2.0] and
383                        vert[1].attributes == [9.0, 7.0] and
384                        vert[2].attributes == [14.0,3.0] and
385                        vert[3].attributes == [12.232233047033631, 4.4142135623730949] and
386                        vert[4].attributes == [13.0, 2.5] ,
387                        'vertex attributes are wrong!')
388
389       
390    def test_vertexAttribs2(self):
391   
392        a = Vertex (0.0, 0.0)
393        d = Vertex (0.0, 4.0)
394        f = Vertex (4.0,0.0)
395   
396        Segment.set_default_tag("")
397        s1 = Segment(a,d)
398        s2 = Segment(d,f)
399        s3 = Segment(a,f)
400     
401        r1 = Region(0.3, 0.3, tag = 88.9)
402     
403        m = Mesh(userVertices=[a,d,f], userSegments=[s1,s2,s3], regions=[r1])
404
405        m.generateMesh("Q", maxArea = 2.1 )
406
407        vert = m.getMeshVertices()
408        self.failUnless(vert[0].attributes == [] and
409                        vert[1].attributes == [] and
410                        vert[2].attributes == [] and
411                        vert[3].attributes == [] and
412                        vert[4].attributes == [],
413                        'vertex attributes are wrong!')
414
415    def test_segtag(self):
416   
417        a = Vertex (0.0, 0.0)
418        d = Vertex (0.0, 4.0)
419        f = Vertex (4.0,0.0)
420   
421        s1 = Segment(a,d,tag = 5)
422        s2 = Segment(d,f,tag = 7)
423        s3 = Segment(a,f,tag = 9)
424     
425        m = Mesh(userVertices=[a,d,f], userSegments=[s1,s2,s3])
426
427        m.generateMesh("Q", maxArea = 2.1 )
428
429        m.export_mesh_file("from_test_mesh.tsh")
430        seg = m.getMeshSegments()
431        #print "seg",seg
432        #print "seg[0].tag"
433        #print seg[0].tag
434        #print "seg[0].tag"
435       
436        self.failUnless(seg[0].tag == 5 and
437                        seg[1].tag == 7 and
438                        seg[2].tag == 9 and
439                        seg[3].tag == 7 and
440                        seg[4].tag == 9,
441                        'seg tags are wrong')
442           
443
444    def test_segtag2(self):
445   
446        a = Vertex (0.0, 0.0)
447        d = Vertex (0.0, 4.0)
448        f = Vertex (4.0,0.0)
449        e = Vertex (1.0,1.0)
450   
451        s1 = Segment(a,d)
452        s2 = Segment(d,f)
453        s3 = Segment(a,f)
454        s4 = Segment(a,e)
455     
456        m = Mesh(userVertices=[a,d,f,e], userSegments=[s1,s2,s3,s4])
457
458        m.generateMesh("Q", maxArea = 2.1)
459
460        seg = m.getMeshSegments()
461        self.failUnless(seg[0].tag == "exterior" and
462                        seg[1].tag == "exterior" and
463                        seg[2].tag == "exterior" and
464                        seg[3].tag == "" and
465                        seg[4].tag == "exterior",
466                        '2nd seg tags are wrong')
467
468    def test_asciiFile(self):
469   
470        a = Vertex (0.0, 0.0)  #, attributes = [1.1])
471        d = Vertex (0.0, 4.0)  #, attributes = [1.2])
472        f = Vertex (4.0,0.0)  #, attributes = [1.3])
473        e = Vertex (1.0,1.0)  #, attributes = [1.4])
474   
475        s1 = Segment(a,d)
476        s2 = Segment(d,f)
477        s3 = Segment(a,f)
478        s4 = Segment(a,e)
479     
480        m = Mesh(userVertices=[a,d,f,e], userSegments=[s1,s2,s3,s4])
481
482        m.generateMesh("Q", maxArea = 2.1 )
483        seg = m.getMeshSegments()
484       
485        fileName = tempfile.mktemp(".tsh")
486        m.export_mesh_file(fileName)
487        file = open(fileName)
488        lFile = file.read().split('\n')
489        file.close()
490        os.remove(fileName)
491       
492        #print "@^@^"
493        #for l in lFile:
494        #    print l,"<"
495        #print "@^@^"
496
497        # no need to check the title again
498        #self.failUnless(lFile[0] == "5 0 # <vertex #> <x> <y> [attributes] ...Triangulation Vertices..."
499          #              ,'Ascii file is wrong, vertex title')
500        self.failUnless(lFile[1] == "0 0.0 0.0 " and #1.1 " and
501                        lFile[2] == "1 0.0 4.0 " and #1.2 " and
502                        lFile[3] == "2 4.0 0.0 " and #1.3 " and
503                        lFile[4] == "3 1.0 1.0 " and #1.4 " and
504                        lFile[5] == "4 2.0 2.0 "  #1.25 "
505                        ,
506                        'Ascii file is wrong, vertex')
507       
508        #self.failUnless(lFile[6] == "# attribute column titles ...Triangulation Vertex Titles..."
509          #              ,'Ascii file is wrong, attribute column title')
510        self.failUnless(lFile[8] == "0 3 2 4 -1 2 3  " and
511                        lFile[9] == "1 1 0 3 3 2 -1  " and
512                        lFile[10] == "2 3 4 1 -1 1 0  " and
513                        lFile[11] == "3 2 3 0 1 -1 0  "
514                        ,
515                        'Ascii file is wrong, triangle') 
516
517        self.failUnless( lFile[13] == "0 0 1 exterior" and
518                        lFile[14] == "1 1 4 exterior" and
519                        lFile[15] == "2 2 0 exterior" and
520                        lFile[16] == "3 0 3 " and
521                        lFile[17] == "4 4 2 exterior" ,
522                        'Ascii file is wrong, segment')
523       
524       # self.failUnless(lFile[18] == '4 0 # <vertex #> <x> <y> [attributes] ...Mesh Vertices...',
525        #                'Ascii file is wrong, Mesh Vertices Title')
526       
527        self.failUnless(lFile[19] == '0 0.0 0.0 ' and #1.1 ' and
528                        lFile[20] == '1 0.0 4.0 ' and #1.2 ' and
529                        lFile[21] == '2 4.0 0.0 ' and #1.3 ' and
530                        lFile[22] == '3 1.0 1.0 ' #1.4 '
531                        ,
532                        'Ascii file is wrong, Mesh Vertices II')
533       
534        self.failUnless(lFile[24] == '0 0 1 ' and
535                        lFile[25] == '1 1 2 ' and
536                        lFile[26] == '2 0 2 ' and
537                        lFile[27] == '3 0 3 '
538                        ,'Ascii file is wrong, Mesh Segments')       
539
540 
541    def test_ascii_file(self):
542   
543        a = Vertex (0.0, 0.0) #, attributes = [1.1])
544        d = Vertex (0.0, 4.0) #, attributes = [1.2])
545        f = Vertex (4.0,0.0) #, attributes = [1.3])
546        e = Vertex (1.0,1.0) #, attributes = [1.4])
547   
548        s1 = Segment(a,d)
549        s2 = Segment(d,f)
550        s3 = Segment(a,f)
551        s4 = Segment(a,e)
552     
553        m = Mesh(userVertices=[a,d,f,e], userSegments=[s1,s2,s3,s4])
554
555        m.generateMesh("Q", maxArea = 2.1 )
556
557        seg = m.getMeshSegments()
558       
559        fileName = tempfile.mktemp(".tsh")
560        m.export_mesh_file(fileName)
561        file = open(fileName)
562        lFile = file.read().split('\n')
563        file.close()
564        os.remove(fileName)
565       
566        #print "@^@^"
567        #for l in lFile:
568        #    print l,"<"
569        #print "@^@^"
570        self.failUnless(lFile[0] == "5 0 # <# of verts> <# of vert attributes>, next lines <vertex #> <x> <y> [attributes] ...Triangulation Vertices..."
571                        ,
572                        'Ascii file is wrong, vertex title')
573        self.failUnless(lFile[1] == "0 0.0 0.0 " and #1.1 " and
574                        lFile[2] == "1 0.0 4.0 " and #1.2 " and
575                        lFile[3] == "2 4.0 0.0 " and #1.3 " and
576                        lFile[4] == "3 1.0 1.0 " and #1.4 " and
577                        lFile[5] == "4 2.0 2.0 "  #1.25 "
578                        ,
579                        'Ascii file is wrong, vertex')
580       
581        self.failUnless(lFile[6] == "# attribute column titles ...Triangulation Vertex Titles..."
582                        ,
583                        'Ascii file is wrong, attribute column title')
584        self.failUnless(lFile[7] == "4 # <# of triangles>, next lines <triangle #> [<vertex #>] [<neigbouring triangle #>] [attribute of region] ...Triangulation Triangles..." and
585                        lFile[8] == "0 3 2 4 -1 2 3  " and
586                        lFile[9] == "1 1 0 3 3 2 -1  " and
587                        lFile[10] == "2 3 4 1 -1 1 0  " and
588                        lFile[11] == "3 2 3 0 1 -1 0  "
589                        ,
590                        'Ascii file is wrong, triangle') 
591
592        self.failUnless(lFile[12] == "5 # <# of segments>, next lines <segment #> <vertex #>  <vertex #> [boundary tag] ...Triangulation Segments..." and
593                        lFile[13] == "0 0 1 exterior" and
594                        lFile[14] == "1 1 4 exterior" and
595                        lFile[15] == "2 2 0 exterior" and
596                        lFile[16] == "3 0 3 " and
597                        lFile[17] == "4 4 2 exterior" ,
598                        'Ascii file is wrong, segment')
599       
600        self.failUnless(lFile[18] == '4 0 # <# of verts> <# of vert attributes>, next lines <vertex #> <x> <y> [attributes] ...Mesh Vertices...',
601                        'Ascii file is wrong, Mesh Vertices Title')
602       
603        self.failUnless(lFile[19] == '0 0.0 0.0 ' and #1.1 ' and
604                        lFile[20] == '1 0.0 4.0 ' and #1.2 ' and
605                        lFile[21] == '2 4.0 0.0 ' and #1.3 ' and
606                        lFile[22] == '3 1.0 1.0 ' #1.4 '
607                        ,
608                        'Ascii file is wrong, Mesh Vertices II')
609       
610        self.failUnless(lFile[23] == '4 # <# of segments>, next lines <segment #> <vertex #>  <vertex #> [boundary tag] ...Mesh Segments...' and
611                        lFile[24] == '0 0 1 ' and
612                        lFile[25] == '1 1 2 ' and
613                        lFile[26] == '2 0 2 ' and
614                        lFile[27] == '3 0 3 ' and
615                        lFile[28] == '0 # <# of holes>, next lines <Hole #> <x> <y> ...Mesh Holes...' and
616                        lFile[29] == '0 # <# of regions>, next lines <Region #> <x> <y> <tag>...Mesh Regions...'
617                        ,
618                        'Ascii file is wrong, Mesh Segments')       
619 
620
621    def test_thinoutVertices(self):
622
623        v1 = Vertex(-20,-20)
624        v2 = Vertex(-11,-11)
625        v3 = Vertex(-10,-10)
626        v4 = Vertex(-9,-1)
627        v5 = Vertex(-8,2)
628        v6 = Vertex(6,3)
629        v7 = Vertex(12,9)
630        v8 = Vertex(15,3)
631        v9 = Vertex(24,3)
632        m = Mesh(userVertices = [v1,v2,v3,v4,v5,v6,v7,v8,v9])
633        m.thinoutVertices(10)
634         
635        self.failUnless(v1 in m.userVertices,
636                        'test_thinoutVertices, test 1 failed')
637        self.failUnless(v3 in m.userVertices,
638                        'test_thinoutVertices, test 2 failed')
639        self.failUnless(v4 in m.userVertices,
640                        'test_thinoutVertices, test 3 failed')
641        self.failUnless(v6 in m.userVertices,
642                        'test_thinoutVertices, test 4 failed')
643        self.failUnless(v7 in m.userVertices,
644                        'test_thinoutVertices, test 5 failed')
645        self.failUnless(v9 in m.userVertices,
646                        'test_thinoutVertices, test 6 failed')
647        self.failUnless(v5 not in m.userVertices,
648                        'test_thinoutVertices, test 7 failed')
649        self.failUnless(v2 not in m.userVertices,
650                        'test_thinoutVertices, test 8 failed')
651        self.failUnless(v8 not in m.userVertices,
652                        'test_thinoutVertices, test 9 failed')
653
654    def test_same_x_y(self):
655        v = Point(7,8)
656        f = Point(7,8)
657        f.same_x_y(v)
658
659        self.failUnless(f.same_x_y(v),
660                        'same_x_y True failed')
661        e = Point(7,9)
662        self.failUnless(not f.same_x_y(e),
663                        'same_x_y False failed')
664
665    def test_import_tsh(self):
666       
667        a_att = [5.0,2.0]
668        d_att =[4.0,2.0]
669        f_att = [3.0,2.0]
670        e_att = [2.0,2.0]
671        a_xy = [0.0, 0.0]
672        a = Vertex ( a_xy[0],a_xy[1]) #, attributes =a_att)
673        d = Vertex (0.0, 4.0) #, attributes =d_att)
674        f = Vertex (4.0,0.0) #, attributes =f_att)
675        e = Vertex (1.0,1.0) #, attributes =e_att)
676   
677        s1 = Segment(a,d, tag = "50")
678        s2 = Segment(d,f, tag = "40")
679        s3 = Segment(a,f, tag = "30")
680        s4 = Segment(a,e, tag = "20")
681     
682        r1 = Region(0.3, 0.3,tag = "1.3")
683        geo = Geo_reference(8.9,8.9,65)
684        m = Mesh(userVertices=[a,d,f,e],
685                 userSegments=[s1,s2,s3,s4],
686                 regions=[r1],
687                 geo_reference=geo)
688
689        m.generateMesh("Q", maxArea = 2.1)
690        fileName = tempfile.mktemp(".tsh")
691        #print "dgs!!!"
692        #print "****************** fileName", fileName
693        m.export_mesh_file(fileName)
694        #print "******************"
695        #print "m", m
696        #print "******************"
697        m_returned = importMeshFromFile(fileName)
698        #print "m_returned",m_returned
699        #print "******************"
700        #print "****************** fileName", fileName
701        os.remove(fileName)
702        self.failUnless(0 == m.__cmp__(m_returned),
703                        'loading and saving of a mesh failed')
704        # do this when .msh supports geo_refs
705        #self.failUnless(m.geo_reference == m_returned.geo_reference,
706        #                'loading and saving of a mesh geo refs failed')
707
708    def test_import_mesh(self):
709       
710        a_att = [5.0,2.0]
711        d_att =[4.0,2.0]
712        f_att = [3.0,2.0]
713        e_att = [2.0,2.0]
714        a_xy = [0.0, 0.0]
715        a = Vertex ( a_xy[0],a_xy[1]) #, attributes =a_att)
716        d = Vertex (0.0, 4.0) #, attributes =d_att)
717        f = Vertex (4.0,0.0) #, attributes =f_att)
718        e = Vertex (1.0,1.0) #, attributes =e_att)
719   
720        s1 = Segment(a,d, tag = "50")
721        s2 = Segment(d,f, tag = "40")
722        s3 = Segment(a,f, tag = "30")
723        s4 = Segment(a,e, tag = "20")
724     
725        r1 = Region(0.3, 0.3,tag = "1.3")
726        geo = Geo_reference(65,8.9,8.9)
727        m = Mesh(userVertices=[a,d,f,e],
728                 userSegments=[s1,s2,s3,s4],
729                 regions=[r1],
730                 geo_reference=geo)
731
732        m.generateMesh("Q", maxArea = 2.1)
733        fileName = tempfile.mktemp(".msh")
734        #print "dgs!!!"
735        #print "****************** fileName", fileName
736        m.export_mesh_file(fileName)
737        #print "******************"
738        #print "m", m
739        #print "******************"
740        m_returned = importMeshFromFile(fileName)
741        #print "m_returned",m_returned
742        #print "******************"
743        #print "****************** fileName", fileName
744        os.remove(fileName)
745        #print "m.geo_reference",m.geo_reference
746        #print "m_returned.geo_reference,",m_returned.geo_reference
747        self.failUnless(0 == m.__cmp__(m_returned),
748                        'loading and saving of a mesh failed')
749        self.failUnless(m.geo_reference == m_returned.geo_reference,
750                        'loading and saving of a mesh geo refs failed')
751
752    def test_normaliseMesh(self):
753       
754        a_att = [5.0,2.0]
755        d_att =[4.0,2.0]
756        f_att = [3.0,2.0]
757        e_att = [2.0,2.0]
758        a_xy = [10.0, 10.0]
759        a = Vertex ( a_xy[0],a_xy[1], attributes =a_att)
760        d = Vertex (15.0, 10.0, attributes =d_att)
761        f = Vertex (10.0,20.0, attributes =f_att)
762        e = Vertex (15.0,20.0, attributes =e_att)
763   
764        s1 = Segment(a,d, tag = 50)
765        s2 = Segment(d,e, tag = 40)
766        s3 = Segment(e,f, tag = 30)
767        s4 = Segment(f,a, tag = 20)
768     
769        r1 = Region(0.3, 0.3,tag = 1.3)
770        m = Mesh(userVertices=[a,d,f,e],
771                 userSegments=[s1,s2,s3,s4],
772                 regions=[r1])
773        m.normaliseMesh(1,0,1)
774        [xmin, ymin, xmax, ymax] = m.boxsize()
775        [attmin, attmax] = m.maxMinVertAtt(0)
776        self.failUnless(attmin == 0.0 and attmax == 1.0,
777                        'normalise failed')
778        self.failUnless(xmin == 0.0 and ymin == 0.0 and xmax == 0.5 and ymax == 1.0,
779                        'normalise failed')
780        m.normaliseMesh(200,-100,5)
781        [xmin, ymin, xmax, ymax] = m.boxsize()
782        [attmin, attmax] = m.maxMinVertAtt(0)
783        self.failUnless(attmin == 0.0 and attmax == 5.0,
784                        'normalise failed')
785        self.failUnless(xmin == -100.0 and ymin == -100.0 and xmax == 0.0 and ymax == 100.0,
786                        'normalise failed')
787       
788    def test_exportASCIIsegmentoutlinefile(self):
789        a = Vertex (0,0)
790        b = Vertex (0,3)
791        c = Vertex (3,3)
792        d = Vertex (1,2)
793        e = Vertex (3,1)
794     
795        s1 = Segment(a,b, tag = "50")
796        s2 = Segment(b,c, tag = "40")
797        s3 = Segment(c,a, tag = "30")
798     
799        r1 = Region(2, 1,tag = "1.3")
800        h1 = Hole(1,4)
801        m = Mesh(userVertices=[a,b,c,d,e],
802                 userSegments=[s1,s2,s3],
803                 regions=[r1],
804                 holes = [h1])     
805       
806        m.generateMesh("Q", maxArea = 2.1)
807        #print "mesh ***************dsg*", m
808
809        fileName = tempfile.mktemp(".tsh")
810        m.exportASCIIsegmentoutlinefile(fileName)
811       
812        m_returned = importMeshFromFile(fileName)
813
814        #print "m_returned ****",m_returned
815        #print "****************** fileName", fileName
816        os.remove(fileName)
817
818        #Trim mesh, so it should like like m_returned
819        m.meshVertices = []
820        m.meshTriangles = []
821        m.meshSegments = []
822        m.userVertices=[a,b,c]
823        #print "mesh ***************dsg*", m
824        #print "(m.__cmp__(m_returned)", m.__cmp__(m_returned)
825        self.failUnless(0 == m.__cmp__(m),
826                        'test_exportASCIIsegmentoutlinefile:loading and saving of a mesh failed')
827        # Having problems with this on linux.
828        #The ordering of the dictionary values wasn't the same as the windows
829        #returned value (verts.values())
830        #self.failUnless(0 == m.__cmp__(m_returned),
831        #                'test_exportASCIIsegmentoutlinefile:loading and saving of a mesh failed')
832       
833        self.failUnless(3 == len(m_returned.userVertices),
834                        'segmentoutlinefile:IO of a mesh failed')
835        self.failUnless(len(m.userSegments) == len(m_returned.userSegments),
836                        'segmentoutlinefile:IO of a mesh failed')
837        for i in range(len(m.userSegments)):
838            self.failUnless(m.userSegments[i].vertices[0].x ==
839                            m_returned.userSegments[i].vertices[0].x,
840                        'loading and saving of a mesh outline fialed')
841            self.failUnless(m.userSegments[i].vertices[0].y ==
842                            m_returned.userSegments[i].vertices[0].y,
843                        'loading and saving of a mesh outline fialed')
844            self.failUnless(m.userSegments[i].vertices[1].x ==
845                            m_returned.userSegments[i].vertices[1].x,
846                        'loading and saving of a mesh outline fialed')
847            self.failUnless(m.userSegments[i].vertices[1].y ==
848                            m_returned.userSegments[i].vertices[1].y,
849                        'loading and saving of a mesh outline fialed')
850
851 
852    def test_exportASCIIsegmentoutlinefile2(self):
853        a = Vertex (0,0)
854        b = Vertex (0,1)
855        c = Vertex (1,0)
856        d = Vertex (1,1)
857        e = Vertex (0.5,0.5)
858        f  = Vertex (0.6,0.6)
859     
860        s1 = Segment(a,e, tag = "50")
861        s2 = Segment(b,e, tag = "40")
862        s3 = Segment(c,e, tag = "30")
863        s4 = Segment(d,e, tag = "30")
864     
865        r1 = Region(2, 1,tag = "1.3")
866        h1 = Hole(1,4)
867        m = Mesh(userVertices=[a,b,c,d,e],
868                 userSegments=[s1,s2,s3,s4],
869                 regions=[r1],
870                 holes = [h1])     
871       
872        fileName = tempfile.mktemp(".tsh")
873        m.exportASCIIsegmentoutlinefile(fileName)
874       
875        m_returned = importMeshFromFile(fileName)
876        #print "****************** fileName", fileName
877        os.remove(fileName)
878
879        #Trim mesh, so it should like like m_returned
880        m.meshVertices = []
881        m.meshTriangles = []
882        m.meshSegments = []
883        m.userVertices=[a,e,d,b,c]
884        #print "mesh ***************dsg*", m
885        #print "(m.__cmp__(m_returned)", m.__cmp__(m_returned)
886        self.failUnless(0 == m.__cmp__(m),
887                        'loading and saving of a mesh failed')
888
889        self.failUnless(5 == len(m_returned.userVertices),
890                        'segmentoutlinefile:IO of a mesh failed')
891        self.failUnless(len(m.userSegments) == len(m_returned.userSegments),
892                        'segmentoutlinefile:IO of a mesh failed')
893        for i in range(len(m.userSegments)):
894            self.failUnless(m.userSegments[i].vertices[0].x ==
895                            m_returned.userSegments[i].vertices[0].x,
896                        'loading and saving of a mesh outline fialed')
897            self.failUnless(m.userSegments[i].vertices[0].y ==
898                            m_returned.userSegments[i].vertices[0].y,
899                        'loading and saving of a mesh outline fialed')
900            self.failUnless(m.userSegments[i].vertices[1].x ==
901                            m_returned.userSegments[i].vertices[1].x,
902                        'loading and saving of a mesh outline fialed')
903            self.failUnless(m.userSegments[i].vertices[1].y ==
904                            m_returned.userSegments[i].vertices[1].y,
905                        'loading and saving of a mesh outline fialed')
906
907
908    def test_loadxy(self):
909        """
910        To test the mesh side of loading xya files.
911        Not the loading of xya files
912        """
913        import os
914        import tempfile
915       
916        fileName = tempfile.mktemp(".xya")
917        file = open(fileName,"w")
918        file.write("elevation speed \n\
9191.0 0.0 10.0 0.0\n\
9200.0 1.0 0.0 10.0\n\
9211.0 0.0 10.4 40.0\n")
922        file.close()
923        #print fileName
924        m = importMeshFromFile(fileName)
925        os.remove(fileName)
926        self.failUnless(m.userVertices[0].x == 1.0,
927                        'loadxy, test 1 failed')
928        self.failUnless(m.userVertices[0].y == 0.0,
929                        'loadxy, test 2 failed')
930        #self.failUnless(m.userVertices[0].attributes == [10.0,0.0],
931        #                'loadxy, test 2.2 failed')
932        self.failUnless(m.userVertices[1].x == 0.0,
933                        'loadxy, test 3 failed')
934        self.failUnless(m.userVertices[1].y == 1.0,
935                        'loadxy, test 4 failed')
936        #self.failUnless(m.userVertices[1].attributes == [0.0,10.0],
937        #                'loadxy, test 5 failed')
938       
939    def test_exportPointsFile(self):
940        a = Vertex (0,0)
941        b = Vertex (0,3)
942        c = Vertex (3,3)
943        d = Vertex (1,2)
944        e = Vertex (3,1)
945        f = Vertex (3,1)
946     
947        s1 = Segment(a,b, tag = 50)
948        s2 = Segment(b,c, tag = 40)
949        s3 = Segment(c,a, tag = 30)
950     
951        r1 = Region(2, 1,tag = 1.3)
952        h1 = Hole(1,4)
953        # Warning mesh can't produce this type of data structure its self
954        m = Mesh(userVertices=[a,b,c,d,e],
955                 userSegments=[s1,s2,s3],
956                 regions=[r1],
957                 holes = [h1])
958       
959        fileName = tempfile.mktemp(".xya")
960        #fileName = 't.xya'
961        #os.remove(fileName)
962        m.exportPointsFile(fileName)
963        file = open(fileName)
964        lFile = file.read().split('\n')
965        file.close()
966
967        os.remove(fileName)
968        self.failUnless(lFile[0] == "" and
969                        lFile[1] == "0,0" and
970                        lFile[2] == "0,3" and
971                        lFile[3] == "3,3" 
972                        ,
973                        'exported Ascii xya file is wrong')
974        self.failUnless(lFile[4] == "1,2" and
975                        lFile[5] == "3,1" 
976                        ,
977                        'exported Ascii xya file is wrong')
978       
979        m.generateMesh("Q", maxArea = 2.1)
980        fileName = tempfile.mktemp(".xya")
981        fileName = 't.xya'
982        m.export_mesh_file('m.tsh')
983        m.exportPointsFile(fileName)
984        file = open(fileName)
985        lFile = file.read().split('\n')
986        file.close()
987        #os.remove(fileName)
988       
989        self.failUnless(lFile[0] == "" and
990                        lFile[1] == "0.0,0.0" and
991                        lFile[2] == "0.0,3.0" and
992                        lFile[3] == "3.0,3.0" and
993                        lFile[4] == "1.0,2.0" and
994                        lFile[5] == "3.0,1.0"
995                        ,
996                        'exported Ascii xya file is wrong')
997           
998    def test_exportPointsFilefile2(self):
999        m = Mesh()
1000       
1001        fileName = tempfile.mktemp(".xya")
1002        m.exportPointsFile(fileName)
1003        file = open(fileName)
1004        lFile = file.read().split('\n')
1005        file.close()
1006
1007        os.remove(fileName)
1008        #print "************* test_mesh exportPointsFilefile"
1009        #print "lFile",lFile
1010        #print "************* test_mesh exportPointsFilefile"
1011        self.failUnless(lFile[0] == "" 
1012                        ,
1013                        'exported Ascii xya file is wrong')
1014       
1015    def test_strings2ints(self):
1016        list = ["sea","river inlet","","sea","","moat"]
1017        preset = ["moat", "internal boundary"]
1018        [intlist, converter] = segment_strings2ints(list,preset )
1019        self.failUnless(intlist == [2,3 ,0 ,2 ,0 ,0 ]
1020                        ,
1021                        'test_strings2ints produces bad intlist')
1022        self.failUnless(converter == ['moat', 'internal boundary',
1023                                      'sea', 'river inlet']
1024                        ,
1025                        'test_strings2ints produces bad converter')
1026       
1027    def test_ints2strings(self):
1028        list = ["internal boundary","sea","river inlet",
1029            "","sea","","moat","internal boundary"]
1030        outlist = ['internal boundary', 'sea', 'river inlet', 'moat',
1031                   'sea', 'moat', 'moat', 'internal boundary']
1032        preset = ["moat", "internal boundary"]
1033        [intlist, converter] = segment_strings2ints(list,preset )
1034        newlist = segment_ints2strings(intlist, converter)
1035        self.failUnless(outlist == newlist
1036                        ,
1037                        'test_strings2ints produces bad intlist')
1038        self.failUnless(converter == ['moat', 'internal boundary',
1039                                      'sea', 'river inlet']
1040                        ,
1041                        'test_strings2ints produces bad converter')
1042       
1043    def test_ints2strings2(self):
1044        list = ["","",""]
1045        preset = ["moat", "internal boundary"]
1046        [intlist, converter] = segment_strings2ints(list,preset )
1047        newlist = segment_ints2strings(intlist, converter)
1048        outlist = ['moat', 'moat', 'moat']
1049        self.failUnless(outlist == newlist
1050                        ,
1051                        'test_strings2ints produces bad intlist')
1052        self.failUnless(converter == ['moat', 'internal boundary']
1053                        ,
1054                        'test_strings2ints produces bad converter')
1055
1056       
1057    def test_removeDuplicatedVertices(self):
1058        a = Vertex (0,0)
1059        a.index = 0
1060        b = Vertex (0,3)
1061        b.index = 1
1062        c = Vertex (3,3)
1063        c.index = 2
1064        d = Vertex (1,1)
1065        d.index = 3
1066        e = Vertex (3,1)
1067        e.index = 4
1068        f = Vertex (1,1)
1069        f.index = 5
1070        g = Vertex (1,1)
1071        g.index = 6
1072        inputVerts_noDups = [a,b,c,d,e]
1073       
1074        m = Mesh(userVertices=[a,b,c,d,e,f,g])
1075        counter = m.removeDuplicatedUserVertices()
1076        UserVerts = m.getUserVertices()
1077       
1078         
1079        self.failUnless(UserVerts == inputVerts_noDups,
1080                            'duplicate verts not removed')
1081        #for userVert, inputVert in map(None, UserVerts, inputVerts_noDups):
1082        #    self.failUnless(userVert.x == inputVert.x,
1083        #                    'x duplicate verts not removed')
1084        #    self.failUnless(userVert.y == inputVert.y,
1085        #                    'y duplicate verts not removed')
1086
1087       
1088    def test_ungenerateFileLoading(self):
1089       
1090        fileName = tempfile.mktemp(".txt")
1091        file = open(fileName,"w")
1092        file.write("         1       ??      ??\n\
1093       0.0       0.0\n\
1094       1.0       0.0\n\
1095       1.0       1.0\n\
1096       0.0       1.0\n\
1097       0.0       0.0\n\
1098END\n\
1099         2      ?? ??\n\
1100       10.0       10.0\n\
1101       10.0       20.0\n\
1102       20.0       20.0\n\
1103       10.0       10.0\n\
1104END\n\
1105END\n")
1106        file.close()
1107       
1108       
1109        a = Vertex (0.0, 0.0) #, attributes = [1.1])
1110        b = Vertex (0.0, 40.0) #, attributes = [1.2])
1111        c = Vertex (40.0,40.0) #, attributes = [1.3])
1112        d = Vertex (40.0,0.0) #, attributes = [1.4])
1113   
1114        s1 = Segment(a,b)
1115        s2 = Segment(b,c)
1116        s3 = Segment(c,d)
1117        s4 = Segment(d,a)
1118     
1119        m = Mesh(userVertices=[a,b,c,d], userSegments=[s1,s2,s3,s4])
1120        dict = importUngenerateFile(fileName)
1121        os.remove(fileName)
1122
1123        tag = "DSG"
1124        Segment.set_default_tag(tag)
1125        m.addVertsSegs(dict)
1126
1127        # have to reset this , since it's a class attribute
1128        Segment.set_default_tag("")
1129           
1130        self.failUnless(len(m.userSegments) ==11,
1131                        'Wrong segment list length.')
1132        self.failUnless(len(m.userVertices) == 11,
1133                        'Wrong vertex list length.')
1134        self.failUnless(m.userSegments[10].vertices[0] == m.userVertices[10],
1135                        'bad vertex on segment.')
1136        self.failUnless(m.userSegments[10].vertices[1] == m.userVertices[8],
1137                        'Bad segment.')
1138        self.failUnless(m.userSegments[10].tag == tag,
1139                        'wrong tag.')
1140   
1141    def test_ungenerateFileLoadingII(self):
1142       
1143        fileName = tempfile.mktemp(".txt")
1144        file = open(fileName,"w")
1145        file.write("         1       ??      ??\n\
1146       0.0       0.0\n\
1147       1.0       0.0\n\
1148       1.0       1.0\n\
1149       0.0       1.0\n\
1150       0.0       0.0\n\
1151END\n\
1152         2      ?? ??\n\
1153       10.0       10.0\n\
1154       10.0       20.0\n\
1155       20.0       20.0\n\
1156END\n\
1157END\n")
1158        file.close()
1159       
1160       
1161        a = Vertex (0.0, 0.0) #, attributes = [1.1])
1162        b = Vertex (0.0, 40.0) #, attributes = [1.2])
1163        c = Vertex (40.0,40.0) #, attributes = [1.3])
1164        d = Vertex (40.0,0.0) #, attributes = [1.4])
1165   
1166        s1 = Segment(a,b)
1167        s2 = Segment(b,c)
1168        s3 = Segment(c,d)
1169        s4 = Segment(d,a)
1170     
1171        m = Mesh(userVertices=[a,b,c,d], userSegments=[s1,s2,s3,s4])
1172        dict = importUngenerateFile(fileName)
1173        os.remove(fileName)
1174
1175        tag = "DSG"
1176        Segment.set_default_tag(tag)
1177        m.addVertsSegs(dict)
1178
1179        self.failUnless(len(m.userSegments) ==10,
1180                        'Wrong segment list length.')
1181        self.failUnless(len(m.userVertices) == 11,
1182                        'Wrong vertex list length.')
1183       
1184    def test_addVertsSegs(self):
1185        m = Mesh()
1186        Segment.set_default_tag("food")
1187        dict = {}
1188        dict['points'] = [[0.0, 0.0], [1.0, 0.0], [1.0, 1.0]]
1189        dict['segments'] = [[0, 1], [1, 2]]
1190        dict['segment_tags'] = ['','do-op']
1191        m.addVertsSegs(dict)
1192        # have to reset this , since it's a class attribute
1193        Segment.set_default_tag("")
1194
1195       
1196        self.failUnless(len(m.userSegments) ==2,
1197                        'Wrong segment list length.')
1198        self.failUnless(len(m.userVertices) == 3,
1199                        'Wrong vertex list length.')
1200        self.failUnless(m.userSegments[0].tag =='food',
1201                        'Wrong segment tag length.')
1202        self.failUnless(m.userSegments[1].tag =='do-op',
1203                        'Wrong segment tag.')
1204       
1205    def test_addVertsSegs2(self):
1206        geo = Geo_reference(56,5,10)
1207        m = Mesh(geo_reference=geo)
1208        dict = {}
1209        dict['points'] = [[2.0, 1.0], [3.0, 1.0], [2.0, 2.0]]
1210        dict['segments'] = [[0, 1], [1, 2], [2,0]]
1211        dict['segment_tags'] = ['','do-op','']
1212        m.addVertsSegs(dict)
1213
1214    def test_exportASCIImeshfile(self):
1215   
1216        #a_att = [5,2]
1217        #d_att =[4,2]
1218        #f_att = [3,2]
1219        #e_att = [2,2]
1220        a_xy = [0.0, 0.0]
1221        a = Vertex ( a_xy[0],a_xy[1]) #, attributes =a_att)
1222        d = Vertex (0.0, 4.0) #, attributes =d_att)
1223        f = Vertex (4.0,0.0) #, attributes =f_att)
1224        e = Vertex (1.0,1.0) #, attributes =e_att)
1225   
1226        s1 = Segment(a,d, tag = "50")
1227        s2 = Segment(d,f, tag = "40")
1228        s3 = Segment(a,f, tag = "30")
1229        s4 = Segment(a,e, tag = "20")
1230     
1231        r1 = Region(0.3, 0.3,tag = "1.3", maxArea = 36)
1232
1233
1234        h1 = Hole(0.2,0.6)
1235       
1236        m = Mesh(userVertices=[a,d,f,e],
1237                 userSegments=[s1,s2,s3,s4],
1238                 regions=[r1],
1239                 holes=[h1])
1240
1241        seg = m.getUserSegments()
1242        points = m.getUserVertices()
1243        holes = m.getHoles()
1244        regions = m.getRegions()
1245        fileName = tempfile.mktemp(".tsh")
1246        m.export_mesh_file(fileName)
1247        #print "***************************fileName", fileName
1248        new_m = importMeshFromFile(fileName)
1249        os.remove(fileName)
1250       
1251
1252        #print '**@@@@@******'
1253        #print "new_m",new_m
1254        #print '**@@@@@******'
1255        #print "m",m
1256        #print '**@@@@@******'
1257       
1258        self.failUnless( new_m == m,
1259                         'loadASCIITestCase failed. test new 1')
1260           
1261    def test_Mesh2MeshList(self):
1262
1263        a_att = [5,2]
1264        d_att =[4,2]
1265        f_att = [3,2]
1266        e_att = [2,2]
1267        a_xy = [0.0, 0.0]
1268        a = Vertex ( a_xy[0],a_xy[1]) #, attributes =a_att)
1269        d = Vertex (0.0, 4.0) #, attributes =d_att)
1270        f = Vertex (4.0,0.0) #, attributes =f_att)
1271        e = Vertex (1.0,1.0) #, attributes =e_att)
1272   
1273        s1 = Segment(a,d, tag = "50")
1274        s2 = Segment(d,f, tag = "40")
1275        s3 = Segment(a,f, tag = "30")
1276        s4 = Segment(a,e, tag = "20")
1277     
1278        r1 = Region(0.3, 0.3,tag = "1.3", maxArea = 45)
1279        m = Mesh(userVertices=[a,d,f,e],
1280                 userSegments=[s1,s2,s3,s4],
1281                 regions=[r1])
1282
1283        m.generateMesh("Qa2.1")
1284
1285        seg = m.getMeshSegments()
1286        points = m.getMeshVertices()
1287        dict = m.Mesh2MeshList()
1288        #print "dict",dict
1289        # test not finished...
1290 
1291    def test_Mesh2IOTriangulationDict(self):
1292
1293        a_att = [5,2]
1294        d_att =[4,2]
1295        f_att = [3,2]
1296        e_att = [2,2]
1297        a_xy = [0.0, 0.0]
1298        a = Vertex ( a_xy[0],a_xy[1] , attributes =a_att)
1299        d = Vertex (0.0, 4.0 , attributes =d_att)
1300        f = Vertex (4.0,0.0 , attributes =f_att)
1301        e = Vertex (1.0,1.0 , attributes =e_att)
1302   
1303        s1 = Segment(a,d, tag = "50")
1304        s2 = Segment(d,f, tag = "40")
1305        s3 = Segment(a,f, tag = "30")
1306        s4 = Segment(a,e, tag = "20")
1307     
1308        r1 = Region(0.3, 0.3,tag = "1.3", maxArea = 45)
1309        m = Mesh(userVertices=[a,d,f,e],
1310                 userSegments=[s1,s2,s3,s4],
1311                 regions=[r1])
1312        titles = ['ele','friction']
1313        m.attributeTitles = titles
1314        m.generateMesh("Qa2.1")
1315
1316        seg = m.getMeshSegments()
1317        verts = m.getMeshVertices()
1318        dict = m.Mesh2IOTriangulationDict()
1319        #print "dict",dict
1320       
1321        self.failUnless( dict['vertex_attribute_titles'] == titles,
1322                         'test_Mesh2IOTriangulationDict failed. test 1')
1323        answer = [a_xy,[0.0, 4.0],[4.0,0.0], [1.0,1.0], [2.0,2.0]]
1324        #print "answer",answer
1325        #print "dict['vertices']",dict['vertices']
1326       
1327        self.failUnless( dict['vertices'] == answer,
1328                         'test_Mesh2IOTriangulationDict failed. test 2')
1329
1330       
1331        for pimport,pactual,pimpatt in map(None,dict['vertices'],
1332                                           verts,dict['vertex_attributes']):
1333            #assert all_close( pimport, (pactual.x,pactual.y))
1334            self.failUnless( pimport == [pactual.x,pactual.y],
1335                        'test_Mesh2IOTriangulationDict failed. test 2.1')
1336            self.failUnless( pimpatt == pactual.attributes,
1337                        'test_Mesh2IOTriangulationDict failed. test 2.2')
1338        self.failUnless( dict['segments'][0] == [0,1],
1339                        'test_Mesh2IOTriangulationDict failed. test 3')
1340        for segimp,segactual in map(None,dict['segment_tags'],seg):
1341            self.failUnless( segimp == segactual.tag,
1342                        'test_Mesh2IOTriangulationDict failed. test 4')
1343        #print " dict['triangles'][0]", dict['triangles'][0]
1344        self.failUnless( dict['triangles'][0] == [3,2,4],
1345                        'test_Mesh2IOTriangulationDict failed. test 5')
1346        self.failUnless( dict['triangle_neighbors'][0] == [-1,2,3],
1347                        'test_Mesh2IOTriangulationDict failed. test 6')
1348        self.failUnless( dict['triangle_tags'][0] == "1.3",
1349                         'test_Mesh2IOTriangulationDict failed. test 7')
1350
1351 
1352    def test_Mesh2IODict(self):
1353
1354        a_att = [5,2]
1355        d_att =[4,2]
1356        f_att = [3,2]
1357        e_att = [2,2]
1358        a_xy = [0.0, 0.0]
1359        a = Vertex ( a_xy[0],a_xy[1] , attributes =a_att)
1360        d = Vertex (0.0, 4.0 , attributes =d_att)
1361        f = Vertex (4.0,0.0 , attributes =f_att)
1362        e = Vertex (1.0,1.0 , attributes =e_att)
1363   
1364        s1 = Segment(a,d, tag = "50")
1365        s2 = Segment(d,f, tag = "40")
1366        s3 = Segment(a,f, tag = "30")
1367        s4 = Segment(a,e, tag = "20")
1368     
1369        r1 = Region(0.3, 0.3,tag = "1.3", maxArea = 45)
1370        m = Mesh(userVertices=[a,d,f,e],
1371                 userSegments=[s1,s2,s3,s4],
1372                 regions=[r1])
1373        titles = ['ele','friction']
1374        m.attributeTitles = titles
1375        m.generateMesh("Qa2.1")
1376
1377        seg = m.getMeshSegments()
1378        verts = m.getMeshVertices()
1379        dict = m.Mesh2IODict()
1380        #print "dict",dict
1381       
1382        self.failUnless( dict['vertex_attribute_titles'] == titles,
1383                         'test_Mesh2IOTriangulationDict failed. test 1')
1384        answer = [a_xy,[0.0, 4.0],[4.0,0.0], [1.0,1.0], [2.0,2.0]]
1385        #print "answer",answer
1386        #print "dict['vertices']",dict['vertices']
1387       
1388        self.failUnless( dict['vertices'] == answer,
1389                         'test_Mesh2IOTriangulationDict failed. test 2')
1390
1391       
1392        for pimport,pactual,pimpatt in map(None,dict['vertices'],
1393                                           verts,dict['vertex_attributes']):
1394            #assert all_close( pimport, (pactual.x,pactual.y))
1395            self.failUnless( pimport == [pactual.x,pactual.y],
1396                        'test_Mesh2IODict failed. test 2.1')
1397            self.failUnless( pimpatt == pactual.attributes,
1398                        'test_Mesh2IODict failed. test 2.2')
1399        self.failUnless( dict['segments'][0] == [0,1],
1400                        'test_Mesh2IODict failed. test 3')
1401        for segimp,segactual in map(None,dict['segment_tags'],seg):
1402            self.failUnless( segimp == segactual.tag,
1403                        'test_Mesh2IODict failed. test 4')
1404        #print " dict['triangles'][0]", dict['triangles'][0]
1405        self.failUnless( dict['triangles'][0] == [3,2,4],
1406                        'test_Mesh2IODict failed. test 5')
1407        self.failUnless( dict['triangle_neighbors'][0] == [-1,2,3],
1408                        'test_Mesh2IODict failed. test 6')
1409        self.failUnless( dict['triangle_tags'][0] == "1.3",
1410                         'test_Mesh2IODict failed. test 7')
1411
1412        seg = m.getUserSegments()
1413        points = m.getUserVertices()
1414        holes = m.getHoles()
1415        regions = m.getRegions()
1416       
1417        for pimport,pactual,pimpatt in map(None,dict['points'],points,dict['point_attributes']):
1418            self.failUnless( pimport == [pactual.x,pactual.y],
1419                        'test_Mesh2IODict failed. test 1')
1420            self.failUnless( pimpatt == pactual.attributes,
1421                        'test_Mesh2IODict failed. test 1.1')
1422        self.failUnless( dict['outline_segments'][0] == [0,1],
1423                        'test_Mesh2IODict failed. test 3')
1424        for segimp,segactual in map(None,dict['outline_segment_tags'],seg):
1425            self.failUnless( segimp == segactual.tag,
1426                        'test_Mesh2IODict failed. test 4')
1427        for holeimp,holeactual in map(None,dict['holes'],holes):
1428            self.failUnless( holeimp == [holeactual.x,holeactual.y],
1429                        'test_Mesh2IODict failed. test 5')
1430       
1431        for regimp,regactual,regattimp, regmaxarea in map(None,dict['regions'],regions, dict['region_tags'], dict['region_max_areas']):
1432            self.failUnless( regimp == [regactual.x,regactual.y],
1433                        'loadASCIITestCase failed. test 6')
1434            self.failUnless( regattimp == regactual.getTag(),
1435                        'loadASCIITestCase failed. test 7')
1436            self.failUnless( regmaxarea == regactual.getMaxArea(),
1437                        'loadASCIITestCase failed. test 7')
1438   
1439           
1440       
1441    def test_Mesh2IOOutlineDict(self):
1442
1443        a_att = [5,2]
1444        d_att =[4,2]
1445        f_att = [3,2]
1446        e_att = [2,2]
1447        a_xy = [0.0, 0.0]
1448        a = Vertex ( a_xy[0],a_xy[1] , attributes =a_att)
1449        d = Vertex (0.0, 4.0 , attributes =d_att)
1450        f = Vertex (4.0,0.0 , attributes =f_att)
1451        e = Vertex (1.0,1.0 , attributes =e_att)
1452   
1453        s1 = Segment(a,d, tag = "50")
1454        s2 = Segment(d,f, tag = "40")
1455        s3 = Segment(a,f, tag = "30")
1456        s4 = Segment(a,e, tag = "20")
1457     
1458        r1 = Region(0.3, 0.3,tag = "1.3", maxArea = 45)
1459        m = Mesh(userVertices=[a,d,f,e],
1460                 userSegments=[s1,s2,s3,s4],
1461                 regions=[r1])
1462        titles = ['ele','friction']
1463        m.attributeTitles = titles
1464        m.generateMesh("Qa2.1")
1465
1466        seg = m.getMeshSegments()
1467        verts = m.getMeshVertices()
1468        dict = m.Mesh2IOOutlineDict()
1469       
1470        seg = m.getUserSegments()
1471        points = m.getUserVertices()
1472        holes = m.getHoles()
1473        regions = m.getRegions()
1474       
1475        for pimport,pactual,pimpatt in map(None,dict['points'],points,dict['point_attributes']):
1476            self.failUnless( pimport == [pactual.x,pactual.y],
1477                        'loadASCIITestCase failed. test 1')
1478            self.failUnless( pimpatt == pactual.attributes,
1479                        'loadASCIITestCase failed. test 1.1')
1480        self.failUnless( dict['outline_segments'][0] == [0,1],
1481                        'loadASCIITestCase failed. test 3')
1482        for segimp,segactual in map(None,dict['outline_segment_tags'],seg):
1483            self.failUnless( segimp == segactual.tag,
1484                        'loadASCIITestCase failed. test 4')
1485        for holeimp,holeactual in map(None,dict['holes'],holes):
1486            self.failUnless( holeimp == [holeactual.x,holeactual.y],
1487                        'loadASCIITestCase failed. test 5')
1488        #for regimp,regactual in map(None,dict['regions'],regions):
1489         #   self.failUnless( [regimp[0],regimp[1]]==[regactual.x,regactual.y],
1490          #              'loadASCIITestCase failed. test 6')
1491           # self.failUnless( regimp[2] == regactual.getTag(),
1492            #            'loadASCIITestCase failed. test 7')
1493            #self.failUnless( regimp[3] == regactual.getMaxArea(),
1494             #           'loadASCIITestCase failed. test 7')
1495
1496           
1497        for regimp,regactual,regattimp, regmaxarea in map(None,dict['regions'],regions, dict['region_tags'], dict['region_max_areas']):
1498            self.failUnless( regimp == [regactual.x,regactual.y],
1499                        'loadASCIITestCase failed. test 6')
1500            self.failUnless( regattimp == regactual.getTag(),
1501                        'loadASCIITestCase failed. test 7')
1502            self.failUnless( regmaxarea == regactual.getMaxArea(),
1503                        'loadASCIITestCase failed. test 7')
1504
1505
1506#___________beginning of Peters tests
1507
1508    def test_set_stuff(self):
1509        """
1510        Documentation
1511        """
1512        #making a test mesh
1513        p0=[0.,2.]
1514        p1=[1.,2.]
1515        p2=[0.,1.]
1516        p3=[1.,1.]
1517        p4=[0.,0.]
1518        p5=[2.,0.]
1519        p6=[-1.,1.]
1520        point_list = [p0,p1,p2,p3,p4,p5,p6]
1521
1522        a0=[0]
1523        a1=[0]
1524        a2=[100]
1525        a3=[0]
1526        a4=[0]
1527        a5=[0]
1528        a6=[0]
1529        attribute=[a0,a1,a2,a3,a4,a5,a6]
1530       
1531        t0=[0,3,1]
1532        t1=[0,2,3]
1533        t2=[2,4,3]
1534        t3=[4,5,3]
1535        t4=[1,3,5]
1536        t5=[2,6,4]
1537
1538        n0=[4,-1,2]
1539        n1=[2,0,-1]
1540        n2=[3,1,5]
1541        n3=[4,2,-1]
1542        n4=[3,-1,0]
1543        n5=[-1,2,-1]
1544
1545        tri_list = [t0,t1,t2,t3,t4,t5]
1546        n_list = [n0,n1,n2,n3,n4,n5]
1547        for i in range(6):
1548            for j in (0,1,2):
1549                a=attribute[tri_list[i][j]]
1550                tri_list[i][j]=point_list[tri_list[i][j]]
1551                tri_list[i][j]=Vertex(tri_list[i][j][0]\
1552                                      ,tri_list[i][j][1],a)
1553            neighbours=n_list[i]
1554            tri_list[i]=Triangle(tri_list[i][0],\
1555                                 tri_list[i][1],tri_list[i][2]\
1556                                ,neighbors=neighbours)
1557
1558        #testing selectAll
1559        mesh = Mesh()
1560        mesh.attributeTitles=['attrib']
1561
1562        mesh.meshTriangles=tri_list
1563
1564        mesh.selectAllTriangles()
1565        A=mesh.sets[mesh.setID['All']]
1566        assert list_comp(tri_list,A)
1567
1568       #testing threshold
1569        mesh = Mesh()
1570        mesh.attributeTitles=['attrib']
1571
1572        mesh.meshTriangles=tri_list
1573        mesh.selectAllTriangles()
1574        mesh.threshold('All',min=30,max=35,attribute_name = 'attrib')
1575        A = [tri_list[1],tri_list[2],tri_list[5]]
1576        B = mesh.sets[mesh.setID['All']]
1577        assert list_comp(A,B)
1578       
1579
1580        A = [tri_list[3],tri_list[2],tri_list[5]]
1581        assert not list_comp(A,B)
1582
1583        #testing
1584
1585    def test_Discretised_Tuple_Set_rounding(self):
1586        #This is the hardest bit of DST
1587        from mesh import Discretised_Tuple_Set
1588
1589        tol = 0.1
1590        a=Discretised_Tuple_Set(p_rel=1,t_rel= tol)
1591        m = 0.541
1592        m_up = 0.6
1593        m_down = 0.5
1594        assert m_up == a.round_up_rel(m)
1595        assert m_down == a.round_down_rel(m)
1596
1597        tol = 0.1
1598        a=Discretised_Tuple_Set(p_rel=1,t_rel = tol)
1599        m = 0.539
1600        m_up = 0.5
1601        m_down = 0.5
1602        assert m_up == a.round_up_rel(m)
1603        assert m_down == a.round_down_rel(m)
1604
1605        tol = 0.5
1606        a=Discretised_Tuple_Set(p_rel=1,t_rel = tol)
1607
1608
1609        m = 0.6
1610        m_up = 0.7
1611        m_down = 0.5
1612        assert m_up == a.round_up_rel(m)
1613        assert m_down == a.round_down_rel(m)
1614
1615        m = 0.599
1616        m_up = 0.6
1617        m_down = 0.5
1618        assert m_up == a.round_up_rel(m)
1619        assert m_down == a.round_down_rel(m)
1620
1621    def test_Discretised_Tuple_Set_get(self):
1622        from mesh import Discretised_Tuple_Set
1623        tol = 0.25
1624        a=Discretised_Tuple_Set(p_rel=1,t_rel = tol)
1625        b = (1.1,1.1)
1626        a.append(b)
1627        list = [(1.2,1.),(1.,1.),(1.,1.2),(1.2,1.2)]
1628        for key in list:
1629            assert a[key][0]==b
1630            assert len(a[key])==1
1631       
1632        c = (2.1,1.)
1633        a.append(c)
1634        assert a[(2.,1.)][0]==c
1635        assert a[(2.2,1.)][0]==c
1636
1637    def test_mapped_Discretised_Tuple_Set(self):
1638
1639        from mesh import Mapped_Discretised_Tuple_Set
1640        from mesh import Discretised_Tuple_Set
1641
1642        def map(sequence):
1643            return [len(sequence)]
1644
1645        tol = 0.5
1646        a=Mapped_Discretised_Tuple_Set(map,p_rel=1,t_rel = tol)
1647        b = range(20)
1648        a.append(b)
1649        assert b in a[range(17)] 
1650        assert b in a[range(22)]
1651
1652        tol = 0.01
1653        a=Mapped_Discretised_Tuple_Set(map,p_rel=1,t_rel = tol)
1654        b = range(20)
1655        a.append(b)
1656        assert b in a[range(20)] 
1657        assert b in a[range(19)] 
1658        assert not range(17) in a
1659
1660#___________end of Peters tests
1661
1662    def test_add_region_from_polygon(self):
1663        m=Mesh()
1664        region = m.add_region_from_polygon([[0,0],[1,0],[0,1]],
1665                                  max_triangle_area = 88)
1666        self.failUnless(len(m.regions)==1,
1667                        'FAILED!')
1668        self.failUnless(region.getMaxArea()==88,
1669                        'FAILED!')
1670        self.failUnless(len(m.getUserSegments())==3,
1671                        'FAILED!')
1672        self.failUnless(len(m.userVertices)==3,
1673                        'FAILED!')
1674       
1675    def test_add_region_from_polygon2(self):
1676        m=Mesh()
1677        m.add_region_from_polygon([[0,0],[1,0],[1,1],[0,1]],
1678                               {'tagin':[0,1],'bom':[2]},
1679                                  max_triangle_area=10)
1680        self.failUnless(len(m.regions)==1,
1681                        'FAILED!')
1682        segs = m.getUserSegments()
1683        self.failUnless(len(segs)==4,
1684                        'FAILED!')
1685        self.failUnless(len(m.userVertices)==4,
1686                        'FAILED!') 
1687        self.failUnless(segs[0].tag=='tagin',
1688                        'FAILED!') 
1689        self.failUnless(segs[1].tag=='tagin',
1690                        'FAILED!') 
1691         
1692        self.failUnless(segs[2].tag=='bom',
1693                        'FAILED!') 
1694        self.failUnless(segs[3].tag=='',
1695                        'FAILED!') 
1696       
1697    def test_add_region_from_polygon3(self):
1698        x=-500
1699        y=-1000
1700        m=Mesh(geo_reference=Geo_reference(56,x,y))
1701
1702        # These are the absolute values
1703        polygon_absolute = [[0,0],[1,0],[1,1],[0,1]]
1704       
1705        x_p = -10
1706        y_p = -40
1707        geo_ref_poly = Geo_reference(56, x_p, y_p)
1708        polygon = geo_ref_poly.change_points_geo_ref(polygon_absolute)
1709       
1710        poly_point = m.add_region_from_polygon(polygon,
1711                                               {'tagin':[0,1],'bom':[2]},
1712                                               geo_reference=geo_ref_poly,
1713                                               max_triangle_area=10)
1714        # poly_point values are relative to the mesh geo-ref
1715        # make them absolute
1716        self.failUnless(inside_polygon([poly_point.x+x,poly_point.y+y],
1717                                       polygon_absolute, closed = False),
1718                        'FAILED!')
1719               
1720        self.failUnless(len(m.regions)==1,
1721                        'FAILED!')
1722        segs = m.getUserSegments()
1723        self.failUnless(len(segs)==4,
1724                        'FAILED!')
1725        self.failUnless(len(m.userVertices)==4,
1726                        'FAILED!') 
1727        self.failUnless(segs[0].tag=='tagin',
1728                        'FAILED!') 
1729        self.failUnless(segs[1].tag=='tagin',
1730                        'FAILED!') 
1731         
1732        self.failUnless(segs[2].tag=='bom',
1733                        'FAILED!') 
1734        self.failUnless(segs[3].tag=='',
1735                        'FAILED!')
1736        verts = m.getUserVertices()
1737        #print "User verts",verts
1738        #print 'polygon',polygon
1739        #vert values are relative
1740        for point,new_point in map(None,polygon,verts):
1741            point_x = point[0] + geo_ref_poly.get_xllcorner()
1742            new_point_x = new_point.x + m.geo_reference.get_xllcorner()
1743            point_y = point[1] + geo_ref_poly.get_yllcorner()
1744            #print "new_point.y",new_point.y
1745            #print "m.geo_ref.get_yllcorner()",m.geo_reference.get_yllcorner()
1746            new_point_y = new_point.y + m.geo_reference.get_yllcorner()
1747            #print "point_y",point_y
1748            #print "new_point_y",new_point_y
1749           
1750            self.failUnless(point_x == new_point_x, ' failed')
1751            self.failUnless(point_y == new_point_y, ' failed')
1752           
1753         
1754    def test_add_region_from_polygon4(self):
1755        x=50000
1756        y=1000
1757        m=Mesh(geo_reference=Geo_reference(56,x,y))
1758        polygon = [[0,0],[1,0],[1,1],[0,1]]
1759       
1760        m.add_region_from_polygon(polygon,
1761                               {'tagin':[0,1],'bom':[2]},
1762                                  max_triangle_area=10)
1763        self.failUnless(len(m.regions)==1,
1764                        'FAILED!')
1765        segs = m.getUserSegments()
1766        self.failUnless(len(segs)==4,
1767                        'FAILED!')
1768        self.failUnless(len(m.userVertices)==4,
1769                        'FAILED!') 
1770        self.failUnless(segs[0].tag=='tagin',
1771                        'FAILED!') 
1772        self.failUnless(segs[1].tag=='tagin',
1773                        'FAILED!') 
1774         
1775        self.failUnless(segs[2].tag=='bom',
1776                        'FAILED!') 
1777        self.failUnless(segs[3].tag=='',
1778                        'FAILED!')
1779        verts = m.getUserVertices()
1780        #print "User verts",verts
1781        #print 'polygon',polygon
1782        #vert values are relative
1783        for point,new_point in map(None,polygon,verts):
1784            point_x = point[0] 
1785            new_point_x = new_point.x + m.geo_reference.get_xllcorner()
1786            #print "point_x",point_x
1787            #print "new_point_x",new_point_x
1788            point_y = point[1] 
1789            new_point_y = new_point.y + m.geo_reference.get_yllcorner()
1790           
1791            self.failUnless(point_x == new_point_x, ' failed')
1792            self.failUnless(point_y == new_point_y, ' failed')
1793
1794
1795    def test_add_hole_from_polygon(self):
1796        x=-500
1797        y=-1000
1798        m=Mesh(geo_reference=Geo_reference(56,x,y))
1799
1800        # These are the absolute values
1801        polygon_absolute = [[0,0],[1,0],[1,1],[0,1]]
1802       
1803        x_p = -10
1804        y_p = -40
1805        geo_ref_poly = Geo_reference(56, x_p, y_p)
1806        polygon = geo_ref_poly.change_points_geo_ref(polygon_absolute)
1807       
1808        poly_point = m.add_hole_from_polygon(polygon,
1809                                               {'tagin':[0,1],'bom':[2]},
1810                                               geo_reference=geo_ref_poly)
1811        # poly_point values are relative to the mesh geo-ref
1812        # make them absolute
1813        #print "poly_point.x+x",poly_point.x+x
1814        #print "polygon_absolute", polygon_absolute
1815        self.failUnless(inside_polygon([poly_point.x+x,poly_point.y+y],
1816                                       polygon_absolute, closed = False),
1817                        'FAILED!')
1818               
1819        self.failUnless(len(m.holes)==1,
1820                        'FAILED!')
1821        segs = m.getUserSegments()
1822        self.failUnless(len(segs)==4,
1823                        'FAILED!')
1824        self.failUnless(len(m.userVertices)==4,
1825                        'FAILED!') 
1826        self.failUnless(segs[0].tag=='tagin',
1827                        'FAILED!') 
1828        self.failUnless(segs[1].tag=='tagin',
1829                        'FAILED!') 
1830         
1831        self.failUnless(segs[2].tag=='bom',
1832                        'FAILED!') 
1833        self.failUnless(segs[3].tag=='',
1834                        'FAILED!')
1835        verts = m.getUserVertices()
1836        #print "User verts",verts
1837        #print 'polygon',polygon
1838        #vert values are relative
1839        for point,new_point in map(None,polygon,verts):
1840            point_x = point[0] + geo_ref_poly.get_xllcorner()
1841            new_point_x = new_point.x + m.geo_reference.get_xllcorner()
1842            point_y = point[1] + geo_ref_poly.get_yllcorner()
1843            #print "new_point.y",new_point.y
1844            #print "m.geo_ref.get_yllcorner()",m.geo_reference.get_yllcorner()
1845            new_point_y = new_point.y + m.geo_reference.get_yllcorner()
1846            #print "point_y",point_y
1847            #print "new_point_y",new_point_y
1848           
1849            self.failUnless(point_x == new_point_x, ' failed')
1850            self.failUnless(point_y == new_point_y, ' failed')
1851
1852    def test_add_circle(self):
1853        x=-500
1854        y=-1000
1855        m=Mesh(geo_reference=Geo_reference(56,x,y))
1856
1857        # These are the absolute values
1858        tag = 'hey'
1859        segment_count = 104
1860        radius = 30
1861        circle_center_absolute = [100,80]       
1862        x_p = -.666
1863        y_p = -.777
1864        geo_ref_poly = Geo_reference(56, x_p, y_p)
1865        circle_center = \
1866                geo_ref_poly.change_points_geo_ref(circle_center_absolute)
1867        circle_center = circle_center[0] #make a list of lists a list
1868        poly_point = m.add_circle(circle_center, radius, segment_count,
1869                                  tag=tag,
1870                                  region=True,
1871                                  center_geo_reference=geo_ref_poly)
1872        # poly_point values are relative to the mesh geo-ref
1873        # make them absolute
1874        #print "poly_point.x+x",poly_point.x+x
1875        #print "polygon_absolute", polygon_absolute
1876     
1877       
1878        m.export_mesh_file("aaat.msh")
1879       
1880        self.failUnless(len(m.regions)==1,
1881                        'FAILED!')
1882        segs = m.getUserSegments()
1883        self.failUnless(len(segs)==segment_count,
1884                        'FAILED!')
1885        self.failUnless(len(m.userVertices)==segment_count,
1886                        'FAILED!') 
1887        self.failUnless(segs[0].tag==tag,
1888                        'FAILED!') 
1889        self.failUnless(segs[1].tag==tag,
1890                        'FAILED!') 
1891         
1892        verts = m.getUserVertices()
1893       
1894        m.export_mesh_file("aaat.msh")
1895       
1896    def FIXMEtest_auto_set_geo_reference(self):
1897        x=50000
1898        y=1000
1899        m=Mesh(geo_reference=Geo_reference(56,x,y))
1900        polygon = [[0,0],[1,0],[1,1],[0,1]]
1901       
1902        m.add_region_from_polygon(polygon,
1903                               {'tagin':[0,1],'bom':[2]},
1904                                  max_triangle_area=10)
1905        m.auto_set_geo_reference()
1906       
1907       
1908def list_comp(A,B):
1909    yes = len(A)==len(B)
1910    for item in A:
1911        if not item in B:
1912            yes = False
1913    return yes
1914
1915#-------------------------------------------------------------
1916if __name__ == "__main__":
1917    #suite = unittest.makeSuite(meshTestCase,'test')
1918    suite = unittest.makeSuite(meshTestCase,'test_import_mesh')
1919    runner = unittest.TextTestRunner() #verbosity=2)
1920    runner.run(suite)
1921   
Note: See TracBrowser for help on using the repository browser.