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

Last change on this file since 4906 was 4906, checked in by duncan, 16 years ago

removing dead code

File size: 82.3 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    runner = unittest.TextTestRunner() #verbosity=2)
2202    runner.run(suite)
2203   
Note: See TracBrowser for help on using the repository browser.