Changeset 702


Ignore:
Timestamp:
Dec 14, 2004, 8:48:23 AM (20 years ago)
Author:
duncan
Message:

Added selection of different alpha values when generating segments automatically

Location:
inundation/ga/storm_surge/pmesh
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • inundation/ga/storm_surge/pmesh/documentation/issues.txt

    r687 r702  
    22
    33OPEN - issues that have not beeen resolved
     4Issue:  Ole thought that the regional mesh max areas were incorrect
     5when a .tsh file was loaded.  Maybe it was that the overall max area
     6is not saved.  It's hard coded in MeshGenDialog.
     7Importance: Medium
     8Suggested Action: Fix when .tsh goes NETCDF
     9
    410Issue: Catch error if .tsh file is a bad format.
    511suggestion: auick and dirty try - except
  • inundation/ga/storm_surge/pmesh/mesh.py

    r679 r702  
    1313   Geoscience Australia
    1414"""
    15 
    1615import load_mesh.loadASCII
    1716import alpha_shape.alpha_shape
     
    386385                                self.meshSegments,
    387386                                self.meshVertices,
    388                                 self.userSegments,
     387                                self.getUserSegments(),
    389388                                self.userVertices,
    390389                                self.holes,
     
    400399        else:
    401400            self.userSegments=userSegments
     401        self.alphaUserSegments=[]
    402402           
    403403        if userVertices is None:
     
    535535   
    536536    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               
    539554    def getTriangulation(self):
    540555        return self.meshTriangles
     
    579594        This function will keep the first duplicate
    580595        """
    581         assert self.userSegments == []
     596        assert self.getUserSegments() == []
    582597        self.userVertices, counter =  self.removeDuplicatedVertices(self.userVertices)
    583598        return counter
     
    625640        This function will keep the first duplicate
    626641        """
    627         assert self.userSegments == []
     642        assert self.getUserSegments() == []
    628643        #t = self.userVertices
    629644        #self.userVertices =[]
     
    652667           
    653668    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):
    654683        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       
    658691    def deleteSegsOfVertex(self, delVertex):
    659692        """
     
    662695        #Find segments that connect to delVertex
    663696        deletedSegments = []
    664         for seg in self.userSegments:
     697        for seg in self.getUserSegments():
    665698            if (delVertex in seg.vertices):
    666699                deletedSegments.append(seg)
    667700        # Delete segments that connect to delVertex
    668701        for seg in deletedSegments:
    669             self.userSegments.remove(seg)
    670         # Delete delVertex
    671         # self.userVertices.remove(delVertex)
     702            self.deleteUserSegments(seg)
    672703        return deletedSegments
    673704
     
    684715        elif isinstance(MeshObject, Segment):
    685716            deletedObs.append(MeshObject)
    686             self.userSegments.remove(MeshObject)
     717            self.deleteUserSegments(MeshObject)
    687718        elif isinstance(MeshObject, Hole):
    688719            deletedObs.append(MeshObject)
     
    721752        segmentlist=[]
    722753        segmentmarkerlist=[]
    723         for seg in self.userSegments:
     754        for seg in self.getUserSegments():
    724755            segmentlist.append((seg.vertices[0].index,seg.vertices[1].index))
    725756            segmentmarkerlist.append(seg.marker)
    726757        meshDict['segmentlist'] =segmentlist
    727         meshDict['segmentmarkerlist'] =segmentmarkerlist
    728 
     758        meshDict['segmentmarkerlist'] =segmentmarkerlist
    729759        holelist=[]
    730760        for hole in self.holes:
     
    913943
    914944        #Clear the current user mesh values
    915         self.userSegments=[]
     945        self.clearUserSegments()
    916946        self.userVertices=[]
    917947        self.Holes=[]
     
    9911021            #index +=1
    9921022            self.userSegments.append(segObject)
    993        
     1023            #DSG!!!
     1024           
    9941025    def TestautoSegment(self):
    9951026        newsegs = []
     
    10061037        if self.isUserSegmentNew(s3.vertices[0],s3.vertices[1]):
    10071038            newsegs.append(s3)
     1039        #DSG!!!
    10081040        self.userSegments.extend(newsegs)
    10091041        return newsegs
     
    10591091                newseg = Segment(v1, v2)
    10601092                newsegs.append(newseg)
     1093            #DSG!!!
    10611094        self.userSegments.extend(newsegs)
    10621095        return newsegs
    10631096     
    1064     def autoSegment(self):
    1065         """
    1066 
     1097    def autoSegment(self, alpha = None):
     1098        """
    10671099        Precon: There must be 3 or more vertices in the userVertices structure
    10681100        """
    1069 
    10701101       
    10711102        points=[]
    10721103        for vertex in self.getUserVertices():
    10731104            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)
    10761106        boundary_segs = shape.get_boundary()
    10771107
    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 = []
    10791127        for seg in boundary_segs:
    10801128            v1 = self.userVertices[int(seg[0])]
    10811129            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:
    10831139                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
    10871155     
    10881156    def joinVertices(self):
     
    11111179
    11121180        #Update list of user segments       
     1181        #DSG!!!
    11131182        self.userSegments.extend(newsegs)               
    11141183        return newsegs
     
    13051374            text.pack()
    13061375           
    1307             for segment in self.userSegments:
     1376            for segment in self.getUserSegments():
    13081377                segment.draw(canvas,SCALE, xoffset, yoffset )
    13091378               
     
    13351404        self.writeASCIImesh(fd,
    13361405                            self.userVertices,
    1337                             self.userSegments,
     1406                            self.getUserSegments(),
    13381407                            self.holes,
    13391408                            self.regions)   
     
    13591428        self.writeASCIIsegmentoutline(fd,
    13601429                            self.userVertices,
    1361                             self.userSegments,
     1430                            self.getUserSegments(),
    13621431                            self.holes,
    13631432                            self.regions)   
     
    14141483        self.writeASCIImesh(fd,
    14151484                            verts,
    1416                             self.userSegments,
     1485                            self.getUserSegments(),
    14171486                            self.holes,
    14181487                            self.regions)   
     
    14311500        self.writeASCIImesh(fd,
    14321501                            self.userVertices,
    1433                             self.userSegments,
     1502                            self.getUserSegments(),
    14341503                            self.holes,
    14351504                            self.regions)       
  • inundation/ga/storm_surge/pmesh/meshHarness.py

    r650 r702  
    219219                        'Segment should not be new. ')
    220220
     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. ')
    221237       
    222238    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       
    234315        #print m
    235316       
    236         m.autoSegment()
    237        
    238         #print m
    239 
    240         #print 'Len', len(m.userSegments)
    241 
    242         self.failUnless(len(m.userSegments) == 4 ,
    243                         'userSegments is wrong!')
    244      
    245317    def testRegions(self):
    246318        a = Vertex (0.0, 0.0)
     
    9391011#-------------------------------------------------------------
    9401012if __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)
    9431016    runner.run(suite)
    9441017   
  • inundation/ga/storm_surge/pmesh/pmesh.py

    r679 r702  
    44from   tkSimpleDialog import Dialog
    55import mesh
    6 from Tkinter import  FALSE,TRUE, Frame,X, LEFT,YES,BOTH,ALL,Widget,CURRENT, Label,W, Entry, E, StringVar, END
     6from Tkinter import  FALSE,TRUE, Frame,X, LEFT,YES,BOTH,ALL,Widget,CURRENT, Label,W, Entry, E, StringVar, END, Checkbutton, Radiobutton, IntVar
    77#from cursornames import TLC,TRC, BLC, BRC, TS, RS, LS, BS
    88from tkMessageBox import showerror, _show, QUESTION,YESNOCANCEL
     
    1717TRIANGLE_COLOUR = 'green'
    1818APPLICATION_NAME = 'Pmesh'
     19
     20NO_SELECTION = 0
     21AUTO = 1
     22SET_ALPHA = 2
    1923
    2024class Draw(AppShell.AppShell):
     
    187191                ('default', self.windowDefault, 'set default value for selected mode'),
    188192                ('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'),
    191196                ('meshGen', self.windowMeshGen, 'Generate Mesh')]:
    192197            ToolBarButton(self, self.toolbar, key, '%s.gif' % key,
     
    366371    def autoSegmentButton (self, parent):
    367372        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):
    370388        """
    371389        add Segments to bound all vertices
     
    376394        """
    377395        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               
    379407            for segment in newsegs:
    380408                self.serial +=1
     
    384412                                        self.canvas,
    385413                                        self.SCALE)
     414           
    386415        else:
    387416            showerror('pMesh',
     
    10341063        mesh.Segment.set_default_tag("")
    10351064        self.UserMeshChanged = False
     1065        self.meshLastAlpha = None
    10361066   
    10371067    def ipostscript(self):
     
    11091139        self.xstr.grid(row=0, column=1, sticky=W)
    11101140        self.ystr.grid(row=1, column=1, sticky=W)
    1111 
     1141        self.xstr.focus_force()
    11121142        self.x  = 0
    11131143        self.y  = 0
     
    11151145       
    11161146
     1147class  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
    11171187    def apply(self):
    11181188        """
     
    11201190        """
    11211191        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
    11251194           
    11261195        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.')
    11291199
    11301200
     
    11401210
    11411211    def __init__(self,
    1142                  parent,
     1212                 paent,
    11431213                 minAngle,
    11441214                 maxArea,
     
    11841254            self.maxAreastr  = Entry(master,
    11851255                                     width = 16)
     1256            self.maxAreastr.focus_force()
    11861257            numTrianglesVar = StringVar()
    11871258            numTrianglesVar.set(self.numTriangles)   
Note: See TracChangeset for help on using the changeset viewer.