mainwindow.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <iostream>
  4. #include <QMessageBox>
  5. #include <math.h>
  6. #include "google/protobuf/io/zero_copy_stream_impl.h"
  7. #include "google/protobuf/text_format.h"
  8. #define VIEW_WIDTH 6000
  9. #define VIEW_HEIGHT 6000
  10. MainWindow::MainWindow(QWidget *parent) :
  11. QMainWindow(parent),
  12. ui(new Ui::MainWindow)
  13. {
  14. ui->setupUi(this);
  15. setWindowTitle(tr("SIASUN Remote Control"));
  16. mmyview = new MyView(ui->Map);
  17. mmyview->setObjectName(QStringLiteral("graphicsView"));
  18. mmyview->setGeometry(QRect(0, 0, 800, 530));
  19. mmyview->setCacheMode(mmyview->CacheBackground);
  20. mpscene = new QGraphicsScene;
  21. mpscene = new QGraphicsScene(0,0,VIEW_WIDTH,VIEW_HEIGHT);
  22. mpscene->setBackgroundBrush(Qt::white);
  23. mmyview->setScene(mpscene);
  24. mmyview->centerOn(VIEW_WIDTH/2,VIEW_HEIGHT/2);
  25. ui->tabWidget->setCurrentIndex(0);
  26. mpdkp = new DialogKickPoint(&msissunmap, this);
  27. connect(mmyview,SIGNAL(dbclickxy(double,double)),this,SLOT(ondbclick(double,double)));
  28. }
  29. MainWindow::~MainWindow()
  30. {
  31. delete ui;
  32. }
  33. void MainWindow::paintEvent(QPaintEvent * event)
  34. {
  35. (void)event;
  36. static double foldratio = 1.0;
  37. double ratio = mmyview->getbeishu();
  38. if(fabs(ratio - foldratio)>0.000001)
  39. {
  40. foldratio = ratio;
  41. double fscale = 1.0/ratio;
  42. unsigned int i;
  43. for(i=0;i<mvectorPickPointItem.size();i++)
  44. {
  45. mvectorPickPointItem[i]->setScale(fscale);
  46. }
  47. for(i=0;i<mvectorMapPointItem.size();i++)
  48. {
  49. mvectorMapPointItem[i]->setScale(fscale);
  50. }
  51. for(i=0;i<(int)mvectorwidthline.size();i++)
  52. {
  53. mvectorwidthline[i]->ChangeWidth(mfLineWidth*fscale);
  54. }
  55. if(mpSelectPointItem != NULL)
  56. {
  57. mpSelectPointItem->setScale(fscale);
  58. }
  59. }
  60. mmyview->setScene(mpscene);
  61. }
  62. void MainWindow::resizeEvent(QResizeEvent *event)
  63. {
  64. (void)event;
  65. QSize sizemain = ui->centralWidget->size();
  66. ui->tabWidget->setGeometry(0,0,sizemain.width(),sizemain.height());
  67. QSize sizemap = ui->Map->size();
  68. mmyview->setGeometry(0,0,sizemap.width(),sizemap.height());
  69. }
  70. void MainWindow::on_actionInsert_Kick_Point_triggered()
  71. {
  72. mpdkp->setModal(false);
  73. mpdkp->show();
  74. }
  75. void MainWindow::on_actionSave_triggered()
  76. {
  77. QString strfilepath = "/home/yuchuli/testsia.txt";
  78. using google::protobuf::TextFormat;
  79. using google::protobuf::io::FileOutputStream;
  80. using google::protobuf::io::ZeroCopyOutputStream;
  81. std::string strout;
  82. ZeroCopyOutputStream *output = new google::protobuf::io::StringOutputStream(&strout);//new FileOutputStream(file_descriptor);
  83. bool success = TextFormat::Print(msissunmap, output);
  84. if(success)
  85. {
  86. QFile xFile;
  87. xFile.setFileName(strfilepath);
  88. if(xFile.open(QIODevice::ReadWrite))
  89. {
  90. xFile.write(strout.data(),strout.size());
  91. xFile.close();
  92. }
  93. // std::cout<<strout<<std::endl;
  94. // qDebug(strout.data());
  95. }
  96. delete output;
  97. }
  98. void MainWindow::on_actionLoad_triggered()
  99. {
  100. QString strfilepath = "/home/yuchuli/testsia.txt";
  101. QFile xFile;
  102. xFile.setFileName(strfilepath);
  103. QByteArray ba;
  104. if(xFile.open(QIODevice::ReadOnly))
  105. {
  106. ba = xFile.readAll();
  107. xFile.close();
  108. }
  109. else
  110. {
  111. QMessageBox::warning(this,tr("Warning"),tr("Open File Fail."),QMessageBox::YesAll);
  112. return;
  113. }
  114. using google::protobuf::TextFormat;
  115. using google::protobuf::io::FileInputStream;
  116. using google::protobuf::io::ZeroCopyInputStream;
  117. std::string strout;
  118. ZeroCopyInputStream *input = new google::protobuf::io::ArrayInputStream(ba.data(),ba.size());//new FileOutputStream(file_descriptor);
  119. iv::siasun::map xsiasun;
  120. bool success = TextFormat::Parse(input,&xsiasun);
  121. if(success)
  122. {
  123. msissunmap.CopyFrom(xsiasun);
  124. }
  125. else
  126. {
  127. QMessageBox::warning(this,tr("Warning"),tr("Load map fail."),QMessageBox::YesAll);
  128. delete input;
  129. return;
  130. }
  131. delete input;
  132. if(msissunmap.mutable_mkickarray()->mkick_size() == 0)
  133. {
  134. return;
  135. }
  136. iv::siasun::kickpointarray * pkickarray = msissunmap.mutable_mkickarray();
  137. int i;
  138. mlon0 = pkickarray->mutable_mkick(0)->mflon();
  139. mlat0 = pkickarray->mutable_mkick(0)->mflat();
  140. for(i=0;i<pkickarray->mkick_size();i++)
  141. {
  142. iv::siasun::kickpoint * ppoint = pkickarray->mutable_mkick(i);
  143. double x0,y0;
  144. double x,y;
  145. GaussProjCal(ppoint->mflon(),ppoint->mflat(),&x,&y);
  146. GaussProjCal(mlon0,mlat0,&x0,&y0);
  147. x = x - x0;
  148. y = y - y0;
  149. double ratio = mmyview->getbeishu();
  150. double fscale = 1.0/ratio;
  151. QGraphicsEllipseItem * pmainitem;
  152. pmainitem = new QGraphicsEllipseItem(0-mfPointSize/2.0,0*(-1)-mfPointSize/2.0,mfPointSize,mfPointSize);
  153. pmainitem->setBrush(Qt::blue);
  154. pmainitem->setPen(Qt::NoPen);
  155. pmainitem->setPos(VIEW_WIDTH/2 + x,VIEW_HEIGHT/2 -y);
  156. pmainitem->setScale(fscale);
  157. mpscene->addItem(pmainitem);
  158. mvectorPickPointItem.push_back(pmainitem);
  159. }
  160. }
  161. void MainWindow::on_actionInsert_Map_Point_triggered()
  162. {
  163. if(mbInsertMapPoint == false)
  164. {
  165. ui->actionInsert_Map_Point->setText(tr("Stop Insert Map Point"));
  166. mbInsertMapPoint = true;
  167. }
  168. else
  169. {
  170. ui->actionInsert_Map_Point->setText(tr("Start Insert Map Point"));
  171. mbInsertMapPoint = false;
  172. }
  173. }
  174. void MainWindow::ondbclick(double x,double y)
  175. {
  176. if(mbInsertMapPoint)
  177. {
  178. double fx,fy;
  179. fx = x - VIEW_WIDTH/2;
  180. fy = VIEW_HEIGHT/2 - y;
  181. double x0,y0;
  182. GaussProjCal(mlon0,mlat0,&x0,&y0);
  183. double flonx,flaty;
  184. flonx = fx + x0;
  185. flaty = fy + y0;
  186. double flon,flat;
  187. GaussProjInvCal(flonx,flaty,&flon,&flat);
  188. iv::siasun::waypointarray * pwayarray = msissunmap.mutable_mwayarray();
  189. if(pwayarray == NULL)
  190. {
  191. std::cout<<"way array is NULL."<<std::endl;
  192. iv::siasun::waypointarray * pnew = new iv::siasun::waypointarray;
  193. msissunmap.set_allocated_mwayarray(pnew);
  194. pwayarray = msissunmap.mutable_mwayarray();
  195. }
  196. iv::siasun::waypoint * pwaypoint = pwayarray->add_mwaypoint();
  197. pwaypoint->set_mflat(flat);
  198. pwaypoint->set_mflon(flon);
  199. double ratio = mmyview->getbeishu();
  200. double fscale = 1.0/ratio;
  201. QGraphicsEllipseItem * pmainitem;
  202. pmainitem = new QGraphicsEllipseItem(0-mfPointSize/2.0,0*(-1)-mfPointSize/2.0,mfPointSize,mfPointSize);
  203. pmainitem->setBrush(Qt::green);
  204. pmainitem->setPen(Qt::NoPen);
  205. pmainitem->setPos(x,y);
  206. pmainitem->setScale(fscale);
  207. mpscene->addItem(pmainitem);
  208. mvectorPickPointItem.push_back(pmainitem);
  209. }
  210. else
  211. {
  212. if(mnSelectMode == 1)
  213. {
  214. double fx,fy;
  215. fx = x - VIEW_WIDTH/2;
  216. fy = VIEW_HEIGHT/2 - y;
  217. double x0,y0;
  218. GaussProjCal(mlon0,mlat0,&x0,&y0);
  219. double flonx,flaty;
  220. flonx = fx + x0;
  221. flaty = fy + y0;
  222. double fdismin = 1000000.0;
  223. int index = -1;
  224. int i;
  225. double xv,yv;
  226. iv::siasun::kickpointarray * parray = msissunmap.mutable_mkickarray();
  227. for(i=0;i<parray->mkick_size();i++)
  228. {
  229. iv::siasun::kickpoint * p = parray->mutable_mkick(i);
  230. double p1x,p1y;
  231. GaussProjCal(p->mflon(),p->mflat(),&p1x,&p1y);
  232. double fdis = sqrt(pow(p1x-flonx,2)+pow(p1y-flaty,2));
  233. if(fdis<fdismin)
  234. {
  235. fdismin = fdis;
  236. index = i;
  237. xv = p1x;
  238. yv = p1y;
  239. }
  240. std::cout<<" fdis: "<<fdismin<<std::endl;
  241. }
  242. if(fdismin < mfNearDisLimit)
  243. {
  244. double ratio = mmyview->getbeishu();
  245. double fscale = 1.0/ratio;
  246. if(mpSelectPointItem == NULL)
  247. {
  248. QGraphicsEllipseItem * pmainitem;
  249. pmainitem = new QGraphicsEllipseItem(0-mfPointSize*2.0/2.0,0*(-1)-mfPointSize*2.0/2.0,mfPointSize*2.0,mfPointSize*2.0);
  250. pmainitem->setBrush(Qt::red);
  251. pmainitem->setPen(Qt::NoPen);
  252. pmainitem->setPos(VIEW_WIDTH/2 + xv-x0,VIEW_HEIGHT/2 -(yv-y0));
  253. pmainitem->setScale(fscale);
  254. mpscene->addItem(pmainitem);
  255. mpSelectPointItem = pmainitem;
  256. }
  257. else
  258. {
  259. mpSelectPointItem->setPos(VIEW_WIDTH/2 + xv-x0,VIEW_HEIGHT/2 -(yv-y0));
  260. mpSelectPointItem->setScale(fscale);
  261. }
  262. }
  263. }
  264. }
  265. }
  266. void MainWindow::on_actionCreate_Map_triggered()
  267. {
  268. iv::siasun::waypointarray * pwayarray = msissunmap.mutable_mwayarray();
  269. if(pwayarray == NULL)
  270. {
  271. QMessageBox::warning(this,tr("Warning"),tr("No Way Point."),QMessageBox::YesAll);
  272. return;
  273. }
  274. if(pwayarray->mwaypoint_size()<2)
  275. {
  276. QMessageBox::warning(this,tr("Warning"),tr("At Least 2 point."),QMessageBox::YesAll);
  277. return;
  278. }
  279. mvectorlinemap.clear();
  280. int i;
  281. for(i=0;i<(int)mvectorwidthline.size();i++)
  282. {
  283. mpscene->removeItem(mvectorwidthline[i]->GetWidthLine());
  284. delete mvectorwidthline[i];
  285. }
  286. mvectorwidthline.clear();
  287. sissunmap xsissunmap;
  288. mvectorlinemap = xsissunmap.GetMapLine(&msissunmap);
  289. double x0,y0;
  290. GaussProjCal(mlon0,mlat0,&x0,&y0);
  291. for(i=0;i<(int)mvectorlinemap.size();i++)
  292. {
  293. widthline *pline = new widthline(mvectorlinemap[i].mfx1-x0,mvectorlinemap[i].mfy1-y0,
  294. mvectorlinemap[i].mfx2-x0,mvectorlinemap[i].mfy2-y0,mfLineWidth,mColorBrush_mapline,VIEW_WIDTH/2,VIEW_HEIGHT/2);
  295. mpscene->addItem(pline->GetWidthLine());
  296. double ratio = mmyview->getbeishu();
  297. double fscale = 1.0/ratio;
  298. pline->ChangeWidth(fscale*mfLineWidth);
  299. mvectorwidthline.push_back(pline);
  300. }
  301. }
  302. void MainWindow::on_actionSelect_None_triggered()
  303. {
  304. mnSelectMode = 0;
  305. if(mpSelectPointItem != NULL)
  306. {
  307. mpscene->removeItem(mpSelectPointItem);
  308. mpSelectPointItem = NULL;
  309. }
  310. }
  311. void MainWindow::on_actionSelect_Kick_triggered()
  312. {
  313. mnSelectMode = 1;
  314. }
  315. void MainWindow::on_actionSelect_Point_triggered()
  316. {
  317. mnSelectMode = 2;
  318. }