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

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

update to add_points_and_segments

File size: 86.5 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_import_ungenerate_file(self):
1285       
1286        fileName = tempfile.mktemp(".txt")
1287        file = open(fileName,"w")
1288        file.write("         1       ??      ??\n\
1289       10.0       10.0\n\
1290       11.0       10.0\n\
1291       11.0       11.0\n\
1292       10.0       11.0\n\
1293       10.0       10.0\n\
1294END\n\
1295         2      ?? ??\n\
1296       20.0       20.0\n\
1297       20.0       30.0\n\
1298       30.0       30.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) ==11,
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, region_tag="swamp")
1343
1344        os.remove(fileName)
1345
1346        self.failUnless(Segment.get_default_tag() == initial_tag,
1347                        'Wrong segment list length.')
1348        m.export_mesh_file("swamp.tsh")
1349        #print "m.userSegments",m.userSegments
1350        self.failUnless(len(m.userSegments) ==11,
1351                        'Wrong segment list length.')
1352        self.failUnless(len(m.userVertices) == 11,
1353                        'Wrong vertex list length.')
1354        self.failUnless(len(m.regions) == 2,
1355                        'Wrong regions list length.')
1356        self.failUnless(m.regions[0].getTag() == "swamp",
1357                        'Wrong regions tag.')
1358        self.failUnless(m.regions[1].getTag() == "swamp",
1359                        'Wrong regions 1 tag.')
1360       
1361        # have to reset this , since it's a class attribute
1362        Segment.set_default_tag("")
1363       
1364       
1365    def test_import_ungenerate_file_different_region_tags(self):
1366       
1367        fileName = tempfile.mktemp(".txt")
1368        file = open(fileName,"w")
1369        file.write("         1       ??      ??\n\
1370       10.0       10.0\n\
1371       11.0       10.0\n\
1372       11.0       11.0\n\
1373       10.0       11.0\n\
1374       10.0       10.0\n\
1375END\n\
1376         2      ?? ??\n\
1377       20.0       20.0\n\
1378       20.0       30.0\n\
1379       30.0       30.0\n\
1380END\n\
1381END\n")
1382        file.close()
1383       
1384       
1385        a = Vertex (0.0, 0.0) #, attributes = [1.1])
1386        b = Vertex (0.0, 40.0) #, attributes = [1.2])
1387        c = Vertex (40.0,40.0) #, attributes = [1.3])
1388        d = Vertex (40.0,0.0) #, attributes = [1.4])
1389   
1390        s1 = Segment(a,b)
1391        s2 = Segment(b,c)
1392        s3 = Segment(c,d)
1393        s4 = Segment(d,a)
1394     
1395        m = Mesh(userVertices=[a,b,c,d], userSegments=[s1,s2,s3,s4])
1396        dict = importUngenerateFile(fileName)
1397        #os.remove(fileName)
1398
1399        tag = "DSG"
1400        Segment.set_default_tag(tag)
1401        m.addVertsSegs(dict)
1402
1403        self.failUnless(len(m.userSegments) ==11,
1404                        'Wrong segment list length.')
1405        self.failUnless(len(m.userVertices) == 11,
1406                        'Wrong vertex list length.')
1407
1408        # Test the method
1409        a = Vertex (0.0, 0.0) #, attributes = [1.1])
1410        b = Vertex (0.0, 40.0) #, attributes = [1.2])
1411        c = Vertex (40.0,40.0) #, attributes = [1.3])
1412        d = Vertex (40.0,0.0) #, attributes = [1.4])
1413   
1414        s1 = Segment(a,b)
1415        s2 = Segment(b,c)
1416        s3 = Segment(c,d)
1417        s4 = Segment(d,a)
1418     
1419        m = Mesh(userVertices=[a,b,c,d], userSegments=[s1,s2,s3,s4])
1420        tag = "DSG"       
1421        initial_tag = "PIG"
1422        Segment.set_default_tag(initial_tag)
1423        m.import_ungenerate_file(fileName, tag=tag, region_tag=["swamp","coastalp"])
1424
1425        os.remove(fileName)
1426
1427        self.failUnless(Segment.get_default_tag() == initial_tag,
1428                        'Wrong segment list length.')
1429        m.export_mesh_file("swamp.tsh")
1430        #print "m.userSegments",m.userSegments
1431        self.failUnless(len(m.userSegments) ==11,
1432                        'Wrong segment list length.')
1433        self.failUnless(len(m.userVertices) == 11,
1434                        'Wrong vertex list length.')
1435        self.failUnless(len(m.regions) == 2,
1436                        'Wrong regions list length.')
1437        self.failUnless(m.regions[0].getTag() == "swamp",
1438                        'Wrong regions tag.')
1439        self.failUnless(m.regions[1].getTag() == "coastalp",
1440                        'Wrong regions 1 tag.')
1441       
1442       
1443        # have to reset this , since it's a class attribute
1444        Segment.set_default_tag("")
1445       
1446    def test_addVertsSegs(self):
1447        m = Mesh()
1448        Segment.set_default_tag("food")
1449        dict = {}
1450        dict['points'] = [[0.0, 0.0], [1.0, 0.0], [1.0, 1.0]]
1451        dict['segments'] = [[0, 1], [1, 2]]
1452        dict['segment_tags'] = ['','do-op']
1453        m.addVertsSegs(dict)
1454        # have to reset this , since it's a class attribute
1455        Segment.set_default_tag("")
1456
1457       
1458        self.failUnless(len(m.userSegments) ==2,
1459                        'Wrong segment list length.')
1460        self.failUnless(len(m.userVertices) == 3,
1461                        'Wrong vertex list length.')
1462        self.failUnless(m.userSegments[0].tag =='food',
1463                        'Wrong segment tag length.')
1464        self.failUnless(m.userSegments[1].tag =='do-op',
1465                        'Wrong segment tag.')
1466       
1467    def test_addVertsSegs2(self):
1468        geo = Geo_reference(56,5,10)
1469        m = Mesh(geo_reference=geo)
1470        dict = {}
1471        dict['points'] = [[2.0, 1.0], [3.0, 1.0], [2.0, 2.0]]
1472        dict['segments'] = [[0, 1], [1, 2], [2,0]]
1473        dict['segment_tags'] = ['','do-op','']
1474        m.addVertsSegs(dict)
1475
1476    def test_addVertsSegs_done_twice(self):
1477        m = Mesh()
1478        dict = {}
1479        dict['points'] = [[0.0, 0.0], [5.0, 0.0], [5.0, 5.0]]
1480        dict['segments'] = [[0, 1], [1, 2], [2,0]]
1481        dict['segment_tags'] = ['0','1','2']
1482        m.addVertsSegs(dict)
1483       
1484        dict = {}
1485        dict['points'] = [[2.0, 1.0], [4.0, 1.0], [4.0, 3.0]]
1486        dict['segments'] = [[0, 1], [1, 2], [2,0]]
1487        dict['segment_tags'] = ['3','4','5']
1488        m.addVertsSegs(dict)
1489
1490       
1491        self.failUnless(m.userSegments[5].vertices[0].y == 3,
1492                        'Wrong vertex connected.')
1493        self.failUnless(m.userSegments[5].vertices[1].y == 1,
1494                        'Wrong vertex connected.')
1495           
1496    def test_add_points_and_segments(self):
1497        m = Mesh()
1498        Segment.set_default_tag("food")
1499        dict = {}
1500        points =  [[0.0, 0.0], [1.0, 0.0], [1.0, 1.0]]
1501        segments = [[0, 1], [1, 2]]
1502        segment_tags = {'hair':[1]}
1503        m.add_points_and_segments(points,
1504                                    segments, segment_tags)
1505        # have to reset this , since it's a class attribute
1506        Segment.set_default_tag("")
1507
1508       
1509        self.failUnless(len(m.userSegments) ==2,
1510                        'Wrong segment list length.')
1511        self.failUnless(len(m.userVertices) == 3,
1512                        'Wrong vertex list length.')
1513        self.failUnless(m.userSegments[0].tag =='food',
1514                        'Wrong segment tag length.')
1515        self.failUnless(m.userSegments[1].tag =='hair',
1516                        'Wrong segment tag.')
1517       
1518    def test_add_points_and_segmentsII(self):
1519        m = Mesh()
1520        Segment.set_default_tag("food")
1521        dict = {}
1522        points =  [[0.0, 0.0], [1.0, 0.0], [1.0, 1.0]]
1523        segments = None #[[0, 1], [1, 2]]
1524        segment_tags = {'hair':[1]}
1525        m.add_points_and_segments(points,
1526                                    segments, segment_tags)
1527        # have to reset this , since it's a class attribute
1528        Segment.set_default_tag("")
1529
1530       
1531        self.failUnless(len(m.userSegments) ==2,
1532                        'Wrong segment list length.')
1533        self.failUnless(len(m.userVertices) == 3,
1534                        'Wrong vertex list length.')
1535        self.failUnless(m.userSegments[0].tag =='food',
1536                        'Wrong segment tag length.')
1537        self.failUnless(m.userSegments[1].tag =='hair',
1538                        'Wrong segment tag.')
1539       
1540    def test_exportASCIImeshfile(self):
1541   
1542        #a_att = [5,2]
1543        #d_att =[4,2]
1544        #f_att = [3,2]
1545        #e_att = [2,2]
1546        a_xy = [0.0, 0.0]
1547        a = Vertex ( a_xy[0],a_xy[1]) #, attributes =a_att)
1548        d = Vertex (0.0, 4.0) #, attributes =d_att)
1549        f = Vertex (4.0,0.0) #, attributes =f_att)
1550        e = Vertex (1.0,1.0) #, attributes =e_att)
1551   
1552        s1 = Segment(a,d, tag = "50")
1553        s2 = Segment(d,f, tag = "40")
1554        s3 = Segment(a,f, tag = "30")
1555        s4 = Segment(a,e, tag = "20")
1556     
1557        r1 = Region(0.3, 0.3,tag = "1.3", maxArea = 36)
1558
1559
1560        h1 = Hole(0.2,0.6)
1561       
1562        m = Mesh(userVertices=[a,d,f,e],
1563                 userSegments=[s1,s2,s3,s4],
1564                 regions=[r1],
1565                 holes=[h1])
1566
1567        seg = m.getUserSegments()
1568        points = m.getUserVertices()
1569        holes = m.getHoles()
1570        regions = m.getRegions()
1571        fileName = tempfile.mktemp(".tsh")
1572        m.export_mesh_file(fileName)
1573        #print "***************************fileName", fileName
1574        new_m = importMeshFromFile(fileName)
1575        os.remove(fileName)
1576       
1577
1578        #print '**@@@@@******'
1579        #print "new_m",new_m
1580        #print '**@@@@@******'
1581        #print "m",m
1582        #print '**@@@@@******'
1583       
1584        self.failUnless( new_m == m,
1585                         'loadASCIITestCase failed. test new 1')
1586           
1587    def test_Mesh2MeshList(self):
1588
1589        a_att = [5,2]
1590        d_att =[4,2]
1591        f_att = [3,2]
1592        e_att = [2,2]
1593        a_xy = [0.0, 0.0]
1594        a = Vertex ( a_xy[0],a_xy[1]) #, attributes =a_att)
1595        d = Vertex (0.0, 4.0) #, attributes =d_att)
1596        f = Vertex (4.0,0.0) #, attributes =f_att)
1597        e = Vertex (1.0,1.0) #, attributes =e_att)
1598   
1599        s1 = Segment(a,d, tag = "50")
1600        s2 = Segment(d,f, tag = "40")
1601        s3 = Segment(a,f, tag = "30")
1602        s4 = Segment(a,e, tag = "20")
1603     
1604        r1 = Region(0.3, 0.3,tag = "1.3", maxArea = 45)
1605        m = Mesh(userVertices=[a,d,f,e],
1606                 userSegments=[s1,s2,s3,s4],
1607                 regions=[r1])
1608
1609        m.generateMesh("Qa2.1")
1610
1611        seg = m.getMeshSegments()
1612        points = m.getMeshVertices()
1613        dict = m.Mesh2MeshList()
1614        #print "dict",dict
1615        # test not finished...
1616 
1617    def test_Mesh2IOTriangulationDict(self):
1618
1619        a_att = [5,2]
1620        d_att =[4,2]
1621        f_att = [3,2]
1622        e_att = [2,2]
1623        a_xy = [0.0, 0.0]
1624        a = Vertex ( a_xy[0],a_xy[1] , attributes =a_att)
1625        d = Vertex (0.0, 4.0 , attributes =d_att)
1626        f = Vertex (4.0,0.0 , attributes =f_att)
1627        e = Vertex (1.0,1.0 , attributes =e_att)
1628   
1629        s1 = Segment(a,d, tag = "50")
1630        s2 = Segment(d,f, tag = "40")
1631        s3 = Segment(a,f, tag = "30")
1632        s4 = Segment(a,e, tag = "20")
1633     
1634        r1 = Region(0.3, 0.3,tag = "1.3", maxArea = 45)
1635        m = Mesh(userVertices=[a,d,f,e],
1636                 userSegments=[s1,s2,s3,s4],
1637                 regions=[r1])
1638        titles = ['ele','friction'] #Feed in directly!
1639        m.attributeTitles = titles
1640        m.generateMesh("Qa2.1")
1641
1642        seg = m.getMeshSegments()
1643        verts = m.getMeshVertices()
1644        vert_as = m.getMeshVerticeAttributes()
1645        seg_tags = m.getMeshSegmentTags()
1646        dict = m.Mesh2IOTriangulationDict()
1647        #print "dict",dict
1648       
1649        self.failUnless( dict['vertex_attribute_titles'] == titles,
1650                         'test_Mesh2IOTriangulationDict failed. test 1')
1651        answer = [a_xy,[0.0, 4.0],[4.0,0.0], [1.0,1.0], [2.0,2.0]]
1652        #print "answer",answer
1653        #print "dict['vertices']",dict['vertices']
1654       
1655        self.failUnless( dict['vertices'] == answer,
1656                         'test_Mesh2IOTriangulationDict failed. test 2')
1657
1658        self.failUnless( dict['vertices'] == verts,
1659                         'test_Mesh2IOTriangulationDict failed. test vert')
1660        self.failUnless( dict['vertex_attributes'] == vert_as,
1661                         'test_Mesh2IOTriangulationDict failed. test vert ats')
1662
1663        self.failUnless( dict['segments'][0] == [0,1],
1664                        'test_Mesh2IODict failed. test 3')
1665       
1666        self.failUnless( dict['segment_tags'] == seg_tags,
1667                        'test_Mesh2IODict failed. test 3')
1668        #print " dict['triangles'][0]", dict['triangles'][0]
1669        self.failUnless( dict['triangles'][0] == [3,2,4],
1670                        'test_Mesh2IODict failed. test 5')
1671        self.failUnless( dict['triangle_neighbors'][0] == [-1,2,3],
1672                        'test_Mesh2IODict failed. test 6')
1673        #print "dict['triangle_tags'][0]", dict['triangle_tags'][0]
1674        self.failUnless( dict['triangle_tags'][0] == "1.3",
1675                         'test_Mesh2IODict failed. test 7')
1676
1677 
1678    def test_Mesh2IODict(self):
1679
1680        a_att = [5,2]
1681        d_att =[4,2]
1682        f_att = [3,2]
1683        e_att = [2,2]
1684        a_xy = [0.0, 0.0]
1685        a = Vertex ( a_xy[0],a_xy[1] , attributes =a_att)
1686        d = Vertex (0.0, 4.0 , attributes =d_att)
1687        f = Vertex (4.0,0.0 , attributes =f_att)
1688        e = Vertex (1.0,1.0 , attributes =e_att)
1689   
1690        s1 = Segment(a,d, tag = "50")
1691        s2 = Segment(d,f, tag = "40")
1692        s3 = Segment(a,f, tag = "30")
1693        s4 = Segment(a,e, tag = "20")
1694     
1695        r1 = Region(0.3, 0.3,tag = "1.3", maxArea = 45)
1696        m = Mesh(userVertices=[a,d,f,e],
1697                 userSegments=[s1,s2,s3,s4],
1698                 regions=[r1])
1699        titles = ['ele','friction']
1700        m.attributeTitles = titles
1701        m.generateMesh("Qa2.1")
1702
1703        seg = m.getMeshSegments()
1704        verts = m.getMeshVertices()
1705        vert_as = m.getMeshVerticeAttributes()
1706        dict = m.Mesh2IODict()
1707        seg_tags = m.getMeshSegmentTags()
1708        #print "dict",dict
1709       
1710        self.failUnless( dict['vertex_attribute_titles'] == titles,
1711                         'test_Mesh2IOTriangulationDict failed. test 1')
1712        answer = [a_xy,[0.0, 4.0],[4.0,0.0], [1.0,1.0], [2.0,2.0]]
1713        #print "answer",answer
1714        #print "dict['vertices']",dict['vertices']
1715       
1716        self.failUnless( dict['vertices'] == answer,
1717                         'test_Mesh2IOTriangulationDict failed. test 2')
1718
1719        self.failUnless( dict['vertices'] == verts,
1720                         'test_Mesh2IOTriangulationDict failed. test vert')
1721        self.failUnless( dict['vertex_attributes'] == vert_as,
1722                         'test_Mesh2IOTriangulationDict failed. test vert ats')
1723
1724        self.failUnless( dict['segments'][0] == [0,1],
1725                        'test_Mesh2IODict failed. test 3')
1726       
1727        self.failUnless( dict['segment_tags'] == seg_tags,
1728                        'test_Mesh2IODict failed. test 3')
1729        #print " dict['triangles'][0]", dict['triangles'][0]
1730        self.failUnless( dict['triangles'][0] == [3,2,4],
1731                        'test_Mesh2IODict failed. test 5')
1732        self.failUnless( dict['triangle_neighbors'][0] == [-1,2,3],
1733                        'test_Mesh2IODict failed. test 6')
1734        #print "dict['triangle_tags'][0]", dict['triangle_tags'][0]
1735        self.failUnless( dict['triangle_tags'][0] == "1.3",
1736                         'test_Mesh2IODict failed. test 7')
1737
1738        seg = m.getUserSegments()
1739        points = m.getUserVertices()
1740        holes = m.getHoles()
1741        regions = m.getRegions()
1742       
1743        for pimport,pactual,pimpatt in map(None,dict['points'],points,dict['point_attributes']):
1744            self.failUnless( pimport == [pactual.x,pactual.y],
1745                        'test_Mesh2IODict failed. test 1')
1746            self.failUnless( pimpatt == pactual.attributes,
1747                        'test_Mesh2IODict failed. test 1.1')
1748        self.failUnless( dict['outline_segments'][0] == [0,1],
1749                        'test_Mesh2IODict failed. test 3')
1750        for segimp,segactual in map(None,dict['outline_segment_tags'],seg):
1751            self.failUnless( segimp == segactual.tag,
1752                        'test_Mesh2IODict failed. test 4')
1753        for holeimp,holeactual in map(None,dict['holes'],holes):
1754            self.failUnless( holeimp == [holeactual.x,holeactual.y],
1755                        'test_Mesh2IODict failed. test 5')
1756       
1757        for regimp,regactual,regattimp, regmaxarea in map(None,dict['regions'],regions, dict['region_tags'], dict['region_max_areas']):
1758            self.failUnless( regimp == [regactual.x,regactual.y],
1759                        'loadASCIITestCase failed. test 6')
1760            self.failUnless( regattimp == regactual.getTag(),
1761                        'loadASCIITestCase failed. test 7')
1762            self.failUnless( regmaxarea == regactual.getMaxArea(),
1763                        'loadASCIITestCase failed. test 7')
1764   
1765           
1766       
1767    def test_Mesh2IOOutlineDict(self):
1768
1769        a_att = [5,2]
1770        d_att =[4,2]
1771        f_att = [3,2]
1772        e_att = [2,2]
1773        a_xy = [0.0, 0.0]
1774        a = Vertex ( a_xy[0],a_xy[1] , attributes =a_att)
1775        d = Vertex (0.0, 4.0 , attributes =d_att)
1776        f = Vertex (4.0,0.0 , attributes =f_att)
1777        e = Vertex (1.0,1.0 , attributes =e_att)
1778   
1779        s1 = Segment(a,d, tag = "50")
1780        s2 = Segment(d,f, tag = "40")
1781        s3 = Segment(a,f, tag = "30")
1782        s4 = Segment(a,e, tag = "20")
1783     
1784        r1 = Region(0.3, 0.3,tag = "1.3", maxArea = 45)
1785        m = Mesh(userVertices=[a,d,f,e],
1786                 userSegments=[s1,s2,s3,s4],
1787                 regions=[r1])
1788        titles = ['ele','friction']
1789        m.attributeTitles = titles
1790        m.generateMesh("Qa2.1")
1791
1792        seg = m.getMeshSegments()
1793        verts = m.getMeshVertices()
1794        dict = m.Mesh2IOOutlineDict()
1795       
1796        seg = m.getUserSegments()
1797        points = m.getUserVertices()
1798        holes = m.getHoles()
1799        regions = m.getRegions()
1800       
1801        for pimport,pactual,pimpatt in map(None,dict['points'],points,dict['point_attributes']):
1802            self.failUnless( pimport == [pactual.x,pactual.y],
1803                        'loadASCIITestCase failed. test 1')
1804            self.failUnless( pimpatt == pactual.attributes,
1805                        'loadASCIITestCase failed. test 1.1')
1806        self.failUnless( dict['outline_segments'][0] == [0,1],
1807                        'loadASCIITestCase failed. test 3')
1808        for segimp,segactual in map(None,dict['outline_segment_tags'],seg):
1809            self.failUnless( segimp == segactual.tag,
1810                        'loadASCIITestCase failed. test 4')
1811        for holeimp,holeactual in map(None,dict['holes'],holes):
1812            self.failUnless( holeimp == [holeactual.x,holeactual.y],
1813                        'loadASCIITestCase failed. test 5')
1814        #for regimp,regactual in map(None,dict['regions'],regions):
1815         #   self.failUnless( [regimp[0],regimp[1]]==[regactual.x,regactual.y],
1816          #              'loadASCIITestCase failed. test 6')
1817           # self.failUnless( regimp[2] == regactual.getTag(),
1818            #            'loadASCIITestCase failed. test 7')
1819            #self.failUnless( regimp[3] == regactual.getMaxArea(),
1820             #           'loadASCIITestCase failed. test 7')
1821
1822           
1823        for regimp,regactual,regattimp, regmaxarea in map(None,dict['regions'],regions, dict['region_tags'], dict['region_max_areas']):
1824            self.failUnless( regimp == [regactual.x,regactual.y],
1825                        'loadASCIITestCase failed. test 6')
1826            self.failUnless( regattimp == regactual.getTag(),
1827                        'loadASCIITestCase failed. test 7')
1828            self.failUnless( regmaxarea == regactual.getMaxArea(),
1829                        'loadASCIITestCase failed. test 7')
1830
1831
1832    def test_add_region_from_polygon(self):
1833        m=Mesh()
1834        region = m.add_region_from_polygon([[0,0],[1,0],[0,1]],
1835                                  max_triangle_area = 88,
1836                                           region_tag='cassady')
1837        self.failUnless(len(m.regions)==1,
1838                        'FAILED!')
1839        self.failUnless(region.getMaxArea()==88,
1840                        'FAILED!')
1841        self.failUnless(len(m.getUserSegments())==3,
1842                        'FAILED!')
1843        self.failUnless(len(m.userVertices)==3,
1844                        'FAILED!')
1845        self.failUnless(region.getTag()=='cassady',
1846                        'FAILED!')
1847       
1848    def test_add_region_from_polygon2(self):
1849        m=Mesh()
1850        m.add_region_from_polygon([[0,0],[1,0],[1,1],[0,1]],
1851                               {'tagin':[0,1],'bom':[2]},
1852                                  max_triangle_area=10)
1853        self.failUnless(len(m.regions)==1,
1854                        'FAILED!')
1855        segs = m.getUserSegments()
1856        self.failUnless(len(segs)==4,
1857                        'FAILED!')
1858        self.failUnless(len(m.userVertices)==4,
1859                        'FAILED!') 
1860        self.failUnless(segs[0].tag=='tagin',
1861                        'FAILED!') 
1862        self.failUnless(segs[1].tag=='tagin',
1863                        'FAILED!') 
1864         
1865        self.failUnless(segs[2].tag=='bom',
1866                        'FAILED!')
1867        self.failUnless(segs[3].tag=='',
1868                        'FAILED!') 
1869       
1870    def test_add_region_from_polygon3(self):
1871        x=-500
1872        y=-1000
1873        m=Mesh(geo_reference=Geo_reference(56,x,y))
1874
1875        # These are the absolute values
1876        polygon_absolute = [[0,0],[1,0],[1,1],[0,1]]
1877       
1878        x_p = -10
1879        y_p = -40
1880        geo_ref_poly = Geo_reference(56, x_p, y_p)
1881        polygon = geo_ref_poly.change_points_geo_ref(polygon_absolute)
1882       
1883        poly_point = m.add_region_from_polygon(polygon,
1884                                               {'tagin':[0,1],'bom':[2]},
1885                                               geo_reference=geo_ref_poly,
1886                                               max_triangle_area=10)
1887        # poly_point values are relative to the mesh geo-ref
1888        # make them absolute
1889        self.failUnless(is_inside_polygon([poly_point.x+x,poly_point.y+y],
1890                                       polygon_absolute, closed = False),
1891                        'FAILED!')
1892               
1893        self.failUnless(len(m.regions)==1,
1894                        'FAILED!')
1895        segs = m.getUserSegments()
1896        self.failUnless(len(segs)==4,
1897                        'FAILED!')
1898        self.failUnless(len(m.userVertices)==4,
1899                        'FAILED!') 
1900        self.failUnless(segs[0].tag=='tagin',
1901                        'FAILED!') 
1902        self.failUnless(segs[1].tag=='tagin',
1903                        'FAILED!') 
1904         
1905        self.failUnless(segs[2].tag=='bom',
1906                        'FAILED!') 
1907        self.failUnless(segs[3].tag=='',
1908                        'FAILED!')
1909        verts = m.getUserVertices()
1910        #print "User verts",verts
1911        #print 'polygon',polygon
1912        #vert values are relative
1913        for point,new_point in map(None,polygon,verts):
1914            point_x = point[0] + geo_ref_poly.get_xllcorner()
1915            new_point_x = new_point.x + m.geo_reference.get_xllcorner()
1916            point_y = point[1] + geo_ref_poly.get_yllcorner()
1917            #print "new_point.y",new_point.y
1918            #print "m.geo_ref.get_yllcorner()",m.geo_reference.get_yllcorner()
1919            new_point_y = new_point.y + m.geo_reference.get_yllcorner()
1920            #print "point_y",point_y
1921            #print "new_point_y",new_point_y
1922           
1923            self.failUnless(point_x == new_point_x, ' failed')
1924            self.failUnless(point_y == new_point_y, ' failed')
1925           
1926         
1927    def test_add_region_from_polygon4(self):
1928        x=50000
1929        y=1000
1930        m=Mesh(geo_reference=Geo_reference(56,x,y))
1931        polygon = [[0,0],[1,0],[1,1],[0,1]]
1932       
1933        m.add_region_from_polygon(polygon,
1934                               {'tagin':[0,1],'bom':[2]},
1935                                  max_triangle_area=10)
1936        self.failUnless(len(m.regions)==1,
1937                        'FAILED!')
1938        segs = m.getUserSegments()
1939        self.failUnless(len(segs)==4,
1940                        'FAILED!')
1941        self.failUnless(len(m.userVertices)==4,
1942                        'FAILED!') 
1943        self.failUnless(segs[0].tag=='tagin',
1944                        'FAILED!') 
1945        self.failUnless(segs[1].tag=='tagin',
1946                        'FAILED!') 
1947         
1948        self.failUnless(segs[2].tag=='bom',
1949                        'FAILED!') 
1950        self.failUnless(segs[3].tag=='',
1951                        'FAILED!')
1952        verts = m.getUserVertices()
1953        #print "User verts",verts
1954        #print 'polygon',polygon
1955        #vert values are relative
1956        for point,new_point in map(None,polygon,verts):
1957            point_x = point[0] 
1958            new_point_x = new_point.x + m.geo_reference.get_xllcorner()
1959            #print "point_x",point_x
1960            #print "new_point_x",new_point_x
1961            point_y = point[1] 
1962            new_point_y = new_point.y + m.geo_reference.get_yllcorner()
1963           
1964            self.failUnless(point_x == new_point_x, ' failed')
1965            self.failUnless(point_y == new_point_y, ' failed')
1966
1967
1968    def test_add_hole_from_polygon(self):
1969        x=-500
1970        y=-1000
1971        m=Mesh(geo_reference=Geo_reference(56,x,y))
1972
1973        # These are the absolute values
1974        polygon_absolute = [[0,0],[1,0],[1,1],[0,1]]
1975       
1976        x_p = -10
1977        y_p = -40
1978        geo_ref_poly = Geo_reference(56, x_p, y_p)
1979        polygon = geo_ref_poly.change_points_geo_ref(polygon_absolute)
1980       
1981        poly_point = m.add_hole_from_polygon(polygon,
1982                                               {'tagin':[0,1],'bom':[2]},
1983                                               geo_reference=geo_ref_poly)
1984        # poly_point values are relative to the mesh geo-ref
1985        # make them absolute
1986        #print "poly_point.x+x",poly_point.x+x
1987        #print "poly_point.y+y",poly_point.y+y
1988        #print "polygon_absolute", polygon_absolute
1989        self.failUnless(is_inside_polygon([poly_point.x+x,poly_point.y+y],
1990                                       polygon_absolute, closed = False),
1991                        'FAILED!')
1992               
1993        self.failUnless(len(m.holes)==1,
1994                        'FAILED!')
1995        segs = m.getUserSegments()
1996        self.failUnless(len(segs)==4,
1997                        'FAILED!')
1998        self.failUnless(len(m.userVertices)==4,
1999                        'FAILED!') 
2000        self.failUnless(segs[0].tag=='tagin',
2001                        'FAILED!') 
2002        self.failUnless(segs[1].tag=='tagin',
2003                        'FAILED!') 
2004         
2005        self.failUnless(segs[2].tag=='bom',
2006                        'FAILED!') 
2007        self.failUnless(segs[3].tag=='',
2008                        'FAILED!')
2009        verts = m.getUserVertices()
2010        #print "User verts",verts
2011        #print 'polygon',polygon
2012        #vert values are relative
2013        for point,new_point in map(None,polygon,verts):
2014            point_x = point[0] + geo_ref_poly.get_xllcorner()
2015            new_point_x = new_point.x + m.geo_reference.get_xllcorner()
2016            point_y = point[1] + geo_ref_poly.get_yllcorner()
2017            #print "new_point.y",new_point.y
2018            #print "m.geo_ref.get_yllcorner()",m.geo_reference.get_yllcorner()
2019            new_point_y = new_point.y + m.geo_reference.get_yllcorner()
2020            #print "point_y",point_y
2021            #print "new_point_y",new_point_y
2022           
2023            self.failUnless(point_x == new_point_x, ' failed')
2024            self.failUnless(point_y == new_point_y, ' failed')
2025
2026    def test_add_circle(self):
2027        x=-500
2028        y=-1000
2029        m=Mesh(geo_reference=Geo_reference(56,x,y))
2030
2031        # These are the absolute values
2032        tag = 'hey'
2033        segment_count = 104
2034        radius = 30
2035        circle_center_absolute = [100,80]       
2036        x_p = -.666
2037        y_p = -.777
2038        geo_ref_poly = Geo_reference(56, x_p, y_p)
2039        circle_center = \
2040                geo_ref_poly.change_points_geo_ref(circle_center_absolute)
2041        circle_center = circle_center[0] #make a list of lists a list
2042        poly_point = m.add_circle(circle_center, radius, segment_count,
2043                                  tag=tag,
2044                                  region=True,
2045                                  center_geo_reference=geo_ref_poly)
2046        # poly_point values are relative to the mesh geo-ref
2047        # make them absolute
2048        #print "poly_point.x+x",poly_point.x+x
2049        #print "polygon_absolute", polygon_absolute
2050     
2051       
2052        #m.export_mesh_file("aaat.msh")
2053       
2054        self.failUnless(len(m.regions)==1,
2055                        'FAILED!')
2056        segs = m.getUserSegments()
2057        self.failUnless(len(segs)==segment_count,
2058                        'FAILED!')
2059        self.failUnless(len(m.userVertices)==segment_count,
2060                        'FAILED!') 
2061        self.failUnless(segs[0].tag==tag,
2062                        'FAILED!') 
2063        self.failUnless(segs[1].tag==tag,
2064                        'FAILED!') 
2065         
2066        verts = m.getUserVertices()
2067       
2068        #m.export_mesh_file("aaat.msh")
2069       
2070    def NOTIMPLEMENTEDtest_auto_set_geo_reference(self):
2071        x=50000
2072        y=1000
2073        m=Mesh(geo_reference=Geo_reference(56,x,y))
2074        polygon = [[0,0],[1,0],[1,1],[0,1]]
2075       
2076        m.add_region_from_polygon(polygon,
2077                               {'tagin':[0,1],'bom':[2]},
2078                                  max_triangle_area=10)
2079        m.auto_set_geo_reference()
2080       
2081 
2082    def test_duplicat_verts_are_removed(self):
2083   
2084     
2085        a = Vertex ( 0.0 ,0.0)
2086        b = Vertex (0.0, 4.0)
2087        c = Vertex (4.0,4.0)
2088        d = Vertex (4.0,0.0)
2089        e = Vertex (4.0,0.0) # duplicate point
2090   
2091        s1 = Segment(a,b, tag = "50")
2092        s2 = Segment(b,c, tag = "40")
2093        s3 = Segment(c,d, tag = "30")
2094        s4 = Segment(d,e, tag = "no where seg")
2095        s5 = Segment(e,a, tag = "20")
2096
2097       
2098        m = Mesh(userVertices=[a,b,c,d,e],
2099                 userSegments=[s1,s2,s3,s4,s5])
2100
2101        seg = m.getUserSegments()
2102        points = m.getUserVertices()
2103        holes = m.getHoles()
2104        regions = m.getRegions()
2105        #fileName = tempfile.mktemp(".tsh")
2106        #fileName = "badmesh.tsh"
2107        #m.export_mesh_file(fileName)
2108        #print "***************************fileName", fileName
2109        #new_m = importMeshFromFile(fileName)
2110        #os.remove(fileName)
2111       
2112        m.generateMesh("Q", maxArea = 2000.1 )
2113
2114        #m.export_mesh_file("from_test_mesh.tsh")
2115        seg = m.getMeshSegments()
2116        self.failUnless(4==len(seg),
2117                        'FAILED!') 
2118
2119        vert = m.getMeshVertices() 
2120        self.failUnless(4==len(vert),
2121                        'FAILED!')
2122 
2123    def test_duplicat_verts_are_removedII(self):
2124   
2125     
2126        a = Vertex ( 0.0 ,0.0)
2127        b = Vertex (0.0, 4.0)
2128        c = Vertex (4.0,4.0)
2129        d = Vertex (4.0,0.0)
2130        e = Vertex (4.0,0.0) # duplicate point
2131        f = Vertex (49.0,0.0) # unused point
2132   
2133        s1 = Segment(a,b, tag = "50")
2134        s2 = Segment(b,c, tag = "40")
2135        s3 = Segment(c,d, tag = "30")
2136        s4 = Segment(d,e, tag = "no where seg")
2137        s5 = Segment(e,a, tag = "20")
2138
2139       
2140        m = Mesh(userVertices=[a,b,c,d,e,f],
2141                 userSegments=[s1,s2,s3,s4,s5])
2142
2143        seg = m.getUserSegments()
2144        points = m.getUserVertices()
2145        holes = m.getHoles()
2146        regions = m.getRegions()
2147        #fileName = tempfile.mktemp(".tsh")
2148        #fileName = "badmesh.tsh"
2149        #m.export_mesh_file(fileName)
2150        #print "***************************fileName", fileName
2151        #new_m = importMeshFromFile(fileName)
2152        #os.remove(fileName)
2153       
2154        m.generateMesh("Q", maxArea = 2000.1 )
2155
2156        #m.export_mesh_file("from_test_mesh.tsh")
2157        seg = m.getMeshSegments()
2158        self.failUnless(4==len(seg),
2159                        'FAILED!') 
2160
2161        vert = m.getMeshVertices() 
2162        self.failUnless(4==len(vert),
2163                        'FAILED!')
2164   
2165    def test_add_vertices(self):
2166        points_ab = [[0.1,1],[0.4,.2],[7,5],[10,5]]
2167        geo =  Geo_reference(56,23,21)
2168        points = geo.change_points_geo_ref(points_ab)
2169        spat = Geospatial_data(points, geo_reference=geo)
2170       
2171        geo_mesh =  Geo_reference(56,100,200)
2172        m = Mesh(geo_reference=geo_mesh)
2173        m.add_vertices(spat)
2174
2175        vert = m.getUserVertices()
2176        #print "vert",vert
2177        self.failUnless(4==len(vert),
2178                        'FAILED!')
2179        vert= m.get_user_vertices(absolute=True)
2180        self.failUnless(vert==points_ab,
2181                        'FAILED!')
2182
2183   
2184    def test_add_vertices_more(self):
2185        points = [[0.1,1],[0.4,.2],[7,5],[10,5]]
2186        #spat = Geospatial_data(points)
2187       
2188        m = Mesh()
2189        m.add_vertices(points)
2190
2191        vert = m.getUserVertices()
2192        #print "vert",vert
2193        self.failUnless(4==len(vert),
2194                        'FAILED!')
2195        vert= m.get_user_vertices(absolute=True)
2196        self.failUnless(vert==points,
2197                        'FAILED!')
2198   
2199    def test_add_verticesII(self):
2200        points_lat_long = [[-33,152],[-35,152],[-35,150],[-33,150]]
2201       
2202        spat = Geospatial_data(data_points=points_lat_long,
2203                               points_are_lats_longs=True)
2204        points_ab = spat.get_data_points( absolute = True)
2205        m = Mesh()
2206        m.add_vertices(spat)
2207
2208        vert = m.getUserVertices()
2209        #print "vert",vert
2210        self.failUnless(4==len(vert),
2211                        'FAILED!')
2212        vert= m.get_user_vertices(absolute=True)
2213        self.failUnless(vert==points_ab,
2214                        'FAILED!')
2215
2216        spat = Geospatial_data(data_points=points_lat_long,
2217                               points_are_lats_longs=True)
2218        points_ab = spat.get_data_points( absolute = True)
2219        geo =  Geo_reference(56,400000,6000000)
2220        spat.set_geo_reference(geo)
2221        m = Mesh()
2222        m.add_vertices(spat)
2223
2224        vert = m.getUserVertices()
2225        #print "vert",vert
2226        self.failUnless(4==len(vert),
2227                        'FAILED!')
2228        vert= m.get_user_vertices(absolute=True)
2229        self.failUnless(vert==points_ab,
2230                        'FAILED!')
2231
2232        #geo =  Geo_reference(56,23,21)
2233        #points = geo.change_points_geo_ref(points_ab)
2234       
2235    def test_get_user_vertices(self):
2236        points_ab = [[0.1,1],[0.4,.2],[7,5],[10,5]]
2237        geo =  Geo_reference(56,23,21)
2238        points = geo.change_points_geo_ref(points_ab)
2239        spat = Geospatial_data(points, geo_reference=geo)
2240       
2241        geo_mesh =  Geo_reference(56,100,200)
2242        m = Mesh(geo_reference=geo_mesh)
2243        m.add_vertices(spat)
2244
2245        vert = m.getUserVertices()
2246        #print "vert",vert
2247        self.failUnless(4==len(vert),
2248                        'FAILED!')
2249        vert= m.get_user_vertices(absolute=True)
2250        self.failUnless(vert==points_ab,
2251                        'FAILED!')
2252        vert= m.get_user_vertices(absolute=False)
2253        points_new = m.geo_reference.get_absolute(vert)
2254       
2255        self.failUnless(points_ab==points_new,
2256                        'FAILED!')
2257
2258    def mode_string_float_problems(self):
2259        numbers = [0.0000000001,1000000000000.0, 1e-19,1e19, 1e-25,1e30,1e40,
2260                   1e41,'0.00001','0.000000000000000000000000000000000001']
2261        numbers = [1e-21,1e-20,1e30,1e35,1e40]
2262        for num in numbers:
2263            mode = 'a' + str(num)
2264            #print " mode += 'a' + str(num)", mode
2265            print "====================="
2266           
2267            try:
2268                mode = 'a' + '%20.20f' %num
2269            except TypeError:
2270                mode = 'a' + str(num)
2271            print "mode += 'a' + '%20.20f' %num", mode
2272        #print "", mode
2273       
2274 
2275   
2276    def testgenerateMesh_calc_mesh_area(self):
2277        a = Vertex (0.0, 0.0)
2278        d = Vertex (0.0, 4.0)
2279        f = Vertex (4.0,0.0)
2280
2281        s1 = Segment(a,d)
2282        s2 = Segment(d,f)
2283        s3 = Segment(a,f)
2284
2285        r1 = Region(0.3, 0.3,tag = 1.3,maxArea = .6)
2286        #print r1
2287        m = Mesh(userVertices=[a,d,f], userSegments=[s1,s2,s3], regions=[r1] )
2288       
2289        m.generateMesh("Q", maxArea = 2.1 )
2290        calc_mesh_area = m.tri_mesh.calc_mesh_area()
2291        #print "calc_mesh_area", calc_mesh_area
2292        delta  = 0.0000000001
2293        self.failUnless((8.0 < calc_mesh_area + delta) or
2294                        (8.0 > calc_mesh_area - delta),
2295                        'generated mesh is wrong!')
2296       
2297def list_comp(A,B):
2298    yes = len(A)==len(B)
2299    for item in A:
2300        if not item in B:
2301            yes = False
2302    return yes
2303           
2304#-------------------------------------------------------------
2305if __name__ == "__main__":
2306    suite = unittest.makeSuite(meshTestCase,'test')
2307    #suite = unittest.makeSuite(meshTestCase,'mode_string_float_problems')
2308    #suite = unittest.makeSuite(meshTestCase,'test_import_mesh')
2309    #suite = unittest.makeSuite(meshTestCase,'test_asciiFile')
2310    #suite = unittest.makeSuite(meshTestCase,'test_mesh2IO')
2311    #suite = unittest.makeSuite(meshTestCase,'test_add_points_and_segmentsII')
2312    runner = unittest.TextTestRunner() #verbosity=2)
2313    runner.run(suite)
2314   
Note: See TracBrowser for help on using the repository browser.