Pārlūkot izejas kodu

change tool/map_lanetoxodr. add file backup function.

yuchuli 3 gadi atpakaļ
vecāks
revīzija
463c55c65a

+ 8 - 2
src/tool/map_lanetoxodr/OpenDrive/OpenDriveXmlParser.cpp

@@ -56,8 +56,14 @@ bool OpenDriveXmlParser::ReadHeader(TiXmlElement *node)
 	}
 
 
-    checker+=node->QueryDoubleAttribute("lat0",&lat0);
-    checker+=node->QueryDoubleAttribute("lon0",&lon0);
+    if(node->QueryDoubleAttribute("lat0",&lat0) != TIXML_SUCCESS)
+    {
+        lon0 = 119.0;
+    }
+    if(node->QueryDoubleAttribute("lon0",&lon0) != TIXML_SUCCESS)
+    {
+        lat0 = 39.0;
+    }
     checker+=node->QueryDoubleAttribute("hdg0",&hdg0);
 
     mOpenDrive->SetHeader(revMajor, revMinor, name, version, date, north, south, east, west,lat0,lon0,hdg0);

+ 78 - 0
src/tool/map_lanetoxodr/filebackup.cpp

@@ -0,0 +1,78 @@
+#include "filebackup.h"
+
+#include <QFile>
+
+#include <OpenDrive/OpenDriveXmlWriter.h>
+
+FileBackup::FileBackup()
+{
+
+}
+
+FileBackup::~FileBackup()
+{
+    this->requestInterruption();
+    QTime xTime;
+    xTime.start();
+    while((xTime.elapsed()<200)&&(mbComplete == false))
+    {
+
+    }
+}
+
+void FileBackup::SetOpenDrive(OpenDrive &xxodr)
+{
+    mMutex.lock();
+    mxodr = xxodr;
+    mMutex.unlock();
+    mbUpdate = true;
+    mwc.wakeAll();
+}
+
+void FileBackup::Activate(QString strpath)
+{
+    mMutex.lock();
+    mstrpath = strpath+".bak";
+    mMutex.unlock();
+    mbactive = true;
+}
+
+void FileBackup::run()
+{
+    QString strpath;
+    while(!QThread::isInterruptionRequested())
+    {
+        if(mbactive)
+        {
+            mWaitMutex.lock();
+            mwc.wait(&mWaitMutex,50);
+            mWaitMutex.unlock();
+            if(mbUpdate)
+            {
+                mMutex.lock();
+                OpenDrive xxodr = mxodr;
+                strpath = mstrpath;
+                mMutex.unlock();
+                mbUpdate = false;
+
+                //Save bak file
+                OpenDriveXmlWriter x(&xxodr);
+                x.WriteFile(strpath.toStdString());
+            }
+        }
+        else
+        {
+            msleep(50);
+        }
+    }
+
+    if(mbactive)
+    {
+        QFile fileBack(mstrpath);
+        fileBack.remove();
+        //Delete bak file
+    }
+    mbComplete = true;
+}
+
+

+ 36 - 0
src/tool/map_lanetoxodr/filebackup.h

@@ -0,0 +1,36 @@
+#ifndef FILEBACKUP_H
+#define FILEBACKUP_H
+
+#include <QThread>
+#include <QMutex>
+#include <QWaitCondition>
+#include <QTime>
+
+#include <OpenDrive/OpenDrive.h>
+
+class FileBackup : public QThread
+{
+public:
+    FileBackup();
+    ~FileBackup();
+
+    void SetOpenDrive(OpenDrive & xxodr);
+
+    void Activate(QString strpath);
+
+
+private:
+    QMutex mMutex;
+    QMutex mWaitMutex;
+    QWaitCondition mwc;
+
+    QString mstrpath;
+    bool mbactive = false;
+    bool mbRun = true;
+    bool mbUpdate = false;
+    bool mbComplete = false;
+    OpenDrive mxodr;
+    void run();
+};
+
+#endif // FILEBACKUP_H

+ 5 - 2
src/tool/map_lanetoxodr/ivxodrtool.cpp

@@ -132,11 +132,14 @@ int ivxodrtool::GetRoadMaxMin(Road *pRoad, double &xmin, double &ymin, double &x
             if(ncount > 0)sstep = ppp3->GetLength()/ncount;
             else sstep = 10000.0;
             double s = 0;
+            double fr = 1.0;
+            double fgeolen = ppp3->GetLength();
             while(s < ppp3->GetLength())
             {
                 double xtem,ytem;
-                xtem = ppp3->GetuA() +  ppp3->GetuB() * s +  ppp3->GetuC() * s*s +  ppp3->GetuD() * s*s*s;
-                ytem = ppp3->GetvA() + ppp3->GetvB() * s + ppp3->GetvC() * s*s + ppp3->GetvD() * s*s*s;
+                if(fgeolen>0)fr = s/fgeolen;
+                xtem = ppp3->GetuA() +  ppp3->GetuB() * fr +  ppp3->GetuC() * fr*fr +  ppp3->GetuD() * fr*fr*fr;
+                ytem = ppp3->GetvA() + ppp3->GetvB() * fr + ppp3->GetvC() * fr*fr + ppp3->GetvD() * fr*fr*fr;
                 x = xtem*cos(ppp3->GetHdg()) - ytem * sin(ppp3->GetHdg()) + ppp3->GetX();
                 y = xtem*sin(ppp3->GetHdg()) + ytem * cos(ppp3->GetHdg()) + ppp3->GetY();
                 ChangeMaxMin(x,y,xmin,ymin,xmax,ymax);

+ 80 - 11
src/tool/map_lanetoxodr/mainwindow.cpp

@@ -3,6 +3,7 @@
 
 #include <iomanip>//不要忘记包含此头文件
 #include <QScrollBar>
+#include <QFileInfo>
 
 #include "gpsimu.pb.h"
 
@@ -77,12 +78,16 @@ MainWindow::MainWindow(QWidget *parent) :
     connect(timer,SIGNAL(timeout()),this,SLOT(onTimer()));
     timer->start(1000);
 
+    mpfb = new FileBackup();
+    mpfb->start();
+
     setWindowTitle("Create Map From Lane Info");
 
 }
 
 MainWindow::~MainWindow()
 {
+    delete mpfb;
     delete ui;
 }
 
@@ -2749,6 +2754,25 @@ void MainWindow::onClickLoad()
     QString str = QFileDialog::getOpenFileName(this,"Load XODR",".","*.xodr");
     if(str.isEmpty())return;
 
+    QString strfilepath = str;
+
+    QString strbak = str + ".bak";
+    QFileInfo fileback(strbak);
+
+    if(fileback.exists())
+    {
+        QMessageBox::StandardButton button;
+        button=QMessageBox::question(this,tr("恢复备份"),QString(tr("上次为非正常退出,是否从备份文件导入?")),QMessageBox::Yes|QMessageBox::No);
+        if(button==QMessageBox::No)
+        {
+
+        }
+        else if(button==QMessageBox::Yes)
+        {
+            str = strbak;
+        }
+    }
+
     OpenDrive * pxodr = new OpenDrive();  //because add to xodr,so don't delete
     OpenDriveXmlParser x(pxodr);
     if(!x.ReadFile(str.toStdString()))
@@ -2773,6 +2797,8 @@ void MainWindow::onClickLoad()
 
 
 
+
+
     bool bNeedMove = false;
     bool bNeedAjustID = false;
     unsigned short int revMajor,revMinor;
@@ -2794,11 +2820,24 @@ void MainWindow::onClickLoad()
     double xMoveX = 0;
     double xMoveY = 0;
 
+    bool bAddToNow = false;
     if(mxodr.GetRoadCount() > 0)
     {
-        bNeedAjustID = true;
+        QMessageBox::StandardButton button;
+        button=QMessageBox::question(this,tr("载入模式"),QString(tr("附加到当前地图?")),QMessageBox::Yes|QMessageBox::No);
+        if(button==QMessageBox::No)
+        {
+            bAddToNow = false;
+        }
+        else if(button==QMessageBox::Yes)
+        {
+            bAddToNow = true;
+        }
+
     }
 
+    if(bAddToNow )bNeedAjustID = true;
+
     if(mbSetOrigin == false)
     {
         bNeedMove = false;
@@ -2888,27 +2927,36 @@ void MainWindow::onClickLoad()
 
     }
 
-    for(i=0;i<nnewcount;i++)
+    if(bAddToNow)
     {
-        mxodr.GetRoadVector()->push_back(pxodr->GetRoadVector()->at(i));
- //       OpenDrive * px = &mxodr;
-    }
+        for(i=0;i<nnewcount;i++)
+        {
+            mxodr.GetRoadVector()->push_back(pxodr->GetRoadVector()->at(i));
+            //       OpenDrive * px = &mxodr;
+        }
 
-    for(i=0;i<nnewjunctioncount;i++)
-    {
-        mxodr.GetJunctionVector()->push_back(pxodr->GetJunctionVector()->at(i));
-    }
+        for(i=0;i<nnewjunctioncount;i++)
+        {
+            mxodr.GetJunctionVector()->push_back(pxodr->GetJunctionVector()->at(i));
+        }
 
-    if((mxodr.GetRoadCount()>0)&&(mxodr.GetHeader() == 0))
-        mxodr.SetHeader(1,1,"adcmap",1.1,QDateTime::currentDateTime().toString("yyyy-MM-dd").toLatin1().data(),0,0,0,0,glat0,glon0,ghdg0);
+        if((mxodr.GetRoadCount()>0)&&(mxodr.GetHeader() == 0))
+            mxodr.SetHeader(1,1,"adcmap",1.1,QDateTime::currentDateTime().toString("yyyy-MM-dd").toLatin1().data(),0,0,0,0,glat0,glon0,ghdg0);
 
+    }
+    else
+    {
+        mxodr = *pxodr;
+    }
     updateCBRoad();
     updateJunction();
 
     mbRefresh = true;
     update();
 
+    mpfb->Activate(strfilepath);
 
+    delete pxodr;
 
 
 
@@ -2934,6 +2982,9 @@ void MainWindow::onClickSave()
     }
     OpenDriveXmlWriter x(&mxodr);
     x.WriteFile(str.toStdString());
+
+    mnNotSave = 0;
+    mpfb->Activate(str);
 }
 
 void MainWindow::onClickRoadContact()
@@ -3598,6 +3649,8 @@ void MainWindow::onClickCreateRoad()
     mbRefresh = true;
     update();
 
+    mpfb->SetOpenDrive(mxodr);
+
 }
 
 int MainWindow::GetEndPoint(Road *proad, double &x, double &y, double &hdg)
@@ -4445,6 +4498,8 @@ void MainWindow::onClickRoadDel()
     {
         UpdateScene();
     }
+
+    mpfb->SetOpenDrive(mxodr);
 }
 
 void MainWindow::updateCBRoad()
@@ -5051,6 +5106,8 @@ void MainWindow::on_actionSave_triggered()
 void MainWindow::on_actionAutoConnect_triggered()
 {
     onClickAutoConnect();
+
+    mpfb->SetOpenDrive(mxodr);
 }
 
 void MainWindow::on_actionSet_Speed_triggered()
@@ -5067,6 +5124,12 @@ void MainWindow::closeEvent(QCloseEvent *event)
         event->accept(); // 接受退出信号,程序退出
         return;
     }
+
+    if(mnNotSave == 0)
+    {
+        event->accept(); // 接受退出信号,程序退出
+        return;
+    }
     QMessageBox::StandardButton button;
     button=QMessageBox::question(this,tr("退出程序"),QString(tr("确认退出程序")),QMessageBox::Yes|QMessageBox::No);
     if(button==QMessageBox::No)
@@ -5106,6 +5169,8 @@ void MainWindow::on_actionEdit_Road_triggered()
     {
         UpdateScene();
     }
+
+    mpfb->SetOpenDrive(mxodr);
 }
 
 void MainWindow::on_actionAdd_Road_From_RTK_triggered()
@@ -5119,6 +5184,8 @@ void MainWindow::on_actionAdd_Road_From_RTK_triggered()
     mbRefresh = true;
     update();
 
+    mpfb->SetOpenDrive(mxodr);
+
 }
 
 void MainWindow::onClickSetMove()
@@ -5270,4 +5337,6 @@ void MainWindow::SaveBack()
         }
 
     }
+    mnNotSave++;
+    mpfb->SetOpenDrive(mxodr);
 }

+ 6 - 0
src/tool/map_lanetoxodr/mainwindow.h

@@ -47,6 +47,8 @@
 #include "dialogaddroadfromrtk.h"
 #include "dialogcalcs.h"
 
+#include "filebackup.h"
+
 #include <iostream>
 #include <map>
 #include <math.h>
@@ -411,6 +413,10 @@ private:
 
     void SaveBack();
 
+    FileBackup * mpfb;
+
+    int mnNotSave = 0;
+
 
 };
 

+ 2 - 0
src/tool/map_lanetoxodr/map_lanetoxodr.pro

@@ -40,6 +40,7 @@ SOURCES += \
     dialogroadmove.cpp \
     dialogroadrotate.cpp \
     dialogroadsplit.cpp \
+    filebackup.cpp \
     ivxodrtool.cpp \
         main.cpp \
         mainwindow.cpp \
@@ -92,6 +93,7 @@ HEADERS += \
     dialogroadmove.h \
     dialogroadrotate.h \
     dialogroadsplit.h \
+    filebackup.h \
     ivxodrtool.h \
         mainwindow.h \
     rawtype.h \