mainwindow.cpp 141 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <iomanip>//不要忘记包含此头文件
  4. #include <QScrollBar>
  5. #include "gpsimu.pb.h"
  6. #include "gnss_coordinate_convert.h"
  7. #define VIEW_WIDTH 5000
  8. #define VIEW_HEIGHT 5000
  9. double glon0 = 117.0866293;
  10. double glat0 = 39.1364713;
  11. //double glon0 = 117;
  12. //double glat0 = 39;
  13. double ghdg0 = 360;
  14. MainWindow::MainWindow(QWidget *parent) :
  15. QMainWindow(parent),
  16. ui(new Ui::MainWindow)
  17. {
  18. ui->setupUi(this);
  19. mnfac = 1;
  20. // int aaa[10000000];
  21. mnMoveX = 0;//VIEW_WIDTH/2; //VIEW_WIDTH/2;
  22. mnMoveY = 0;//VIEW_HEIGHT/2;//VIEW_HEIGHT/2;
  23. mnDefmnfac = mnfac;
  24. mnDefMoveX = mnMoveX;
  25. mnDefMoveY = mnMoveY;
  26. QGraphicsScene * pscene = new QGraphicsScene(-VIEW_WIDTH/2, -VIEW_HEIGHT/2, VIEW_WIDTH, VIEW_HEIGHT);
  27. // QGraphicsScene * pscene = new QGraphicsScene(0, 0, VIEW_WIDTH, VIEW_HEIGHT);
  28. myview = new MyView(this);
  29. myview->setObjectName(QStringLiteral("graphicsView"));
  30. myview->setGeometry(QRect(30, 30, 600, 600));
  31. connect(myview,SIGNAL(dbclickxy(double,double)),this,SLOT(onClickXY(double,double)));
  32. connect(myview,SIGNAL(beishuchange(double)),this,SLOT(onViewBeishuchange(double)));
  33. image = new QImage(VIEW_WIDTH, VIEW_HEIGHT, QImage::Format_RGB32);//画布的初始化大小设为300*300,使用32位颜色
  34. myview->setCacheMode(myview->CacheBackground);
  35. painter = new QPainter(image);
  36. painter->end();
  37. scene = new QGraphicsScene;
  38. myview->setScene(pscene);
  39. mpscene = pscene;
  40. pscene->setBackgroundBrush(Qt::darkGreen);
  41. // painter->begin(image);
  42. QTabWidget * p = new QTabWidget(ui->centralWidget);
  43. p->setGeometry(30,30,300,300);
  44. mnFontHeight = ui->centralWidget->fontMetrics().height();
  45. CreateTab1View(p);
  46. mpLabel_Status = new QLabel(this);
  47. ui->statusBar->addPermanentWidget(mpLabel_Status);
  48. mTabMain = p;
  49. QTimer * timer = new QTimer();
  50. connect(timer,SIGNAL(timeout()),this,SLOT(onTimer()));
  51. timer->start(1000);
  52. setWindowTitle("Create Map From Lane Info");
  53. }
  54. MainWindow::~MainWindow()
  55. {
  56. delete ui;
  57. }
  58. void MainWindow::resizeEvent(QResizeEvent *event)
  59. {
  60. qDebug("resize");
  61. QSize sizemain = ui->centralWidget->size();
  62. qDebug("size x = %d y=%d",sizemain.width(),sizemain.height());
  63. AdjustWPos(sizemain);
  64. }
  65. void MainWindow::AdjustWPos(QSize sizemain)
  66. {
  67. myview->setGeometry(0,50,sizemain.width()-mnFontHeight * 22 - 50,sizemain.height());
  68. mTabMain->setGeometry(sizemain.width()-mnFontHeight * 22,30,mnFontHeight * 22,sizemain.height()-50);
  69. // mgplidar->setGeometry(sizemain.width()-280,30,260,200);
  70. }
  71. void MainWindow::ExecPainter()
  72. {
  73. return;
  74. QTime x;
  75. x.start();
  76. // qDebug("painter.");
  77. painter->begin(image);
  78. qDebug("time is %d",x.elapsed());
  79. image->fill(QColor(255, 255, 255));//对画布进行填充
  80. // std::vector<iv::GPSData> navigation_data = brain->navigation_data;
  81. painter->setRenderHint(QPainter::Antialiasing, true);//设置反锯齿模式,好看一点
  82. painter->translate(mnMoveX,mnMoveY);
  83. painter->setPen(Qt::black);
  84. painter->drawLine(VIEW_WIDTH/(-2),0,VIEW_WIDTH/2,0);
  85. painter->drawLine(0,VIEW_HEIGHT/(-2),0,VIEW_HEIGHT/2);
  86. int i;
  87. // int nfac = 5;;
  88. painter->setPen(Qt::blue);
  89. int nfac = mnfac;
  90. if(mbClick)
  91. {
  92. painter->setPen(Qt::red);
  93. painter->drawEllipse(QPoint(mClickX ,mClickY),mnMarkSize,mnMarkSize);
  94. painter->setPen(Qt::black);
  95. }
  96. if(mbSetObj)
  97. {
  98. painter->setPen(Qt::green);
  99. painter->drawRect(mfObjX*mnfac-mnMarkSize,mfObjY*mnfac*(-1)-mnMarkSize,mnMarkSize*2,mnMarkSize*2);
  100. painter->setPen(Qt::black);
  101. }
  102. painter->setPen(Qt::green);
  103. double x0,y0;
  104. GaussProjCal(glon0,glat0,&x0,&y0);
  105. painter->setPen(Qt::blue);
  106. // int nfac = mnfac;
  107. int selid = mpCBRoad->currentText().toInt();
  108. for(i=0;i<mxodr.GetRoadCount();i++)
  109. {
  110. // continue;
  111. int j;
  112. Road * pRoad = mxodr.GetRoad(i);
  113. painter->setPen(Qt::blue);
  114. if(selid == atoi(pRoad->GetRoadId().data()))
  115. {
  116. painter->setPen(Qt::red);
  117. }
  118. if(mxodr.GetRoad(i)->GetGeometryBlockCount()>0)
  119. {
  120. GeometryBlock * pgeob = pRoad->GetGeometryBlock(0);
  121. double x,y;
  122. RoadGeometry * pg;
  123. pg = pgeob->GetGeometryAt(0);
  124. x = pg->GetX();
  125. y = pg->GetY();
  126. double endx,endy,endhdg;
  127. GetEndPoint(pRoad,endx,endy,endhdg);
  128. x = (x+endx)/2;
  129. y = (y+endy)/2;
  130. painter->drawText(x*mnfac,y*mnfac*(-1),mxodr.GetRoad(i)->GetRoadId().data());
  131. }
  132. for(j=0;j<mxodr.GetRoad(i)->GetGeometryBlockCount();j++)
  133. {
  134. GeometryBlock * pgeob = pRoad->GetGeometryBlock(j);
  135. double x,y;
  136. double x_center,y_center;
  137. double R;
  138. RoadGeometry * pg;
  139. GeometryArc * parc;
  140. GeometryParamPoly3 * ppp3;
  141. GeometrySpiral *pSpiral;
  142. double rel_x,rel_y,rel_hdg;
  143. pg = pgeob->GetGeometryAt(0);
  144. x = pg->GetX();
  145. y = pg->GetY();
  146. if(j== 0)
  147. {
  148. if(selid == atoi(pRoad->GetRoadId().data()))
  149. {
  150. painter->setPen(Qt::green);
  151. painter->drawEllipse(x*mnfac-5,y*mnfac*(-1)-5,10,10);
  152. painter->setPen(Qt::red);
  153. }
  154. }
  155. switch (pg->GetGeomType()) {
  156. case 0:
  157. painter->drawLine(QPoint(x*mnfac,y*mnfac*(-1)),
  158. QPoint((x + pg->GetLength() * cos(pg->GetHdg()))*mnfac,(y + pg->GetLength() * sin(pg->GetHdg()))*mnfac*(-1)));
  159. break;
  160. case 1:
  161. pSpiral = (GeometrySpiral * )pg;
  162. {
  163. int ncount = pSpiral->GetLength() * mnfac;
  164. double sstep = pSpiral->GetLength()/((double)ncount);
  165. int k;
  166. double x0,y0,hdg0,s0;
  167. x0 = pSpiral->GetX();
  168. y0 = pSpiral->GetY();
  169. s0 = pSpiral->GetS();
  170. hdg0 = pSpiral->GetHdg() ;
  171. painter->setPen(Qt::red);
  172. for(k=0;k<ncount;k++)
  173. {
  174. pSpiral->GetCoords(s0+sstep*k,rel_x,rel_y,rel_hdg);
  175. x = rel_x;
  176. y = rel_y;
  177. painter->drawPoint((int)(x*mnfac),(int)(y*(-1.0*mnfac)));
  178. }
  179. painter->setPen(Qt::blue);
  180. }
  181. // qDebug("spi");
  182. break;
  183. case 2:
  184. {
  185. parc = (GeometryArc *)pg;
  186. R = abs(1.0/parc->GetCurvature());
  187. if(parc->GetCurvature() > 0)
  188. {
  189. x_center = pg->GetX() + R *cos(pg->GetHdg() + M_PI/2.0);
  190. y_center = pg->GetY() + R * sin(pg->GetHdg() + M_PI/2.0);
  191. }
  192. else
  193. {
  194. x_center = pg->GetX() + R *cos(pg->GetHdg() -M_PI/2.0);
  195. y_center = pg->GetY() + R * sin(pg->GetHdg() - M_PI/2.0);
  196. }
  197. int k;
  198. int ncount = parc->GetLength() * mnfac ;
  199. double curv = parc->GetCurvature();
  200. double hdgstep;
  201. double hdg0 = parc->GetHdg();
  202. double hdgnow = parc->GetHdg();
  203. if(ncount > 0) hdgstep= (parc->GetLength()/R)/ncount;
  204. for(k=0;k<ncount;k++)
  205. {
  206. double x_draw,y_draw;
  207. if(curv > 0)
  208. {
  209. hdgnow = hdg0 + k*hdgstep;
  210. x_draw = x_center + R *cos(hdgnow - M_PI/2.0);
  211. y_draw = y_center + R * sin(hdgnow - M_PI/2.0);
  212. }
  213. else
  214. {
  215. hdgnow = hdg0 - k * hdgstep;
  216. x_draw = x_center + R *cos(hdgnow + M_PI/2.0);
  217. y_draw = y_center + R * sin(hdgnow + M_PI/2.0);
  218. }
  219. painter->drawPoint(x_draw * mnfac ,y_draw * mnfac *(-1));
  220. }
  221. }
  222. break;
  223. case 4:
  224. {
  225. ppp3 = (GeometryParamPoly3 * )pg;
  226. int ncount = ppp3->GetLength()* mnfac;
  227. double sstep;
  228. if(ncount > 0)sstep = ppp3->GetLength()/ncount;
  229. else sstep = 10000.0;
  230. double s = 0;
  231. while(s < ppp3->GetLength())
  232. {
  233. double xtem,ytem;
  234. xtem = ppp3->GetuA() + ppp3->GetuB() * s + ppp3->GetuC() * s*s + ppp3->GetuD() * s*s*s;
  235. ytem = ppp3->GetvA() + ppp3->GetvB() * s + ppp3->GetvC() * s*s + ppp3->GetvD() * s*s*s;
  236. x = xtem*cos(ppp3->GetHdg()) - ytem * sin(ppp3->GetHdg()) + ppp3->GetX();
  237. y = xtem*sin(ppp3->GetHdg()) + ytem * cos(ppp3->GetHdg()) + ppp3->GetY();
  238. painter->drawPoint((int)(x*mnfac),(int)(y*(-1.0*mnfac)));
  239. s = s+ sstep;
  240. }
  241. }
  242. break;
  243. default:
  244. break;
  245. }
  246. // painter->drawPoint((int)(x*mnfac),(int)(y*(-1.0*mnfac)));
  247. }
  248. }
  249. for(i=0;i<mvectorlp.size();i++)
  250. {
  251. if(!mbShowLane)continue;
  252. if(i == mnMarkLane)
  253. {
  254. painter->setPen(Qt::red);
  255. }
  256. else
  257. {
  258. painter->setPen(Qt::blue);
  259. }
  260. int npsize = mvectorlp[i].mvectorlpleft.size();
  261. int j;
  262. for(j=0;j<npsize;j++)
  263. {
  264. double x,y;
  265. double lon,lat;
  266. lon = mvectorlp[i].mvectorlpleft[j].mfLon;
  267. lat = mvectorlp[i].mvectorlpleft[j].mfLat;
  268. GaussProjCal(lon,lat,&x,&y);
  269. x = x-x0;
  270. y= y-y0;
  271. painter->drawPoint((int)(x*mnfac),(int)(y*(-1.0*mnfac)));
  272. lon = mvectorlp[i].mvectorlpright[j].mfLon;
  273. lat = mvectorlp[i].mvectorlpright[j].mfLat;
  274. GaussProjCal(lon,lat,&x,&y);
  275. x = x-x0;
  276. y= y-y0;
  277. painter->drawPoint((int)(x*mnfac),(int)(y*(-1.0*mnfac)));
  278. }
  279. }
  280. painter->setPen(Qt::green);
  281. painter->end();
  282. }
  283. //刷新
  284. void MainWindow::paintEvent(QPaintEvent *)
  285. {
  286. mpscene->update();
  287. return;
  288. if(mbRefresh)
  289. {
  290. ExecPainter();
  291. // qDebug(" time is %d ",x.elapsed());
  292. mbRefresh = false;
  293. }
  294. scene->clear();
  295. scene->addPixmap(QPixmap::fromImage(*image));
  296. myview->setScene(scene);
  297. myview->show();
  298. if(mbInit == false)
  299. {
  300. myview->horizontalScrollBar()->setValue((mnMoveX - 800));
  301. myview->verticalScrollBar()->setValue((mnMoveY - 500));
  302. mbInit = true;
  303. }
  304. // qDebug(" time 2 is %d ",x.elapsed());
  305. }
  306. void MainWindow::onTimer()
  307. {
  308. }
  309. void MainWindow::CreateTab1View(QTabWidget * p)
  310. {
  311. QGroupBox * pGroup = new QGroupBox();
  312. pGroup->setGeometry(0,0,mnFontHeight * 21,mnFontHeight * 110);
  313. QLabel * pLabel;
  314. QLineEdit * pLE;
  315. QPushButton * pPB;
  316. QSlider * pSlider;
  317. QComboBox * pCB;
  318. int nXPos = 10;
  319. int nYPos = 30;
  320. int i;
  321. int nSpace = mnFontHeight * 65/10;
  322. int nLEWidth = mnFontHeight * 6;
  323. int nLEHeight = mnFontHeight * 3/2;
  324. pLabel = new QLabel(pGroup);
  325. pLabel->setText("Lat0");
  326. pLabel->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  327. nXPos = nXPos + nSpace;
  328. pLabel = new QLabel(pGroup);
  329. pLabel->setText("Lon0");
  330. pLabel->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  331. nXPos = nXPos + nSpace;
  332. pLabel = new QLabel(pGroup);
  333. pLabel->setText("Head0");
  334. pLabel->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  335. nXPos = nXPos + nSpace;
  336. nXPos = 10;
  337. nYPos = nYPos + mnFontHeight * 2;
  338. pLE = new QLineEdit(pGroup);
  339. pLE->setText(QString::number(glat0,'f',7));
  340. pLE->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  341. mpLELat0 = pLE;
  342. nXPos = nXPos + nSpace;
  343. pLE = new QLineEdit(pGroup);
  344. pLE->setText(QString::number(glon0,'f',7));
  345. pLE->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  346. mpLELon0 = pLE;
  347. nXPos = nXPos + nSpace;
  348. pLE = new QLineEdit(pGroup);
  349. pLE->setText(QString::number(ghdg0,'f',3));
  350. pLE->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  351. mpLEHead0 = pLE;
  352. nXPos = nXPos + nSpace;
  353. nXPos = 10;
  354. nYPos = nYPos + mnFontHeight * 4;
  355. pPB = new QPushButton(pGroup);
  356. pPB->setText("Restore Default View");
  357. pPB->setGeometry(nXPos,nYPos,mnFontHeight*10,nLEHeight);
  358. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickDefView()));
  359. nXPos = nXPos + mnFontHeight * 11;
  360. pPB = new QPushButton(pGroup);
  361. pPB->setText("Zoom One");
  362. pPB->setGeometry(nXPos,nYPos,mnFontHeight*6,nLEHeight);
  363. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickZoomOne()));
  364. /*
  365. nXPos = 10;
  366. nYPos = nYPos + mnFontHeight * 4;
  367. pLabel = new QLabel(pGroup);
  368. pLabel->setText("Scale");
  369. pLabel->setGeometry(nXPos,nYPos,mnFontHeight*3,nLEHeight);
  370. nXPos = nXPos + mnFontHeight * 4;
  371. pSlider = new QSlider(pGroup);
  372. pSlider->setOrientation(Qt::Horizontal);
  373. pSlider->setGeometry(nXPos,nYPos,mnFontHeight * 10,nLEHeight);
  374. pSlider->setRange(1,100);
  375. pSlider->setValue(mnfac);
  376. connect(pSlider,SIGNAL(valueChanged(int)),this,SLOT(onChangeScale(int)));
  377. mpSlider_Scale = pSlider;
  378. nXPos = nXPos + mnFontHeight*11;
  379. pLE = new QLineEdit(pGroup);
  380. pLE->setGeometry(nXPos,nYPos,mnFontHeight*3,nLEHeight);
  381. pLE->setText(QString::number(pSlider->value()));
  382. mpLE_Scale = pLE;
  383. nXPos = 10;
  384. nYPos = nYPos + mnFontHeight * 2;
  385. pLabel = new QLabel(pGroup);
  386. pLabel->setText("MoveX");
  387. pLabel->setGeometry(nXPos,nYPos,mnFontHeight*3,nLEHeight);
  388. nXPos = nXPos + mnFontHeight * 4;
  389. pSlider = new QSlider(pGroup);
  390. pSlider->setOrientation(Qt::Horizontal);
  391. pSlider->setGeometry(nXPos,nYPos,mnFontHeight * 10,nLEHeight);
  392. pSlider->setRange(0,100);
  393. pSlider->setValue(mnMoveX*100/VIEW_WIDTH);
  394. connect(pSlider,SIGNAL(valueChanged(int)),this,SLOT(onChangeMoveX(int)));
  395. mpSlider_MoveX = pSlider;
  396. nXPos = nXPos + mnFontHeight*11;
  397. pLE = new QLineEdit(pGroup);
  398. pLE->setGeometry(nXPos,nYPos,mnFontHeight*3,nLEHeight);
  399. pLE->setText(QString::number(pSlider->value()));
  400. mpLE_MoveX = pLE;
  401. nXPos = 10;
  402. nYPos = nYPos + mnFontHeight * 2;
  403. pLabel = new QLabel(pGroup);
  404. pLabel->setText("MoveY");
  405. pLabel->setGeometry(nXPos,nYPos,mnFontHeight*3,nLEHeight);
  406. nXPos = nXPos + mnFontHeight * 4;
  407. pSlider = new QSlider(pGroup);
  408. pSlider->setOrientation(Qt::Horizontal);
  409. pSlider->setGeometry(nXPos,nYPos,mnFontHeight * 10,nLEHeight);
  410. pSlider->setRange(0,100);
  411. pSlider->setValue(mnMoveY*100/VIEW_HEIGHT);
  412. connect(pSlider,SIGNAL(valueChanged(int)),this,SLOT(onChangeMoveY(int)));
  413. mpSlider_MoveY = pSlider;
  414. nXPos = nXPos + mnFontHeight*11;
  415. pLE = new QLineEdit(pGroup);
  416. pLE->setGeometry(nXPos,nYPos,mnFontHeight*3,nLEHeight);
  417. pLE->setText(QString::number(pSlider->value()));
  418. mpLE_MoveY = pLE;
  419. nXPos = 10;
  420. nYPos = nYPos + mnFontHeight * 4;
  421. pLabel = new QLabel(pGroup);
  422. pLabel->setText("Mark");
  423. pLabel->setGeometry(nXPos,nYPos,mnFontHeight*3,nLEHeight);
  424. nXPos = nXPos + mnFontHeight * 4;
  425. pSlider = new QSlider(pGroup);
  426. pSlider->setOrientation(Qt::Horizontal);
  427. pSlider->setGeometry(nXPos,nYPos,mnFontHeight * 10,nLEHeight);
  428. pSlider->setRange(5,100);
  429. pSlider->setValue(mnMarkSize);
  430. connect(pSlider,SIGNAL(valueChanged(int)),this,SLOT(onChangeMark(int)));
  431. mpSlider_Mark = pSlider;
  432. nXPos = nXPos + mnFontHeight*11;
  433. pLE = new QLineEdit(pGroup);
  434. pLE->setGeometry(nXPos,nYPos,mnFontHeight*3,nLEHeight);
  435. pLE->setText(QString::number(pSlider->value()));
  436. mpLE_Mark = pLE;
  437. */
  438. nXPos = 10;
  439. nYPos = nYPos + mnFontHeight * 4;
  440. QGroupBox * pGroupShow = new QGroupBox(pGroup);
  441. pGroupShow->setTitle("Show");
  442. pGroupShow->setGeometry(nXPos,nYPos,nLEWidth*3+30,nLEHeight *3);
  443. QCheckBox * pCheck = new QCheckBox(pGroupShow);
  444. pCheck->setText("Line");
  445. pCheck->setGeometry(10,nLEHeight,nLEWidth,nLEHeight);
  446. pCheck->setChecked(true);
  447. mpCheckShowLine = pCheck;
  448. connect(pCheck,SIGNAL(clicked(bool)),this,SLOT(onClickSetShow(bool)));
  449. pCheck = new QCheckBox(pGroupShow);
  450. pCheck->setText("Road ID");
  451. pCheck->setGeometry(10+nLEWidth,nLEHeight,nLEWidth,nLEHeight);
  452. pCheck->setChecked(true);
  453. mpCheckShowRoadID = pCheck;
  454. connect(pCheck,SIGNAL(clicked(bool)),this,SLOT(onClickSetShow(bool)));
  455. pCheck = new QCheckBox(pGroupShow);
  456. pCheck->setText("LANE");
  457. pCheck->setGeometry(10+2* nLEWidth,nLEHeight,nLEWidth,nLEHeight);
  458. pCheck->setChecked(false);
  459. mpCheckShowLane = pCheck;
  460. connect(pCheck,SIGNAL(clicked(bool)),this,SLOT(onClickSetShow(bool)));
  461. nXPos = 10;
  462. nYPos = nYPos + mnFontHeight * 6;
  463. pLabel = new QLabel(pGroup);
  464. pLabel->setText("SelLon");
  465. pLabel->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  466. nXPos = nXPos + nSpace;
  467. pLabel = new QLabel(pGroup);
  468. pLabel->setText("SelLat");
  469. pLabel->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  470. nXPos = nXPos + nSpace;
  471. nXPos = 10;
  472. nYPos = nYPos + mnFontHeight * 2;
  473. pLE = new QLineEdit(pGroup);
  474. pLE->setText("");
  475. pLE->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  476. mpLE_SelX = pLE;
  477. nXPos = nXPos + nSpace;
  478. pLE = new QLineEdit(pGroup);
  479. pLE->setText("");
  480. pLE->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  481. mpLE_SelY = pLE;
  482. nXPos = nXPos + nSpace;
  483. nXPos = 10;
  484. nYPos = nYPos + mnFontHeight * 2;
  485. pLE = new QLineEdit(pGroup);
  486. pLE->setText("");
  487. pLE->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  488. mpLE_SelLon = pLE;
  489. nXPos = nXPos + nSpace;
  490. pLE = new QLineEdit(pGroup);
  491. pLE->setText("");
  492. pLE->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  493. mpLE_SelLat = pLE;
  494. nXPos = nXPos + nSpace;
  495. pLE = new QLineEdit(pGroup);
  496. pLE->setText("");
  497. pLE->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  498. pLE->setText("360");
  499. mpLE_StartHeading = pLE;
  500. nXPos = 10;
  501. nYPos = nYPos + mnFontHeight * 2;
  502. pPB = new QPushButton(pGroup);
  503. pPB->setText("Set Move");
  504. pPB->setGeometry(nXPos,nYPos,mnFontHeight*10,nLEHeight);
  505. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickSetMove()));
  506. nXPos = 10;
  507. nYPos = nYPos + mnFontHeight * 4;
  508. pPB = new QPushButton(pGroup);
  509. pPB->setText("Load Lane");
  510. pPB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  511. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickLoadLane()));
  512. nXPos = nXPos + nSpace;
  513. pCB = new QComboBox(pGroup);
  514. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  515. nXPos = nXPos + nSpace;
  516. mpCBLane = pCB;
  517. nXPos = 10;
  518. nYPos = nYPos + mnFontHeight * 2;
  519. pPB = new QPushButton(pGroup);
  520. pPB->setText("Remove");
  521. pPB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  522. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickRemoveLane()));
  523. nXPos = nXPos + nSpace;
  524. pPB = new QPushButton(pGroup);
  525. pPB->setText("Mark");
  526. pPB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  527. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickMarkLane()));
  528. nXPos = nXPos + nSpace;
  529. pPB = new QPushButton(pGroup);
  530. pPB->setText("Clear Road Lane");
  531. pPB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  532. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickClearRoadLane()));
  533. nXPos = nXPos + nSpace;
  534. nXPos = 10;
  535. nYPos = nYPos + mnFontHeight * 2;
  536. pPB = new QPushButton(pGroup);
  537. pPB->setText("To Road");
  538. pPB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  539. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickToRoad()));
  540. nXPos = nXPos + nSpace;
  541. pPB = new QPushButton(pGroup);
  542. pPB->setText("To Opposite");
  543. pPB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  544. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickToOpposite()));
  545. nXPos = nXPos + nSpace;
  546. pLE = new QLineEdit(pGroup);
  547. pLE->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  548. nXPos = nXPos + nSpace;
  549. mpLE_RoadName = pLE;
  550. nXPos = 10;
  551. nYPos = nYPos + mnFontHeight * 2;
  552. pCB = new QComboBox(pGroup);
  553. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  554. nXPos = nXPos + nSpace;
  555. mpCBSelLane = pCB;
  556. pCB = new QComboBox(pGroup);
  557. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  558. nXPos = nXPos + nSpace;
  559. mpCBSelOpLane = pCB;
  560. pPB = new QPushButton(pGroup);
  561. pPB->setText("Add Road");
  562. pPB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  563. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickAddRoad()));
  564. nXPos = nXPos + nSpace;
  565. nXPos = 10;
  566. nYPos = nYPos + mnFontHeight * 4;
  567. pCB = new QComboBox(pGroup);
  568. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  569. nXPos = nXPos + nSpace;
  570. mpCBRoad = pCB;
  571. connect(pCB,SIGNAL(currentIndexChanged(int)),this,SLOT(onClickCBRoadChange(int)));
  572. pPB = new QPushButton(pGroup);
  573. pPB->setText("Mark");
  574. pPB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  575. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickRoadMark()));
  576. nXPos = nXPos + nSpace;
  577. pPB = new QPushButton(pGroup);
  578. pPB->setText("Del");
  579. pPB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  580. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickRoadDel()));
  581. nXPos = nXPos + nSpace;
  582. nXPos = 10;
  583. nYPos = nYPos + mnFontHeight * 2;
  584. pLabel = new QLabel(pGroup);
  585. pLabel->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  586. pLabel->setText("Predecessor:");
  587. nXPos = nXPos + nSpace;
  588. pLabel = new QLabel(pGroup);
  589. pLabel->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  590. pLabel->setText("road");
  591. mpLabelRoadShowPreType1 = pLabel;
  592. nXPos = nXPos + nSpace;
  593. pLabel = new QLabel(pGroup);
  594. pLabel->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  595. pLabel->setText("10010");
  596. mpLabelRoadShowPreID = pLabel;
  597. nXPos = nXPos + nSpace;
  598. nXPos = 10;
  599. nYPos = nYPos + mnFontHeight * 2;
  600. pLabel = new QLabel(pGroup);
  601. pLabel->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  602. pLabel->setText("start");
  603. mpLabelRoadShowPreType2 = pLabel;
  604. nXPos = nXPos + nSpace;
  605. pCB = new QComboBox(pGroup);
  606. pCB->setGeometry(nXPos,nYPos,nLEWidth*2,nLEHeight);
  607. mpCBRoadShowPre = pCB;
  608. nXPos = 10;
  609. nYPos = nYPos + mnFontHeight * 2;
  610. pLabel = new QLabel(pGroup);
  611. pLabel->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  612. pLabel->setText("Successor:");
  613. nXPos = nXPos + nSpace;
  614. pLabel = new QLabel(pGroup);
  615. pLabel->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  616. pLabel->setText("road");
  617. mpLabelRoadShowNxtType1 = pLabel;
  618. nXPos = nXPos + nSpace;
  619. pLabel = new QLabel(pGroup);
  620. pLabel->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  621. pLabel->setText("10010");
  622. mpLabelRoadShowNxtID = pLabel;
  623. nXPos = nXPos + nSpace;
  624. nXPos = 10;
  625. nYPos = nYPos + mnFontHeight * 2;
  626. pLabel = new QLabel(pGroup);
  627. pLabel->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  628. pLabel->setText("start");
  629. mpLabelRoadShowNxtType2 = pLabel;
  630. nXPos = nXPos + nSpace;
  631. pCB = new QComboBox(pGroup);
  632. pCB->setGeometry(nXPos,nYPos,nLEWidth*2,nLEHeight);
  633. mpCBRoadShowNext = pCB;
  634. // nXPos = 10;
  635. // nYPos = nYPos + mnFontHeight * 2;
  636. // pCB = new QComboBox(pGroup);
  637. // pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  638. // nXPos = nXPos + nSpace;
  639. // mpCBPreNxtCurLane = pCB;
  640. nXPos = 10;
  641. nYPos = nYPos + mnFontHeight * 2;
  642. pCB = new QComboBox(pGroup);
  643. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  644. nXPos = nXPos + nSpace;
  645. mpCBPreNxtRoad = pCB;
  646. connect(pCB,SIGNAL(currentIndexChanged(int)),this,SLOT(onClickPreNxtRoadChange(int)));
  647. pCB = new QComboBox(pGroup);
  648. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  649. nXPos = nXPos + nSpace;
  650. mpCBPreNxtRelLane = pCB;
  651. pCB = new QComboBox(pGroup);
  652. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  653. nXPos = nXPos + nSpace;
  654. mpCBPreNxtConatact = pCB;
  655. pCB->addItem("start");
  656. pCB->addItem("end");
  657. nXPos = 10;
  658. nYPos = nYPos + mnFontHeight * 2;
  659. pPB = new QPushButton(pGroup);
  660. pPB->setGeometry(nXPos,nYPos,nLEWidth*15/10,nLEHeight);
  661. nXPos = nXPos + nSpace*15/10;
  662. pPB->setText("Set Predecessor");
  663. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickSetRoadPredecessor()));
  664. pPB = new QPushButton(pGroup);
  665. pPB->setGeometry(nXPos,nYPos,nLEWidth*15/10,nLEHeight);
  666. nXPos = nXPos + nSpace*15/10;
  667. pPB->setText("Set Successor");
  668. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickSetRoadSuccessor()));
  669. nXPos = 10;
  670. nYPos = nYPos + mnFontHeight * 2;
  671. pPB = new QPushButton(pGroup);
  672. pPB->setGeometry(nXPos,nYPos,nLEWidth*15/10,nLEHeight);
  673. nXPos = nXPos + nSpace*15/10;
  674. pPB->setText("Del Predecessor");
  675. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickDelRoadPredecessor()));
  676. pPB = new QPushButton(pGroup);
  677. pPB->setGeometry(nXPos,nYPos,nLEWidth*15/10,nLEHeight);
  678. nXPos = nXPos + nSpace*15/10;
  679. pPB->setText("Del Successor");
  680. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickDelRoadSuccessor()));
  681. nXPos = 10;
  682. nYPos = nYPos + mnFontHeight * 4;
  683. pCB = new QComboBox(pGroup);
  684. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  685. nXPos = nXPos + nSpace;
  686. mpCBRoad1 = pCB;
  687. pCB = new QComboBox(pGroup);
  688. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  689. nXPos = nXPos + nSpace;
  690. pCB->addItem("start");
  691. pCB->addItem("end");
  692. mpCBRC1 = pCB;
  693. nXPos = 10;
  694. nYPos = nYPos + mnFontHeight * 2;
  695. pCB = new QComboBox(pGroup);
  696. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  697. nXPos = nXPos + nSpace;
  698. mpCBRoad2 = pCB;
  699. pCB = new QComboBox(pGroup);
  700. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  701. nXPos = nXPos + nSpace;
  702. pCB->addItem("start");
  703. pCB->addItem("end");
  704. mpCBRC2 = pCB;
  705. pPB = new QPushButton(pGroup);
  706. pPB->setText("Road Contact");
  707. pPB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  708. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickRoadContact()));
  709. nXPos = 10;
  710. nYPos = nYPos + mnFontHeight * 4;
  711. pCB = new QComboBox(pGroup);
  712. pCB->setGeometry(nXPos,nYPos,nLEWidth*2,nLEHeight);
  713. nXPos = nXPos + nSpace;
  714. mpCBRoadCon = pCB;
  715. nXPos = 10;
  716. nYPos = nYPos + mnFontHeight * 2;
  717. pCB = new QComboBox(pGroup);
  718. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  719. nXPos = nXPos + nSpace;
  720. mpCBLane1 = pCB;
  721. pCB = new QComboBox(pGroup);
  722. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  723. nXPos = nXPos + nSpace;
  724. mpCBLane2 = pCB;
  725. nXPos = 10;
  726. nYPos = nYPos + mnFontHeight * 2;
  727. pPB = new QPushButton(pGroup);
  728. pPB->setText("Lane Contact");
  729. pPB->setGeometry(nXPos,nYPos,nLEWidth*15/10,nLEHeight);
  730. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickLaneContact()));
  731. nXPos = nXPos + nSpace*15/10;
  732. pCB = new QComboBox(pGroup);
  733. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  734. nXPos = nXPos + nSpace;
  735. mpCBLane1Lane2 = pCB;
  736. nXPos = 10;
  737. nYPos = nYPos + mnFontHeight * 2;
  738. pPB = new QPushButton(pGroup);
  739. pPB->setText("OpLane Contact");
  740. pPB->setGeometry(nXPos,nYPos,nLEWidth*15/10,nLEHeight);
  741. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickOpLaneContact()));
  742. nXPos = nXPos + nSpace*15/10;
  743. pCB = new QComboBox(pGroup);
  744. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  745. nXPos = nXPos + nSpace;
  746. mpCBLane1Lane2op = pCB;
  747. nXPos = 10;
  748. nYPos = nYPos + mnFontHeight * 2;
  749. pPB = new QPushButton(pGroup);
  750. pPB->setText("Clear");
  751. pPB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  752. nXPos = nXPos + nSpace;
  753. pPB = new QPushButton(pGroup);
  754. pPB->setText("Create Road");
  755. pPB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  756. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickCreateRoad()));
  757. nXPos = 10;
  758. nYPos = nYPos + mnFontHeight * 2;
  759. pCB = new QComboBox(pGroup);
  760. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  761. nXPos = nXPos + nSpace;
  762. mpCBRoadType = pCB;
  763. pCB->addItem("Turn");
  764. pCB->addItem("Straight");
  765. pCB->addItem("U-Turn");
  766. connect(pCB,SIGNAL(currentIndexChanged(int)),this,SLOT(onChangeRoadType(int)));
  767. pLabel = new QLabel(pGroup);
  768. pLabel->setText("Radius:");
  769. pLabel->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  770. nXPos = nXPos + nSpace;
  771. mpLBRoadType = pLabel;
  772. pLE = new QLineEdit(pGroup);
  773. pLE->setText("6.0");
  774. pLE->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  775. mpLERoadType = pLE;
  776. mpCBRoadType->setCurrentIndex(0);
  777. mpLBRoadType->setVisible(true);
  778. mpLERoadType->setVisible(true);
  779. nXPos = 10;
  780. nYPos = nYPos + mnFontHeight * 4;
  781. pPB = new QPushButton(pGroup);
  782. pPB->setText("Create Junction");
  783. pPB->setGeometry(nXPos,nYPos,nLEWidth*15/10,nLEHeight);
  784. nXPos = nXPos + nSpace*15/10;
  785. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickCreateJunction()));
  786. pCB = new QComboBox(pGroup);
  787. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  788. nXPos = nXPos + nSpace;
  789. mpCBJunction = pCB;
  790. connect(pCB,SIGNAL(currentIndexChanged(int)),this,SLOT(onClickCBJunctionChange(int)));
  791. pCB = new QComboBox(pGroup);
  792. pCB->setGeometry(nXPos,nYPos,nLEWidth*5/10,nLEHeight);
  793. mpCBJunctionConnection = pCB;
  794. connect(pCB,SIGNAL(currentIndexChanged(int)),this,SLOT(onClickCBJunctionConnectionChange(int)));
  795. nXPos = 10;
  796. nYPos = nYPos + mnFontHeight * 2;
  797. pLabel = new QLabel(pGroup);
  798. pLabel->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  799. nXPos = nXPos + nSpace;
  800. mpLabelJunctionIncommingRoad = pLabel;
  801. pLabel = new QLabel(pGroup);
  802. pLabel->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  803. nXPos = nXPos + nSpace;
  804. mpLabelJunctionContactPoint = pLabel;
  805. pLabel = new QLabel(pGroup);
  806. pLabel->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  807. nXPos = nXPos + nSpace;
  808. mpLabelJunctionConnectingRoad = pLabel;
  809. nXPos = 10;
  810. nYPos = nYPos + mnFontHeight * 2;
  811. pCB = new QComboBox(pGroup);
  812. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  813. mpCBJunctionFromTo = pCB;
  814. nXPos = 10;
  815. nYPos = nYPos + mnFontHeight * 2;
  816. pLabel = new QLabel(pGroup);
  817. pLabel->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  818. nXPos = nXPos + nSpace;
  819. pLabel->setText("Incomming");
  820. pCB = new QComboBox(pGroup);
  821. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  822. nXPos = nXPos + nSpace;
  823. mpCBJunctionIncommingRoad = pCB;
  824. connect(pCB,SIGNAL(currentIndexChanged(int)),this,SLOT(onClickCBJunctionIncommingChange(int)));
  825. nXPos = 10;
  826. nYPos = nYPos + mnFontHeight * 2;
  827. pLabel = new QLabel(pGroup);
  828. pLabel->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  829. nXPos = nXPos + nSpace;
  830. pLabel->setText("Connecting");
  831. pCB = new QComboBox(pGroup);
  832. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  833. nXPos = nXPos + nSpace;
  834. mpCBJunctionConnectingRoad= pCB;
  835. connect(pCB,SIGNAL(currentIndexChanged(int)),this,SLOT(onClickCBJunctionConnectionroadChange(int)));
  836. pCB = new QComboBox(pGroup);
  837. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  838. nXPos = nXPos + nSpace;
  839. pCB->addItem("start");
  840. pCB->addItem("end");
  841. mpCBJunctionContactPoint = pCB;
  842. nXPos = 10;
  843. nYPos = nYPos + mnFontHeight * 2;
  844. pCB = new QComboBox(pGroup);
  845. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  846. nXPos = nXPos + nSpace;
  847. mpCBJunctionFromLane = pCB;
  848. pCB = new QComboBox(pGroup);
  849. pCB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  850. nXPos = nXPos + nSpace;
  851. mpCBJunctionToLane = pCB;
  852. nXPos = 10;
  853. nYPos = nYPos + mnFontHeight * 2;
  854. pPB = new QPushButton(pGroup);
  855. pPB->setText("Create Lane Link");
  856. pPB->setGeometry(nXPos,nYPos,nLEWidth*15/10,nLEHeight);
  857. nXPos = nXPos + nSpace*15/10;
  858. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickCreateJunctionLaneLink()));
  859. pPB = new QPushButton(pGroup);
  860. pPB->setText("Delete Lane Link");
  861. pPB->setGeometry(nXPos,nYPos,nLEWidth*15/10,nLEHeight);
  862. nXPos = nXPos + nSpace*15/10;
  863. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickDeleteJunctionLaneLink()));
  864. nXPos = 10;
  865. nYPos = nYPos + mnFontHeight * 4;
  866. pPB = new QPushButton(pGroup);
  867. pPB->setText("Auto Connect Road");
  868. pPB->setGeometry(nXPos,nYPos,nLEWidth*15/10,nLEHeight);
  869. nXPos = nXPos + nSpace*15/10;
  870. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickAutoConnect()));
  871. nXPos = 10;
  872. nYPos = nYPos + mnFontHeight * 4;
  873. pPB = new QPushButton(pGroup);
  874. pPB->setText("Save");
  875. pPB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  876. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickSave()));
  877. nXPos = nXPos + nSpace;
  878. pPB = new QPushButton(pGroup);
  879. pPB->setText("Load");
  880. pPB->setGeometry(nXPos,nYPos,nLEWidth,nLEHeight);
  881. connect(pPB,SIGNAL(clicked(bool)),this,SLOT(onClickLoad()));
  882. nXPos = nXPos + nSpace;
  883. QScrollArea * pScroll = new QScrollArea();
  884. pScroll->setWidget(pGroup);
  885. p->addTab(pScroll,"Calculate");
  886. }
  887. void MainWindow::onClickXY(double x, double y)
  888. {
  889. mClickX = x - mnMoveX/mfbeishu;
  890. mClickY = y - mnMoveY/mfbeishu;
  891. mbClick = true;
  892. mbRefresh = true;
  893. double selx,sely;
  894. double lon,lat;
  895. selx = mClickX;
  896. sely = mClickY * (-1);
  897. selx = selx/((double )mnfac);
  898. sely = sely/((double)mnfac);
  899. mpLE_SelX->setText(QString::number(selx,'f',3));
  900. mpLE_SelY->setText(QString::number(sely,'f',3));
  901. double x0,y0;
  902. GaussProjCal(glon0,glat0,&x0,&y0);
  903. GaussProjInvCal(x0+selx-mfViewMoveX,y0+sely+mfViewMoveY,&lon,&lat);
  904. double rel_x,rel_y;
  905. rel_x = selx - mfViewMoveX;
  906. rel_y = sely + mfViewMoveY;
  907. Road * pRoad;
  908. GeometryBlock * pgeob;
  909. double fdis,nearx,neary,hdg;
  910. double fs;
  911. int nlane;
  912. if(xodrfunc::GetNearPoint(rel_x,rel_y,&mxodr,&pRoad,&pgeob,fdis,nearx,neary,hdg,50,&fs,&nlane) == 0)
  913. {
  914. qDebug("s:%f dis is %f nlane is %d",fs,fdis,nlane);
  915. char strout[1000];
  916. snprintf(strout,1000,"Road:%s s:%f dis:%f nlane:%d",pRoad->GetRoadId().data(),fs,fdis,nlane);
  917. mpLabel_Status->setText(strout);
  918. ui->statusBar->showMessage(strout,3000);
  919. int i;
  920. int nsize = mpCBRoad->count();
  921. for(i=0;i<nsize;i++)
  922. {
  923. if(mpCBRoad->itemText(i).toStdString() == pRoad->GetRoadId())
  924. {
  925. break;
  926. }
  927. }
  928. if(i<nsize)
  929. {
  930. if(i != mpCBRoad->currentIndex())
  931. mpCBRoad->setCurrentIndex(i);
  932. }
  933. }
  934. mpLE_SelLon->setText(QString::number(lon,'f',7));
  935. mpLE_SelLat->setText(QString::number(lat,'f',7));
  936. update();
  937. }
  938. void MainWindow::onChangeScale(int scale)
  939. {
  940. mnfac = scale;
  941. mpLE_Scale->setText(QString::number(scale));
  942. mbRefresh = true;
  943. update();
  944. }
  945. void MainWindow::onChangeMoveX(int scale)
  946. {
  947. mnMoveX = VIEW_WIDTH * scale/100;
  948. mpLE_MoveX->setText(QString::number(scale));
  949. mbRefresh = true;
  950. update();
  951. }
  952. void MainWindow::onChangeMoveY(int scale)
  953. {
  954. mnMoveY = VIEW_HEIGHT * scale/100;
  955. mpLE_MoveY->setText(QString::number(scale));
  956. mbRefresh = true;
  957. update();
  958. }
  959. void MainWindow::onChangeMark(int scale)
  960. {
  961. mnMarkSize = scale;
  962. mpLE_Mark->setText(QString::number(scale));
  963. mbRefresh = true;
  964. update();
  965. }
  966. void MainWindow::onClickDefView()
  967. {
  968. mnfac = mnDefmnfac;
  969. mnMoveX = mnDefMoveX;
  970. mnMoveY = mnDefMoveY;
  971. mpSlider_Scale->setValue(mnfac);
  972. mpSlider_MoveX->setValue(mnMoveX*100/VIEW_WIDTH);
  973. mpSlider_MoveY->setValue(mnMoveY*100/VIEW_HEIGHT);
  974. // mbRefresh = true;
  975. update();
  976. }
  977. void MainWindow::onClickZoomOne()
  978. {
  979. myview->zoomone();
  980. }
  981. void MainWindow::onClickAsStart()
  982. {
  983. }
  984. void MainWindow::onClickAsDst()
  985. {
  986. double lon,lat;
  987. lon = mpLE_SelLon->text().toDouble();
  988. lat = mpLE_SelLat->text().toDouble();
  989. mpLE_DstLon->setText(QString::number(lon,'f',7));
  990. mpLE_DstLat->setText(QString::number(lat,'f',7));
  991. double x,y;
  992. x = mpLE_SelX->text().toDouble();
  993. y = mpLE_SelY->text().toDouble();
  994. mfObjX = x;
  995. mfObjY = y;
  996. mbSetObj = true;
  997. mbRefresh = true;
  998. update();
  999. }
  1000. void MainWindow::onClickSetDst()
  1001. {
  1002. }
  1003. void MainWindow::onClickPlan()
  1004. {
  1005. }
  1006. void MainWindow::onClickSetStart()
  1007. {
  1008. }
  1009. /**
  1010. * @brief ADCIntelligentVehicle::UpdateMap
  1011. * @param strdata
  1012. * @param nSize
  1013. * @param index
  1014. * @param dt
  1015. * @param strmemname
  1016. */
  1017. void MainWindow::UpdateMap(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  1018. {
  1019. // std::cout<<"update map "<<std::endl;
  1020. int gpsunitsize = sizeof(iv::GPS_INS);
  1021. int nMapSize = nSize/gpsunitsize;
  1022. // std::cout<<"map size is "<<nMapSize<<std::endl;
  1023. if(nMapSize < 1)return;
  1024. int i;
  1025. mMutexNavi.lock();
  1026. m_navigation_data.clear();
  1027. for(i=0;i<nMapSize;i++)
  1028. {
  1029. iv::GPS_INS x;
  1030. memcpy(&x,strdata + i*gpsunitsize,gpsunitsize);
  1031. iv::GPSData data(new iv::GPS_INS);
  1032. *data = x;
  1033. m_navigation_data.push_back(data);
  1034. }
  1035. mMutexNavi.unlock();
  1036. mbRefresh = true;
  1037. update();
  1038. }
  1039. /**
  1040. * @brief MainWindow::UpdateGPSIMU
  1041. * @param strdata
  1042. * @param nSize
  1043. * @param index
  1044. * @param dt
  1045. * @param strmemname
  1046. */
  1047. void MainWindow::UpdateGPSIMU(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  1048. {
  1049. iv::gps::gpsimu xgpsimu;
  1050. if(!xgpsimu.ParseFromArray(strdata,nSize))
  1051. {
  1052. // gIvlog->warn("ADCIntelligentVehicle::UpdateGPSIMU parse error. nSize is %d",nSize);
  1053. return;
  1054. }
  1055. double flat,flon,fhead;
  1056. flat = xgpsimu.lat();
  1057. flon = xgpsimu.lon();
  1058. fhead = xgpsimu.heading();
  1059. double x,y;
  1060. GaussProjCal(flon,flat,&x,&y);
  1061. mfNowX = x - mx0;
  1062. mfNowY = y- my0;
  1063. mfNowHdg = (90- fhead)*M_PI/180.0;
  1064. mbGPSUpdate = true;
  1065. mbGPSViewUpdate = true;
  1066. }
  1067. void MainWindow::onClickLoadLane()
  1068. {
  1069. QString str = QFileDialog::getOpenFileName(this,tr("Open Lane Info file"),"",tr("Lane File(*.txt)"));
  1070. if(str.isEmpty())return;
  1071. QFile xFile;
  1072. xFile.setFileName(str);
  1073. QFileInfo fi(str);
  1074. QString filename = fi.fileName();
  1075. double fLastLat = 39;
  1076. double fLastLon = 117;
  1077. if(filename.contains(".txt"))
  1078. {
  1079. filename = filename.left(filename.length() -4);
  1080. }
  1081. if(xFile.open(QIODevice::ReadWrite))
  1082. {
  1083. iv::lpunit lpu;
  1084. strncpy(lpu.strlanename,filename.toLatin1().data(),filename.size());
  1085. QByteArray ba;
  1086. ba = xFile.read(xFile.size());
  1087. QString strdata = ba;
  1088. QStringList strlinedata= strdata.split("\n",QString::SkipEmptyParts);
  1089. int i;
  1090. int nsize = strlinedata.size();
  1091. // qDebug("line is %d",nsize);
  1092. for(i=0;i<nsize;i++)
  1093. {
  1094. QString strline = strlinedata.at(i);
  1095. QStringList strvaluedata = strline.split(" ",QString::SkipEmptyParts);
  1096. // qDebug("%d value size is %d ",i,strvaluedata.size());
  1097. iv::lanepoint lpleft,lpright;
  1098. if(strvaluedata.size() == 12)
  1099. {
  1100. int j;
  1101. QString strx[12];
  1102. for(j=0;j<12;j++)strx[j] = strvaluedata.at(j);
  1103. lpleft.mfLon = strx[0].toDouble();
  1104. lpleft.mfLat = strx[1].toDouble();
  1105. lpleft.mfHeight = strx[2].toDouble();
  1106. lpleft.nLaneType = strx[3].toInt();
  1107. lpleft.mfHeading = strx[4].toDouble();
  1108. lpleft.mfDis = strx[5].toDouble();
  1109. lpright.mfLon = strx[6].toDouble();
  1110. lpright.mfLat = strx[7].toDouble();
  1111. lpright.mfHeight = strx[8].toDouble();
  1112. lpright.nLaneType = strx[9].toInt();
  1113. lpright.mfHeading = strx[10].toDouble();
  1114. lpright.mfDis = strx[11].toDouble();
  1115. lpleft.mfHdg = (90-lpleft.mfHeading) * M_PI/180.0;
  1116. if(lpleft.mfHdg < 0)lpleft.mfHdg = lpleft.mfHdg + 2.0*M_PI;
  1117. lpright.mfHdg = (90-lpright.mfHeading) * M_PI/180.0;
  1118. if(lpright.mfHdg < 0)lpright.mfHdg = lpright.mfHdg + 2.0*M_PI;
  1119. double x,y;
  1120. double xlast,ylast;
  1121. GaussProjCal(lpleft.mfLon,lpleft.mfLat,&x,&y);
  1122. GaussProjCal(fLastLon,fLastLat,&xlast,&ylast);
  1123. if(sqrt(pow(xlast -x ,2)+pow(ylast -y,2))> 0.1)
  1124. {
  1125. lpu.mvectorlpleft.push_back(lpleft);
  1126. lpu.mvectorlpright.push_back(lpright);
  1127. fLastLat = lpleft.mfLat;
  1128. fLastLon = lpleft.mfLon;
  1129. }
  1130. else
  1131. {
  1132. // qDebug("no use this point");
  1133. }
  1134. }
  1135. }
  1136. if((mbSetOrigin == false)&&(lpu.mvectorlpleft.size() > 0))
  1137. {
  1138. glat0 = lpu.mvectorlpleft[0].mfLat;
  1139. glon0 = lpu.mvectorlpright[0].mfLon;
  1140. mpLELat0->setText(QString::number(glat0,'f',7));
  1141. mpLELon0->setText(QString::number(glon0,'f',7));
  1142. mbSetOrigin = true;
  1143. }
  1144. double x0,y0;
  1145. GaussProjCal(glon0,glat0,&x0,&y0);
  1146. int j;
  1147. std::vector<iv::laneviewxy> xvectorlaneviewxy;
  1148. for(j=0;j<lpu.mvectorlpleft.size();j++)
  1149. {
  1150. double x,y;
  1151. GaussProjCal(lpu.mvectorlpleft[j].mfLon,lpu.mvectorlpleft[j].mfLat,&x,&y);
  1152. lpu.mvectorlpleft[j].mfX = x - x0;
  1153. lpu.mvectorlpleft[j].mfY = y- y0;
  1154. iv::laneviewxy xlv;
  1155. xlv.mfX = lpu.mvectorlpleft[j].mfX;
  1156. xlv.mfY = lpu.mvectorlpleft[j].mfY *(-1.0);
  1157. xvectorlaneviewxy.push_back(xlv);
  1158. GaussProjCal(lpu.mvectorlpright[j].mfLon,lpu.mvectorlpright[j].mfLat,&x,&y);
  1159. lpu.mvectorlpright[j].mfX = x - x0;
  1160. lpu.mvectorlpright[j].mfY = y- y0;
  1161. xlv.mfX = lpu.mvectorlpright[j].mfX;
  1162. xlv.mfY = lpu.mvectorlpright[j].mfY *(-1.0);
  1163. xvectorlaneviewxy.push_back(xlv);
  1164. }
  1165. lanepointviewitem * lpvi = new lanepointviewitem(xvectorlaneviewxy);
  1166. lpvi->setPos(0+mfViewMoveX,0 + mfViewMoveY);
  1167. // prvw->setPos(mnMoveX/mfbeishu,mnMoveY/mfbeishu);
  1168. lpvi->setratio(1.0/mfbeishu);
  1169. mvectorlanepointview.push_back(lpvi);
  1170. mpscene->addItem(lpvi);
  1171. if(lpu.mvectorlpleft.size() > 0)
  1172. {
  1173. mvectorlp.push_back(lpu);
  1174. mpCBLane->addItem(filename);
  1175. int N = lpu.mvectorlpleft.size();
  1176. VectorXd x_veh(N);
  1177. VectorXd y_veh(N);
  1178. int j;
  1179. int ntype = 0;
  1180. int ntypecount = 1;
  1181. for(j=0;j<N;j++)
  1182. {
  1183. double x,y;
  1184. GaussProjCal(glon0,glat0,&x0,&y0);
  1185. GaussProjCal(lpu.mvectorlpleft[j].mfLon,lpu.mvectorlpleft[j].mfLat,&x,&y);
  1186. x_veh[j] = x - x0;
  1187. y_veh[j] = y - y0;
  1188. if(lpu.mvectorlpright[j].nLaneType != ntype)
  1189. {
  1190. ntype = lpu.mvectorlpright[j].nLaneType;
  1191. ntypecount++;
  1192. }
  1193. }
  1194. // CreateRoad(x_veh,y_veh);
  1195. // auto coeffs = polyfit(x_veh, y_veh, 1);
  1196. // double dismax = 0;
  1197. // for(j=0;j<N;j++)
  1198. // {
  1199. // double A = coeffs[1];
  1200. // double B = -1;
  1201. // double C = coeffs[0];
  1202. // double dis = fabs(A*x_veh[j] + B*y_veh[j] +C )/sqrt(pow(A,2)+pow(B,2));
  1203. // if(dis>dismax)dismax = dis;
  1204. // }
  1205. // int nxxx = coeffs.size();
  1206. }
  1207. }
  1208. xFile.close();
  1209. mbRefresh = true;
  1210. update();
  1211. }
  1212. /**
  1213. * @brief MainWindow::CreateRoad
  1214. * Create Road Geometry
  1215. * @param xvals
  1216. * @param yvals
  1217. * @return
  1218. */
  1219. Road MainWindow::CreateRoad(VectorXd xvals, VectorXd yvals)
  1220. {
  1221. // Road xRoad;
  1222. // double LINE_ERROR = 0.15;
  1223. // int nsize = xvals.size();
  1224. // int nnotfit = nsize;
  1225. // int ncurpos = 0;
  1226. // int nrange = nsize;
  1227. // while(ncurpos < nsize)
  1228. // {
  1229. // // int N = nrange - ncurpos;
  1230. // VectorXd x_veh(nrange);
  1231. // VectorXd y_veh(nrange);
  1232. // int j;
  1233. // for(j=ncurpos;j<(ncurpos +nrange);j++)
  1234. // {
  1235. // x_veh[j-ncurpos] = xvals[j];
  1236. // y_veh[j - ncurpos] = yvals[j];
  1237. // }
  1238. // auto coeffs = polyfit(x_veh, y_veh, 1);
  1239. // double dismax = 0;
  1240. // for(j=ncurpos;j<(ncurpos +nrange);j++)
  1241. // {
  1242. // double A = coeffs[1];
  1243. // double B = -1;
  1244. // double C = coeffs[0];
  1245. // double dis = fabs(A*x_veh[j-ncurpos] + B*y_veh[j-ncurpos] +C )/sqrt(pow(A,2)+pow(B,2));
  1246. // if(dis>dismax)dismax = dis;
  1247. // }
  1248. // std::cout<<"dis is "<<dismax<<std::endl;
  1249. // if((dismax > LINE_ERROR)&&((nsize -(nrange+ncurpos))>50))
  1250. // {
  1251. // nrange = nrange/2;
  1252. // }
  1253. // else
  1254. // {
  1255. // std::cout<<"nrange is "<<nrange<<std::endl;
  1256. // xRoad.AddGeometryBlock();
  1257. // GeometryBlock * pgb = xRoad.GetGeometryBlock(xRoad.GetGeometryBlockCount()-1);
  1258. // // pgb->AddGeometryLine(1.0,x,y,len);
  1259. // ncurpos = ncurpos + nrange;
  1260. // nrange = nsize - ncurpos;
  1261. // std::cout<<"add a geo."<<std::endl;
  1262. // }
  1263. // }
  1264. // return xRoad;
  1265. }
  1266. void MainWindow::onClickMarkLane()
  1267. {
  1268. mnMarkLane = mpCBLane->currentIndex();
  1269. mbRefresh = true;
  1270. update();
  1271. }
  1272. void MainWindow::onClickRemoveLane()
  1273. {
  1274. int i = mpCBLane->currentIndex();
  1275. if((i>=0) && (i<mvectorlp.size()))
  1276. {
  1277. int j;
  1278. for(j=0;j<mvectorroadlane.size();j++)
  1279. {
  1280. if(mvectorroadlane[j] == i)
  1281. {
  1282. mvectorroadlane.erase(mvectorroadlane.begin() + j);
  1283. mpCBSelLane->removeItem(j);
  1284. break;
  1285. }
  1286. }
  1287. mvectorlp.erase(mvectorlp.begin() + i);
  1288. mpCBLane->removeItem(i);
  1289. mbRefresh = true;
  1290. update();
  1291. }
  1292. }
  1293. void MainWindow::onClickToRoad()
  1294. {
  1295. int i = mpCBLane->currentIndex();
  1296. if((i>=0) && (i<mvectorlp.size()))
  1297. {
  1298. int j;
  1299. bool bHave = false;
  1300. for(j=0;j<mvectorroadlane.size();j++)
  1301. {
  1302. if(mvectorroadlane[j] == i)
  1303. {
  1304. bHave = true;
  1305. break;
  1306. }
  1307. }
  1308. if(bHave == false)
  1309. {
  1310. mvectorroadlane.push_back(i);
  1311. mpCBSelLane->addItem(mvectorlp.at(i).strlanename);
  1312. }
  1313. }
  1314. }
  1315. void MainWindow::onClickToOpposite()
  1316. {
  1317. int i = mpCBLane->currentIndex();
  1318. if((i>=0) && (i<mvectorlp.size()))
  1319. {
  1320. int j;
  1321. bool bHave = false;
  1322. for(j=0;j<mvectorroadopposite.size();j++)
  1323. {
  1324. if(mvectorroadopposite[j] == i)
  1325. {
  1326. bHave = true;
  1327. break;
  1328. }
  1329. }
  1330. if(bHave == false)
  1331. {
  1332. mvectorroadopposite.push_back(i);
  1333. mpCBSelOpLane->addItem(mvectorlp.at(i).strlanename);
  1334. }
  1335. }
  1336. }
  1337. void MainWindow::onClickClearRoadLane()
  1338. {
  1339. mvectorroadlane.clear();
  1340. mvectorroadopposite.clear();
  1341. mpCBSelLane->clear();
  1342. mpCBSelOpLane->clear();
  1343. }
  1344. void MainWindow::onClickAddRoad()
  1345. {
  1346. if(mvectorroadlane.size() < 1)return;
  1347. int nlanesize = mvectorroadlane.size();
  1348. int noplanesize = mvectorroadopposite.size();
  1349. double notlinethresh = 1.0; //When heading change more than this value, is a arc.
  1350. int nsize = mvectorlp[mvectorroadlane[0]].mvectorlpleft.size();
  1351. int * pntype = new int[nsize];
  1352. std::shared_ptr<int> ppntype; ppntype.reset(pntype);
  1353. std::vector<iv::lanepoint > * pvectorlp = &(mvectorlp[mvectorroadlane[0]].mvectorlpleft);
  1354. int i;
  1355. //Go throuh point for fit type.
  1356. for(i=0;i<5;i++)pntype[i] = 0;
  1357. for(i=5;i<(nsize-5);i++)
  1358. {
  1359. double s = pvectorlp->at(i).mfDis;
  1360. double head0 = pvectorlp->at(i).mfHeading;
  1361. int j;
  1362. double xcount = 0;
  1363. double headdifftotal = 0;
  1364. double headdiffavg = 0.0;
  1365. for(j=1;j<nsize;j++)
  1366. {
  1367. if((j>1)&&((pvectorlp->at(j).mfDis - s)>1.0))
  1368. {
  1369. break;
  1370. }
  1371. double headdiff = pvectorlp->at(j).mfHeading - head0;
  1372. if(headdiff > 300)headdiff = headdiff - 360;
  1373. if(headdiff < -300)headdiff = headdiff + 360;
  1374. headdifftotal = headdifftotal + headdiff;
  1375. xcount = xcount + 1.0;
  1376. }
  1377. if(xcount > 0)headdiffavg = headdifftotal/xcount;
  1378. if(fabs(headdiffavg) > (notlinethresh*2))
  1379. {
  1380. pntype[i] = 1;
  1381. }
  1382. else
  1383. {
  1384. pntype[i] = 0;
  1385. }
  1386. }
  1387. for(i=(nsize -5);i<nsize;i++)
  1388. {
  1389. pntype[i] = 0;
  1390. }
  1391. for(i=0;i<nsize;i++) //Remove Few Not Line Point.
  1392. {
  1393. if(pntype[i] != 0)
  1394. {
  1395. int j;
  1396. int ncount = 1;
  1397. for(j=(i+1);j<nsize;j++)
  1398. {
  1399. if(pntype[i] != 0)ncount++;
  1400. else break;
  1401. }
  1402. if(ncount < 10)pntype[i] = 0;
  1403. else
  1404. {
  1405. i = i+ ncount;
  1406. }
  1407. }
  1408. }
  1409. for(i=5;i<nsize;i++)
  1410. {
  1411. if(pntype[i] != pntype[i-1])
  1412. {
  1413. int j = i-1;
  1414. double disx = pvectorlp->at(i).mfDis;
  1415. for(j=(i-2);j>5;j--)
  1416. {
  1417. if(pntype[j] == pntype[i-1])
  1418. {
  1419. pntype[j] = 2; //Besel
  1420. }
  1421. if(fabs(pvectorlp->at(j).mfDis - disx)>1) //1 m besel
  1422. {
  1423. break;
  1424. }
  1425. }
  1426. pntype[i-1] = 2;
  1427. }
  1428. }
  1429. //Calc dis to ref line
  1430. double xor0,yor0;
  1431. GaussProjCal(glon0,glat0,&xor0,&yor0);
  1432. std::vector<std::vector<iv::distogeo>> xvectordiss;
  1433. std::vector<std::vector<iv::distogeo>> xvectoropdiss;
  1434. for(i=0;i<mvectorroadlane.size();i++)
  1435. {
  1436. std::vector<iv::distogeo> xvectordistogeo;
  1437. int j;
  1438. int nsizepoint = mvectorlp[mvectorroadlane[i]].mvectorlpright.size();
  1439. bool bHaveLast = false;
  1440. int nLast = 0;
  1441. for(j=0;j<nsizepoint;j++)
  1442. {
  1443. double fdismin = 1000;
  1444. double fS = 0;
  1445. int k;
  1446. double x,y;
  1447. double x0,y0;
  1448. iv::distogeo xdistogeo;
  1449. int nLastBig = 0;
  1450. bool bFindDisMin = false;
  1451. x = mvectorlp[mvectorroadlane[i]].mvectorlpright[j].mfX;
  1452. y = mvectorlp[mvectorroadlane[i]].mvectorlpright[j].mfY;
  1453. int kstart = 0;
  1454. if(bHaveLast)
  1455. {
  1456. kstart= nLast;
  1457. }
  1458. for(k=kstart;k<mvectorlp[mvectorroadlane[0]].mvectorlpleft.size();k++)
  1459. {
  1460. x0 = mvectorlp[mvectorroadlane[0]].mvectorlpleft[k].mfX;
  1461. y0 = mvectorlp[mvectorroadlane[0]].mvectorlpleft[k].mfY;
  1462. double fdis = sqrt(pow(x-x0,2)+pow(y-y0,2));
  1463. if(fdismin > fdis)
  1464. {
  1465. fdismin = fdis;
  1466. fS = mvectorlp[mvectorroadlane[0]].mvectorlpleft[k].mfDis;
  1467. bFindDisMin = true;
  1468. nLast = k;
  1469. }
  1470. if((bFindDisMin)&&(bHaveLast))
  1471. {
  1472. if(fdis>fdismin)
  1473. {
  1474. nLastBig++;
  1475. }
  1476. else
  1477. {
  1478. nLastBig = 0;
  1479. }
  1480. }
  1481. if(nLastBig > 10)break;
  1482. }
  1483. // std::cout<<" k is "<<k<<std::endl;
  1484. if(bHaveLast == false)
  1485. {
  1486. if(fdismin<10)bHaveLast = true;
  1487. }
  1488. else
  1489. {
  1490. if(fdismin > 10)bHaveLast = false;
  1491. }
  1492. double fHdg = geofit::CalcHdg(x,y,mvectorlp[mvectorroadlane[0]].mvectorlpleft[nLast].mfX,
  1493. mvectorlp[mvectorroadlane[0]].mvectorlpleft[nLast].mfY);
  1494. double fHdgDiff = fHdg - mvectorlp[mvectorroadlane[i]].mvectorlpright[j].mfHdg;
  1495. if(fHdgDiff < 0)fHdgDiff = fHdgDiff + 2.0*M_PI;
  1496. if(fHdgDiff >= 2.0*M_PI)fHdgDiff = fHdgDiff - 2.0*M_PI;
  1497. if(((fHdgDiff>(M_PI/2.0-0.3))&&(fHdgDiff<(M_PI/2.0+0.3)))||(fdismin < 3.2))
  1498. {
  1499. xdistogeo.mfdis = fdismin;
  1500. xdistogeo.mfs = fS;
  1501. mvectorlp[mvectorroadlane[i]].mvectorlpright[j].mfRelS = fS;
  1502. }
  1503. else
  1504. {
  1505. xdistogeo.mfs = -1;
  1506. std::cout<<"point extend."<<std::endl;
  1507. mvectorlp[mvectorroadlane[i]].mvectorlpright[j].mfRelS = -1;
  1508. }
  1509. xvectordistogeo.push_back(xdistogeo);
  1510. }
  1511. xvectordiss.push_back(xvectordistogeo);
  1512. }
  1513. for(i=1;i<mvectorroadlane.size();i++)
  1514. {
  1515. std::vector<iv::distogeo> xvectordistogeo;
  1516. int j;
  1517. int nsizepoint = mvectorlp[mvectorroadlane[i]].mvectorlpleft.size();
  1518. bool bHaveLast = false;
  1519. int nLast = 0;
  1520. for(j=0;j<nsizepoint;j++)
  1521. {
  1522. double fdismin = 1000;
  1523. double fS = 0;
  1524. int k;
  1525. double x,y;
  1526. double x0,y0;
  1527. iv::distogeo xdistogeo;
  1528. int nLastBig = 0;
  1529. bool bFindDisMin = false;
  1530. x = mvectorlp[mvectorroadlane[i]].mvectorlpleft[j].mfX;
  1531. y = mvectorlp[mvectorroadlane[i]].mvectorlpleft[j].mfY;
  1532. int kstart = 0;
  1533. if(bHaveLast)
  1534. {
  1535. kstart= nLast;
  1536. }
  1537. for(k=kstart;k<mvectorlp[mvectorroadlane[0]].mvectorlpleft.size();k++)
  1538. {
  1539. x0 = mvectorlp[mvectorroadlane[0]].mvectorlpleft[k].mfX;
  1540. y0 = mvectorlp[mvectorroadlane[0]].mvectorlpleft[k].mfY;
  1541. double fdis = sqrt(pow(x-x0,2)+pow(y-y0,2));
  1542. if(fdismin > fdis)
  1543. {
  1544. fdismin = fdis;
  1545. fS = mvectorlp[mvectorroadlane[0]].mvectorlpleft[k].mfDis;
  1546. bFindDisMin = true;
  1547. nLast = k;
  1548. }
  1549. if((bFindDisMin)&&(bHaveLast))
  1550. {
  1551. if(fdis>fdismin)
  1552. {
  1553. nLastBig++;
  1554. }
  1555. else
  1556. {
  1557. nLastBig = 0;
  1558. }
  1559. }
  1560. if(nLastBig > 10)break;
  1561. }
  1562. // std::cout<<" k is "<<k<<std::endl;
  1563. if(bHaveLast == false)
  1564. {
  1565. if(fdismin<10)bHaveLast = true;
  1566. }
  1567. else
  1568. {
  1569. if(fdismin > 10)bHaveLast = false;
  1570. }
  1571. double fHdg = geofit::CalcHdg(x,y,mvectorlp[mvectorroadlane[0]].mvectorlpleft[nLast].mfX,
  1572. mvectorlp[mvectorroadlane[0]].mvectorlpleft[nLast].mfY);
  1573. double fHdgDiff = fHdg - mvectorlp[mvectorroadlane[i]].mvectorlpleft[j].mfHdg;
  1574. if(fHdgDiff < 0)fHdgDiff = fHdgDiff + 2.0*M_PI;
  1575. if(fHdgDiff >= 2.0*M_PI)fHdgDiff = fHdgDiff - 2.0*M_PI;
  1576. if(((fHdgDiff>(M_PI/2.0-0.3))&&(fHdgDiff<(M_PI/2.0+0.3)))||(fdismin < 3.2))
  1577. {
  1578. xdistogeo.mfdis = fdismin;
  1579. xdistogeo.mfs = fS;
  1580. mvectorlp[mvectorroadlane[i]].mvectorlpleft[j].mfRelS = fS;
  1581. }
  1582. else
  1583. {
  1584. xdistogeo.mfs = -1;
  1585. std::cout<<"point extend."<<std::endl;
  1586. mvectorlp[mvectorroadlane[i]].mvectorlpleft[j].mfRelS = -1;
  1587. }
  1588. xvectordistogeo.push_back(xdistogeo);
  1589. }
  1590. xvectordiss.push_back(xvectordistogeo);
  1591. }
  1592. for(i=0;i<mvectorroadopposite.size();i++)
  1593. {
  1594. std::vector<iv::distogeo> xvectordistogeo;
  1595. int j;
  1596. int nsizepoint = mvectorlp[mvectorroadopposite[i]].mvectorlpleft.size();
  1597. bool bHaveLast = false;
  1598. int nLast = 0;
  1599. for(j=0;j<nsizepoint;j++)
  1600. {
  1601. double fdismin = 1000;
  1602. double fS = 0;
  1603. int k;
  1604. double x,y;
  1605. double x0,y0;
  1606. iv::distogeo xdistogeo;
  1607. int nLastBig = 0;
  1608. bool bFindDisMin = false;
  1609. x = mvectorlp[mvectorroadopposite[i]].mvectorlpleft[j].mfX;
  1610. y = mvectorlp[mvectorroadopposite[i]].mvectorlpleft[j].mfY;
  1611. int nrefsize = mvectorlp[mvectorroadlane[0]].mvectorlpleft.size();
  1612. int kstart = nrefsize-1;
  1613. if(bHaveLast)
  1614. {
  1615. kstart= nLast;
  1616. }
  1617. for(k=kstart;k>=0;k--)
  1618. {
  1619. x0 = mvectorlp[mvectorroadlane[0]].mvectorlpleft[k].mfX;
  1620. y0 = mvectorlp[mvectorroadlane[0]].mvectorlpleft[k].mfY;
  1621. double fdis = sqrt(pow(x-x0,2)+pow(y-y0,2));
  1622. if(fdismin > fdis)
  1623. {
  1624. fdismin = fdis;
  1625. fS = mvectorlp[mvectorroadlane[0]].mvectorlpleft[k].mfDis;
  1626. bFindDisMin = true;
  1627. nLast = k;
  1628. }
  1629. if((bFindDisMin)&&(bHaveLast))
  1630. {
  1631. if(fdis>fdismin)
  1632. {
  1633. nLastBig++;
  1634. }
  1635. else
  1636. {
  1637. nLastBig = 0;
  1638. }
  1639. }
  1640. if(nLastBig > 10)break;
  1641. }
  1642. // std::cout<<" k is "<<k<<std::endl;
  1643. if(bHaveLast == false)
  1644. {
  1645. if(fdismin<10)bHaveLast = true;
  1646. }
  1647. else
  1648. {
  1649. if(fdismin > 10)bHaveLast = false;
  1650. }
  1651. double fHdg = geofit::CalcHdg(x,y,mvectorlp[mvectorroadlane[0]].mvectorlpleft[nLast].mfX,
  1652. mvectorlp[mvectorroadlane[0]].mvectorlpleft[nLast].mfY);
  1653. double fHdgDiff = fHdg - mvectorlp[mvectorroadopposite[i]].mvectorlpleft[j].mfHdg;
  1654. if(fHdgDiff < 0)fHdgDiff = fHdgDiff + 2.0*M_PI;
  1655. if(fHdgDiff >= 2.0*M_PI)fHdgDiff = fHdgDiff - 2.0*M_PI;
  1656. if(((fHdgDiff>(M_PI/2.0-0.3))&&(fHdgDiff<(M_PI/2.0+0.3)))||(fdismin < 0.5))
  1657. {
  1658. xdistogeo.mfdis = fdismin;
  1659. xdistogeo.mfs = fS;
  1660. mvectorlp[mvectorroadopposite[i]].mvectorlpleft[j].mfRelS = fS;
  1661. }
  1662. else
  1663. {
  1664. xdistogeo.mfs = -1;
  1665. std::cout<<"point extend."<<std::endl;
  1666. mvectorlp[mvectorroadopposite[i]].mvectorlpleft[j].mfRelS = -1;
  1667. }
  1668. xvectordistogeo.push_back(xdistogeo);
  1669. }
  1670. xvectoropdiss.push_back(xvectordistogeo);
  1671. }
  1672. for(i=0;i<mvectorroadopposite.size();i++)
  1673. {
  1674. std::vector<iv::distogeo> xvectordistogeo;
  1675. int j;
  1676. int nsizepoint = mvectorlp[mvectorroadopposite[i]].mvectorlpright.size();
  1677. bool bHaveLast = false;
  1678. int nLast = 0;
  1679. for(j=0;j<nsizepoint;j++)
  1680. {
  1681. double fdismin = 1000;
  1682. double fS = 0;
  1683. int k;
  1684. double x,y;
  1685. double x0,y0;
  1686. iv::distogeo xdistogeo;
  1687. int nLastBig = 0;
  1688. bool bFindDisMin = false;
  1689. x = mvectorlp[mvectorroadopposite[i]].mvectorlpright[j].mfX;
  1690. y = mvectorlp[mvectorroadopposite[i]].mvectorlpright[j].mfY;
  1691. int nrefsize = mvectorlp[mvectorroadlane[0]].mvectorlpleft.size();
  1692. int kstart = nrefsize-1;
  1693. if(bHaveLast)
  1694. {
  1695. kstart= nLast;
  1696. }
  1697. for(k=kstart;k>=0;k--)
  1698. {
  1699. x0 = mvectorlp[mvectorroadlane[0]].mvectorlpleft[k].mfX;
  1700. y0 = mvectorlp[mvectorroadlane[0]].mvectorlpleft[k].mfY;
  1701. double fdis = sqrt(pow(x-x0,2)+pow(y-y0,2));
  1702. if(fdismin > fdis)
  1703. {
  1704. fdismin = fdis;
  1705. fS = mvectorlp[mvectorroadlane[0]].mvectorlpleft[k].mfDis;
  1706. bFindDisMin = true;
  1707. nLast = k;
  1708. }
  1709. if((bFindDisMin)&&(bHaveLast))
  1710. {
  1711. if(fdis>fdismin)
  1712. {
  1713. nLastBig++;
  1714. }
  1715. else
  1716. {
  1717. nLastBig = 0;
  1718. }
  1719. }
  1720. if(nLastBig > 10)break;
  1721. }
  1722. // std::cout<<" k is "<<k<<std::endl;
  1723. if(bHaveLast == false)
  1724. {
  1725. if(fdismin<10)bHaveLast = true;
  1726. }
  1727. else
  1728. {
  1729. if(fdismin > 10)bHaveLast = false;
  1730. }
  1731. double fHdg = geofit::CalcHdg(x,y,mvectorlp[mvectorroadlane[0]].mvectorlpleft[nLast].mfX,
  1732. mvectorlp[mvectorroadlane[0]].mvectorlpleft[nLast].mfY);
  1733. double fHdgDiff = fHdg - mvectorlp[mvectorroadopposite[i]].mvectorlpright[j].mfHdg;
  1734. if(fHdgDiff < 0)fHdgDiff = fHdgDiff + 2.0*M_PI;
  1735. if(fHdgDiff >= 2.0*M_PI)fHdgDiff = fHdgDiff - 2.0*M_PI;
  1736. if(((fHdgDiff>(M_PI/2.0-0.3))&&(fHdgDiff<(M_PI/2.0+0.3)))||(fdismin < 0.5))
  1737. {
  1738. xdistogeo.mfdis = fdismin;
  1739. xdistogeo.mfs = fS;
  1740. mvectorlp[mvectorroadopposite[i]].mvectorlpright[j].mfRelS = fS;
  1741. }
  1742. else
  1743. {
  1744. xdistogeo.mfs = -1;
  1745. std::cout<<"point extend."<<std::endl;
  1746. mvectorlp[mvectorroadopposite[i]].mvectorlpright[j].mfRelS = -1;
  1747. }
  1748. xvectordistogeo.push_back(xdistogeo);
  1749. }
  1750. xvectoropdiss.push_back(xvectordistogeo);
  1751. }
  1752. //Get Lane Type
  1753. std::vector<std::vector<iv::lanetype>> xvevelanetype;
  1754. std::vector<std::vector<iv::lanetype>> xvectoroplanetype;
  1755. for(i=0;i<nlanesize;i++)
  1756. {
  1757. std::vector<iv::lanetype> xvelanetype;
  1758. int j;
  1759. int nlasttype;
  1760. iv::lanetype xlt;
  1761. xlt.s = 0;
  1762. xlt.ntype = 0;
  1763. int nsizelp = mvectorlp[mvectorroadlane[i]].mvectorlpright.size();
  1764. if(nsizelp > 0)
  1765. {
  1766. xlt.ntype = mvectorlp[mvectorroadlane[i]].mvectorlpright[0].nLaneType;
  1767. nlasttype = xlt.ntype;
  1768. }
  1769. for(j=1;j<nsizelp;j++)
  1770. {
  1771. int nlt = mvectorlp[mvectorroadlane[i]].mvectorlpright[j].nLaneType;
  1772. if((nlt != nlasttype)&&(mvectorlp[mvectorroadlane[i]].mvectorlpright[j].mfRelS != -1))
  1773. {
  1774. xvelanetype.push_back(xlt);
  1775. xlt.ntype = nlt;
  1776. xlt.s = mvectorlp[mvectorroadlane[i]].mvectorlpright[j].mfRelS;
  1777. }
  1778. nlasttype = nlt;
  1779. }
  1780. xvelanetype.push_back(xlt);
  1781. xvevelanetype.push_back(xvelanetype);
  1782. }
  1783. for(i=0;i<noplanesize;i++)
  1784. {
  1785. std::vector<iv::lanetype> xvelanetype;
  1786. int j;
  1787. int nlasttype;
  1788. iv::lanetype xlt;
  1789. xlt.s = 0;
  1790. xlt.ntype = 0;
  1791. int nsizelp = mvectorlp[mvectorroadopposite[i]].mvectorlpright.size();
  1792. if(nsizelp > 0)
  1793. {
  1794. xlt.ntype = mvectorlp[mvectorroadopposite[i]].mvectorlpright[nsizelp-1].nLaneType;
  1795. nlasttype = xlt.ntype;
  1796. }
  1797. for(j=(nsizelp-2);j>=0;j--)
  1798. {
  1799. int nlt = mvectorlp[mvectorroadopposite[i]].mvectorlpright[j].nLaneType;
  1800. if((nlt != nlasttype)&&(mvectorlp[mvectorroadopposite[i]].mvectorlpright[j].mfRelS != -1))
  1801. {
  1802. xvelanetype.push_back(xlt);
  1803. xlt.ntype = nlt;
  1804. xlt.s = mvectorlp[mvectorroadopposite[i]].mvectorlpright[j].mfRelS;
  1805. }
  1806. nlasttype = nlt;
  1807. }
  1808. xvelanetype.push_back(xlt);
  1809. xvectoroplanetype.push_back(xvelanetype);
  1810. }
  1811. //Get Lane Mark Width
  1812. std::vector<double> xvectormarkwidth;
  1813. std::vector<double> xvectoravgdis;
  1814. for(i=0;i<xvectordiss.size();i++)
  1815. {
  1816. double fdis = 0;
  1817. int j;
  1818. int ncount = 0;
  1819. for(j=0;j<xvectordiss[i].size();j++)
  1820. {
  1821. if(xvectordiss[i].at(j).mfs != -1)
  1822. {
  1823. fdis = fdis + xvectordiss[i].at(j).mfdis;
  1824. ncount++;
  1825. }
  1826. }
  1827. if(ncount>0)fdis = fdis/ncount;
  1828. xvectoravgdis.push_back(fdis);
  1829. }
  1830. for(i=1;i<mvectorroadlane.size();i++)
  1831. {
  1832. xvectormarkwidth.push_back(xvectoravgdis[mvectorroadlane.size()+i-1] - xvectoravgdis[i-1]);
  1833. }
  1834. std::vector<double> xvectoropmarkwidth;
  1835. std::vector<double> xvectoropavgdis;
  1836. for(i=0;i<xvectoropdiss.size();i++)
  1837. {
  1838. double fdis = 0;
  1839. int j;
  1840. int ncount = 0;
  1841. int nsize = xvectoropdiss[i].size();
  1842. for(j=0;j<nsize;j++)
  1843. {
  1844. if(xvectoropdiss[i].at(j).mfs != -1)
  1845. {
  1846. fdis = fdis + xvectoropdiss[i].at(j).mfdis;
  1847. ncount++;
  1848. }
  1849. }
  1850. if(ncount>0)fdis = fdis/ncount;
  1851. xvectoropavgdis.push_back(fdis);
  1852. }
  1853. if(xvectoropavgdis.size()>0)xvectoropmarkwidth.push_back(xvectoropavgdis[0]);
  1854. for(i=1;i<mvectorroadopposite.size();i++)
  1855. {
  1856. xvectoropmarkwidth.push_back(xvectoropavgdis[i] - xvectoropavgdis[i+mvectorroadopposite.size()-1]);
  1857. }
  1858. //Get Lane Width
  1859. std::vector<std::vector<iv::distogeo>> xvectorlanewidth;
  1860. std::vector<std::vector<iv::distogeo>> xvectoroplanewidth;
  1861. std::vector<iv::distogeo> xlanewidth;
  1862. xlanewidth.clear();
  1863. int j;
  1864. for(j=0;j<xvectordiss[0].size();j++)
  1865. {
  1866. if(xvectordiss[0].at(j).mfs != -1)xlanewidth.push_back(xvectordiss[0].at(j));
  1867. }
  1868. xvectorlanewidth.push_back(xlanewidth);
  1869. for(i=1;i<mvectorroadlane.size();i++)
  1870. {
  1871. xlanewidth.clear();
  1872. for(j=0;j<xvectordiss[i].size();j++)
  1873. {
  1874. if((xvectordiss[i].at(j).mfs!=-1)&&(xvectordiss[i-1+nlanesize].at(j).mfs!=-1))
  1875. {
  1876. iv::distogeo xdisg;
  1877. xdisg = xvectordiss[i].at(j);
  1878. xdisg.mfdis = xdisg.mfdis - xvectordiss[i-1+nlanesize].at(j).mfdis + xvectormarkwidth[i-1];
  1879. xlanewidth.push_back(xdisg);
  1880. }
  1881. }
  1882. xvectorlanewidth.push_back(xlanewidth);
  1883. }
  1884. xlanewidth.clear();
  1885. if(xvectoropmarkwidth.size()>0)
  1886. {
  1887. if(xvectoropmarkwidth[0] > 0.4)
  1888. {
  1889. int nsize = xvectoropdiss[0].size();
  1890. for(j=0;j<nsize;j++)
  1891. {
  1892. if(xvectoropdiss[0].at(j).mfs != -1)xlanewidth.push_back(xvectoropdiss[0].at(j));
  1893. }
  1894. xvectoroplanewidth.push_back(xlanewidth);
  1895. xlanewidth.clear();
  1896. nsize = xvectoropdiss[noplanesize].size();
  1897. for(j=0;j<nsize;j++)
  1898. {
  1899. if((xvectoropdiss[noplanesize].at(j).mfs!=-1)&&(xvectoropdiss[0].at(j).mfs!=-1))
  1900. {
  1901. iv::distogeo xdisg;
  1902. xdisg = xvectoropdiss[noplanesize].at(j);
  1903. xdisg.mfdis = xdisg.mfdis - xvectoropdiss[0].at(j).mfdis ;
  1904. xlanewidth.push_back(xdisg);
  1905. }
  1906. }
  1907. xvectoroplanewidth.push_back(xlanewidth);
  1908. }
  1909. else
  1910. {
  1911. nsize = xvectoropdiss[noplanesize].size();
  1912. for(j=0;j<nsize;j++)
  1913. {
  1914. if((xvectoropdiss[noplanesize].at(j).mfs!=-1)&&(xvectoropdiss[0].at(j).mfs!=-1))
  1915. {
  1916. iv::distogeo xdisg;
  1917. xdisg = xvectoropdiss[noplanesize].at(j);
  1918. xdisg.mfdis = xdisg.mfdis - xvectoropdiss[0].at(j).mfdis + xvectoropmarkwidth[0];
  1919. xlanewidth.push_back(xdisg);
  1920. }
  1921. }
  1922. xvectoroplanewidth.push_back(xlanewidth);
  1923. }
  1924. for(i=1;i<noplanesize;i++)
  1925. {
  1926. xlanewidth.clear();
  1927. nsize = xvectoropdiss[noplanesize+i].size();
  1928. for(j=0;j<nsize;j++)
  1929. {
  1930. if((xvectoropdiss[noplanesize+i].at(j).mfs != -1)&&(xvectoropdiss[i].at(j).mfs != -1))
  1931. {
  1932. iv::distogeo xdisg;
  1933. xdisg = xvectoropdiss[noplanesize+i].at(j);
  1934. xdisg.mfdis = xdisg.mfdis - xvectoropdiss[i].at(j).mfdis + xvectoropmarkwidth[i];
  1935. xlanewidth.push_back(xdisg);
  1936. }
  1937. }
  1938. xvectoroplanewidth.push_back(xlanewidth);
  1939. }
  1940. }
  1941. std::vector<iv::lanecoff> xvectorlanecoff;
  1942. std::vector<iv::lanecoff> xvectoroplanecoff;
  1943. for(i=0;i<nlanesize;i++)
  1944. {
  1945. int N = xvectorlanewidth[i].size();
  1946. VectorXd x_veh(N);
  1947. VectorXd y_veh(N);
  1948. for(j=0;j<N;j++)
  1949. {
  1950. x_veh[j] = xvectorlanewidth[i].at(j).mfs;
  1951. y_veh[j] =xvectorlanewidth[i].at(j).mfdis;
  1952. }
  1953. VectorXd coeffs = polyfit(x_veh, y_veh, 3);
  1954. iv::lanecoff xlanecoff;
  1955. xlanecoff.A = coeffs[0];
  1956. xlanecoff.B = coeffs[1];
  1957. xlanecoff.C = coeffs[2];
  1958. xlanecoff.D = coeffs[3];
  1959. xvectorlanecoff.push_back(xlanecoff);
  1960. }
  1961. for(i=0;i<xvectoroplanewidth.size();i++)
  1962. {
  1963. int N = xvectoroplanewidth[i].size();
  1964. VectorXd x_veh(N);
  1965. VectorXd y_veh(N);
  1966. for(j=0;j<N;j++)
  1967. {
  1968. x_veh[j] = xvectoroplanewidth[i].at(j).mfs;
  1969. y_veh[j] =xvectoroplanewidth[i].at(j).mfdis;
  1970. }
  1971. VectorXd coeffs = polyfit(x_veh, y_veh, 3);
  1972. iv::lanecoff xlanecoff;
  1973. xlanecoff.A = coeffs[0];
  1974. xlanecoff.B = coeffs[1];
  1975. xlanecoff.C = coeffs[2];
  1976. xlanecoff.D = coeffs[3];
  1977. xvectoroplanecoff.push_back(xlanecoff);
  1978. }
  1979. iv::lanecoff xlaneheightcoff;
  1980. int M = mvectorlp[0].mvectorlpleft.size();
  1981. VectorXd x_vehhg(M);
  1982. VectorXd y_vehhg(M);
  1983. for(j=0;j<M;j++)
  1984. {
  1985. x_vehhg[j] = mvectorlp[0].mvectorlpleft.at(j).mfDis;
  1986. y_vehhg[j] =mvectorlp[0].mvectorlpleft.at(j).mfHeight;
  1987. }
  1988. VectorXd coeffs = polyfit(x_vehhg, y_vehhg, 3);
  1989. xlaneheightcoff.A = coeffs[0];
  1990. xlaneheightcoff.B = coeffs[1];
  1991. xlaneheightcoff.C = coeffs[2];
  1992. xlaneheightcoff.D = coeffs[3];
  1993. geofit xgeofit;
  1994. int N = pvectorlp->size();
  1995. VectorXd x_veh(N);
  1996. VectorXd y_veh(N);
  1997. VectorXi t_veh(N);
  1998. double x0,y0;
  1999. GaussProjCal(glon0,glat0,&x0,&y0);
  2000. for(j=0;j<N;j++)
  2001. {
  2002. double x,y;
  2003. GaussProjCal(pvectorlp->at(j).mfLon,pvectorlp->at(j).mfLat,&x,&y);
  2004. x_veh[j] = x - x0;
  2005. y_veh[j] = y - y0;
  2006. t_veh[j] = pntype[j];
  2007. }
  2008. std::vector<geobase> xvectorgeo = xgeofit.getgeo(x_veh,y_veh,t_veh);
  2009. // OpenDrive od;
  2010. // std::string mapx = "map";
  2011. // od.SetHeader(1,1,mapx,1.1,QDateTime::currentDateTime().toString("yyyy-MM-dd").toLatin1().data(),0,0,0,0,glat0,glon0,ghdg0);
  2012. j= 0;
  2013. double xroadlen = 0;
  2014. for(j=0;j<xvectorgeo.size();j++)
  2015. {
  2016. xroadlen = xroadlen + xvectorgeo[j].mfLen;
  2017. }
  2018. mxodr.AddRoad(mpLE_RoadName->text().toLatin1().data(),xroadlen, QString::number(CreateRoadID()).toStdString(),"-1");
  2019. Road * p = mxodr.GetRoad(mxodr.GetRoadCount() - 1);
  2020. p->AddElevation(0,xlaneheightcoff.A,xlaneheightcoff.B,xlaneheightcoff.C,xlaneheightcoff.D);
  2021. double s = 0;
  2022. j= 0;
  2023. // for(j=0;j<4;j++)
  2024. for(j=0;j<xvectorgeo.size();j++)
  2025. {
  2026. p->AddGeometryBlock();
  2027. GeometryBlock * pgb = p->GetGeometryBlock(j);
  2028. geobase * pline;
  2029. geobase * pbez;
  2030. geobase * parc;
  2031. switch(xvectorgeo[j].mnType)
  2032. {
  2033. case 0:
  2034. pline = &xvectorgeo[j];
  2035. pgb->AddGeometryLine(s,pline->mfX,pline->mfY,pline->mfHdg,pline->mfLen);
  2036. break;
  2037. case 1:
  2038. parc = &xvectorgeo[j];
  2039. pgb->AddGeometryArc(s,parc->mfX,parc->mfY,parc->mfHdgStart,parc->mfLen,1.0/parc->mR);
  2040. break;
  2041. case 2:
  2042. pbez = &xvectorgeo[j];
  2043. std::cout<<"u0:"<<pbez->mfu[0]<<std::endl;
  2044. pgb->AddGeometryParamPoly3(s,pbez->mfX,pbez->mfY,
  2045. pbez->mfHdg,pbez->mfLen,pbez->mfu[0],
  2046. pbez->mfu[1],pbez->mfu[2],pbez->mfu[3],pbez->mfv[0],
  2047. pbez->mfv[1],pbez->mfv[2],pbez->mfv[3]);
  2048. break;
  2049. }
  2050. s = s + xvectorgeo[j].mfLen;
  2051. }
  2052. p->AddLaneSection(0);
  2053. LaneSection * pLS = p->GetLaneSection(0);
  2054. Lane * pLL;
  2055. pLS->SetS(0);
  2056. pLS->AddLane(0,0,"none",false);
  2057. pLL = pLS->GetLane(0);
  2058. if(noplanesize != xvectoroplanewidth.size())
  2059. {
  2060. pLL->AddRoadMarkRecord(0,"solid","standard","standard",0.15,"false");
  2061. }
  2062. for(i=0;i<nlanesize;i++)
  2063. {
  2064. pLS->AddLane(-1,(i+1)*(-1),"driving",false,false);
  2065. pLL = pLS->GetLane(pLS->GetLaneCount() - 1);
  2066. pLL->AddWidthRecord(0,xvectorlanecoff[i].A,xvectorlanecoff[i].B,
  2067. xvectorlanecoff[i].C,xvectorlanecoff[i].D);
  2068. int j;
  2069. for(j=0;j<xvevelanetype[i].size();j++)
  2070. {
  2071. std::string strlanetype = "broken";
  2072. if(xvevelanetype[i].at(j).ntype != 0)
  2073. {
  2074. strlanetype = "solid";
  2075. }
  2076. pLL->AddRoadMarkRecord(xvevelanetype[i].at(j).s,strlanetype,"standard","standard",0.15,"false");
  2077. }
  2078. }
  2079. for(i=0;i<xvectoroplanewidth.size();i++)
  2080. {
  2081. pLS->AddLane(1,(i+1)*(1),"driving",false,false);
  2082. pLL = pLS->GetLane(pLS->GetLaneCount() - 1);
  2083. if((i==0)&&(noplanesize != xvectoroplanewidth.size()))
  2084. {
  2085. pLL->SetType("shoulder");
  2086. pLL->AddRoadMarkRecord(0,"solid","standard","standard",0.15,"false");
  2087. }
  2088. pLL->AddWidthRecord(0,xvectoroplanecoff[i].A,xvectoroplanecoff[i].B,
  2089. xvectoroplanecoff[i].C,xvectoroplanecoff[i].D);
  2090. int j;
  2091. int index = i;
  2092. if((i==0)&&(noplanesize != xvectoroplanewidth.size()))
  2093. {
  2094. continue;
  2095. }
  2096. if(noplanesize != xvectoroplanewidth.size())
  2097. {
  2098. index = i-1;
  2099. }
  2100. else
  2101. index = i;
  2102. for(j=0;j<xvectoroplanetype[index].size();j++)
  2103. {
  2104. std::string strlanetype = "broken";
  2105. if(xvectoroplanetype[index].at(j).ntype != 0)
  2106. {
  2107. strlanetype = "solid";
  2108. }
  2109. pLL->AddRoadMarkRecord(xvectoroplanetype[index].at(j).s,strlanetype,"standard","standard",0.15,"false");
  2110. }
  2111. }
  2112. mpCBSelLane->clear();
  2113. mpCBSelOpLane->clear();
  2114. mvectorroadlane.clear();
  2115. mvectorroadopposite.clear();
  2116. updateCBRoad();
  2117. mbRefresh = true;
  2118. update();
  2119. // OpenDriveXmlWriter x(&mxodr);
  2120. // x.WriteFile("/home/nvidia/text.xodr");
  2121. }
  2122. int MainWindow::CreateRoadID(int ntype)
  2123. {
  2124. int i;
  2125. bool bUsed = false;
  2126. int nroadidstart = 10000;
  2127. if(ntype == 1) //not create by lane roaid
  2128. {
  2129. nroadidstart = 20000;
  2130. }
  2131. int nroadcount = mxodr.GetRoadCount();
  2132. if(nroadcount == 0)return nroadidstart;
  2133. int * proadid = new int[nroadcount];
  2134. for(i=0;i<nroadcount;i++)
  2135. {
  2136. proadid[i]=atoi(mxodr.GetRoad(i)->GetRoadId().data());
  2137. }
  2138. do
  2139. {
  2140. bUsed = false;
  2141. for(i=0;i<nroadcount;i++)
  2142. {
  2143. if(proadid[i] == nroadidstart)
  2144. {
  2145. nroadidstart++;
  2146. bUsed = true;
  2147. }
  2148. }
  2149. }while(bUsed);
  2150. delete proadid;
  2151. return nroadidstart;
  2152. }
  2153. int MainWindow::CreateJunctionID()
  2154. {
  2155. int i;
  2156. bool bUsed = false;
  2157. int njunctionidstart = 800000;
  2158. int njunctioncount = mxodr.GetJunctionCount();
  2159. if(njunctioncount == 0)return njunctionidstart;
  2160. int * pjunctionid = new int[njunctioncount];
  2161. for(i=0;i<njunctioncount;i++)
  2162. {
  2163. pjunctionid[i]=atoi(mxodr.GetJunction(i)->GetId().data());
  2164. }
  2165. do
  2166. {
  2167. bUsed = false;
  2168. for(i=0;i<njunctioncount;i++)
  2169. {
  2170. if(pjunctionid[i] == njunctionidstart)
  2171. {
  2172. njunctionidstart++;
  2173. bUsed = true;
  2174. }
  2175. }
  2176. }while(bUsed);
  2177. delete pjunctionid;
  2178. return njunctionidstart;
  2179. }
  2180. void MainWindow::onClickLoad()
  2181. {
  2182. QString str = QFileDialog::getOpenFileName(this,"Load XODR",".","*.xodr");
  2183. if(str.isEmpty())return;
  2184. OpenDrive * pxodr = new OpenDrive(); //because add to xodr,so don't delete
  2185. OpenDriveXmlParser x(pxodr);
  2186. if(!x.ReadFile(str.toStdString()))
  2187. {
  2188. QMessageBox::warning(this,"warn","Can't load xodr file.");
  2189. return;
  2190. }
  2191. bool bNeedMove = false;
  2192. bool bNeedAjustID = false;
  2193. unsigned short int revMajor,revMinor;
  2194. std::string name,date;
  2195. float version;
  2196. double north,south,east,west,lat0,lon0,hdg0;
  2197. if(pxodr->GetHeader() != 0)
  2198. {
  2199. pxodr->GetHeader()->GetAllParams(revMajor,revMinor,name,version,date,north,south,east,west,lat0,lon0,hdg0);
  2200. }
  2201. double xMoveX = 0;
  2202. double xMoveY = 0;
  2203. if(mxodr.GetRoadCount() > 0)
  2204. {
  2205. bNeedAjustID = true;
  2206. }
  2207. if(mbSetOrigin == false)
  2208. {
  2209. bNeedMove = false;
  2210. glat0 = lat0;
  2211. glon0 = lon0;
  2212. mpLELon0->setText(QString::number(glon0,'f',7));
  2213. mpLELat0->setText(QString::number(glat0,'f',7));
  2214. mbSetOrigin = true;
  2215. }
  2216. else
  2217. {
  2218. if((glat0 == lat0)&&(glon0 == lon0))
  2219. {
  2220. bNeedMove = false;
  2221. }
  2222. else
  2223. {
  2224. bNeedMove = true;
  2225. double x0,y0,x1,y1;
  2226. GaussProjCal(glon0,glat0,&x0,&y0);
  2227. GaussProjCal(lon0,lat0,&x1,&y1);
  2228. xMoveX = x1 - x0;
  2229. xMoveY = y1 - y0;
  2230. }
  2231. }
  2232. if(bNeedMove)
  2233. {
  2234. MoveXODR(pxodr,xMoveX,xMoveY);
  2235. }
  2236. int noldroadcount = mxodr.GetRoadCount();
  2237. int noldjunctioncount = mxodr.GetJunctionCount();
  2238. int nnewcount = pxodr->GetRoadCount();
  2239. int nnewjunctioncount = pxodr->GetJunctionCount();
  2240. int i;
  2241. if(bNeedAjustID)
  2242. {
  2243. for(i=0;i<nnewcount;i++)
  2244. {
  2245. int nid = atoi(pxodr->GetRoad(i)->GetRoadId().data());
  2246. int j;
  2247. bool bNeedChange = false;
  2248. for(j=0;j<noldroadcount;j++)
  2249. {
  2250. if(nid == atoi(mxodr.GetRoad(j)->GetRoadId().data()))
  2251. {
  2252. bNeedChange = true;
  2253. break;
  2254. }
  2255. }
  2256. if(bNeedChange)
  2257. {
  2258. int nnewid = FindNewRoadID(&mxodr,pxodr);
  2259. ChangeXODRRoadID(pxodr,i,nnewid);
  2260. }
  2261. }
  2262. for(i=0;i<nnewjunctioncount;i++)
  2263. {
  2264. int nid = atoi(pxodr->GetJunction(i)->GetId().data());
  2265. int j;
  2266. bool bNeedChange = false;
  2267. for(j=0;j<noldjunctioncount;j++)
  2268. {
  2269. if(nid == atoi(mxodr.GetJunction(j)->GetId().data()))
  2270. {
  2271. bNeedChange = true;
  2272. break;
  2273. }
  2274. }
  2275. if(bNeedChange)
  2276. {
  2277. int nnewid = FindNewJunctionID(&mxodr,pxodr);
  2278. ChangeXODRJunctionID(pxodr,i,nnewid);
  2279. }
  2280. }
  2281. }
  2282. for(i=0;i<nnewcount;i++)
  2283. {
  2284. mxodr.GetRoadVector()->push_back(pxodr->GetRoadVector()->at(i));
  2285. // OpenDrive * px = &mxodr;
  2286. }
  2287. for(i=0;i<nnewjunctioncount;i++)
  2288. {
  2289. mxodr.GetJunctionVector()->push_back(pxodr->GetJunctionVector()->at(i));
  2290. }
  2291. // mpscene->update();
  2292. updateCBRoad();
  2293. updateJunction();
  2294. updateView();
  2295. // mbRefresh = true;
  2296. // update();
  2297. }
  2298. void MainWindow::onClickSave()
  2299. {
  2300. QString str = QFileDialog::getSaveFileName(this,"Save XODR",".","*.xodr");
  2301. if(str.isEmpty())return;
  2302. if(str.indexOf(".xodr")<0)str = str + ".xodr";
  2303. mxodr.SetHeader(1,1,"adcmap",1.1,QDateTime::currentDateTime().toString("yyyy-MM-dd").toLatin1().data(),0,0,0,0,glat0,glon0,ghdg0);
  2304. OpenDriveXmlWriter x(&mxodr);
  2305. x.WriteFile(str.toStdString());
  2306. }
  2307. void MainWindow::onClickRoadContact()
  2308. {
  2309. int ch1,ch2;
  2310. ch1 = mpCBRoad1->currentIndex();
  2311. ch2 = mpCBRoad2->currentIndex();
  2312. if((ch1 == -1)||(ch2 == -1))
  2313. {
  2314. return;
  2315. }
  2316. // if(ch1 == ch2)
  2317. // {
  2318. // QMessageBox::warning(this,"warn","road same");
  2319. // return;
  2320. // }
  2321. int ntype1,ntype2;
  2322. ntype1 = mpCBRC1->currentIndex();
  2323. ntype2 = mpCBRC2->currentIndex();
  2324. Road * p1 = mxodr.GetRoad(ch1);
  2325. Road * p2 = mxodr.GetRoad(ch2);
  2326. iv::roadcontact rc;
  2327. rc.mnroad1id = atoi(p1->GetRoadId().data());
  2328. rc.mnroad2id = atoi(p2->GetRoadId().data());
  2329. rc.mncon1 = ntype1;
  2330. rc.mncon2 = ntype2;
  2331. char strname[256];
  2332. snprintf(strname,256,"%s_%s_%s_%s",p1->GetRoadId().data(),mpCBRC1->currentText().toLatin1().data(),
  2333. p2->GetRoadId().data(),mpCBRC2->currentText().toLatin1().data());
  2334. mpCBRoadCon->clear();
  2335. mpCBRoadCon->addItem(strname);
  2336. mpCBLane1->clear();
  2337. mpCBLane2->clear();
  2338. mpCBLane1Lane2->clear();
  2339. mpCBLane1Lane2op->clear();
  2340. if(p1->GetLaneSectionCount()>0)
  2341. {
  2342. LaneSection * pLS;
  2343. if(ntype1 == 0)
  2344. pLS = p1->GetLaneSection(0);
  2345. else
  2346. pLS = p1->GetLaneSection(p1->GetLaneSectionCount()-1);
  2347. int i;
  2348. for(i=0;i<pLS->GetLaneCount();i++)
  2349. {
  2350. Lane * pL = pLS->GetLane(i);
  2351. // if((pL->GetId() != 0)&&(strncmp(pL->GetType().data(),"driving",255)==0))
  2352. if(pL->GetId() != 0)
  2353. mpCBLane1->addItem(QString::number(pL->GetId()));
  2354. }
  2355. }
  2356. if(p2->GetLaneSectionCount()>0)
  2357. {
  2358. LaneSection * pLS;
  2359. if(ntype1 == 0)
  2360. pLS = p2->GetLaneSection(0);
  2361. else
  2362. pLS = p2->GetLaneSection(p1->GetLaneSectionCount()-1);
  2363. int i;
  2364. for(i=0;i<pLS->GetLaneCount();i++)
  2365. {
  2366. Lane * pL = pLS->GetLane(i);
  2367. // if((pL->GetId() != 0)&&(strncmp(pL->GetType().data(),"driving",255)==0))
  2368. if(pL->GetId() != 0)
  2369. mpCBLane2->addItem(QString::number(pL->GetId()));
  2370. }
  2371. }
  2372. mvectorrc.clear();
  2373. mvectorrc.push_back(rc);
  2374. }
  2375. void MainWindow::onClickLaneContact()
  2376. {
  2377. int n1,n2;
  2378. n1 = mpCBLane1->currentText().toInt();
  2379. n2 = mpCBLane2->currentText().toInt();
  2380. iv::lanecontact xlc;
  2381. xlc.ml1 = n1;
  2382. xlc.ml2 = n2;
  2383. if(mvectorrc.size() < 1)return;
  2384. mvectorrc[0].mvectorlc.push_back(xlc);
  2385. char strname[256];
  2386. snprintf(strname,255,"%dto%d",n1,n2);
  2387. mpCBLane1Lane2->addItem(strname);
  2388. }
  2389. void MainWindow::onClickOpLaneContact()
  2390. {
  2391. int n1,n2;
  2392. n1 = mpCBLane1->currentText().toInt();
  2393. n2 = mpCBLane2->currentText().toInt();
  2394. iv::lanecontact xlc;
  2395. xlc.ml1 = n1;
  2396. xlc.ml2 = n2;
  2397. if(mvectorrc.size() < 1)return;
  2398. mvectorrc[0].mvectorlcop.push_back(xlc);
  2399. char strname[256];
  2400. snprintf(strname,255,"%dto%d",n1,n2);
  2401. mpCBLane1Lane2op->addItem(strname);
  2402. }
  2403. void MainWindow::onClickCreateRoad()
  2404. {
  2405. if(mvectorrc.size()<1)return;
  2406. Road * p1, *p2;
  2407. int nroad1index;
  2408. int nroad2index;
  2409. // p1 = mvectorrc[0].mp1;
  2410. // p2 = mvectorrc[0].mp2;
  2411. int i;
  2412. bool bhavep1 = false;
  2413. bool bhavep2 = false;
  2414. for(i=0;i<mxodr.GetRoadCount();i++)
  2415. {
  2416. if(mvectorrc[0].mnroad1id == atoi(mxodr.GetRoad(i)->GetRoadId().data()))
  2417. {
  2418. bhavep1 = true;
  2419. p1 = mxodr.GetRoad(i);
  2420. nroad1index = i;
  2421. break;
  2422. }
  2423. }
  2424. if(bhavep1 == false)
  2425. {
  2426. QMessageBox::warning(this,"Warn","Road not found.");
  2427. return;
  2428. }
  2429. double off1,off2;
  2430. for(i=0;i<mxodr.GetRoadCount();i++)
  2431. {
  2432. if(mvectorrc[0].mnroad2id == atoi(mxodr.GetRoad(i)->GetRoadId().data()))
  2433. {
  2434. bhavep2 = true;
  2435. p2 = mxodr.GetRoad(i);
  2436. nroad2index = i;
  2437. break;
  2438. }
  2439. }
  2440. if(bhavep2 == false)
  2441. {
  2442. QMessageBox::warning(this,"Warn","Road not found.");
  2443. return;
  2444. }
  2445. if(mvectorrc[0].mvectorlc.size()<1)
  2446. {
  2447. QMessageBox::warning(this,"warn","No Lane Contact.");
  2448. return;
  2449. }
  2450. double startx,starty,starthdg;
  2451. double endx,endy,endhdg;
  2452. double startheight,endheight;
  2453. bool bFromstart,bTostart;
  2454. if(mvectorrc[0].mncon1 == 0)
  2455. {
  2456. bFromstart = true;
  2457. starthdg = p1->GetGeometryBlock(0)->GetGeometryAt(0)->GetHdg();
  2458. off1 = getoff(p1,mvectorrc[0].mvectorlc[0].ml1,true);
  2459. startx = p1->GetGeometryBlock(0)->GetGeometryAt(0)->GetX();
  2460. starty = p1->GetGeometryBlock(0)->GetGeometryAt(0)->GetY();
  2461. startx = startx + off1 * cos(starthdg -M_PI/2.0);
  2462. starty = starty + off1 * sin(starthdg -M_PI/2.0);
  2463. startheight = 0;
  2464. if(p1->GetElevationCount()>0)
  2465. {
  2466. startheight = p1->GetElevation(0)->GetA();
  2467. }
  2468. // if(mvectorrc[0].mvectorlc[0].ml1<0)
  2469. starthdg = starthdg +M_PI;if(starthdg >=2.0*M_PI)starthdg = starthdg -2.0*M_PI;
  2470. }
  2471. else
  2472. {
  2473. bFromstart = false;
  2474. if(GetEndPoint(p1,startx,starty,starthdg) != 0)
  2475. {
  2476. QMessageBox::warning(this,"warn","get start error.");
  2477. return;
  2478. }
  2479. off1 = getoff(p1,mvectorrc[0].mvectorlc[0].ml1,false);
  2480. startx = startx + off1 * cos(starthdg -M_PI/2.0);
  2481. starty = starty + off1 * sin(starthdg -M_PI/2.0);
  2482. startheight = 0;
  2483. if(p1->GetElevationCount()>0)
  2484. {
  2485. startheight = p1->GetElevation(0)->GetA()
  2486. +p1->GetElevation(0)->GetB() * pow(p1->GetRoadLength(),1)
  2487. +p1->GetElevation(0)->GetC() * pow(p1->GetRoadLength(),2)
  2488. +p1->GetElevation(0)->GetD() * pow(p1->GetRoadLength(),3);
  2489. }
  2490. }
  2491. if(mvectorrc[0].mncon2 == 0)
  2492. {
  2493. bTostart = true;
  2494. off2 = getoff(p2,mvectorrc[0].mvectorlc[0].ml2,true);
  2495. endx = p2->GetGeometryBlock(0)->GetGeometryAt(0)->GetX();
  2496. endy = p2->GetGeometryBlock(0)->GetGeometryAt(0)->GetY();
  2497. endhdg = p2->GetGeometryBlock(0)->GetGeometryAt(0)->GetHdg();
  2498. endx = endx + off2 * cos(endhdg -M_PI/2.0);
  2499. endy = endy + off2 * sin(endhdg -M_PI/2.0);
  2500. endheight = 0;
  2501. if(p2->GetElevationCount()>0)
  2502. {
  2503. endheight = p2->GetElevation(0)->GetA();
  2504. }
  2505. }
  2506. else
  2507. {
  2508. bTostart = false;
  2509. off2 = getoff(p2,mvectorrc[0].mvectorlc[0].ml2,false);
  2510. if(GetEndPoint(p2,endx,endy,endhdg) != 0)
  2511. {
  2512. QMessageBox::warning(this,"warn","get end error.");
  2513. return;
  2514. }
  2515. endx = endx + off2 * cos(endhdg -M_PI/2.0);
  2516. endy = endy + off2 * sin(endhdg -M_PI/2.0);
  2517. endhdg = endhdg +M_PI;if(endhdg >=2.0*M_PI)endhdg = endhdg -2.0*M_PI;
  2518. endheight = 0;
  2519. if(p2->GetElevationCount()>0)
  2520. {
  2521. endheight = p2->GetElevation(0)->GetA()
  2522. +p2->GetElevation(0)->GetB() * pow(p2->GetRoadLength(),1)
  2523. +p2->GetElevation(0)->GetC() * pow(p2->GetRoadLength(),2)
  2524. +p2->GetElevation(0)->GetD() * pow(p2->GetRoadLength(),3);
  2525. }
  2526. }
  2527. //Create Geo
  2528. double R = mpLERoadType->text().toDouble();
  2529. std::vector<geobase> xvectorgeo;
  2530. std::vector<geobase> xvectorgeo1,xvectorgeo2;
  2531. switch(mpCBRoadType->currentIndex())
  2532. {
  2533. case 0:
  2534. xvectorgeo = CreateTurnGeo(startx,starty,starthdg,endx,endy,endhdg,R);
  2535. break;
  2536. case 1:
  2537. xvectorgeo = CreateLineGeo(startx,starty,starthdg,endx,endy,endhdg);
  2538. break;
  2539. case 2:
  2540. xvectorgeo = CreateUTurnGeo(startx,starty,starthdg,endx,endy,endhdg,R);
  2541. break;
  2542. default:
  2543. break;
  2544. }
  2545. if(mpCBRoadType->currentIndex() == 2)
  2546. {
  2547. for(i=0;i<xvectorgeo.size()/2;i++)
  2548. {
  2549. xvectorgeo1.push_back(xvectorgeo.at(i));
  2550. }
  2551. for(i=xvectorgeo.size()/2;i<xvectorgeo.size();i++)
  2552. {
  2553. xvectorgeo2.push_back(xvectorgeo.at(i));
  2554. }
  2555. }
  2556. if(xvectorgeo.size() == 0)
  2557. {
  2558. QMessageBox::warning(this,"warn","Create Road Fail.");
  2559. return;
  2560. }
  2561. double xroadlen = 0;
  2562. if(mpCBRoadType->currentIndex() != 2)
  2563. {
  2564. for(i=0;i<xvectorgeo.size();i++)xroadlen = xroadlen + xvectorgeo[i].mfLen;
  2565. mxodr.AddRoad("",xroadlen, QString::number(CreateRoadID()).toStdString(),"-1");
  2566. Road * p = mxodr.GetRoad(mxodr.GetRoadCount() - 1);
  2567. p->AddElevation(0,startheight,(endheight-startheight)/xroadlen,0,0);
  2568. p1 = mxodr.GetRoad(nroad1index);
  2569. p2 = mxodr.GetRoad(nroad2index);
  2570. double s = 0;
  2571. int j;
  2572. j= 0;
  2573. for(j=0;j<xvectorgeo.size();j++)
  2574. {
  2575. p->AddGeometryBlock();
  2576. GeometryBlock * pgb = p->GetGeometryBlock(j);
  2577. geobase * pline;
  2578. geobase * pbez;
  2579. geobase * parc;
  2580. switch(xvectorgeo[j].mnType)
  2581. {
  2582. case 0:
  2583. pline = &xvectorgeo[j];
  2584. pgb->AddGeometryLine(s,pline->mfX,pline->mfY,pline->mfHdg,pline->mfLen);
  2585. break;
  2586. case 1:
  2587. parc = &xvectorgeo[j];
  2588. pgb->AddGeometryArc(s,parc->mfX,parc->mfY,parc->mfHdgStart,parc->mfLen,1.0/parc->mR);
  2589. break;
  2590. case 2:
  2591. pbez = &xvectorgeo[j];
  2592. std::cout<<"u0:"<<pbez->mfu[0]<<std::endl;
  2593. pgb->AddGeometryParamPoly3(s,pbez->mfX,pbez->mfY,
  2594. pbez->mfHdg,pbez->mfLen,pbez->mfu[0],
  2595. pbez->mfu[1],pbez->mfu[2],pbez->mfu[3],pbez->mfv[0],
  2596. pbez->mfv[1],pbez->mfv[2],pbez->mfv[3]);
  2597. break;
  2598. }
  2599. s = s + xvectorgeo[j].mfLen;
  2600. }
  2601. p->AddLaneSection(0);
  2602. LaneSection * pLS = p->GetLaneSection(0);
  2603. pLS->SetS(0);
  2604. pLS->AddLane(0,0,"none",false);
  2605. double * pswidth,*pewidth;
  2606. std::vector<std::string> strvectorlanetype;
  2607. int nlanecount = mvectorrc[0].mvectorlc.size();
  2608. pswidth = new double[nlanecount];
  2609. pewidth = new double[nlanecount];
  2610. std::shared_ptr<double> ppswidth,ppewidth;
  2611. ppswidth.reset(pswidth);
  2612. ppewidth.reset(pewidth);
  2613. for(i=0;i<nlanecount;i++)
  2614. {
  2615. pswidth[i] = getlanewidth(p1,mvectorrc[0].mvectorlc.at(i).ml1,bFromstart);
  2616. strvectorlanetype.push_back(getlanetype(p1,mvectorrc[0].mvectorlc.at(i).ml1,bFromstart));
  2617. }
  2618. for(i=0;i<nlanecount;i++)
  2619. {
  2620. pewidth[i] = getlanewidth(p2,mvectorrc[0].mvectorlc.at(i).ml2,bTostart);
  2621. }
  2622. double * pa,*pb;
  2623. pa = new double[nlanecount];
  2624. pb = new double[nlanecount];
  2625. std::shared_ptr<double> ppa,ppb;
  2626. ppa.reset(pa);
  2627. ppb.reset(pb);
  2628. for(i=0;i<nlanecount;i++)
  2629. {
  2630. pa[i] = pswidth[i];
  2631. pb[i] = (pewidth[i] - pa[i])/xroadlen;
  2632. }
  2633. for(i=0;i<nlanecount;i++)
  2634. {
  2635. pLS->AddLane(-1,(i+1)*(-1),strvectorlanetype[i],false,false);
  2636. Lane * pLL = pLS->GetLane(pLS->GetLaneCount() - 1);
  2637. pLL->AddWidthRecord(0,pa[i],pb[i],
  2638. 0,0);
  2639. pLL->AddRoadMarkRecord(0,"solid","standard","standard",0.15,"false");
  2640. }
  2641. int noplanecount = mvectorrc[0].mvectorlcop.size();
  2642. if(noplanecount > 0)
  2643. {
  2644. pswidth = new double[noplanecount];
  2645. pewidth = new double[noplanecount];
  2646. ppswidth.reset(pswidth);
  2647. ppewidth.reset(pewidth);
  2648. strvectorlanetype.clear();
  2649. for(i=0;i<noplanecount;i++)
  2650. {
  2651. pswidth[i] = getlanewidth(p1,mvectorrc[0].mvectorlcop.at(i).ml1,bFromstart);
  2652. strvectorlanetype.push_back(getlanetype(p1,mvectorrc[0].mvectorlcop.at(i).ml1,bFromstart));
  2653. }
  2654. for(i=0;i<noplanecount;i++)
  2655. {
  2656. pewidth[i] = getlanewidth(p2,mvectorrc[0].mvectorlcop.at(i).ml2,bTostart);
  2657. }
  2658. pa = new double[noplanecount];
  2659. pb = new double[noplanecount];
  2660. ppa.reset(pa);
  2661. ppb.reset(pb);
  2662. for(i=0;i<noplanecount;i++)
  2663. {
  2664. pa[i] = pswidth[i];
  2665. pb[i] = (pewidth[i] - pa[i])/xroadlen;
  2666. }
  2667. for(i=0;i<noplanecount;i++)
  2668. {
  2669. pLS->AddLane(1,(i+1),strvectorlanetype[i],false,false);
  2670. Lane * pLL = pLS->GetLane(pLS->GetLaneCount() - 1);
  2671. pLL->AddWidthRecord(0,pa[i],pb[i],
  2672. 0,0);
  2673. pLL->AddRoadMarkRecord(0,"solid","standard","standard",0.15,"false");
  2674. }
  2675. }
  2676. }
  2677. else
  2678. {
  2679. double xroadlen1 = 0;
  2680. double xroadlen2 = 0;
  2681. for(i=0;i<xvectorgeo1.size();i++)xroadlen1 = xroadlen1 + xvectorgeo1[i].mfLen;
  2682. for(i=0;i<xvectorgeo2.size();i++)xroadlen2 = xroadlen2 + xvectorgeo2[i].mfLen;
  2683. int index1 = mxodr.AddRoad("",xroadlen1, QString::number(CreateRoadID()).toStdString(),"-1");
  2684. int index2 = mxodr.AddRoad("",xroadlen2, QString::number(CreateRoadID()).toStdString(),"-1");
  2685. Road * proad2 = mxodr.GetRoad(index2);
  2686. Road * proad1 = mxodr.GetRoad(index1);
  2687. proad1->AddElevation(0,startheight,(endheight-startheight)/(xroadlen1+xroadlen2),0,0);
  2688. proad2->AddElevation(0,startheight+xroadlen1*(endheight-startheight)/(xroadlen1+xroadlen2),
  2689. (endheight-startheight)/(xroadlen1+xroadlen2),
  2690. 0,0);
  2691. p1 = mxodr.GetRoad(nroad1index);
  2692. p2 = mxodr.GetRoad(nroad2index);
  2693. // OpenDrive * px = &mxodr;
  2694. double s = 0;
  2695. int j;
  2696. j= 0;
  2697. for(j=0;j<xvectorgeo1.size();j++)
  2698. {
  2699. proad1->AddGeometryBlock();
  2700. GeometryBlock * pgb = proad1->GetGeometryBlock(j);
  2701. geobase * pline;
  2702. geobase * pbez;
  2703. geobase * parc;
  2704. switch(xvectorgeo1[j].mnType)
  2705. {
  2706. case 0:
  2707. pline = &xvectorgeo1[j];
  2708. pgb->AddGeometryLine(s,pline->mfX,pline->mfY,pline->mfHdg,pline->mfLen);
  2709. break;
  2710. case 1:
  2711. parc = &xvectorgeo1[j];
  2712. pgb->AddGeometryArc(s,parc->mfX,parc->mfY,parc->mfHdgStart,parc->mfLen,1.0/parc->mR);
  2713. break;
  2714. case 2:
  2715. pbez = &xvectorgeo1[j];
  2716. std::cout<<"u0:"<<pbez->mfu[0]<<std::endl;
  2717. pgb->AddGeometryParamPoly3(s,pbez->mfX,pbez->mfY,
  2718. pbez->mfHdg,pbez->mfLen,pbez->mfu[0],
  2719. pbez->mfu[1],pbez->mfu[2],pbez->mfu[3],pbez->mfv[0],
  2720. pbez->mfv[1],pbez->mfv[2],pbez->mfv[3]);
  2721. break;
  2722. }
  2723. s = s + xvectorgeo1[j].mfLen;
  2724. }
  2725. for(j=0;j<xvectorgeo2.size();j++)
  2726. {
  2727. proad2->AddGeometryBlock();
  2728. GeometryBlock * pgb = proad2->GetGeometryBlock(j);
  2729. geobase * pline;
  2730. geobase * pbez;
  2731. geobase * parc;
  2732. switch(xvectorgeo2[j].mnType)
  2733. {
  2734. case 0:
  2735. pline = &xvectorgeo2[j];
  2736. pgb->AddGeometryLine(s,pline->mfX,pline->mfY,pline->mfHdg,pline->mfLen);
  2737. break;
  2738. case 1:
  2739. parc = &xvectorgeo2[j];
  2740. pgb->AddGeometryArc(s,parc->mfX,parc->mfY,parc->mfHdgStart,parc->mfLen,1.0/parc->mR);
  2741. break;
  2742. case 2:
  2743. pbez = &xvectorgeo2[j];
  2744. std::cout<<"u0:"<<pbez->mfu[0]<<std::endl;
  2745. pgb->AddGeometryParamPoly3(s,pbez->mfX,pbez->mfY,
  2746. pbez->mfHdg,pbez->mfLen,pbez->mfu[0],
  2747. pbez->mfu[1],pbez->mfu[2],pbez->mfu[3],pbez->mfv[0],
  2748. pbez->mfv[1],pbez->mfv[2],pbez->mfv[3]);
  2749. break;
  2750. }
  2751. s = s + xvectorgeo2[j].mfLen;
  2752. }
  2753. proad1->AddLaneSection(0);
  2754. LaneSection * pLS1 = proad1->GetLaneSection(0);
  2755. pLS1->SetS(0);
  2756. pLS1->AddLane(0,0,"none",false);
  2757. proad2->AddLaneSection(0);
  2758. LaneSection * pLS2 = proad2->GetLaneSection(0);
  2759. pLS2->SetS(0);
  2760. pLS2->AddLane(0,0,"none",false);
  2761. double * pswidth,*pewidth;
  2762. int nlanecount = mvectorrc[0].mvectorlc.size();
  2763. std::vector<std::string> strvectorlanetype;
  2764. pswidth = new double[nlanecount];
  2765. pewidth = new double[nlanecount];
  2766. std::shared_ptr<double> ppswidth,ppewidth;
  2767. ppswidth.reset(pswidth);
  2768. ppewidth.reset(pewidth);
  2769. for(i=0;i<nlanecount;i++)
  2770. {
  2771. pswidth[i] = getlanewidth(p1,mvectorrc[0].mvectorlc.at(i).ml1,bFromstart);
  2772. strvectorlanetype.push_back(getlanetype(p1,mvectorrc[0].mvectorlc.at(i).ml1,bFromstart));
  2773. }
  2774. for(i=0;i<nlanecount;i++)
  2775. {
  2776. pewidth[i] = getlanewidth(p2,mvectorrc[0].mvectorlc.at(i).ml2,bTostart);
  2777. }
  2778. double * pa,*pb;
  2779. pa = new double[nlanecount];
  2780. pb = new double[nlanecount];
  2781. std::shared_ptr<double> ppa,ppb;
  2782. ppa.reset(pa);
  2783. ppb.reset(pb);
  2784. for(i=0;i<nlanecount;i++)
  2785. {
  2786. pa[i] = pswidth[i];
  2787. pb[i] = (pewidth[i] - pa[i])/(xroadlen1+xroadlen2);
  2788. }
  2789. for(i=0;i<nlanecount;i++)
  2790. {
  2791. pLS1->AddLane(-1,(i+1)*(-1),strvectorlanetype[i],false,false);
  2792. Lane * pLL = pLS1->GetLane(pLS1->GetLaneCount() - 1);
  2793. pLL->AddWidthRecord(0,pa[i],pb[i],
  2794. 0,0);
  2795. pLL->AddRoadMarkRecord(0,"solid","standard","standard",0.15,"false");
  2796. pLS2->AddLane(-1,(i+1)*(-1),strvectorlanetype[i],false,false);
  2797. pLL = pLS2->GetLane(pLS2->GetLaneCount() - 1);
  2798. pLL->AddWidthRecord(0,pa[i]+pb[i]*xroadlen1 ,pb[i],
  2799. 0,0);
  2800. pLL->AddRoadMarkRecord(0,"solid","standard","standard",0.15,"false");
  2801. }
  2802. int noplanecount = mvectorrc[0].mvectorlcop.size();
  2803. if(noplanecount > 0)
  2804. {
  2805. pswidth = new double[noplanecount];
  2806. pewidth = new double[noplanecount];
  2807. ppswidth.reset(pswidth);
  2808. ppewidth.reset(pewidth);
  2809. strvectorlanetype.clear();
  2810. for(i=0;i<noplanecount;i++)
  2811. {
  2812. pswidth[i] = getlanewidth(p1,mvectorrc[0].mvectorlcop.at(i).ml1,bFromstart);
  2813. strvectorlanetype.push_back(getlanetype(p1,mvectorrc[0].mvectorlcop.at(i).ml1,bFromstart));
  2814. }
  2815. for(i=0;i<noplanecount;i++)
  2816. {
  2817. pewidth[i] = getlanewidth(p2,mvectorrc[0].mvectorlcop.at(i).ml2,bTostart);
  2818. }
  2819. pa = new double[noplanecount];
  2820. pb = new double[noplanecount];
  2821. ppa.reset(pa);
  2822. ppb.reset(pb);
  2823. for(i=0;i<noplanecount;i++)
  2824. {
  2825. pa[i] = pswidth[i];
  2826. pb[i] = (pewidth[i] - pa[i])/xroadlen;
  2827. }
  2828. for(i=0;i<noplanecount;i++)
  2829. {
  2830. pLS1->AddLane(1,(i+1),strvectorlanetype[i],false,false);
  2831. Lane * pLL = pLS1->GetLane(pLS1->GetLaneCount() - 1);
  2832. pLL->AddWidthRecord(0,pa[i],pb[i],
  2833. 0,0);
  2834. pLL->AddRoadMarkRecord(0,"solid","standard","standard",0.15,"false");
  2835. pLS2->AddLane(1,(i+1),strvectorlanetype[i],false,false);
  2836. pLL = pLS2->GetLane(pLS2->GetLaneCount() - 1);
  2837. pLL->AddWidthRecord(0,pa[i]+pb[i]*xroadlen1 ,pb[i],
  2838. 0,0);
  2839. pLL->AddRoadMarkRecord(0,"solid","standard","standard",0.15,"false");
  2840. }
  2841. }
  2842. }
  2843. updateCBRoad();
  2844. mbRefresh = true;
  2845. update();
  2846. }
  2847. int MainWindow::GetEndPoint(Road *proad, double &x, double &y, double &hdg)
  2848. {
  2849. GeometryBlock * pblock = proad->GetLastGeometryBlock();
  2850. RoadGeometry * pgeo = pblock->GetLastGeometry();
  2851. //0-line, 1-arc, 2-spiral 3-poly3 4-parampoly3
  2852. switch (pgeo->GetGeomType()) {
  2853. case 0:
  2854. {
  2855. GeometryLine * pline = (GeometryLine *)pgeo;
  2856. x = pline->GetX() + pline->GetLength() * cos(pline->GetHdg());
  2857. y = pline->GetY() + pline->GetLength() * sin(pline->GetHdg());
  2858. hdg = pline->GetHdg();
  2859. }
  2860. return 0;
  2861. break;
  2862. case 1:
  2863. {
  2864. GeometryArc * parc = (GeometryArc *)pgeo;
  2865. double x_center = parc->GetX() + (1.0/parc->GetCurvature()) * cos(parc->GetHdg() + M_PI/2.0);
  2866. double y_center = parc->GetY() + (1.0/parc->GetCurvature()) * sin(parc->GetHdg()+ M_PI/2.0);
  2867. x = x_center + fabs(1.0/parc->GetCurvature()) * cos(parc->GetHdg() + parc->GetLength() * parc->GetCurvature() - M_PI/2.0);
  2868. y = y_center + fabs(1.0/parc->GetCurvature()) * sin(parc->GetHdg() + parc->GetLength() * parc->GetCurvature() - M_PI/2.0);
  2869. hdg = parc->GetHdg() + parc->GetLength() * parc->GetCurvature();
  2870. return 0;
  2871. }
  2872. break;
  2873. case 2:
  2874. {
  2875. GeometrySpiral * pspiral = (GeometrySpiral *)pgeo;
  2876. pspiral->GetCoords(pspiral->GetS()+pspiral->GetLength(),x,y,hdg);
  2877. return 0;
  2878. }
  2879. break;
  2880. case 3:
  2881. QMessageBox::warning(this,"warn","type not supported.");
  2882. break;
  2883. case 4:
  2884. {
  2885. double xtem,ytem;
  2886. double xtem1,ytem1,x1,y1;
  2887. GeometryParamPoly3 * ppoly3 = (GeometryParamPoly3* )pgeo;
  2888. double s = ppoly3->GetLength();
  2889. xtem = ppoly3->GetuA() + ppoly3->GetuB() * s + ppoly3->GetuC() * s*s + ppoly3->GetuD() * s*s*s ;
  2890. ytem = ppoly3->GetvA() + ppoly3->GetvB() * s + ppoly3->GetvC() * s*s + ppoly3->GetvD() * s*s*s ;
  2891. x = xtem*cos(ppoly3->GetHdg()) - ytem * sin(ppoly3->GetHdg()) + ppoly3->GetX();
  2892. y = xtem*sin(ppoly3->GetHdg()) + ytem * cos(ppoly3->GetHdg()) + ppoly3->GetY();
  2893. s = ppoly3->GetLength()*0.99;
  2894. if(s>0)
  2895. {
  2896. xtem1 = ppoly3->GetuA() + ppoly3->GetuB() * s + ppoly3->GetuC() * s*s + ppoly3->GetuD() * s*s*s ;
  2897. ytem1 = ppoly3->GetvA() + ppoly3->GetvB() * s + ppoly3->GetvC() * s*s + ppoly3->GetvD() * s*s*s ;
  2898. x1 = xtem*cos(ppoly3->GetHdg()) - ytem * sin(ppoly3->GetHdg()) + ppoly3->GetX();
  2899. y1 = xtem*sin(ppoly3->GetHdg()) + ytem * cos(ppoly3->GetHdg()) + ppoly3->GetY();
  2900. hdg = geofit::CalcHdg(xtem1,ytem1,x1,y1);
  2901. }
  2902. else
  2903. {
  2904. hdg = 0;
  2905. }
  2906. return 0;
  2907. }
  2908. break;
  2909. default:
  2910. QMessageBox::warning(this,"warn","type not supported.");
  2911. break;
  2912. }
  2913. return -1;
  2914. }
  2915. void MainWindow::onChangeRoadType(int index)
  2916. {
  2917. if(index == 1)
  2918. {
  2919. mpLBRoadType->setVisible(false);
  2920. mpLERoadType->setVisible(false);
  2921. }
  2922. else
  2923. {
  2924. mpLBRoadType->setVisible(true);
  2925. mpLERoadType->setVisible(true);
  2926. }
  2927. if(index == 0)
  2928. {
  2929. mpLBRoadType->setText("Radius:");
  2930. mpLERoadType->setText("6.0");
  2931. }
  2932. if(index == 2)
  2933. {
  2934. mpLBRoadType->setText("Extend:");
  2935. mpLERoadType->setText("3.0");
  2936. }
  2937. }
  2938. std::vector<geobase> MainWindow::CreateLineGeo(double startx, double starty, double starthdg, double endx, double endy, double endhdg)
  2939. {
  2940. // std::vector<geobase> xvectorgeo;
  2941. // geobase xgeobezier;
  2942. // int nbtype;
  2943. // double fabc[3],fxy[2],fblen,fbhdg;
  2944. // geofit x;
  2945. // x.CreateBezier(startx,starty,starthdg,
  2946. // endx,endy,endhdg,
  2947. // 0.35,0.35,xgeobezier.mfu,xgeobezier.mfv,xgeobezier.mfLen,
  2948. // nbtype,fabc,&fbhdg,fxy,&fblen);
  2949. // if(nbtype == 2)
  2950. // {
  2951. // xgeobezier.mfHdg = starthdg;
  2952. // xgeobezier.mfX = startx;
  2953. // xgeobezier.mfY = starty;
  2954. // xgeobezier.mnType = 2;
  2955. // }
  2956. // else
  2957. // {
  2958. // xgeobezier.mnType = 0; //Line
  2959. // xgeobezier.mfHdgStart = fbhdg;
  2960. // xgeobezier.mfHdg = fbhdg;
  2961. // xgeobezier.mfX = fxy[0];
  2962. // xgeobezier.mfY = fxy[1];
  2963. // xgeobezier.mfLen = fblen;
  2964. // }
  2965. // xvectorgeo.push_back(xgeobezier);
  2966. // return xvectorgeo;
  2967. geobase linegeo;
  2968. linegeo.mnType = 0;
  2969. linegeo.mfX = startx;
  2970. linegeo.mfY = starty;
  2971. linegeo.mfHdg = geofit::CalcHdg(startx,starty,endx,endy);
  2972. linegeo.mfLen = sqrt(pow(endx - startx,2)+pow(endy - starty,2));
  2973. std::vector<geobase> xvectorgeo;
  2974. xvectorgeo.push_back(linegeo);
  2975. return xvectorgeo;
  2976. }
  2977. std::vector<geobase> MainWindow::CreateTurnGeo(double startx, double starty, double starthdg, double endx, double endy, double endhdg,double R)
  2978. {
  2979. std::vector<geobase> xvectorgeo;
  2980. xvectorgeo.clear();
  2981. if(starthdg == endhdg)
  2982. {
  2983. std::cout<<"hdg same use line contact"<<std::endl;
  2984. return CreateLineGeo(startx,starty,starthdg,endx,endy,endhdg);
  2985. }
  2986. double a1,c1,a2,c2;
  2987. double inter_x,inter_y;
  2988. if((starthdg == M_PI/2.0)||(starthdg == 3.0*M_PI/2.0))
  2989. {
  2990. a2 = tan(endhdg) *(-1);
  2991. c2 = 0-a2*endx - endy;
  2992. a1 = 1;
  2993. c1 = startx *(-1);
  2994. inter_x = startx;
  2995. inter_y = 0 - a2*inter_x-c2;
  2996. }
  2997. else
  2998. {
  2999. if((endhdg == M_PI/2.0)||(endhdg == 3.0*M_PI/2.0))
  3000. {
  3001. a1 = tan(starthdg) *(-1);
  3002. c1 = 0-a1*startx - starty;
  3003. a2 = 1;
  3004. c2 = endx *(-1);
  3005. inter_x = endx;
  3006. inter_y = 0 - a1*inter_x-c1;
  3007. }
  3008. else
  3009. {
  3010. a1 = tan(starthdg) *(-1);
  3011. a2 = tan(endhdg) *(-1);
  3012. c1 = 0-a1*startx - starty;
  3013. c2 = 0-a2*endx - endy;
  3014. inter_x = (c1-c2)/(a2-a1);
  3015. inter_y = 0 - a1*inter_x - c1;
  3016. }
  3017. }
  3018. double dis1,dis2;
  3019. dis1 =sqrt(pow(inter_x - startx,2)+pow(inter_y - starty,2));
  3020. dis2 =sqrt(pow(inter_x - endx,2)+pow(inter_y - endy,2));
  3021. if((dis1<1.0)||(dis2<1.0))
  3022. {
  3023. std::cout<<"use line connect."<<std::endl;
  3024. return CreateLineGeo(startx,starty,starthdg,endx,endy,endhdg);
  3025. }
  3026. double hdgdiff = endhdg - starthdg;
  3027. if(hdgdiff >= M_PI)hdgdiff = hdgdiff - 2.0*M_PI;
  3028. if(hdgdiff <= (-M_PI))hdgdiff = hdgdiff + 2.0*M_PI;
  3029. double slen = R*tan(fabs(hdgdiff/2.0));
  3030. if((dis1<slen)||(dis2<slen))
  3031. {
  3032. std::cout<<"radius is big. use line."<<std::endl;
  3033. return CreateLineGeo(startx,starty,starthdg,endx,endy,endhdg);
  3034. }
  3035. double p1_x,p1_y,p2_x,p2_y;
  3036. p1_x = inter_x- slen * cos(starthdg);
  3037. p1_y = inter_y- slen * sin(starthdg);
  3038. p2_x = inter_x+slen*cos(endhdg);
  3039. p2_y = inter_y+slen*sin(endhdg);
  3040. geobase linegeo;
  3041. linegeo.mnType = 0;
  3042. linegeo.mfX = startx;
  3043. linegeo.mfY = starty;
  3044. linegeo.mfHdg = starthdg;
  3045. linegeo.mfLen = sqrt(pow(p1_x - startx,2)+pow(p1_y - starty,2));
  3046. xvectorgeo.push_back(linegeo);
  3047. geobase arcgeo;
  3048. arcgeo.mnType = 1;
  3049. arcgeo.mfX = p1_x;
  3050. arcgeo.mfY = p1_y;
  3051. arcgeo.mfHdg = starthdg;
  3052. arcgeo.mfHdgStart = starthdg;
  3053. arcgeo.mfLen = R*fabs(hdgdiff);
  3054. arcgeo.mR = R*(fabs(hdgdiff)/hdgdiff);
  3055. arcgeo.mfEndX = p2_x;
  3056. arcgeo.mfEndY = p2_y;
  3057. xvectorgeo.push_back(arcgeo);
  3058. linegeo.mnType = 0;
  3059. linegeo.mfX = p2_x;
  3060. linegeo.mfY = p2_y;
  3061. linegeo.mfHdg = endhdg;
  3062. linegeo.mfLen = sqrt(pow(p2_x - endx,2)+pow(p2_y - endy,2));
  3063. xvectorgeo.push_back(linegeo);
  3064. return xvectorgeo;
  3065. }
  3066. std::string MainWindow::getlanetype(Road *p, int nlane, bool bstart)
  3067. {
  3068. Lane * plane = 0;
  3069. int i;
  3070. LaneSection * pLS;
  3071. if(bstart)
  3072. {
  3073. pLS = p->GetLaneSection(0);
  3074. }
  3075. else
  3076. {
  3077. pLS = p->GetLaneSection(p->GetLaneSectionCount() -1);
  3078. }
  3079. int nlanecount = pLS->GetLaneCount();
  3080. for(i=0;i<nlanecount;i++)
  3081. {
  3082. if(nlane == pLS->GetLane(i)->GetId())
  3083. {
  3084. plane = pLS->GetLane(i);
  3085. break;
  3086. }
  3087. }
  3088. if(plane == 0)
  3089. {
  3090. std::cout<<"MainWindow::getlanetype can't find lane : "<<nlane<<std::endl;
  3091. return "driving";
  3092. }
  3093. return plane->GetType();
  3094. }
  3095. double MainWindow::getlanewidth(Road * p, int nlane,bool bstart)
  3096. {
  3097. Lane * plane = 0;
  3098. double a,b,c,d;
  3099. double s;
  3100. if(bstart)
  3101. {
  3102. s = 0;
  3103. }
  3104. else
  3105. {
  3106. s = p->GetRoadLength();
  3107. }
  3108. int i;
  3109. LaneSection * pLS;
  3110. if(bstart)
  3111. {
  3112. pLS = p->GetLaneSection(0);
  3113. }
  3114. else
  3115. {
  3116. pLS = p->GetLaneSection(p->GetLaneSectionCount() -1);
  3117. }
  3118. int nlanecount = pLS->GetLaneCount();
  3119. for(i=0;i<nlanecount;i++)
  3120. {
  3121. if(nlane == pLS->GetLane(i)->GetId())
  3122. {
  3123. plane = pLS->GetLane(i);
  3124. break;
  3125. }
  3126. }
  3127. if(plane == 0)
  3128. {
  3129. std::cout<<"MainWindow::getlanewidth can't find lane : "<<nlane<<std::endl;
  3130. return 0;
  3131. }
  3132. if(bstart)
  3133. {
  3134. return plane->GetLaneWidth(0)->GetA();
  3135. }
  3136. else
  3137. {
  3138. s = p->GetRoadLength() - pLS->GetS();
  3139. LaneWidth * pLW = plane->GetLaneWidth(plane->GetLaneWidthCount()-1);
  3140. a = pLW->GetA();b = pLW->GetB();c = pLW->GetC();d = pLW->GetD();
  3141. return a+b*s+c*pow(s,2)+d*pow(s,3);
  3142. }
  3143. }
  3144. double MainWindow::getoff(Road *p, int nlane, bool bstart)
  3145. {
  3146. double off = 0;
  3147. int i;
  3148. if(bstart)
  3149. {
  3150. LaneSection * pLS = p->GetLaneSection(0);
  3151. if(nlane<0)
  3152. {
  3153. if(nlane == -1)return 0;
  3154. else
  3155. {
  3156. for(i=0;i<pLS->GetLaneCount();i++)
  3157. {
  3158. Lane * pL = pLS->GetLane(i);
  3159. if((pL->GetId()<0)&&(pL->GetId()>nlane))
  3160. {
  3161. off = off + pL->GetLaneWidth(0)->GetA();
  3162. }
  3163. }
  3164. }
  3165. }
  3166. else
  3167. {
  3168. if(nlane == 1)return 0;
  3169. else
  3170. {
  3171. for(i=0;i<pLS->GetLaneCount();i++)
  3172. {
  3173. Lane * pL = pLS->GetLane(i);
  3174. if((pL->GetId()>0)&&(pL->GetId()<nlane))
  3175. {
  3176. off = off - pL->GetLaneWidth(0)->GetA();
  3177. }
  3178. }
  3179. }
  3180. }
  3181. }
  3182. else
  3183. {
  3184. LaneSection * pLS = p->GetLaneSection(p->GetLaneSectionCount()-1);
  3185. if(nlane<0)
  3186. {
  3187. if(nlane == -1)return 0;
  3188. else
  3189. {
  3190. for(i=0;i<pLS->GetLaneCount();i++)
  3191. {
  3192. Lane * pL = pLS->GetLane(i);
  3193. if((pL->GetId()<0)&&(pL->GetId()>nlane))
  3194. {
  3195. double a,b,c,d;
  3196. a = pL->GetLaneWidth(pL->GetLaneWidthCount()-1)->GetA();
  3197. b = pL->GetLaneWidth(pL->GetLaneWidthCount()-1)->GetB();
  3198. c = pL->GetLaneWidth(pL->GetLaneWidthCount()-1)->GetC();
  3199. d = pL->GetLaneWidth(pL->GetLaneWidthCount()-1)->GetD();
  3200. double s = p->GetRoadLength();
  3201. off = off + a + b*s +c *s*s + d*s*s*s;
  3202. }
  3203. }
  3204. }
  3205. }
  3206. else
  3207. {
  3208. if(nlane == 1)return 0;
  3209. else
  3210. {
  3211. for(i=0;i<pLS->GetLaneCount();i++)
  3212. {
  3213. Lane * pL = pLS->GetLane(i);
  3214. if((pL->GetId()>0)&&(pL->GetId()<nlane))
  3215. {
  3216. double a,b,c,d;
  3217. a = pL->GetLaneWidth(pL->GetLaneWidthCount()-1)->GetA();
  3218. b = pL->GetLaneWidth(pL->GetLaneWidthCount()-1)->GetB();
  3219. c = pL->GetLaneWidth(pL->GetLaneWidthCount()-1)->GetC();
  3220. d = pL->GetLaneWidth(pL->GetLaneWidthCount()-1)->GetD();
  3221. double s = p->GetRoadLength();
  3222. off = off - a - b*s -c *s*s - d*s*s*s;
  3223. }
  3224. }
  3225. }
  3226. }
  3227. }
  3228. return off;
  3229. }
  3230. std::vector<geobase> MainWindow::CreateUTurnGeo(double startx, double starty, double starthdg, double endx, double endy, double endhdg, double fextend)
  3231. {
  3232. std::vector<geobase> xvectorgeo;
  3233. double p1_x,p1_y, p2_x,p2_y,p1_hdg,p2_hdg;
  3234. p1_x = fextend*cos(starthdg) + startx;
  3235. p1_y = fextend*sin(starthdg) + starty;
  3236. p2_x = fextend*cos(endhdg + M_PI) + endx;
  3237. p2_y = fextend*sin(endhdg + M_PI) + endy;
  3238. p1_hdg = starthdg;
  3239. p2_hdg = endhdg;
  3240. if(starthdg == endhdg)
  3241. {
  3242. std::cout<<" hdg is same, can't create u turn."<<std::endl;
  3243. return xvectorgeo;
  3244. }
  3245. double hdgse = geofit::CalcHdg(p1_x,p1_y,p2_x,p2_y);
  3246. double hdgdiff = hdgse - p1_hdg;
  3247. if(hdgdiff < 0)hdgdiff = hdgdiff + 2.0*M_PI;
  3248. bool bPA = true; //Positive
  3249. if(hdgdiff >=M_PI)bPA = false;
  3250. double xdiff;
  3251. if(bPA)xdiff = hdgdiff - M_PI/2.0;
  3252. else xdiff = hdgdiff - 3.0*M_PI/2.0;
  3253. double xdis = sqrt(pow(p1_x-p2_x,2)+pow(p1_y-p2_y,2));
  3254. double R = xdis/(2.0*cos(xdiff));
  3255. double x_center,y_center;
  3256. double xhdgtocenter;
  3257. if(bPA)
  3258. {
  3259. xhdgtocenter = p1_hdg + M_PI/2.0;
  3260. if(xhdgtocenter >= 2.0*M_PI)xhdgtocenter = xhdgtocenter - M_PI*2.0;
  3261. }
  3262. else
  3263. {
  3264. xhdgtocenter = p1_hdg - M_PI/2.0;
  3265. if(xhdgtocenter < 0)xhdgtocenter = xhdgtocenter + 2.0*M_PI;
  3266. }
  3267. x_center = p1_x + R*cos(xhdgtocenter);
  3268. y_center = p1_y + R*sin(xhdgtocenter);
  3269. double xhdgcentertoarc;
  3270. if(bPA)
  3271. {
  3272. xhdgcentertoarc = hdgse - M_PI/2.0;
  3273. if(xhdgcentertoarc <0)xhdgcentertoarc = xhdgcentertoarc + 2.0*M_PI;
  3274. }
  3275. else
  3276. {
  3277. xhdgcentertoarc = hdgse + M_PI/2.0;
  3278. if(xhdgcentertoarc >= M_PI*2.0)xhdgcentertoarc = xhdgcentertoarc - M_PI*2.0;
  3279. }
  3280. double p3_x,p3_y,p3_hdg;
  3281. p3_hdg = hdgse;
  3282. p3_x = x_center + R* cos(xhdgcentertoarc);
  3283. p3_y = y_center + R* sin(xhdgcentertoarc);
  3284. // pgb->AddGeometryArc(s,parc->mfX,parc->mfY,parc->mfHdgStart,parc->mfLen,1.0/parc->mR);
  3285. geobase c2,c3;
  3286. c2.mfX = p1_x;
  3287. c2.mfY = p1_y;
  3288. c2.mfHdgStart = p1_hdg;
  3289. c3.mfX = p3_x;
  3290. c3.mfY = p3_y;
  3291. c3.mfHdgStart = hdgse;
  3292. c2.mnType = 1;
  3293. c3.mnType = 1;
  3294. if(bPA)
  3295. {
  3296. c2.mfLen = hdgdiff * R;
  3297. c2.mR = R;
  3298. c3.mfLen = c2.mfLen;
  3299. c3.mR = R;
  3300. }
  3301. else
  3302. {
  3303. c2.mfLen = (2.0*M_PI - hdgdiff) * R;
  3304. c2.mR = R*(-1);
  3305. c3.mfLen = c2.mfLen;
  3306. c3.mR = R;
  3307. }
  3308. geobase l1,l2;
  3309. if(fextend != 0)
  3310. {
  3311. l1.mfX = startx;
  3312. l1.mfY = starty;
  3313. l1.mfHdg = starthdg;
  3314. l1.mfLen = fextend;
  3315. l1.mnType = 0;
  3316. l2.mfX = p2_x;
  3317. l2.mfY = p2_y;
  3318. l2.mfHdg = p2_hdg;
  3319. l2.mfLen = fextend;
  3320. l2.mnType = 0;
  3321. xvectorgeo.push_back(l1);
  3322. }
  3323. xvectorgeo.push_back(c2);
  3324. xvectorgeo.push_back(c3);
  3325. if(fextend != 0)xvectorgeo.push_back(l2);
  3326. return xvectorgeo;
  3327. }
  3328. void MainWindow::ChangeXODRRoadID(OpenDrive *pxodr, int index, int newid)
  3329. {
  3330. Road * proad;
  3331. int nsize = pxodr->GetRoadCount();
  3332. int i;
  3333. if(index<0)return;
  3334. if(index>=nsize)return;
  3335. proad = pxodr->GetRoad(index);
  3336. int noldid = atoi(proad->GetRoadId().data());
  3337. char strid[255];
  3338. snprintf(strid,255,"%d",newid);
  3339. proad->SetRoadId(strid);
  3340. for(i=0;i<nsize;i++)
  3341. {
  3342. Road * proad2 = pxodr->GetRoad(i);
  3343. if(proad2->GetPredecessor()!= 0)
  3344. {
  3345. RoadLink * plink = proad2->GetPredecessor();
  3346. if(strncmp(plink->GetElementType().data(),"road",255)== 0)
  3347. {
  3348. if(atoi(plink->GetElementId().data()) == noldid)
  3349. {
  3350. plink->SetElementId(strid);
  3351. }
  3352. }
  3353. }
  3354. if(proad2->GetSuccessor()!= 0)
  3355. {
  3356. RoadLink * plink = proad2->GetSuccessor();
  3357. if(strncmp(plink->GetElementType().data(),"road",255)== 0)
  3358. {
  3359. if(atoi(plink->GetElementId().data()) == noldid)
  3360. {
  3361. plink->SetElementId(strid);
  3362. }
  3363. }
  3364. }
  3365. }
  3366. nsize = pxodr->GetJunctionCount();
  3367. for(i=0;i<nsize;i++)
  3368. {
  3369. Junction * pjunction = pxodr->GetJunction(i);
  3370. int j;
  3371. for(j=0;j<pjunction->GetJunctionConnectionCount();j++)
  3372. {
  3373. JunctionConnection * pjc = pjunction->GetJunctionConnection(j);
  3374. if(atoi(pjc->GetIncomingRoad().data()) == noldid)
  3375. {
  3376. pjc->SetIncomingRoad(strid);
  3377. }
  3378. if(atoi(pjc->GetConnectingRoad().data()) == noldid)
  3379. {
  3380. pjc->SetConnectingRoad(strid);
  3381. }
  3382. }
  3383. }
  3384. }
  3385. void MainWindow::ChangeXODRJunctionID(OpenDrive *pxodr, int index, int newid)
  3386. {
  3387. Junction * pjunction;
  3388. int nsize = pxodr->GetJunctionCount();
  3389. int i;
  3390. if(index<0)return;
  3391. if(index>=nsize)return;
  3392. pjunction = pxodr->GetJunction(index);
  3393. int noldid = atoi(pjunction->GetId().data());
  3394. char strid[255];
  3395. snprintf(strid,255,"%d",newid);
  3396. pjunction->SetId(strid);
  3397. for(i=0;i<nsize;i++)
  3398. {
  3399. Road * proad2 = pxodr->GetRoad(i);
  3400. if(proad2->GetPredecessor()!= 0)
  3401. {
  3402. RoadLink * plink = proad2->GetPredecessor();
  3403. if(strncmp(plink->GetElementType().data(),"junction",255)== 0)
  3404. {
  3405. if(atoi(plink->GetElementId().data()) == noldid)
  3406. {
  3407. plink->SetElementId(strid);
  3408. }
  3409. }
  3410. }
  3411. if(proad2->GetSuccessor()!= 0)
  3412. {
  3413. RoadLink * plink = proad2->GetSuccessor();
  3414. if(strncmp(plink->GetElementType().data(),"junction",255)== 0)
  3415. {
  3416. if(atoi(plink->GetElementId().data()) == noldid)
  3417. {
  3418. plink->SetElementId(strid);
  3419. }
  3420. }
  3421. }
  3422. }
  3423. }
  3424. void MainWindow::MoveXODR(OpenDrive *pxodr, double movex, double movey)
  3425. {
  3426. int nsize = pxodr->GetRoadCount();
  3427. int i;
  3428. for(i=0;i<nsize;i++)
  3429. {
  3430. Road * pRoad = pxodr->GetRoad(i);
  3431. int nblockcount = pRoad->GetGeometryBlockCount();
  3432. int j;
  3433. for(j=0;j<nblockcount;j++)
  3434. {
  3435. GeometryBlock * pgb = pRoad->GetGeometryBlock(j);
  3436. if(pgb != 0)
  3437. {
  3438. pgb->GetGeometryAt(0)->SetX(pgb->GetGeometryAt(0)->GetX() + movex);
  3439. pgb->GetGeometryAt(0)->SetY(pgb->GetGeometryAt(0)->GetY() + movey);
  3440. }
  3441. }
  3442. }
  3443. }
  3444. int MainWindow::FindNewRoadID(OpenDrive *pxodr1, OpenDrive *pxodr2)
  3445. {
  3446. int nroadsize1,nroadsize2;
  3447. nroadsize1 = pxodr1->GetRoadCount();
  3448. nroadsize2 = pxodr2->GetRoadCount();
  3449. int i;
  3450. int * pnid = new int[nroadsize1 + nroadsize2];
  3451. std::shared_ptr<int> ppnid;ppnid.reset(pnid);
  3452. for(i=0;i<nroadsize1;i++)
  3453. {
  3454. pnid[i] = atoi(pxodr1->GetRoad(i)->GetRoadId().data());
  3455. }
  3456. for(i=0;i<nroadsize2;i++)
  3457. {
  3458. pnid[i+nroadsize1] = atoi(pxodr2->GetRoad(i)->GetRoadId().data());
  3459. }
  3460. int nstartid = 40000;
  3461. bool bUsed = true;
  3462. while(bUsed == true)
  3463. {
  3464. bUsed = false;
  3465. for(i=0;i<(nroadsize1 + nroadsize2);i++)
  3466. {
  3467. if(pnid[i] == nstartid)
  3468. {
  3469. bUsed = true;
  3470. break;
  3471. }
  3472. }
  3473. if(bUsed == false)break;
  3474. nstartid++;
  3475. }
  3476. return nstartid;
  3477. }
  3478. int MainWindow::FindNewJunctionID(OpenDrive *pxodr1, OpenDrive *pxodr2)
  3479. {
  3480. int njunctionsize1,njunctionsize2;
  3481. njunctionsize1 = pxodr1->GetJunctionCount();
  3482. njunctionsize2 = pxodr2->GetJunctionCount();
  3483. int i;
  3484. int * pnid = new int[njunctionsize1 + njunctionsize2];
  3485. std::shared_ptr<int> ppnid;ppnid.reset(pnid);
  3486. for(i=0;i<njunctionsize1;i++)
  3487. {
  3488. pnid[i] = atoi(pxodr1->GetJunction(i)->GetId().data());
  3489. }
  3490. for(i=0;i<njunctionsize2;i++)
  3491. {
  3492. pnid[i+njunctionsize1] = atoi(pxodr2->GetJunction(i)->GetId().data());
  3493. }
  3494. int nstartid = 50000;
  3495. bool bUsed = true;
  3496. while(bUsed == true)
  3497. {
  3498. bUsed = false;
  3499. for(i=0;i<(njunctionsize1 + njunctionsize2);i++)
  3500. {
  3501. if(pnid[i] == nstartid)
  3502. {
  3503. bUsed = true;
  3504. break;
  3505. }
  3506. }
  3507. if(bUsed == false)break;
  3508. nstartid++;
  3509. }
  3510. return nstartid;
  3511. }
  3512. void MainWindow::onClickRoadMark()
  3513. {
  3514. int selid = mpCBRoad->currentText().toInt();
  3515. int j;
  3516. for(j=0;j<mvectorroadview.size();j++)
  3517. {
  3518. Road * pRoad = mvectorroadview[j]->GetRoad();
  3519. if(atoi(pRoad->GetRoadId().data())== selid)
  3520. {
  3521. mvectorroadview[j]->setmark(true);
  3522. }
  3523. else
  3524. {
  3525. mvectorroadview[j]->setmark(false);
  3526. }
  3527. }
  3528. mbRefresh = true;
  3529. update();
  3530. }
  3531. void MainWindow::onClickRoadDel()
  3532. {
  3533. if(mpCBRoad->count() == 0)
  3534. {
  3535. QMessageBox::warning(this,"warn","no road to be delete");
  3536. return;
  3537. }
  3538. int nroadid = mpCBRoad->currentText().toInt();
  3539. Road * pRoad = 0;
  3540. int nroadsize = mxodr.GetRoadCount();
  3541. int i;
  3542. int index;
  3543. for(i=0;i<nroadsize;i++)
  3544. {
  3545. if(nroadid == atoi(mxodr.GetRoad(i)->GetRoadId().data()))
  3546. {
  3547. pRoad = mxodr.GetRoad(i);
  3548. index = i;
  3549. break;
  3550. }
  3551. }
  3552. if(pRoad == 0)
  3553. {
  3554. QMessageBox::warning(this,"warn","can't find road");
  3555. return;
  3556. }
  3557. mxodr.DeleteRoad(index);
  3558. nroadsize = mxodr.GetRoadCount();
  3559. for(i=0;i<nroadsize;i++)
  3560. {
  3561. pRoad = mxodr.GetRoad(i);
  3562. RoadLink * ppre,* pnext;
  3563. ppre = pRoad->GetPredecessor();
  3564. pnext = pRoad->GetSuccessor();
  3565. if(ppre != 0)
  3566. {
  3567. if(strncmp(ppre->GetElementType().data(),"road",255) == 0)
  3568. {
  3569. if(atoi(ppre->GetElementId().data()) == nroadid)
  3570. {
  3571. pRoad->RemovePredecessor();
  3572. LaneSection * pLS = pRoad->GetLaneSection(0);
  3573. int nlanecount = pLS->GetLaneCount();
  3574. int j;
  3575. for(j=0;j<nlanecount;j++)
  3576. {
  3577. Lane * pLane;
  3578. pLane = pLS->GetLane(j);
  3579. pLane->RemovePredecessor();
  3580. }
  3581. }
  3582. }
  3583. }
  3584. if(pnext != 0)
  3585. {
  3586. if(strncmp(pnext->GetElementType().data(),"road",255) == 0)
  3587. {
  3588. if(atoi(pnext->GetElementId().data()) == nroadid)
  3589. {
  3590. pRoad->RemoveSuccessor();
  3591. LaneSection * pLS = pRoad->GetLaneSection(pRoad->GetLaneSectionCount()-1);
  3592. int nlanecount = pLS->GetLaneCount();
  3593. int j;
  3594. for(j=0;j<nlanecount;j++)
  3595. {
  3596. Lane * pLane;
  3597. pLane = pLS->GetLane(j);
  3598. pLane->RemoveSuccessor();
  3599. }
  3600. }
  3601. }
  3602. }
  3603. }
  3604. //remove juction connection where id = roadid
  3605. int njunctioncount = mxodr.GetJunctionCount();
  3606. Junction * pjunction;
  3607. for(i=0;i<njunctioncount;i++)
  3608. {
  3609. pjunction = mxodr.GetJunction(i);
  3610. int j;
  3611. for(j=0;j<pjunction->GetJunctionConnectionCount();j++)
  3612. {
  3613. JunctionConnection * pjc = pjunction->GetJunctionConnection(j);
  3614. int nfromid = atoi(pjc->GetIncomingRoad().data());
  3615. int ntoid = atoi(pjc->GetConnectingRoad().data());
  3616. if((nfromid == nroadid)||(ntoid == nroadid))
  3617. {
  3618. pjunction->DeleteJunctionConnection(j);
  3619. j--;
  3620. }
  3621. }
  3622. }
  3623. updateCBRoad();
  3624. updateView();
  3625. // mbRefresh = true;
  3626. // update();
  3627. }
  3628. void MainWindow::updateCBRoad()
  3629. {
  3630. mpCBRoad->clear();
  3631. mpCBRoad1->clear();
  3632. mpCBRoad2->clear();
  3633. mpCBJunctionIncommingRoad->clear();
  3634. mpCBJunctionConnectingRoad->clear();
  3635. mpCBPreNxtRoad->clear();
  3636. int i;
  3637. int nroadcount = mxodr.GetRoadCount();
  3638. for(i=0;i<nroadcount;i++)
  3639. {
  3640. const char * strname = mxodr.GetRoad(i)->GetRoadId().data();
  3641. mpCBRoad->addItem(strname);
  3642. mpCBRoad1->addItem(strname);
  3643. mpCBRoad2->addItem(strname);
  3644. mpCBJunctionIncommingRoad->addItem(strname);
  3645. mpCBJunctionConnectingRoad->addItem(strname);
  3646. mpCBPreNxtRoad->addItem(strname);
  3647. }
  3648. }
  3649. void MainWindow::onClickCBRoadChange(int index)
  3650. {
  3651. Road * pRoad = mxodr.GetRoad(index);
  3652. if(pRoad == 0)
  3653. {
  3654. // QMessageBox::warning(this,"WARN","MainWindow::onClickCBRoadChange road is NULL");
  3655. return;
  3656. }
  3657. int i;
  3658. mpLabelRoadShowPreID->setText("");
  3659. mpLabelRoadShowPreType2->setText("");
  3660. mpLabelRoadShowPreType1->setText("");
  3661. mpCBRoadShowPre->clear();
  3662. mpLabelRoadShowNxtID->setText("");
  3663. mpLabelRoadShowNxtType2->setText("");
  3664. mpLabelRoadShowNxtType1->setText("");
  3665. mpCBRoadShowNext->clear();
  3666. if(pRoad->GetPredecessor() != 0)
  3667. {
  3668. RoadLink * pRL = pRoad->GetPredecessor();
  3669. mpLabelRoadShowPreID->setText(pRL->GetElementId().data());
  3670. mpLabelRoadShowPreType2->setText(pRL->GetContactPoint().data());
  3671. mpLabelRoadShowPreType1->setText(pRL->GetElementType().data());
  3672. }
  3673. if(pRoad->GetSuccessor() != 0)
  3674. {
  3675. RoadLink * pRL = pRoad->GetSuccessor();
  3676. mpLabelRoadShowNxtID->setText(pRL->GetElementId().data());
  3677. mpLabelRoadShowNxtType2->setText(pRL->GetContactPoint().data());
  3678. mpLabelRoadShowNxtType1->setText(pRL->GetElementType().data());
  3679. }
  3680. LaneSection * pLS = pRoad->GetLaneSection(0);
  3681. int nlanecount = pLS->GetLaneCount();
  3682. for(i=0;i<nlanecount;i++)
  3683. {
  3684. char strout[255];
  3685. char strtem[255];
  3686. Lane * pLane = pLS->GetLane(i);
  3687. snprintf(strout,255,"%d type:%s",pLane->GetId(),pLane->GetType().data());
  3688. if(pLane->IsPredecessorSet())
  3689. {
  3690. snprintf(strtem,255," pre:%d",pLane->GetPredecessor());
  3691. strncat(strout,strtem,255);
  3692. }
  3693. mpCBRoadShowPre->addItem(strout);
  3694. }
  3695. pLS = pRoad->GetLaneSection(pRoad->GetLaneSectionCount()-1);
  3696. nlanecount = pLS->GetLaneCount();
  3697. for(i=0;i<nlanecount;i++)
  3698. {
  3699. char strout[255];
  3700. char strtem[255];
  3701. Lane * pLane = pLS->GetLane(i);
  3702. snprintf(strout,255,"%d type:%s",pLane->GetId(),pLane->GetType().data());
  3703. if(pLane->IsSuccessorSet())
  3704. {
  3705. snprintf(strtem,255," suc:%d",pLane->GetSuccessor());
  3706. strncat(strout,strtem,255);
  3707. }
  3708. mpCBRoadShowNext->addItem(strout);
  3709. }
  3710. }
  3711. void MainWindow::updateJunction()
  3712. {
  3713. int i;
  3714. int njunctioncount = mxodr.GetJunctionCount();
  3715. mpCBJunction->clear();
  3716. for(i=0;i<njunctioncount;i++)
  3717. {
  3718. Junction * pjunction = mxodr.GetJunction(i);
  3719. mpCBJunction->addItem(pjunction->GetId().data());
  3720. }
  3721. }
  3722. void MainWindow::onClickCBJunctionChange(int index)
  3723. {
  3724. mpCBJunctionConnection->clear();
  3725. Junction * pjunction = mxodr.GetJunction(index);
  3726. if(pjunction == NULL)
  3727. {
  3728. // QMessageBox::warning(this,"warn","MainWindow::onClickCBJunctionChange can't find junction");
  3729. return;
  3730. }
  3731. int nconnectioncount = pjunction->GetJunctionConnectionCount();
  3732. int i;
  3733. for(i=0;i<nconnectioncount;i++)
  3734. {
  3735. JunctionConnection * pJC = pjunction->GetJunctionConnection(i);
  3736. mpCBJunctionConnection->addItem(pJC->GetId().data());
  3737. }
  3738. mpCBJunctionFromTo->clear();
  3739. mpLabelJunctionConnectingRoad->setText("");
  3740. mpLabelJunctionContactPoint->setText("");
  3741. mpLabelJunctionIncommingRoad->setText("");
  3742. if(pjunction->GetJunctionConnectionCount()>0)
  3743. {
  3744. mpCBJunctionConnection->setCurrentIndex(0);
  3745. onClickCBJunctionConnectionChange(0);
  3746. }
  3747. }
  3748. void MainWindow::onClickCBJunctionConnectionChange(int index)
  3749. {
  3750. // mpCBJunctionIncommingRoad->clear();
  3751. // mpCBJunctionConnectingRoad->clear();
  3752. // mpCBJunctionFromLane->clear();
  3753. // mpCBJunctionToLane->clear();
  3754. Junction * pjunction = mxodr.GetJunction(mpCBJunction->currentIndex());
  3755. if(pjunction == NULL)
  3756. {
  3757. std::cout<<"MainWindow::onClickCBJunctionConnectionChange Junction NULL"<<std::endl;
  3758. return;
  3759. }
  3760. if((index<0)||(index>= pjunction->GetJunctionConnectionCount()))
  3761. {
  3762. // std::cout<<"MainWindow::onClickCBJunctionConnectionChange out range."<<std::endl;
  3763. return;
  3764. }
  3765. JunctionConnection * pJC = pjunction->GetJunctionConnection(index);
  3766. if(pJC == NULL)
  3767. {
  3768. std::cout<<"MainWindow::onClickCBJunctionConnectionChange Junction Connection NULL"<<std::endl;
  3769. return;
  3770. }
  3771. mpLabelJunctionIncommingRoad->setText(pJC->GetIncomingRoad().data());
  3772. mpLabelJunctionContactPoint->setText(pJC->GetContactPoint().data());
  3773. mpLabelJunctionConnectingRoad->setText(pJC->GetConnectingRoad().data());
  3774. unsigned int i;
  3775. unsigned int njunctionlanelinkcount = pJC->GetJunctionLaneLinkCount();
  3776. mpCBJunctionFromTo->clear();
  3777. for(i=0;i<njunctionlanelinkcount;i++)
  3778. {
  3779. char strout[255];
  3780. JunctionLaneLink * pjll = pJC->GetJunctionLaneLink(i);
  3781. snprintf(strout,255,"%d to %d",pjll->GetFrom(),pjll->GetTo());
  3782. mpCBJunctionFromTo->addItem(strout);
  3783. }
  3784. }
  3785. void MainWindow::onClickCBJunctionIncommingChange(int index)
  3786. {
  3787. int i;
  3788. int ncount = mxodr.GetRoadCount();
  3789. if((index < 0)||(index>=ncount))
  3790. {
  3791. return;
  3792. }
  3793. Road * pRoad = mxodr.GetRoad(index);
  3794. if(pRoad == NULL)
  3795. {
  3796. return;
  3797. }
  3798. LaneSection * pLS;
  3799. if(mpCBJunctionContactPoint->currentIndex() == 0)
  3800. {
  3801. pLS = pRoad->GetLaneSection(0);
  3802. }
  3803. else
  3804. {
  3805. pLS = pRoad->GetLaneSection(pRoad->GetLaneSectionCount()-1);
  3806. }
  3807. int nlanecount = pLS->GetLaneCount();
  3808. mpCBJunctionFromLane->clear();
  3809. for(i=0;i<nlanecount;i++)
  3810. {
  3811. Lane * pLane = pLS->GetLane(i);
  3812. if(pLane->GetId() != 0)
  3813. {
  3814. mpCBJunctionFromLane->addItem(QString::number(pLane->GetId()));
  3815. }
  3816. }
  3817. }
  3818. void MainWindow::onClickCBJunctionConnectionroadChange(int index)
  3819. {
  3820. int i;
  3821. int ncount = mxodr.GetRoadCount();
  3822. if((index < 0)||(index>=ncount))
  3823. {
  3824. return;
  3825. }
  3826. Road * pRoad = mxodr.GetRoad(index);
  3827. if(pRoad == NULL)
  3828. {
  3829. return;
  3830. }
  3831. LaneSection * pLS;
  3832. pLS = pRoad->GetLaneSection(0);
  3833. int nlanecount = pLS->GetLaneCount();
  3834. mpCBJunctionToLane->clear();
  3835. for(i=0;i<nlanecount;i++)
  3836. {
  3837. Lane * pLane = pLS->GetLane(i);
  3838. if(pLane->GetId() != 0)
  3839. {
  3840. mpCBJunctionToLane->addItem(QString::number(pLane->GetId()));
  3841. }
  3842. }
  3843. }
  3844. void MainWindow::onClickCreateJunction()
  3845. {
  3846. mxodr.AddJunction("",QString::number(CreateJunctionID()).toStdString());
  3847. updateJunction();
  3848. }
  3849. void MainWindow::onClickCreateJunctionLaneLink()
  3850. {
  3851. Junction * pJunction= mxodr.GetJunction(mpCBJunction->currentIndex());
  3852. if(pJunction == NULL)
  3853. {
  3854. QMessageBox::warning(this,"warn","can't find junction");
  3855. return ;
  3856. }
  3857. Road * pFromRoad = mxodr.GetRoad(mpCBJunctionIncommingRoad->currentIndex());
  3858. if(pFromRoad == NULL)
  3859. {
  3860. QMessageBox::warning(this,"warn","can't find incomming road.");
  3861. return;
  3862. }
  3863. Road * pToRoad = mxodr.GetRoad(mpCBJunctionConnectingRoad->currentIndex());
  3864. if(pToRoad == NULL)
  3865. {
  3866. QMessageBox::warning(this,"warn","can't find connecting road.");
  3867. return;
  3868. }
  3869. string contacpoint = mpCBJunctionContactPoint->currentText().toStdString();
  3870. JunctionConnection * pJC = 0;
  3871. int njunctioncount = pJunction->GetJunctionConnectionCount();
  3872. int i;
  3873. for(i=0;i<njunctioncount;i++)
  3874. {
  3875. JunctionConnection * pJunCon = pJunction->GetJunctionConnection(i);
  3876. if((pJunCon->GetIncomingRoad() == pFromRoad->GetRoadId())&&(pJunCon->GetContactPoint() == contacpoint)&&(pJunCon->GetConnectingRoad() == pToRoad->GetRoadId()))
  3877. {
  3878. pJC = pJunCon;
  3879. break;
  3880. }
  3881. }
  3882. bool bNewJC = false;
  3883. if(pJC == 0)
  3884. {
  3885. int nnewJCid = pJunction->GetJunctionConnectionCount();
  3886. int j;
  3887. int njccount = pJunction->GetJunctionConnectionCount();
  3888. bool bNotUse = true;
  3889. do
  3890. {
  3891. for(j=0;j<njccount;j++)
  3892. {
  3893. if(nnewJCid == atoi(pJunction->GetJunctionConnection(j)->GetId().data()))
  3894. {
  3895. bNotUse = false;
  3896. nnewJCid++;
  3897. break;
  3898. }
  3899. }
  3900. }while(bNotUse == false);
  3901. unsigned int addindex = pJunction->AddJunctionConnection(QString::number(nnewJCid).toStdString(),
  3902. pFromRoad->GetRoadId(),
  3903. pToRoad->GetRoadId(),
  3904. contacpoint);
  3905. pJC = pJunction->GetJunctionConnection(addindex);
  3906. bNewJC = true;
  3907. }
  3908. int nfrom = mpCBJunctionFromLane->currentText().toInt();
  3909. int nto = mpCBJunctionToLane->currentText().toInt();
  3910. int njlcount = pJC->GetJunctionLaneLinkCount();
  3911. for(i=0;i<njlcount;i++)
  3912. {
  3913. JunctionLaneLink * pjll = pJC->GetJunctionLaneLink(i);
  3914. if((pjll->GetFrom()== nfrom)&&(pjll->GetTo() == nto))
  3915. {
  3916. QMessageBox::warning(this,"warn","this lane link exist.");
  3917. return;
  3918. }
  3919. }
  3920. unsigned int nadd = pJC->AddJunctionLaneLink(mpCBJunctionFromLane->currentText().toInt(),
  3921. mpCBJunctionToLane->currentText().toInt());
  3922. char strout[255];
  3923. JunctionLaneLink * pjll = pJC->GetJunctionLaneLink(nadd);
  3924. snprintf(strout,255,"%d to %d",pjll->GetFrom(),pjll->GetTo());
  3925. if(bNewJC)
  3926. {
  3927. mpCBJunctionConnection->addItem(pJC->GetId().data());
  3928. }
  3929. if(strncmp(contacpoint.data(),"start",255) == 0)
  3930. {
  3931. if(nfrom*nto<0)
  3932. {
  3933. pFromRoad->SetPredecessor("junction",pJunction->GetId(),contacpoint);
  3934. }
  3935. else
  3936. {
  3937. pFromRoad->SetSuccessor("junction",pJunction->GetId(),contacpoint);
  3938. }
  3939. }
  3940. else
  3941. {
  3942. if(nfrom*nto <0)
  3943. {
  3944. pFromRoad->SetSuccessor("junction",pJunction->GetId(),contacpoint);
  3945. }
  3946. else
  3947. {
  3948. pFromRoad->SetPredecessor("junction",pJunction->GetId(),contacpoint);
  3949. }
  3950. }
  3951. pToRoad->SetRoadJunction(pJunction->GetId());
  3952. }
  3953. void MainWindow::onClickDeleteJunctionLaneLink()
  3954. {
  3955. Junction * pJunction= mxodr.GetJunction(mpCBJunction->currentIndex());
  3956. if(pJunction == NULL)
  3957. {
  3958. QMessageBox::warning(this,"warn","can't find junction");
  3959. return ;
  3960. }
  3961. if(pJunction->GetJunctionConnectionCount() == 0)
  3962. {
  3963. mxodr.DeleteJunction(mpCBJunction->currentIndex());
  3964. updateJunction();
  3965. return;
  3966. }
  3967. JunctionConnection * pJC = pJunction->GetJunctionConnection(mpCBJunctionConnection->currentIndex());
  3968. if(pJC == NULL)
  3969. {
  3970. QMessageBox::warning(this,"warn","can't find junction connetion.");
  3971. return;
  3972. }
  3973. if(pJC->GetJunctionLaneLinkCount() == 0)
  3974. {
  3975. pJunction->DeleteJunctionConnection(mpCBJunctionConnection->currentIndex());
  3976. if(pJunction->GetJunctionConnectionCount() > 0)
  3977. onClickCBJunctionChange(mpCBJunction->currentIndex());
  3978. else
  3979. {
  3980. mxodr.DeleteJunction(mpCBJunction->currentIndex());
  3981. updateJunction();
  3982. }
  3983. return;
  3984. }
  3985. // std::string strincommingroad = mpLabelJunctionIncommingRoad->text().toStdString();
  3986. // std::string strconnectionroad = mpLabelJunctionConnectingRoad->text().toStdString();
  3987. // std::string strcontact = mpLabelJunctionContactPoint->text().toStdString();
  3988. int nllindex = mpCBJunctionFromTo->currentIndex();
  3989. pJC->DeleteJunctionLaneLink(nllindex);
  3990. onClickCBJunctionConnectionChange(mpCBJunctionConnection->currentIndex());
  3991. }
  3992. void MainWindow::onClickPreNxtRoadChange(int index)
  3993. {
  3994. mpCBPreNxtRelLane->clear();
  3995. Road * pRoad = mxodr.GetRoad(index);
  3996. if(pRoad == NULL)
  3997. {
  3998. return;
  3999. }
  4000. LaneSection * pLS;
  4001. if(strncmp(mpCBPreNxtConatact->currentText().toStdString().data(),"start",255)==0)
  4002. {
  4003. pLS = pRoad->GetLaneSection(0);
  4004. }
  4005. else
  4006. {
  4007. pLS = pRoad->GetLaneSection(pRoad->GetLaneSectionCount()-1);
  4008. }
  4009. if(pLS == NULL)
  4010. {
  4011. std::cout<<"MainWindow::onClickPreNxtRoadChange can't find lanesection"<<std::endl;
  4012. return;
  4013. }
  4014. int nlanecount = pLS->GetLaneCount();
  4015. int i;
  4016. for(i=0;i<nlanecount;i++)
  4017. {
  4018. Lane * pLane = pLS->GetLane(i);
  4019. char strout[255];
  4020. snprintf(strout,255,"%d %s",pLane->GetId(),pLane->GetType().data());
  4021. mpCBPreNxtRelLane->addItem(strout);
  4022. }
  4023. }
  4024. void MainWindow::onClickSetRoadPredecessor()
  4025. {
  4026. Road * pRoad = mxodr.GetRoad(mpCBRoad->currentIndex());
  4027. if(pRoad == NULL)
  4028. {
  4029. return;
  4030. }
  4031. Road * pOtherRoad = mxodr.GetRoad(mpCBPreNxtRoad->currentIndex());
  4032. if(pOtherRoad == NULL)
  4033. {
  4034. return;
  4035. }
  4036. std::string strcontact = mpCBPreNxtConatact->currentText().toStdString();
  4037. int curlane = mpCBRoadShowPre->currentIndex();
  4038. int otherlane = mpCBPreNxtRelLane->currentIndex();
  4039. pRoad->SetPredecessor("road",pOtherRoad->GetRoadId(),strcontact);
  4040. LaneSection * pLS = pRoad->GetLaneSection(0);
  4041. Lane * pLane =pLS->GetLane(curlane);
  4042. LaneSection * pLSOther;
  4043. if(strncmp(strcontact.data(),"start",0) == 0)
  4044. {
  4045. pLSOther = pOtherRoad->GetLaneSection(0);
  4046. }
  4047. else
  4048. {
  4049. pLSOther = pOtherRoad->GetLaneSection(pOtherRoad->GetLaneSectionCount()-1);
  4050. }
  4051. Lane * pLaneOther = pLSOther->GetLane(otherlane);
  4052. if(pLaneOther == NULL)
  4053. {
  4054. QMessageBox::warning(this,"warn","no this lane.");
  4055. return;
  4056. }
  4057. pLane->SetPredecessor(pLaneOther->GetId());
  4058. onClickCBRoadChange(mpCBRoad->currentIndex());
  4059. }
  4060. void MainWindow::onClickSetRoadSuccessor()
  4061. {
  4062. Road * pRoad = mxodr.GetRoad(mpCBRoad->currentIndex());
  4063. if(pRoad == NULL)
  4064. {
  4065. return;
  4066. }
  4067. Road * pOtherRoad = mxodr.GetRoad(mpCBPreNxtRoad->currentIndex());
  4068. if(pOtherRoad == NULL)
  4069. {
  4070. return;
  4071. }
  4072. std::string strcontact = mpCBPreNxtConatact->currentText().toStdString();
  4073. int curlane = mpCBRoadShowNext->currentIndex();
  4074. int otherlane = mpCBPreNxtRelLane->currentIndex();
  4075. pRoad->SetSuccessor("road",pOtherRoad->GetRoadId(),strcontact);
  4076. LaneSection * pLS = pRoad->GetLaneSection(pRoad->GetLaneSectionCount()-1);
  4077. Lane * pLane =pLS->GetLane(curlane);
  4078. LaneSection * pLSOther;
  4079. if(strncmp(strcontact.data(),"start",0) == 0)
  4080. {
  4081. pLSOther = pOtherRoad->GetLaneSection(0);
  4082. }
  4083. else
  4084. {
  4085. pLSOther = pOtherRoad->GetLaneSection(pOtherRoad->GetLaneSectionCount()-1);
  4086. }
  4087. Lane * pLaneOther = pLSOther->GetLane(otherlane);
  4088. if(pLaneOther == NULL)
  4089. {
  4090. QMessageBox::warning(this,"warn","no this lane.");
  4091. return;
  4092. }
  4093. pLane->SetSuccessor(pLaneOther->GetId());
  4094. onClickCBRoadChange(mpCBRoad->currentIndex());
  4095. }
  4096. void MainWindow::onClickDelRoadPredecessor()
  4097. {
  4098. Road * pRoad = mxodr.GetRoad(mpCBRoad->currentIndex());
  4099. if(pRoad == NULL)
  4100. {
  4101. return;
  4102. }
  4103. int curlane = mpCBRoadShowPre->currentIndex();
  4104. LaneSection * pLS = pRoad->GetLaneSection(0);
  4105. Lane * pLane =pLS->GetLane(curlane);
  4106. if(pLane == 0)
  4107. {
  4108. return;
  4109. }
  4110. pLane->RemovePredecessor();
  4111. int i;
  4112. int nlanecount = pLS->GetLaneCount();
  4113. bool bAllNotHavePre = true;
  4114. for(i=0;i<nlanecount;i++)
  4115. {
  4116. Lane * pLa= pLS->GetLane(i);
  4117. if(pLa->IsPredecessorSet())
  4118. {
  4119. bAllNotHavePre = false;
  4120. break;
  4121. }
  4122. }
  4123. if(bAllNotHavePre)
  4124. {
  4125. pRoad->RemovePredecessor();
  4126. }
  4127. onClickCBRoadChange(mpCBRoad->currentIndex());
  4128. }
  4129. void MainWindow::onClickDelRoadSuccessor()
  4130. {
  4131. Road * pRoad = mxodr.GetRoad(mpCBRoad->currentIndex());
  4132. if(pRoad == NULL)
  4133. {
  4134. return;
  4135. }
  4136. int curlane = mpCBRoadShowNext->currentIndex();
  4137. LaneSection * pLS = pRoad->GetLaneSection(pRoad->GetLaneSectionCount()-1);
  4138. Lane * pLane =pLS->GetLane(curlane);
  4139. if(pLane == 0)
  4140. {
  4141. return;
  4142. }
  4143. pLane->RemoveSuccessor();
  4144. int i;
  4145. int nlanecount = pLS->GetLaneCount();
  4146. bool bAllNotHaveNxt = true;
  4147. for(i=0;i<nlanecount;i++)
  4148. {
  4149. Lane * pLa= pLS->GetLane(i);
  4150. if(pLa->IsSuccessorSet())
  4151. {
  4152. bAllNotHaveNxt = false;
  4153. break;
  4154. }
  4155. }
  4156. if(bAllNotHaveNxt)
  4157. {
  4158. pRoad->RemoveSuccessor();
  4159. }
  4160. onClickCBRoadChange(mpCBRoad->currentIndex());
  4161. }
  4162. void MainWindow::onClickAutoConnect()
  4163. {
  4164. AutoConnect pAC(&mxodr);
  4165. pAC.Connect();
  4166. updateJunction();
  4167. }
  4168. void MainWindow::on_actionLoad_triggered()
  4169. {
  4170. onClickLoad();
  4171. }
  4172. void MainWindow::on_actionSave_triggered()
  4173. {
  4174. onClickSave();
  4175. }
  4176. void MainWindow::on_actionAutoConnect_triggered()
  4177. {
  4178. onClickAutoConnect();
  4179. }
  4180. void MainWindow::on_actionSet_Speed_triggered()
  4181. {
  4182. SpeedDialog sd(&mxodr,this);
  4183. int res = sd.exec();
  4184. }
  4185. void MainWindow::closeEvent(QCloseEvent *event)
  4186. {
  4187. if(mxodr.GetRoadCount() == 0)
  4188. {
  4189. event->accept(); // 接受退出信号,程序退出
  4190. return;
  4191. }
  4192. QMessageBox::StandardButton button;
  4193. button=QMessageBox::question(this,tr("退出程序"),QString(tr("确认退出程序")),QMessageBox::Yes|QMessageBox::No);
  4194. if(button==QMessageBox::No)
  4195. {
  4196. event->ignore(); // 忽略退出信号,程序继续进行
  4197. }
  4198. else if(button==QMessageBox::Yes)
  4199. {
  4200. event->accept(); // 接受退出信号,程序退出
  4201. }
  4202. }
  4203. void MainWindow::onViewBeishuchange(double fbeishu)
  4204. {
  4205. mfbeishu = fbeishu;
  4206. int i;
  4207. int nsize = mvectorroadview.size();
  4208. for(i=0;i<nsize;i++)
  4209. {
  4210. mvectorroadview.at(i)->setratio(1.0/mfbeishu);
  4211. }
  4212. }
  4213. void MainWindow::updateView()
  4214. {
  4215. int i;
  4216. int nsize = mvectorroadview.size();
  4217. for(i=0;i<nsize;i++)
  4218. {
  4219. mpscene->removeItem(mvectorroadview.at(i));
  4220. delete mvectorroadview.at(i);
  4221. }
  4222. mvectorroadview.clear();
  4223. for(i=0;i<mxodr.GetRoadCount();i++)
  4224. {
  4225. roadviewitem * prvw = new roadviewitem(mxodr.GetRoad(i));
  4226. prvw->setPos(0+mfViewMoveX,0 + mfViewMoveY);
  4227. // prvw->setPos(mnMoveX/mfbeishu,mnMoveY/mfbeishu);
  4228. prvw->setratio(1.0/mfbeishu);
  4229. mvectorroadview.push_back(prvw);
  4230. mpscene->addItem(prvw);
  4231. }
  4232. mpscene->update();
  4233. mbRefresh = true;
  4234. update();
  4235. }
  4236. void MainWindow::onClickSetMove()
  4237. {
  4238. double fMoveX = mpLE_SelX->text().toDouble();
  4239. double fMoveY = mpLE_SelY->text().toDouble();
  4240. mfViewMoveX = mfViewMoveX - fMoveX;
  4241. mfViewMoveY = mfViewMoveY + fMoveY;
  4242. updateView();
  4243. }
  4244. void MainWindow::onClickSetShow(bool bShow)
  4245. {
  4246. QCheckBox * pCheck = (QCheckBox * )sender();
  4247. int i;
  4248. bool bUpdate = false;
  4249. if(pCheck == mpCheckShowLane)
  4250. {
  4251. int nsize = mvectorroadview.size();
  4252. for(i=0;i<nsize;i++)
  4253. {
  4254. mvectorroadview[i]->setlaneshow(bShow);
  4255. }
  4256. bUpdate = true;
  4257. }
  4258. if(pCheck == mpCheckShowLine)
  4259. {
  4260. int nsize = mvectorroadview.size();
  4261. for(i=0;i<nsize;i++)
  4262. {
  4263. mvectorroadview[i]->setlineshow(bShow);
  4264. }
  4265. bUpdate = true;
  4266. }
  4267. if(pCheck == mpCheckShowRoadID)
  4268. {
  4269. int nsize = mvectorroadview.size();
  4270. for(i=0;i<nsize;i++)
  4271. {
  4272. mvectorroadview[i]->setroadidshow(bShow);
  4273. }
  4274. bUpdate = true;
  4275. }
  4276. if(bUpdate)
  4277. {
  4278. mpscene->update();
  4279. }
  4280. }