VDSM200MF.cpp 30 KB

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