roadeditdialog.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554
  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. void RoadEditDialog::on_comboBox_Road_currentIndexChanged(int index)
  243. {
  244. Road * pRoad = mpxodr->GetRoad(index);
  245. if(pRoad == 0)
  246. {
  247. // QMessageBox::warning(this,"WARN","MainWindow::onClickCBRoadChange road is NULL");
  248. return;
  249. }
  250. mpCurRoad = pRoad;
  251. int i;
  252. int nsize = mvectorroadview.size();
  253. for(i=0;i<nsize;i++)
  254. {
  255. scene->removeItem(mvectorroadview.at(i));
  256. delete mvectorroadview.at(i);
  257. }
  258. mvectorroadview.clear();
  259. double froad_xmin,froad_ymin,froad_xmax,froad_ymax;
  260. ServiceXODRTool.GetRoadMaxMin(pRoad,froad_xmin,froad_ymin,froad_xmax,froad_ymax);
  261. roadviewitem * prvw = new roadviewitem(pRoad);
  262. int nfac;
  263. int nkeep = 30;
  264. double fac_x,fac_y;
  265. fac_x = 100000;
  266. fac_y = 100000;
  267. if(froad_xmax > froad_xmin)
  268. {
  269. fac_x = (VIEW_WIDTH-nkeep*2)/(froad_xmax - froad_xmin);
  270. }
  271. if(froad_ymax > froad_ymin)
  272. {
  273. fac_y = (VIEW_HEIGHT - nkeep*2)/(froad_ymax - froad_ymin);
  274. }
  275. nfac = fac_x;
  276. if(fac_y < nfac)nfac = fac_y;
  277. mfViewMoveX = VIEW_WIDTH/2.0 ;
  278. mfViewMoveY = VIEW_HEIGHT/2.0;
  279. mfViewMoveX = 0 - froad_xmin - (froad_xmax - froad_xmin)/2.0;
  280. mfViewMoveY = 0 + froad_ymin + (froad_ymax-froad_ymin)/2.0;
  281. prvw->setPos(mfViewMoveX,mfViewMoveY);
  282. // prvw->setPos((froad_xmax - froad_xmin)/2.0, (froad_ymax-froad_ymin)/2.0);
  283. mvectorroadview.push_back(prvw);
  284. prvw->setratio(1.0);
  285. scene->addItem(prvw);
  286. mnSelGeo = -1;
  287. ui->lineEdit_roadlen->setText(QString::number(pRoad->GetRoadLength()));
  288. ui->comboBox_Geo->clear();
  289. nsize = pRoad->GetGeometryBlockCount();
  290. // int i;
  291. for(i=0;i<nsize;i++)
  292. {
  293. ui->comboBox_Geo->addItem(QString("Geo ")+QString::number(i));
  294. }
  295. update();
  296. }
  297. void RoadEditDialog::on_comboBox_Geo_currentIndexChanged(int index)
  298. {
  299. if(mpCurRoad == 0 )return;
  300. if(index<0)return;
  301. mnSelGeo = index;
  302. if(index>= mpCurRoad->GetGeometryBlockCount())return;
  303. GeometryBlock * pgb = mpCurRoad->GetGeometryBlock(index);
  304. RoadGeometry * pg = pgb->GetGeometryAt(0);
  305. ui->lineEdit_s->setText(QString::number(pg->GetS()));
  306. ui->lineEdit_x->setText(QString::number(pg->GetX()));
  307. ui->lineEdit_y->setText(QString::number(pg->GetY()));
  308. ui->lineEdit_hdg->setText(QString::number(pg->GetHdg()));
  309. ui->lineEdit_len->setText(QString::number(pg->GetLength()));
  310. if((pg->GetGeomType()>=0)&&(pg->GetGeomType()<5))
  311. {
  312. ui->comboBox_geotype->setCurrentIndex(pg->GetGeomType());
  313. }
  314. }
  315. void RoadEditDialog::on_pushButton_EditLane_clicked()
  316. {
  317. if(mpCurRoad == 0)
  318. {
  319. QMessageBox::warning(this,"Warning","Not Select Road");
  320. return;
  321. }
  322. DialogEditLane laned(mpCurRoad,this);
  323. int res = laned.exec();
  324. on_comboBox_Road_currentIndexChanged(ui->comboBox_Road->currentIndex());
  325. }
  326. void RoadEditDialog::on_pushButton_EditRoadMark_clicked()
  327. {
  328. if(mpCurRoad == 0)
  329. {
  330. QMessageBox::warning(this,"Warning","Not Select Road");
  331. return;
  332. }
  333. DialogEditRoadMark roadmarkd(mpCurRoad,this);
  334. roadmarkd.exec();
  335. on_comboBox_Road_currentIndexChanged(ui->comboBox_Road->currentIndex());
  336. }
  337. void RoadEditDialog::on_pushButton_LaneFromRTK_clicked()
  338. {
  339. if(mpCurRoad == 0)
  340. {
  341. QMessageBox::warning(this,"Warning","Not Select Road");
  342. return;
  343. }
  344. DialogLaneFromRTK lanertk(mpCurRoad,mpxodr,this);
  345. lanertk.exec();
  346. on_comboBox_Road_currentIndexChanged(ui->comboBox_Road->currentIndex());
  347. }
  348. void RoadEditDialog::on_pushButton_RoadSplit_clicked()
  349. {
  350. if(mpCurRoad == 0)
  351. {
  352. QMessageBox::warning(this,"Warning","Not Select Road");
  353. return;
  354. }
  355. DialogRoadSplit roadsplit(mpCurRoad,mpxodr,this);
  356. roadsplit.exec();
  357. unsigned int ncurindex = ui->comboBox_Road->currentIndex();
  358. ui->comboBox_Road->clear();
  359. int i;
  360. int nroadcount = mpxodr->GetRoadCount();
  361. for(i=0;i<nroadcount;i++)
  362. {
  363. const char * strname = mpxodr->GetRoad(i)->GetRoadId().data();
  364. ui->comboBox_Road->addItem(strname);
  365. }
  366. on_comboBox_Road_currentIndexChanged(ncurindex);
  367. }
  368. void RoadEditDialog::on_pushButton_RoadMerge_clicked()
  369. {
  370. DialogRoadMerge roadmerge(mpxodr,this);
  371. roadmerge.exec();
  372. unsigned int ncurindex = ui->comboBox_Road->currentIndex();
  373. ui->comboBox_Road->clear();
  374. int i;
  375. int nroadcount = mpxodr->GetRoadCount();
  376. for(i=0;i<nroadcount;i++)
  377. {
  378. const char * strname = mpxodr->GetRoad(i)->GetRoadId().data();
  379. ui->comboBox_Road->addItem(strname);
  380. }
  381. on_comboBox_Road_currentIndexChanged(ncurindex);
  382. }
  383. void RoadEditDialog::on_pushButton_MoveRoad_clicked()
  384. {
  385. if(mpCurRoad == 0)
  386. {
  387. QMessageBox::warning(this,"Warning","Not Select Road");
  388. return;
  389. }
  390. DialogRoadMove roadmove(mpxodr,mpCurRoad,this);
  391. roadmove.exec();
  392. unsigned int ncurindex = ui->comboBox_Road->currentIndex();
  393. ui->comboBox_Road->clear();
  394. int i;
  395. int nroadcount = mpxodr->GetRoadCount();
  396. for(i=0;i<nroadcount;i++)
  397. {
  398. const char * strname = mpxodr->GetRoad(i)->GetRoadId().data();
  399. ui->comboBox_Road->addItem(strname);
  400. }
  401. on_comboBox_Road_currentIndexChanged(ncurindex);
  402. }
  403. void RoadEditDialog::on_pushButton_RotateRoad_clicked()
  404. {
  405. if(mpCurRoad == 0)
  406. {
  407. QMessageBox::warning(this,"Warning","Not Select Road");
  408. return;
  409. }
  410. DialogRoadRotate roadrotate(mpxodr,mpCurRoad,this);
  411. roadrotate.exec();
  412. unsigned int ncurindex = ui->comboBox_Road->currentIndex();
  413. ui->comboBox_Road->clear();
  414. int i;
  415. int nroadcount = mpxodr->GetRoadCount();
  416. for(i=0;i<nroadcount;i++)
  417. {
  418. const char * strname = mpxodr->GetRoad(i)->GetRoadId().data();
  419. ui->comboBox_Road->addItem(strname);
  420. }
  421. on_comboBox_Road_currentIndexChanged(ncurindex);
  422. }
  423. void RoadEditDialog::on_pushButton_MirrorRoad_clicked()
  424. {
  425. if(mpCurRoad == 0)
  426. {
  427. QMessageBox::warning(this,"Warning","Not Select Road");
  428. return;
  429. }
  430. DialogRoadMirror roadmirror(mpxodr,mpCurRoad,this);
  431. roadmirror.exec();
  432. unsigned int ncurindex = ui->comboBox_Road->currentIndex();
  433. ui->comboBox_Road->clear();
  434. int i;
  435. int nroadcount = mpxodr->GetRoadCount();
  436. for(i=0;i<nroadcount;i++)
  437. {
  438. const char * strname = mpxodr->GetRoad(i)->GetRoadId().data();
  439. ui->comboBox_Road->addItem(strname);
  440. }
  441. on_comboBox_Road_currentIndexChanged(ncurindex);
  442. }