Changeset 2261 for inundation/pmesh
- Timestamp:
- Jan 20, 2006, 10:59:35 AM (19 years ago)
- Location:
- inundation/pmesh
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
inundation/pmesh/mesh.py
r2243 r2261 358 358 return self.vertices 359 359 360 def get_vertices(self): 361 """ 362 Return a list of the vertices. The x and y values will be absolute 363 Easting and Northings for the zone of the current geo_ref. 364 """ 365 return self.vertices 366 360 367 def calcArea(self): 361 368 ax = self.vertices[0].x … … 571 578 572 579 return (dic.__cmp__(dic_other)) 573 574 def generateMesh(self, mode = None, maxArea = None, isRegionalMaxAreas = True): 580 581 def addUserPoint(self, pointType, x,y): 582 if pointType == Vertex: 583 point = self.addUserVertex(x,y) 584 if pointType == Hole: 585 point = self._addHole(x,y) 586 if pointType == Region: 587 point = self._addRegion(x,y) 588 return point 589 590 def addUserVertex(self, x,y): 591 v=Vertex(x, y) 592 self.userVertices.append(v) 593 return v 594 595 def _addHole(self, x,y): 596 h=Hole(x, y) 597 self.holes.append(h) 598 return h 599 600 def _addRegion(self, x,y): 601 h=Region(x, y) 602 self.regions.append(h) 603 return h 604 605 def add_region(self, x,y, geo_reference=None): 606 [x,y] = self.geo_reference.change_points_geo_ref([x,y], 607 points_geo_ref=geo_reference) 608 return self._addRegion(x, y) 609 610 # Depreciated 611 def addRegionEN(self, x,y): 612 print "depreciated, use add_region" 613 return self.add_region(x,y) 614 615 def add_region_from_polygon(self, polygon, tags=None, 616 max_area=None, geo_reference=None): 617 """ 618 Add a polygon with tags to the current mesh, as a region. 619 The maxArea of the region can be specified. 620 621 If a geo_ref is given, this is used. 622 If not; 623 The x,y info is assumed to be Easting and Northing, absolute, 624 for the meshes zone. 625 626 polygon a list of points, in meters that describe the polygon 627 (e.g. [[x1,y1],[x2,y2],...] 628 tags (e.g.{'wall':[0,1,3],'ocean':[2]}) 629 630 This returns the region instance, so if the user whats to modify 631 it they can. 632 633 """ 634 #FIXME: take into account georef on mesh side 635 polygon = self.geo_reference.change_points_geo_ref(polygon, 636 points_geo_ref=geo_reference) 637 #print "polygon - should be relative to mesh geo_ref",polygon 638 #create points, segs and tags 639 region_dict = {} 640 region_dict['points'] = polygon 641 642 #Create segments 643 #E.g. [[0,1], [1,2], [2,3], [3,0]] 644 #from polygon 645 #[0,1,2,3] 646 segments = [] 647 N = len(polygon) 648 for i in range(N): 649 lo = i 650 hi = (lo + 1) % N 651 segments.append( [lo, hi] ) 652 region_dict['segments'] = segments 653 654 655 #Create tags 656 #E.g. ['wall', 'wall', 'ocean', 'wall'] 657 # from a dic 658 #{'wall':[0,1,3],'ocean':[2]} 659 segment_tags = ['']*N 660 if tags is not None: 661 for key in tags: 662 indices = tags[key] 663 for i in indices: 664 segment_tags[i] = key 665 region_dict['segment_tags'] = segment_tags 666 667 self.addVertsSegs(region_dict) #this is assuming absolute geos 668 669 #get inner point 670 inner_point = point_in_polygon(polygon) 671 inner = self.add_region(inner_point[0], inner_point[1], 672 geo_reference=self.geo_reference) 673 674 if max_area is not None: 675 inner.setMaxArea(max_area) 676 return inner 677 678 def getUserVertices(self): 679 return self.userVertices 680 681 def getUserSegments(self): 682 allSegments = self.userSegments + self.alphaUserSegments 683 #print "self.userSegments",self.userSegments 684 #print "self.alphaUserSegments",self.alphaUserSegments 685 #print "allSegments",allSegments 686 return allSegments 687 688 def deleteUserSegments(self,seg): 689 if self.userSegments.count(seg) == 0: 690 self.alphaUserSegments.remove(seg) 691 pass 692 else: 693 self.userSegments.remove(seg) 694 695 def clearUserSegments(self): 696 self.userSegments = [] 697 self.alphaUserSegments = [] 698 699 def getTriangulation(self): 700 return self.meshTriangles 701 702 def getMeshVertices(self): 703 return self.meshVertices 704 705 def getMeshSegments(self): 706 return self.meshSegments 707 708 def getHoles(self): 709 return self.holes 710 711 def getRegions(self): 712 return self.regions 713 714 def isTriangulation(self): 715 if self.meshVertices == []: 716 return False 717 else: 718 return True 719 720 def addUserSegment(self, v1,v2): 721 """ 722 PRECON: A segment between the two vertices is not already present. 723 Check by calling isUserSegmentNew before calling this function. 724 725 """ 726 s=Segment( v1,v2) 727 self.userSegments.append(s) 728 return s 729 730 def generateMesh(self, mode = None, maxArea = None, 731 isRegionalMaxAreas = True): 575 732 """ 576 733 Based on the current user vaules, holes and regions … … 592 749 # it's more comlex than this. eg holes 593 750 if not re.match('z',self.mode): 594 self.mode += 'z' # z - Number all items starting from zero (rather than one) 751 self.mode += 'z' # z - Number all items starting from zero 752 # (rather than one) 595 753 if not re.match('n',self.mode): 596 754 self.mode += 'n' # n - output a list of neighboring triangles … … 631 789 #print "generated",generatedMesh 632 790 generatedMesh['generatedsegmentmarkerlist'] = \ 633 791 segment_ints2strings(generatedMesh['generatedsegmentmarkerlist'], 634 792 segconverter) 635 793 #print "processed gen",generatedMesh['generatedsegmentmarkerlist'] … … 641 799 if len(generatedMesh['generatedpointattributelist'][0])==0: 642 800 self.attributeTitles = [] 643 generatedMesh['generatedpointattributetitlelist']=self.attributeTitles 801 generatedMesh['generatedpointattributetitlelist']= \ 802 self.attributeTitles 644 803 645 804 self.setTriangulation(generatedMesh) 646 647 def addUserPoint(self, pointType, x,y):648 if pointType == Vertex:649 point = self.addUserVertex(x,y)650 if pointType == Hole:651 point = self.addHole(x,y)652 if pointType == Region:653 point = self.addRegion(x,y)654 return point655 656 def addUserVertex(self, x,y):657 v=Vertex(x, y)658 self.userVertices.append(v)659 return v660 661 def addHole(self, x,y):662 h=Hole(x, y)663 self.holes.append(h)664 return h665 666 def addRegion(self, x,y):667 h=Region(x, y)668 self.regions.append(h)669 return h670 671 #FIXME(DSG-DSG) remove EN, have a relative flag.672 def addRegionEN(self, x,y):673 h=Region(x-self.geo_reference.xllcorner,674 y-self.geo_reference.yllcorner)675 self.regions.append(h)676 return h677 def addRegionFromPolygon(self, polygon, tags=None,678 maxArea=None, Geo_ref=None):679 #take into account georef680 #create points, segs and tags681 region_dict = {}682 region_dict['points'] = polygon683 684 #Create segments685 #E.g. [[0,1], [1,2], [2,3], [3,0]]686 segments = []687 N = len(polygon)688 for i in range(N):689 lo = i690 hi = (lo + 1) % N691 segments.append( [lo, hi] )692 region_dict['segments'] = segments693 694 695 #Create tags696 #E.g. ['wall', 'wall', 'ocean', 'wall']697 698 segment_tags = ['']*N699 if tags is not None:700 for key in tags:701 indices = tags[key]702 for i in indices:703 segment_tags[i] = key704 region_dict['segment_tags'] = segment_tags705 706 self.addVertsSegs(region_dict) #this is assuming absolute geos707 708 #get inner point709 inner_point = point_in_polygon(polygon)710 inner = self.addRegionEN(inner_point[0], inner_point[1])711 712 if maxArea is not None:713 inner.setMaxArea(maxArea)714 715 def getUserVertices(self):716 return self.userVertices717 718 def getUserSegments(self):719 allSegments = self.userSegments + self.alphaUserSegments720 #print "self.userSegments",self.userSegments721 #print "self.alphaUserSegments",self.alphaUserSegments722 #print "allSegments",allSegments723 return allSegments724 725 def deleteUserSegments(self,seg):726 if self.userSegments.count(seg) == 0:727 self.alphaUserSegments.remove(seg)728 pass729 else:730 self.userSegments.remove(seg)731 732 def clearUserSegments(self):733 self.userSegments = []734 self.alphaUserSegments = []735 736 def getTriangulation(self):737 return self.meshTriangles738 739 def getMeshVertices(self):740 return self.meshVertices741 742 def getMeshSegments(self):743 return self.meshSegments744 745 def getHoles(self):746 return self.holes747 748 def getRegions(self):749 return self.regions750 751 def isTriangulation(self):752 if self.meshVertices == []:753 return False754 else:755 return True756 757 def addUserSegment(self, v1,v2):758 """759 PRECON: A segment between the two vertices is not already present.760 Check by calling isUserSegmentNew before calling this function.761 762 """763 s=Segment( v1,v2)764 self.userSegments.append(s)765 return s766 805 767 806 def clearTriangulation(self): … … 777 816 """ 778 817 assert self.getUserSegments() == [] 779 self.userVertices, counter = self.removeDuplicatedVertices(self.userVertices) 818 self.userVertices, counter = self.removeDuplicatedVertices( 819 self.userVertices) 780 820 return counter 781 821 … … 852 892 853 893 def isUserSegmentNew(self, v1,v2): 854 identicalSegs= [x for x in self.getUserSegments() if (x.vertices[0] == v1 and x.vertices[1] == v2) or (x.vertices[0] == v2 and x.vertices[1] == v1) ] 894 identicalSegs= [x for x in self.getUserSegments() \ 895 if (x.vertices[0] == v1 and x.vertices[1] == v2) 896 or (x.vertices[0] == v2 and x.vertices[1] == v1) ] 855 897 856 898 return len(identicalSegs) == 0 … … 897 939 regions=None): 898 940 """ 899 Convert the Mesh to a dictionary of the lists needed for the triang modul; 941 Convert the Mesh to a dictionary of the lists needed for the 942 triang module 900 943 points list: [(x1,y1),(x2,y2),...] (Tuples of doubles) 901 944 pointattributelist: [(a11,a12,...),(a21,a22),...] (Tuples of doubles) 902 945 segment list: [(point1,point2),(p3,p4),...] (Tuples of integers) 903 hole list: [(x1,y1),...](Tuples of doubles, one inside each hole region)946 hole list: [(x1,y1),...](Tuples of doubles, one inside each hole) 904 947 regionlist: [ (x1,y1,tag, max area),...] (Tuple of 3-4 doubles) 905 948 … … 960 1003 def Mesh2MeshList(self): 961 1004 """ 962 Convert the Mesh to a dictionary of lists describing the triangulation variables; 1005 Convert the Mesh to a dictionary of lists describing the 1006 triangulation variables; 963 1007 generated point list: [(x1,y1),(x2,y2),...] (Tuples of doubles) 964 generated point attribute list: [(a11,a12,...),(a21,a22),...] (Tuples of doubles) 965 generated point attribute title list:[A1Title, A2Title ...] (list of strings) 966 generated segment list: [(point1,point2),(p3,p4),...] (Tuples of integers) 1008 generated point attribute list: [(a11,a12,...),(a21,a22),...] 1009 (Tuples of doubles) 1010 generated point attribute title list:[A1Title, A2Title ...] 1011 (list of strings) 1012 generated segment list: [(point1,point2),(p3,p4),...] 1013 (Tuples of integers) 967 1014 generated segment tag list: [tag,tag,...] list of strings 968 1015 … … 971 1018 generated triangle attribute list: [s1,s2,...] list of strings 972 1019 973 generated triangle neighbor list: [(t1,t2,t3), (t4,t5,t6),....] tuple of triangles 1020 generated triangle neighbor list: [(t1,t2,t3), (t4,t5,t6),....] 1021 tuple of triangles 974 1022 975 1023 Used to produce .tsh file … … 1010 1058 triangleneighborlist = [] 1011 1059 for tri in self.meshTriangles: 1012 trianglelist.append((tri.vertices[0].index,tri.vertices[1].index,tri.vertices[2].index)) 1060 trianglelist.append((tri.vertices[0].index,tri.vertices[1].index, 1061 tri.vertices[2].index)) 1013 1062 triangleattributelist.append([tri.attribute]) 1014 1063 neighborlist = [-1,-1,-1] … … 1046 1095 returned from the triang module 1047 1096 generated point list: [(x1,y1),(x2,y2),...] (Tuples of doubles) 1048 generated point attribute list:[(P1att1,P1attt2, ...),(P2att1,P2attt2,...),...] 1049 generated point attribute title list:[A1Title, A2Title ...] (list of strings) 1050 generated segment list: [(point1,point2),(p3,p4),...] (Tuples of integers) 1097 generated point attribute list:[(P1att1,P1attt2, ...), 1098 (P2att1,P2attt2,...),...] 1099 generated point attribute title list:[A1Title, A2Title ...] 1100 (list of strings) 1101 generated segment list: [(point1,point2),(p3,p4),...] 1102 (Tuples of integers) 1051 1103 generated segment marker list: [S1Tag, S2Tag, ...] (list of ints) 1052 triangle list: [(point1,point2, point3),(p5,p4, p1),...] (Tuples of integers) 1053 triangle neighbor list: [(triangle1,triangle2, triangle3),(t5,t4, t1),...] (Tuples of integers) -1 means there's no triangle neighbor 1054 triangle attribute list: [(T1att), (T2att), ...] (list of a list of strings) 1104 triangle list: [(point1,point2, point3),(p5,p4, p1),...] 1105 (Tuples of integers) 1106 triangle neighbor list: [(triangle1,triangle2, triangle3), 1107 (t5,t4, t1),...] (Tuples of integers) 1108 -1 means there's no triangle neighbor 1109 triangle attribute list: [(T1att), (T2att), ...] 1110 (list of a list of strings) 1055 1111 """ 1056 1112 #Clear the current generated mesh values … … 1074 1130 1075 1131 index = 0 1076 for seg,marker in map(None,genDict['generatedsegmentlist'],genDict['generatedsegmentmarkerlist']): 1132 for seg,marker in map(None,genDict['generatedsegmentlist'], 1133 genDict['generatedsegmentmarkerlist']): 1077 1134 segObject = Segment( self.meshVertices[seg[0]], 1078 1135 self.meshVertices[seg[1]], tag = marker ) … … 1115 1172 else: 1116 1173 ObjectNeighbor.append(None) 1117 self.meshTriangles[index].setNeighbors(ObjectNeighbor[0],ObjectNeighbor[1],ObjectNeighbor[2]) 1174 self.meshTriangles[index].setNeighbors(ObjectNeighbor[0], 1175 ObjectNeighbor[1], 1176 ObjectNeighbor[2]) 1118 1177 index += 1 1119 1178 … … 1150 1209 1151 1210 #index = 0 1152 for seg,tag in map(None,genDict['segmentlist'],genDict['segmenttaglist']): 1211 for seg,tag in map(None,genDict['segmentlist'], 1212 genDict['segmenttaglist']): 1153 1213 segObject = Segment( self.userVertices[seg[0]], 1154 1214 self.userVertices[seg[1]], tag = tag ) … … 1425 1485 1426 1486 def representedAlphaUserSegment(self, v1,v2): 1427 identicalSegs= [x for x in self.alphaUserSegments if (x.vertices[0] == v1 and x.vertices[1] == v2) or (x.vertices[0] == v2 and x.vertices[1] == v1) ] 1487 identicalSegs= [x for x in self.alphaUserSegments \ 1488 if (x.vertices[0] == v1 and x.vertices[1] == v2) 1489 or (x.vertices[0] == v2 and x.vertices[1] == v1) ] 1428 1490 1429 1491 if identicalSegs == []: … … 1434 1496 1435 1497 def representedUserSegment(self, v1,v2): 1436 identicalSegs= [x for x in self.userSegments if (x.vertices[0] == v1 and x.vertices[1] == v2) or (x.vertices[0] == v2 and x.vertices[1] == v1) ] 1498 identicalSegs= [x for x in self.userSegments \ 1499 if (x.vertices[0] == v1 and x.vertices[1] == v2) 1500 or (x.vertices[0] == v2 and x.vertices[1] == v1) ] 1437 1501 1438 1502 if identicalSegs == []: … … 1515 1579 def boxsizeVerts(self): 1516 1580 """ 1517 Returns a list of verts denoting a box or triangle that contains verts on the xmin, ymin, xmax and ymax axis. 1581 Returns a list of verts denoting a box or triangle that contains 1582 verts on the xmin, ymin, xmax and ymax axis. 1518 1583 Structure: list of verts 1519 1584 """ … … 1549 1614 ymax = vertex.y 1550 1615 ymaxVert = vertex 1551 verts, count = self.removeDuplicatedVertices([xminVert,xmaxVert,yminVert,ymaxVert]) 1616 verts, count = self.removeDuplicatedVertices([xminVert, 1617 xmaxVert, 1618 yminVert, 1619 ymaxVert]) 1552 1620 1553 1621 return verts … … 1555 1623 def boxsize(self): 1556 1624 """ 1557 Returns a list denoting a box that contains the entire structure of vertices 1625 Returns a list denoting a box that contains the entire 1626 structure of vertices 1558 1627 Structure: [xmin, ymin, xmax, ymax] 1559 1628 """ … … 1589 1658 def maxMinVertAtt(self, iatt): 1590 1659 """ 1591 Returns a list denoting a box that contains the entire structure of vertices 1660 Returns a list denoting a box that contains the entire structure 1661 of vertices 1592 1662 Structure: [xmin, ymin, xmax, ymax] 1593 1663 """ … … 1798 1868 triangle_neighbors = [] 1799 1869 for tri in self.meshTriangles: 1800 triangles.append([tri.vertices[0].index,tri.vertices[1].index,tri.vertices[2].index]) 1870 triangles.append([tri.vertices[0].index, 1871 tri.vertices[1].index, 1872 tri.vertices[2].index]) 1801 1873 triangle_tags.append(tri.attribute) 1802 1874 neighborlist = [-1,-1,-1] … … 1952 2024 else: 1953 2025 ObjectNeighbor.append(None) 1954 self.meshTriangles[index].setNeighbors(ObjectNeighbor[0],ObjectNeighbor[1],ObjectNeighbor[2]) 2026 self.meshTriangles[index].setNeighbors(ObjectNeighbor[0], 2027 ObjectNeighbor[1], 2028 ObjectNeighbor[2]) 1955 2029 index += 1 1956 2030 … … 1980 2054 1981 2055 #index = 0 1982 for seg,tag in map(None,genDict['outline_segments'],genDict['outline_segment_tags']): 2056 for seg,tag in map(None,genDict['outline_segments'], 2057 genDict['outline_segment_tags']): 1983 2058 segObject = Segment( self.userVertices[seg[0]], 1984 2059 self.userVertices[seg[1]], tag = tag ) … … 3504 3579 # Create a clear interface. eg 3505 3580 # have the interface methods more at the top of this file and add comments 3581 # for the interface functions/methods, use function_name (not functionName), 3582 3583 #Currently 3584 #function_name methods assume absolute values. Geo-refs can be passed in. 3585 # 3586 3587 # instead of functionName 3506 3588 if __name__ == "__main__": 3507 3589 #from mesh import * -
inundation/pmesh/test_mesh.py
r2200 r2261 1655 1655 #___________end of Peters tests 1656 1656 1657 def test_add RegionFromPolygon(self):1657 def test_add_region_from_polygon(self): 1658 1658 m=Mesh() 1659 m.add RegionFromPolygon([[0,0],[1,0],[0,1]])1659 m.add_region_from_polygon([[0,0],[1,0],[0,1]]) 1660 1660 self.failUnless(len(m.regions)==1, 1661 1661 'FAILED!') … … 1665 1665 'FAILED!') 1666 1666 1667 def test_add RegionFromPolygon2(self):1667 def test_add_region_from_polygon2(self): 1668 1668 m=Mesh() 1669 m.add RegionFromPolygon([[0,0],[1,0],[1,1],[0,1]],1669 m.add_region_from_polygon([[0,0],[1,0],[1,1],[0,1]], 1670 1670 {'tagin':[0,1],'bom':[2]}) 1671 1671 self.failUnless(len(m.regions)==1, … … 1685 1685 self.failUnless(segs[3].tag=='', 1686 1686 'FAILED!') 1687 1688 1689 1687 1688 def test_add_region_from_polygon3(self): 1689 x=0 1690 y=0 1691 m=Mesh(geo_reference=Geo_reference(56,x,y)) 1692 polygon = [[0,0],[1,0],[1,1],[0,1]] 1693 x_p = 1000 1694 y_p = 4000 1695 geo_ref_poly = Geo_reference(56, x_p, y_p) 1696 polygon = geo_ref_poly.change_points_geo_ref(polygon) 1697 #print "polygon", polygon 1698 m.add_region_from_polygon(polygon, 1699 {'tagin':[0,1],'bom':[2]}, 1700 geo_reference=geo_ref_poly) 1701 self.failUnless(len(m.regions)==1, 1702 'FAILED!') 1703 segs = m.getUserSegments() 1704 self.failUnless(len(segs)==4, 1705 'FAILED!') 1706 self.failUnless(len(m.userVertices)==4, 1707 'FAILED!') 1708 self.failUnless(segs[0].tag=='tagin', 1709 'FAILED!') 1710 self.failUnless(segs[1].tag=='tagin', 1711 'FAILED!') 1712 1713 self.failUnless(segs[2].tag=='bom', 1714 'FAILED!') 1715 self.failUnless(segs[3].tag=='', 1716 'FAILED!') 1717 verts = m.getUserVertices() 1718 #print "User verts",verts 1719 #print 'polygon',polygon 1720 #vert values are relative 1721 for point,new_point in map(None,polygon,verts): 1722 point_x = point[0] + geo_ref_poly.get_xllcorner() 1723 new_point_x = new_point.x + m.geo_reference.get_xllcorner() 1724 point_y = point[1] + geo_ref_poly.get_yllcorner() 1725 new_point_y = new_point.y + m.geo_reference.get_yllcorner() 1726 #print "point_y",point_y 1727 #print "new_point_y",new_point_y 1728 1729 self.failUnless(point_x == new_point_x, ' failed') 1730 self.failUnless(point_y == new_point_y, ' failed') 1731 1732 1733 #REJIG 1734 def test_add_region_from_polygon4(self): 1735 x=0 1736 y=0 1737 m=Mesh(geo_reference=Geo_reference(56,x,y)) 1738 polygon = [[0,0],[1,0],[1,1],[0,1]] 1739 1740 m.add_region_from_polygon(polygon, 1741 {'tagin':[0,1],'bom':[2]}) 1742 self.failUnless(len(m.regions)==1, 1743 'FAILED!') 1744 segs = m.getUserSegments() 1745 self.failUnless(len(segs)==4, 1746 'FAILED!') 1747 self.failUnless(len(m.userVertices)==4, 1748 'FAILED!') 1749 self.failUnless(segs[0].tag=='tagin', 1750 'FAILED!') 1751 self.failUnless(segs[1].tag=='tagin', 1752 'FAILED!') 1753 1754 self.failUnless(segs[2].tag=='bom', 1755 'FAILED!') 1756 self.failUnless(segs[3].tag=='', 1757 'FAILED!') 1758 verts = m.getUserVertices() 1759 #print "User verts",verts 1760 #print 'polygon',polygon 1761 #vert values are relative 1762 for point,new_point in map(None,polygon,verts): 1763 point_x = point[0] 1764 new_point_x = new_point.x + m.geo_reference.get_xllcorner() 1765 #print "point_x",point_x 1766 #print "new_point_x",new_point_x 1767 point_y = point[1] 1768 new_point_y = new_point.y + m.geo_reference.get_yllcorner() 1769 1770 self.failUnless(point_x == new_point_x, ' failed') 1771 self.failUnless(point_y == new_point_y, ' failed') 1772 1773 1774 1690 1775 def list_comp(A,B): 1691 1776 yes = len(A)==len(B) … … 1695 1780 return yes 1696 1781 1697 #___________end of Peters tests1698 1699 1782 #------------------------------------------------------------- 1700 1783 if __name__ == "__main__":
Note: See TracChangeset
for help on using the changeset viewer.