yuchuli 2 жил өмнө
parent
commit
3551ec7a56

+ 44 - 4
src/common/common/xodr/OpenDrive/OpenDriveXmlParser.cpp

@@ -287,10 +287,14 @@ bool OpenDriveXmlParser::ReadRoad(TiXmlElement *node)
             bProc = ReadRoadNoavoids(road,subNode);
             if(bProc == false)
             {
-                TiXmlPrinter *printer = new TiXmlPrinter();
-                subNode->Accept(printer );//保存该节点及其子节点到字符串
-                std::string str = printer->Str();
-                road->GetUserData()->push_back(str);
+                bProc = ReadRoadPriority(road,subNode);
+                if(bProc == false)
+                {
+                    TiXmlPrinter *printer = new TiXmlPrinter();
+                    subNode->Accept(printer );//保存该节点及其子节点到字符串
+                    std::string str = printer->Str();
+                    road->GetUserData()->push_back(str);
+                }
                 //           road->getroadb ->push_back(str);
             }
         }
@@ -2375,6 +2379,42 @@ bool OpenDriveXmlParser::ReadRoadNoavoid(Road * road,TiXmlElement * node)
 
 //--------------
 
+bool OpenDriveXmlParser::ReadRoadPriority(Road * road,TiXmlElement * node)
+{
+    string strcode;
+    if(node->QueryStringAttribute("code",&strcode) != TIXML_SUCCESS)
+    {
+        return false;
+    }
+    if(strcode != "roadPriority")
+    {
+        return false;
+    }
+
+    TiXmlElement *subNode = node->FirstChildElement("roadPriority");
+    if (subNode)
+    {
+        int nPriority;
+        int checker=TIXML_SUCCESS;
+        checker+=subNode->QueryIntAttribute("Priority",&nPriority);
+        if(checker != TIXML_SUCCESS)
+        {
+            return false;
+        }
+        road->SetRoadPriority(nPriority);
+
+    }
+    else
+    {
+        return false;
+    }
+
+
+    return true;
+}
+
+//--------------
+
 bool OpenDriveXmlParser::ReadSignals (Road* road, TiXmlElement *node)
 {
 

+ 3 - 0
src/common/common/xodr/OpenDrive/OpenDriveXmlParser.h

@@ -74,6 +74,9 @@ public:
 
     bool ReadRoadNoavoids(Road * road, TiXmlElement *node);
     bool ReadRoadNoavoid(Road * road,TiXmlElement * node);
+
+    bool ReadRoadPriority(Road * road,TiXmlElement * node);
+
 	//--------------
 
 	bool ReadObjects (Road* road, TiXmlElement *node);

+ 32 - 2
src/common/common/xodr/OpenDrive/OpenDriveXmlWriter.cpp

@@ -184,6 +184,12 @@ bool OpenDriveXmlWriter::WriteRoad(TiXmlElement *node, Road *road)
         WriteRoadBorrows(nodeRoad,road);
     }
 
+    int nPriority;
+    if(road->GetRoadPriority(nPriority) == 1)
+    {
+        WriteRoadPriority(nodeRoad,road);
+    }
+
     if(road->GetRoadNoavoidCount()>0)
     {
         WriteRoadNoavoids(nodeRoad,road);
@@ -223,7 +229,8 @@ bool  OpenDriveXmlWriter::WriteRoadLinks (TiXmlElement *node, Road* road)
 		nodeLink->LinkEndChild(nodeLinkPredecessor);
 		nodeLinkPredecessor->SetAttribute("elementType", lPredecessor->GetElementType());
 		nodeLinkPredecessor->SetAttribute("elementId", lPredecessor->GetElementId());
-		nodeLinkPredecessor->SetAttribute("contactPoint", lPredecessor->GetContactPoint());
+        if(lPredecessor->GetContactPoint() != "NA")
+            nodeLinkPredecessor->SetAttribute("contactPoint", lPredecessor->GetContactPoint());
         if(lPredecessor->GetElementS()>=0)
         {
             std::stringstream ss;
@@ -242,7 +249,8 @@ bool  OpenDriveXmlWriter::WriteRoadLinks (TiXmlElement *node, Road* road)
 		nodeLink->LinkEndChild(nodeLinkSuccessor);
 		nodeLinkSuccessor->SetAttribute("elementType", lSuccessor->GetElementType());
 		nodeLinkSuccessor->SetAttribute("elementId", lSuccessor->GetElementId());
-		nodeLinkSuccessor->SetAttribute("contactPoint", lSuccessor->GetContactPoint());
+        if(lSuccessor->GetContactPoint() != "NA")
+            nodeLinkSuccessor->SetAttribute("contactPoint", lSuccessor->GetContactPoint());
         if(lSuccessor->GetElementS()>=0)
         {
             std::stringstream ss;
@@ -1875,6 +1883,28 @@ bool OpenDriveXmlWriter::WriteObjectOutlinesOutlinecornerLocal(TiXmlElement *nod
 
 //--------------
 
+
+bool OpenDriveXmlWriter::WriteRoadPriority(TiXmlElement * node,Road * road)
+{
+    TiXmlElement* nodeRoadPriority = new TiXmlElement("userData");
+    nodeRoadPriority->SetAttribute("code","roadPriority");
+    node->LinkEndChild(nodeRoadPriority);
+
+    int nPriority;
+    if(road->GetRoadPriority(nPriority) == 1)
+    {
+        TiXmlElement* nodeRoadPV = new TiXmlElement("roadPriority");
+        nodeRoadPriority->LinkEndChild(nodeRoadPV);
+
+        nodeRoadPV->SetAttribute("Priority",nPriority);
+
+    }
+
+    return true;
+}
+
+//--------------
+
 bool OpenDriveXmlWriter::WriteRoadBorrow(TiXmlElement *node, RoadBorrow *pRoadBorrow)
 {
     TiXmlElement* nodeRoadBorrow = new TiXmlElement("roadborrow");

+ 1 - 0
src/common/common/xodr/OpenDrive/OpenDriveXmlWriter.h

@@ -71,6 +71,7 @@ public:
 
 	//--------------
 
+    bool WriteRoadPriority(TiXmlElement * node,Road * road);
     bool WriteRoadNoavoids(TiXmlElement *node, Road* road);
     bool WriteRoadNoavoid(TiXmlElement *node,RoadNoavoid * pRoadNoavoid);
     bool WriteRoadBorrows(TiXmlElement *node, Road* road);

+ 30 - 0
src/common/common/xodr/OpenDrive/Road.cpp

@@ -65,6 +65,7 @@ Road::Road (const Road& road)
     mRoadBorrowVector = road.mRoadBorrowVector;
     mRoadNoavoidVector = road.mRoadNoavoidVector;
     mSurfaceCRGVector = road.mSurfaceCRGVector;
+    mRoadPriorityVector = road.mRoadPriorityVector;
 
 }
 
@@ -111,6 +112,7 @@ const Road& Road::operator=(const Road& otherRoad)
         mRoadBorrowVector = otherRoad.mRoadBorrowVector;
         mRoadNoavoidVector = otherRoad.mRoadNoavoidVector;
         mSurfaceCRGVector = otherRoad.mSurfaceCRGVector;
+        mRoadPriorityVector = otherRoad.mRoadPriorityVector;
 	}
 	return *this;
 }
@@ -1975,6 +1977,34 @@ int Road::GetRightDrivingLaneCount(double s_check)
     return nrtn;
 }
 
+
+//-------------------------------------------------
+
+void Road::SetRoadPriority(int nPriority)
+{
+    if(mRoadPriorityVector.size()==0)
+        mRoadPriorityVector.push_back(RoadPriority(nPriority));
+    else
+        mRoadPriorityVector[0].SetPriority(nPriority);
+}
+
+//-------------------------------------------------
+
+int Road::GetRoadPriority(int & nPriority)
+{
+    if(mRoadPriorityVector.size() == 0)return 0;
+    nPriority = mRoadPriorityVector[0].GetPriority();
+    return 1;
+}
+
+//-------------------------------------------------
+
+void Road::ResetPriority()
+{
+    if(mRoadPriorityVector.size()>0)mRoadPriorityVector.clear();
+}
+
+
 //-------------------------------------------------
 
 /**

+ 7 - 0
src/common/common/xodr/OpenDrive/Road.h

@@ -101,6 +101,8 @@ private:
 
     vector<RoadNoavoid> mRoadNoavoidVector;
 
+    vector<RoadPriority> mRoadPriorityVector;
+
     vector<surface_CRG> mSurfaceCRGVector;
 
     vector<Railroad_Switch> mRailroadSwitchVector;
@@ -448,6 +450,11 @@ public:
 
     int GetLeftDrivingLaneCount(double s_check);
     int GetRightDrivingLaneCount(double s_check);
+
+    void SetRoadPriority(int nPriority);
+    int GetRoadPriority(int & nPriority);
+    void ResetPriority();
+
 	
 	//-------------------------------------------------
 

+ 15 - 0
src/common/common/xodr/OpenDrive/userData.cpp

@@ -80,3 +80,18 @@ bool RoadNoavoid::CheckInterval(double s_check)
     else
         return false;
 }
+
+RoadPriority::RoadPriority(int nPriority)
+{
+    mnPriority = nPriority;
+}
+
+void RoadPriority::SetPriority(int nPriority)
+{
+    mnPriority = nPriority;
+}
+
+int RoadPriority::GetPriority()
+{
+    return mnPriority;
+}

+ 12 - 0
src/common/common/xodr/OpenDrive/userData.h

@@ -43,4 +43,16 @@ public:
     bool CheckInterval(double s_check);
 };
 
+class RoadPriority
+{
+private:
+    int mnPriority;
+
+public:
+    RoadPriority(int nPriority);
+
+    void SetPriority(int nPriority);
+    int GetPriority();
+};
+
 #endif // USERDATA_H

+ 36 - 0
src/test/testodpriority/main.cpp

@@ -1,8 +1,44 @@
 #include <QCoreApplication>
 
+#include "odpriority.h"
+
+#include <iostream>
+
 int main(int argc, char *argv[])
 {
     QCoreApplication a(argc, argv);
 
+    void * phandle = LoadOpenDrive("/home/yuchuli/GDTEM.xodr");
+
+    if(phandle == NULL)
+    {
+        std::cout<<" can't open opendrive file."<<std::endl;
+        return -1;
+    }
+
+    int nPriority;
+
+    std::string strroadid = "661";
+    if(GetPriority(phandle,strroadid,nPriority)== 0)
+    {
+        std::cout<<"road: "<<strroadid<<" no priority."<<std::endl;
+    }
+    else
+    {
+        std::cout<<"road: "<<strroadid<<" priority: "<<nPriority<<std::endl;
+    }
+
+    strroadid = "664";
+    if(GetPriority(phandle,strroadid,nPriority)== 0)
+    {
+        std::cout<<"road: "<<strroadid<<" no priority."<<std::endl;
+    }
+    else
+    {
+        std::cout<<"road: "<<strroadid<<" priority: "<<nPriority<<std::endl;
+    }
+
+    CloseOpenDrive(phandle);
+
     return a.exec();
 }

+ 10 - 1
src/test/testodpriority/testodpriority.pro

@@ -14,4 +14,13 @@ DEFINES += QT_DEPRECATED_WARNINGS
 # You can also select to disable deprecated APIs only up to a certain version of Qt.
 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
 
-SOURCES += main.cpp
+SOURCES += main.cpp \
+    const.cpp \
+    fresnl.cpp \
+    polevl.c
+
+unix: LIBS += -L$$PWD -lodpriority
+
+HEADERS += \
+    mconf.h \
+    odpriority.h

+ 9 - 0
src/tool/map_lanetoxodr/mainwindow.cpp

@@ -6080,3 +6080,12 @@ void MainWindow::on_actionAdd_Roads_From_Labels_triggered()
         QMessageBox::warning(this,tr("Warning"),tr("Some Item convert fail. Please Check."),QMessageBox::YesAll);
     }
 }
+
+void MainWindow::on_actionEdit_Road_Priority_triggered()
+{
+    std::string strroadid = mpCBRoad->currentText().toStdString();
+    DialogRoadPriority rpd(&mxodr,strroadid,this);
+    rpd.exec();
+
+    mpfb->SetOpenDrive(mxodr);
+}

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

@@ -56,6 +56,7 @@
 #include "dialogroadnoavoid.h"
 #include "dialogaddroadfromnds.h"
 #include "dialogaddroadfromcda.h"
+#include "dialogroadpriority.h"
 
 #include "filebackup.h"
 
@@ -248,6 +249,8 @@ private slots:
 
     void on_actionAdd_Roads_From_Labels_triggered();
 
+    void on_actionEdit_Road_Priority_triggered();
+
 private:
 
 

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

@@ -44,6 +44,7 @@
     <addaction name="actionCalc_Road_S"/>
     <addaction name="actionEdit_Road_Borrow"/>
     <addaction name="actionEdit_Road_Noavoid"/>
+    <addaction name="actionEdit_Road_Priority"/>
     <addaction name="separator"/>
     <addaction name="actionBack"/>
     <addaction name="separator"/>
@@ -224,6 +225,11 @@
     <string>Add Roads From Labels</string>
    </property>
   </action>
+  <action name="actionEdit_Road_Priority">
+   <property name="text">
+    <string>Edit Road Priority</string>
+   </property>
+  </action>
  </widget>
  <layoutdefault spacing="6" margin="11"/>
  <resources>

+ 6 - 3
src/tool/map_lanetoxodr/map_lanetoxodr.pro

@@ -95,7 +95,8 @@ SOURCES += \
     dialogaddroadfromcda.cpp \
     excelapi.cpp \
     function/cdaproc.cpp \
-    ../../include/msgtype/cdadraw.pb.cc
+    ../../include/msgtype/cdadraw.pb.cc \
+    ui/dialogroadpriority.cpp
 
 HEADERS += \
     function/autoroadcontact.h \
@@ -161,7 +162,8 @@ HEADERS += \
     dialogaddroadfromcda.h \
     excelapi.h \
     function/cdaproc.h \
-    ../../include/msgtype/cdadraw.pb.h
+    ../../include/msgtype/cdadraw.pb.h \
+    ui/dialogroadpriority.h
 
 FORMS += \
         ui/dialogaddroadfromnds.ui \
@@ -200,7 +202,8 @@ FORMS += \
         ui/trafficlightdialog.ui \
         ui/trafficlightlanevaliditydialog.ui \
         ui/trafficlightpositiondialog.ui \
-    dialogaddroadfromcda.ui
+    dialogaddroadfromcda.ui \
+    ui/dialogroadpriority.ui
 
 
 !include(../../common/common/xodr/OpenDrive/OpenDrive.pri ) {

+ 99 - 1
src/tool/map_lanetoxodr/ui/dialogroadpriority.cpp

@@ -1,14 +1,112 @@
 #include "dialogroadpriority.h"
 #include "ui_dialogroadpriority.h"
 
-DialogRoadPriority::DialogRoadPriority(QWidget *parent) :
+#include "mainwindow.h"
+
+DialogRoadPriority::DialogRoadPriority(OpenDrive * pxodr,std::string strdefroad,QWidget *parent) :
     QDialog(parent),
     ui(new Ui::DialogRoadPriority)
 {
     ui->setupUi(this);
+
+    mpxodr = pxodr;
+
+    unsigned int i;
+    unsigned int nroadcount = mpxodr->GetRoadCount();
+    for(i=0;i<nroadcount;i++)
+    {
+        const char * strname = mpxodr->GetRoad(i)->GetRoadId().data();
+        ui->comboBox_Road->addItem(strname);
+
+    }
+
+    MainWindow::ComboToString(strdefroad,ui->comboBox_Road);
+
+    setWindowTitle("Road Priority");
+
 }
 
 DialogRoadPriority::~DialogRoadPriority()
 {
     delete ui;
 }
+
+void DialogRoadPriority::on_comboBox_Road_currentIndexChanged(int index)
+{
+    ui->lineEdit_Priority->setText("");
+    Road * pRoad = mpxodr->GetRoad(static_cast<unsigned int >(index) );
+    if(pRoad == 0)
+    {
+        return;
+    }
+
+    ui->lineEdit_RoadLen->setText(QString::number(pRoad->GetRoadLength(),'f',3));
+
+    int nPriority;
+    if(pRoad->GetRoadPriority(nPriority) == 1)
+    {
+        ui->lineEdit_Priority->setText(QString::number(nPriority));
+    }
+}
+
+void DialogRoadPriority::on_pushButton_Add_clicked()
+{
+    Road * pRoad = mpxodr->GetRoad(static_cast<unsigned int >(ui->comboBox_Road->currentIndex())  );
+    if(pRoad == 0)
+    {
+        return;
+    }
+
+    if(ui->lineEdit_Priority->text().toStdString() == "")
+    {
+        QMessageBox::warning(this,"Warning","Priority is empty.",QMessageBox::YesAll);
+        return;
+    }
+
+    pRoad->SetRoadPriority(ui->lineEdit_Priority->text().toInt());
+    on_comboBox_Road_currentIndexChanged(ui->comboBox_Road->currentIndex());
+
+    QMessageBox::information(this,"Information","Add Priority Success.",QMessageBox::YesAll);
+
+}
+
+void DialogRoadPriority::on_pushButton_Delete_clicked()
+{
+    Road * pRoad = mpxodr->GetRoad(static_cast<unsigned int >(ui->comboBox_Road->currentIndex())  );
+    if(pRoad == 0)
+    {
+        return;
+    }
+
+    if(ui->lineEdit_Priority->text().toStdString() == "")
+    {
+        QMessageBox::warning(this,"Warning","this Road No Priority.",QMessageBox::YesAll);
+        return;
+    }
+
+    pRoad->ResetPriority();
+
+    QMessageBox::information(this,"Information","Delete Priority Success.",QMessageBox::YesAll);
+
+    on_comboBox_Road_currentIndexChanged(ui->comboBox_Road->currentIndex());
+}
+
+void DialogRoadPriority::on_pushButton_Change_clicked()
+{
+    Road * pRoad = mpxodr->GetRoad(static_cast<unsigned int >(ui->comboBox_Road->currentIndex())  );
+    if(pRoad == 0)
+    {
+        return;
+    }
+
+    if(ui->lineEdit_Priority->text().toStdString() == "")
+    {
+        QMessageBox::warning(this,"Warning","Priority is empty.",QMessageBox::YesAll);
+        return;
+    }
+
+    pRoad->SetRoadPriority(ui->lineEdit_Priority->text().toInt());
+    on_comboBox_Road_currentIndexChanged(ui->comboBox_Road->currentIndex());
+
+    QMessageBox::information(this,"Information","Change Priority Success.",QMessageBox::YesAll);
+}

+ 14 - 1
src/tool/map_lanetoxodr/ui/dialogroadpriority.h

@@ -3,6 +3,8 @@
 
 #include <QDialog>
 
+#include <OpenDrive/OpenDrive.h>
+
 namespace Ui {
 class DialogRoadPriority;
 }
@@ -12,11 +14,22 @@ class DialogRoadPriority : public QDialog
     Q_OBJECT
 
 public:
-    explicit DialogRoadPriority(QWidget *parent = 0);
+    explicit DialogRoadPriority(OpenDrive * pxodr,std::string strdefroad,QWidget *parent = 0);
     ~DialogRoadPriority();
 
+private slots:
+    void on_comboBox_Road_currentIndexChanged(int index);
+
+    void on_pushButton_Add_clicked();
+
+    void on_pushButton_Delete_clicked();
+
+    void on_pushButton_Change_clicked();
+
 private:
     Ui::DialogRoadPriority *ui;
+
+    OpenDrive * mpxodr;
 };
 
 #endif // DIALOGROADPRIORITY_H

+ 111 - 2
src/tool/map_lanetoxodr/ui/dialogroadpriority.ui

@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
  <class>DialogRoadPriority</class>
  <widget class="QDialog" name="DialogRoadPriority">
@@ -5,13 +6,121 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>400</width>
-    <height>300</height>
+    <width>583</width>
+    <height>344</height>
    </rect>
   </property>
   <property name="windowTitle">
    <string>Dialog</string>
   </property>
+  <widget class="QLabel" name="label">
+   <property name="geometry">
+    <rect>
+     <x>70</x>
+     <y>56</y>
+     <width>67</width>
+     <height>31</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>Road</string>
+   </property>
+  </widget>
+  <widget class="QLabel" name="label_3">
+   <property name="geometry">
+    <rect>
+     <x>70</x>
+     <y>180</y>
+     <width>101</width>
+     <height>21</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>Priority</string>
+   </property>
+  </widget>
+  <widget class="QComboBox" name="comboBox_Road">
+   <property name="geometry">
+    <rect>
+     <x>210</x>
+     <y>50</y>
+     <width>231</width>
+     <height>41</height>
+    </rect>
+   </property>
+  </widget>
+  <widget class="QPushButton" name="pushButton_Change">
+   <property name="geometry">
+    <rect>
+     <x>420</x>
+     <y>250</y>
+     <width>71</width>
+     <height>41</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>Change</string>
+   </property>
+  </widget>
+  <widget class="QPushButton" name="pushButton_Delete">
+   <property name="geometry">
+    <rect>
+     <x>246</x>
+     <y>250</y>
+     <width>89</width>
+     <height>41</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>Delete</string>
+   </property>
+  </widget>
+  <widget class="QLabel" name="label_2">
+   <property name="geometry">
+    <rect>
+     <x>212</x>
+     <y>110</y>
+     <width>70</width>
+     <height>31</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>Length</string>
+   </property>
+  </widget>
+  <widget class="QPushButton" name="pushButton_Add">
+   <property name="geometry">
+    <rect>
+     <x>70</x>
+     <y>250</y>
+     <width>89</width>
+     <height>41</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>Add</string>
+   </property>
+  </widget>
+  <widget class="QLineEdit" name="lineEdit_RoadLen">
+   <property name="geometry">
+    <rect>
+     <x>310</x>
+     <y>104</y>
+     <width>113</width>
+     <height>41</height>
+    </rect>
+   </property>
+  </widget>
+  <widget class="QLineEdit" name="lineEdit_Priority">
+   <property name="geometry">
+    <rect>
+     <x>200</x>
+     <y>170</y>
+     <width>141</width>
+     <height>41</height>
+    </rect>
+   </property>
+  </widget>
  </widget>
  <resources/>
  <connections/>