trafficlightdialog.cpp 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. #include "trafficlightdialog.h"
  2. #include "ui_trafficlightdialog.h"
  3. #include "trafficlightlanevaliditydialog.h"
  4. #include "trafficlightpositiondialog.h"
  5. #include "mainwindow.h"
  6. #include <QMessageBox>
  7. TrafficLightDialog::TrafficLightDialog(OpenDrive * pxodr,std::string strdefroad,QWidget *parent) :
  8. QDialog(parent),
  9. ui(new Ui::TrafficLightDialog)
  10. {
  11. ui->setupUi(this);
  12. mpxodr = pxodr;
  13. ui->comboBox_dynamic->addItem("yes");
  14. ui->comboBox_dynamic->addItem("no");
  15. ui->lineEdit_id->setReadOnly(true);
  16. int i;
  17. int nroadcount = mpxodr->GetRoadCount();
  18. for(i=0;i<nroadcount;i++)
  19. {
  20. const char * strname = mpxodr->GetRoad(i)->GetRoadId().data();
  21. ui->comboBox_Road->addItem(strname);
  22. }
  23. MainWindow::ComboToString(strdefroad,ui->comboBox_Road);
  24. setWindowTitle("Edit Traffic Light");
  25. }
  26. TrafficLightDialog::~TrafficLightDialog()
  27. {
  28. delete ui;
  29. }
  30. void TrafficLightDialog::on_comboBox_Road_currentIndexChanged(int index)
  31. {
  32. Road * pRoad = mpxodr->GetRoad(index);
  33. if(pRoad == 0)
  34. {
  35. // QMessageBox::warning(this,"WARN","MainWindow::onClickCBRoadChange road is NULL");
  36. return;
  37. }
  38. ui->lineEdit_RoadLen->setText(QString::number(pRoad->GetRoadLength(),'f',3));
  39. ui->comboBox_TrafficLIght->clear();
  40. int nsigcount = pRoad->GetSignalCount();
  41. if(nsigcount == 0)
  42. {
  43. initlineedit();
  44. return;
  45. }
  46. int i;
  47. for(i=0;i<nsigcount;i++)
  48. {
  49. Signal * pSignal = pRoad->GetSignal(i);
  50. ui->comboBox_TrafficLIght->addItem(pSignal->Getid().data());
  51. }
  52. }
  53. void TrafficLightDialog::initlineedit()
  54. {
  55. ui->lineEdit_name->setText("");
  56. ui->lineEdit_id->setText("");
  57. ui->lineEdit_s->setText("0.0");
  58. ui->lineEdit_t->setText("0.0");
  59. // ui->comboBox_dynamic->setText("");
  60. ui->lineEdit_orientation->setText("-");
  61. ui->lineEdit_zOffset->setText("0.0");
  62. ui->lineEdit_type->setText("1000001");
  63. ui->lineEdit_country->setText("OpenDrive");
  64. ui->lineEdit_countryRevision->setText("2013");
  65. ui->lineEdit_subtype->setText("-1");
  66. ui->lineEdit_hOffset->setText("0.1");
  67. ui->lineEdit_pitch->setText("0");
  68. ui->lineEdit_roll->setText("0");
  69. ui->lineEdit_height->setText("0.1");
  70. ui->lineEdit_width->setText("0.1");
  71. }
  72. void TrafficLightDialog::showsignal(Signal *pSignal)
  73. {
  74. ui->lineEdit_name->setText(pSignal->Getname().data());
  75. ui->lineEdit_id->setText(pSignal->Getid().data());
  76. ui->lineEdit_s->setText(QString::number(pSignal->Gets()));
  77. ui->lineEdit_t->setText(QString::number(pSignal->Gett()));
  78. if(pSignal->Getdynamic())ui->comboBox_dynamic->setCurrentIndex(0);
  79. else ui->comboBox_dynamic->setCurrentIndex(1);
  80. // ui->comboBox_dynamic->setText("");
  81. ui->lineEdit_orientation->setText(pSignal->Getorientation().data());
  82. ui->lineEdit_zOffset->setText(QString::number(pSignal->GetzOffset()));
  83. ui->lineEdit_type->setText(pSignal->Gettype().data());
  84. ui->lineEdit_country->setText(pSignal->Getcountry().data());
  85. ui->lineEdit_countryRevision->setText(pSignal->GetcountryRevision().data());
  86. ui->lineEdit_subtype->setText(pSignal->Getsubtype().data());
  87. ui->lineEdit_hOffset->setText(QString::number(pSignal->GethOffset()));
  88. ui->lineEdit_pitch->setText(QString::number(pSignal->Getpitch()));
  89. ui->lineEdit_roll->setText(QString::number(pSignal->Getroll()));
  90. ui->lineEdit_height->setText(QString::number(pSignal->Getheight()));
  91. ui->lineEdit_width->setText(QString::number(pSignal->Getwidth()));
  92. }
  93. void TrafficLightDialog::on_comboBox_TrafficLIght_currentIndexChanged(int index)
  94. {
  95. Road * pRoad =mpxodr->GetRoad(ui->comboBox_Road->currentIndex());
  96. if(pRoad == 0)return;
  97. if(pRoad->GetSignalCount() == 0)return;
  98. if(index >= pRoad->GetSignalCount())return;
  99. Signal * pSignal = pRoad->GetSignal(index);
  100. showsignal(pSignal);
  101. }
  102. void TrafficLightDialog::on_pushButton_EditinertialPosition_clicked()
  103. {
  104. Road * pRoad =mpxodr->GetRoad(ui->comboBox_Road->currentIndex());
  105. if(pRoad == 0)return;
  106. if(pRoad->GetSignalCount() == 0)return;
  107. Signal * pSignal =pRoad->GetSignal(ui->comboBox_TrafficLIght->currentIndex());
  108. if(pSignal == 0)return;
  109. double lon0,lat0;
  110. mpxodr->GetHeader()->GetLat0Lon0(lat0,lon0);
  111. TrafficLightpositionDialog td(pSignal,lon0,lat0,this);
  112. int res = td.exec();
  113. (void)&res;
  114. }
  115. void TrafficLightDialog::on_pushButton_EditlaneValidity_clicked()
  116. {
  117. Road * pRoad =mpxodr->GetRoad(ui->comboBox_Road->currentIndex());
  118. if(pRoad == 0)return;
  119. if(pRoad->GetSignalCount() == 0)return;
  120. Signal * pSignal =pRoad->GetSignal(ui->comboBox_TrafficLIght->currentIndex());
  121. if(pSignal == 0)return;
  122. TrafficLightlaneValidityDialog td(pSignal,this);
  123. int res = td.exec();
  124. (void)&res;
  125. }
  126. void TrafficLightDialog::on_pushButton_Add_clicked()
  127. {
  128. Road * pRoad =mpxodr->GetRoad(ui->comboBox_Road->currentIndex());
  129. if(pRoad == 0)return;
  130. double s;
  131. double t;
  132. string id;
  133. string name;
  134. bool dynamic;
  135. string orientation;
  136. double zOffset;
  137. string type;
  138. string country;
  139. string countryRevision;
  140. string subtype;
  141. double hOffset;
  142. double pitch;
  143. double roll;
  144. double height;
  145. double width;
  146. int nid = getnewsignalid();
  147. string strid = QString::number(nid).toStdString();
  148. geteditvalue(s,t,name,dynamic,orientation,zOffset,type,country,countryRevision,
  149. subtype,hOffset,pitch,roll,height,width);
  150. pRoad->AddSignal(s,t,strid,name,dynamic,orientation,zOffset,type,country,countryRevision,
  151. subtype,hOffset,pitch,roll,height,width);
  152. on_comboBox_Road_currentIndexChanged(ui->comboBox_Road->currentIndex());
  153. ui->comboBox_TrafficLIght->setCurrentIndex(pRoad->GetSignalCount()-1);
  154. }
  155. void TrafficLightDialog::on_pushButton_Delete_clicked()
  156. {
  157. Road * pRoad =mpxodr->GetRoad(ui->comboBox_Road->currentIndex());
  158. if(pRoad == 0)return;
  159. if(pRoad->GetSignalCount() == 0)
  160. {
  161. QMessageBox::warning(this,"warning","No Signal Delete.");
  162. return;
  163. }
  164. pRoad->DeleteSignal(ui->comboBox_TrafficLIght->currentIndex());
  165. on_comboBox_Road_currentIndexChanged(ui->comboBox_Road->currentIndex());
  166. ui->comboBox_TrafficLIght->setCurrentIndex(pRoad->GetSignalCount()-1);
  167. }
  168. void TrafficLightDialog::on_pushButton_Update_clicked()
  169. {
  170. Road * pRoad =mpxodr->GetRoad(ui->comboBox_Road->currentIndex());
  171. if(pRoad == 0)return;
  172. if(pRoad->GetSignalCount() == 0)return;
  173. Signal * pSignal =pRoad->GetSignal(ui->comboBox_TrafficLIght->currentIndex());
  174. if(pSignal == 0)return;
  175. double s;
  176. double t;
  177. string name;
  178. bool dynamic;
  179. string orientation;
  180. double zOffset;
  181. string type;
  182. string country;
  183. string countryRevision;
  184. string subtype;
  185. double hOffset;
  186. double pitch;
  187. double roll;
  188. double height;
  189. double width;
  190. geteditvalue(s,t,name,dynamic,orientation,zOffset,type,country,countryRevision,
  191. subtype,hOffset,pitch,roll,height,width);
  192. pSignal->Sets(s);
  193. pSignal->Sett(t);
  194. pSignal->Setname(name);
  195. pSignal->Setdynamic(dynamic);
  196. pSignal->Setorientation(orientation);
  197. pSignal->SetzOffset(zOffset);
  198. pSignal->Settype(type);
  199. pSignal->Setcountry(country);
  200. pSignal->SetcountryRevision(countryRevision);
  201. pSignal->Setsubtype(subtype);
  202. pSignal->SethOffset(hOffset);
  203. pSignal->Setpitch(pitch);
  204. pSignal->Setroll(roll);
  205. pSignal->Setheight(height);
  206. pSignal->Setwidth(width);
  207. }
  208. int TrafficLightDialog::geteditvalue(double &s, double &t, std::string &name, bool &dynamic,
  209. std::string &orientation, double &zOffset, std::string &type,
  210. std::string &country, std::string &countryRevision, std::string &subtype,
  211. double &hOffset, double &pitch, double &roll, double &height, double &width)
  212. {
  213. s = ui->lineEdit_s->text().toDouble();
  214. t = ui->lineEdit_t->text().toDouble();
  215. name = ui->lineEdit_name->text().toStdString();
  216. if(ui->comboBox_dynamic->currentIndex() == 0)dynamic = true;
  217. else dynamic = false;
  218. orientation = ui->lineEdit_orientation->text().toStdString();
  219. zOffset = ui->lineEdit_zOffset->text().toDouble();
  220. type = ui->lineEdit_type->text().toStdString();
  221. country = ui->lineEdit_country->text().toStdString();
  222. countryRevision = ui->lineEdit_countryRevision->text().toStdString();
  223. subtype = ui->lineEdit_subtype->text().toStdString();
  224. hOffset = ui->lineEdit_hOffset->text().toDouble();
  225. pitch = ui->lineEdit_pitch->text().toDouble();
  226. roll = ui->lineEdit_roll->text().toDouble();
  227. height = ui->lineEdit_height->text().toDouble();
  228. width = ui->lineEdit_width->text().toDouble();
  229. return 0;
  230. }
  231. int TrafficLightDialog::getnewsignalid()
  232. {
  233. int id = -1;
  234. bool bHaveExist = false;
  235. do
  236. {
  237. bHaveExist = false;
  238. id = id + 1;
  239. int nroadcount = mpxodr->GetRoadCount();
  240. int i,j;
  241. for(i=0;i<nroadcount;i++)
  242. {
  243. Road * pRoad = mpxodr->GetRoad(i);
  244. int nsignalcount = pRoad->GetSignalCount();
  245. for(j=0;j<nsignalcount;j++)
  246. {
  247. if(id == atoi(pRoad->GetSignal(j)->Getid().data()))
  248. {
  249. bHaveExist = true;
  250. break;
  251. }
  252. }
  253. if(bHaveExist)break;
  254. }
  255. }while(bHaveExist == true);
  256. return id;
  257. }