Changeset 702
- Timestamp:
- Dec 14, 2004, 8:48:23 AM (20 years ago)
- Location:
- inundation/ga/storm_surge/pmesh
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
inundation/ga/storm_surge/pmesh/documentation/issues.txt
r687 r702 2 2 3 3 OPEN - issues that have not beeen resolved 4 Issue: Ole thought that the regional mesh max areas were incorrect 5 when a .tsh file was loaded. Maybe it was that the overall max area 6 is not saved. It's hard coded in MeshGenDialog. 7 Importance: Medium 8 Suggested Action: Fix when .tsh goes NETCDF 9 4 10 Issue: Catch error if .tsh file is a bad format. 5 11 suggestion: auick and dirty try - except -
inundation/ga/storm_surge/pmesh/mesh.py
r679 r702 13 13 Geoscience Australia 14 14 """ 15 16 15 import load_mesh.loadASCII 17 16 import alpha_shape.alpha_shape … … 386 385 self.meshSegments, 387 386 self.meshVertices, 388 self. userSegments,387 self.getUserSegments(), 389 388 self.userVertices, 390 389 self.holes, … … 400 399 else: 401 400 self.userSegments=userSegments 401 self.alphaUserSegments=[] 402 402 403 403 if userVertices is None: … … 535 535 536 536 def getUserSegments(self): 537 return self.userSegments 538 537 allSegments = self.userSegments + self.alphaUserSegments 538 #print "self.userSegments",self.userSegments 539 #print "self.alphaUserSegments",self.alphaUserSegments 540 #print "allSegments",allSegments 541 return allSegments 542 543 def deleteUserSegments(self,seg): 544 if self.userSegments.count(seg) == 0: 545 self.alphaUserSegments.remove(seg) 546 pass 547 else: 548 self.userSegments.remove(seg) 549 550 def clearUserSegments(self): 551 self.userSegments = [] 552 self.alphaUserSegments = [] 553 539 554 def getTriangulation(self): 540 555 return self.meshTriangles … … 579 594 This function will keep the first duplicate 580 595 """ 581 assert self. userSegments== []596 assert self.getUserSegments() == [] 582 597 self.userVertices, counter = self.removeDuplicatedVertices(self.userVertices) 583 598 return counter … … 625 640 This function will keep the first duplicate 626 641 """ 627 assert self. userSegments== []642 assert self.getUserSegments() == [] 628 643 #t = self.userVertices 629 644 #self.userVertices =[] … … 652 667 653 668 def isUserSegmentNew(self, v1,v2): 669 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) ] 670 671 return len(identicalSegs) == 0 672 673 def representedAlphaUserSegment(self, v1,v2): 674 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) ] 675 676 if identicalSegs == []: 677 return None 678 else: 679 # Only return the first one. 680 return identicalSegs[0] 681 682 def representedUserSegment(self, v1,v2): 654 683 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) ] 655 656 return len(identicalSegs) == 0 657 684 685 if identicalSegs == []: 686 return None 687 else: 688 # Only return the first one. 689 return identicalSegs[0] 690 658 691 def deleteSegsOfVertex(self, delVertex): 659 692 """ … … 662 695 #Find segments that connect to delVertex 663 696 deletedSegments = [] 664 for seg in self. userSegments:697 for seg in self.getUserSegments(): 665 698 if (delVertex in seg.vertices): 666 699 deletedSegments.append(seg) 667 700 # Delete segments that connect to delVertex 668 701 for seg in deletedSegments: 669 self.userSegments.remove(seg) 670 # Delete delVertex 671 # self.userVertices.remove(delVertex) 702 self.deleteUserSegments(seg) 672 703 return deletedSegments 673 704 … … 684 715 elif isinstance(MeshObject, Segment): 685 716 deletedObs.append(MeshObject) 686 self. userSegments.remove(MeshObject)717 self.deleteUserSegments(MeshObject) 687 718 elif isinstance(MeshObject, Hole): 688 719 deletedObs.append(MeshObject) … … 721 752 segmentlist=[] 722 753 segmentmarkerlist=[] 723 for seg in self. userSegments:754 for seg in self.getUserSegments(): 724 755 segmentlist.append((seg.vertices[0].index,seg.vertices[1].index)) 725 756 segmentmarkerlist.append(seg.marker) 726 757 meshDict['segmentlist'] =segmentlist 727 meshDict['segmentmarkerlist'] =segmentmarkerlist 728 758 meshDict['segmentmarkerlist'] =segmentmarkerlist 729 759 holelist=[] 730 760 for hole in self.holes: … … 913 943 914 944 #Clear the current user mesh values 915 self. userSegments=[]945 self.clearUserSegments() 916 946 self.userVertices=[] 917 947 self.Holes=[] … … 991 1021 #index +=1 992 1022 self.userSegments.append(segObject) 993 1023 #DSG!!! 1024 994 1025 def TestautoSegment(self): 995 1026 newsegs = [] … … 1006 1037 if self.isUserSegmentNew(s3.vertices[0],s3.vertices[1]): 1007 1038 newsegs.append(s3) 1039 #DSG!!! 1008 1040 self.userSegments.extend(newsegs) 1009 1041 return newsegs … … 1059 1091 newseg = Segment(v1, v2) 1060 1092 newsegs.append(newseg) 1093 #DSG!!! 1061 1094 self.userSegments.extend(newsegs) 1062 1095 return newsegs 1063 1096 1064 def autoSegment(self): 1065 """ 1066 1097 def autoSegment(self, alpha = None): 1098 """ 1067 1099 Precon: There must be 3 or more vertices in the userVertices structure 1068 1100 """ 1069 1070 1101 1071 1102 points=[] 1072 1103 for vertex in self.getUserVertices(): 1073 1104 points.append((vertex.x,vertex.y)) 1074 1075 shape = alpha_shape.alpha_shape.Alpha_Shape(points) 1105 shape = alpha_shape.alpha_shape.Alpha_Shape(points, alpha = alpha) 1076 1106 boundary_segs = shape.get_boundary() 1077 1107 1078 newsegs = [] 1108 segs2delete = self.alphaUserSegments 1109 #for neededseg in boundary_segs: 1110 # try: 1111 # segs2delete.remove(neededseg) 1112 # print "list delete",neededseg 1113 # except: 1114 # print "list don't delete",neededseg 1115 #addback = [] 1116 #for delseg in segs2delete: 1117 # print "boundary_segs.count(delseg)",boundary_segs.count(delseg) 1118 # if boundary_segs.count(delseg) > 0: 1119 # #Don't delete this seg. We need it for the new boundary 1120 # addback.append(delseg) 1121 #for seg in addback: 1122 # segs2delete.remove(seg) 1123 1124 new_segs = [] 1125 alpha_segs = [] 1126 user_segs = [] 1079 1127 for seg in boundary_segs: 1080 1128 v1 = self.userVertices[int(seg[0])] 1081 1129 v2 = self.userVertices[int(seg[1])] 1082 if self.isUserSegmentNew(v1, v2): 1130 alpha_seg = self.representedAlphaUserSegment(v1, v2) 1131 user_seg = self.representedUserSegment(v1, v2) 1132 #DSG!!! 1133 assert not(not (alpha_seg == None) and not (user_seg == None)) 1134 if not alpha_seg == None: 1135 alpha_segs.append(alpha_seg) 1136 elif not user_seg == None: 1137 user_segs.append(user_seg) 1138 else: 1083 1139 unique_seg = Segment(v1, v2) 1084 newsegs.append(unique_seg) 1085 self.userSegments.extend(newsegs) 1086 return newsegs 1140 new_segs.append(unique_seg) 1141 1142 for seg in alpha_segs: 1143 try: 1144 segs2delete.remove(seg) 1145 except: 1146 pass 1147 1148 self.alphaUserSegments = [] 1149 self.alphaUserSegments.extend(new_segs) 1150 self.alphaUserSegments.extend(alpha_segs) 1151 1152 optimum_alpha = shape.get_alpha() 1153 # need to draw newsegs 1154 return new_segs, segs2delete, optimum_alpha 1087 1155 1088 1156 def joinVertices(self): … … 1111 1179 1112 1180 #Update list of user segments 1181 #DSG!!! 1113 1182 self.userSegments.extend(newsegs) 1114 1183 return newsegs … … 1305 1374 text.pack() 1306 1375 1307 for segment in self. userSegments:1376 for segment in self.getUserSegments(): 1308 1377 segment.draw(canvas,SCALE, xoffset, yoffset ) 1309 1378 … … 1335 1404 self.writeASCIImesh(fd, 1336 1405 self.userVertices, 1337 self. userSegments,1406 self.getUserSegments(), 1338 1407 self.holes, 1339 1408 self.regions) … … 1359 1428 self.writeASCIIsegmentoutline(fd, 1360 1429 self.userVertices, 1361 self. userSegments,1430 self.getUserSegments(), 1362 1431 self.holes, 1363 1432 self.regions) … … 1414 1483 self.writeASCIImesh(fd, 1415 1484 verts, 1416 self. userSegments,1485 self.getUserSegments(), 1417 1486 self.holes, 1418 1487 self.regions) … … 1431 1500 self.writeASCIImesh(fd, 1432 1501 self.userVertices, 1433 self. userSegments,1502 self.getUserSegments(), 1434 1503 self.holes, 1435 1504 self.regions) -
inundation/ga/storm_surge/pmesh/meshHarness.py
r650 r702 219 219 'Segment should not be new. ') 220 220 221 222 def testisUserSegmentNew (self): 223 mesh = Mesh() 224 a = mesh.addUserVertex(0.0, 0.0) 225 b = mesh.addUserVertex (0.0, 2.0) 226 c = mesh.addUserVertex (2.0,0.0) 227 d = mesh.addUserVertex (2.0,3.0) 228 229 s1 = mesh.addUserSegment(a,b) 230 s2 = mesh.addUserSegment(a,c) 231 s3 = mesh.addUserSegment(c,b) 232 233 self.failUnless(mesh.representedUserSegment(a,d) == None, 234 'Segment should be new. ') 235 self.failUnless(mesh.representedUserSegment(a,b) == s1 , 236 'Segment should not be new. ') 221 237 222 238 def testautoSegment(self): 223 a = Vertex (0.0, 0.0) 224 d = Vertex (0.0, 4.0) 225 f = Vertex (4.0,4.0) 226 g = Vertex (4.0,0.0) 227 228 s1 = Segment(a,d) 229 #s2 = Segment(a,f) 230 #s3 = Segment(f,d) 231 232 m = Mesh(userVertices=[a,d,f,g], userSegments=[s1] ) 233 239 p0 = Vertex (0.0, 0.0) 240 p1 = Vertex (0.0, 4.0) 241 p2 = Vertex (4.0,4.0) 242 p3 = Vertex (4.0,0.0) 243 244 s1 = Segment(p0,p1) 245 246 m = Mesh(userVertices=[p0, p1, p2, p3], userSegments=[s1] ) 247 m.autoSegment() 248 249 #print 'Len', len(m.userSegments) 250 self.failUnless(len(m.getUserSegments()) == 4 , 251 'userSegments is wrong!') 252 253 m.autoSegment() 254 self.failUnless(len(m.getUserSegments()) == 4 , 255 'userSegments is wrong!') 256 257 def testautoSegmentII(self): 258 p1 = Vertex (3.0, 4.0) 259 p2 = Vertex (3.0,2.0) 260 p3 = Vertex (3.0,0.0) 261 p4 = Vertex (6.0, 4.0) 262 p5 = Vertex (6.0,2.0) 263 p0 = Vertex (6.0,0.0) 264 265 266 s1 = Segment(p2,p3) 267 s2 = Segment(p4,p5) 268 269 m = Mesh(userVertices=[p0, p1, p2, p3, p4, p5], 270 userSegments=[s1, s2]) 271 272 m.autoSegment() 273 274 s3 = m.representedAlphaUserSegment(p3,p0) 275 self.failUnless(not (s3 == None) , 276 'userSegments is wrong!') 277 278 279 s6 = m.representedAlphaUserSegment(p1,p4) 280 self.failUnless(not (s6 == None) , 281 'userSegments is wrong!') 282 283 # remove a segment, add a point, autosegment 284 m.alphaUserSegments.remove(s3) 285 p6 = Vertex (1.0, 2.0) 286 m.userVertices.append(p6) 287 m.autoSegment() 288 289 s1_now = m.representedUserSegment(p3,p2) 290 self.failUnless(s1_now == s1 , 291 'userSegments is wrong!') 292 293 s2_now = m.representedUserSegment(p5,p4) 294 self.failUnless(s2_now == s2 , 295 'userSegments is wrong!') 296 297 s3 = m.representedAlphaUserSegment(p3,p6) 298 self.failUnless(not (s3 == None) , 299 'userSegments is wrong!') 300 301 s4 = m.representedAlphaUserSegment(p3,p6) 302 self.failUnless(not (s4 == None) , 303 'userSegments is wrong!') 304 305 s5 = m.representedAlphaUserSegment(p4,p6) 306 self.failUnless(s5 == None , 307 'userSegments is wrong!') 308 309 s6_now = m.representedAlphaUserSegment(p1,p4) 310 self.failUnless(s6_now == s6 , 311 'userSegments is wrong!') 312 313 314 234 315 #print m 235 316 236 m.autoSegment()237 238 #print m239 240 #print 'Len', len(m.userSegments)241 242 self.failUnless(len(m.userSegments) == 4 ,243 'userSegments is wrong!')244 245 317 def testRegions(self): 246 318 a = Vertex (0.0, 0.0) … … 939 1011 #------------------------------------------------------------- 940 1012 if __name__ == "__main__": 941 suite = unittest.makeSuite(meshTestCase,'test') 942 runner = unittest.TextTestRunner() 1013 suite = unittest.makeSuite(meshTestCase,'test') 1014 #suite = unittest.makeSuite(meshTestCase,'testautoSegment') 1015 runner = unittest.TextTestRunner() #verbosity=2) 943 1016 runner.run(suite) 944 1017 -
inundation/ga/storm_surge/pmesh/pmesh.py
r679 r702 4 4 from tkSimpleDialog import Dialog 5 5 import mesh 6 from Tkinter import FALSE,TRUE, Frame,X, LEFT,YES,BOTH,ALL,Widget,CURRENT, Label,W, Entry, E, StringVar, END 6 from Tkinter import FALSE,TRUE, Frame,X, LEFT,YES,BOTH,ALL,Widget,CURRENT, Label,W, Entry, E, StringVar, END, Checkbutton, Radiobutton, IntVar 7 7 #from cursornames import TLC,TRC, BLC, BRC, TS, RS, LS, BS 8 8 from tkMessageBox import showerror, _show, QUESTION,YESNOCANCEL … … 17 17 TRIANGLE_COLOUR = 'green' 18 18 APPLICATION_NAME = 'Pmesh' 19 20 NO_SELECTION = 0 21 AUTO = 1 22 SET_ALPHA = 2 19 23 20 24 class Draw(AppShell.AppShell): … … 187 191 ('default', self.windowDefault, 'set default value for selected mode'), 188 192 ('joinVer', self.joinVerticesButton, 'add Segments to connect all vertices'), 189 ('autoSegHull', self.autoSegmentHullButton, 'add Segments to form alpha shape, using Hull'), 190 ('autoSeg', self.autoSegmentButton, 'add Segments to form alpha shape'), 193 # ('autoSegHull', self.autoSegmentHullButton, 'add Segments to form alpha shape, using Hull'), 194 # ('autoSeg', self.autoSegmentButton, 'add Segments to form alpha shape'), 195 ('autoSegGiveAlpha', self.autoSegmentGiveAlphaButton, 'add Segments to form alpha shape, specify alpha'), 191 196 ('meshGen', self.windowMeshGen, 'Generate Mesh')]: 192 197 ToolBarButton(self, self.toolbar, key, '%s.gif' % key, … … 366 371 def autoSegmentButton (self, parent): 367 372 self.autoSegment() 368 369 def autoSegment (self): 373 374 375 def autoSegmentGiveAlphaButton (self, parent): 376 dialog = AutoSegmentDialog(self.canvas, self.meshLastAlpha) 377 if dialog.var.get() == SET_ALPHA: 378 if dialog.alphaValueOk: 379 self.autoSegment(alpha = dialog.alpha) 380 else: 381 showerror('pMesh', 382 'Bad alpha value.') 383 else: 384 self.autoSegment() 385 386 387 def autoSegment (self, alpha = None): 370 388 """ 371 389 add Segments to bound all vertices … … 376 394 """ 377 395 if len(self.mesh.getUserVertices()) >= 3: 378 newsegs = self.mesh.autoSegment() 396 if alpha == None: 397 newsegs, ObjectsToVisuallyDelete, self.meshLastAlpha = self.mesh.autoSegment() 398 else: 399 newsegs, ObjectsToVisuallyDelete, self.meshLastAlpha = self.mesh.autoSegment(alpha) 400 401 #print "newsegs",newsegs 402 #print "ObjectsToVisuallyDelete",ObjectsToVisuallyDelete 403 404 for drawOb in ObjectsToVisuallyDelete: 405 self.UserMesh.unvisualise(drawOb, self.canvas) 406 379 407 for segment in newsegs: 380 408 self.serial +=1 … … 384 412 self.canvas, 385 413 self.SCALE) 414 386 415 else: 387 416 showerror('pMesh', … … 1034 1063 mesh.Segment.set_default_tag("") 1035 1064 self.UserMeshChanged = False 1065 self.meshLastAlpha = None 1036 1066 1037 1067 def ipostscript(self): … … 1109 1139 self.xstr.grid(row=0, column=1, sticky=W) 1110 1140 self.ystr.grid(row=1, column=1, sticky=W) 1111 1141 self.xstr.focus_force() 1112 1142 self.x = 0 1113 1143 self.y = 0 … … 1115 1145 1116 1146 1147 class AutoSegmentDialog(Dialog): 1148 """ 1149 Dialog box for adding segments 1150 """ 1151 def __init__(self, parent, alpha): 1152 self.alpha = alpha 1153 Dialog.__init__(self, parent) 1154 1155 def body(self, master): 1156 """ 1157 GUI description 1158 """ 1159 self.title("Automatically Add Segments") 1160 1161 self.var = IntVar() 1162 self.var.set(AUTO) # should initialise the radio buttons. It doesn't 1163 #self.var.set(NO_SELECTION) 1164 self.ck = Radiobutton(master, value = AUTO, variable=self.var) 1165 self.ck.grid(row=1, column=0) 1166 Label(master, text='Use optimum alpha').grid(row=1, column=1, sticky=W) 1167 1168 self.ck2 = Radiobutton(master, value = SET_ALPHA, variable=self.var) 1169 self.ck2.grid(row=2, column=0) 1170 1171 Label(master, text='alpha:').grid(row=2, column=1, sticky=W) 1172 if (self.alpha): 1173 alphaVar = StringVar() 1174 alphaVar.set(self.alpha) 1175 self.alpha_str = Entry(master, 1176 textvariable = alphaVar, 1177 width = 16, name ="entry") 1178 else: 1179 self.alpha_str = Entry(master, width = 16, name ="entry") 1180 1181 self.alpha_str.grid(row=2, column=3, sticky=W) 1182 1183 self.alpha = 0 1184 self.alphaValueOk = False 1185 1186 1117 1187 def apply(self): 1118 1188 """ … … 1120 1190 """ 1121 1191 try: 1122 self.x = float(self.xstr.get()) 1123 self.y = float(self.ystr.get()) 1124 self.xyValuesOk = True 1192 self.alpha = float(self.alpha_str.get()) 1193 self.alphaValueOk = True 1125 1194 1126 1195 except ValueError: 1127 showerror('Bad Vertex values', 1128 'X Y values are not numbers.') 1196 pass 1197 #showerror('Bad Alpha value', 1198 # 'Alpha is negative.') 1129 1199 1130 1200 … … 1140 1210 1141 1211 def __init__(self, 1142 pa rent,1212 paent, 1143 1213 minAngle, 1144 1214 maxArea, … … 1184 1254 self.maxAreastr = Entry(master, 1185 1255 width = 16) 1256 self.maxAreastr.focus_force() 1186 1257 numTrianglesVar = StringVar() 1187 1258 numTrianglesVar.set(self.numTriangles)
Note: See TracChangeset
for help on using the changeset viewer.