コード例 #1
0
class MapCreator(QMainWindow):

    SOLID_WHITE,DOTTED_WHITE,CURB,SOLID_YELLOW,DOTTED_YELLOW = range(5)
    LANE,JUNCTION,RELATION,NEIGHBOR,NOTYPE,STOPLANE,OVERLAP,SIGNAL,STOPSIGN,DELNEIGHBOR,DELOVERLAP= range(11)
    def __init__(self):
        super(MapCreator, self).__init__()

        self.scaleFactor = 1.0
        self.fileSetings='./settings.pickle'
        if QFile.exists(self.fileSetings):
              with open(self.fileSetings, 'rb') as f:
                self.offsetX,self.offsetY,self.rotation = pickle.load(f)
                self.offsetX= 357745+4.9#403548.096-2.5#403543.852-1.3#Inno#357745+4.9#+2.35#357945#358258#4.6 
                self.offsetY=  6181870+0.7#6188470.203-2#6188473.897-2#6185774.221#Inno#6181870+0.7#6180706#6181219
                self.rotation=0#-0.0012
                #self.offsetX,self.offsetY,self.rotation =  2.35,-1.75,2.0
        else: 
            self.offsetX,self.offsetY,self.rotation = 0,0,0

        self.createActions()
        self.createMenus()
        self.imageLabel=None
        self.setWindowTitle("MapCreator")
        self.resize(1280, 720)
        self.setToAllBt(False)
        self.Lanes=[]
        self.type=self.NOTYPE
        self.Junctions=[]
        self.Relations=[]
        self.Neighbors=[]
        self.StopLanes=[]
        self.Overlaps=[]
        self.StopSigns=[]
        self.Signals=[]
        self.file_save=""
        self.ruler.setEnabled(False)
        self.zoomInAct.setEnabled(True)
        self.zoomOutAct.setEnabled(True)

    def CreateToolbars(self):
	    Toolbars.CreateToolbars(self)

    def open(self):
       
        fileName, _ = QFileDialog.getOpenFileName(self, "Open Geotiff File",
                 QDir.currentPath(),"tif (*.tif*);;TIFF (*.TIF*)")

        if fileName:
            dsr = gdal.Open(fileName)
            np_array = np.array(dsr.ReadAsArray())
            if np_array.shape[0]==4:
                np_array=np_array[0]
            np_array_uint8 = (np_array).astype(np.uint8)

            self.geotiffScale=dsr.GetGeoTransform()[1]
            print(self.geotiffScale)

            self.setToAllBt(True)
            width,height=dsr.RasterXSize,dsr.RasterYSize
            self.aspect=Decimal(float(height)/float(width))
            minabs=100
            if width>height:
                minh=3450
                for i in range(3450,3550,1):
                   if  abs(Decimal(i*self.aspect)-int(i*self.aspect))<minabs:
                       minabs=abs(Decimal(i*self.aspect)-int(i*self.aspect))
                       minh=i
                newHeight=minh
                newWidth=Decimal(newHeight*self.aspect)       
            else:
                minw=3450
                for i in range(3450,3550,1):
                   if  abs(Decimal(i*self.aspect)-int(i*self.aspect))<minabs:
                       minabs=abs(Decimal(i*self.aspect)-int(i*self.aspect))
                       minw=i
                newWidth=minw
                newHeight=Decimal(newWidth*self.aspect)
            self.resizeFactorWidth=Decimal(width/newWidth)
            self.resizeFactorHeight=Decimal(height/newHeight)  
            self.imageLabel =Canvas(np_array_uint8,newWidth,newHeight,self.resizeFactorWidth,self.resizeFactorHeight,self.geotiffScale)
            self.imageLabel.setScale(1)
            self.imageLabel.setMouseTracking(True)
            widget = QWidget(self)
            layout = QHBoxLayout(widget)
            self.leftScroll = Pane(
            Qt.AlignTop | Qt.AlignLeft, self)
            self.leftScroll.setWidgetResizable(True)
            self.scrollBars = {
            Qt.Vertical:  self.leftScroll.verticalScrollBar(),
            Qt.Horizontal: self.leftScroll.horizontalScrollBar()
           }
            self.leftScroll.addWidget(self.imageLabel)
            self.scaleFactor = 1.0
            layout.addWidget(self.leftScroll)

            self.setCentralWidget(widget)
            self.imageLabel.update()
            self.ruler.setEnabled(True)

          
            



    def leftChanged(self):
        self.imageLabel.currentLeft.type=self.ComboLaneBorderLeft.currentIndex()
        self.imageLabel.update()
    def rightChanged(self):
        self.imageLabel.currentRight.type=self.ComboLaneBorderRight.currentIndex()
        self.imageLabel.update() 
    def signToStopLane(self):
      self.imageLabel.signToStopLane(self.ComboLaneForStopSign.currentText())
    def zoomIn(self):
        if self.imageLabel is None:
            return
        self.scaleImage(1.25)

    def zoomOut(self):
        self.scaleImage(0.8)
    def wheelEvent(self,event):
        modifiers = QApplication.keyboardModifiers()
        if modifiers == Qt.ControlModifier:
            try:
                if event.angleDelta().y()>0:
                    self.zoomIn()
                else:
                    self.zoomOut()
            except:
                pass


    def changeValueWidth(self):
        try:
            width=self.EditLaneWidth.text().replace(",",".")
            self.imageLabel.current.width=float(width)
        except:
            pass    
    def CreateErrorWindow(self,mainText,subText):
        msg = QMessageBox()
        msg.setIcon(QMessageBox.Critical)
        msg.setText("Error")
        msg.setInformativeText(mainText)
        msg.setWindowTitle(subText)
        msg.exec_()


    def getLastId(self,objlist):
        if len(objlist)==0:
            lenght=0
        else:
            lenght=int(objlist[-1].id.split("_")[1])+1
        return str(lenght)
    def createRoadFunc(self):
        self.type=self.LANE
        self.setToAllBt(False)
        self.acceptRoad.setEnabled(True)
        shape=Shape()
        shape.shape_type=shape.LANE
        last=self.getLastId(self.Lanes)
        shape.label="lane_"+last
        shapeLeft=Shape()
        shapeLeft.label="lane_"+last+"Left"
        shapeLeft.shape_type=shapeLeft.BORDER
        shapeRight=Shape()
        shapeRight.label="lane_"+last+"Right"
        shapeRight.shape_type=shapeRight.BORDER
        self.Lanes.append(Lane("lane_"+last,None,None,None,None,None))

        self.imageLabel.setDrawing(True)
        self.imageLabel.shapes[shape.label]=shape
        self.imageLabel.shapes[shapeLeft.label]=shapeLeft
        self.imageLabel.shapes[shapeRight.label]=shapeRight
        self.imageLabel.current=shape
        self.imageLabel.current.width=3 
        shapeLeft.type=self.ComboLaneBorderLeft.currentIndex()
        shapeRight.type=self.ComboLaneBorderRight.currentIndex()
        self.imageLabel.currentLeft=shapeLeft
        self.imageLabel.currentRight=shapeRight


        
        self.addToolBar(Qt.LeftToolBarArea,self.ToolbarLane)
        self.ToolbarLane.setVisible(True)  

    def CreateByTrajectoryChk_changed(self, int):
        if self.imageLabel is None:
            return
        if self.useTrajecoryChk.isChecked():
            if self.imageLabel.Trajectory is None:
                self.useTrajecoryChk.setChecked(False)
                self.CreateErrorWindow("Load Trajectory","")
                return
            QApplication.setOverrideCursor(Qt.PointingHandCursor )
            self.imageLabel.LaneUsingTrajectory=True
            self.imageLabel.current.points.clear()
        else:
            QApplication.restoreOverrideCursor()
            self.imageLabel.LaneUsingTrajectory=False


    def acceptRoadFunc(self):

        if len(self.imageLabel.current.points)==0:
            self.CreateErrorWindow("Add points","")
            return
        if self.EditLaneWidth.text()=="" or self.EditLaneSpeed.text()=="":
            self.CreateErrorWindow("Fill all field","")
            return
        self.setToAllBt(False)
        self.createLeftRight.setEnabled(True)    
        self.removeToolBar(self.ToolbarLane)
        self.Lanes[-1].width=int(float(self.EditLaneWidth.text().replace(",",".")))
        self.Lanes[-1].speed=int(float(self.EditLaneSpeed.text().replace(",",".")))
        self.Lanes[-1].turn=self.ComboLaneTurn.currentIndex()+1
        self.ToolbarLaneLeftRight.setVisible(True)
        self.addToolBar(Qt.LeftToolBarArea,self.ToolbarLaneLeftRight)
        self.imageLabel.current.shape_type=self.imageLabel.current.BORDER
        self.imageLabel.addPoints( self.imageLabel.current)
        self.imageLabel.createBorder( self.Lanes[-1].width)       
    def createLeftRightFunc(self):
        self.type=self.NOTYPE
        self.setToAllBt(True)
        self.removeToolBar(self.ToolbarLaneLeftRight)
        self.Lanes[-1].idLeftBorder=self.ComboLaneBorderLeft.currentText()
        self.Lanes[-1].idRightBorder=self.ComboLaneBorderRight.currentText()
        self.imageLabel.currentRight=None
        self.imageLabel.currentLeft=None
        self.imageLabel.current=None
    def createjunctionFunc(self):
        self.type=self.JUNCTION
        self.setToAllBt(False)
        self.getBezier.setEnabled(True)
        self.acceptjunction.setEnabled(True)
        last=self.getLastId(self.Junctions)
        junction=Junction("junction_"+last)
        
        shape=Shape()
        shape.label="junction_"+last
        shape.shape_type=shape.JUNCTION
        self.Junctions.append(junction)
        self.imageLabel.shapes[shape.label]=shape
        self.imageLabel.setDrawing(True)
        self.imageLabel.current=shape

        self.addToolBar(Qt.LeftToolBarArea,self.ToolbarJunction)
        self.ToolbarJunction.setVisible(True)
    def acceptjunctionFunc(self):
        if len(self.imageLabel.current.points)<4:
            self.CreateErrorWindow("Curve is not created","")
            return
        self.type=self.NOTYPE
        self.setToAllBt(True)
        self.imageLabel.setDrawing(False)
        left,right=self.imageLabel.createBorder(self.Junctions[-1].width)
        for point in left:
            self.Junctions[-1].borderLeft.append([Decimal(point.x())*(self.resizeFactorWidth*Decimal(self.geotiffScale)),Decimal(point.y())*(self.resizeFactorHeight*Decimal(self.geotiffScale))])
        for point in right:
            self.Junctions[-1].borderRight.append([Decimal(point.x())*(self.resizeFactorWidth*Decimal(self.geotiffScale)),Decimal(point.y())*(self.resizeFactorHeight*Decimal(self.geotiffScale))])
        self.Junctions[-1].turn=self.ComboJunctionTurn.currentIndex()
        self.Junctions[-1].speed=int(float(self.EditLaneSpeedJk.text().replace(",",".")))
        self.imageLabel.currentLeft=None
        self.imageLabel.currentRight=None
        self.imageLabel.current=None

        if self.changelaneChk.isChecked():
            self.Junctions[-1].isLaneChange=True
        self.removeToolBar(self.ToolbarJunction)
        self.changelaneChk.setChecked(False)
        self.ToolbarJunction.setVisible(False)

    def previewJunctionFunc(self):
        if len(self.imageLabel.current.points)<3:
            self.CreateErrorWindow("Add three points","")
            return 
        pointmas=copy.deepcopy(self.imageLabel.current.points)
        

        bufArray=self.imageLabel.FindEdgeLanes(pointmas[0])

        pointmas.insert(0,bufArray[0])
        #self.imageLabel.current.points[1]=bufArray[2]
        StartLane=self.imageLabel.shapes[bufArray[1]]
        bufArray1=self.imageLabel.FindEdgeLanes(pointmas[3])
        #self.imageLabel.current.points[3]=bufArray1[2]

        FinishLane=self.imageLabel.shapes[bufArray1[1]]
        if pointmas[0]==-1 or pointmas[2]==-1:
           #self.imageLabel.current.points=bufPointmas
           return

        pointmas=self.imageLabel.getBezierCurve(pointmas) 
        pointmas.pop(0)
        #pointmas.append(bufArray1[0])
        self.imageLabel.Preview=Shape()
        self.imageLabel.Preview.label="preview"
        self.imageLabel.Preview.points=pointmas
        self.imageLabel.Preview.shape_type=self.imageLabel.Preview.PREVIEW
        self.imageLabel.update()
        




    def getBezierFunc(self):
        if len(self.imageLabel.current.points)<3:
            self.CreateErrorWindow("Add three points","")
            return 
        bufPointmas=copy.deepcopy(self.imageLabel.current.points)
        pointmas=self.imageLabel.current.points

        bufArray=self.imageLabel.FindEdgeLanes(pointmas[0])

        pointmas.insert(0,bufArray[0])
        self.imageLabel.current.points[1]=bufArray[2]
        StartLane=self.imageLabel.shapes[bufArray[1]]
        bufArray1=self.imageLabel.FindEdgeLanes(pointmas[3])
        self.imageLabel.current.points[3]=bufArray1[2]

        FinishLane=self.imageLabel.shapes[bufArray1[1]]
        if pointmas[0]==-1 or pointmas[2]==-1:
           self.imageLabel.current.points=bufPointmas
           return

        pointmas=self.imageLabel.getBezierCurve() 
        pointmas.pop(0)
        #pointmas.append(bufArray1[0])
  
        self.imageLabel.current.points=pointmas
        self.imageLabel.shapes[self.imageLabel.current.label].points=pointmas
        lanest=[x for x in self.Lanes if x.id==bufArray[1]][0]
        lanefin=[x for x in self.Lanes if x.id==bufArray1[1]][0]
        self.Junctions[-1].speed=lanest.speed
        self.Junctions[-1].width=lanest.width
        relation=Relation(lanest.id,self.Junctions[-1].id)
        relation1=Relation(self.Junctions[-1].id,lanefin.id)
        self.Relations.append(relation)
        self.Relations.append(relation1)
        self.imageLabel.Preview=None
        
    def findById(self,id, flist):
        for i in flist:
            if i.id == id:
                return i
        return None

    def shift(p, p2, distance, isleft=True):
        delta_y = p2.y - p.y
        delta_x = p2.x - p.x
        # print math.atan2(delta_y, delta_x)
        angle = 0
        if isleft:
            angle = math.atan2(delta_y, delta_x) + math.pi / 2.0
        else:
            angle = math.atan2(delta_y, delta_x) - math.pi / 2.0
        # print angle
        p1n = []
        p1n.append(p.x + (math.cos(angle) * distance))
        p1n.append(p.y + (math.sin(angle) * distance))

        p2n = []
        p2n.append(p2.x + (math.cos(angle) * distance))
        p2n.append(p2.y + (math.sin(angle) * distance))
        return Point(p1n), Point(p2n)
    def rotate(self,x,y,xo,yo,theta): 
        xr=math.cos(theta)*(x-xo)-math.sin(theta)*(y-yo)+xo
        yr=math.sin(theta)*(x-xo)+math.cos(theta)*(y-yo)+yo
        return [xr,yr]
    def loadTrjecFunc(self):
        if self.imageLabel is None:
            self.open()
        fileName, _ = QFileDialog.getOpenFileName(self, "Open Map file",
                QDir.currentPath(),"Plain text file (*.chan)")
        pointmas=[]
        counter=0
        with open(fileName, 'r') as f:
            x=-1
            y=-1
            #for line in reversed(list(open(fileName))):
            for line in f:
                # if line.find("x")!=-1:
                #     if counter<5:
                #         continue
                #     x=line.split(":")[1][:-1]
                #     x=float(x)
                # if line.find("y")!=-1:
                #     if counter<5:
                #         continue
                #     y=line.split(":")[1][:-1]
                #     y=float(y)
                #     self.rotate(x,y,0,0,math.radians(-self.rotation))
                #     point=QPointF(float(Decimal(float(x)+self.offsetX)/(Decimal(self.resizeFactorWidth)*Decimal(self.geotiffScale))),float(Decimal((float(y)*-1)+self.offsetY)/(Decimal(self.resizeFactorHeight)*Decimal(self.geotiffScale))))
                #     pointmas.append(point)
                    
                # counter+=1
                counter+=1
                if counter<7:
                    continue
                counter=0
   
                xy=line.split(",")

                xy=[float(xy[0]),float(xy[1])]#+6000000
                xy=self.rotate(xy[0],xy[1],0,0,math.radians(-self.rotation))
                point=QPointF(float(Decimal(float(xy[0])-self.offsetX)/(Decimal(self.resizeFactorWidth)*Decimal(self.geotiffScale))),float(Decimal((float(xy[1])*-1)+self.offsetY)/(Decimal(self.resizeFactorHeight)*Decimal(self.geotiffScale))))
                print(point)
                pointmas.append(point)


            
            self.imageLabel.Trajectory=Shape()
            self.imageLabel.Trajectory.label="Trajectory"
            self.imageLabel.Trajectory.points=pointmas
            self.imageLabel.Trajectory.shape_type=self.imageLabel.Trajectory.TRAJECTORY
    

    def loadFunc(self):# load objects from pickle file. 
        if self.imageLabel is None:
            self.open()
        fileName, _ = QFileDialog.getOpenFileName(self, "Open Pickle file",
                QDir.currentPath(),"Plain text file (*.pickle)")
        with open(fileName, 'rb') as f:
            self.Junctions = pickle.load(f)
            for lane in self.Junctions:
                lane.points=[]
            self.Lanes = pickle.load(f)
            for lane in self.Lanes:
                lane.points=[]
                lane.leftBorderPoints=[]
                lane.rightBorderPoints=[]

            self.Relations = pickle.load(f)
            self.Neighbors=pickle.load(f)
            self.imageLabel.shapes = pickle.load(f)

            self.StopLanes=pickle.load(f)
            for lane in self.StopLanes:
                lane.points=[]
            self.Overlaps=pickle.load(f)
            for ovr in self.Overlaps:
                ovr.points=[]
            self.Signals=pickle.load(f)
            for signal in self.Signals:
                signal.points=[]
            self.StopSigns=pickle.load(f)
            for sign in self.StopSigns:
                sign.pointsStopLane=[]
            #self.DelIntersection()
            self.imageLabel.update()
            self.imageLabel.setScale(self.scaleFactor)
            
            

    def saveFunc(self):
        fileName, _ = QFileDialog.getSaveFileName(self, "Save Pickle file",
            QDir.currentPath(),"Plain text file (*.pickle)")
        Save.SaveTxt(self,fileName)
        pass
    
    def acceptNeighborFunc(self):
        if self.NeighborMainLanes.currentIndex()==0 or (self.ComboNeighborReverseLeft.currentIndex()==0 and self.ComboNeighborForwardLeft.currentIndex()==0 and self.ComboNeighborReverseRight.currentIndex()==0 and self.ComboNeighborForwardRight.currentIndex()==0):
            self.CreateErrorWindow("Add neighbor or main lane","")
            return
        self.type=self.NOTYPE
        self.setToAllBt(True)
        self.removeToolBar(self.ToolbarNeighbor)
        if self.ComboNeighborForwardLeft.currentIndex()!=0:
            ForwardLeft=self.ComboNeighborForwardLeft.currentText() 
        else:
           ForwardLeft=None 
        if self.ComboNeighborReverseLeft.currentIndex()!=0:
            ReverseLeft=self.ComboNeighborReverseLeft.currentText() 
        else:
           ReverseLeft=None 
        if self.ComboNeighborReverseRight.currentIndex()!=0:
            ReverseRight=self.ComboNeighborReverseRight.currentText() 
        else:
           ReverseRight=None 
        if self.ComboNeighborForwardRight.currentIndex()!=0:
            ForwardRight=self.ComboNeighborForwardRight.currentText() 
        else:
           ForwardRight=None 

        last=self.getLastId(self.Neighbors)
        neighbor=Neighbor("neighbor_"+last,self.NeighborMainLanes.currentText(),ForwardLeft,ReverseLeft,ForwardRight,ReverseRight)
        self.Neighbors.append(neighbor)
        self.NeighborMainLanes.clear() 
        self.ComboNeighborForwardLeft.clear() 
        self.ComboNeighborReverseLeft.clear() 
        self.ComboNeighborReverseRight.clear() 
        self.ComboNeighborForwardRight.clear() 
        print(self.Neighbors)

    def ccw(self,A,B,C):
        return (C.y()-A.y()) * (B.x()-A.x()) > (B.y()-A.y()) * (C.x()-A.x())

    # Return true if line segments AB and CD intersect
    def intersect(self,A,B,C,D):
       self.segment_endpoints = []
       left = max(min(A.x(), B.x()), min(C.x(), D.x()))
       right = min(max(A.x(), B.x()), max(C.x(), D.x()))
       top = max(min(A.y(), B.y()), min(C.y(), D.y()))
       bottom = min(max(A.y(), B.y()), max(C.y(), D.y()))
        
       if top > bottom or left > right:
          self.segment_endpoints = []
          return False
        
       elif top == bottom and left == right:
          self.segment_endpoints.append(left)
          self.segment_endpoints.append(top)
          return True
    
       else:	
          self.segment_endpoints.append(left)
          self.segment_endpoints.append(bottom)
          self.segment_endpoints.append(right)
          self.segment_endpoints.append(top)         
          return True
    def setDisctBetweenpoints(self,first,sec,newpoint):
        if abs(first.x()-sec.x())>abs(first.y()-sec.y()):
            if first.x()-sec.x()>0:
                newpoint.setY(first.y())
                newpoint.setX(first.x()+1)
            else:
                newpoint.setY(first.y())
                newpoint.setX(first.x()-1)
        else:
            if first.y()-sec.y()>0:
                newpoint.setX(first.x())
                newpoint.setY(first.y()+1)
            else:
                newpoint.setX(first.x())
                newpoint.setY(first.y()-1)
        return newpoint



    def DelWhileIntersect(self,firstPoint, secondPoint,shapePred,isStart,isSucStart):
        newpoints=[]
        for i in shapePred:
            newpoints.append(i)
        print(newpoints)
        maxI=0
        if isStart:
            for i in range(len(shapePred)):
                if i+2<len(shapePred):
                    if self.intersect(firstPoint, secondPoint,shapePred[i+1],shapePred[i+2]):
                        maxI+=1
                        print("DELDEL")
                    else:
                        maxI+=1
                        break
                
                else:
                    maxI+=1
                    break
            for i in range(maxI):
                if len(newpoints)>2:
                    print("DELDELDEL!")
                    del newpoints[i]
            if isSucStart:       
                newpoints[0]=self.setDisctBetweenpoints(secondPoint, firstPoint,newpoints[0])
            else:
                newpoints[0]=self.setDisctBetweenpoints(firstPoint, secondPoint,newpoints[0])
        if not isStart:
            print(shapePred)
            for i in range(len(shapePred),0,-1):
                if i-2>0:
                    if self.intersect(firstPoint, secondPoint,shapePred[i-1],shapePred[i-2]):
                        maxI+=1
                        print("DELDEL")
                    else:
                        maxI+=1
                        break
                else:
                    maxI+=1
                    break
            for i in range(maxI):
                if len(newpoints)>2:
                    print("DELDELDEL!")
                    del newpoints[i]
            if isSucStart: 
                newpoints[-1]=self.setDisctBetweenpoints(secondPoint, firstPoint,newpoints[-1])
            else:
                newpoints[-1]=self.setDisctBetweenpoints(firstPoint, secondPoint,newpoints[-1])
        return newpoints

    def DelIntersection(self):  
        for rel in self.Relations:
            try:
                LaneSuc=self.imageLabel.shapes[rel.successor]
                LanePred=self.imageLabel.shapes[rel.predecessor]
            except:
                continue
            if LanePred.points is None or LaneSuc.points is None:
                continue
            print(LanePred.label)
            print(LaneSuc.label)
            print(LanePred.points)
            print(LanePred.points[-1])
            if (self.intersect(LaneSuc.points[0],LaneSuc.points[1],LanePred.points[0],LanePred.points[1])):
                LanePred.points=self.DelWhileIntersect(LaneSuc.points[0],LaneSuc.points[1],LanePred.points,True,True)
            elif (self.intersect(LaneSuc.points[0],LaneSuc.points[1],LanePred.points[-1],LanePred.points[-2])):
                LanePred.points=self.DelWhileIntersect(LaneSuc.points[0],LaneSuc.points[1],LanePred.points,False,True)
            elif (self.intersect(LaneSuc.points[-1],LaneSuc.points[-2],LanePred.points[0],LanePred.points[1])):
                LanePred.points=self.DelWhileIntersect(LaneSuc.points[-1],LaneSuc.points[-2],LanePred.points,True,False)
            elif (self.intersect(LaneSuc.points[-1],LaneSuc.points[-2],LanePred.points[-1],LanePred.points[-2])):
                LanePred.points=self.DelWhileIntersect(LaneSuc.points[-1],LaneSuc.points[-2],LanePred.points,False,False)
            else:
                print("False")
    

    def createNeighborFunc(self):
        self.type=self.NEIGHBOR
        self.setToAllBt(False)
        self.acceptNeighbor.setEnabled(True)
        self.NeighborMainLanes.clear()
        self.ComboNeighborForwardLeft.clear()
        self.ComboNeighborReverseLeft.clear()
        self.ComboNeighborForwardRight.clear()
        self.ComboNeighborReverseRight.clear()
        self.addObjsToComboBox(self.NeighborMainLanes,self.Lanes)
        self.addObjsToComboBox(self.NeighborMainLanes,self.Junctions)
        self.addObjsToComboBox(self.ComboNeighborForwardLeft,self.Lanes)
        self.addObjsToComboBox(self.ComboNeighborReverseLeft,self.Lanes)
        self.addObjsToComboBox(self.ComboNeighborForwardRight,self.Lanes)
        self.addObjsToComboBox(self.ComboNeighborReverseRight,self.Lanes)

        self.addObjsToComboBox(self.ComboNeighborForwardLeft,self.Junctions)
        self.addObjsToComboBox(self.ComboNeighborReverseLeft,self.Junctions)
        self.addObjsToComboBox(self.ComboNeighborForwardRight,self.Junctions)
        self.addObjsToComboBox(self.ComboNeighborReverseRight,self.Junctions)

        self.addToolBar(Qt.LeftToolBarArea,self.ToolbarNeighbor)
        self.ToolbarNeighbor.setVisible(True)
        
    def addObjsToComboBox(self,combobox,listObj,isFirst=True):
        objs=[]
        if isFirst:
            objs.append(" ")
        for obj in listObj:
            objs.append(obj.id)
        combobox.addItems(objs)

    def cancelFunc(self):
        if self.type==self.NOTYPE:
            return
        self.setToAllBt(True)
       
        if self.type==self.LANE:
            del self.Lanes[-1]
            idLane=self.imageLabel.current.label
            del self.imageLabel.shapes[idLane]
            del self.imageLabel.shapes[idLane+"Left"]
            del self.imageLabel.shapes[idLane+"Right"]
            self.removeToolBar(self.ToolbarLane)
            self.removeToolBar(self.ToolbarLaneLeftRight)
        elif self.type==self.JUNCTION:
            del self.Junctions[-1]
            idLane=self.imageLabel.current.label
            del self.imageLabel.shapes[idLane]
            self.removeToolBar(self.ToolbarJunction)
        elif self.type==self.RELATION:
            del self.Relations[-1]
        elif self.type==self.NEIGHBOR:
            self.removeToolBar(self.ToolbarNeighbor)
        elif self.type==self.OVERLAP:
            self.removeToolBar(self.ToolbarOverlap)
            del self.Overlaps[-1]
        elif self.type==self.STOPLANE:
            self.removeToolBar(self.ToolbarStopLane)
            del self.imageLabel.shapes[self.StopLanes[-1].id]
            del self.StopLanes[-1]
        elif self.type==self.SIGNAL:
            del self.imageLabel.shapes[self.Signals[-1].id]
            del self.Signals[-1]
            self.removeToolBar(self.ToolbarSignal)
        elif self.type==self.STOPSIGN:
            idShape=self.StopSigns[-1].idStopLane
            if idShape is not None: 
                del self.imageLabel.shapes[idShape]
            del self.StopSigns[-1]
            self.removeToolBar(self.ToolbarStopSign)
        elif self.type==self.DELNEIGHBOR:
            self.removeToolBar(self.ToolbarDelNeighbor)
        elif self.type==self.DELOVERLAP:
            self.removeToolBar(self.ToolbarDelOverlap)
        self.type=self.NOTYPE
    def keyPressEvent(self, event):
    
        if event.key() == Qt.Key_Escape: # QtCore.Qt.Key_Escape is a value that equates to what the operating system passes to python from the keyboard when the escape key is pressed.
            self.cancelFunc()
    def createstopLaneFunc(self):   
        self.type=self.STOPLANE
        self.setToAllBt(False)
        self.acceptStopLane.setEnabled(True)
        self.addToolBar(Qt.LeftToolBarArea,self.ToolbarStopLane)
        self.ToolbarStopLane.setVisible(True)

        shape=Shape()
        last=self.getLastId(self.StopLanes)
        shape.label="stoplane_"+last
        shape.shape_type=shape.STOPLANE
        Stoplane=StopLane("stoplane_"+last)
        self.imageLabel.current=shape
        self.imageLabel.shapes[shape.label]=shape
        self.StopLanes.append(Stoplane)
    def acceptstopLaneFunc(self):
        if len(self.imageLabel.current.points)<2:
            self.CreateErrorWindow("Add points","")
            return
        self.type=self.NOTYPE
        self.setToAllBt(True)
        self.removeToolBar(self.ToolbarStopLane)

        self.imageLabel.current=None      
    def createOverlapFunc(self):
        self.setToAllBt(False)
        self.acceptOverlap.setEnabled(True)
        self.type=self.OVERLAP
        self.addToolBar(Qt.LeftToolBarArea,self.ToolbarOverlap)
        self.ToolbarOverlap.setVisible(True)
        self.ComboOverlapLanes.clear() 
        self.ComboOverlapSignal.clear() 
        self.ComboOverlapStopSign.clear() 
        self.addObjsToComboBox(self.ComboOverlapLanes,self.Lanes)
        self.addObjsToComboBox(self.ComboOverlapLanes,self.Junctions,isFirst=False)
        self.addObjsToComboBox(self.ComboOverlapSignal,self.Signals)
        self.addObjsToComboBox(self.ComboOverlapStopSign,self.StopSigns)


        shape=Shape()
        last=self.getLastId(self.Overlaps)
        shape.label="overlap_"+last
        self.imageLabel.current=shape
        self.imageLabel.shapes[shape.label]=shape
        shape.shape_type=shape.OVERLAP
        overlap=Overlap(shape.label)
        self.Overlaps.append(overlap)
    def acceptOverlapFunc(self):

        if self.ComboOverlapLanes.currentIndex()==0:
            self.CreateErrorWindow("Choose lane","")
            return
        if self.ComboOverlapSignal.currentIndex()==0 and self.ComboOverlapStopSign.currentIndex()==0:
            self.CreateErrorWindow("Choose stop sign or signal","")
            return
     
        if self.ComboOverlapSignal.currentIndex()!=0 and self.ComboOverlapStopSign.currentIndex()!=0:
            self.CreateErrorWindow("Choose only one object","")
            return

        for combobox in self.ComboboxesForOverlap:
            if combobox.currentIndex()!=0:
                self.Overlaps[-1].IdSecObject=combobox.currentText()
                idstopLane=None
                if combobox.currentText().find("stopsign")!=-1:
                    idstopLane=self.findById(self.Overlaps[-1].IdSecObject,self.StopSigns).idStopLane
                elif combobox.currentText().find("signal")!=-1:
                    idstopLane=self.findById(self.Overlaps[-1].IdSecObject,self.Signals).idStopLane
                else:
                    self.CreateErrorWindow("Select object","")
                    return
                if idstopLane is not None: 
                    point=self.imageLabel.intersectionLanes(self.imageLabel.shapes[idstopLane],self.imageLabel.shapes[self.ComboOverlapLanes.currentText()])
                    if  point is not None:
                        self.Overlaps[-1].pointOverlap=point
                        break
                    else:
                        self.CreateErrorWindow("no intersection with the lane","")
                        return

        self.type=self.NOTYPE
        self.Overlaps[-1].laneOverlapId=self.ComboOverlapLanes.currentText()   
        self.setToAllBt(True)
        self.type=self.NOTYPE
        self.removeToolBar(self.ToolbarOverlap)
        self.imageLabel.current=None
        self.ComboOverlapLanes.clear() 
        self.ComboOverlapSignal.clear() 
        self.ComboOverlapStopSign.clear() 
    def createSignalFunc(self):
        self.ComboSignalStopLanes.clear()
        self.setToAllBt(False)
        self.acceptSignal.setEnabled(True)
        self.addToolBar(Qt.LeftToolBarArea,self.ToolbarSignal)
        self.ToolbarSignal.setVisible(True)
        self.type=self.SIGNAL
        self.addObjsToComboBox(self.ComboSignalStopLanes,self.StopLanes)
        shape=Shape()
        last=self.getLastId(self.Signals)
        shape.label="signal_"+last
        shape.scale=self.scaleFactor
        shape.shape_type=shape.SIGNAL
        self.imageLabel.currentImage=shape
        signal=Signal(self.imageLabel.currentImage.label)
        self.Signals.append(signal)
        self.imageLabel.shapes[shape.label]=shape
       
    
    def acceptSignalFunc(self):
        if self.ComboSignalStopLanes.currentIndex()==0:
            self.CreateErrorWindow("Choose stoplane","")
            return
        if len(self.imageLabel.currentImage.points)==0:
            self.CreateErrorWindow("Choose signal place on map","")
            return

        self.type=self.NOTYPE
        self.setToAllBt(True)
        self.removeToolBar(self.ToolbarSignal) 
        self.Signals[-1].idStopLane=self.ComboSignalStopLanes.currentText()
        self.imageLabel.currentImage=None

        
    def createStopSignFunc(self):
        self.ComboLaneForStopSign.clear()
        self.type=self.STOPSIGN
        self.setToAllBt(False)
        self.acceptStopSign.setEnabled(True)
        self.addToolBar(Qt.LeftToolBarArea,self.ToolbarStopSign)
        self.ToolbarStopSign.setVisible(True)
        self.addObjsToComboBox(self.ComboLaneForStopSign,self.StopLanes)
        shape=Shape()
        last=self.getLastId(self.StopSigns)
        shape.label="stopsign_"+last
        shape.shape_type=shape.STOPSIGN
        self.imageLabel.currentImage=shape
        stopsign=StopSign(shape.label)
        self.StopSigns.append(stopsign)
        self.imageLabel.shapes[shape.label]=shape



    def acceptStopSignFunc(self):
        if self.ComboLaneForStopSign.currentIndex()==0:
            self.CreateErrorWindow("Choose stoplane","")
            return
        self.type=self.NOTYPE
        self.setToAllBt(True)
        self.removeToolBar(self.ToolbarStopSign)
        idStopLane=self.ComboLaneForStopSign.currentText()
        self.StopSigns[-1].idStopLane=idStopLane
        self.imageLabel.shapes[idStopLane].isStopSign=True
        
    def chooseObjectFunc(self):
        index=self.ComboObject.currentIndex()
        if index==1:
            self.createSignalFunc()
        elif index==2:
            self.createStopSignFunc()


    def rulerFunc(self):
        if self.imageLabel.Ruler== None:
            shape=Shape()
            shape.label="Ruler"
            shape.shape_type=shape.RULER
            self.imageLabel.Ruler=shape
            
        else:
            self.imageLabel.Ruler=None
            self.imageLabel.update()


    def offsetsFunc(self):
        x,y,r,res=OffsetsDialog.getOffsets( self.offsetX,self.offsetY,self.rotation)
        if not x:x=0
        if not y:y=0
        if not r:r=0
        if res:self.offsetX,self.offsetY,self.rotation=x,y,r


    def delNeighborFunc(self):
        self.labelLeftForward.setText(" ")
        self.labelLeftReverse.setText(" ")
        self.labelRightForward.setText(" ")
        self.labelRightReverse.setText(" ")
        self.setToAllBt(False)
        self.ComboneighborIdMainLane.clear() 
        self.finishNeighborDeletion.setEnabled(True)
        self.addToolBar(Qt.LeftToolBarArea,self.ToolbarDelNeighbor)
        self.ToolbarDelNeighbor.setVisible(True) 
        self.type=self.DELNEIGHBOR
        objs=[]
        objs.append(" ")
        for obj in self.Neighbors:
            objs.append(obj.id+"/"+obj.mainLane)
        self.ComboneighborIdMainLane.addItems(objs)


    def addLabelForNeighborDeletion(self):
        strCombo=self.ComboneighborIdMainLane.currentText()
        
        idNeighbor=strCombo.split("/")[0]

        Neighbor=self.findById(idNeighbor,self.Neighbors)
        if Neighbor is None:
            return
        if Neighbor.leftForward is not None:
            self.labelLeftForward.setText("Left forward id: " + Neighbor.leftForward)
        if Neighbor.leftReverse is not None:
            self.labelLeftReverse.setText("Left reverse id: " + Neighbor.leftReverse)
        if Neighbor.RightForward is not None:
            self.labelRightForward.setText("Right forward id: " + Neighbor.RightForward)
        if Neighbor.RightReverse is not None:
            self.labelRightReverse.setText("Right reverse id: " + Neighbor.RightReverse)




    def finishNeighborDeletionFunc(self):
        if self.ComboneighborIdMainLane.currentText()==" ":
            self.CreateErrorWindow("Choose neighbor", "")
            return
        self.setToAllBt(True)
        self.removeToolBar(self.ToolbarDelNeighbor)
        strCombo=self.ComboneighborIdMainLane.currentText()
        self.type=self.NOTYPE
        idNeighbor=strCombo.split("/")[0]
        Neighbor=self.findById(idNeighbor,self.Neighbors)
        self.Neighbors.remove(Neighbor)

    def delOverlapFunc(self):    
        self.setToAllBt(False)
        self.ComboDelOverlap.clear() 
        self.finishOverlapDeletion.setEnabled(True)
        self.addToolBar(Qt.LeftToolBarArea,self.ToolbarDelOverlap)
        self.ToolbarDelOverlap.setVisible(True) 
        self.type=self.DELOVERLAP
        objs=[]
        objs.append(" ")
        for obj in self.Overlaps:
            objs.append(obj.id+"/"+obj.laneOverlapId+"/"+obj.IdSecObject)
        self.ComboDelOverlap.addItems(objs)

    
    def finishOverlapDeletionFunc(self):
        if self.ComboDelOverlap.currentText()==" ":
            self.CreateErrorWindow("Choose overlap", "")
            return
        self.setToAllBt(True)
        self.removeToolBar(self.ToolbarDelOverlap)
        strCombo=self.ComboDelOverlap.currentText()
        idOverlap=strCombo.split("/")[0]
        self.type=self.NOTYPE
        overlap=self.findById(idOverlap,self.Overlaps)
        self.Overlaps.remove(overlap)
    


    
    def createActions(self):
        self.openAct = QAction("&Open geotiff", self, shortcut="Ctrl+O",
                triggered=self.open)
        self.exitAct = QAction("E&xit", self, shortcut="Ctrl+Q",
                triggered=self.close)
        self.zoomInAct = QAction("Zoom &In (25%)", self, shortcut="Ctrl++",
                enabled=False, triggered=self.zoomIn)
        self.zoomOutAct = QAction("Zoom &Out (25%)", self, shortcut="Ctrl+-",
                enabled=False, triggered=self.zoomOut)
        self.createRoad = QAction("&Road", self, enabled=True,
                checkable=False, triggered=self.createRoadFunc)
        self.acceptRoad = QAction("&Create", self, enabled=True,
                checkable=False,  triggered=self.acceptRoadFunc)
        self.createLeftRight = QAction("&Create", self, enabled=True,
                checkable=False,  triggered=self.createLeftRightFunc)   
        self.save=QAction("&Save map", self, enabled=True,
                checkable=False,  triggered=self.saveFunc)   
        self.createjunction=QAction("&Junction", self, enabled=True,
                checkable=False,  triggered=self.createjunctionFunc)     
        self.acceptjunction=QAction("&Create", self, enabled=True,
                checkable=False,  triggered=self.acceptjunctionFunc)  
        self.getBezier=QAction("&Create Curve", self, enabled=True,
                checkable=False,  triggered=self.getBezierFunc)  
        self.previewJunction=QAction("&Prewiev Curve", self, enabled=True,
                checkable=False,  triggered=self.previewJunctionFunc)    
        self.load=QAction("&Load map", self, enabled=True,
                checkable=False,  triggered=self.loadFunc)    
        self.loadTrajectory=QAction("&Load trajectory", self, enabled=True,
                checkable=False,  triggered=self.loadTrjecFunc)         
        self.createNeighbor=QAction("&Neighbor", self, enabled=True,
                checkable=False,  triggered=self.createNeighborFunc) 
        self.acceptNeighbor=QAction("&Create", self, enabled=True,
                checkable=False,  triggered=self.acceptNeighborFunc) 
        self.cancel=QAction("&Cancel", self, enabled=True,
                checkable=False,  triggered=self.cancelFunc)
        self.createStopLane=QAction("&Stop Lane", self, enabled=True,
                checkable=False,  triggered=self.createstopLaneFunc)         
        self.acceptStopLane=QAction("&Create", self, enabled=True,
                checkable=False,  triggered=self.acceptstopLaneFunc)    
        self.createOverlap=QAction("&Overlap", self, enabled=True,
                checkable=False,  triggered=self.createOverlapFunc)         
        self.acceptOverlap=QAction("&Create", self, enabled=True,
                checkable=False,  triggered=self.acceptOverlapFunc)
        self.createSignal=QAction("&Signal", self, enabled=True,
                checkable=False,  triggered=self.createSignalFunc)
        self.acceptSignal=QAction("&Create", self, enabled=True,
                checkable=False,  triggered=self.acceptSignalFunc) 
        self.createStopSign=QAction("&Signal", self, enabled=True,
                checkable=False,  triggered=self.createStopSignFunc)
        self.acceptStopSign=QAction("&Create", self, enabled=True,
                checkable=False,  triggered=self.acceptStopSignFunc) 
        self.chooseObject=QAction("&Create object", self, enabled=True,
                checkable=False,  triggered=self.chooseObjectFunc)  
        self.ruler=QAction("&Ruler", self, enabled=True,
                checkable=True,  triggered=self.rulerFunc)  
        self.offsets=QAction("&Offsets setting", self, enabled=True,
                checkable=False,  triggered=self.offsetsFunc)  
        self.delNeighbor=QAction("&Del neighbor", self, enabled=True,
                checkable=False,  triggered=self.delNeighborFunc)  
        self.finishNeighborDeletion=QAction("&Delete", self, enabled=True,
                checkable=False,  triggered=self.finishNeighborDeletionFunc)
        self.delOverlap=QAction("&Del overlap", self, enabled=True,
                checkable=False,  triggered=self.delOverlapFunc)  
        self.finishOverlapDeletion=QAction("&Delete", self, enabled=True,
                checkable=False,  triggered=self.finishOverlapDeletionFunc)    



    def createMenus(self):
        self.fileMenu = QMenu("&File", self)
        self.fileMenu.addAction(self.openAct)
        self.fileMenu.addAction(self.load)
        self.fileMenu.addAction(self.loadTrajectory)
        self.fileMenu.addSeparator()
        self.fileMenu.addAction(self.save)
        self.fileMenu.addSeparator()
        self.fileMenu.addAction(self.offsets)
        self.fileMenu.addAction(self.exitAct)
        self.fileMenu.addSeparator()
        
        self.viewMenu = QMenu("&View", self)
        self.viewMenu.addAction(self.zoomInAct)
        self.viewMenu.addAction(self.zoomOutAct)

        self.viewMenu.addSeparator()


        self.menuBar().addMenu(self.fileMenu)
        self.menuBar().addMenu(self.viewMenu)

        self.CreateToolbars()
        
    def setToAllBt(self,val):
        self.useTrajecoryChk.setChecked(False)
        self.CreateByTrajectoryChk_changed(0)
        self.createRoad.setEnabled(val)
        self.acceptRoad.setEnabled(val)
        self.createLeftRight.setEnabled(val)
        self.createjunction.setEnabled(val)
        self.acceptjunction.setEnabled(val)
        self.save.setEnabled(val)
        self.getBezier.setEnabled(val)
        self.createNeighbor.setEnabled(val)
        self.acceptNeighbor.setEnabled(val)
        self.createOverlap.setEnabled(val)
        self.acceptOverlap.setEnabled(val)
        self.chooseObject.setEnabled(val)
        self.createStopLane.setEnabled(val)
        self.acceptStopLane.setEnabled(val)
        self.createSignal.setEnabled(val)
        self.acceptSignal.setEnabled(val)
        self.createStopSign.setEnabled(val)
        self.acceptStopSign.setEnabled(val)
        self.delNeighbor.setEnabled(val)
        self.delOverlap.setEnabled(val)



    def scaleImage(self, factor):
        self.scaleFactor *= factor
        
        self.leftScroll.removeWidget(self.imageLabel)
        self.leftScroll.addWidget(self.imageLabel)
        
        self.imageLabel.setScale(self.scaleFactor)
        self.imageLabel.resize(self.scaleFactor * self.imageLabel.PixMap.size())
        self.zoomInAct.setEnabled(self.scaleFactor < 5)
        self.zoomOutAct.setEnabled(self.scaleFactor > 0.0005)