FrmMainCommF.cpp 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293
  1. //---------------------------------------------------------------------------
  2. #pragma hdrstop
  3. #include "FrmMainCommF.h"
  4. #include "AppGlobalF.h"
  5. #include "FrmMainF.h"
  6. #include "CDSProcessF.h"
  7. #include "CDSCtlrF.h"
  8. #include "CDSFormF.h"
  9. #include "CDSIfscF.h"
  10. #include "CDSImageF.h"
  11. #include "CDSAtmpF.h"
  12. #include "CDSParkF.h"
  13. #include "VmsUtilsF.h"
  14. #include "PacketHandllingF.h"
  15. //---------------------------------------------------------------------------
  16. #pragma package(smart_init)
  17. int __fastcall TFrmMain::ChangePosition(TVmsFormObj *AVmsObj)
  18. {
  19. TLabel *pLabel = NULL;
  20. if (AVmsObj->TextData == "") return VERR_NONE;
  21. try
  22. {
  23. pLabel = new TLabel(NULL);
  24. if (pLabel == NULL) return VERR_OTHER;
  25. try
  26. {
  27. pLabel->AutoSize = true;
  28. pLabel->Font->Name = CodeToFontName(AVmsObj->TextFontName);
  29. pLabel->Font->Size = AVmsObj->TextFontSize;
  30. pLabel->Caption = AVmsObj->TextData;
  31. if (AVmsObj->TextFontBold)
  32. pLabel->Font->Style = TFontStyles() << fsBold;
  33. else
  34. pLabel->Font->Style = TFontStyles();
  35. #if 1
  36. switch(AVmsObj->TextAlign)
  37. {
  38. case text_align_left:
  39. //좌측정력인 경우 위치조정 필요 없음.
  40. break;
  41. case text_align_right:
  42. //좌측에서 글자길이를 뺀다음 만약 음수이면 0으로 설정
  43. AVmsObj->PosX = (AVmsObj->PosX+AVmsObj->Width) - pLabel->Width;
  44. break;
  45. case text_align_center:
  46. //원래 글자의 중앙값을 얻은 다음에 조정된 글자의 1/2 크기를 뺀다음 음수이면 0으로 설정
  47. AVmsObj->PosX = (AVmsObj->PosX+(AVmsObj->Width/2)) - (pLabel->Width/2);
  48. break;
  49. }
  50. if (AVmsObj->PosX < 0) AVmsObj->PosX = 0;
  51. AVmsObj->TextWidth = pLabel->Width;
  52. #else
  53. int nWidth = AVmsObj->Width - pLabel->Width;
  54. if (nWidth > 0)
  55. {
  56. switch(AVmsObj->TextAlign)
  57. {
  58. case text_align_right: AVmsObj->PosX += nWidth; break;
  59. case text_align_center: AVmsObj->PosX += (nWidth / 2); break;
  60. }
  61. }
  62. #endif
  63. }
  64. catch(Exception &e)
  65. {
  66. }
  67. }
  68. __finally
  69. {
  70. SAFE_DELETE(pLabel);
  71. }
  72. return VERR_NONE;
  73. }
  74. //---------------------------------------------------------------------------
  75. int __fastcall TFrmMain::MakeVmsProvideForm()
  76. {
  77. int nFormCnt;
  78. int nSaveVmsCnt, nSaveFormCnt;
  79. TCDSForm *pCDSForm;
  80. TVmsForm *pVmsForm;
  81. TVmsFormObj *pVmsObj;
  82. VMS_SCHEDULE_INFO *pSch;
  83. VMS_SCHEDULE_DETL *pSchUnit;
  84. MINFO("MAIN MakeVmsProvideForm: Start");
  85. nSaveVmsCnt = 0;
  86. nSaveFormCnt= 0;
  87. //VMS스케줄에 대하여 다운로드 폼을 생성한다.
  88. CtlrItr it;
  89. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  90. {
  91. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  92. if (!pObj->Used) continue;
  93. if (!pObj->FProvide) continue;
  94. nSaveVmsCnt++;
  95. //운영모드 변경
  96. pObj->RSTATE.OprMode = pObj->CTRLMODE->Control;
  97. pSch = pObj->SCHEDULE;
  98. pObj->CTRLMODE->MaxDisplayForm = pSch->Count;
  99. if (pObj->CTRLMODE->MaxDisplayForm > pObj->VMS_MAX_PHSE_NUM)
  100. {
  101. MWARN("MAIN VMS Form Max count over1: %s, %d EA", pObj->CTLR_NMBR.c_str(), pObj->CTRLMODE->MaxDisplayForm);
  102. pObj->CTRLMODE->MaxDisplayForm = pObj->VMS_MAX_PHSE_NUM;
  103. }
  104. if (pObj->CTRLMODE->MaxDisplayForm > INT_VMS_MAX_FORM)
  105. {
  106. MWARN("MAIN VMS Form Max count over2: %s, %d EA", pObj->CTLR_NMBR.c_str(), pObj->CTRLMODE->MaxDisplayForm);
  107. pObj->CTRLMODE->MaxDisplayForm = INT_VMS_MAX_FORM;
  108. }
  109. pObj->pForms->Lock();
  110. try
  111. {
  112. TCDSAtmp *pAtmpObj = NULL;
  113. AnsiString ATMP_STTN_NMBR = "";
  114. //최대 제공 메시지 갯수만큼 생성
  115. for (int ii = 0; ii < pSch->Count && ii < pObj->CTRLMODE->MaxDisplayForm; ii++)
  116. {
  117. pSchUnit = &pSch->Unit[ii];
  118. if (pObj->FExistCngsForm && pSchUnit->DSPL_CNGS_YN == false)
  119. {
  120. //해당 제어기에 정체폼이 존재하는 경우
  121. //스케쥴 폼이 정체일때 표출하지 않는 경우
  122. //폼을 생성하지 않는다.
  123. continue;
  124. }
  125. nFormCnt = pObj->pForms->Count();
  126. AnsiString sFormId = pSchUnit->VMS_FORM_ID;
  127. pCDSForm = CDSFormManager->FLists.Find(sFormId);
  128. if (!pCDSForm)
  129. {
  130. MERROR("MAIN VMS Schedule Form Not found: VmsNmbr(%s), FormId(%s) %d", pObj->CTLR_NMBR.c_str(), sFormId.c_str(), ii);
  131. continue;
  132. }
  133. //소통정보 표출폼 인 경우 표출할 구간의 소통정보가 존재하지 않는 경우
  134. //폼을 생성하지 않도록 한다.
  135. switch(pCDSForm->VMS_FORM_TYPE_CD)
  136. {
  137. case eFormTp_traf_1:// = 11, // 소통상황(1단)
  138. case eFormTp_traf_2:// = 12, // 소통상황(2단)
  139. case eFormTp_traf_3:// = 13, // 소통상황(3단)
  140. case eFormTp_traf_4:// = 14, // 소통상황(4단)
  141. {
  142. int ss;
  143. bool bNoData = true;
  144. AnsiString sVmsIfscId[4];
  145. for (ss = 0; ss < 4; ss++)
  146. sVmsIfscId[ss] = "";
  147. sVmsIfscId[0] = pSchUnit->FRST_VMS_IFSC_ID;
  148. sVmsIfscId[1] = pSchUnit->SECD_VMS_IFSC_ID;
  149. sVmsIfscId[2] = pSchUnit->THIR_VMS_IFSC_ID;
  150. sVmsIfscId[3] = pSchUnit->FOUR_VMS_IFSC_ID;
  151. for (ss = 0; ss < 4; ss++)
  152. {
  153. if (sVmsIfscId[ss] == "") continue;
  154. TCDSIfsc *pTmpIfsc = CDSIfscManager->FLists.Find(sVmsIfscId[ss]);
  155. if (pTmpIfsc)
  156. {
  157. if (pTmpIfsc->CMTR_GRAD_CD != "0") bNoData = false;
  158. }
  159. }
  160. if (bNoData)
  161. {
  162. MWARN("MAIN VMS Schedule Form No Traffic: VmsNmbr(%s), FormId(%s)", pObj->CTLR_NMBR.c_str(), sFormId.c_str());
  163. continue;
  164. }
  165. }
  166. break;
  167. #if 0
  168. //폼에 대기환경수집장소가 하나인경우에만 해당
  169. //폼 객체에 대기환경수집장소를 설정하도록 수정하였음.
  170. case eFormTp_atmp: //대기환경
  171. {
  172. //스케줄 정보를 디비에서 읽어서 스케쥴을 작성할때 확인하지만 다시한번 확인
  173. //아래 객체를 생성할때 사용할수 있게 미리 메모리를 찾아서 할당한다.
  174. ATMP_STTN_NMBR = pSchUnit->FRST_VMS_IFSC_ID;
  175. pAtmpObj = NULL;
  176. if (CDSAtmpManager) CDSAtmpManager->FLists.Find(ATMP_STTN_NMBR);
  177. if (!pAtmpObj) continue;
  178. if (pAtmpObj->SUCCESS == false)
  179. {
  180. pAtmpObj = NULL;
  181. continue;
  182. }
  183. }
  184. break;
  185. #endif
  186. }
  187. nSaveFormCnt++;
  188. //폼생성
  189. pVmsForm = pObj->pForms->AddForm(); // new 를 사용해서 생성하지 않고 기존에 생성한 폼을 이용한다.
  190. pVmsForm->Success = false;
  191. pVmsForm->FtpFileName = pCDSForm->FtpFileName; // 정적폼인경우 경로가 지정됨
  192. pVmsForm->LocalFileName = pCDSForm->LocalFileName; // 정적폼인경우 경로가 지정됨
  193. pVmsForm->VMS_SCH_TYPE = pSchUnit->VMS_SCH_TYPE;
  194. pVmsForm->VMS_SCH_FORM_TYPE = pSchUnit->VMS_SCH_FORM_TYPE;
  195. pVmsForm->SYMB_LIB_NMBR = pSchUnit->SYMB_LIB_NMBR;
  196. pVmsForm->STRM_ADDR = pSchUnit->STRM_ADDR;
  197. pVmsForm->ScenarioSeq = nFormCnt; /* 폼 표출순서 */
  198. pVmsForm->VMS_FORM_ID = pCDSForm->VMS_FORM_ID; /* 폼 ID */
  199. pVmsForm->DSPL_HH = pSchUnit->DSPL_HH; /* 표출시간(초) */
  200. pVmsForm->VMS_FORM_DSPL_DRCT_CD = AnsiString(pCDSForm->VMS_FORM_DSPL_DRCT_CD); /* 표출방향 */
  201. pVmsForm->VMS_FORM_DSPL_MTHD_CD = AnsiString(pCDSForm->VMS_FORM_DSPL_MTHD_CD); /* 표출기능 */
  202. pVmsForm->VMS_FORM_TYPE_CD = pCDSForm->VMS_FORM_TYPE_CD; /* 폼 종류 */
  203. pVmsForm->VMS_FORM_COLR_CD = pCDSForm->VMS_FORM_COLR_CD; /* 배경색상 */
  204. pVmsForm->Width = pObj->WIDTH; /* 폼넓이 */
  205. pVmsForm->Height = pObj->HEIGHT; /* 폼높이 */
  206. pVmsForm->SvcRes = false;
  207. pVmsForm->FtpRes = false;
  208. pVmsForm->Lock();
  209. //폼객체생성
  210. FOR_STL(TCDSFormObj*, pCDSObj, pCDSForm->FLists)
  211. {
  212. if (pVmsForm->Count() >= MAX_FORM_OBJ_LIST)
  213. {
  214. break;
  215. }
  216. //도형식 배경소통정보 폼인 경우 하단에 표출할 정보가 없는 경우
  217. //하단 소통정보 객체는 생성하지 않도록 하자.
  218. if (pVmsForm->VMS_FORM_TYPE_CD == eFormtp_figure) // = 15, // 소통상황(도형식배경소통정보))
  219. {
  220. switch(pCDSObj->VMS_FORM_OBJECT_TYPE_CD)
  221. {
  222. case 0: //문자열
  223. case 1: //심볼
  224. case 2: //이미지
  225. //N:일반(모두표출하는것)
  226. //T:소통정보(소통정보가 있는 경우에만 표출하는것)
  227. //F:하단고정(소통정보가 없는 경우에만 표출하는것)
  228. if (pSchUnit->VMS_IFSC_ID == "")
  229. {
  230. //표출할 소통정보가 없는 경우
  231. if (pCDSObj->TRFC_FILL_CD == "T") continue; //
  232. }
  233. else
  234. {
  235. //표출할 소통정보가 있는 경우
  236. if (pCDSObj->TRFC_FILL_CD == "F") continue; //
  237. }
  238. break;
  239. case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19:
  240. if (pSchUnit->VMS_IFSC_ID == "") continue; //하단에 표출할 정보제공구간이 없는 경우임
  241. break;
  242. #if 0
  243. case 1://심볼(소통정보 시점 종점 사이 화살표)
  244. #if 1
  245. if (pCDSObj->VMS_DSPL_TXT.Trim() == "->")
  246. if (pSchUnit->VMS_IFSC_ID == "") continue; //하단에 표출할 정보제공구간이 없는 경우임
  247. #else
  248. if (pSchUnit->VMS_IFSC_ID == "") continue; //하단에 표출할 정보제공구간이 없는 경우임
  249. #endif
  250. break;
  251. #endif
  252. default: break;
  253. }
  254. } //pVmsForm->VMS_FORM_TYPE_CD == eFormtp_figure
  255. pVmsObj = pVmsForm->AddFormObject();
  256. pVmsObj->IFSC_ID = "";
  257. pVmsObj->TRFC_FILL_CD = pCDSObj->TRFC_FILL_CD;
  258. switch(pCDSObj->VMS_FORM_OBJECT_TYPE_CD)
  259. {
  260. case 1: //심볼
  261. pVmsObj->ObjectKind = graphicID_object_data; //요건 다운로드되어 있는 경우인데 다운로드상관없이 표출되도록하기위함
  262. //pVmsObj->ObjectKind = graphic_object_data;
  263. break;
  264. case 2: //이미지
  265. pVmsObj->ObjectKind = graphicID_object_data;
  266. break;
  267. case 3: //소통정보배경이미지
  268. pVmsObj->ObjectKind = graphic_object_data;
  269. break;
  270. case 17: //1단,소통정보이미지1
  271. case 27: //2단,소통정보이미지2
  272. case 37: //3단,소통정보이미지3
  273. case 47: //4단,소통정보이미지4
  274. case 167: //@우회소통정보이미지
  275. case 200: //동영상이미지
  276. case 300: //스트리밍영상이미지
  277. case 406: //@통합대기등급 이미지
  278. case 407: //@미세먼지등급 이미지
  279. case 408: //@초미세먼지등급 이미지
  280. case 413: //@오존등급이미지
  281. pVmsObj->ObjectKind = graphicID_object_data;
  282. break;
  283. default:
  284. pVmsObj->ObjectKind = text_object_data;
  285. break;
  286. } //switch(pCDSObj->VMS_FORM_OBJECT_TYPE_CD)
  287. pVmsObj->ObjectType = pCDSObj->VMS_FORM_OBJECT_TYPE_CD; //NUMBER(3) N VMS FORM OBJECT 유형 코드
  288. pVmsObj->TextFontName = pCDSObj->VMS_FONT_NAME_CD; //NUMBER(3) N VMS 글꼴 유형 코드
  289. //TODO
  290. pVmsObj->StrTextFontName = CodeToFontName(pVmsObj->TextFontName);
  291. pVmsObj->TextFontColor = pCDSObj->VMS_FONT_COLR_CD; //NUMBER(3) N VMS 글꼴 색상 코드
  292. pVmsObj->TextFontBold = pCDSObj->VMS_FONT_BOLD; //NUMBER(3) Y VMS 글꼴 방식 코드(0:Normal,1:Bold)
  293. pVmsObj->TextFontSize = pCDSObj->VMS_FONT_SIZE; //NUMBER(3) Y 0 VMS 글꼴 크기
  294. pVmsObj->TextAlign = pCDSObj->VMS_FONT_ALIGN; //NUMBER(1) Y 0 VMS 표출 문자열정열방식(0:LEFT,1:RIGHT,2:CENTER)
  295. pVmsObj->PosX = pCDSObj->VMS_DSPL_XCRDN; //NUMBER(5) Y VMS 표출 X좌표
  296. pVmsObj->PosY = pCDSObj->VMS_DSPL_YCRDN; //NUMBER(5) Y VMS 표출 Y좌표
  297. pVmsObj->Width = pCDSObj->VMS_DSPL_WIDTH; //NUMBER(5) Y 0 VMS 표출 넓이
  298. pVmsObj->TextWidth = pCDSObj->VMS_DSPL_WIDTH; //NUMBER(5) Y 0 VMS 표출 넓이
  299. pVmsObj->Height = pCDSObj->VMS_DSPL_HEIGHT; //NUMBER(5) Y 0 VMS 표출 높이
  300. pVmsObj->IsBlinking = pCDSObj->VMS_DSPL_BLINKING; //NUMBER(1) Y 0 VMS 표출 점멸 여부(0:지속, 1:점멸)
  301. pVmsObj->BkColor = pCDSObj->VMS_DSPL_BKCOLOR; //NUMBER(1) Y 0 VMS 표출 배경색상코드
  302. pVmsObj->ObjectSize = pCDSObj->VMS_DSPL_SIZE; //NUMBER(7) Y 0 VMS 표출 크기(문자:문자길이,이미지:이미지전체크기)
  303. if (pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 201 || //동영상명칭
  304. pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 301) //스트리밍영상주소
  305. {
  306. pVmsObj->TextData = pSchUnit->STRM_ADDR; //VARCHAR2(200) Y VMS 표출 텍스트
  307. }
  308. else
  309. {
  310. pVmsObj->TextData = pCDSObj->VMS_DSPL_TXT; //VARCHAR2(200) Y VMS 표출 텍스트
  311. }
  312. if (pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 200 || //동영상이미지
  313. pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 300) //스트리밍영상이미지
  314. {
  315. pVmsObj->ImageId = pSchUnit->SYMB_LIB_NMBR+"0"; //NUMBER(4) N 0 심벌라이브러리 번호
  316. if (pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 200)
  317. {
  318. pVmsObj->PosX = 0; //NUMBER(5) Y VMS 표출 X좌표
  319. pVmsObj->PosY = 0; //NUMBER(5) Y VMS 표출 Y좌표
  320. pVmsObj->Width = pVmsForm->Width; //NUMBER(5) Y 0 VMS 표출 넓이
  321. pVmsObj->Height = pVmsForm->Height; //NUMBER(5) Y 0 VMS 표출 높이
  322. TCDSImage* pTmpImg = CDSImageManager->FLists.Find(pVmsObj->ImageId);
  323. if (pTmpImg)
  324. {
  325. pVmsForm->DSPL_HH = pTmpImg->PLAY_TM;
  326. }
  327. }
  328. }
  329. else
  330. {
  331. pVmsObj->ImageId = pCDSObj->SYMB_LIB_NMBR+"0"; //NUMBER(4) N 0 심벌라이브러리 번호
  332. }
  333. pVmsObj->ImageType = "0"; //Bitmap
  334. if (pVmsObj->ObjectKind != text_object_data)
  335. {
  336. if (pVmsObj->NewImage() != NULL)
  337. {
  338. try
  339. {
  340. pVmsObj->pImageData->Picture->Bitmap->Canvas->Lock();
  341. try
  342. {
  343. if (pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 200 || //동영상이미지
  344. pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 300) //스트리밍영상이미지
  345. {
  346. TCDSImage* pTmpImg = CDSImageManager->FLists.Find(pVmsObj->ImageId);
  347. if (pTmpImg)
  348. {
  349. pVmsObj->pImageData->Picture->Assign(pTmpImg->IMAG_DATA->Picture);
  350. }
  351. else
  352. {
  353. pVmsObj->pImageData->Picture->Assign(pCDSObj->pImage->Picture);
  354. }
  355. }
  356. else
  357. if (CDSAtmpManager &&
  358. (pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 406 || //@통합대기등급 이미지
  359. pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 407 || //@미세먼지등급 이미지
  360. pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 408 || //@초미세먼지등급 이미지
  361. pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 413 ) //@오존등급이미지
  362. )
  363. {
  364. bool isObj = false;
  365. pAtmpObj = CDSAtmpManager->FLists.Find(pCDSObj->VMS_IFSC_ID);
  366. if (pAtmpObj && pAtmpObj->SUCCESS) isObj = true;
  367. if (isObj)
  368. {
  369. //관측장소 정보가 존재하는 경우에만 대기환경이미지를 폼에 적용한다.
  370. int nAtmpGrad = 0;
  371. switch(pCDSObj->VMS_FORM_OBJECT_TYPE_CD)
  372. {
  373. case 406: nAtmpGrad = pAtmpObj->INTG_ATMP_GRAD.ToIntDef(1); break;
  374. case 407: nAtmpGrad = pAtmpObj->PM10_1HH_GRAD.ToIntDef(1); break;
  375. case 408: nAtmpGrad = pAtmpObj->PM25_1HH_GRAD.ToIntDef(1); break;
  376. case 413: nAtmpGrad = pAtmpObj->O3_GRAD.ToIntDef(1); break;
  377. }
  378. if (nAtmpGrad > 0) nAtmpGrad--;
  379. TCDSImage *pTmp1 = CDSImageManager->FLists.Find(pVmsObj->ImageId);
  380. if (pTmp1)
  381. {
  382. AnsiString sGradSymbId = pTmp1->GRAD_SYMB_LIB_NMBR[nAtmpGrad];
  383. TCDSImage *pTmp2 = CDSImageManager->FLists.Find(sGradSymbId);
  384. if (pTmp2) pVmsObj->pImageData->Picture->Assign(pTmp2->IMAG_DATA->Picture);
  385. else pVmsObj->pImageData->Picture->Assign(pTmp1->IMAG_DATA->Picture);
  386. pVmsObj->ImageId = sGradSymbId;
  387. }
  388. else
  389. {
  390. pVmsObj->pImageData->Picture->Assign(pCDSObj->pImage->Picture);
  391. }
  392. }
  393. }
  394. else
  395. {
  396. pVmsObj->pImageData->Picture->Assign(pCDSObj->pImage->Picture);
  397. }
  398. }
  399. catch(Exception &e)
  400. {
  401. MERROR("SaveMemoryStream1: %s[%s] - %s", pVmsForm->VMS_FORM_ID.c_str(), pVmsObj->ImageId.c_str(), AnsiString(e.Message).c_str());
  402. }
  403. }
  404. __finally
  405. {
  406. pVmsObj->pImageData->Picture->Bitmap->Canvas->Unlock();
  407. pVmsObj->pImageStream->Clear();
  408. pVmsObj->pImageStream->Position = 0;
  409. pVmsObj->pImageData->Picture->Graphic->SaveToStream((Classes::TStream*)pVmsObj->pImageStream);
  410. }
  411. }
  412. }
  413. //폼객체 유형별 Fill In
  414. if (pVmsObj->ObjectType == 0 || //고정문자열
  415. pVmsObj->ObjectType == 201 || //동영상파일명
  416. pVmsObj->ObjectType == 301) //스트리밍영상주소
  417. {
  418. #if 0
  419. if (pObj->FBmpDownload == false && pObj->FIsOldProtocol == false)
  420. {
  421. //신규VMS인 경우 첫자리가 0 인경우 해당 문자를 표출하지 못함
  422. if (pVmsObj->TextData != "")
  423. {
  424. if (pVmsObj->TextData.SubString(1,1) == "0")
  425. {
  426. pVmsObj->TextData = " " + pVmsObj->TextData;
  427. pVmsObj->PosX = pVmsObj->PosX - 5;
  428. }
  429. }
  430. }
  431. #endif
  432. ChangePosition(pVmsObj);
  433. }
  434. else
  435. if (pVmsObj->ObjectType == 1 || //심볼
  436. pVmsObj->ObjectType == 2 ) //파일이미지
  437. {
  438. ; //처리없음
  439. }
  440. else
  441. if (pVmsObj->ObjectType == 17 || //1단,소통정보이미지1
  442. pVmsObj->ObjectType == 27 || //2단,소통정보이미지2
  443. pVmsObj->ObjectType == 37 || //3단,소통정보이미지3
  444. pVmsObj->ObjectType == 47 || //4단,소통정보이미지4
  445. pVmsObj->ObjectType == 167 ) //@우회소통정보이미지
  446. {
  447. if (!pVmsObj->pImageData) continue;
  448. TCDSImage *pSymbol = CDSImageManager->FLists.Find(pVmsObj->ImageId);
  449. if (!pSymbol) continue;
  450. try
  451. {
  452. int X, Y;
  453. switch(pVmsObj->ObjectType)
  454. {
  455. case 17: pVmsObj->IFSC_ID = pSchUnit->FRST_IMG_IFSC_ID; break;
  456. case 27: pVmsObj->IFSC_ID = pSchUnit->SECD_IMG_IFSC_ID; break;
  457. case 37: pVmsObj->IFSC_ID = pSchUnit->THIR_IMG_IFSC_ID; break;
  458. case 47: pVmsObj->IFSC_ID = pSchUnit->FOUR_IMG_IFSC_ID; break;
  459. case 167: pVmsObj->IFSC_ID = pSchUnit->SECD_IMG_IFSC_ID; break;
  460. }
  461. FOR_STL(TCDSImageCell*, pCell, pSymbol->FLists)
  462. {
  463. TCDSIfsc *pTmpIfsc = CDSIfscManager->FLists.Find(pVmsObj->IFSC_ID);
  464. if (pTmpIfsc)
  465. {
  466. X = pCell->POSX;
  467. Y = pCell->POSY;
  468. pVmsObj->ImageId = pCDSObj->SYMB_LIB_NMBR + pTmpIfsc->CMTR_GRAD_CD;
  469. pVmsObj->pImageData->Picture->Bitmap->Canvas->Lock();
  470. try
  471. {
  472. pVmsObj->pImageData->Picture->Bitmap->Canvas->Brush->Style = bsSolid;
  473. pVmsObj->pImageData->Picture->Bitmap->Canvas->Brush->Color = GradeToFillColor(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
  474. TColor clColor = pVmsObj->pImageData->Picture->Bitmap->Canvas->Pixels[X][Y];
  475. pVmsObj->pImageData->Picture->Bitmap->Canvas->FloodFill(X, Y, clColor, fsSurface);
  476. }
  477. __finally
  478. {
  479. pVmsObj->pImageData->Picture->Bitmap->Canvas->Unlock();
  480. }
  481. }
  482. }
  483. pVmsObj->pImageStream->Clear();
  484. pVmsObj->pImageStream->Position = 0;
  485. pVmsObj->pImageData->Picture->Graphic->SaveToStream((Classes::TStream*)pVmsObj->pImageStream);
  486. }
  487. catch(Exception &e)
  488. {
  489. MERROR("MAIN SaveMemoryStreamX: %s[%s] - %s", pVmsForm->VMS_FORM_ID.c_str(), pVmsObj->ImageId.c_str(), AnsiString(e.Message).c_str());
  490. }
  491. }
  492. else
  493. if (pVmsObj->ObjectType == 3) //소통정보 배경이미지
  494. {
  495. if (!pVmsObj->pImageData) continue;
  496. TCDSImage *pSymbol = CDSImageManager->FLists.Find(pVmsObj->ImageId);
  497. if (!pSymbol) continue;
  498. try
  499. {
  500. int X, Y;
  501. FOR_STL(TCDSImageCell*, pCell, pSymbol->FLists)
  502. {
  503. TCDSIfsc *pTmpIfsc = CDSIfscManager->FLists.Find(pCell->VMS_IFSC_ID);
  504. if (pTmpIfsc)
  505. {
  506. X = pCell->POSX;
  507. Y = pCell->POSY;
  508. pVmsObj->pImageData->Picture->Bitmap->Canvas->Lock();
  509. try
  510. {
  511. pVmsObj->pImageData->Picture->Bitmap->Canvas->Brush->Color = GradeToFillColor(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
  512. TColor clColor = pVmsObj->pImageData->Picture->Bitmap->Canvas->Pixels[X][Y];
  513. pVmsObj->pImageData->Picture->Bitmap->Canvas->FloodFill(X, Y, clColor, fsSurface);
  514. }
  515. __finally
  516. {
  517. pVmsObj->pImageData->Picture->Bitmap->Canvas->Unlock();
  518. }
  519. }
  520. }
  521. pVmsObj->pImageStream->Clear();
  522. pVmsObj->pImageStream->Position = 0;
  523. pVmsObj->pImageData->Picture->Graphic->SaveToStream((Classes::TStream*)pVmsObj->pImageStream);
  524. }
  525. catch(Exception &e)
  526. {
  527. MERROR("MAIN SaveMemoryStream2: %s[%s] - %s", pVmsForm->VMS_FORM_ID.c_str(), pVmsObj->ImageId.c_str(), AnsiString(e.Message).c_str());
  528. }
  529. }
  530. else
  531. if (pVmsObj->ObjectType == 61 || //구간명
  532. pVmsObj->ObjectType == 62 || //시점명
  533. pVmsObj->ObjectType == 63 || //종점명
  534. pVmsObj->ObjectType == 64 || //돌발유형
  535. pVmsObj->ObjectType == 65 || //대응문구
  536. pVmsObj->ObjectType == 66 //통제유형
  537. )
  538. {
  539. //돌발문안인 경우임
  540. pVmsObj->TextData = " ";
  541. VMS_EVENT_DETL *pEvt = pSchUnit->EVENT;
  542. if (pEvt)
  543. {
  544. switch(pVmsObj->ObjectType)
  545. {
  546. case 61: pVmsObj->TextData = pEvt->VMS_IFSC_NM; break; //@구간명(사용안함)
  547. case 62: pVmsObj->TextData = pEvt->STRT_LCTN_NM; break; //@시점명
  548. case 63: pVmsObj->TextData = pEvt->END_LCTN_NM; break; //@종점명
  549. case 64: pVmsObj->TextData = pEvt->VMS_INCD_DETL_NM; break; //@돌발유형
  550. case 65: pVmsObj->TextData = pEvt->OCRR_LCTN_NM; break; //@대응문구(사용안함-발생장소로 일단넣음)
  551. case 66: pVmsObj->TextData = pEvt->VMS_INCD_RSTR_TYPE_NM; break; //@통제유형
  552. }
  553. }
  554. if (pVmsObj->TextData == "") pVmsObj->TextData = " ";
  555. ChangePosition(pVmsObj);
  556. //TB_VMS_FORM_OBJECT_TYPE 테이블에 유형추가하고
  557. //돌발화면에서 필요한 항목 추가, TB_INCD_OCRR_VMS 테이블에 컬럼추가해야함
  558. }
  559. else
  560. if (pVmsObj->ObjectType == 71 || //발생장소
  561. pVmsObj->ObjectType == 72 || //INCD_TITL
  562. pVmsObj->ObjectType == 73 || //통제시점명
  563. pVmsObj->ObjectType == 74 || //통제종점명
  564. pVmsObj->ObjectType == 75 || //00차로 차단
  565. pVmsObj->ObjectType == 76 || //00월00일 ~ 00월00일
  566. pVmsObj->ObjectType == 77 || //대응문구
  567. pVmsObj->ObjectType == 78 //@통제유형
  568. )
  569. {
  570. //공사/행사문안 임
  571. pVmsObj->TextData = " ";
  572. VMS_EVENT_DETL *pEvt = pSchUnit->EVENT;
  573. if (pEvt)
  574. {
  575. switch(pVmsObj->ObjectType)
  576. {
  577. case 71: pVmsObj->TextData = pEvt->OCRR_LCTN_NM; break; //발생장소
  578. case 72: pVmsObj->TextData = pEvt->INCD_TITL; break; //@공사행사명
  579. case 73: pVmsObj->TextData = pEvt->STRT_LCTN_NM; break; //통제시점명
  580. case 74: pVmsObj->TextData = pEvt->END_LCTN_NM; break; //통제종점명
  581. case 75:
  582. {
  583. int nLane = pEvt->INCD_CLSR_LANE.ToIntDef(0);
  584. if (nLane == 111111)
  585. pVmsObj->TextData = "차로 차단";
  586. else
  587. if (nLane > 0)
  588. pVmsObj->TextData = "일부 차단";
  589. else
  590. pVmsObj->TextData = " ";
  591. }
  592. break; //00차로 차단
  593. case 76: //00월00일 ~ 00월00일
  594. {
  595. String sFrom = pEvt->INCD_STRT_DT.SubString(5,2) + "월" + pEvt->INCD_STRT_DT.SubString(7,2) + "일 " + pEvt->INCD_STRT_DT.SubString(9,2) + "시";
  596. String sTo = pEvt->INCD_END_PRAR_DT.SubString(5,2) + "월" + pEvt->INCD_END_PRAR_DT.SubString(7,2) + "일 " + pEvt->INCD_END_PRAR_DT.SubString(9,2) + "시";
  597. pVmsObj->TextData = sFrom + " ~ " + sTo;
  598. }
  599. break;
  600. case 77: pVmsObj->TextData = pEvt->OCRR_LCTN_NM; break; //대응문구(사용안함-발생장소로 일단넣음)
  601. case 78: pVmsObj->TextData = pEvt->VMS_INCD_RSTR_TYPE_NM; break; //@통제유형
  602. }
  603. }
  604. if (pVmsObj->TextData == "") pVmsObj->TextData = " ";
  605. ChangePosition(pVmsObj);
  606. }
  607. else
  608. if (CDSAtmpManager &&
  609. (pVmsObj->ObjectType == 401 || //@관측장소
  610. pVmsObj->ObjectType == 402 || //@PM10
  611. pVmsObj->ObjectType == 403 || //@PM2.5
  612. pVmsObj->ObjectType == 404 || //@PM10등급
  613. pVmsObj->ObjectType == 405 || //@PM2.5등급
  614. pVmsObj->ObjectType == 409 || //@통합대기등급
  615. pVmsObj->ObjectType == 410 || //@통합대기
  616. pVmsObj->ObjectType == 411 || //@오존
  617. pVmsObj->ObjectType == 412 ) //@오존등급
  618. )
  619. {
  620. bool isObj = false;
  621. pAtmpObj = CDSAtmpManager->FLists.Find(pCDSObj->VMS_IFSC_ID);
  622. if (pAtmpObj && pAtmpObj->SUCCESS) isObj = true;
  623. AnsiString sUnit = "";
  624. bool bUnit = false;
  625. if (pVmsObj->TextData.Pos(" -"))
  626. {
  627. bUnit = true;
  628. sUnit = " ";
  629. }
  630. else
  631. if (pVmsObj->TextData.Pos("-"))
  632. {
  633. bUnit = true;
  634. }
  635. pVmsObj->TextData = " ";
  636. if (pVmsObj->ObjectType == 401)
  637. {
  638. pVmsObj->TextData = pAtmpObj ? pAtmpObj->VMS_DISP_NM : AnsiString("---");
  639. }
  640. else
  641. if (pVmsObj->ObjectType == 402)
  642. {
  643. pVmsObj->TextData = isObj ? pAtmpObj->GetPM10_VAL(false) : AnsiString("-");
  644. pVmsObj->TextFontColor = isObj ? pAtmpObj->GetPM10_CLR() : clRed;
  645. if (bUnit) pVmsObj->TextData = pVmsObj->TextData + sUnit + "㎍/㎥";
  646. }
  647. else
  648. if (pVmsObj->ObjectType == 403)
  649. {
  650. pVmsObj->TextData = isObj ? pAtmpObj->GetPM25_VAL(false) : AnsiString("-");
  651. pVmsObj->TextFontColor = isObj ? pAtmpObj->GetPM25_CLR() : clRed;
  652. if (bUnit) pVmsObj->TextData = pVmsObj->TextData + sUnit + "㎍/㎥";
  653. }
  654. else
  655. if (pVmsObj->ObjectType == 404)
  656. {
  657. pVmsObj->TextData = isObj ? pAtmpObj->GetPM10_GRAD() : AnsiString("-");
  658. pVmsObj->TextFontColor = isObj ? pAtmpObj->GetPM10_CLR() : clRed;
  659. }
  660. else
  661. if (pVmsObj->ObjectType == 405)
  662. {
  663. pVmsObj->TextData = isObj ? pAtmpObj->GetPM25_GRAD() : AnsiString("-");
  664. pVmsObj->TextFontColor = isObj ? pAtmpObj->GetPM25_CLR() : clRed;
  665. }
  666. else
  667. if (pVmsObj->ObjectType == 409)
  668. {
  669. pVmsObj->TextData = isObj ? pAtmpObj->GetATMP_GRAD() : AnsiString("-");
  670. pVmsObj->TextFontColor = isObj ? pAtmpObj->GetATMP_CLR() : clRed;
  671. }
  672. else
  673. if (pVmsObj->ObjectType == 410)
  674. {
  675. pVmsObj->TextData = isObj ? pAtmpObj->GetATMP_VAL(false) : AnsiString("-");
  676. pVmsObj->TextFontColor = isObj ? pAtmpObj->GetATMP_CLR() : clRed;
  677. }
  678. else
  679. if (pVmsObj->ObjectType == 411)
  680. {
  681. pVmsObj->TextData = isObj ? pAtmpObj->GetO3_VAL(false) : AnsiString("-");
  682. pVmsObj->TextFontColor = isObj ? pAtmpObj->GetO3_CLR() : clRed;
  683. if (bUnit) pVmsObj->TextData = pVmsObj->TextData + sUnit + "ppm";
  684. }
  685. else
  686. if (pVmsObj->ObjectType == 412)
  687. {
  688. pVmsObj->TextData = isObj ? pAtmpObj->GetO3_GRAD() : AnsiString("-");
  689. pVmsObj->TextFontColor = isObj ? pAtmpObj->GetO3_CLR() : clRed;
  690. }
  691. if (pVmsObj->TextData == "") pVmsObj->TextData = " ";
  692. ChangePosition(pVmsObj);
  693. }
  694. else
  695. if (pVmsObj->ObjectType == 501 || //@주차가능대수
  696. pVmsObj->ObjectType == 502 ) //@주차혼잡도
  697. {
  698. TCDSPark *pPark = NULL;
  699. if (CDSParkManager) CDSParkManager->FLists.Find(pCDSObj->VMS_IFSC_ID);
  700. if (pPark)
  701. {
  702. AnsiString sFmt = pCDSObj->VMS_DSPL_TXT;
  703. sFmt = StringReplace(sFmt, "@", "", TReplaceFlags() << rfReplaceAll);
  704. if (pVmsObj->ObjectType == 501)
  705. {
  706. if (sFmt.Pos("0"))
  707. {
  708. sFmt = StringReplace(sFmt, "0000", "%4d", TReplaceFlags() << rfReplaceAll);
  709. sFmt = StringReplace(sFmt, "000", "%3d", TReplaceFlags() << rfReplaceAll);
  710. sFmt = StringReplace(sFmt, "00", "%2d", TReplaceFlags() << rfReplaceAll);
  711. sFmt = StringReplace(sFmt, "0", "%d", TReplaceFlags() << rfReplaceAll);
  712. pVmsObj->TextData.printf(sFmt.c_str(), pPark->TOTAL);
  713. }
  714. else
  715. {
  716. pVmsObj->TextData = AnsiString(pPark->TOTAL);
  717. }
  718. pVmsObj->TextFontColor = pPark->GetGradeColor();
  719. }
  720. else
  721. if (pVmsObj->ObjectType == 502)
  722. {
  723. pVmsObj->TextData = pPark->CNGT_DESC;
  724. pVmsObj->TextFontColor = pPark->GetGradeColor();
  725. }
  726. }
  727. else
  728. {
  729. pVmsObj->TextData = "-";
  730. pVmsObj->TextFontColor = clRed;
  731. }
  732. if (pVmsObj->TextData == "") pVmsObj->TextData = " ";
  733. ChangePosition(pVmsObj);
  734. }
  735. else
  736. if (pVmsObj->ObjectType == 81 || //돌발종류
  737. pVmsObj->ObjectType == 82 || //해당도로
  738. pVmsObj->ObjectType == 83 || //우회도로
  739. pVmsObj->ObjectType == 84 ) //발생장소
  740. {
  741. pVmsObj->TextData = " ";
  742. VMS_EVENT_DETL *pEvt = pSchUnit->EVENT;
  743. if (pEvt)
  744. {
  745. switch(pVmsObj->ObjectType)
  746. {
  747. case 81: pVmsObj->TextData = pEvt->VMS_INCD_DETL_NM; break; //돌발종류
  748. case 82: pVmsObj->TextData = pEvt->VMS_IFSC_NM; break; //해당도로
  749. case 83: pVmsObj->TextData = pEvt->VMS_IFSC_NM; break; //우회도로
  750. case 84: pVmsObj->TextData = pEvt->OCRR_LCTN_NM; break; //발생장소
  751. }
  752. }
  753. if (pVmsObj->TextData == "") pVmsObj->TextData = " ";
  754. ChangePosition(pVmsObj);
  755. }
  756. else
  757. {
  758. //객체가 가변(소통정보 표출) 인 경우 가변문자를 설정하자....
  759. AnsiString VMS_IFSC_ID = "";
  760. switch(pVmsObj->ObjectType)
  761. {
  762. case 11: case 12: case 13: case 14: case 15: case 16: case 18: case 19:
  763. VMS_IFSC_ID = pSchUnit->FRST_VMS_IFSC_ID;
  764. if (pVmsForm->VMS_FORM_TYPE_CD == eFormtp_figure)
  765. {
  766. VMS_IFSC_ID = pSchUnit->VMS_IFSC_ID;
  767. }
  768. else
  769. if (pVmsForm->VMS_FORM_TYPE_CD == enFormKindCongest)// && pVmsObj->ObjectType == 18)
  770. {
  771. VMS_IFSC_ID = pSchUnit->VMS_IFSC_ID;
  772. }
  773. break;
  774. case 161: case 162: case 163: case 164: case 165: case 166: case 168:
  775. VMS_IFSC_ID = pSchUnit->SECD_VMS_IFSC_ID;
  776. break;
  777. case 21: case 22: case 23: case 24: case 25: case 26: case 28:
  778. VMS_IFSC_ID = pSchUnit->SECD_VMS_IFSC_ID;
  779. break;
  780. case 31: case 32: case 33: case 34: case 35: case 36: case 38:
  781. VMS_IFSC_ID = pSchUnit->THIR_VMS_IFSC_ID;
  782. break;
  783. case 41: case 42: case 43: case 44: case 45: case 46: case 48:
  784. VMS_IFSC_ID = pSchUnit->FOUR_VMS_IFSC_ID;
  785. break;
  786. case 91: case 92:
  787. VMS_IFSC_ID = pCDSObj->VMS_IFSC_ID; //축통행시간/축소통상황(고정)
  788. break;
  789. case 93: case 94: case 95: case 96:
  790. VMS_IFSC_ID = pSchUnit->VMS_IFSC_ID;
  791. break;
  792. default: continue;
  793. }
  794. pVmsObj->TextData = " ";
  795. TCDSIfsc *pTmpIfsc = CDSIfscManager->FLists.Find(VMS_IFSC_ID);
  796. if (pTmpIfsc)
  797. {
  798. switch(pVmsObj->ObjectType)
  799. {
  800. case 11: case 21: case 31: case 41: case 161: //구간명
  801. pVmsObj->TextData = pTmpIfsc->ROAD_NM;
  802. break;
  803. case 12: case 22: case 32: case 42: case 93: case 162: //시점명
  804. pVmsObj->TextData = pTmpIfsc->DSPL_STRT_NODE_NM;
  805. break;
  806. case 13: case 23: case 33: case 43: case 94: case 163: //종점명
  807. pVmsObj->TextData = pTmpIfsc->DSPL_END_NODE_NM;
  808. break;
  809. case 14: case 24: case 34: case 44: case 92: case 95: case 164: //소통상황
  810. pVmsObj->TextData = GradeToString(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0), pVmsForm->VMS_FORM_TYPE_CD);
  811. pVmsObj->TextFontColor = GradeToColorCode(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
  812. break;
  813. case 19: //소통상황(가변)
  814. {
  815. AnsiString sGradText = GradeToString(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0), pVmsForm->VMS_FORM_TYPE_CD);
  816. if (pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0) == grade_smoothness)
  817. {
  818. sGradText.printf("소통원활 약 %d 분", pTmpIfsc->TRVL_HH);
  819. }
  820. pVmsObj->TextData = sGradText;
  821. pVmsObj->TextFontColor = GradeToColorCode(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
  822. }
  823. break;
  824. case 15: case 25: case 35: case 45: case 91: case 96: case 165: //통행시간
  825. #if 0
  826. pVmsObj->TextData = AnsiString(pTmpIfsc->TRVL_HH);
  827. #else
  828. {
  829. AnsiString sFmt = pCDSObj->VMS_DSPL_TXT;
  830. sFmt = StringReplace(sFmt, "@", "", TReplaceFlags() << rfReplaceAll);
  831. if (sFmt.Pos("0"))
  832. {
  833. sFmt = StringReplace(sFmt, "0000", "%4d", TReplaceFlags() << rfReplaceAll);
  834. sFmt = StringReplace(sFmt, "000", "%3d", TReplaceFlags() << rfReplaceAll);
  835. sFmt = StringReplace(sFmt, "00", "%2d", TReplaceFlags() << rfReplaceAll);
  836. sFmt = StringReplace(sFmt, "0", "%d", TReplaceFlags() << rfReplaceAll);
  837. pVmsObj->TextData.printf(sFmt.c_str(), pTmpIfsc->TRVL_HH);
  838. }
  839. else
  840. {
  841. pVmsObj->TextData = AnsiString(pTmpIfsc->TRVL_HH);
  842. }
  843. }
  844. #endif
  845. pVmsObj->TextFontColor = GradeToColorCode(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
  846. break;
  847. case 16: case 26: case 36: case 46: case 166: //통행속도
  848. pVmsObj->TextData = AnsiString(pTmpIfsc->SPED);
  849. pVmsObj->TextFontColor = GradeToColorCode(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
  850. break;
  851. case 17: case 27: case 37: case 47: //방향이미지...???
  852. break;
  853. case 18: case 28: case 38: case 48: case 168: //지점명
  854. pVmsObj->TextData = pTmpIfsc->SPOT_NM;
  855. break;
  856. }
  857. ChangePosition(pVmsObj);
  858. }
  859. }
  860. } //FOR_STL(폼객체생성)
  861. pVmsForm->UnLock();
  862. } //for(최대 제공 메시지 갯수만큼 생성)
  863. }
  864. __finally
  865. {
  866. pObj->pForms->UnLock();
  867. }
  868. } //iterator(VMS전체루프)
  869. MINFO("MAIN MakeVmsProvideForm: End. (VMS: %d EA, Forms %d EA)", nSaveVmsCnt, nSaveFormCnt);
  870. MINFO("MAIN MakeVmsDatabaseForm: Start");
  871. nSaveVmsCnt = 0;
  872. nSaveFormCnt= 0;
  873. //데이터베이스에 저장할 폼을 생성한다.
  874. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  875. {
  876. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  877. if (!pObj->Used) continue;
  878. if (!pObj->FProvide) continue;
  879. if (g_AppCfg.BottomTrafficCenter)
  880. {
  881. //도형식폼의 하단소통정보위치를 가운데로 정렬하는 경우
  882. MakeVmsFigureFormPos(pObj);
  883. }
  884. nSaveFormCnt += MakeVmsDatabaseForm(pObj);
  885. nSaveVmsCnt++;
  886. }
  887. MINFO("MAIN MakeVmsDatabaseForm: End. (VMS: %d EA, Forms %d EA)", nSaveVmsCnt, nSaveFormCnt);
  888. return VERR_NONE;
  889. }
  890. //---------------------------------------------------------------------------
  891. int __fastcall TFrmMain::MakeVmsFigureFormPos(TCDSCtlr *AObj)
  892. {
  893. int ARRAWGAP = 5;
  894. int TRAFFGAP = 12;
  895. int nSelCnt = 0;
  896. if (!AObj) return VERR_MEMORY_ALLOC;
  897. int nFormCnt = AObj->pForms->Count();
  898. if (nFormCnt == 0) return nSelCnt;
  899. int nObjCnt;
  900. int nFormT;
  901. TVmsFormObj *pArw;
  902. TVmsFormObj *pStr;
  903. TVmsFormObj *pEnd;
  904. TVmsFormObj *pTrf;
  905. int nTotW;
  906. int nLeft;
  907. AObj->pForms->Lock();
  908. try
  909. {
  910. try
  911. {
  912. for (int ii = 0; ii < nFormCnt; ii++)
  913. {
  914. TVmsForm *pForm = AObj->pForms->GetItem(ii);
  915. if (pForm->VMS_FORM_TYPE_CD != eFormtp_figure)
  916. {
  917. //도형식배경소통정보 폼이 아닌경우 계산하지 않음
  918. continue;
  919. }
  920. nFormT = pForm->Height - 40; //하단소통정보 객체의 최대높이를 설정, 이것보다 작으면 위치조정 하지 않음
  921. pArw = NULL;
  922. pStr = NULL;
  923. pEnd = NULL;
  924. pTrf = NULL;
  925. //소통상황 시점 -> 종점
  926. //시점 -> 종점 소통상황
  927. //위의 2가지 유형에 대하여 가운데 정렬
  928. nObjCnt = pForm->Count();
  929. for (int jj = 0; jj < nObjCnt; jj++)
  930. {
  931. TVmsFormObj *pFormObj = pForm->GetItem(jj);
  932. if (pFormObj->PosY < nFormT)
  933. {
  934. continue;
  935. }
  936. switch(pFormObj->ObjectType)
  937. {
  938. case 1: // 심볼 Y
  939. case 2: // 이미지 Y
  940. case 17: // @소통정보이미지 N
  941. if (pFormObj->TRFC_FILL_CD == "T")
  942. {
  943. pArw = pFormObj;
  944. }
  945. break;
  946. case 12: // @시점명 Y
  947. case 93: // @축시점명(순환) Y
  948. case 13: // @종점명 Y
  949. case 94: // @축종점명(순환) Y
  950. if (pFormObj->ObjectType == 12 || pFormObj->ObjectType == 93)
  951. {
  952. pStr = pFormObj;
  953. }
  954. else
  955. {
  956. pEnd = pFormObj;
  957. }
  958. break;
  959. case 14: // @소통상황 Y
  960. case 15: // @통행시간 Y
  961. case 16: // @통행속도 N
  962. case 95: // @축소통상황(순환) Y
  963. case 96: // @축통행시간(순환) Y
  964. pTrf = pFormObj;
  965. break;
  966. }
  967. }
  968. if (pArw && pStr && pEnd && pTrf)
  969. {
  970. if ((pStr->TextWidth +
  971. pArw->TextWidth +
  972. pEnd->TextWidth +
  973. pTrf->TextWidth) > (pForm->Width - ARRAWGAP - ARRAWGAP - TRAFFGAP - 10)
  974. )
  975. {
  976. ARRAWGAP = 3;
  977. TRAFFGAP = 10;
  978. }
  979. nTotW = pStr->TextWidth + ARRAWGAP +
  980. pArw->TextWidth + ARRAWGAP +
  981. pEnd->TextWidth + TRAFFGAP +
  982. pTrf->TextWidth;
  983. nLeft = (pForm->Width - nTotW) / 2;
  984. if (pStr->PosX < pTrf->PosX)
  985. {
  986. //시점 -> 종점 소통상황
  987. pStr->PosX = nLeft;
  988. pArw->PosX = pStr->PosX + pStr->TextWidth + ARRAWGAP;
  989. pEnd->PosX = pArw->PosX + pArw->TextWidth + ARRAWGAP;
  990. pTrf->PosX = pEnd->PosX + pEnd->TextWidth + TRAFFGAP;
  991. }
  992. else
  993. {
  994. //소통상황 시점 -> 종점
  995. pTrf->PosX = nLeft;
  996. pStr->PosX = pTrf->PosX + pTrf->TextWidth + TRAFFGAP;
  997. pArw->PosX = pStr->PosX + pStr->TextWidth + ARRAWGAP;
  998. pEnd->PosX = pArw->PosX + pArw->TextWidth + ARRAWGAP;
  999. }
  1000. }
  1001. }
  1002. }
  1003. catch(Exception &e)
  1004. {
  1005. MERROR("MAIN MakeVmsFigureFormPos error2: %s, %s", AnsiString(e.ClassName()).c_str(), AnsiString(e.Message).c_str());
  1006. }
  1007. }
  1008. __finally
  1009. {
  1010. AObj->pForms->UnLock();
  1011. }
  1012. return nSelCnt;
  1013. }
  1014. //---------------------------------------------------------------------------
  1015. int __fastcall TFrmMain::MakeVmsDatabaseForm(TCDSCtlr *AObj)
  1016. {
  1017. int nSelCnt = 0;
  1018. if (!AObj) return VERR_MEMORY_ALLOC;
  1019. int nFormCnt = AObj->pForms->Count();
  1020. if (nFormCnt == 0) return nSelCnt;
  1021. AObj->pForms->Lock();
  1022. try
  1023. {
  1024. try
  1025. {
  1026. for (int ii = 0; ii < nFormCnt; ii++)
  1027. {
  1028. TVmsForm *pForm = AObj->pForms->GetItem(ii);
  1029. int nObjCnt;
  1030. pForm->pBitmap->Canvas->Lock();
  1031. try
  1032. {
  1033. pForm->FormClear(CodeToFormColor(pForm->VMS_FORM_COLR_CD));
  1034. nObjCnt = pForm->Count();
  1035. TRect rc;
  1036. for (int jj = 0; jj < nObjCnt; jj++)
  1037. {
  1038. TVmsFormObj *pFormObj = pForm->GetItem(jj);
  1039. switch(pFormObj->ObjectType)
  1040. {
  1041. case 1: //심볼
  1042. case 2: //이미지
  1043. case 3: //소통정보배경이미지
  1044. case 17: //소통정보이미지1
  1045. case 27: //소통정보이미지2
  1046. case 37: //소통정보이미지3
  1047. case 47: //소통정보이미지4
  1048. case 167: //@우회소통정보이미지
  1049. case 200: //동영상이미지
  1050. case 300: //스트리밍영상이미지
  1051. case 406: //@통합대기등급 이미지
  1052. case 407: //@미세먼지등급 이미지
  1053. case 408: //@초미세먼지등급 이미지
  1054. case 413: //@오존등급이미지
  1055. if (pFormObj->ObjectType == 17 ||
  1056. pFormObj->ObjectType == 27 ||
  1057. pFormObj->ObjectType == 37 ||
  1058. pFormObj->ObjectType == 47 ||
  1059. pFormObj->ObjectType == 167
  1060. )
  1061. {
  1062. rc.Top = pFormObj->PosY;
  1063. rc.Bottom = pFormObj->PosY + pFormObj->pImageData->Picture->Graphic->Height;
  1064. rc.Left = pFormObj->PosX;
  1065. rc.Right = pFormObj->PosX + pFormObj->pImageData->Picture->Graphic->Width;
  1066. pForm->pBitmap->Canvas->StretchDraw(rc, pFormObj->pImageData->Picture->Graphic);
  1067. }
  1068. else
  1069. {
  1070. pForm->pBitmap->Canvas->Draw(pFormObj->PosX, pFormObj->PosY, pFormObj->pImageData->Picture->Graphic);
  1071. }
  1072. break;
  1073. default://기타 문자열
  1074. pForm->pBitmap->Canvas->Brush->Color = CodeToBackColor(pFormObj->BkColor);
  1075. #if 0
  1076. //이력저장할때 폰트색상을 코드로 넣기 때문에 색상값을 직접사용할 수 없다.
  1077. switch(pFormObj->ObjectType)
  1078. {
  1079. //case 401: //@관측장소 ==> 관측장소 폰트 색상은 운영자가 입력한 색상을 그대로 사용한다.
  1080. case 402: //@PM10
  1081. case 403: //@PM2.5
  1082. case 404: //@PM10등급
  1083. case 405: //@PM2.5등급
  1084. case 409: //@통합대기등급
  1085. case 410: //@통합대기
  1086. case 411: //@오존
  1087. case 412: //@오존등급
  1088. pForm->pBitmap->Canvas->Font->Color = (TColor)(pFormObj->TextFontColor);
  1089. break;
  1090. default:
  1091. pForm->pBitmap->Canvas->Font->Color = CodeToFontColor(pFormObj->TextFontColor);
  1092. break;
  1093. }
  1094. #else
  1095. pForm->pBitmap->Canvas->Font->Color = CodeToFontColor(pFormObj->TextFontColor);
  1096. #endif
  1097. pForm->pBitmap->Canvas->Font->Name = CodeToFontName(pFormObj->TextFontName);
  1098. pForm->pBitmap->Canvas->Font->Size = pFormObj->TextFontSize;
  1099. if (pFormObj->TextFontBold)
  1100. pForm->pBitmap->Canvas->Font->Style = TFontStyles() << fsBold;
  1101. else
  1102. pForm->pBitmap->Canvas->Font->Style = TFontStyles();
  1103. pForm->pBitmap->Canvas->TextOutA(pFormObj->PosX, pFormObj->PosY, pFormObj->TextData);
  1104. break;
  1105. }
  1106. } // 폼의 객체수 만큼 객체를 폼에 그린다.
  1107. try
  1108. {
  1109. pForm->pStream->Clear();
  1110. pForm->pStream->Position = 0;
  1111. pForm->pBitmap->SaveToStream(pForm->pStream);
  1112. //FTP다운로드 하는 경우 폼을 FTP디렉토리에 저장해야함
  1113. if (pForm->VMS_SCH_FORM_TYPE != eSchTp_hongbo && //홍보(제어기별 폼생성시 CDSForm의 파일명으로 설정되어 있음
  1114. pForm->VMS_SCH_FORM_TYPE != eSchTp_video && //비디오
  1115. pForm->VMS_SCH_FORM_TYPE != eSchTp_stream ) //스트리밍영상 등은 로컬파일로 저장할 필요가 없음
  1116. { //파일이름을 여기서 변경하면 ftp 파일명이 변경된다.
  1117. if (AObj->FIsFtpDownload)
  1118. {
  1119. AnsiString sFormName;
  1120. sFormName.printf("%s_%02d.bmp", AObj->CTLR_NMBR.c_str(), ii+1);
  1121. pForm->LocalFileName = AObj->FLocalFormDir + sFormName;
  1122. pForm->FtpFileName = AObj->FFtpFormDir + sFormName;
  1123. pForm->pBitmap->SaveToFile(pForm->LocalFileName);
  1124. }
  1125. }
  1126. pForm->Success = true;
  1127. switch (pForm->VMS_SCH_FORM_TYPE)
  1128. {
  1129. case eSchTp_traffic: // = 0, //0:교통,
  1130. case eSchTp_incident: // = 1, //1:돌발,
  1131. case eSchTp_gongsa: // = 2, //2:공사행사,
  1132. case eSchTp_deture: // = 4, //4:우회,
  1133. case eSchTp_congest: // = 5, //5:정체,
  1134. pForm->fileType = P_FILE_TYPE_TRAFFIC;
  1135. break;
  1136. case eSchTp_hongbo: // = 3, //3:홍보,
  1137. case eSchTp_safe: // = 6, //6:안전,
  1138. case eSchTp_atmp: // = 9, //9:대기환경
  1139. case eSchTp_park: // = 10, //10:주차정보
  1140. pForm->fileType = P_FILE_TYPE_TEXT;
  1141. break;
  1142. case eSchTp_video: // = 7, //7:동영상,
  1143. pForm->fileType = P_FILE_TYPE_VIDEO;
  1144. pForm->FtpFileName = AnsiString(FTP_VIDEO) + "\\" + pForm->STRM_ADDR;
  1145. break;
  1146. case eSchTp_stream: // = 8, //8:스트리밍영상
  1147. pForm->fileType = P_FILE_TYPE_STREAM;
  1148. pForm->FtpFileName = pForm->STRM_ADDR;
  1149. break;
  1150. default:
  1151. pForm->Success = false;
  1152. break;
  1153. }
  1154. MINFO("MAIN CTLR FORM: %s, %d, [%d] [0x%02X], %s", AObj->CTLR_NMBR.c_str(), ii, pForm->VMS_SCH_FORM_TYPE, pForm->fileType, pForm->FtpFileName.c_str());
  1155. nSelCnt++;
  1156. }
  1157. catch(Exception &e)
  1158. {
  1159. MERROR("MAIN MakeVmsDatabaseForm error1: %s, %s", AnsiString(e.ClassName()).c_str(), AnsiString(e.Message).c_str());
  1160. pForm->LocalFileName = "";
  1161. pForm->FtpFileName = "";
  1162. }
  1163. }
  1164. __finally
  1165. {
  1166. pForm->pBitmap->Canvas->Unlock();
  1167. }
  1168. }
  1169. }
  1170. catch(Exception &e)
  1171. {
  1172. MERROR("MAIN MakeVmsDatabaseForm error2: %s, %s", AnsiString(e.ClassName()).c_str(), AnsiString(e.Message).c_str());
  1173. }
  1174. }
  1175. __finally
  1176. {
  1177. AObj->pForms->UnLock();
  1178. }
  1179. return nSelCnt;
  1180. }
  1181. //---------------------------------------------------------------------------