mainwindow.cpp 152 KB

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