FrmUtilMainF.cpp 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #include <IniFiles.hpp>
  4. #include "ITSDbF.h"
  5. #pragma hdrstop
  6. #include "FrmUtilMainF.h"
  7. #include <stdio.h>
  8. #include <locale.h>
  9. //---------------------------------------------------------------------------
  10. #pragma package(smart_init)
  11. #pragma link "cxButtons"
  12. #pragma link "cxCheckBox"
  13. #pragma link "cxContainer"
  14. #pragma link "cxControls"
  15. #pragma link "cxEdit"
  16. #pragma link "cxGraphics"
  17. #pragma link "cxGroupBox"
  18. #pragma link "cxLabel"
  19. #pragma link "cxLookAndFeelPainters"
  20. #pragma link "cxLookAndFeels"
  21. #pragma link "cxProgressBar"
  22. #pragma link "cxTextEdit"
  23. #pragma link "dxSkinsCore"
  24. #pragma resource "*.dfm"
  25. TFrmUtilMain *FrmUtilMain;
  26. //---------------------------------------------------------------------------
  27. #define XML_DIR "\\MAPDATA\\data\\"
  28. APP_CONFIG g_AppCfg;
  29. bool LoadDefaultConfigInfo(String ACfgFile/*=""*/)
  30. {
  31. String sCfgFile;
  32. TIniFile *pIniFile = NULL;
  33. g_AppCfg.bAppClose = false;
  34. String sAppDir = ExtractFilePath(Application->ExeName);
  35. String sCfgDir = sAppDir + "Cfg\\";
  36. String sIniFile = ChangeFileExt(ExtractFileName(Application->ExeName), ".ini");
  37. if (!ACfgFile.IsEmpty())
  38. sIniFile = ACfgFile + ".ini";
  39. sCfgFile = sCfgDir + sIniFile;
  40. String sMapDir = sAppDir + XML_DIR;
  41. ForceDirectories(sMapDir.c_str());
  42. try
  43. {
  44. String sTmp;
  45. pIniFile = new TIniFile(sCfgFile);
  46. String sSqlLog;
  47. g_AppCfg.itsdb.bSqlLog = false;
  48. g_AppCfg.itsdb.sProvider = pIniFile->ReadString("ITSDB", "PROVIDER", "OraOLEDB.Oracle.1");
  49. g_AppCfg.itsdb.sServerName = pIniFile->ReadString("ITSDB", "SERVERNAME", "HANTE");
  50. g_AppCfg.itsdb.sUserName = pIniFile->ReadString("ITSDB", "USERNAME", "hnits");
  51. g_AppCfg.itsdb.sPassword = pIniFile->ReadString("ITSDB", "PASSWORD", "hnits");
  52. g_AppCfg.flashmap.sMainMap = pIniFile->ReadString("FLASHMAP", "MAINMAP", "");
  53. g_AppCfg.flashmap.sLinkMap = pIniFile->ReadString("FLASHMAP", "LINKMAP", "");
  54. #if 0
  55. if (g_AppCfg.flashmap.sMainMap == "" ||
  56. g_AppCfg.flashmap.sLinkMap == "")
  57. {
  58. Application->MessageBox(L"지도 설정 정보를 읽어오는데 실패하였습니다.!!!!!!!!!!",
  59. L"환경설정 정보 로딩 오류!!!",
  60. MB_OK|MB_ICONERROR);
  61. }
  62. #endif
  63. g_AppCfg.flashmap.sMainMap = sAppDir + g_AppCfg.flashmap.sMainMap;
  64. g_AppCfg.flashmap.sLinkMap = sAppDir + g_AppCfg.flashmap.sLinkMap;
  65. }
  66. __finally
  67. {
  68. if (pIniFile) delete pIniFile;
  69. pIniFile = NULL;
  70. }
  71. return true;
  72. }
  73. //---------------------------------------------------------------------------
  74. __fastcall TFrmUtilMain::TFrmUtilMain(TComponent* Owner)
  75. : TForm(Owner)
  76. {
  77. Application->OnException = OnAppException;
  78. }
  79. //---------------------------------------------------------------------------
  80. void __fastcall TFrmUtilMain::OnAppException(TObject *Sender, Exception *exception)
  81. {
  82. String sClassName = (NULL != Sender) ? Sender->ClassName() : String("Unknown_Class");
  83. String sErrMsg = (NULL != exception) ? exception->Message : String("Unknown_Error");
  84. String sError = sClassName + " : " + sErrMsg;
  85. //Application->ShowException(&exception);
  86. //WriteLog(logError, "OnAppException: [%s]", AnsiString(sError).c_str());
  87. }
  88. //---------------------------------------------------------------------------
  89. void __fastcall TFrmUtilMain::CommClose()
  90. {
  91. }
  92. //---------------------------------------------------------------------------
  93. void __fastcall TFrmUtilMain::FormClose(TObject *Sender, TCloseAction &Action)
  94. {
  95. CommClose();
  96. //Action = caFree;
  97. }
  98. //---------------------------------------------------------------------------
  99. void __fastcall TFrmUtilMain::FormCreate(TObject *Sender)
  100. {
  101. FOnMessage = Application->OnMessage;
  102. }
  103. //---------------------------------------------------------------------------
  104. void __fastcall TFrmUtilMain::FormDestroy(TObject *Sender)
  105. {
  106. try
  107. {
  108. //::OleUninitialize();
  109. //::CoUninitialize();
  110. }
  111. catch(Exception &exception)
  112. {
  113. //WriteLog(logError, "FormDestroy: [%s]", AnsiString(exception.ClassName()+exception.Message).c_str());
  114. }
  115. }
  116. //---------------------------------------------------------------------------
  117. void __fastcall TFrmUtilMain::FormShow(TObject *Sender)
  118. {
  119. Application->ProcessMessages();
  120. edPath->Text = ExtractFilePath(Application->ExeName) + XML_DIR;
  121. Refresh();
  122. Application->ProcessMessages();
  123. TmrOnShow->Enabled = true;
  124. }
  125. //---------------------------------------------------------------------------
  126. void __fastcall TFrmUtilMain::FormCloseQuery(TObject *Sender, bool &CanClose)
  127. {
  128. // 폼이 닫히기 전에 수행해야 할 모뮬 기술
  129. // 프로그램 종료를 사용자가 확인할 수 있도록...
  130. if (!g_AppCfg.bAppClose)
  131. {
  132. String strMsg;
  133. strMsg = "";
  134. strMsg = "[ " + Caption + " ]\r\n\n";
  135. strMsg+= "프로그램을 종료 하시겠습니까?";
  136. //if(Application->MessageBox(strMsg.c_str(), String("프로그램 종료 확인").c_str(), MB_YESNO|MB_ICONQUESTION) == IDYES)
  137. {
  138. /*
  139. * 화면관련 작업을 못하도록 여기에 코드를 적자...
  140. */
  141. ITSDb_ApplicationTerm();
  142. g_AppCfg.bAppClose = true;
  143. }
  144. CanClose = false;
  145. }
  146. }
  147. //---------------------------------------------------------------------------
  148. void __fastcall TFrmUtilMain::BtnCloseClick(TObject *Sender)
  149. {
  150. g_AppCfg.bAppClose = true;
  151. Close();
  152. }
  153. //---------------------------------------------------------------------------
  154. void __fastcall TFrmUtilMain::TmrOnShowTimer(TObject *Sender)
  155. {
  156. TmrOnShow->Enabled = false;
  157. if (!ITSDb_Open())
  158. {
  159. Application->MessageBox(L"데이터베이스 연결에 실패하였습니다.\r\n환경파일에서 데이터베이스 연결 정보를 확인하세요.\r\n\r\n프로그램을 종료합니다.",
  160. L"데이터베이스 접속 오류!!!",
  161. MB_OK|MB_ICONERROR);
  162. g_AppCfg.bAppClose = true;
  163. Close();
  164. return;
  165. }
  166. TmrAppState->Enabled = true;
  167. }
  168. //---------------------------------------------------------------------------
  169. void __fastcall TFrmUtilMain::TmrAppStateTimer(TObject *Sender)
  170. {
  171. TmrAppState->Enabled = false;
  172. if (g_AppCfg.bAppClose)
  173. {
  174. ITSDb_Close();
  175. Close();
  176. try {
  177. Application->Terminate();
  178. } catch(Exception &exception) {}
  179. }
  180. else
  181. {
  182. TmrAppState->Enabled = true;
  183. }
  184. }
  185. //---------------------------------------------------------------------------
  186. void __fastcall TFrmUtilMain::UpdateProgress(int AProg, String AMsg/*=""*/)
  187. {
  188. try {
  189. cxProgressBar1->Position = AProg;
  190. if (AMsg != "") LblStatus->Caption = AMsg;
  191. Application->ProcessMessages();
  192. } catch(Exception &exception) {}
  193. }
  194. //---------------------------------------------------------------------------
  195. void __fastcall TFrmUtilMain::cxButton1Click(TObject *Sender)
  196. {
  197. #if 0
  198. // 데이터베이스 버텍스 정보 설정
  199. int nStep;
  200. String sQry;
  201. TADOQuery *pADO = NULL;
  202. if (Application->MessageBox(L"데이터베이스 Vertex 정보를 생성하시겠습니까?\r\n기존의 정보가 삭제되고 새로운 정보가 입력됩니다.",
  203. L"데이터베이스 Vertex 정보생성", MB_YESNO|MB_ICONQUESTION|MB_APPLMODAL) != IDYES)
  204. {
  205. return;
  206. }
  207. cxProgressBar1->Properties->Max = 9;
  208. PnlProg->Left = 16;
  209. PnlProg->Top = 304;
  210. PnlProg->Visible = true;
  211. cxButton1->Enabled = false;
  212. cxButton2->Enabled = false;
  213. try
  214. {
  215. pADO = new TADOQuery(NULL);
  216. ITSDb_GetConnection()->BeginTrans();
  217. pADO->Connection = ITSDb_GetConnection();
  218. try {
  219. nStep = 1;
  220. UpdateProgress(nStep, cxLabel3->Caption);
  221. sQry = "DELETE TB_ROAD_VRTX_ARR";
  222. pADO->Close();
  223. pADO->SQL->Text = sQry;
  224. pADO->ExecSQL();
  225. LblDb01->Caption = "성공";
  226. sQry = "INSERT INTO TB_ROAD_VRTX_ARR \r\n"
  227. "SELECT X.ROAD_ID, X.LEVL, Y.CRDN_CNT, X.X_CRDN_ARR, X.Y_CRDN_ARR, \r\n"
  228. " Y.X_CRDN_MIN, Y.X_CRDN_MAX, Y.Y_CRDN_MIN, Y.Y_CRDN_MAX \r\n"
  229. " FROM (SELECT ROAD_ID, :p01 AS LEVL, \r\n"
  230. " SUBSTR(MAX(SYS_CONNECT_BY_PATH (X_CRDN, ',')), 2) X_CRDN_ARR, \r\n"
  231. " SUBSTR(MAX(SYS_CONNECT_BY_PATH (Y_CRDN, ',')), 2) Y_CRDN_ARR \r\n"
  232. " FROM (SELECT ROAD_ID, X_CRDN, Y_CRDN, \r\n"
  233. " ROW_NUMBER () OVER (PARTITION BY ROAD_ID ORDER BY ORD) RNUM \r\n"
  234. " FROM (SELECT ROAD_ID, ORD, X_CRDN, Y_CRDN \r\n"
  235. " FROM TB_ROAD_VRTX \r\n"
  236. " WHERE LEVL = :p02 \r\n"
  237. " ) \r\n"
  238. " ) \r\n"
  239. " START WITH RNUM = 1 \r\n"
  240. " CONNECT BY PRIOR RNUM = RNUM - 1 AND PRIOR ROAD_ID = ROAD_ID \r\n"
  241. " GROUP BY ROAD_ID) X, \r\n"
  242. " (SELECT ROAD_ID, LEVL, COUNT(1) AS CRDN_CNT, \r\n"
  243. " MIN(X_CRDN) AS X_CRDN_MIN, MAX(X_CRDN) AS X_CRDN_MAX, \r\n"
  244. " MIN(Y_CRDN) AS Y_CRDN_MIN, MAX(Y_CRDN) AS Y_CRDN_MAX \r\n"
  245. " FROM TB_ROAD_VRTX \r\n"
  246. " GROUP BY ROAD_ID, LEVL) Y \r\n"
  247. " WHERE X.ROAD_ID = Y.ROAD_ID \r\n"
  248. " AND X.LEVL = Y.LEVL \r\n"
  249. " AND X.ROAD_ID IN (SELECT ROAD_ID FROM TB_ROAD WHERE DEL_YN = 'N') \r\n";
  250. nStep = 2;
  251. UpdateProgress(nStep, cxLabel4->Caption);
  252. pADO->Close();
  253. pADO->SQL->Text = sQry;
  254. pADO->Parameters->ParamByName("p01")->Value = "1000";
  255. pADO->Parameters->ParamByName("p02")->Value = "1000";
  256. pADO->ExecSQL();
  257. LblDb02->Caption = "성공";
  258. nStep = 3;
  259. UpdateProgress(nStep, cxLabel5->Caption);
  260. //pADO->Close();
  261. //pADO->SQL->Text = sQry;
  262. pADO->Parameters->ParamByName("p01")->Value = "2000";
  263. pADO->Parameters->ParamByName("p02")->Value = "2000";
  264. pADO->ExecSQL();
  265. LblDb03->Caption = "성공";
  266. nStep = 4;
  267. UpdateProgress(nStep, cxLabel6->Caption);
  268. //pADO->Close();
  269. //pADO->SQL->Text = sQry;
  270. pADO->Parameters->ParamByName("p01")->Value = "4000";
  271. pADO->Parameters->ParamByName("p02")->Value = "4000";
  272. pADO->ExecSQL();
  273. LblDb04->Caption = "성공";
  274. nStep = 5;
  275. UpdateProgress(nStep, cxLabel7->Caption);
  276. sQry = "DELETE TB_IFSC_VRTX_ARR";
  277. pADO->Close();
  278. pADO->SQL->Text = sQry;
  279. pADO->ExecSQL();
  280. LblDb05->Caption = "성공";
  281. sQry = "INSERT INTO TB_IFSC_VRTX_ARR \r\n"
  282. "SELECT X.IFSC_ID, X.LEVL, Y.CRDN_CNT, X.X_CRDN_ARR, X.Y_CRDN_ARR, \r\n"
  283. " Y.X_CRDN_MIN, Y.X_CRDN_MAX, Y.Y_CRDN_MIN, Y.Y_CRDN_MAX \r\n"
  284. " FROM (SELECT IFSC_ID, :p01 AS LEVL, \r\n"
  285. " SUBSTR(MAX(SYS_CONNECT_BY_PATH (X_CRDN, ',')), 2) X_CRDN_ARR, \r\n"
  286. " SUBSTR(MAX(SYS_CONNECT_BY_PATH (Y_CRDN, ',')), 2) Y_CRDN_ARR \r\n"
  287. " FROM (SELECT IFSC_ID, X_CRDN, Y_CRDN, \r\n"
  288. " ROW_NUMBER () OVER (PARTITION BY IFSC_ID ORDER BY ORD) RNUM \r\n"
  289. " FROM (SELECT IFSC_ID, ORD, X_CRDN, Y_CRDN \r\n"
  290. " FROM TB_IFSC_VRTX \r\n"
  291. " WHERE LEVL = :p02 \r\n"
  292. " ) \r\n"
  293. " ) \r\n"
  294. " START WITH RNUM = 1 \r\n"
  295. " CONNECT BY PRIOR RNUM = RNUM - 1 AND PRIOR IFSC_ID = IFSC_ID \r\n"
  296. " GROUP BY IFSC_ID) X, \r\n"
  297. " (SELECT IFSC_ID, LEVL, COUNT(1) AS CRDN_CNT, \r\n"
  298. " MIN(X_CRDN) AS X_CRDN_MIN, MAX(X_CRDN) AS X_CRDN_MAX, \r\n"
  299. " MIN(Y_CRDN) AS Y_CRDN_MIN, MAX(Y_CRDN) AS Y_CRDN_MAX \r\n"
  300. " FROM TB_IFSC_VRTX \r\n"
  301. " GROUP BY IFSC_ID, LEVL) Y \r\n"
  302. " WHERE X.IFSC_ID = Y.IFSC_ID \r\n"
  303. " AND X.LEVL = Y.LEVL \r\n"
  304. " AND X.IFSC_ID IN (SELECT IFSC_ID FROM TB_IFSC WHERE DEL_YN = 'N') \r\n";
  305. nStep = 6;
  306. UpdateProgress(nStep, cxLabel8->Caption);
  307. pADO->Close();
  308. pADO->SQL->Text = sQry;
  309. pADO->Parameters->ParamByName("p01")->Value = "50";
  310. pADO->Parameters->ParamByName("p02")->Value = "50";
  311. pADO->ExecSQL();
  312. LblDb06->Caption = "성공";
  313. nStep = 7;
  314. UpdateProgress(nStep, cxLabel9->Caption);
  315. //pADO->Close();
  316. //pADO->SQL->Text = sQry;
  317. pADO->Parameters->ParamByName("p01")->Value = "100";
  318. pADO->Parameters->ParamByName("p02")->Value = "100";
  319. pADO->ExecSQL();
  320. LblDb07->Caption = "성공";
  321. nStep = 8;
  322. UpdateProgress(nStep, cxLabel10->Caption);
  323. //pADO->Close();
  324. //pADO->SQL->Text = sQry;
  325. pADO->Parameters->ParamByName("p01")->Value = "250";
  326. pADO->Parameters->ParamByName("p02")->Value = "250";
  327. pADO->ExecSQL();
  328. LblDb08->Caption = "성공";
  329. nStep = 9;
  330. UpdateProgress(nStep, cxLabel11->Caption);
  331. //pADO->Close();
  332. //pADO->SQL->Text = sQry;
  333. pADO->Parameters->ParamByName("p01")->Value = "500";
  334. pADO->Parameters->ParamByName("p02")->Value = "500";
  335. pADO->ExecSQL();
  336. LblDb09->Caption = "성공";
  337. ITSDb_GetConnection()->CommitTrans();
  338. Application->MessageBox(L"데이터베이스 Vertex 정보를 생성하였습니다.", L"데이터베이스 Vertex 정보생성", MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  339. } catch(Exception &exception) {
  340. ITSDb_GetConnection()->RollbackTrans();
  341. switch(nStep)
  342. {
  343. case 1: LblDb01->Caption = "실패"; break;
  344. case 2: LblDb02->Caption = "실패"; break;
  345. case 3: LblDb03->Caption = "실패"; break;
  346. case 4: LblDb04->Caption = "실패"; break;
  347. case 5: LblDb05->Caption = "실패"; break;
  348. case 6: LblDb06->Caption = "실패"; break;
  349. case 7: LblDb07->Caption = "실패"; break;
  350. case 8: LblDb08->Caption = "실패"; break;
  351. case 9: LblDb09->Caption = "실패"; break;
  352. }
  353. String sErrMsg;
  354. sErrMsg = "데이터베이스 작업중에 오류가 발생 하였습니다.\r\n";
  355. sErrMsg+= String(exception.ClassName()) + exception.Message;
  356. Application->MessageBox(sErrMsg.c_str(), L"데이터베이스 Vertex 정보 생성 오류", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  357. return;
  358. }
  359. }
  360. __finally
  361. {
  362. PnlProg->Visible = false;
  363. cxButton1->Enabled = true;
  364. cxButton2->Enabled = true;
  365. if (pADO)
  366. {
  367. pADO->Close();
  368. delete pADO;
  369. }
  370. }
  371. #endif
  372. }
  373. //---------------------------------------------------------------------------
  374. void __fastcall TFrmUtilMain::cxButton2Click(TObject *Sender)
  375. {
  376. int nStep;
  377. String sQry;
  378. TADOQuery *pADO = NULL;
  379. if ((!ChkNode->Checked) &&
  380. (!ChkLink->Checked) &&
  381. (!ChkIfsc->Checked) &&
  382. (!ChkRoad->Checked) &&
  383. (!ChkLinkVertex->Checked) &&
  384. (!ChkIfscVertex->Checked) &&
  385. (!ChkRoadVertex->Checked) &&
  386. (!ChkRegionVertex->Checked)
  387. )
  388. {
  389. Application->MessageBox(L"작업 대상 정보를 선택하십시요.", L"XML 파일 생성", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  390. return;
  391. }
  392. if (Application->MessageBox(L"선택한 정보의 XML 파일을 신규로 생성하시겠습니까?\r\n기존의 XML 파일은 삭제되고 새로운 XML 파일이 생성됩니다.",
  393. L"XML 파일 생성", MB_YESNO|MB_ICONQUESTION|MB_APPLMODAL) != IDYES)
  394. {
  395. return;
  396. }
  397. try
  398. {
  399. //_wsetlocale(LC_ALL, L"kor");
  400. cxProgressBar1->Properties->Max = 2;
  401. PnlProg->Left = 16;
  402. PnlProg->Top = 124;
  403. PnlProg->Visible = true;
  404. pADO = new TADOQuery(NULL);
  405. pADO->Connection = ITSDb_GetConnection();
  406. pADO->CursorType = ctOpenForwardOnly;
  407. pADO->DisableControls();
  408. if (ChkNode->Checked) MakeNodeXml(pADO);
  409. if (ChkLink->Checked) MakeLinkXml(pADO);
  410. if (ChkIfsc->Checked) MakeIfscXml(pADO);
  411. if (ChkRoad->Checked) MakeRoadXml(pADO);
  412. if (ChkLinkVertex->Checked) MakeLinkVertexXml(pADO);
  413. if (ChkIfscVertex->Checked) MakeIfscVertexXml(pADO);
  414. if (ChkRoadVertex->Checked) MakeRoadVertexXml(pADO);
  415. if (ChkRegionVertex->Checked) MakeRegionVertexXml(pADO);
  416. Application->MessageBox(L"선택한 정보의 XML 파일생성을 완료하였습니다.", L"XML 파일 생성", MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  417. }
  418. __finally
  419. {
  420. PnlProg->Visible = false;
  421. cxButton2->Enabled = true;
  422. if (pADO)
  423. {
  424. pADO->Close();
  425. delete pADO;
  426. }
  427. }
  428. }
  429. //---------------------------------------------------------------------------
  430. bool __fastcall TFrmUtilMain::WriteXmlHead(FILE *AFd, bool AHead/*=true*/)
  431. {
  432. try
  433. {
  434. if (AFd == NULL) return false;
  435. if (AHead)
  436. {
  437. fprintf(AFd, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
  438. fprintf(AFd, "<DataList>\n");
  439. }
  440. else
  441. {
  442. fprintf(AFd, "</DataList>\n");
  443. }
  444. }
  445. catch(Exception &exception)
  446. {
  447. throw Exception(String(exception.ClassName()) + exception.Message);
  448. return false;
  449. }
  450. return true;
  451. }
  452. //---------------------------------------------------------------------------
  453. bool __fastcall TFrmUtilMain::WriteXmlObject(FILE *AFd, String AObject)
  454. {
  455. try
  456. {
  457. if (AFd == NULL) return false;
  458. fwprintf(AFd, L"<object>%s</object>\n", AObject.c_str());
  459. }
  460. catch(Exception &exception)
  461. {
  462. throw Exception(String(exception.ClassName()) + exception.Message);
  463. return false;
  464. }
  465. return true;
  466. }
  467. //---------------------------------------------------------------------------
  468. bool __fastcall TFrmUtilMain::WriteXmlRecordCount(FILE *AFd, int ARows)
  469. {
  470. try
  471. {
  472. if (AFd == NULL) return false;
  473. fprintf(AFd, "<count>%d</count>\n", ARows);
  474. }
  475. catch(Exception &exception)
  476. {
  477. throw Exception(String(exception.ClassName()) + exception.Message);
  478. return false;
  479. }
  480. return true;
  481. }
  482. //---------------------------------------------------------------------------
  483. bool __fastcall TFrmUtilMain::MakeNodeXml(TADOQuery *pADO)
  484. {
  485. AnsiString sFile = ExtractFilePath(Application->ExeName) + XML_DIR+ "Node.xml";
  486. FILE *fd = NULL;
  487. UpdateProgress(1, "노드정보 XML 파일생성");
  488. if ((fd = fopen(sFile.c_str(), "w")) == NULL)
  489. {
  490. Application->MessageBox(L"노드정보 XML 파일을 생성하지 못하였습니다.",
  491. L"노드정보 XML 파일생성", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  492. return false;
  493. }
  494. WriteXmlHead(fd, true);
  495. WriteXmlObject(fd, "node");
  496. int nRows= 0;
  497. int nCnt = 0;
  498. String sQry;
  499. try
  500. {
  501. try
  502. {
  503. sQry = "SELECT A.NODE_ID, A.NODE_TYPE, A.NODE_NAME, \r\n"
  504. " A.TURN_P, A.RMRK, A.X_CRDN, A.Y_CRDN \r\n"
  505. " FROM TB_NODE A \r\n"
  506. " ORDER BY A.NODE_ID \r\n";
  507. pADO->Close();
  508. pADO->SQL->Text = sQry;
  509. pADO->Open();
  510. nRows = pADO->RecordCount;
  511. cxProgressBar1->Properties->Max = nRows;
  512. WriteXmlRecordCount(fd, nRows);
  513. for( ; !pADO->Eof; pADO->Next(), nCnt++)
  514. {
  515. String NODE_ID = pADO->FieldByName("NODE_ID")->AsString; //노드ID
  516. //String NODE_TYPE = pADO->FieldByName("NODE_TYPE")->AsString; //노드유형
  517. String NODE_NAME = pADO->FieldByName("NODE_NAME")->AsString.Trim(); //교차로명칭
  518. //String TURN_P = pADO->FieldByName("TURN_P")->AsString; //회전제한유무
  519. //String RMRK = pADO->FieldByName("RMRK")->AsString.Trim(); //비고
  520. String X_CRDN = pADO->FieldByName("X_CRDN")->AsString; //X 좌표
  521. String Y_CRDN = pADO->FieldByName("Y_CRDN")->AsString; //Y 좌표
  522. fwprintf(fd, L" <node>");
  523. fwprintf(fd, L"<id>%s</id><x>%s</x><y>%s</y>", NODE_ID.c_str(), X_CRDN.c_str(), Y_CRDN.c_str());
  524. fprintf(fd, "<name>%s</name>", UTF8Encode(NODE_NAME).c_str());
  525. fwprintf(fd, L"</node>\n");
  526. if ((nCnt % 50) == 0) UpdateProgress(nCnt);
  527. }
  528. }
  529. catch(Exception &exception)
  530. {
  531. throw Exception(String(exception.ClassName()) + exception.Message);
  532. return false;
  533. }
  534. }
  535. __finally
  536. {
  537. UpdateProgress(nRows);
  538. if (fd)
  539. {
  540. WriteXmlHead(fd, false);
  541. fclose(fd);
  542. }
  543. pADO->Close();
  544. }
  545. return true;
  546. }
  547. //---------------------------------------------------------------------------
  548. bool __fastcall TFrmUtilMain::MakeLinkXml(TADOQuery *pADO)
  549. {
  550. AnsiString sFile = ExtractFilePath(Application->ExeName) + XML_DIR+ "Link.xml";
  551. FILE *fd = NULL;
  552. UpdateProgress(1, "링크정보 XML 파일생성");
  553. if ((fd = fopen(sFile.c_str(), "w")) == NULL)
  554. {
  555. Application->MessageBox(L"링크정보 XML 파일을 생성하지 못하였습니다.",
  556. L"링크정보 XML 파일생성", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  557. return false;
  558. }
  559. WriteXmlHead(fd);
  560. WriteXmlObject(fd, "link");
  561. int nRows= 0;
  562. int nCnt = 0;
  563. String sQry;
  564. try
  565. {
  566. try
  567. {
  568. sQry = "SELECT A.LINK_ID, A.F_NODE, A.T_NODE, TRIM(A.ROAD_NAME) ROAD_NAME, \r\n"
  569. " NVL(B.NODE_NAME, '') F_NAME, NVL(C.NODE_NAME, '') T_NAME, \r\n"
  570. " A.ROAD_USE, A.LANES, A.ROAD_RANK, TRIM(A.ROAD_TYPE) AS ROAD_TYPE, A.ROAD_NO, \r\n"
  571. " A.MAX_SPD, A.LINK_LENG, A.DEL_YN, DECODE(A.AREA_CD, 'LAT001', 'Y', 'N') REGN_YN \r\n"
  572. " FROM TB_LINK A, TB_NODE B, TB_NODE C \r\n"
  573. " WHERE A.F_NODE = B.NODE_ID(+) \r\n"
  574. " AND A.T_NODE = C.NODE_ID(+) \r\n"
  575. " ORDER BY LINK_ID \r\n";
  576. pADO->Close();
  577. pADO->SQL->Text = sQry;
  578. pADO->Open();
  579. nRows = pADO->RecordCount;
  580. cxProgressBar1->Properties->Max = nRows;
  581. WriteXmlRecordCount(fd, nRows);
  582. for( ; !pADO->Eof; pADO->Next(), nCnt++)
  583. {
  584. String LINK_ID = pADO->FieldByName("LINK_ID")->AsString; //'링크ID';;
  585. String F_NODEID = pADO->FieldByName("F_NODE")->AsString; //'시작노드ID';;
  586. String T_NODEID = pADO->FieldByName("T_NODE")->AsString; //'종료노드ID';;
  587. String ROAD_NAME = pADO->FieldByName("ROAD_NAME")->AsString.Trim(); //'도로명';;
  588. String F_NAME = pADO->FieldByName("F_NAME")->AsString; //'시작노드';;
  589. String T_NAME = pADO->FieldByName("T_NAME")->AsString; //'종료노드';;
  590. String ROAD_USE = pADO->FieldByName("ROAD_USE")->AsString; //'도로사용여부';;
  591. String LANES = pADO->FieldByName("LANES")->AsString; //'차로수';;
  592. String ROAD_RANK = pADO->FieldByName("ROAD_RANK")->AsString; //'도로등급';;
  593. String ROAD_TYPE = pADO->FieldByName("ROAD_TYPE")->AsString; //'도로유형';;
  594. String ROAD_NO = pADO->FieldByName("ROAD_NO")->AsString; //'도로번호';;
  595. String MAX_SPD = pADO->FieldByName("MAX_SPD")->AsString; //'최고제한속도';;
  596. String LINK_LENG = pADO->FieldByName("LINK_LENG")->AsString; //'연장';;
  597. String DEL_YN = pADO->FieldByName("DEL_YN")->AsString; //'삭제 여부';;
  598. String REGN_YN = pADO->FieldByName("REGN_YN")->AsString; //'로컬지역여부';
  599. fwprintf(fd, L" <link>");
  600. fwprintf(fd, L"<id>%s</id><f_node>%s</f_node><t_node>%s</t_node><info>%s</info><dist>%s</dist>\n",
  601. LINK_ID.c_str(), F_NODEID.c_str(), T_NODEID.c_str(), ROAD_RANK.c_str(), LINK_LENG.c_str());
  602. fprintf(fd, " <name>%s</name><f_name>%s</f_name><t_name>%s</t_name>",
  603. UTF8Encode(ROAD_NAME).c_str(), UTF8Encode(F_NAME).c_str(), UTF8Encode(T_NAME).c_str());
  604. fwprintf(fd, L"</link>\n");
  605. if ((nCnt % 50) == 0) UpdateProgress(nCnt);
  606. }
  607. }
  608. catch(Exception &exception)
  609. {
  610. throw Exception(String(exception.ClassName()) + exception.Message);
  611. return false;
  612. }
  613. }
  614. __finally
  615. {
  616. UpdateProgress(nRows);
  617. if (fd)
  618. {
  619. WriteXmlHead(fd, false);
  620. fclose(fd);
  621. }
  622. pADO->Close();
  623. }
  624. return true;
  625. }
  626. //---------------------------------------------------------------------------
  627. bool __fastcall TFrmUtilMain::MakeIfscXml(TADOQuery *pADO)
  628. {
  629. AnsiString sFile = ExtractFilePath(Application->ExeName) + XML_DIR+ "Ifsc.xml";
  630. FILE *fd = NULL;
  631. UpdateProgress(1, "정보제공구간 XML 파일생성");
  632. if ((fd = fopen(sFile.c_str(), "w")) == NULL)
  633. {
  634. Application->MessageBox(L"정보제공구간 XML 파일을 생성하지 못하였습니다.",
  635. L"정보제공구간 XML 파일생성", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  636. return false;
  637. }
  638. WriteXmlHead(fd);
  639. WriteXmlObject(fd, "ifsc");
  640. int nRows= 0;
  641. int nCnt = 0;
  642. String sQry;
  643. try
  644. {
  645. try
  646. {
  647. sQry = "SELECT IFSC_ID, IFSC_NM, DRCT_CD, STRT_NM, END_NM, SECT_LNGT, \r\n"
  648. " EXTR_CNCT_SECT_YN, DEL_YN, RMRK, F_NODE_ID, T_NODE_ID, \r\n"
  649. " SECT_GRAD_CD, AREA_CD, DECODE(AREA_CD, 'LAT001', 'Y', 'N') REGN_YN \r\n"
  650. " FROM TB_IFSC \r\n"
  651. " ORDER BY IFSC_ID \r\n";
  652. pADO->Close();
  653. pADO->SQL->Text = sQry;
  654. pADO->Open();
  655. nRows = pADO->RecordCount;
  656. cxProgressBar1->Properties->Max = nRows;
  657. WriteXmlRecordCount(fd, nRows);
  658. for( ; !pADO->Eof; pADO->Next(), nCnt++)
  659. {
  660. String IFSC_ID = pADO->FieldByName("IFSC_ID")->AsString;
  661. String IFSC_NM = pADO->FieldByName("IFSC_NM")->AsString.Trim();
  662. String DRCT_CD = pADO->FieldByName("DRCT_CD")->AsString;
  663. //String RMRK = pADO->FieldByName("RMRK")->AsString.Trim();
  664. //String EXTR_CNCT_SECT_YN = pADO->FieldByName("EXTR_CNCT_SECT_YN")->AsString;
  665. //String DEL_YN = pADO->FieldByName("DEL_YN")->AsString;
  666. String SECT_LNGT = pADO->FieldByName("SECT_LNGT")->AsString;
  667. //String SECT_GRAD_CD = pADO->FieldByName("SECT_GRAD_CD")->AsString;
  668. String F_NODE_ID = pADO->FieldByName("F_NODE_ID")->AsString;
  669. String T_NODE_ID = pADO->FieldByName("T_NODE_ID")->AsString;
  670. String STRT_NM = pADO->FieldByName("STRT_NM")->AsString.Trim();
  671. String END_NM = pADO->FieldByName("END_NM")->AsString.Trim();
  672. //String REGN_YN = pADO->FieldByName("REGN_YN")->AsString;
  673. //String AREA_CD = pADO->FieldByName("AREA_CD")->AsString;
  674. fwprintf(fd, L" <link>");
  675. fwprintf(fd, L"<id>%s</id><f_node>%s</f_node><t_node>%s</t_node><info>%s</info><dist>%s</dist>\n",
  676. IFSC_ID.c_str(), F_NODE_ID.c_str(), T_NODE_ID.c_str(), DRCT_CD.c_str(), SECT_LNGT.c_str());
  677. fprintf(fd, " <name>%s</name><f_name>%s</f_name><t_name>%s</t_name>",
  678. UTF8Encode(IFSC_NM).c_str(), UTF8Encode(STRT_NM).c_str(), UTF8Encode(END_NM).c_str());
  679. fwprintf(fd, L"</link>\n");
  680. if ((nCnt % 50) == 0) UpdateProgress(nCnt);
  681. }
  682. }
  683. catch(Exception &exception)
  684. {
  685. throw Exception(String(exception.ClassName()) + exception.Message);
  686. return false;
  687. }
  688. }
  689. __finally
  690. {
  691. UpdateProgress(nRows);
  692. if (fd)
  693. {
  694. WriteXmlHead(fd, false);
  695. fclose(fd);
  696. }
  697. pADO->Close();
  698. }
  699. return true;
  700. }
  701. //---------------------------------------------------------------------------
  702. bool __fastcall TFrmUtilMain::MakeRoadXml(TADOQuery *pADO)
  703. {
  704. AnsiString sFile = ExtractFilePath(Application->ExeName) + XML_DIR+ "Road.xml";
  705. FILE *fd = NULL;
  706. UpdateProgress(1, "도로정보 XML 파일생성");
  707. if ((fd = fopen(sFile.c_str(), "w")) == NULL)
  708. {
  709. Application->MessageBox(L"도로정보 XML 파일을 생성하지 못하였습니다.",
  710. L"도로정보 XML 파일생성", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  711. return false;
  712. }
  713. WriteXmlHead(fd);
  714. WriteXmlObject(fd, "road");
  715. int nRows= 0;
  716. int nCnt = 0;
  717. String sQry;
  718. try
  719. {
  720. try
  721. {
  722. sQry = "SELECT ROAD_ID, ROAD_NAME, DRCT_CD, STRT_NM, END_NM, \r\n"
  723. " DEL_YN, SECT_LNGT, F_NODE_ID, T_NODE_ID, \r\n"
  724. " SECT_GRAD_CD, AREA_CD, \r\n"
  725. " DECODE(AREA_CD, 'LAT001', 'Y', 'N') REGN_YN \r\n"
  726. " FROM TB_ROAD \r\n"
  727. //" WHERE DEL_YN = 'N' \r\n"
  728. " ORDER BY ROAD_ID \r\n";
  729. pADO->Close();
  730. pADO->SQL->Text = sQry;
  731. pADO->Open();
  732. nRows = pADO->RecordCount;
  733. cxProgressBar1->Properties->Max = nRows;
  734. WriteXmlRecordCount(fd, nRows);
  735. for( ; !pADO->Eof; pADO->Next(), nCnt++)
  736. {
  737. String ROAD_ID = pADO->FieldByName("ROAD_ID")->AsString;
  738. String ROAD_NAME = pADO->FieldByName("ROAD_NAME")->AsString.Trim();
  739. String DRCT_CD = pADO->FieldByName("DRCT_CD")->AsString;
  740. String STRT_NM = pADO->FieldByName("STRT_NM")->AsString.Trim();
  741. String END_NM = pADO->FieldByName("END_NM")->AsString.Trim();
  742. //String DEL_YN = pADO->FieldByName("DEL_YN")->AsString;
  743. String SECT_LNGT = pADO->FieldByName("SECT_LNGT")->AsString;
  744. String F_NODE_ID = pADO->FieldByName("F_NODE_ID")->AsString;
  745. String T_NODE_ID = pADO->FieldByName("T_NODE_ID")->AsString;
  746. //String SECT_GRAD_CD = pADO->FieldByName("SECT_GRAD_CD")->AsString;
  747. //String AREA_CD = pADO->FieldByName("AREA_CD")->AsString;
  748. //String REGN_YN = pADO->FieldByName("REGN_YN")->AsString;
  749. fwprintf(fd, L" <link>");
  750. fwprintf(fd, L"<id>%s</id><f_node>%s</f_node><t_node>%s</t_node><info>%s</info><dist>%s</dist>\n",
  751. ROAD_ID.c_str(), F_NODE_ID.c_str(), T_NODE_ID.c_str(), DRCT_CD.c_str(), SECT_LNGT.c_str());
  752. fprintf(fd, " <name>%s</name><f_name>%s</f_name><t_name>%s</t_name>",
  753. UTF8Encode(ROAD_NAME).c_str(), UTF8Encode(STRT_NM).c_str(), UTF8Encode(END_NM).c_str());
  754. fwprintf(fd, L"</link>\n");
  755. if ((nCnt % 50) == 0) UpdateProgress(nCnt);
  756. }
  757. }
  758. catch(Exception &exception)
  759. {
  760. throw Exception(String(exception.ClassName()) + exception.Message);
  761. return false;
  762. }
  763. }
  764. __finally
  765. {
  766. UpdateProgress(nRows);
  767. if (fd)
  768. {
  769. WriteXmlHead(fd, false);
  770. fclose(fd);
  771. }
  772. pADO->Close();
  773. }
  774. return true;
  775. }
  776. //---------------------------------------------------------------------------
  777. bool __fastcall TFrmUtilMain::MakeLinkVertexXml(TADOQuery *pADO)
  778. {
  779. AnsiString sFile = ExtractFilePath(Application->ExeName) + XML_DIR+ "LinkVertex.xml";
  780. FILE *fd = NULL;
  781. UpdateProgress(1, "링크 Vertex 정보 XML 파일생성");
  782. if ((fd = fopen(sFile.c_str(), "w")) == NULL)
  783. {
  784. Application->MessageBox(L"링크 Vertex 정보 파일을 생성하지 못하였습니다.",
  785. L"링크 Vertex 정보 XML 파일생성", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  786. return false;
  787. }
  788. WriteXmlHead(fd);
  789. WriteXmlObject(fd, "link_vertex");
  790. int nRows= 0;
  791. int nCnt = 0;
  792. String sQry;
  793. try
  794. {
  795. try
  796. {
  797. sQry = "SELECT X.LEVL, X.LINK_ID AS LINK_ID, X.X_CRDN, X.Y_CRDN, \r\n"
  798. " Y.X_CRDN_MIN, Y.X_CRDN_MAX, Y.Y_CRDN_MIN, Y.Y_CRDN_MAX, \r\n"
  799. " X.ORD, Y.ORD_CNT \r\n"
  800. " FROM (SELECT LINK_ID, DECODE(LEVL, 1, 1, 1) AS LEVL, \r\n"
  801. " X_CRDN, Y_CRDN, \r\n"
  802. " ROW_NUMBER() OVER(PARTITION BY LINK_ID, LEVL ORDER BY ORD) ORD \r\n"
  803. " FROM TB_LINK_VRTX \r\n"
  804. " WHERE LEVL IN (1)) X, \r\n"
  805. " (SELECT LINK_ID, DECODE(LEVL, 1, 1, 1) AS LEVL, \r\n"
  806. " COUNT(1) AS ORD_CNT, \r\n"
  807. " MIN(X_CRDN) AS X_CRDN_MIN, MAX(X_CRDN) AS X_CRDN_MAX, \r\n"
  808. " MIN(Y_CRDN) AS Y_CRDN_MIN, MAX(Y_CRDN) AS Y_CRDN_MAX \r\n"
  809. " FROM TB_LINK_VRTX \r\n"
  810. " WHERE LEVL IN (1) \r\n"
  811. " GROUP BY LINK_ID, LEVL) Y \r\n"
  812. " WHERE X.LEVL = Y.LEVL \r\n"
  813. " AND X.LINK_ID = Y.LINK_ID \r\n"
  814. " ORDER BY X.LEVL, X.LINK_ID, X.ORD \r\n";
  815. pADO->Close();
  816. pADO->SQL->Text = sQry;
  817. pADO->Open();
  818. nRows = pADO->RecordCount;
  819. cxProgressBar1->Properties->Max = nRows;
  820. WriteXmlRecordCount(fd, nRows);
  821. String sPosX = "";
  822. String sPosY = "";
  823. String sMinXY = "";
  824. String sMaxXY = "";
  825. int nOrd, nOrdCnt;
  826. for( ; !pADO->Eof; pADO->Next(), nCnt++)
  827. {
  828. sPosX += pADO->FieldByName("X_CRDN")->AsString + ",";
  829. sPosY += pADO->FieldByName("Y_CRDN")->AsString + ",";
  830. nOrd = pADO->FieldByName("ORD")->AsInteger;
  831. nOrdCnt = pADO->FieldByName("ORD_CNT")->AsInteger;
  832. if (nOrdCnt == nOrd)
  833. {
  834. sPosX = sPosX.SubString(1, sPosX.Length()-1);
  835. sPosY = sPosY.SubString(1, sPosY.Length()-1);
  836. String sMinXY = pADO->FieldByName("X_CRDN_MIN")->AsString + "," + pADO->FieldByName("Y_CRDN_MIN")->AsString;
  837. String sMaxXY = pADO->FieldByName("X_CRDN_MAX")->AsString + "," + pADO->FieldByName("Y_CRDN_MAX")->AsString;
  838. String sID = pADO->FieldByName("LINK_ID")->AsString;
  839. String sLevl = pADO->FieldByName("LEVL")->AsString;
  840. fwprintf(fd, L" <link><id>%s</id><levl>%s</levl><cnt>%d</cnt>\n", sID.c_str(), sLevl.c_str(), nOrdCnt);
  841. fwprintf(fd, L" <x>%s</x>\n", sPosX.c_str());
  842. fwprintf(fd, L" <y>%s</y>\n", sPosY.c_str());
  843. fwprintf(fd, L" <minxy>%s</minxy><maxxy>%s</maxxy>\n", sMinXY.c_str(), sMaxXY.c_str());
  844. fwprintf(fd, L" </link>\n");
  845. sPosX = "";
  846. sPosY = "";
  847. }
  848. if ((nCnt % 50) == 0) UpdateProgress(nCnt);
  849. }
  850. }
  851. catch(Exception &exception)
  852. {
  853. throw Exception(String(exception.ClassName()) + exception.Message);
  854. return false;
  855. }
  856. }
  857. __finally
  858. {
  859. UpdateProgress(nRows);
  860. if (fd)
  861. {
  862. WriteXmlHead(fd, false);
  863. fclose(fd);
  864. }
  865. pADO->Close();
  866. }
  867. return true;
  868. }
  869. //---------------------------------------------------------------------------
  870. bool __fastcall TFrmUtilMain::MakeIfscVertexXml(TADOQuery *pADO)
  871. {
  872. AnsiString sFile = ExtractFilePath(Application->ExeName) + XML_DIR+ "IfscVertex.xml";
  873. FILE *fd = NULL;
  874. UpdateProgress(1, "정보제공구간 Vertex XML 파일생성");
  875. if ((fd = fopen(sFile.c_str(), "w")) == NULL)
  876. {
  877. Application->MessageBox(L"정보제공구간 Vertex XML 파일을 생성하지 못하였습니다.",
  878. L"정보제공구간 Vertex XML 파일생성", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  879. return false;
  880. }
  881. WriteXmlHead(fd);
  882. WriteXmlObject(fd, "ifsc_vertex");
  883. int nRows= 0;
  884. int nCnt = 0;
  885. String sQry;
  886. try
  887. {
  888. try
  889. {
  890. sQry = "SELECT X.LEVL, X.IFSC_ID AS IFSC_ID, X.X_CRDN, X.Y_CRDN, \r\n"
  891. " Y.X_CRDN_MIN, Y.X_CRDN_MAX, Y.Y_CRDN_MIN, Y.Y_CRDN_MAX, \r\n"
  892. " X.ORD, Y.ORD_CNT \r\n"
  893. " FROM (SELECT IFSC_ID, DECODE(LEVL, 5, 2, 4, 3, 3, 4, 4) AS LEVL, \r\n"
  894. " X_CRDN, Y_CRDN, \r\n"
  895. " ROW_NUMBER() OVER(PARTITION BY IFSC_ID, LEVL ORDER BY ORD) ORD \r\n"
  896. " FROM TB_IFSC_VRTX \r\n"
  897. " WHERE LEVL IN (3,4,5)) X, \r\n"
  898. " (SELECT IFSC_ID, DECODE(LEVL, 5, 2, 4, 3, 3, 4, 4) AS LEVL, \r\n"
  899. " COUNT(1) AS ORD_CNT, \r\n"
  900. " MIN(X_CRDN) AS X_CRDN_MIN, MAX(X_CRDN) AS X_CRDN_MAX, \r\n"
  901. " MIN(Y_CRDN) AS Y_CRDN_MIN, MAX(Y_CRDN) AS Y_CRDN_MAX \r\n"
  902. " FROM TB_IFSC_VRTX \r\n"
  903. " WHERE LEVL IN (3,4,5) \r\n"
  904. " GROUP BY IFSC_ID, LEVL) Y \r\n"
  905. " WHERE X.LEVL = Y.LEVL \r\n"
  906. " AND X.IFSC_ID = Y.IFSC_ID \r\n"
  907. " ORDER BY X.LEVL, X.IFSC_ID, X.ORD \r\n";
  908. pADO->Close();
  909. pADO->SQL->Text = sQry;
  910. pADO->Open();
  911. nRows = pADO->RecordCount;
  912. cxProgressBar1->Properties->Max = nRows;
  913. WriteXmlRecordCount(fd, nRows);
  914. String sPosX = "";
  915. String sPosY = "";
  916. String sMinXY = "";
  917. String sMaxXY = "";
  918. int nOrd, nOrdCnt;
  919. for( ; !pADO->Eof; pADO->Next(), nCnt++)
  920. {
  921. sPosX += pADO->FieldByName("X_CRDN")->AsString + ",";
  922. sPosY += pADO->FieldByName("Y_CRDN")->AsString + ",";
  923. nOrd = pADO->FieldByName("ORD")->AsInteger;
  924. nOrdCnt = pADO->FieldByName("ORD_CNT")->AsInteger;
  925. if (nOrdCnt == nOrd)
  926. {
  927. sPosX = sPosX.SubString(1, sPosX.Length()-1);
  928. sPosY = sPosY.SubString(1, sPosY.Length()-1);
  929. String sMinXY = pADO->FieldByName("X_CRDN_MIN")->AsString + "," + pADO->FieldByName("Y_CRDN_MIN")->AsString;
  930. String sMaxXY = pADO->FieldByName("X_CRDN_MAX")->AsString + "," + pADO->FieldByName("Y_CRDN_MAX")->AsString;
  931. String sID = pADO->FieldByName("IFSC_ID")->AsString;
  932. String sLevl = pADO->FieldByName("LEVL")->AsString;
  933. fwprintf(fd, L" <link><id>%s</id><levl>%s</levl><cnt>%d</cnt>\n", sID.c_str(), sLevl.c_str(), nOrdCnt);
  934. fwprintf(fd, L" <x>%s</x>\n", sPosX.c_str());
  935. fwprintf(fd, L" <y>%s</y>\n", sPosY.c_str());
  936. fwprintf(fd, L" <minxy>%s</minxy><maxxy>%s</maxxy>\n", sMinXY.c_str(), sMaxXY.c_str());
  937. fwprintf(fd, L" </link>\n");
  938. sPosX = "";
  939. sPosY = "";
  940. }
  941. if ((nCnt % 50) == 0) UpdateProgress(nCnt);
  942. }
  943. }
  944. catch(Exception &exception)
  945. {
  946. throw Exception(String(exception.ClassName()) + exception.Message);
  947. return false;
  948. }
  949. }
  950. __finally
  951. {
  952. UpdateProgress(nRows);
  953. if (fd)
  954. {
  955. WriteXmlHead(fd, false);
  956. fclose(fd);
  957. }
  958. pADO->Close();
  959. }
  960. return true;
  961. }
  962. //---------------------------------------------------------------------------
  963. bool __fastcall TFrmUtilMain::MakeRoadVertexXml(TADOQuery *pADO)
  964. {
  965. AnsiString sFile = ExtractFilePath(Application->ExeName) + XML_DIR+ "RoadVertex.xml";
  966. FILE *fd = NULL;
  967. UpdateProgress(1, "도로 Vertex XML 파일생성");
  968. if ((fd = fopen(sFile.c_str(), "w")) == NULL)
  969. {
  970. Application->MessageBox(L"도로 Vertex 정보 파일을 생성하지 못하였습니다.",
  971. L"도로 Vertex 정보 XML 파일생성", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  972. return false;
  973. }
  974. WriteXmlHead(fd);
  975. WriteXmlObject(fd, "road_vertex");
  976. int nRows= 0;
  977. int nCnt = 0;
  978. String sQry;
  979. try
  980. {
  981. try
  982. {
  983. sQry = "SELECT X.LEVL, X.ROAD_ID AS ROAD_ID, X.X_CRDN, X.Y_CRDN, \r\n"
  984. " Y.X_CRDN_MIN, Y.X_CRDN_MAX, Y.Y_CRDN_MIN, Y.Y_CRDN_MAX, \r\n"
  985. " X.ORD, Y.ORD_CNT \r\n"
  986. " FROM (SELECT ROAD_ID, DECODE(LEVL, 1, 6, 2, 5, 5) AS LEVL, \r\n"
  987. " X_CRDN, Y_CRDN, \r\n"
  988. " ROW_NUMBER() OVER(PARTITION BY ROAD_ID, LEVL ORDER BY ORD) ORD \r\n"
  989. " FROM TB_ROAD_VRTX \r\n"
  990. " WHERE LEVL IN (1,2)) X, \r\n"
  991. " (SELECT ROAD_ID, DECODE(LEVL, 1, 6, 2, 5, 5) AS LEVL, \r\n"
  992. " COUNT(1) AS ORD_CNT, \r\n"
  993. " MIN(X_CRDN) AS X_CRDN_MIN, MAX(X_CRDN) AS X_CRDN_MAX, \r\n"
  994. " MIN(Y_CRDN) AS Y_CRDN_MIN, MAX(Y_CRDN) AS Y_CRDN_MAX \r\n"
  995. " FROM TB_ROAD_VRTX \r\n"
  996. " WHERE LEVL IN (1,2) \r\n"
  997. " GROUP BY ROAD_ID, LEVL) Y \r\n"
  998. " WHERE X.LEVL = Y.LEVL \r\n"
  999. " AND X.ROAD_ID = Y.ROAD_ID \r\n"
  1000. " ORDER BY X.LEVL, X.ROAD_ID, X.ORD \r\n";
  1001. pADO->Close();
  1002. pADO->SQL->Text = sQry;
  1003. pADO->Open();
  1004. nRows = pADO->RecordCount;
  1005. cxProgressBar1->Properties->Max = nRows;
  1006. WriteXmlRecordCount(fd, nRows);
  1007. String sPosX = "";
  1008. String sPosY = "";
  1009. String sMinXY = "";
  1010. String sMaxXY = "";
  1011. int nOrd, nOrdCnt;
  1012. for( ; !pADO->Eof; pADO->Next(), nCnt++)
  1013. {
  1014. sPosX += pADO->FieldByName("X_CRDN")->AsString + ",";
  1015. sPosY += pADO->FieldByName("Y_CRDN")->AsString + ",";
  1016. nOrd = pADO->FieldByName("ORD")->AsInteger;
  1017. nOrdCnt = pADO->FieldByName("ORD_CNT")->AsInteger;
  1018. if (nOrdCnt == nOrd)
  1019. {
  1020. sPosX = sPosX.SubString(1, sPosX.Length()-1);
  1021. sPosY = sPosY.SubString(1, sPosY.Length()-1);
  1022. String sMinXY = pADO->FieldByName("X_CRDN_MIN")->AsString + "," + pADO->FieldByName("Y_CRDN_MIN")->AsString;
  1023. String sMaxXY = pADO->FieldByName("X_CRDN_MAX")->AsString + "," + pADO->FieldByName("Y_CRDN_MAX")->AsString;
  1024. String sID = pADO->FieldByName("ROAD_ID")->AsString;
  1025. String sLevl = pADO->FieldByName("LEVL")->AsString;
  1026. fwprintf(fd, L" <link><id>%s</id><levl>%s</levl><cnt>%d</cnt>\n", sID.c_str(), sLevl.c_str(), nOrdCnt);
  1027. fwprintf(fd, L" <x>%s</x>\n", sPosX.c_str());
  1028. fwprintf(fd, L" <y>%s</y>\n", sPosY.c_str());
  1029. fwprintf(fd, L" <minxy>%s</minxy><maxxy>%s</maxxy>\n", sMinXY.c_str(), sMaxXY.c_str());
  1030. fwprintf(fd, L" </link>\n");
  1031. sPosX = "";
  1032. sPosY = "";
  1033. }
  1034. if ((nCnt % 50) == 0) UpdateProgress(nCnt);
  1035. }
  1036. }
  1037. catch(Exception &exception)
  1038. {
  1039. throw Exception(String(exception.ClassName()) + exception.Message);
  1040. return false;
  1041. }
  1042. }
  1043. __finally
  1044. {
  1045. UpdateProgress(nRows);
  1046. if (fd)
  1047. {
  1048. WriteXmlHead(fd, false);
  1049. fclose(fd);
  1050. }
  1051. pADO->Close();
  1052. }
  1053. return true;
  1054. }
  1055. //---------------------------------------------------------------------------
  1056. bool __fastcall TFrmUtilMain::MakeRegionVertexXml(TADOQuery *pADO)
  1057. {
  1058. AnsiString sFile = ExtractFilePath(Application->ExeName) + XML_DIR+ "RegionVertex.xml";
  1059. FILE *fd = NULL;
  1060. UpdateProgress(1, "행정구역 Vertex XML 파일생성");
  1061. if ((fd = fopen(sFile.c_str(), "w")) == NULL)
  1062. {
  1063. Application->MessageBox(L"행정구역 Vertex 정보 파일을 생성하지 못하였습니다.",
  1064. L"행정구역 Vertex 정보 XML 파일생성", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  1065. return false;
  1066. }
  1067. WriteXmlHead(fd);
  1068. WriteXmlObject(fd, "region_vertex");
  1069. int nRows= 0;
  1070. int nCnt = 0;
  1071. String sQry;
  1072. try
  1073. {
  1074. try
  1075. {
  1076. sQry = "SELECT CONFIGSEQ AS ORD, COORDX AS X_CRDN, COORDY AS Y_CRDN \r\n"
  1077. " FROM LINK_SUBSECTION \r\n"
  1078. " WHERE SUBSECTIONKIND = 'B' \r\n"
  1079. " AND DISPLAYLEVEL = 1 \r\n"
  1080. " ORDER BY CONFIGSEQ \r\n";
  1081. pADO->Close();
  1082. pADO->SQL->Text = sQry;
  1083. pADO->Open();
  1084. nRows = pADO->RecordCount;
  1085. cxProgressBar1->Properties->Max = nRows;
  1086. WriteXmlRecordCount(fd, nRows);
  1087. String sPosX = "";
  1088. String sPosY = "";
  1089. String sMinXY = "";
  1090. String sMaxXY = "";
  1091. int nOrd, nOrdCnt;
  1092. nOrd = 1;
  1093. for( ; !pADO->Eof; pADO->Next(), nCnt++)
  1094. {
  1095. sPosX += pADO->FieldByName("X_CRDN")->AsString;
  1096. sPosY += pADO->FieldByName("Y_CRDN")->AsString;
  1097. sPosX = sPosX.SubString(1, sPosX.Length()-1);
  1098. sPosY = sPosY.SubString(1, sPosY.Length()-1);
  1099. fwprintf(fd, L" <pos><order>%d</order><x>%s</x><y>%s</y></pos>\n", nOrd++, sPosX.c_str(), sPosY.c_str());
  1100. sPosX = "";
  1101. sPosY = "";
  1102. if ((nCnt % 20) == 0) UpdateProgress(nCnt);
  1103. }
  1104. }
  1105. catch(Exception &exception)
  1106. {
  1107. throw Exception(String(exception.ClassName()) + exception.Message);
  1108. return false;
  1109. }
  1110. }
  1111. __finally
  1112. {
  1113. UpdateProgress(nRows);
  1114. if (fd)
  1115. {
  1116. WriteXmlHead(fd, false);
  1117. fclose(fd);
  1118. }
  1119. pADO->Close();
  1120. }
  1121. return true;
  1122. }
  1123. //---------------------------------------------------------------------------