Bläddra i källkod

change tool/map_lanetoxodr. add object_markings_marking_cornerReference.

yuchuli 3 år sedan
förälder
incheckning
7e0c30e505

+ 67 - 0
src/common/common/xodr/OpenDrive/ObjectSignal.cpp

@@ -3,6 +3,21 @@
 #include <iostream>
 
 
+Object_markings_marking_cornerReference::Object_markings_marking_cornerReference(unsigned int id)
+{
+    mid = id;
+}
+
+void Object_markings_marking_cornerReference::Setid(unsigned int id)
+{
+    mid = id;
+}
+
+unsigned int Object_markings_marking_cornerReference::Getid()
+{
+    return mid;
+}
+
 int Object_markings_marking::Getside(string & strside)
 {
     if(mside.size() == 0)return 0;
@@ -136,6 +151,58 @@ Object_markings_marking::Object_markings_marking(std::string strside,std::string
     mstopOffset = stopOffset;
 }
 
+vector<Object_markings_marking_cornerReference> * Object_markings_marking::GetcornerReferenceVector()
+{
+    return &mcornerReference;
+}
+
+Object_markings_marking_cornerReference * Object_markings_marking::GetcornerReference(unsigned int i)
+{
+    if(mcornerReference.size() == 0)return NULL;
+    if(i>= mcornerReference.size())return NULL;
+    return &mcornerReference[i];
+}
+
+unsigned int Object_markings_marking::GetcornerReferenceCount()
+{
+    return mcornerReference.size();
+}
+
+Object_markings_marking_cornerReference *	Object_markings_marking::GetLastcornerReference()
+{
+    if(mcornerReference.size() == 0)return NULL;
+    return &mcornerReference[mcornerReference.size() -1];
+}
+
+unsigned int Object_markings_marking::AddcornerReference(unsigned int id)
+{
+    unsigned int index = mcornerReference.size();
+    mcornerReference.push_back(Object_markings_marking_cornerReference(id));
+    mnLastAddedcornerReference = index;
+    return index;
+}
+
+unsigned int Object_markings_marking::ClonecornerReference(unsigned int index)
+{
+    if(index>=mcornerReference.size())
+    {
+        std::cout<<" Object_markings_marking::ClonecornerReference fail index: "
+                <<index<<" size: "<<mcornerReference.size()<<std::endl;
+        return index;
+    }
+    if(index<(mcornerReference.size()-1))
+        mcornerReference.insert(mcornerReference.begin()+index+1, mcornerReference[index]);
+    else if(index==mcornerReference.size()-1)
+        mcornerReference.push_back(mcornerReference[index]);
+    mnLastAddedcornerReference=index+1;
+    return mnLastAddedcornerReference;
+}
+
+void Object_markings_marking::DeletecornerReference(unsigned int index)
+{
+    mcornerReference.erase(mcornerReference.begin()+index);
+}
+
 Object_markings::Object_markings(Object_markings_marking xmarking)
 {
     mmarking.push_back(xmarking);

+ 24 - 0
src/common/common/xodr/OpenDrive/ObjectSignal.h

@@ -8,6 +8,16 @@ using std::vector;
 using std::string;
 
 
+class Object_markings_marking_cornerReference
+{
+private:
+    unsigned int mid;
+public:
+    Object_markings_marking_cornerReference(unsigned int id);
+    unsigned int Getid();
+    void Setid(unsigned int id);
+};
+
 
 class Object_markings_marking
 {
@@ -22,6 +32,11 @@ private:
     double mstartOffset;
     double mstopOffset;
 
+    vector<Object_markings_marking_cornerReference> mcornerReference;
+
+private:
+    unsigned int mnLastAddedcornerReference = 0;
+
 public:
     int Getside(string & strside);
     int Getweight(string & strweight);
@@ -49,6 +64,15 @@ public:
     void ClearzOffset();
 
 
+    vector<Object_markings_marking_cornerReference> * GetcornerReferenceVector();
+    Object_markings_marking_cornerReference * GetcornerReference(unsigned int i);
+    unsigned int GetcornerReferenceCount();
+    Object_markings_marking_cornerReference *			GetLastcornerReference();
+    unsigned int AddcornerReference(unsigned int id);
+    unsigned int ClonecornerReference(unsigned int index);
+    void DeletecornerReference(unsigned int index);
+
+
 
 public:
     Object_markings_marking(std::string strside,string color,double spaceLength,

+ 23 - 0
src/common/common/xodr/OpenDrive/OpenDriveXmlParser.cpp

@@ -1363,6 +1363,13 @@ bool OpenDriveXmlParser::ReadObjectMarkingsMarking(Object_markings *pObject_Mark
         pObject_Markings_Marking->SetzOffset(fzOffset);
     }
 
+    TiXmlElement *subNode = node->FirstChildElement("cornerReference");
+    while (subNode)
+    {
+        ReadObjectMarkingsMarkingcornerReference(pObject_Markings_Marking, subNode);
+        subNode = subNode->NextSiblingElement("cornerReference");
+    }
+
 
     return true;
 
@@ -1371,6 +1378,22 @@ bool OpenDriveXmlParser::ReadObjectMarkingsMarking(Object_markings *pObject_Mark
 
 //--------------
 
+bool OpenDriveXmlParser::ReadObjectMarkingsMarkingcornerReference(Object_markings_marking *pObject_Marking, TiXmlElement *node)
+{
+    int id;
+    int checker=TIXML_SUCCESS;
+    checker+=node->QueryIntAttribute("id",&id);
+    if(checker != TIXML_SUCCESS)
+    {
+        cout<<"Error parsing Object Marking cornerReference id attributes"<<endl;
+        return false;
+    }
+    pObject_Marking->AddcornerReference((unsigned int)id);
+    return true;
+}
+
+//--------------
+
 bool OpenDriveXmlParser::ReadObjectOutlines(Object * pObject,TiXmlElement *node)
 {
     Object_outlines xoutlines;

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

@@ -90,6 +90,7 @@ public:
     bool ReadObject(Road * road,TiXmlElement * node);
     bool ReadObjectMarkings(Object * pObject,TiXmlElement * node);
     bool ReadObjectMarkingsMarking(Object_markings * pObject_Markings,TiXmlElement * node);
+    bool ReadObjectMarkingsMarkingcornerReference(Object_markings_marking * pObject_Marking,TiXmlElement * node);
 
 	//--------------
 

+ 19 - 0
src/common/common/xodr/OpenDrive/OpenDriveXmlWriter.cpp

@@ -1513,6 +1513,25 @@ bool OpenDriveXmlWriter::WriteObjectMarkingsMarking(TiXmlElement *node, Object_m
     nodemarking->SetDoubleAttribute("startOffset",pObject_markings_marking->GetstartOffset());
     nodemarking->SetDoubleAttribute("stopOffset",pObject_markings_marking->GetstopOffset());
 
+    unsigned int lcornerCount = pObject_markings_marking->GetcornerReferenceCount();
+    unsigned int i;
+    for(i=0;i<lcornerCount;i++)
+    {
+        WriteObjectMarkingsMarkingcornerReference(nodemarking,pObject_markings_marking->GetcornerReference(i));
+    }
+
+    return true;
+}
+
+//--------------
+
+bool OpenDriveXmlWriter::WriteObjectMarkingsMarkingcornerReference(TiXmlElement *node, Object_markings_marking_cornerReference *pObject_markings_marking_cornerReference)
+{
+    TiXmlElement * nodecornerReference = new TiXmlElement("cornerReference");
+    node->LinkEndChild(nodecornerReference);
+
+    nodecornerReference->SetAttribute("id",pObject_markings_marking_cornerReference->Getid());
+
     return true;
 }
 

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

@@ -86,6 +86,7 @@ public:
     bool WriteSignal_laneValidity(TiXmlElement * node, signal_laneValidity * pSignal_laneValidity);
     bool WriteObjectMarkings(TiXmlElement * node,Object_markings * pObject_markings);
     bool WriteObjectMarkingsMarking(TiXmlElement * node,Object_markings_marking * pObject_markings_marking);
+    bool WriteObjectMarkingsMarkingcornerReference(TiXmlElement * node,Object_markings_marking_cornerReference * pObject_markings_marking_cornerReference);
 
     //--------------
 

+ 2 - 2
src/tool/map_lanetoxodr/dialogeditlane.cpp

@@ -176,12 +176,12 @@ void DialogEditLane::on_pushButton_DeleteLane_clicked()
     if(mpCurLS == 0)return;
     int nlanecount = mpCurLS->GetLaneCount();
     int i;
-    bool bFind = false;
+//    bool bFind = false;
     for(i=0;i<nlanecount;i++)
     {
         if(mpCurLS->GetLane(i)->GetId() == index)
         {
-            bFind = true;
+ //           bFind = true;
             break;
         }
     }

+ 35 - 0
src/tool/map_lanetoxodr/dialogroadobject_marking.cpp

@@ -1,6 +1,8 @@
 #include "dialogroadobject_marking.h"
 #include "ui_dialogroadobject_marking.h"
 
+#include "dialogroadobject_markingcornerreference.h"
+
 #include <iostream>
 
 static std::string gstr_e_markingsideType[] ={"left","right","front","rear"};
@@ -98,6 +100,11 @@ void DialogRoadObject_Marking::CreateView()
     nVIndex++;
     int nPBSpace = 150;
     int nPBWidth = 100;
+
+    mpPBcornerReference = ViewCreate::CreatePB(startpos_x+0*nPBSpace,startpos_y+nVIndex*nVSpace,nPBWidth*2,nHeight,"cornerReference",this);
+
+    nVIndex++;
+
     mpPBAdd = ViewCreate::CreatePB(startpos_x+0*nPBSpace,startpos_y+nVIndex*nVSpace,nPBWidth,nHeight,"Add",this);
     mpPBDelete = ViewCreate::CreatePB(startpos_x+1*nPBSpace,startpos_y+nVIndex*nVSpace,nPBWidth,nHeight,"Delete",this);
     mpPBChange = ViewCreate::CreatePB(startpos_x+2*nPBSpace,startpos_y+nVIndex*nVSpace,nPBWidth,nHeight,"Change",this);
@@ -108,6 +115,8 @@ void DialogRoadObject_Marking::CreateView()
     connect(mpPBDelete,SIGNAL(clicked(bool)),this,SLOT(onClickDelete()));
     connect(mpPBChange,SIGNAL(clicked(bool)),this,SLOT(onClickChange()));
 
+    connect(mpPBcornerReference,SIGNAL(clicked(bool)),this,SLOT(onClickcornerReference()));
+
 
 }
 
@@ -442,3 +451,29 @@ void DialogRoadObject_Marking::onClickChange()
 
     QMessageBox::information(this,"Info","Change marking successfully",QMessageBox::YesAll);
 }
+
+void DialogRoadObject_Marking::onClickcornerReference()
+{
+    Object * pObject = mpObject;
+
+    if(mpObject == 0)return;
+
+    Object_markings * pmarkings = pObject->Getmarkings();
+
+    if(pmarkings == NULL)
+    {
+        QMessageBox::warning(this,"Warning","No Markings",QMessageBox::YesAll);
+        return;
+    }
+
+    Object_markings_marking * pmarking = pmarkings->GetMarking(mpCBMarking->currentIndex());
+
+    if(pmarking == NULL)
+    {
+        QMessageBox::warning(this,"Warning","No Marking.",QMessageBox::YesAll);
+    }
+
+    DialogRoadObject_MarkingcornerReference dlgcr(pmarking);
+    dlgcr.exec();
+
+}

+ 4 - 0
src/tool/map_lanetoxodr/dialogroadobject_marking.h

@@ -32,6 +32,8 @@ private slots:
     void onClickDelete();
     void onClickChange();
 
+    void onClickcornerReference();
+
 private:
     Object * mpObject = 0;
 
@@ -50,6 +52,8 @@ private:
     QPushButton * mpPBAdd;
     QPushButton * mpPBDelete;
     QPushButton * mpPBChange;
+
+    QPushButton * mpPBcornerReference;
 };
 
 #endif // DIALOGROADOBJECT_MARKING_H

+ 1 - 1
src/tool/map_lanetoxodr/dialogroadobject_marking.ui

@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>861</width>
-    <height>404</height>
+    <height>506</height>
    </rect>
   </property>
   <property name="windowTitle">

+ 177 - 0
src/tool/map_lanetoxodr/dialogroadobject_markingcornerreference.cpp

@@ -0,0 +1,177 @@
+#include "dialogroadobject_markingcornerreference.h"
+#include "ui_dialogroadobject_markingcornerreference.h"
+
+#include <iostream>
+
+DialogRoadObject_MarkingcornerReference::DialogRoadObject_MarkingcornerReference(Object_markings_marking * pmarking, QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::DialogRoadObject_MarkingcornerReference)
+{
+    ui->setupUi(this);
+    mpmarking = pmarking;
+
+    CreateView();
+
+    UpdateCB();
+
+    setWindowTitle("Edit Marking cornerReference");
+}
+
+DialogRoadObject_MarkingcornerReference::~DialogRoadObject_MarkingcornerReference()
+{
+    delete ui;
+}
+
+void DialogRoadObject_MarkingcornerReference::CreateView()
+{
+    int startpos_x = 30;
+    int startpos_y = 30;
+    int nSpace = 260;
+    int nLabelWidth = 80;
+    int nLEWidth = 150;
+    int nHeight = 35;
+    int nVSpace = 60;
+    int nVIndex = 0;
+    int nHIndex = 0;
+
+    mpCBcornerReference = ViewCreate::CreateCB(startpos_x+nHIndex*nSpace,startpos_y+nVIndex*nVSpace,nLabelWidth*15/10,nLEWidth*15/10,nHeight,"cornerReference",this);
+    nVIndex++;
+    nHIndex = 0;
+
+    mpLEid = ViewCreate::CreateLE(startpos_x+nHIndex*nSpace,startpos_y+nVIndex*nVSpace,nLabelWidth,nLEWidth,nHeight,"id",this);
+
+    nVIndex++;
+    int nPBSpace = 150;
+    int nPBWidth = 100;
+
+
+    mpPBAdd = ViewCreate::CreatePB(startpos_x+0*nPBSpace,startpos_y+nVIndex*nVSpace,nPBWidth,nHeight,"Add",this);
+    mpPBDelete = ViewCreate::CreatePB(startpos_x+1*nPBSpace,startpos_y+nVIndex*nVSpace,nPBWidth,nHeight,"Delete",this);
+    mpPBChange = ViewCreate::CreatePB(startpos_x+2*nPBSpace,startpos_y+nVIndex*nVSpace,nPBWidth,nHeight,"Change",this);
+
+    connect(mpCBcornerReference,SIGNAL(currentIndexChanged(int)),this,SLOT(CurrentcornerReference(int)));
+    connect(mpPBAdd,SIGNAL(clicked(bool)),this,SLOT(onClickAdd()));
+    connect(mpPBDelete,SIGNAL(clicked(bool)),this,SLOT(onClickDelete()));
+    connect(mpPBChange,SIGNAL(clicked(bool)),this,SLOT(onClickChange()));
+}
+
+void DialogRoadObject_MarkingcornerReference::UpdateCB()
+{
+    mpCBcornerReference->clear();
+    int i;
+    if(mpmarking == 0)return;
+    Object_markings_marking * pMarking = mpmarking;
+
+    int ncornerReferenceCount = pMarking->GetcornerReferenceCount();
+
+    for(i=0;i<ncornerReferenceCount;i++)
+    {
+        mpCBcornerReference->addItem(QString("cornerReference ")+ QString::number(i));
+    }
+}
+
+void DialogRoadObject_MarkingcornerReference::CurrentcornerReference(int index)
+{
+    if(index == -1)return;
+    if(mpmarking == 0)return;
+
+    Object_markings_marking * pMarking = mpmarking;
+
+    if(pMarking == NULL)
+    {
+        return;
+    }
+
+    Object_markings_marking_cornerReference * pcornerRef = pMarking->GetcornerReference(index);
+
+    if(pcornerRef == NULL)
+    {
+        std::cout<<" Object Marking cornerReference "<<index<<" is NULL"<<std::endl;
+        return;
+    }
+
+    mpLEid->setText(QString::number(pcornerRef->Getid()));
+
+}
+
+void DialogRoadObject_MarkingcornerReference::onClickAdd()
+{
+    if(mpmarking == 0)
+    {
+        QMessageBox::warning(this,"Warning","Marking is NULL.",QMessageBox::YesAll);
+        return;
+    }
+
+    Object_markings_marking * pMarking = mpmarking;
+
+    unsigned int id;
+
+    if(ViewCreate::CheckLE(mpLEid,"id",true,this) == true)
+    {
+        id = mpLEid->text().toInt();
+    }
+    else
+    {
+        return;
+    }
+
+    pMarking->AddcornerReference(id);
+
+    UpdateCB();
+
+
+}
+
+void DialogRoadObject_MarkingcornerReference::onClickDelete()
+{
+    Object_markings_marking * pMarking = mpmarking;
+
+    if(mpmarking == 0)return;
+
+    if(pMarking->GetcornerReferenceCount() == 0)
+    {
+        QMessageBox::warning(this,"Warning","No cornerReference.",QMessageBox::YesAll);
+        return;
+    }
+
+    pMarking->DeletecornerReference(mpCBcornerReference->currentIndex());
+
+    UpdateCB();
+}
+
+void DialogRoadObject_MarkingcornerReference::onClickChange()
+{
+    if(mpmarking == 0)
+    {
+        QMessageBox::warning(this,"Warning","Marking is NULL.",QMessageBox::YesAll);
+        return;
+    }
+
+    Object_markings_marking * pMarking = mpmarking;
+    if(pMarking->GetcornerReferenceCount() == 0)
+    {
+        QMessageBox::warning(this,"Warning","No cornerReference.",QMessageBox::YesAll);
+        return;
+    }
+
+    Object_markings_marking_cornerReference * pcorner = pMarking->GetcornerReference(mpCBcornerReference->currentIndex());
+
+    if(pcorner == NULL)
+    {
+        QMessageBox::warning(this,"Warnig","cornerReference is NULL",QMessageBox::YesAll);
+        return;
+    }
+
+    unsigned int id;
+    if(ViewCreate::CheckLE(mpLEid,"id",true,this) == true)
+    {
+        id = mpLEid->text().toInt();
+    }
+    else
+    {
+        return;
+    }
+
+    pcorner->Setid(id);
+
+}

+ 46 - 0
src/tool/map_lanetoxodr/dialogroadobject_markingcornerreference.h

@@ -0,0 +1,46 @@
+#ifndef DIALOGROADOBJECT_MARKINGCORNERREFERENCE_H
+#define DIALOGROADOBJECT_MARKINGCORNERREFERENCE_H
+
+#include <QDialog>
+
+#include "viewcreate.h"
+
+#include <OpenDrive/OpenDrive.h>
+
+namespace Ui {
+class DialogRoadObject_MarkingcornerReference;
+}
+
+class DialogRoadObject_MarkingcornerReference : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit DialogRoadObject_MarkingcornerReference(Object_markings_marking * pmarking, QWidget *parent = nullptr);
+    ~DialogRoadObject_MarkingcornerReference();
+
+private:
+    Ui::DialogRoadObject_MarkingcornerReference *ui;
+
+private:
+    void CreateView();
+    void UpdateCB();
+
+private slots:
+    void CurrentcornerReference(int index);
+    void onClickAdd();
+    void onClickDelete();
+    void onClickChange();
+
+private:
+    Object_markings_marking * mpmarking;
+
+    QComboBox * mpCBcornerReference;
+    QLineEdit * mpLEid;
+
+    QPushButton * mpPBAdd;
+    QPushButton * mpPBDelete;
+    QPushButton * mpPBChange;
+};
+
+#endif // DIALOGROADOBJECT_MARKINGCORNERREFERENCE_H

+ 19 - 0
src/tool/map_lanetoxodr/dialogroadobject_markingcornerreference.ui

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>DialogRoadObject_MarkingcornerReference</class>
+ <widget class="QDialog" name="DialogRoadObject_MarkingcornerReference">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>488</width>
+    <height>276</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Dialog</string>
+  </property>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

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

@@ -48,6 +48,7 @@ SOURCES += \
     dialogroadnoavoid.cpp \
     dialogroadobject.cpp \
     dialogroadobject_marking.cpp \
+    dialogroadobject_markingcornerreference.cpp \
     dialogroadobject_material.cpp \
     dialogroadobject_outline.cpp \
     dialogroadobject_outline_cornerroad.cpp \
@@ -110,6 +111,7 @@ HEADERS += \
     dialogroadnoavoid.h \
     dialogroadobject.h \
     dialogroadobject_marking.h \
+    dialogroadobject_markingcornerreference.h \
     dialogroadobject_material.h \
     dialogroadobject_outline.h \
     dialogroadobject_outline_cornerroad.h \
@@ -166,6 +168,7 @@ FORMS += \
         dialogroadnoavoid.ui \
         dialogroadobject.ui \
         dialogroadobject_marking.ui \
+        dialogroadobject_markingcornerreference.ui \
         dialogroadobject_material.ui \
         dialogroadobject_outline.ui \
         dialogroadobject_outline_cornerroad.ui \