VDSM200MF.cpp 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #include "ITSSkinF.h"
  4. #include "ITSUtilF.h"
  5. #include "AppGlobalF.h"
  6. #include "CDSCodeF.h"
  7. #include "CDSFacilityF.h"
  8. #include "CDSNodeF.h"
  9. #include "CDSLinkF.h"
  10. #include "ITSLangTransF.h"
  11. #include "ITSMapF.h"
  12. #include "CDSLayerF.h"
  13. #pragma hdrstop
  14. #include "VDSM200MF.h"
  15. //---------------------------------------------------------------------------
  16. #pragma package(smart_init)
  17. #pragma link "FRAME_VdsDtctListF"
  18. #pragma link "FRAME_VdsListF"
  19. #pragma link "cxButtons"
  20. #pragma link "cxCheckBox"
  21. #pragma link "cxClasses"
  22. #pragma link "cxContainer"
  23. #pragma link "cxControls"
  24. #pragma link "cxCustomData"
  25. #pragma link "cxData"
  26. #pragma link "cxDataStorage"
  27. #pragma link "cxDropDownEdit"
  28. #pragma link "cxEdit"
  29. #pragma link "cxFilter"
  30. #pragma link "cxGraphics"
  31. #pragma link "cxGrid"
  32. #pragma link "cxGridCustomTableView"
  33. #pragma link "cxGridCustomView"
  34. #pragma link "cxGridLevel"
  35. #pragma link "cxGridTableView"
  36. #pragma link "cxGroupBox"
  37. #pragma link "cxLabel"
  38. #pragma link "cxLookAndFeelPainters"
  39. #pragma link "cxLookAndFeels"
  40. #pragma link "cxMaskEdit"
  41. #pragma link "cxSpinEdit"
  42. #pragma link "cxSplitter"
  43. #pragma link "cxStyles"
  44. #pragma link "cxTextEdit"
  45. #pragma link "dxSkinBlack"
  46. #pragma link "dxSkinBlue"
  47. #pragma link "dxSkinsCore"
  48. #pragma link "dxSkinscxPCPainter"
  49. #pragma link "FRAME_OpenMapF"
  50. #pragma link "cxCalc"
  51. #pragma resource "*.dfm"
  52. TVDSM200M *VDSM200M = NULL;
  53. //---------------------------------------------------------------------------
  54. void TVDSM200M_MapCallback(TObject *ASender, const String AFunc, const String AArgs, const bool AFirst)
  55. {
  56. try
  57. {
  58. if (!VDSM200M) return;
  59. VDSM200M->OpenMapCallback(ASender, AFunc, AArgs, AFirst);
  60. }
  61. catch(Exception &exception)
  62. {
  63. }
  64. }
  65. //---------------------------------------------------------------------------
  66. //---------------------------------------------------------------------------
  67. __fastcall TVDSM200M::TVDSM200M(TComponent* Owner)
  68. : TForm(Owner)
  69. {
  70. LangTrans->Translate(this, ITSDb_GetConnection());
  71. ITSSkin_Load(this);
  72. CMM_LoadForm(g_sFormsDir, this);
  73. FUpdate= false;
  74. FTitle = Caption;//"VDS-검지기 관리";
  75. m_pGDC = FRAMEVdsDtctList1->TvList->DataController;
  76. FRAMEVdsList1->PnlTop->Visible = false;
  77. FRAMEVdsList1->PnlBottom->Visible = false;
  78. FRAMEVdsList1->ColumnSel->Visible = false;
  79. FRAMEVdsList1->Column02->Visible = false;
  80. FRAMEVdsList1->Column04->Visible = false;
  81. FRAMEVdsList1->Column05->Visible = false;
  82. FRAMEVdsList1->Column07->Visible = false;
  83. FRAMEVdsList1->Column08->Visible = false;
  84. FRAMEVdsList1->Column11->Visible = false;
  85. FRAMEVdsDtctList1->PnlTop->Visible = false;
  86. FRAMEVdsDtctList1->PnlBottom->Visible = false;
  87. FRAMEVdsDtctList1->ColumnSel->Visible = false;
  88. FRAMEVdsDtctList1->Column09->Visible = true;//검지차로
  89. FLayerIdx = LyrTp_Vds;
  90. FRAMEOpenMap1->LayerIdx = FLayerIdx;
  91. FRAMEOpenMap1->MapCallbackFunc = TVDSM200M_MapCallback;
  92. TvLink->OptionsView->NoDataToDisplayInfoText = FrmLang->lblNoInfo->Caption;//"<VDS 검지기 링크구성정보>";
  93. EditMode = false;
  94. }
  95. //---------------------------------------------------------------------------
  96. void __fastcall TVDSM200M::CommClose()
  97. {
  98. try
  99. {
  100. CMM_SaveForm(g_sFormsDir, this);
  101. }
  102. catch(...)
  103. {
  104. }
  105. }
  106. //---------------------------------------------------------------------------
  107. void __fastcall TVDSM200M::FormShow(TObject *Sender)
  108. {
  109. Refresh();
  110. FRAMEOpenMap1->OpenMap();
  111. CbCTLR_MNGM_NMBR->Properties->Items->Clear();
  112. VdsCtlrManager->FLists.Lock();
  113. try
  114. {
  115. FOR_STL(TVdsCtlr*, pObj, VdsCtlrManager->FLists)
  116. {
  117. if (pObj->DEL_YN == "Y") continue;
  118. String sId = String(pObj->VDS_CTLR_NMBR); //관리번호
  119. String sNm = pObj->VDS_NM; //위치
  120. CbCTLR_MNGM_NMBR->Properties->Items->Add("[" + sId + "] " + sNm);
  121. }
  122. }
  123. __finally
  124. {
  125. VdsCtlrManager->FLists.UnLock();
  126. }
  127. CbCTLR_MNGM_NMBR->ItemIndex = -1;
  128. APP_FillCode(CbType, "DTT");
  129. APP_FillCode(Cb_DTCT_DIR, "VCD");
  130. FormInit();
  131. ChangeEditMode(1);
  132. TmrShow->Enabled = true;
  133. }
  134. //---------------------------------------------------------------------------
  135. void __fastcall TVDSM200M::FormInit()
  136. {
  137. //제공구간목록이 초기화되기전에 이전정보를 지도에서 지워준다.
  138. if (FRAMEOpenMap1->MapStart)
  139. {
  140. int nRow;
  141. TcxDataController *pGDC = TvLink->DataController;
  142. try
  143. {
  144. int nSeq = 1;
  145. for (int ii = 0; ii < pGDC->RecordCount; ii++)
  146. {
  147. String sLinkId = pGDC->Values[ii][ColLink2->Index];
  148. sJs.printf(L"updateEditLink('%s', 0)", sLinkId.c_str());
  149. FRAMEOpenMap1->ExecScript(sJs);
  150. }
  151. }
  152. catch(...)
  153. {
  154. }
  155. }
  156. EdVdsCtrl->Text = "";
  157. EdNmbr->Text = "";
  158. EdDtctId->Text = "";
  159. EdDtctNm->Text = "";
  160. CbType->ItemIndex = 0;
  161. Cb_DTCT_DIR->ItemIndex = 0;
  162. Se_DETECT_LANE->Value = 1;
  163. Se_ISTL_LANE->Value = 1;
  164. Se_MIN_TFVL->Value = 0;
  165. Se_MAX_TFVL->Value = 150;
  166. Se_MIN_OCPY_RATE->Value = 0.0;
  167. Se_MAX_OCPY_RATE->Value = 100.0;
  168. Se_MIN_SPED->Value = 0;
  169. Se_MAX_SPED->Value = 150;
  170. Cb_USE_YN->ItemIndex = 1;
  171. CMM_ClearGridTableView(TvLink);
  172. FNewDb = false;
  173. }
  174. //---------------------------------------------------------------------------
  175. void __fastcall TVDSM200M::TmrShowTimer(TObject *Sender)
  176. {
  177. TmrShow->Enabled = false;
  178. FRAMEVdsList1->UpdateList();
  179. VdsCtlrManager->LoadFromDtctLinkDb();
  180. UpdateList();
  181. }
  182. //---------------------------------------------------------------------------
  183. void __fastcall TVDSM200M::UpdateList()
  184. {
  185. FRAMEVdsDtctList1->UpdateList();
  186. }
  187. //---------------------------------------------------------------------------
  188. void __fastcall TVDSM200M::BtnCloseClick(TObject *Sender)
  189. {
  190. Close();
  191. }
  192. //---------------------------------------------------------------------------
  193. void __fastcall TVDSM200M::FormClose(TObject *Sender, TCloseAction &Action)
  194. {
  195. CommClose();
  196. VDSM200M = NULL;
  197. Action = caFree;
  198. }
  199. //---------------------------------------------------------------------------
  200. void __fastcall TVDSM200M::FormCloseQuery(TObject *Sender, bool &CanClose)
  201. {
  202. if (FUpdate)
  203. {
  204. POST_MSG(Application->MainForm->Handle, WM_DATABASE_REFRESH, WP_MSG_14, 0);
  205. }
  206. FRAMEVdsList1->OnCloseQuery(CanClose);
  207. FRAMEVdsDtctList1->OnCloseQuery(CanClose);
  208. FRAMEOpenMap1->OnCloseQuery(CanClose);
  209. }
  210. //---------------------------------------------------------------------------
  211. void __fastcall TVDSM200M::DisplayInfo(TVdsDtct* AObj)
  212. {
  213. FormInit();
  214. if (!AObj) return;
  215. EdVdsCtrl->Text = String(AObj->VDS_CTLR_NMBR);
  216. EdNmbr->Text = AObj->VDS_DTCT_NMBR;
  217. EdDtctId->Text = AObj->VDS_DTCT_ID;
  218. EdDtctNm->Text = AObj->VDS_DTCT_NM;
  219. CMM_SetComboBoxItem(CbCTLR_MNGM_NMBR, String(AObj->VDS_CTLR_NMBR));
  220. CMM_SetComboBoxItem(CbVDS_CMRA_NO, String(AObj->VDS_CMRA_NO));
  221. APP_SetCode(CbType, AObj->DTCT_TYPE);
  222. APP_SetCode(Cb_DTCT_DIR, AObj->DTCT_DIR);
  223. Se_DETECT_LANE->Value = AObj->DETECT_LANE;
  224. Se_ISTL_LANE->Value = AObj->ISTL_LANE;
  225. Se_MIN_TFVL->Value = AObj->MIN_TFVL;
  226. Se_MAX_TFVL->Value = AObj->MAX_TFVL;
  227. Se_MIN_OCPY_RATE->Value = AObj->MIN_OCPY_RATE;
  228. Se_MAX_OCPY_RATE->Value = AObj->MAX_OCPY_RATE;
  229. Se_MIN_SPED->Value = AObj->MIN_SPED;
  230. Se_MAX_SPED->Value = AObj->MAX_SPED;
  231. Cb_USE_YN->Text = String(AObj->VDS_CTLR_NMBR);
  232. ChangeEditMode(3);
  233. DisplayLink(AObj);
  234. }
  235. //---------------------------------------------------------------------------
  236. void __fastcall TVDSM200M::DisplayLink(TVdsDtct* AObj)
  237. {
  238. if (!AObj) return;
  239. CMM_ClearGridTableView(TvLink);
  240. String sLinkIds = "";
  241. try
  242. {
  243. int nRow;
  244. TcxDataController *pGDC = TvLink->DataController;
  245. TvLink->BeginUpdate();
  246. FOR_STL(TVdsDtctLink *, pObj, AObj->FLinks)
  247. {
  248. String LINK_ID = pObj->LINK_ID;
  249. nRow = pGDC->AppendRecord();
  250. pGDC->Values[nRow][ColLink2->Index] = LINK_ID;
  251. TItsLink *pLink = ItsLinkManager->FLists.Find(LINK_ID);
  252. if (pLink)
  253. {
  254. TItsNode *pNode;
  255. pGDC->Values[nRow][ColLink3->Index] = pLink->F_NODE_ID;
  256. pGDC->Values[nRow][ColLink5->Index] = pLink->T_NODE_ID;
  257. pNode = ItsNodeManager->FLists.Find(pLink->F_NODE_ID);
  258. if (pNode)
  259. {
  260. pGDC->Values[nRow][ColLink4->Index] = pNode->NODE_NAME;
  261. }
  262. pNode = ItsNodeManager->FLists.Find(pLink->T_NODE_ID);
  263. if (pNode)
  264. {
  265. pGDC->Values[nRow][ColLink6->Index] = pNode->NODE_NAME;
  266. }
  267. if (sLinkIds == "") sLinkIds = LINK_ID;
  268. else sLinkIds = sLinkIds+","+LINK_ID;
  269. }
  270. }
  271. }
  272. __finally
  273. {
  274. TvLink->EndUpdate();
  275. }
  276. RefreshLink();
  277. if (sLinkIds != "")
  278. {
  279. sJs.printf(L"extentLayerObject(%d, '%s')", LyrTp_Traffic, sLinkIds.c_str());
  280. FRAMEOpenMap1->ExecScript(sJs);
  281. }
  282. }
  283. //---------------------------------------------------------------------------
  284. void __fastcall TVDSM200M::UpdateIcon()
  285. {
  286. if (!FRAMEOpenMap1->MapStart) return;
  287. sJs.printf(L"removeLayerObject(%d)", FLayerIdx);
  288. FRAMEOpenMap1->ExecScript(sJs);
  289. String arrObj = "";
  290. String sTemp;
  291. VdsCtlrManager->FLists.Lock();
  292. try
  293. {
  294. FOR_STL(TVdsCtlr*, pObj, VdsCtlrManager->FLists)
  295. {
  296. if (pObj->DEL_YN == "Y") continue;
  297. if (arrObj != "") arrObj += "|";
  298. sTemp.printf(L"%s,%s,%s,%.6f,%.6f,0,0,0,0", pObj->VDS_CTLR_NMBR.c_str(), pObj->VDS_CTLR_ID.c_str(), pObj->VDS_NM.c_str(), pObj->X_CRDN, pObj->Y_CRDN);
  299. arrObj += sTemp;
  300. }
  301. }
  302. __finally
  303. {
  304. VdsCtlrManager->FLists.UnLock();
  305. if (arrObj != "")
  306. {
  307. sJs.printf(L"addFacility(%d, '%s')", FLayerIdx, arrObj.c_str());
  308. FRAMEOpenMap1->ExecScript(sJs);
  309. }
  310. }
  311. }
  312. //---------------------------------------------------------------------------
  313. void __fastcall TVDSM200M::BtnEditClick(TObject *Sender)
  314. {
  315. if (BtnEdit->Caption == FrmLang->lblEdit->Caption)//"편집")
  316. {
  317. ChangeEditMode(0);
  318. FNewDb = false;
  319. }
  320. else
  321. {
  322. String sVdsCtrlId = EdVdsCtrl->Text;
  323. String sDtctId = EdNmbr->Text;
  324. ChangeEditMode(1);
  325. TVdsCtlr *pVds = VdsCtlrManager->FLists.Find(sVdsCtrlId);
  326. if (pVds)
  327. {
  328. TVdsDtct *pObj = pVds->FDtcts.Find(sDtctId);
  329. if (pObj)
  330. {
  331. CMM_SetGridRow(FRAMEVdsDtctList1->CxList, FRAMEVdsDtctList1->TvList, sDtctId, FRAMEVdsDtctList1->Column02->Index);
  332. DisplayInfo(pObj);
  333. }
  334. }
  335. }
  336. }
  337. //---------------------------------------------------------------------------
  338. void __fastcall TVDSM200M::ChangeEditMode(int AEdit)
  339. {
  340. bool bGisEdit = true;
  341. bool bEnabled = false;
  342. switch(AEdit)
  343. {
  344. case 0: //편집버튼클릭
  345. {
  346. BtnEdit->Enabled = true;
  347. BtnInsert->Enabled = false;
  348. BtnDelete->Enabled = false;
  349. BtnSave->Enabled = true;
  350. BtnEdit->Caption = FrmLang->lblCancel->Caption;//"취소";
  351. BtnEdit->Hint = FrmLang->lblCancel->Hint;//데이터 편집 취소";
  352. bEnabled = true;
  353. EditMode = true;
  354. }
  355. break;
  356. case 1: //편집[취소]버튼클릭
  357. {
  358. FormInit(); //화면을 모두 지운다.
  359. BtnEdit->Enabled = false;
  360. BtnInsert->Enabled = true;
  361. BtnDelete->Enabled = false;
  362. BtnSave->Enabled = false;
  363. BtnEdit->Caption = FrmLang->lblEdit->Caption;//"편집";
  364. BtnEdit->Hint = FrmLang->lblEdit->Hint;//데이터 편집";
  365. bEnabled = true;
  366. bGisEdit = false;
  367. EditMode = false;
  368. }
  369. break;
  370. case 2: //추가
  371. {
  372. BtnEdit->Enabled = true;
  373. BtnInsert->Enabled = false;
  374. BtnDelete->Enabled = false;
  375. BtnSave->Enabled = true;
  376. BtnEdit->Caption = FrmLang->lblCancel->Caption;//"취소";
  377. BtnEdit->Hint = FrmLang->lblCancel->Hint;//데이터 편집 취소";
  378. bEnabled = false;
  379. EditMode = true;
  380. }
  381. break;
  382. case 3: //수정모드
  383. {
  384. BtnEdit->Enabled = true;
  385. BtnInsert->Enabled = true;
  386. BtnDelete->Enabled = true;
  387. BtnSave->Enabled = false;
  388. BtnEdit->Caption = FrmLang->lblEdit->Caption;//"편집";
  389. BtnEdit->Hint = FrmLang->lblEdit->Hint;//데이터 편집";
  390. bEnabled = true;
  391. EditMode = true;
  392. }
  393. break;
  394. }
  395. if (AEdit == 0 || AEdit == 2)
  396. {
  397. FRAMEVdsDtctList1->CxList->Enabled = false;
  398. }
  399. else
  400. {
  401. FRAMEVdsDtctList1->CxList->Enabled = true;
  402. }
  403. CbCTLR_MNGM_NMBR->Properties->ReadOnly = bEnabled;
  404. PnlEdit->Enabled = EditMode;
  405. }
  406. //---------------------------------------------------------------------------
  407. void __fastcall TVDSM200M::BtnInsertClick(TObject *Sender)
  408. {
  409. FormInit();
  410. //신규아이디를 얻어와서 화면을 초기화한다.
  411. String sId;
  412. int nNmbr, nId;
  413. #if 1
  414. if (!VdsCtlrManager->GetNextVdsDtctId(nNmbr, nId))
  415. {
  416. Application->MessageBox(lblText1->Caption.c_str(),//L"새로운 검지기 번호를 생성하지 못하였습니다.\r\n프로그램 종료후에 다시 시도해 보세요.",
  417. FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  418. return;
  419. }
  420. sId = String(nNmbr);
  421. #else
  422. sId = InputBox("검지기 번호", "신규 검지기 번호를 입력하세요(10Byte).", "검지기 번호" );
  423. sId = sId.Trim();
  424. if (sId == "검지기 번호" || sId == "")
  425. {
  426. return;
  427. }
  428. if (AnsiString(sId).Length() > 10)
  429. {
  430. Application->MessageBox(L"검지기 번호는 10Byte를 초과할 수 없습니다.", FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  431. return;
  432. }
  433. VdsCtlrManager->FLists.Lock();
  434. try
  435. {
  436. FOR_STL(TVdsCtlr*, pObj, VdsCtlrManager->FLists)
  437. {
  438. TVdsDtct *pDb = pObj->FSubLists.Find(sId);
  439. if (pDb)
  440. {
  441. String sErr = FrmLang->lbIdErr->Caption + "[" + sId + "]";
  442. Application->MessageBox(sErr.c_str(),//("[" + sId + "]는 사용할 수 없는 검지기 번호 입니다.").c_str(),
  443. FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  444. return;
  445. }
  446. }
  447. }
  448. __finally
  449. {
  450. VdsCtlrManager->FLists.UnLock();
  451. }
  452. #endif
  453. EdVdsCtrl->Text = "";
  454. EdNmbr->Text = sId;
  455. ChangeEditMode(2);
  456. FNewDb = true;
  457. }
  458. //---------------------------------------------------------------------------
  459. void __fastcall TVDSM200M::BtnDeleteClick(TObject *Sender)
  460. {
  461. int nIdx = m_pGDC->FocusedRecordIndex;
  462. if (nIdx < 0) return;
  463. String sId = EdNmbr->Text;
  464. if (sId.IsEmpty())
  465. {
  466. Application->MessageBox(lblText2->Caption.c_str(),//L"삭제할 검지기를 목록에서 선택하세요.\r\n목록에서 더블클릭하여 선택합니다.",
  467. FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  468. return;
  469. }
  470. String sMsg;
  471. sMsg = lblText3->Caption + ": " + sId;//"검지기번호: " + sId;
  472. sMsg+= "\r\n" + lblText4->Caption;//"선택하신 검지기 정보를 삭제하시겠습니까?";
  473. if (Application->MessageBox(sMsg.c_str(), FTitle.c_str(), MB_YESNO|MB_ICONQUESTION|MB_APPLMODAL) != IDYES) return;
  474. TVdsDtct *pObj = NULL;
  475. try
  476. {
  477. VdsCtlrManager->FLists.Lock();
  478. FOR_STL(TVdsCtlr*, pVds, VdsCtlrManager->FLists)
  479. {
  480. pObj = pVds->FDtcts.Find(sId);
  481. if (pObj)
  482. {
  483. break;
  484. }
  485. }
  486. }
  487. __finally
  488. {
  489. VdsCtlrManager->FLists.UnLock();
  490. }
  491. if (pObj)
  492. {
  493. if (VdsCtlrManager->DeleteVdsDtct(pObj))
  494. {
  495. pObj->DEL_YN = "Y";
  496. UpdateList();
  497. }
  498. Application->MessageBox(lblText5->Caption.c_str(),//L"검지기 정보삭제\r\n검지기 정보를 삭제 하였습니다.",
  499. FTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  500. FUpdate = true;
  501. FormInit();
  502. ChangeEditMode(1);
  503. }
  504. }
  505. //---------------------------------------------------------------------------
  506. void __fastcall TVDSM200M::BtnSaveClick(TObject *Sender)
  507. {
  508. TVdsCtlr *pVds;
  509. TVdsDtct *pObj;
  510. String sId = EdNmbr->Text;
  511. String sCtrlId = ITSUtil_GetCode(CbCTLR_MNGM_NMBR->Text); // 제어기 관리 번호
  512. String sCmraNo = ITSUtil_GetCode(CbVDS_CMRA_NO->Text); // 카메라 번호
  513. pVds = VdsCtlrManager->FLists.Find(sCtrlId);
  514. if (!pVds ||
  515. EdDtctId->Text.Trim().IsEmpty() ||
  516. // EdVdsCtrl->Text.Trim().IsEmpty() ||
  517. EdNmbr->Text.Trim().IsEmpty() ||
  518. EdDtctNm->Text.Trim().IsEmpty() ||
  519. CbCTLR_MNGM_NMBR->ItemIndex < 0 ||
  520. CbVDS_CMRA_NO->ItemIndex < 0 )
  521. {
  522. Application->MessageBox(FrmLang->lblCnfm->Caption.c_str(),//L"★항목은 필수 입력 항목입니다.\r\n모두 입력후 진행해 주세요.",
  523. FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  524. return;
  525. }
  526. if (!FNewDb)
  527. {
  528. //수정모드일때 컨트롤러가 다르다면 신규로 처리한다.
  529. if (EdVdsCtrl->Text != sCtrlId)
  530. {
  531. TVdsCtlr *pTmpVds = VdsCtlrManager->FLists.Find(EdVdsCtrl->Text);
  532. if (pTmpVds)
  533. {
  534. pTmpVds->FDtcts.Remove(sId);
  535. }
  536. FNewDb = true;
  537. }
  538. }
  539. if (FNewDb)
  540. pObj = new TVdsDtct();
  541. else
  542. pObj = pVds->FDtcts.Find(sId);
  543. if (pObj)
  544. {
  545. pObj->VDS_DTCT_NMBR = sId;
  546. pObj->VDS_DTCT_ID = EdDtctId->Text.Trim();
  547. pObj->VDS_DTCT_NM = EdDtctNm->Text.Trim();
  548. pObj->VDS_CTLR_NMBR = sCtrlId.ToIntDef(0);
  549. pObj->VDS_CMRA_NO = sCmraNo.ToIntDef(0);
  550. pObj->DTCT_TYPE = APP_GetCode(CbType);
  551. pObj->DTCT_DIR = APP_GetCode(Cb_DTCT_DIR);
  552. pObj->DETECT_LANE = Se_DETECT_LANE->Value;
  553. pObj->ISTL_LANE = Se_ISTL_LANE->Value;
  554. pObj->SPED_CLCT_YN = Chk_SPED_CLCT_YN->Checked ? "Y" : "N";
  555. pObj->TFVL_CLCT_YN = Chk_TFVL_CLCT_YN->Checked ? "Y" : "N";
  556. pObj->OCPY_CLCT_YN = Chk_OCPY_CLCT_YN->Checked ? "Y" : "N";
  557. pObj->MAX_TFVL = Se_MAX_TFVL->Value;
  558. pObj->MIN_TFVL = Se_MIN_TFVL->Value;
  559. pObj->MAX_OCPY_RATE = Se_MAX_OCPY_RATE->Value;
  560. pObj->MIN_OCPY_RATE = Se_MIN_OCPY_RATE->Value;
  561. pObj->MAX_SPED = Se_MAX_SPED->Value;
  562. pObj->MIN_SPED = Se_MIN_SPED->Value;
  563. pObj->USE_YN = Cb_USE_YN->Text.Trim();
  564. pObj->DEL_YN = "N";
  565. pObj->MEM_DEL = "N";
  566. pObj->FLinks.RemoveAll();
  567. try {
  568. TvLink->BeginUpdate();
  569. for (int ii = 0; ii < TvLink->DataController->RecordCount; ii++)
  570. {
  571. String sLinkId = TvLink->DataController->Values[ii][ColLink2->Index];
  572. TVdsDtctLink *pObjLnk = new TVdsDtctLink();
  573. pObjLnk->VDS_CTLR_NMBR = pObj->VDS_CTLR_NMBR;
  574. pObjLnk->VDS_DTCT_NMBR = pObj->VDS_DTCT_NMBR;
  575. pObjLnk->LINK_ID = sLinkId;
  576. pObj->FLinks.Push(pObjLnk->LINK_ID, pObjLnk);
  577. pObjLnk->MEM_DEL = "N";
  578. }
  579. }
  580. __finally
  581. {
  582. TvLink->EndUpdate();
  583. }
  584. bool bResult;
  585. bResult = VdsCtlrManager->SaveVdsDtct(pObj);
  586. if (bResult)
  587. {
  588. Application->MessageBox(FrmLang->lblDbSave->Caption.c_str(),//L"VDS-검지기 정보저장\r\nVDS-검지기 정보를 저장 하였습니다.",
  589. FTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  590. if (FNewDb)
  591. {
  592. pVds->FDtcts.Push(pObj->VDS_DTCT_NMBR, pObj);
  593. }
  594. FUpdate = true;
  595. UpdateList();
  596. CMM_SetGridRow(FRAMEVdsDtctList1->CxList, FRAMEVdsDtctList1->TvList, sId, FRAMEVdsDtctList1->Column02->Index);
  597. int nRow = FRAMEVdsDtctList1->TvList->DataController->FocusedRecordIndex;
  598. if( nRow <= -1 )
  599. return;
  600. int nMemPtr = FRAMEVdsDtctList1->TvList->DataController->Values[nRow][FRAMEVdsDtctList1->Column99->Index];
  601. TVdsDtct* pObj = (TVdsDtct*)nMemPtr;
  602. DisplayInfo(pObj);
  603. }
  604. }
  605. }
  606. //---------------------------------------------------------------------------
  607. void __fastcall TVDSM200M::RefreshLink()
  608. {
  609. if (!FRAMEOpenMap1->MapStart) return;
  610. try
  611. {
  612. int nRow;
  613. TcxDataController *pGDC = TvLink->DataController;
  614. TvLink->BeginUpdate();
  615. try
  616. {
  617. int nSeq = 1;
  618. for (int ii = 0; ii < pGDC->RecordCount; ii++)
  619. {
  620. pGDC->Values[ii][ColSeq->Index] = nSeq;
  621. String sLinkId = pGDC->Values[ii][ColLink2->Index];
  622. sJs.printf(L"updateEditLink('%s', %d)", sLinkId.c_str(), nSeq);
  623. FRAMEOpenMap1->ExecScript(sJs);
  624. if (nSeq++ > ITSMAP_MAX_DISPCOLOR) nSeq = 1;
  625. }
  626. }
  627. catch(...)
  628. {
  629. }
  630. }
  631. __finally
  632. {
  633. TvLink->EndUpdate();
  634. }
  635. }
  636. //---------------------------------------------------------------------------
  637. void __fastcall TVDSM200M::BtnLinkDelClick(TObject *Sender)
  638. {
  639. int nSelRows = TvLink->Controller->SelectedRowCount;
  640. if (nSelRows <= 0)
  641. {
  642. Application->MessageBox(lblText13->Caption.c_str(),//L"삭제를 원하는 구간을 목록에서 선택하세요.",
  643. FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  644. return;
  645. }
  646. for (int ii = 0; ii < nSelRows; ii++)
  647. {
  648. int nSelIdx = TvLink->Controller->SelectedRows[ii]->RecordIndex;
  649. String sLinkId = TvLink->DataController->Values[nSelIdx][ColLink2->Index];
  650. sJs.printf(L"updateEditLink('%s', 0)", sLinkId.c_str());
  651. FRAMEOpenMap1->ExecScript(sJs);
  652. }
  653. TvLink->Controller->DeleteSelection();
  654. RefreshLink();
  655. }
  656. //---------------------------------------------------------------------------
  657. void __fastcall TVDSM200M::BtnLinkAddClick(TObject *Sender)
  658. {
  659. if (EdLinkId->Text.IsEmpty()) return;
  660. String sNewId = EdLinkId->Text;
  661. bool bFound = false;
  662. try
  663. {
  664. int nRow;
  665. TcxDataController *pGDC = TvLink->DataController;
  666. TvLink->BeginUpdate();
  667. for (int ii = 0; ii < pGDC->RecordCount; ii++)
  668. {
  669. String sLinkId = pGDC->Values[ii][ColLink2->Index];
  670. if (sNewId == sLinkId)
  671. {
  672. bFound = true;
  673. break;
  674. }
  675. }
  676. if (bFound)
  677. {
  678. Application->MessageBox(cxLabel10->Caption.c_str(), //L"이미 등록되어 있는 링크구간 입니다.\r\n링크 구간은 중복해서 등록 할 수 없습니다.",
  679. FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  680. return;
  681. }
  682. nRow = pGDC->AppendRecord();
  683. pGDC->Values[nRow][ColLink2->Index] = sNewId;
  684. TItsLink *pLink = ItsLinkManager->FLists.Find(sNewId);
  685. if (pLink)
  686. {
  687. TItsNode *pNode;
  688. pGDC->Values[nRow][ColLink3->Index] = pLink->F_NODE_ID;
  689. pGDC->Values[nRow][ColLink5->Index] = pLink->T_NODE_ID;
  690. pNode = ItsNodeManager->FLists.Find(pLink->F_NODE_ID);
  691. if (pNode)
  692. {
  693. pGDC->Values[nRow][ColLink4->Index] = pNode->NODE_NAME;
  694. }
  695. pNode = ItsNodeManager->FLists.Find(pLink->T_NODE_ID);
  696. if (pNode)
  697. {
  698. pGDC->Values[nRow][ColLink6->Index] = pNode->NODE_NAME;
  699. }
  700. }
  701. }
  702. __finally
  703. {
  704. TvLink->EndUpdate();
  705. }
  706. RefreshLink();
  707. }
  708. //---------------------------------------------------------------------------
  709. void __fastcall TVDSM200M::TvLinkCellDblClick(TcxCustomGridTableView *Sender, TcxGridTableDataCellViewInfo *ACellViewInfo,
  710. TMouseButton AButton, TShiftState AShift, bool &AHandled)
  711. {
  712. if (!FRAMEOpenMap1->MapStart) return;
  713. if (!ACellViewInfo) return;
  714. int nRow = TvLink->DataController->FocusedRecordIndex;
  715. if( nRow <= -1 )
  716. return;
  717. String sLinkId = TvLink->DataController->Values[nRow][ColLink2->Index];
  718. sJs.printf(L"extentLayerObject(%d, '%s')", LyrTp_Traffic, sLinkId.c_str());
  719. FRAMEOpenMap1->ExecScript(sJs);
  720. }
  721. //---------------------------------------------------------------------------
  722. void __fastcall TVDSM200M::FRAMEVdsDtctList1TvListCellDblClick(TcxCustomGridTableView *Sender, TcxGridTableDataCellViewInfo *ACellViewInfo,
  723. TMouseButton AButton, TShiftState AShift, bool &AHandled)
  724. {
  725. if (!ACellViewInfo) return;
  726. int nRow = FRAMEVdsDtctList1->TvList->DataController->FocusedRecordIndex;
  727. if( nRow <= -1 )
  728. return;
  729. int nMemPtr = FRAMEVdsDtctList1->TvList->DataController->Values[nRow][FRAMEVdsDtctList1->Column99->Index];
  730. TVdsDtct* pObj = (TVdsDtct*)nMemPtr;
  731. DisplayInfo(pObj);
  732. }
  733. //---------------------------------------------------------------------------
  734. void __fastcall TVDSM200M::FRAMEVdsList1TvListCellDblClick(TcxCustomGridTableView *Sender, TcxGridTableDataCellViewInfo *ACellViewInfo,
  735. TMouseButton AButton, TShiftState AShift, bool &AHandled)
  736. {
  737. if (!ACellViewInfo) return;
  738. int nRow = FRAMEVdsList1->TvList->DataController->FocusedRecordIndex;
  739. if( nRow <= -1 )
  740. return;
  741. int nMemPtr = FRAMEVdsList1->TvList->DataController->Values[nRow][FRAMEVdsList1->Column99->Index];
  742. TVdsCtlr* pObj = (TVdsCtlr*)nMemPtr;
  743. try {
  744. sJs.printf(L"selectLayerObject(%d, '%s', %d)", FLayerIdx, pObj->VDS_CTLR_NMBR.c_str(), FRAMEOpenMap1->MapZoom);
  745. FRAMEOpenMap1->ExecScript(sJs);
  746. } catch(...) { }
  747. }
  748. //---------------------------------------------------------------------------
  749. void __fastcall TVDSM200M::UpdateEditLink()
  750. {
  751. if (!FRAMEOpenMap1->MapStart) return;
  752. // int nZoom = ItsLayerManager->GetDefaultLinkLayer();
  753. // if (nZoom < 0) return;
  754. // TItsVrtx* pVrtx;
  755. TItsNode* pNode;
  756. String STRT_NM;
  757. String END_NM;
  758. try
  759. {
  760. ItsLinkManager->FLists.Lock();
  761. try
  762. {
  763. FOR_STL(TItsLink*, pLink, ItsLinkManager->FLists)
  764. {
  765. if (pLink->DEL_YN == "Y") continue;
  766. #if 0
  767. pVrtx = pLink->Vrtxs.Find(nZoom);
  768. if (!pVrtx) continue;
  769. pNode = ItsNodeManager->FLists.Find(pLink->F_NODE_ID);
  770. if (pNode) STRT_NM = pNode->NODE_NAME; else STRT_NM = " ";
  771. pNode = ItsNodeManager->FLists.Find(pLink->T_NODE_ID);
  772. if (pNode) END_NM = pNode->NODE_NAME; else END_NM = " ";
  773. sJs.printf(L"addEditLink('%s', '%s', '%s', '%s', '%s', '%s')",
  774. pLink->LINK_ID.c_str(),
  775. pLink->ROAD_NAME.c_str(),
  776. STRT_NM.c_str(),
  777. END_NM.c_str(),
  778. pVrtx->X_CRDN_ARR.c_str(),
  779. pVrtx->Y_CRDN_ARR.c_str());
  780. FRAMEOpenMap1->ExecScript(sJs);
  781. #else
  782. if (pLink->IsVertex)
  783. {
  784. pNode = ItsNodeManager->FLists.Find(pLink->F_NODE_ID);
  785. if (pNode) STRT_NM = pNode->NODE_NAME; else STRT_NM = " ";
  786. pNode = ItsNodeManager->FLists.Find(pLink->T_NODE_ID);
  787. if (pNode) END_NM = pNode->NODE_NAME; else END_NM = " ";
  788. sJs.printf(L"addEditLink('%s', '%s', '%s', '%s', '%s', '%s')",
  789. pLink->LINK_ID.c_str(),
  790. pLink->ROAD_NAME.c_str(),
  791. STRT_NM.c_str(),
  792. END_NM.c_str(),
  793. pLink->X_CRDN_ARR.c_str(),
  794. pLink->Y_CRDN_ARR.c_str());
  795. FRAMEOpenMap1->ExecScript(sJs);
  796. }
  797. #endif
  798. }
  799. }
  800. __finally
  801. {
  802. ItsLinkManager->FLists.UnLock();
  803. }
  804. FRAMEOpenMap1->ExecScript("makeEditLinkLayer()");
  805. }
  806. catch(...)
  807. {
  808. }
  809. }
  810. //---------------------------------------------------------------------------
  811. void __fastcall TVDSM200M::OpenMapCallback(TObject *ASender, const String AFunc, const String AArgs, const bool AFirst)
  812. {
  813. try
  814. {
  815. if (AFirst)
  816. {
  817. //지도를 편집모드로 변경
  818. sJs.printf(L"setEditMode(%d, 1)", FLayerIdx);
  819. FRAMEOpenMap1->ExecScript(sJs);
  820. //편집레이어 생성
  821. FRAMEOpenMap1->ExecScript("initEditLayer()");
  822. //배경링크레이어 생성
  823. UpdateEditLink();
  824. //시설물아이콘 등록
  825. UpdateIcon();
  826. sJs.printf(L"extentLayer(%d)", FLayerIdx);
  827. FRAMEOpenMap1->ExecScript(sJs);
  828. return;
  829. }
  830. if (AFunc.Pos("onlinkclick"))
  831. {
  832. TStringList *pStringList = new TStringList;
  833. pStringList->CommaText = AArgs;
  834. try
  835. {
  836. String sLyrType = pStringList->Strings[0];
  837. String sLinkId = pStringList->Strings[1];
  838. if (EditMode)
  839. {
  840. EdLinkId->Text = sLinkId;
  841. }
  842. }
  843. catch(Exception &e)
  844. {
  845. }
  846. delete pStringList;
  847. }
  848. }
  849. catch(Exception &exception)
  850. {
  851. }
  852. }
  853. //---------------------------------------------------------------------------
  854. void __fastcall TVDSM200M::ChkViewIconClick(TObject *Sender)
  855. {
  856. if (!FRAMEOpenMap1->MapStart) return;
  857. sJs.printf(L"showLayerText(%d, %d)", FLayerIdx, (ChkViewIcon->Checked) ? 1: 0);
  858. FRAMEOpenMap1->ExecScript(sJs);
  859. }
  860. //---------------------------------------------------------------------------
  861. void __fastcall TVDSM200M::ColSeqCustomDrawCell(TcxCustomGridTableView *Sender, TcxCanvas *ACanvas, TcxGridTableDataCellViewInfo *AViewInfo,
  862. bool &ADone)
  863. {
  864. if (AViewInfo->GridRecord->RecordIndex < 0)
  865. return;
  866. if (VarIsNull(AViewInfo->Value))
  867. return;
  868. try
  869. {
  870. int nIdx = AViewInfo->Value;
  871. if (nIdx < 0)
  872. return;
  873. ACanvas->Brush->Color = ITSMap_GetDisplayColor(nIdx);
  874. ACanvas->Font->Color = ACanvas->Brush->Color;
  875. }
  876. catch(...)
  877. {
  878. }
  879. }
  880. //---------------------------------------------------------------------------
  881. void __fastcall TVDSM200M::CbCTLR_MNGM_NMBRPropertiesChange(TObject *Sender)
  882. {
  883. CbVDS_CMRA_NO->Properties->Items->Clear();
  884. String sId = EdNmbr->Text;
  885. String sCtrlId = ITSUtil_GetCode(CbCTLR_MNGM_NMBR->Text); // 제어기 관리 번호
  886. TVdsCtlr *pVds;
  887. pVds = VdsCtlrManager->FLists.Find(sCtrlId);
  888. if (!pVds) return;
  889. FOR_STL(TVdsCmra*, pCmra, pVds->FCmras)
  890. {
  891. String sId = String(pCmra->VDS_CMRA_NO);
  892. String sNm = pCmra->VDS_CMRA_NM;
  893. CbVDS_CMRA_NO->Properties->Items->Add("[" + sId + "] " + sNm);
  894. }
  895. CbVDS_CMRA_NO->ItemIndex = 0;
  896. }
  897. //---------------------------------------------------------------------------