roadeditdialog.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611
  1. #include "roadeditdialog.h"
  2. #include "ui_roadeditdialog.h"
  3. #include "mainwindow.h"
  4. #include "math.h"
  5. #define VIEW_WIDTH 850
  6. #define VIEW_HEIGHT 450
  7. RoadEditDialog::RoadEditDialog(OpenDrive * pxodr,std::string strdefroad,QWidget *parent) :
  8. QDialog(parent),
  9. ui(new Ui::RoadEditDialog)
  10. {
  11. mpxodr = pxodr;
  12. ui->setupUi(this);
  13. myview = new MyView(this);
  14. myview->setObjectName(QStringLiteral("graphicsView"));
  15. myview->setGeometry(QRect(30, 300, 900, 500));
  16. // connect(myview,SIGNAL(dbclickxy(double,double)),this,SLOT(onClickXY(double,double)));
  17. image = new QImage(VIEW_WIDTH, VIEW_HEIGHT, QImage::Format_RGB32);//画布的初始化大小设为300*300,使用32位颜色
  18. myview->setCacheMode(myview->CacheBackground);
  19. painter = new QPainter(image);
  20. painter->end();
  21. // scene = new QGraphicsScene;
  22. scene = new QGraphicsScene(-VIEW_WIDTH/2, -VIEW_HEIGHT/2, VIEW_WIDTH, VIEW_HEIGHT);
  23. myview->setScene(scene);
  24. scene->setBackgroundBrush(Qt::darkGreen);
  25. ui->comboBox_geotype->addItem("Line");
  26. ui->comboBox_geotype->addItem("Spiral");
  27. ui->comboBox_geotype->addItem("Arc");
  28. ui->comboBox_geotype->addItem("Poly");
  29. ui->comboBox_geotype->addItem("Param Poly");
  30. int i;
  31. int nroadcount = mpxodr->GetRoadCount();
  32. for(i=0;i<nroadcount;i++)
  33. {
  34. const char * strname = mpxodr->GetRoad(i)->GetRoadId().data();
  35. ui->comboBox_Road->addItem(strname);
  36. }
  37. MainWindow::ComboToString(strdefroad,ui->comboBox_Road);
  38. }
  39. RoadEditDialog::~RoadEditDialog()
  40. {
  41. delete ui;
  42. }
  43. void RoadEditDialog::ExecPainter()
  44. {
  45. painter->begin(image);
  46. int nkeep = 30;
  47. Road * pRoad = mpCurRoad;
  48. // qDebug("time is %d",x.elapsed());
  49. image->fill(QColor(255, 255, 255));//对画布进行填充
  50. // std::vector<iv::GPSData> navigation_data = brain->navigation_data;
  51. painter->setRenderHint(QPainter::Antialiasing, true);//设置反锯齿模式,好看一点
  52. // painter->translate(mnMoveX,mnMoveY);
  53. // painter->translate(VIEW_WIDTH/2,VIEW_HEIGHT/2);
  54. double froad_xmin,froad_ymin,froad_xmax,froad_ymax;
  55. int nfac = 1;
  56. ServiceXODRTool.GetRoadMaxMin(pRoad,froad_xmin,froad_ymin,froad_xmax,froad_ymax);
  57. double fac_x,fac_y;
  58. fac_x = 100000;
  59. fac_y = 100000;
  60. if(froad_xmax > froad_xmin)
  61. {
  62. fac_x = (VIEW_WIDTH-nkeep*2)/(froad_xmax - froad_xmin);
  63. }
  64. if(froad_ymax > froad_ymin)
  65. {
  66. fac_y = (VIEW_HEIGHT - nkeep*2)/(froad_ymax - froad_ymin);
  67. }
  68. nfac = fac_x;
  69. if(fac_y < nfac)nfac = fac_y;
  70. painter->translate(nkeep,VIEW_HEIGHT-nkeep);
  71. painter->setPen(Qt::black);
  72. // painter->drawLine(VIEW_WIDTH/(-2),0,VIEW_WIDTH/2,0);
  73. // painter->drawLine(0,VIEW_HEIGHT/(-2),0,VIEW_HEIGHT/2);
  74. int i;
  75. // int nfac = 5;;
  76. painter->setPen(Qt::blue);
  77. // if(mbClick)
  78. // {
  79. // painter->setPen(Qt::red);
  80. // painter->drawEllipse(QPoint(mClickX ,mClickY),mnMarkSize,mnMarkSize);
  81. // painter->setPen(Qt::black);
  82. // }
  83. // if(mbSetObj)
  84. // {
  85. // painter->setPen(Qt::green);
  86. // painter->drawRect(mfObjX*nfac-mnMarkSize,mfObjY*nfac*(-1)-mnMarkSize,mnMarkSize*2,mnMarkSize*2);
  87. // painter->setPen(Qt::black);
  88. // }
  89. painter->setPen(Qt::green);
  90. double x0,y0;
  91. // GaussProjCal(glon0,glat0,&x0,&y0);
  92. painter->setPen(Qt::blue);
  93. // int nfac = nfac;
  94. // int selid = mpCBRoad->currentText().toInt();
  95. // continue;
  96. int j;
  97. painter->setPen(Qt::blue);
  98. for(j=0;j<pRoad->GetGeometryBlockCount();j++)
  99. {
  100. GeometryBlock * pgeob = pRoad->GetGeometryBlock(j);
  101. double x,y;
  102. double x_center,y_center;
  103. double R;
  104. RoadGeometry * pg;
  105. GeometryArc * parc;
  106. GeometryParamPoly3 * ppp3;
  107. GeometrySpiral *pSpiral;
  108. double rel_x,rel_y,rel_hdg;
  109. pg = pgeob->GetGeometryAt(0);
  110. x = pg->GetX();
  111. y = pg->GetY();
  112. painter->setPen(Qt::blue);
  113. if(j == mnSelGeo)
  114. {
  115. painter->setPen(Qt::green);
  116. }
  117. // if(j== 0)
  118. // {
  119. // if(selid == atoi(pRoad->GetRoadId().data()))
  120. // {
  121. // painter->setPen(Qt::green);
  122. // painter->drawEllipse(x*nfac-5,y*nfac*(-1)-5,10,10);
  123. // painter->setPen(Qt::red);
  124. // }
  125. // }
  126. switch (pg->GetGeomType()) {
  127. case 0:
  128. painter->drawLine(QPoint((x-froad_xmin)*nfac,(y-froad_ymin)*nfac*(-1)),
  129. QPoint(((x-froad_xmin) + pg->GetLength() * cos(pg->GetHdg()))*nfac,((y-froad_ymin) + pg->GetLength() * sin(pg->GetHdg()))*nfac*(-1)));
  130. break;
  131. case 1:
  132. pSpiral = (GeometrySpiral * )pg;
  133. {
  134. int ncount = pSpiral->GetLength() * nfac;
  135. double sstep = pSpiral->GetLength()/((double)ncount);
  136. int k;
  137. double x0,y0,hdg0,s0;
  138. x0 = pSpiral->GetX();
  139. y0 = pSpiral->GetY();
  140. s0 = pSpiral->GetS();
  141. hdg0 = pSpiral->GetHdg() ;
  142. painter->setPen(Qt::red);
  143. for(k=0;k<ncount;k++)
  144. {
  145. pSpiral->GetCoords(s0+sstep*k,rel_x,rel_y,rel_hdg);
  146. x = rel_x - froad_xmin;
  147. y = rel_y - froad_ymin;
  148. painter->drawPoint((int)(x*nfac),(int)(y*(-1.0*nfac)));
  149. }
  150. painter->setPen(Qt::blue);
  151. }
  152. // qDebug("spi");
  153. break;
  154. case 2:
  155. {
  156. parc = (GeometryArc *)pg;
  157. R = abs(1.0/parc->GetCurvature());
  158. if(parc->GetCurvature() > 0)
  159. {
  160. x_center = pg->GetX() + R *cos(pg->GetHdg() + M_PI/2.0);
  161. y_center = pg->GetY() + R * sin(pg->GetHdg() + M_PI/2.0);
  162. }
  163. else
  164. {
  165. x_center = pg->GetX() + R *cos(pg->GetHdg() -M_PI/2.0);
  166. y_center = pg->GetY() + R * sin(pg->GetHdg() - M_PI/2.0);
  167. }
  168. int k;
  169. int ncount = parc->GetLength() * nfac ;
  170. double curv = parc->GetCurvature();
  171. double hdgstep;
  172. double hdg0 = parc->GetHdg();
  173. double hdgnow = parc->GetHdg();
  174. if(ncount > 0) hdgstep= (parc->GetLength()/R)/ncount;
  175. for(k=0;k<ncount;k++)
  176. {
  177. double x_draw,y_draw;
  178. if(curv > 0)
  179. {
  180. hdgnow = hdg0 + k*hdgstep;
  181. x_draw = x_center + R *cos(hdgnow - M_PI/2.0);
  182. y_draw = y_center + R * sin(hdgnow - M_PI/2.0);
  183. }
  184. else
  185. {
  186. hdgnow = hdg0 - k * hdgstep;
  187. x_draw = x_center + R *cos(hdgnow + M_PI/2.0);
  188. y_draw = y_center + R * sin(hdgnow + M_PI/2.0);
  189. }
  190. x_draw = x_draw - froad_xmin;
  191. y_draw = y_draw - froad_ymin;
  192. painter->drawPoint(x_draw * nfac ,y_draw * nfac *(-1));
  193. }
  194. }
  195. break;
  196. case 4:
  197. {
  198. ppp3 = (GeometryParamPoly3 * )pg;
  199. int ncount = ppp3->GetLength()* nfac;
  200. double sstep;
  201. if(ncount > 0)sstep = ppp3->GetLength()/ncount;
  202. else sstep = 10000.0;
  203. double s = 0;
  204. while(s < ppp3->GetLength())
  205. {
  206. double xtem,ytem;
  207. xtem = ppp3->GetuA() + ppp3->GetuB() * s + ppp3->GetuC() * s*s + ppp3->GetuD() * s*s*s;
  208. ytem = ppp3->GetvA() + ppp3->GetvB() * s + ppp3->GetvC() * s*s + ppp3->GetvD() * s*s*s;
  209. x = xtem*cos(ppp3->GetHdg()) - ytem * sin(ppp3->GetHdg()) + ppp3->GetX();
  210. y = xtem*sin(ppp3->GetHdg()) + ytem * cos(ppp3->GetHdg()) + ppp3->GetY();
  211. x = x - froad_xmin;
  212. y = y- froad_ymin;
  213. painter->drawPoint((int)(x*nfac),(int)(y*(-1.0*nfac)));
  214. s = s+ sstep;
  215. }
  216. }
  217. break;
  218. default:
  219. break;
  220. }
  221. // painter->drawPoint((int)(x*nfac),(int)(y*(-1.0*nfac)));
  222. }
  223. painter->setPen(Qt::green);
  224. painter->end();
  225. }
  226. void RoadEditDialog::paintEvent(QPaintEvent * painter)
  227. {
  228. scene->update();
  229. return;
  230. if(mpCurRoad != 0)
  231. {
  232. ExecPainter();
  233. scene->clear();
  234. scene->addPixmap(QPixmap::fromImage(*image));
  235. myview->setScene(scene);
  236. myview->show();
  237. }
  238. }
  239. void RoadEditDialog::on_comboBox_Road_activated(const QString &arg1)
  240. {
  241. }
  242. bool RoadEditDialog::IsDrawMark(double s)
  243. {
  244. const double dotdis = 10.0;
  245. const double dotlen = 5.0;
  246. double y = fmod(s,dotdis);
  247. if(y>dotlen)return true;
  248. else
  249. {
  250. return false;
  251. }
  252. }
  253. void RoadEditDialog::on_comboBox_Road_currentIndexChanged(int index)
  254. {
  255. Road * pRoad = mpxodr->GetRoad(index);
  256. if(pRoad == 0)
  257. {
  258. // QMessageBox::warning(this,"WARN","MainWindow::onClickCBRoadChange road is NULL");
  259. return;
  260. }
  261. mpCurRoad = pRoad;
  262. int i;
  263. int nsize = mvectorroadview.size();
  264. for(i=0;i<nsize;i++)
  265. {
  266. scene->removeItem(mvectorroadview.at(i));
  267. delete mvectorroadview.at(i);
  268. }
  269. mvectorroadview.clear();
  270. nsize = mvectorviewitem.size();
  271. for(i=0;i<nsize;i++)
  272. {
  273. scene->removeItem(mvectorviewitem.at(i));
  274. delete mvectorviewitem.at(i);
  275. }
  276. mvectorviewitem.clear();
  277. double froad_xmin,froad_ymin,froad_xmax,froad_ymax;
  278. ServiceXODRTool.GetRoadMaxMin(pRoad,froad_xmin,froad_ymin,froad_xmax,froad_ymax);
  279. // roadviewitem * prvw = new roadviewitem(pRoad);
  280. int nfac;
  281. int nkeep = 30;
  282. double fac_x,fac_y;
  283. fac_x = 100000;
  284. fac_y = 100000;
  285. if(froad_xmax > froad_xmin)
  286. {
  287. fac_x = (VIEW_WIDTH-nkeep*2)/(froad_xmax - froad_xmin);
  288. }
  289. if(froad_ymax > froad_ymin)
  290. {
  291. fac_y = (VIEW_HEIGHT - nkeep*2)/(froad_ymax - froad_ymin);
  292. }
  293. nfac = fac_x;
  294. if(fac_y < nfac)nfac = fac_y;
  295. mfViewMoveX = VIEW_WIDTH/2.0 ;
  296. mfViewMoveY = VIEW_HEIGHT/2.0;
  297. mfViewMoveX = 0 - froad_xmin - (froad_xmax - froad_xmin)/2.0;
  298. mfViewMoveY = 0 + froad_ymin + (froad_ymax-froad_ymin)/2.0;
  299. // prvw->setPos(mfViewMoveX,mfViewMoveY);
  300. // prvw->setPos((froad_xmax - froad_xmin)/2.0, (froad_ymax-froad_ymin)/2.0);
  301. // mvectorroadview.push_back(prvw);
  302. // prvw->setratio(1.0);
  303. // scene->addItem(prvw);
  304. mnSelGeo = -1;
  305. ui->lineEdit_roadlen->setText(QString::number(pRoad->GetRoadLength()));
  306. ui->comboBox_Geo->clear();
  307. nsize = pRoad->GetGeometryBlockCount();
  308. // int i;
  309. for(i=0;i<nsize;i++)
  310. {
  311. ui->comboBox_Geo->addItem(QString("Geo ")+QString::number(i));
  312. }
  313. RoadDigit xrd(mpCurRoad,0.1);
  314. std::vector<QGraphicsPathItem *> xvectorlanepath = xodrscenfunc::GetRoadLaneItem(&xrd);
  315. int j;
  316. int ncount = xvectorlanepath.size();
  317. for(j=0;j<ncount;j++)
  318. {
  319. QGraphicsPathItem * pitem = xvectorlanepath[j];
  320. pitem->setPos(mfViewMoveX,mfViewMoveY);
  321. scene->addItem(pitem);
  322. mvectorviewitem.push_back(pitem);
  323. }
  324. std::vector<QGraphicsPathItem *> xvectormarkpath = xodrscenfunc::GetRoadMarkItem(&xrd);
  325. ncount = xvectormarkpath.size();
  326. for(j=0;j<ncount;j++)
  327. {
  328. QGraphicsPathItem * pitem = xvectormarkpath[j];
  329. pitem->setPos(mfViewMoveX,mfViewMoveY);
  330. scene->addItem(pitem);
  331. mvectorviewitem.push_back(pitem);
  332. }
  333. update();
  334. }
  335. void RoadEditDialog::on_comboBox_Geo_currentIndexChanged(int index)
  336. {
  337. if(mpCurRoad == 0 )return;
  338. if(index<0)return;
  339. mnSelGeo = index;
  340. if(index>= mpCurRoad->GetGeometryBlockCount())return;
  341. GeometryBlock * pgb = mpCurRoad->GetGeometryBlock(index);
  342. RoadGeometry * pg = pgb->GetGeometryAt(0);
  343. ui->lineEdit_s->setText(QString::number(pg->GetS()));
  344. ui->lineEdit_x->setText(QString::number(pg->GetX()));
  345. ui->lineEdit_y->setText(QString::number(pg->GetY()));
  346. ui->lineEdit_hdg->setText(QString::number(pg->GetHdg()));
  347. ui->lineEdit_len->setText(QString::number(pg->GetLength()));
  348. if((pg->GetGeomType()>=0)&&(pg->GetGeomType()<5))
  349. {
  350. ui->comboBox_geotype->setCurrentIndex(pg->GetGeomType());
  351. }
  352. }
  353. void RoadEditDialog::on_pushButton_EditLane_clicked()
  354. {
  355. if(mpCurRoad == 0)
  356. {
  357. QMessageBox::warning(this,"Warning","Not Select Road");
  358. return;
  359. }
  360. DialogEditLane laned(mpCurRoad,this);
  361. int res = laned.exec();
  362. on_comboBox_Road_currentIndexChanged(ui->comboBox_Road->currentIndex());
  363. }
  364. void RoadEditDialog::on_pushButton_EditRoadMark_clicked()
  365. {
  366. if(mpCurRoad == 0)
  367. {
  368. QMessageBox::warning(this,"Warning","Not Select Road");
  369. return;
  370. }
  371. DialogEditRoadMark roadmarkd(mpCurRoad,this);
  372. roadmarkd.exec();
  373. on_comboBox_Road_currentIndexChanged(ui->comboBox_Road->currentIndex());
  374. }
  375. void RoadEditDialog::on_pushButton_LaneFromRTK_clicked()
  376. {
  377. if(mpCurRoad == 0)
  378. {
  379. QMessageBox::warning(this,"Warning","Not Select Road");
  380. return;
  381. }
  382. DialogLaneFromRTK lanertk(mpCurRoad,mpxodr,this);
  383. lanertk.exec();
  384. on_comboBox_Road_currentIndexChanged(ui->comboBox_Road->currentIndex());
  385. }
  386. void RoadEditDialog::on_pushButton_RoadSplit_clicked()
  387. {
  388. if(mpCurRoad == 0)
  389. {
  390. QMessageBox::warning(this,"Warning","Not Select Road");
  391. return;
  392. }
  393. DialogRoadSplit roadsplit(mpCurRoad,mpxodr,this);
  394. roadsplit.exec();
  395. unsigned int ncurindex = ui->comboBox_Road->currentIndex();
  396. ui->comboBox_Road->clear();
  397. int i;
  398. int nroadcount = mpxodr->GetRoadCount();
  399. for(i=0;i<nroadcount;i++)
  400. {
  401. const char * strname = mpxodr->GetRoad(i)->GetRoadId().data();
  402. ui->comboBox_Road->addItem(strname);
  403. }
  404. on_comboBox_Road_currentIndexChanged(ncurindex);
  405. }
  406. void RoadEditDialog::on_pushButton_RoadMerge_clicked()
  407. {
  408. DialogRoadMerge roadmerge(mpxodr,this);
  409. roadmerge.exec();
  410. unsigned int ncurindex = ui->comboBox_Road->currentIndex();
  411. ui->comboBox_Road->clear();
  412. int i;
  413. int nroadcount = mpxodr->GetRoadCount();
  414. for(i=0;i<nroadcount;i++)
  415. {
  416. const char * strname = mpxodr->GetRoad(i)->GetRoadId().data();
  417. ui->comboBox_Road->addItem(strname);
  418. }
  419. on_comboBox_Road_currentIndexChanged(ncurindex);
  420. }
  421. void RoadEditDialog::on_pushButton_MoveRoad_clicked()
  422. {
  423. if(mpCurRoad == 0)
  424. {
  425. QMessageBox::warning(this,"Warning","Not Select Road");
  426. return;
  427. }
  428. DialogRoadMove roadmove(mpxodr,mpCurRoad,this);
  429. roadmove.exec();
  430. unsigned int ncurindex = ui->comboBox_Road->currentIndex();
  431. ui->comboBox_Road->clear();
  432. int i;
  433. int nroadcount = mpxodr->GetRoadCount();
  434. for(i=0;i<nroadcount;i++)
  435. {
  436. const char * strname = mpxodr->GetRoad(i)->GetRoadId().data();
  437. ui->comboBox_Road->addItem(strname);
  438. }
  439. on_comboBox_Road_currentIndexChanged(ncurindex);
  440. }
  441. void RoadEditDialog::on_pushButton_RotateRoad_clicked()
  442. {
  443. if(mpCurRoad == 0)
  444. {
  445. QMessageBox::warning(this,"Warning","Not Select Road");
  446. return;
  447. }
  448. DialogRoadRotate roadrotate(mpxodr,mpCurRoad,this);
  449. roadrotate.exec();
  450. unsigned int ncurindex = ui->comboBox_Road->currentIndex();
  451. ui->comboBox_Road->clear();
  452. int i;
  453. int nroadcount = mpxodr->GetRoadCount();
  454. for(i=0;i<nroadcount;i++)
  455. {
  456. const char * strname = mpxodr->GetRoad(i)->GetRoadId().data();
  457. ui->comboBox_Road->addItem(strname);
  458. }
  459. on_comboBox_Road_currentIndexChanged(ncurindex);
  460. }
  461. void RoadEditDialog::on_pushButton_MirrorRoad_clicked()
  462. {
  463. if(mpCurRoad == 0)
  464. {
  465. QMessageBox::warning(this,"Warning","Not Select Road");
  466. return;
  467. }
  468. DialogRoadMirror roadmirror(mpxodr,mpCurRoad,this);
  469. roadmirror.exec();
  470. unsigned int ncurindex = ui->comboBox_Road->currentIndex();
  471. ui->comboBox_Road->clear();
  472. int i;
  473. int nroadcount = mpxodr->GetRoadCount();
  474. for(i=0;i<nroadcount;i++)
  475. {
  476. const char * strname = mpxodr->GetRoad(i)->GetRoadId().data();
  477. ui->comboBox_Road->addItem(strname);
  478. }
  479. on_comboBox_Road_currentIndexChanged(ncurindex);
  480. }
  481. void RoadEditDialog::on_pushButton_EditLaneOffset_clicked()
  482. {
  483. if(mpCurRoad == 0)
  484. {
  485. QMessageBox::warning(this,"Warning","Not Select Road");
  486. return;
  487. }
  488. DialogLaneOffset dlglaneoffset(mpCurRoad,this);
  489. dlglaneoffset.exec();
  490. }