source: inundation/pmesh/test_mesh.py @ 3085

Last change on this file since 3085 was 3013, checked in by duncan, 19 years ago

fixing the black screen of death bug at the mesh generation end.

File size: 73.2 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 testisUserSegmentNewII (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"
994                        ,
995                        'exported Ascii xya file is wrong')
996           
997    def test_exportPointsFilefile2(self):
998        m = Mesh()
999       
1000        fileName = tempfile.mktemp(".xya")
1001        m.exportPointsFile(fileName)
1002        file = open(fileName)
1003        lFile = file.read().split('\n')
1004        file.close()
1005
1006        os.remove(fileName)
1007        #print "************* test_mesh exportPointsFilefile"
1008        #print "lFile",lFile
1009        #print "************* test_mesh exportPointsFilefile"
1010        self.failUnless(lFile[0] == "" 
1011                        ,
1012                        'exported Ascii xya file is wrong')
1013       
1014    def test_strings2ints(self):
1015        list = ["sea","river inlet","","sea","","moat"]
1016        preset = ["moat", "internal boundary"]
1017        [intlist, converter] = segment_strings2ints(list,preset )
1018        self.failUnless(intlist == [2,3 ,0 ,2 ,0 ,0 ]
1019                        ,
1020                        'test_strings2ints produces bad intlist')
1021        self.failUnless(converter == ['moat', 'internal boundary',
1022                                      'sea', 'river inlet']
1023                        ,
1024                        'test_strings2ints produces bad converter')
1025       
1026    def test_ints2strings(self):
1027        list = ["internal boundary","sea","river inlet",
1028            "","sea","","moat","internal boundary"]
1029        outlist = ['internal boundary', 'sea', 'river inlet', 'moat',
1030                   'sea', 'moat', 'moat', 'internal boundary']
1031        preset = ["moat", "internal boundary"]
1032        [intlist, converter] = segment_strings2ints(list,preset )
1033        newlist = segment_ints2strings(intlist, converter)
1034        self.failUnless(outlist == newlist
1035                        ,
1036                        'test_strings2ints produces bad intlist')
1037        self.failUnless(converter == ['moat', 'internal boundary',
1038                                      'sea', 'river inlet']
1039                        ,
1040                        'test_strings2ints produces bad converter')
1041       
1042    def test_ints2strings2(self):
1043        list = ["","",""]
1044        preset = ["moat", "internal boundary"]
1045        [intlist, converter] = segment_strings2ints(list,preset )
1046        newlist = segment_ints2strings(intlist, converter)
1047        outlist = ['moat', 'moat', 'moat']
1048        self.failUnless(outlist == newlist
1049                        ,
1050                        'test_strings2ints produces bad intlist')
1051        self.failUnless(converter == ['moat', 'internal boundary']
1052                        ,
1053                        'test_strings2ints produces bad converter')
1054
1055       
1056    def test_removeDuplicatedVertices(self):
1057        a = Vertex (0,0)
1058        a.index = 0
1059        b = Vertex (0,3)
1060        b.index = 1
1061        c = Vertex (3,3)
1062        c.index = 2
1063        d = Vertex (1,1)
1064        d.index = 3
1065        e = Vertex (3,1)
1066        e.index = 4
1067        f = Vertex (1,1)
1068        f.index = 5
1069        g = Vertex (1,1)
1070        g.index = 6
1071        inputVerts_noDups = [a,b,c,d,e]
1072       
1073        m = Mesh(userVertices=[a,b,c,d,e,f,g])
1074        counter = m.removeDuplicatedUserVertices()
1075        UserVerts = m.getUserVertices()
1076       
1077         
1078        self.failUnless(UserVerts == inputVerts_noDups,
1079                            'duplicate verts not removed')
1080        #for userVert, inputVert in map(None, UserVerts, inputVerts_noDups):
1081        #    self.failUnless(userVert.x == inputVert.x,
1082        #                    'x duplicate verts not removed')
1083        #    self.failUnless(userVert.y == inputVert.y,
1084        #                    'y duplicate verts not removed')
1085
1086       
1087    def test_ungenerateFileLoading(self):
1088       
1089        fileName = tempfile.mktemp(".txt")
1090        file = open(fileName,"w")
1091        file.write("         1       ??      ??\n\
1092       0.0       0.0\n\
1093       1.0       0.0\n\
1094       1.0       1.0\n\
1095       0.0       1.0\n\
1096       0.0       0.0\n\
1097END\n\
1098         2      ?? ??\n\
1099       10.0       10.0\n\
1100       10.0       20.0\n\
1101       20.0       20.0\n\
1102       10.0       10.0\n\
1103END\n\
1104END\n")
1105        file.close()
1106       
1107       
1108        a = Vertex (0.0, 0.0) #, attributes = [1.1])
1109        b = Vertex (0.0, 40.0) #, attributes = [1.2])
1110        c = Vertex (40.0,40.0) #, attributes = [1.3])
1111        d = Vertex (40.0,0.0) #, attributes = [1.4])
1112   
1113        s1 = Segment(a,b)
1114        s2 = Segment(b,c)
1115        s3 = Segment(c,d)
1116        s4 = Segment(d,a)
1117     
1118        m = Mesh(userVertices=[a,b,c,d], userSegments=[s1,s2,s3,s4])
1119        dict = importUngenerateFile(fileName)
1120        os.remove(fileName)
1121
1122        tag = "DSG"
1123        Segment.set_default_tag(tag)
1124        m.addVertsSegs(dict)
1125
1126        # have to reset this , since it's a class attribute
1127        Segment.set_default_tag("")
1128           
1129        self.failUnless(len(m.userSegments) ==11,
1130                        'Wrong segment list length.')
1131        self.failUnless(len(m.userVertices) == 11,
1132                        'Wrong vertex list length.')
1133        self.failUnless(m.userSegments[10].vertices[0] == m.userVertices[10],
1134                        'bad vertex on segment.')
1135        self.failUnless(m.userSegments[10].vertices[1] == m.userVertices[8],
1136                        'Bad segment.')
1137        self.failUnless(m.userSegments[10].tag == tag,
1138                        'wrong tag.')
1139   
1140    def test_ungenerateFileLoadingII(self):
1141       
1142        fileName = tempfile.mktemp(".txt")
1143        file = open(fileName,"w")
1144        file.write("         1       ??      ??\n\
1145       0.0       0.0\n\
1146       1.0       0.0\n\
1147       1.0       1.0\n\
1148       0.0       1.0\n\
1149       0.0       0.0\n\
1150END\n\
1151         2      ?? ??\n\
1152       10.0       10.0\n\
1153       10.0       20.0\n\
1154       20.0       20.0\n\
1155END\n\
1156END\n")
1157        file.close()
1158       
1159       
1160        a = Vertex (0.0, 0.0) #, attributes = [1.1])
1161        b = Vertex (0.0, 40.0) #, attributes = [1.2])
1162        c = Vertex (40.0,40.0) #, attributes = [1.3])
1163        d = Vertex (40.0,0.0) #, attributes = [1.4])
1164   
1165        s1 = Segment(a,b)
1166        s2 = Segment(b,c)
1167        s3 = Segment(c,d)
1168        s4 = Segment(d,a)
1169     
1170        m = Mesh(userVertices=[a,b,c,d], userSegments=[s1,s2,s3,s4])
1171        dict = importUngenerateFile(fileName)
1172        os.remove(fileName)
1173
1174        tag = "DSG"
1175        Segment.set_default_tag(tag)
1176        m.addVertsSegs(dict)
1177
1178        self.failUnless(len(m.userSegments) ==10,
1179                        'Wrong segment list length.')
1180        self.failUnless(len(m.userVertices) == 11,
1181                        'Wrong vertex list length.')
1182       
1183    def test_addVertsSegs(self):
1184        m = Mesh()
1185        Segment.set_default_tag("food")
1186        dict = {}
1187        dict['points'] = [[0.0, 0.0], [1.0, 0.0], [1.0, 1.0]]
1188        dict['segments'] = [[0, 1], [1, 2]]
1189        dict['segment_tags'] = ['','do-op']
1190        m.addVertsSegs(dict)
1191        # have to reset this , since it's a class attribute
1192        Segment.set_default_tag("")
1193
1194       
1195        self.failUnless(len(m.userSegments) ==2,
1196                        'Wrong segment list length.')
1197        self.failUnless(len(m.userVertices) == 3,
1198                        'Wrong vertex list length.')
1199        self.failUnless(m.userSegments[0].tag =='food',
1200                        'Wrong segment tag length.')
1201        self.failUnless(m.userSegments[1].tag =='do-op',
1202                        'Wrong segment tag.')
1203       
1204    def test_addVertsSegs2(self):
1205        geo = Geo_reference(56,5,10)
1206        m = Mesh(geo_reference=geo)
1207        dict = {}
1208        dict['points'] = [[2.0, 1.0], [3.0, 1.0], [2.0, 2.0]]
1209        dict['segments'] = [[0, 1], [1, 2], [2,0]]
1210        dict['segment_tags'] = ['','do-op','']
1211        m.addVertsSegs(dict)
1212
1213    def test_exportASCIImeshfile(self):
1214   
1215        #a_att = [5,2]
1216        #d_att =[4,2]
1217        #f_att = [3,2]
1218        #e_att = [2,2]
1219        a_xy = [0.0, 0.0]
1220        a = Vertex ( a_xy[0],a_xy[1]) #, attributes =a_att)
1221        d = Vertex (0.0, 4.0) #, attributes =d_att)
1222        f = Vertex (4.0,0.0) #, attributes =f_att)
1223        e = Vertex (1.0,1.0) #, attributes =e_att)
1224   
1225        s1 = Segment(a,d, tag = "50")
1226        s2 = Segment(d,f, tag = "40")
1227        s3 = Segment(a,f, tag = "30")
1228        s4 = Segment(a,e, tag = "20")
1229     
1230        r1 = Region(0.3, 0.3,tag = "1.3", maxArea = 36)
1231
1232
1233        h1 = Hole(0.2,0.6)
1234       
1235        m = Mesh(userVertices=[a,d,f,e],
1236                 userSegments=[s1,s2,s3,s4],
1237                 regions=[r1],
1238                 holes=[h1])
1239
1240        seg = m.getUserSegments()
1241        points = m.getUserVertices()
1242        holes = m.getHoles()
1243        regions = m.getRegions()
1244        fileName = tempfile.mktemp(".tsh")
1245        m.export_mesh_file(fileName)
1246        #print "***************************fileName", fileName
1247        new_m = importMeshFromFile(fileName)
1248        os.remove(fileName)
1249       
1250
1251        #print '**@@@@@******'
1252        #print "new_m",new_m
1253        #print '**@@@@@******'
1254        #print "m",m
1255        #print '**@@@@@******'
1256       
1257        self.failUnless( new_m == m,
1258                         'loadASCIITestCase failed. test new 1')
1259           
1260    def test_Mesh2MeshList(self):
1261
1262        a_att = [5,2]
1263        d_att =[4,2]
1264        f_att = [3,2]
1265        e_att = [2,2]
1266        a_xy = [0.0, 0.0]
1267        a = Vertex ( a_xy[0],a_xy[1]) #, attributes =a_att)
1268        d = Vertex (0.0, 4.0) #, attributes =d_att)
1269        f = Vertex (4.0,0.0) #, attributes =f_att)
1270        e = Vertex (1.0,1.0) #, attributes =e_att)
1271   
1272        s1 = Segment(a,d, tag = "50")
1273        s2 = Segment(d,f, tag = "40")
1274        s3 = Segment(a,f, tag = "30")
1275        s4 = Segment(a,e, tag = "20")
1276     
1277        r1 = Region(0.3, 0.3,tag = "1.3", maxArea = 45)
1278        m = Mesh(userVertices=[a,d,f,e],
1279                 userSegments=[s1,s2,s3,s4],
1280                 regions=[r1])
1281
1282        m.generateMesh("Qa2.1")
1283
1284        seg = m.getMeshSegments()
1285        points = m.getMeshVertices()
1286        dict = m.Mesh2MeshList()
1287        #print "dict",dict
1288        # test not finished...
1289 
1290    def test_Mesh2IOTriangulationDict(self):
1291
1292        a_att = [5,2]
1293        d_att =[4,2]
1294        f_att = [3,2]
1295        e_att = [2,2]
1296        a_xy = [0.0, 0.0]
1297        a = Vertex ( a_xy[0],a_xy[1] , attributes =a_att)
1298        d = Vertex (0.0, 4.0 , attributes =d_att)
1299        f = Vertex (4.0,0.0 , attributes =f_att)
1300        e = Vertex (1.0,1.0 , attributes =e_att)
1301   
1302        s1 = Segment(a,d, tag = "50")
1303        s2 = Segment(d,f, tag = "40")
1304        s3 = Segment(a,f, tag = "30")
1305        s4 = Segment(a,e, tag = "20")
1306     
1307        r1 = Region(0.3, 0.3,tag = "1.3", maxArea = 45)
1308        m = Mesh(userVertices=[a,d,f,e],
1309                 userSegments=[s1,s2,s3,s4],
1310                 regions=[r1])
1311        titles = ['ele','friction']
1312        m.attributeTitles = titles
1313        m.generateMesh("Qa2.1")
1314
1315        seg = m.getMeshSegments()
1316        verts = m.getMeshVertices()
1317        dict = m.Mesh2IOTriangulationDict()
1318        #print "dict",dict
1319       
1320        self.failUnless( dict['vertex_attribute_titles'] == titles,
1321                         'test_Mesh2IOTriangulationDict failed. test 1')
1322        answer = [a_xy,[0.0, 4.0],[4.0,0.0], [1.0,1.0], [2.0,2.0]]
1323        #print "answer",answer
1324        #print "dict['vertices']",dict['vertices']
1325       
1326        self.failUnless( dict['vertices'] == answer,
1327                         'test_Mesh2IOTriangulationDict failed. test 2')
1328
1329       
1330        for pimport,pactual,pimpatt in map(None,dict['vertices'],
1331                                           verts,dict['vertex_attributes']):
1332            #assert all_close( pimport, (pactual.x,pactual.y))
1333            self.failUnless( pimport == [pactual.x,pactual.y],
1334                        'test_Mesh2IOTriangulationDict failed. test 2.1')
1335            self.failUnless( pimpatt == pactual.attributes,
1336                        'test_Mesh2IOTriangulationDict failed. test 2.2')
1337        self.failUnless( dict['segments'][0] == [0,1],
1338                        'test_Mesh2IOTriangulationDict failed. test 3')
1339        for segimp,segactual in map(None,dict['segment_tags'],seg):
1340            self.failUnless( segimp == segactual.tag,
1341                        'test_Mesh2IOTriangulationDict failed. test 4')
1342        #print " dict['triangles'][0]", dict['triangles'][0]
1343        self.failUnless( dict['triangles'][0] == [3,2,4],
1344                        'test_Mesh2IOTriangulationDict failed. test 5')
1345        self.failUnless( dict['triangle_neighbors'][0] == [-1,2,3],
1346                        'test_Mesh2IOTriangulationDict failed. test 6')
1347        self.failUnless( dict['triangle_tags'][0] == "1.3",
1348                         'test_Mesh2IOTriangulationDict failed. test 7')
1349
1350 
1351    def test_Mesh2IODict(self):
1352
1353        a_att = [5,2]
1354        d_att =[4,2]
1355        f_att = [3,2]
1356        e_att = [2,2]
1357        a_xy = [0.0, 0.0]
1358        a = Vertex ( a_xy[0],a_xy[1] , attributes =a_att)
1359        d = Vertex (0.0, 4.0 , attributes =d_att)
1360        f = Vertex (4.0,0.0 , attributes =f_att)
1361        e = Vertex (1.0,1.0 , attributes =e_att)
1362   
1363        s1 = Segment(a,d, tag = "50")
1364        s2 = Segment(d,f, tag = "40")
1365        s3 = Segment(a,f, tag = "30")
1366        s4 = Segment(a,e, tag = "20")
1367     
1368        r1 = Region(0.3, 0.3,tag = "1.3", maxArea = 45)
1369        m = Mesh(userVertices=[a,d,f,e],
1370                 userSegments=[s1,s2,s3,s4],
1371                 regions=[r1])
1372        titles = ['ele','friction']
1373        m.attributeTitles = titles
1374        m.generateMesh("Qa2.1")
1375
1376        seg = m.getMeshSegments()
1377        verts = m.getMeshVertices()
1378        dict = m.Mesh2IODict()
1379        #print "dict",dict
1380       
1381        self.failUnless( dict['vertex_attribute_titles'] == titles,
1382                         'test_Mesh2IOTriangulationDict failed. test 1')
1383        answer = [a_xy,[0.0, 4.0],[4.0,0.0], [1.0,1.0], [2.0,2.0]]
1384        #print "answer",answer
1385        #print "dict['vertices']",dict['vertices']
1386       
1387        self.failUnless( dict['vertices'] == answer,
1388                         'test_Mesh2IOTriangulationDict failed. test 2')
1389
1390       
1391        for pimport,pactual,pimpatt in map(None,dict['vertices'],
1392                                           verts,dict['vertex_attributes']):
1393            #assert all_close( pimport, (pactual.x,pactual.y))
1394            self.failUnless( pimport == [pactual.x,pactual.y],
1395                        'test_Mesh2IODict failed. test 2.1')
1396            self.failUnless( pimpatt == pactual.attributes,
1397                        'test_Mesh2IODict failed. test 2.2')
1398        self.failUnless( dict['segments'][0] == [0,1],
1399                        'test_Mesh2IODict failed. test 3')
1400        for segimp,segactual in map(None,dict['segment_tags'],seg):
1401            self.failUnless( segimp == segactual.tag,
1402                        'test_Mesh2IODict failed. test 4')
1403        #print " dict['triangles'][0]", dict['triangles'][0]
1404        self.failUnless( dict['triangles'][0] == [3,2,4],
1405                        'test_Mesh2IODict failed. test 5')
1406        self.failUnless( dict['triangle_neighbors'][0] == [-1,2,3],
1407                        'test_Mesh2IODict failed. test 6')
1408        self.failUnless( dict['triangle_tags'][0] == "1.3",
1409                         'test_Mesh2IODict failed. test 7')
1410
1411        seg = m.getUserSegments()
1412        points = m.getUserVertices()
1413        holes = m.getHoles()
1414        regions = m.getRegions()
1415       
1416        for pimport,pactual,pimpatt in map(None,dict['points'],points,dict['point_attributes']):
1417            self.failUnless( pimport == [pactual.x,pactual.y],
1418                        'test_Mesh2IODict failed. test 1')
1419            self.failUnless( pimpatt == pactual.attributes,
1420                        'test_Mesh2IODict failed. test 1.1')
1421        self.failUnless( dict['outline_segments'][0] == [0,1],
1422                        'test_Mesh2IODict failed. test 3')
1423        for segimp,segactual in map(None,dict['outline_segment_tags'],seg):
1424            self.failUnless( segimp == segactual.tag,
1425                        'test_Mesh2IODict failed. test 4')
1426        for holeimp,holeactual in map(None,dict['holes'],holes):
1427            self.failUnless( holeimp == [holeactual.x,holeactual.y],
1428                        'test_Mesh2IODict failed. test 5')
1429       
1430        for regimp,regactual,regattimp, regmaxarea in map(None,dict['regions'],regions, dict['region_tags'], dict['region_max_areas']):
1431            self.failUnless( regimp == [regactual.x,regactual.y],
1432                        'loadASCIITestCase failed. test 6')
1433            self.failUnless( regattimp == regactual.getTag(),
1434                        'loadASCIITestCase failed. test 7')
1435            self.failUnless( regmaxarea == regactual.getMaxArea(),
1436                        'loadASCIITestCase failed. test 7')
1437   
1438           
1439       
1440    def test_Mesh2IOOutlineDict(self):
1441
1442        a_att = [5,2]
1443        d_att =[4,2]
1444        f_att = [3,2]
1445        e_att = [2,2]
1446        a_xy = [0.0, 0.0]
1447        a = Vertex ( a_xy[0],a_xy[1] , attributes =a_att)
1448        d = Vertex (0.0, 4.0 , attributes =d_att)
1449        f = Vertex (4.0,0.0 , attributes =f_att)
1450        e = Vertex (1.0,1.0 , attributes =e_att)
1451   
1452        s1 = Segment(a,d, tag = "50")
1453        s2 = Segment(d,f, tag = "40")
1454        s3 = Segment(a,f, tag = "30")
1455        s4 = Segment(a,e, tag = "20")
1456     
1457        r1 = Region(0.3, 0.3,tag = "1.3", maxArea = 45)
1458        m = Mesh(userVertices=[a,d,f,e],
1459                 userSegments=[s1,s2,s3,s4],
1460                 regions=[r1])
1461        titles = ['ele','friction']
1462        m.attributeTitles = titles
1463        m.generateMesh("Qa2.1")
1464
1465        seg = m.getMeshSegments()
1466        verts = m.getMeshVertices()
1467        dict = m.Mesh2IOOutlineDict()
1468       
1469        seg = m.getUserSegments()
1470        points = m.getUserVertices()
1471        holes = m.getHoles()
1472        regions = m.getRegions()
1473       
1474        for pimport,pactual,pimpatt in map(None,dict['points'],points,dict['point_attributes']):
1475            self.failUnless( pimport == [pactual.x,pactual.y],
1476                        'loadASCIITestCase failed. test 1')
1477            self.failUnless( pimpatt == pactual.attributes,
1478                        'loadASCIITestCase failed. test 1.1')
1479        self.failUnless( dict['outline_segments'][0] == [0,1],
1480                        'loadASCIITestCase failed. test 3')
1481        for segimp,segactual in map(None,dict['outline_segment_tags'],seg):
1482            self.failUnless( segimp == segactual.tag,
1483                        'loadASCIITestCase failed. test 4')
1484        for holeimp,holeactual in map(None,dict['holes'],holes):
1485            self.failUnless( holeimp == [holeactual.x,holeactual.y],
1486                        'loadASCIITestCase failed. test 5')
1487        #for regimp,regactual in map(None,dict['regions'],regions):
1488         #   self.failUnless( [regimp[0],regimp[1]]==[regactual.x,regactual.y],
1489          #              'loadASCIITestCase failed. test 6')
1490           # self.failUnless( regimp[2] == regactual.getTag(),
1491            #            'loadASCIITestCase failed. test 7')
1492            #self.failUnless( regimp[3] == regactual.getMaxArea(),
1493             #           'loadASCIITestCase failed. test 7')
1494
1495           
1496        for regimp,regactual,regattimp, regmaxarea in map(None,dict['regions'],regions, dict['region_tags'], dict['region_max_areas']):
1497            self.failUnless( regimp == [regactual.x,regactual.y],
1498                        'loadASCIITestCase failed. test 6')
1499            self.failUnless( regattimp == regactual.getTag(),
1500                        'loadASCIITestCase failed. test 7')
1501            self.failUnless( regmaxarea == regactual.getMaxArea(),
1502                        'loadASCIITestCase failed. test 7')
1503
1504
1505#___________beginning of Peters tests
1506
1507    def test_set_stuff(self):
1508        """
1509        Documentation
1510        """
1511        #making a test mesh
1512        p0=[0.,2.]
1513        p1=[1.,2.]
1514        p2=[0.,1.]
1515        p3=[1.,1.]
1516        p4=[0.,0.]
1517        p5=[2.,0.]
1518        p6=[-1.,1.]
1519        point_list = [p0,p1,p2,p3,p4,p5,p6]
1520
1521        a0=[0]
1522        a1=[0]
1523        a2=[100]
1524        a3=[0]
1525        a4=[0]
1526        a5=[0]
1527        a6=[0]
1528        attribute=[a0,a1,a2,a3,a4,a5,a6]
1529       
1530        t0=[0,3,1]
1531        t1=[0,2,3]
1532        t2=[2,4,3]
1533        t3=[4,5,3]
1534        t4=[1,3,5]
1535        t5=[2,6,4]
1536
1537        n0=[4,-1,2]
1538        n1=[2,0,-1]
1539        n2=[3,1,5]
1540        n3=[4,2,-1]
1541        n4=[3,-1,0]
1542        n5=[-1,2,-1]
1543
1544        tri_list = [t0,t1,t2,t3,t4,t5]
1545        n_list = [n0,n1,n2,n3,n4,n5]
1546        for i in range(6):
1547            for j in (0,1,2):
1548                a=attribute[tri_list[i][j]]
1549                tri_list[i][j]=point_list[tri_list[i][j]]
1550                tri_list[i][j]=Vertex(tri_list[i][j][0]\
1551                                      ,tri_list[i][j][1],a)
1552            neighbours=n_list[i]
1553            tri_list[i]=Triangle(tri_list[i][0],\
1554                                 tri_list[i][1],tri_list[i][2]\
1555                                ,neighbors=neighbours)
1556
1557        #testing selectAll
1558        mesh = Mesh()
1559        mesh.attributeTitles=['attrib']
1560
1561        mesh.meshTriangles=tri_list
1562
1563        mesh.selectAllTriangles()
1564        A=mesh.sets[mesh.setID['All']]
1565        assert list_comp(tri_list,A)
1566
1567       #testing threshold
1568        mesh = Mesh()
1569        mesh.attributeTitles=['attrib']
1570
1571        mesh.meshTriangles=tri_list
1572        mesh.selectAllTriangles()
1573        mesh.threshold('All',min=30,max=35,attribute_name = 'attrib')
1574        A = [tri_list[1],tri_list[2],tri_list[5]]
1575        B = mesh.sets[mesh.setID['All']]
1576        assert list_comp(A,B)
1577       
1578
1579        A = [tri_list[3],tri_list[2],tri_list[5]]
1580        assert not list_comp(A,B)
1581
1582        #testing
1583
1584    def test_Discretised_Tuple_Set_rounding(self):
1585        #This is the hardest bit of DST
1586        from mesh import Discretised_Tuple_Set
1587
1588        tol = 0.1
1589        a=Discretised_Tuple_Set(p_rel=1,t_rel= tol)
1590        m = 0.541
1591        m_up = 0.6
1592        m_down = 0.5
1593        assert m_up == a.round_up_rel(m)
1594        assert m_down == a.round_down_rel(m)
1595
1596        tol = 0.1
1597        a=Discretised_Tuple_Set(p_rel=1,t_rel = tol)
1598        m = 0.539
1599        m_up = 0.5
1600        m_down = 0.5
1601        assert m_up == a.round_up_rel(m)
1602        assert m_down == a.round_down_rel(m)
1603
1604        tol = 0.5
1605        a=Discretised_Tuple_Set(p_rel=1,t_rel = tol)
1606
1607
1608        m = 0.6
1609        m_up = 0.7
1610        m_down = 0.5
1611        assert m_up == a.round_up_rel(m)
1612        assert m_down == a.round_down_rel(m)
1613
1614        m = 0.599
1615        m_up = 0.6
1616        m_down = 0.5
1617        assert m_up == a.round_up_rel(m)
1618        assert m_down == a.round_down_rel(m)
1619
1620    def test_Discretised_Tuple_Set_get(self):
1621        from mesh import Discretised_Tuple_Set
1622        tol = 0.25
1623        a=Discretised_Tuple_Set(p_rel=1,t_rel = tol)
1624        b = (1.1,1.1)
1625        a.append(b)
1626        list = [(1.2,1.),(1.,1.),(1.,1.2),(1.2,1.2)]
1627        for key in list:
1628            assert a[key][0]==b
1629            assert len(a[key])==1
1630       
1631        c = (2.1,1.)
1632        a.append(c)
1633        assert a[(2.,1.)][0]==c
1634        assert a[(2.2,1.)][0]==c
1635
1636    def test_mapped_Discretised_Tuple_Set(self):
1637
1638        from mesh import Mapped_Discretised_Tuple_Set
1639        from mesh import Discretised_Tuple_Set
1640
1641        def map(sequence):
1642            return [len(sequence)]
1643
1644        tol = 0.5
1645        a=Mapped_Discretised_Tuple_Set(map,p_rel=1,t_rel = tol)
1646        b = range(20)
1647        a.append(b)
1648        assert b in a[range(17)] 
1649        assert b in a[range(22)]
1650
1651        tol = 0.01
1652        a=Mapped_Discretised_Tuple_Set(map,p_rel=1,t_rel = tol)
1653        b = range(20)
1654        a.append(b)
1655        assert b in a[range(20)] 
1656        assert b in a[range(19)] 
1657        assert not range(17) in a
1658
1659#___________end of Peters tests
1660
1661    def test_add_region_from_polygon(self):
1662        m=Mesh()
1663        region = m.add_region_from_polygon([[0,0],[1,0],[0,1]],
1664                                  max_triangle_area = 88)
1665        self.failUnless(len(m.regions)==1,
1666                        'FAILED!')
1667        self.failUnless(region.getMaxArea()==88,
1668                        'FAILED!')
1669        self.failUnless(len(m.getUserSegments())==3,
1670                        'FAILED!')
1671        self.failUnless(len(m.userVertices)==3,
1672                        'FAILED!')
1673       
1674    def test_add_region_from_polygon2(self):
1675        m=Mesh()
1676        m.add_region_from_polygon([[0,0],[1,0],[1,1],[0,1]],
1677                               {'tagin':[0,1],'bom':[2]},
1678                                  max_triangle_area=10)
1679        self.failUnless(len(m.regions)==1,
1680                        'FAILED!')
1681        segs = m.getUserSegments()
1682        self.failUnless(len(segs)==4,
1683                        'FAILED!')
1684        self.failUnless(len(m.userVertices)==4,
1685                        'FAILED!') 
1686        self.failUnless(segs[0].tag=='tagin',
1687                        'FAILED!') 
1688        self.failUnless(segs[1].tag=='tagin',
1689                        'FAILED!') 
1690         
1691        self.failUnless(segs[2].tag=='bom',
1692                        'FAILED!') 
1693        self.failUnless(segs[3].tag=='',
1694                        'FAILED!') 
1695       
1696    def test_add_region_from_polygon3(self):
1697        x=-500
1698        y=-1000
1699        m=Mesh(geo_reference=Geo_reference(56,x,y))
1700
1701        # These are the absolute values
1702        polygon_absolute = [[0,0],[1,0],[1,1],[0,1]]
1703       
1704        x_p = -10
1705        y_p = -40
1706        geo_ref_poly = Geo_reference(56, x_p, y_p)
1707        polygon = geo_ref_poly.change_points_geo_ref(polygon_absolute)
1708       
1709        poly_point = m.add_region_from_polygon(polygon,
1710                                               {'tagin':[0,1],'bom':[2]},
1711                                               geo_reference=geo_ref_poly,
1712                                               max_triangle_area=10)
1713        # poly_point values are relative to the mesh geo-ref
1714        # make them absolute
1715        self.failUnless(inside_polygon([poly_point.x+x,poly_point.y+y],
1716                                       polygon_absolute, closed = False),
1717                        'FAILED!')
1718               
1719        self.failUnless(len(m.regions)==1,
1720                        'FAILED!')
1721        segs = m.getUserSegments()
1722        self.failUnless(len(segs)==4,
1723                        'FAILED!')
1724        self.failUnless(len(m.userVertices)==4,
1725                        'FAILED!') 
1726        self.failUnless(segs[0].tag=='tagin',
1727                        'FAILED!') 
1728        self.failUnless(segs[1].tag=='tagin',
1729                        'FAILED!') 
1730         
1731        self.failUnless(segs[2].tag=='bom',
1732                        'FAILED!') 
1733        self.failUnless(segs[3].tag=='',
1734                        'FAILED!')
1735        verts = m.getUserVertices()
1736        #print "User verts",verts
1737        #print 'polygon',polygon
1738        #vert values are relative
1739        for point,new_point in map(None,polygon,verts):
1740            point_x = point[0] + geo_ref_poly.get_xllcorner()
1741            new_point_x = new_point.x + m.geo_reference.get_xllcorner()
1742            point_y = point[1] + geo_ref_poly.get_yllcorner()
1743            #print "new_point.y",new_point.y
1744            #print "m.geo_ref.get_yllcorner()",m.geo_reference.get_yllcorner()
1745            new_point_y = new_point.y + m.geo_reference.get_yllcorner()
1746            #print "point_y",point_y
1747            #print "new_point_y",new_point_y
1748           
1749            self.failUnless(point_x == new_point_x, ' failed')
1750            self.failUnless(point_y == new_point_y, ' failed')
1751           
1752         
1753    def test_add_region_from_polygon4(self):
1754        x=50000
1755        y=1000
1756        m=Mesh(geo_reference=Geo_reference(56,x,y))
1757        polygon = [[0,0],[1,0],[1,1],[0,1]]
1758       
1759        m.add_region_from_polygon(polygon,
1760                               {'tagin':[0,1],'bom':[2]},
1761                                  max_triangle_area=10)
1762        self.failUnless(len(m.regions)==1,
1763                        'FAILED!')
1764        segs = m.getUserSegments()
1765        self.failUnless(len(segs)==4,
1766                        'FAILED!')
1767        self.failUnless(len(m.userVertices)==4,
1768                        'FAILED!') 
1769        self.failUnless(segs[0].tag=='tagin',
1770                        'FAILED!') 
1771        self.failUnless(segs[1].tag=='tagin',
1772                        'FAILED!') 
1773         
1774        self.failUnless(segs[2].tag=='bom',
1775                        'FAILED!') 
1776        self.failUnless(segs[3].tag=='',
1777                        'FAILED!')
1778        verts = m.getUserVertices()
1779        #print "User verts",verts
1780        #print 'polygon',polygon
1781        #vert values are relative
1782        for point,new_point in map(None,polygon,verts):
1783            point_x = point[0] 
1784            new_point_x = new_point.x + m.geo_reference.get_xllcorner()
1785            #print "point_x",point_x
1786            #print "new_point_x",new_point_x
1787            point_y = point[1] 
1788            new_point_y = new_point.y + m.geo_reference.get_yllcorner()
1789           
1790            self.failUnless(point_x == new_point_x, ' failed')
1791            self.failUnless(point_y == new_point_y, ' failed')
1792
1793
1794    def test_add_hole_from_polygon(self):
1795        x=-500
1796        y=-1000
1797        m=Mesh(geo_reference=Geo_reference(56,x,y))
1798
1799        # These are the absolute values
1800        polygon_absolute = [[0,0],[1,0],[1,1],[0,1]]
1801       
1802        x_p = -10
1803        y_p = -40
1804        geo_ref_poly = Geo_reference(56, x_p, y_p)
1805        polygon = geo_ref_poly.change_points_geo_ref(polygon_absolute)
1806       
1807        poly_point = m.add_hole_from_polygon(polygon,
1808                                               {'tagin':[0,1],'bom':[2]},
1809                                               geo_reference=geo_ref_poly)
1810        # poly_point values are relative to the mesh geo-ref
1811        # make them absolute
1812        #print "poly_point.x+x",poly_point.x+x
1813        #print "polygon_absolute", polygon_absolute
1814        self.failUnless(inside_polygon([poly_point.x+x,poly_point.y+y],
1815                                       polygon_absolute, closed = False),
1816                        'FAILED!')
1817               
1818        self.failUnless(len(m.holes)==1,
1819                        'FAILED!')
1820        segs = m.getUserSegments()
1821        self.failUnless(len(segs)==4,
1822                        'FAILED!')
1823        self.failUnless(len(m.userVertices)==4,
1824                        'FAILED!') 
1825        self.failUnless(segs[0].tag=='tagin',
1826                        'FAILED!') 
1827        self.failUnless(segs[1].tag=='tagin',
1828                        'FAILED!') 
1829         
1830        self.failUnless(segs[2].tag=='bom',
1831                        'FAILED!') 
1832        self.failUnless(segs[3].tag=='',
1833                        'FAILED!')
1834        verts = m.getUserVertices()
1835        #print "User verts",verts
1836        #print 'polygon',polygon
1837        #vert values are relative
1838        for point,new_point in map(None,polygon,verts):
1839            point_x = point[0] + geo_ref_poly.get_xllcorner()
1840            new_point_x = new_point.x + m.geo_reference.get_xllcorner()
1841            point_y = point[1] + geo_ref_poly.get_yllcorner()
1842            #print "new_point.y",new_point.y
1843            #print "m.geo_ref.get_yllcorner()",m.geo_reference.get_yllcorner()
1844            new_point_y = new_point.y + m.geo_reference.get_yllcorner()
1845            #print "point_y",point_y
1846            #print "new_point_y",new_point_y
1847           
1848            self.failUnless(point_x == new_point_x, ' failed')
1849            self.failUnless(point_y == new_point_y, ' failed')
1850
1851    def test_add_circle(self):
1852        x=-500
1853        y=-1000
1854        m=Mesh(geo_reference=Geo_reference(56,x,y))
1855
1856        # These are the absolute values
1857        tag = 'hey'
1858        segment_count = 104
1859        radius = 30
1860        circle_center_absolute = [100,80]       
1861        x_p = -.666
1862        y_p = -.777
1863        geo_ref_poly = Geo_reference(56, x_p, y_p)
1864        circle_center = \
1865                geo_ref_poly.change_points_geo_ref(circle_center_absolute)
1866        circle_center = circle_center[0] #make a list of lists a list
1867        poly_point = m.add_circle(circle_center, radius, segment_count,
1868                                  tag=tag,
1869                                  region=True,
1870                                  center_geo_reference=geo_ref_poly)
1871        # poly_point values are relative to the mesh geo-ref
1872        # make them absolute
1873        #print "poly_point.x+x",poly_point.x+x
1874        #print "polygon_absolute", polygon_absolute
1875     
1876       
1877        #m.export_mesh_file("aaat.msh")
1878       
1879        self.failUnless(len(m.regions)==1,
1880                        'FAILED!')
1881        segs = m.getUserSegments()
1882        self.failUnless(len(segs)==segment_count,
1883                        'FAILED!')
1884        self.failUnless(len(m.userVertices)==segment_count,
1885                        'FAILED!') 
1886        self.failUnless(segs[0].tag==tag,
1887                        'FAILED!') 
1888        self.failUnless(segs[1].tag==tag,
1889                        'FAILED!') 
1890         
1891        verts = m.getUserVertices()
1892       
1893        #m.export_mesh_file("aaat.msh")
1894       
1895    def FIXMEtest_auto_set_geo_reference(self):
1896        x=50000
1897        y=1000
1898        m=Mesh(geo_reference=Geo_reference(56,x,y))
1899        polygon = [[0,0],[1,0],[1,1],[0,1]]
1900       
1901        m.add_region_from_polygon(polygon,
1902                               {'tagin':[0,1],'bom':[2]},
1903                                  max_triangle_area=10)
1904        m.auto_set_geo_reference()
1905       
1906 
1907    def test_duplicat_verts_are_removed(self):
1908   
1909     
1910        a = Vertex ( 0.0 ,0.0)
1911        b = Vertex (0.0, 4.0)
1912        c = Vertex (4.0,4.0)
1913        d = Vertex (4.0,0.0)
1914        e = Vertex (4.0,0.0) # duplicate point
1915   
1916        s1 = Segment(a,b, tag = "50")
1917        s2 = Segment(b,c, tag = "40")
1918        s3 = Segment(c,d, tag = "30")
1919        s4 = Segment(d,e, tag = "no where seg")
1920        s5 = Segment(e,a, tag = "20")
1921
1922       
1923        m = Mesh(userVertices=[a,b,c,d,e],
1924                 userSegments=[s1,s2,s3,s4,s5])
1925
1926        seg = m.getUserSegments()
1927        points = m.getUserVertices()
1928        holes = m.getHoles()
1929        regions = m.getRegions()
1930        #fileName = tempfile.mktemp(".tsh")
1931        #fileName = "badmesh.tsh"
1932        #m.export_mesh_file(fileName)
1933        #print "***************************fileName", fileName
1934        #new_m = importMeshFromFile(fileName)
1935        #os.remove(fileName)
1936       
1937        m.generateMesh("Q", maxArea = 2000.1 )
1938
1939        #m.export_mesh_file("from_test_mesh.tsh")
1940        seg = m.getMeshSegments()
1941        self.failUnless(4==len(seg),
1942                        'FAILED!') 
1943
1944        vert = m.getMeshVertices() 
1945        self.failUnless(4==len(vert),
1946                        'FAILED!')
1947 
1948    def test_duplicat_verts_are_removedII(self):
1949   
1950     
1951        a = Vertex ( 0.0 ,0.0)
1952        b = Vertex (0.0, 4.0)
1953        c = Vertex (4.0,4.0)
1954        d = Vertex (4.0,0.0)
1955        e = Vertex (4.0,0.0) # duplicate point
1956        f = Vertex (49.0,0.0) # unused point
1957   
1958        s1 = Segment(a,b, tag = "50")
1959        s2 = Segment(b,c, tag = "40")
1960        s3 = Segment(c,d, tag = "30")
1961        s4 = Segment(d,e, tag = "no where seg")
1962        s5 = Segment(e,a, tag = "20")
1963
1964       
1965        m = Mesh(userVertices=[a,b,c,d,e,f],
1966                 userSegments=[s1,s2,s3,s4,s5])
1967
1968        seg = m.getUserSegments()
1969        points = m.getUserVertices()
1970        holes = m.getHoles()
1971        regions = m.getRegions()
1972        #fileName = tempfile.mktemp(".tsh")
1973        #fileName = "badmesh.tsh"
1974        #m.export_mesh_file(fileName)
1975        #print "***************************fileName", fileName
1976        #new_m = importMeshFromFile(fileName)
1977        #os.remove(fileName)
1978       
1979        m.generateMesh("Q", maxArea = 2000.1 )
1980
1981        #m.export_mesh_file("from_test_mesh.tsh")
1982        seg = m.getMeshSegments()
1983        self.failUnless(4==len(seg),
1984                        'FAILED!') 
1985
1986        vert = m.getMeshVertices() 
1987        self.failUnless(4==len(vert),
1988                        'FAILED!')
1989       
1990def list_comp(A,B):
1991    yes = len(A)==len(B)
1992    for item in A:
1993        if not item in B:
1994            yes = False
1995    return yes
1996
1997
1998           
1999#-------------------------------------------------------------
2000if __name__ == "__main__":
2001    suite = unittest.makeSuite(meshTestCase,'test')
2002    #suite = unittest.makeSuite(meshTestCase,'test_duplicat_verts_do_what')
2003    runner = unittest.TextTestRunner() #verbosity=2)
2004    runner.run(suite)
2005   
Note: See TracBrowser for help on using the repository browser.