source: anuga_core/source/anuga/pmesh/test_mesh.py @ 5098

Last change on this file since 5098 was 4955, checked in by steve, 17 years ago

Fixed problems with entries of integer arrays not being integers, but
arrays. So needed to coerce to int in a couple of places.

Also mkstemp was being imported from the wrong module in test_system_tools

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