MainCommF.cpp 87 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896
  1. //---------------------------------------------------------------------------
  2. #pragma hdrstop
  3. #include "MainCommF.h"
  4. #include "CDSProcessF.h"
  5. #include "CDSCtlrF.h"
  6. #include "CDSFormF.h"
  7. #include "CDSIfscF.h"
  8. #include "CDSImageF.h"
  9. #include "CDSAtmpF.h"
  10. #include "CDSSafeF.h"
  11. #include "CDSParkF.h"
  12. #include "VmsUtilsF.h"
  13. #include "PacketHandllingF.h"
  14. //---------------------------------------------------------------------------
  15. #pragma package(smart_init)
  16. int g_ToggleFormSeq = 1;
  17. int __fastcall 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 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. // 제어기별 다운로드 디렉토리가 존재하지 않으면 생성
  110. if (!DirectoryExists(pObj->FLocalFormDir))
  111. {
  112. ForceDirectories(pObj->FLocalFormDir.c_str());
  113. MWARN("MAIN VMS Form Directory Re Create: %s, %s", pObj->FLocalFormDir.c_str(), pObj->FFtpFormDir.c_str());
  114. }
  115. pObj->pForms->Lock();
  116. try
  117. {
  118. TCDSAtmp *pAtmpObj = NULL;
  119. AnsiString ATMP_STTN_NMBR = "";
  120. //최대 제공 메시지 갯수만큼 생성
  121. for (int ii = 0; ii < pSch->Count && ii < pObj->CTRLMODE->MaxDisplayForm; ii++)
  122. {
  123. pSchUnit = &pSch->Unit[ii];
  124. if (pObj->FExistCngsForm && pSchUnit->DSPL_CNGS_YN == false)
  125. {
  126. //해당 제어기에 정체폼이 존재하는 경우
  127. //스케쥴 폼이 정체일때 표출하지 않는 경우
  128. //폼을 생성하지 않는다.
  129. continue;
  130. }
  131. nFormCnt = pObj->pForms->Count();
  132. AnsiString sFormId = pSchUnit->VMS_FORM_ID;
  133. pCDSForm = CDSFormManager->FLists.Find(sFormId);
  134. if (!pCDSForm)
  135. {
  136. MERROR("MAIN VMS Schedule Form Not found: VmsNmbr(%s), FormId(%s) %d", pObj->CTLR_NMBR.c_str(), sFormId.c_str(), ii);
  137. continue;
  138. }
  139. //소통정보 표출폼 인 경우 표출할 구간의 소통정보가 존재하지 않는 경우
  140. //폼을 생성하지 않도록 한다.
  141. // TODO(20200525)
  142. int reqTraffic = 0;
  143. int setTraffic = 0;
  144. switch(pCDSForm->VMS_FORM_TYPE_CD)
  145. {
  146. case eFormTp_traf_1:// = 11, // 소통상황(1단)
  147. reqTraffic = 1;
  148. case eFormTp_traf_2:// = 12, // 소통상황(2단)
  149. reqTraffic = 2;
  150. case eFormTp_traf_3:// = 13, // 소통상황(3단)
  151. reqTraffic = 3;
  152. case eFormTp_traf_4:// = 14, // 소통상황(4단)
  153. reqTraffic = 4;
  154. {
  155. int ss;
  156. bool bNoData = true;
  157. AnsiString sVmsIfscId[4];
  158. AnsiString sImgIfscId[4];
  159. for (ss = 0; ss < 4; ss++)
  160. {
  161. sVmsIfscId[ss] = "";
  162. sImgIfscId[ss] = "";
  163. }
  164. sVmsIfscId[0] = pSchUnit->FRST_VMS_IFSC_ID;
  165. sVmsIfscId[1] = pSchUnit->SECD_VMS_IFSC_ID;
  166. sVmsIfscId[2] = pSchUnit->THIR_VMS_IFSC_ID;
  167. sVmsIfscId[3] = pSchUnit->FOUR_VMS_IFSC_ID;
  168. sImgIfscId[0] = pSchUnit->FRST_IMG_IFSC_ID;
  169. sImgIfscId[1] = pSchUnit->SECD_IMG_IFSC_ID;
  170. sImgIfscId[2] = pSchUnit->THIR_IMG_IFSC_ID;
  171. sImgIfscId[3] = pSchUnit->FOUR_IMG_IFSC_ID;
  172. for (ss = 0; ss < 4; ss++)
  173. {
  174. if (sVmsIfscId[ss] == "0") sVmsIfscId[ss] = "";
  175. if (sImgIfscId[ss] == "0") sImgIfscId[ss] = "";
  176. if (sVmsIfscId[ss] == "")
  177. {
  178. sVmsIfscId[ss] = sImgIfscId[ss];
  179. }
  180. if (sVmsIfscId[ss] == "") continue;
  181. setTraffic++;
  182. }
  183. if (reqTraffic > setTraffic)
  184. {
  185. //실제 소통정보 폼 갯수보다 할당된 구간이 적은 경우에 해당함
  186. reqTraffic = setTraffic;
  187. }
  188. setTraffic = 0;
  189. for (ss = 0; ss < 4; ss++)
  190. {
  191. if (sVmsIfscId[ss] == "") continue;
  192. TCDSIfsc *pTmpIfsc = CDSIfscManager->FLists.Find(sVmsIfscId[ss]);
  193. if (pTmpIfsc)
  194. {
  195. if (pTmpIfsc->CMTR_GRAD_CD != "0")
  196. {
  197. bNoData = false;
  198. setTraffic++;
  199. }
  200. }
  201. }
  202. //if (bNoData)
  203. if (reqTraffic != setTraffic)
  204. {
  205. MWARN("MAIN VMS Schedule Form No Traffic: VmsNmbr(%s), FormId(%s), REQ(%d), SET(%d)", pObj->CTLR_NMBR.c_str(), sFormId.c_str(), reqTraffic, setTraffic);
  206. continue;
  207. }
  208. }
  209. break;
  210. #if 0
  211. //폼에 대기환경수집장소가 하나인경우에만 해당
  212. //폼 객체에 대기환경수집장소를 설정하도록 수정하였음.
  213. case eFormTp_atmp: //대기환경
  214. {
  215. //스케줄 정보를 디비에서 읽어서 스케쥴을 작성할때 확인하지만 다시한번 확인
  216. //아래 객체를 생성할때 사용할수 있게 미리 메모리를 찾아서 할당한다.
  217. ATMP_STTN_NMBR = pSchUnit->FRST_VMS_IFSC_ID;
  218. pAtmpObj = NULL;
  219. if (CDSAtmpManager) CDSAtmpManager->FLists.Find(ATMP_STTN_NMBR);
  220. if (!pAtmpObj) continue;
  221. if (pAtmpObj->SUCCESS == false)
  222. {
  223. pAtmpObj = NULL;
  224. continue;
  225. }
  226. }
  227. break;
  228. #endif
  229. }
  230. nSaveFormCnt++;
  231. //폼생성
  232. pVmsForm = pObj->pForms->AddForm(); // new 를 사용해서 생성하지 않고 기존에 생성한 폼을 이용한다.
  233. pVmsForm->Success = false;
  234. pVmsForm->FtpFileName = pCDSForm->FtpFileName; // 정적폼인경우 경로가 지정됨
  235. pVmsForm->LocalFileName = pCDSForm->LocalFileName; // 정적폼인경우 경로가 지정됨
  236. pVmsForm->VMS_SCH_TYPE = pSchUnit->VMS_SCH_TYPE;
  237. pVmsForm->VMS_SCH_FORM_TYPE = pSchUnit->VMS_SCH_FORM_TYPE;
  238. pVmsForm->SYMB_LIB_NMBR = pSchUnit->SYMB_LIB_NMBR;
  239. pVmsForm->STRM_ADDR = pSchUnit->STRM_ADDR;
  240. pVmsForm->ScenarioSeq = nFormCnt; /* 폼 표출순서 */
  241. pVmsForm->VMS_FORM_ID = pCDSForm->VMS_FORM_ID; /* 폼 ID */
  242. pVmsForm->DSPL_HH = pSchUnit->DSPL_HH; /* 표출시간(초) */
  243. pVmsForm->VMS_FORM_DSPL_DRCT_CD = AnsiString(pCDSForm->VMS_FORM_DSPL_DRCT_CD); /* 표출방향 */
  244. pVmsForm->VMS_FORM_DSPL_MTHD_CD = AnsiString(pCDSForm->VMS_FORM_DSPL_MTHD_CD); /* 표출기능 */
  245. pVmsForm->VMS_FORM_TYPE_CD = pCDSForm->VMS_FORM_TYPE_CD; /* 폼 종류 */
  246. pVmsForm->VMS_FORM_COLR_CD = pCDSForm->VMS_FORM_COLR_CD; /* 배경색상 */
  247. pVmsForm->Width = pObj->WIDTH; /* 폼넓이 */
  248. pVmsForm->Height = pObj->HEIGHT; /* 폼높이 */
  249. pVmsForm->SvcRes = false;
  250. pVmsForm->FtpRes = false;
  251. pVmsForm->Lock();
  252. //폼객체생성
  253. FOR_STL(TCDSFormObj*, pCDSObj, pCDSForm->FLists)
  254. {
  255. if (pVmsForm->Count() >= MAX_FORM_OBJ_LIST)
  256. {
  257. break;
  258. }
  259. //도형식 배경소통정보 폼인 경우 하단에 표출할 정보가 없는 경우
  260. //하단 소통정보 객체는 생성하지 않도록 하자.
  261. if (pVmsForm->VMS_FORM_TYPE_CD == eFormtp_figure) // = 15, // 소통상황(도형식배경소통정보))
  262. {
  263. switch(pCDSObj->VMS_FORM_OBJECT_TYPE_CD)
  264. {
  265. case 0: //문자열
  266. case 1: //심볼
  267. case 2: //이미지
  268. //N:일반(모두표출하는것)
  269. //T:소통정보(소통정보가 있는 경우에만 표출하는것)
  270. //F:하단고정(소통정보가 없는 경우에만 표출하는것)
  271. if (pSchUnit->VMS_IFSC_ID == "")
  272. {
  273. //표출할 소통정보가 없는 경우
  274. if (pCDSObj->TRFC_FILL_CD == "T") continue; //
  275. }
  276. else
  277. {
  278. //표출할 소통정보가 있는 경우
  279. if (pCDSObj->TRFC_FILL_CD == "F") continue; //
  280. }
  281. break;
  282. case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19:
  283. if (pSchUnit->VMS_IFSC_ID == "")
  284. {
  285. continue; //하단에 표출할 정보제공구간이 없는 경우임
  286. }
  287. //////////////////////// 20200515 추가함(S)
  288. if (pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 17)
  289. {
  290. //하단 소통정보이미지
  291. pSchUnit->FRST_IMG_IFSC_ID = pSchUnit->VMS_IFSC_ID;
  292. }
  293. //////////////////////// 20200515 추가함(E)
  294. break;
  295. #if 0
  296. case 1://심볼(소통정보 시점 종점 사이 화살표)
  297. #if 1
  298. if (pCDSObj->VMS_DSPL_TXT.Trim() == "->")
  299. if (pSchUnit->VMS_IFSC_ID == "") continue; //하단에 표출할 정보제공구간이 없는 경우임
  300. #else
  301. if (pSchUnit->VMS_IFSC_ID == "") continue; //하단에 표출할 정보제공구간이 없는 경우임
  302. #endif
  303. break;
  304. #endif
  305. default: break;
  306. }
  307. } //pVmsForm->VMS_FORM_TYPE_CD == eFormtp_figure
  308. pVmsObj = pVmsForm->AddFormObject();
  309. pVmsObj->IFSC_ID = "";
  310. pVmsObj->TRFC_FILL_CD = pCDSObj->TRFC_FILL_CD;
  311. switch(pCDSObj->VMS_FORM_OBJECT_TYPE_CD)
  312. {
  313. case 1: //심볼
  314. pVmsObj->ObjectKind = graphicID_object_data; //요건 다운로드되어 있는 경우인데 다운로드상관없이 표출되도록하기위함
  315. //pVmsObj->ObjectKind = graphic_object_data;
  316. break;
  317. case 2: //이미지
  318. pVmsObj->ObjectKind = graphicID_object_data;
  319. break;
  320. case 3: //소통정보배경이미지
  321. pVmsObj->ObjectKind = graphic_object_data;
  322. break;
  323. case 17: //1단,소통정보이미지1
  324. case 27: //2단,소통정보이미지2
  325. case 37: //3단,소통정보이미지3
  326. case 47: //4단,소통정보이미지4
  327. case 167: //@우회소통정보이미지
  328. case 200: //동영상이미지
  329. case 300: //스트리밍영상이미지
  330. case 406: //@통합대기등급 이미지
  331. case 407: //@미세먼지등급 이미지
  332. case 408: //@초미세먼지등급 이미지
  333. case 413: //@오존등급이미지
  334. pVmsObj->ObjectKind = graphicID_object_data;
  335. break;
  336. default:
  337. pVmsObj->ObjectKind = text_object_data;
  338. break;
  339. } //switch(pCDSObj->VMS_FORM_OBJECT_TYPE_CD)
  340. pVmsObj->ObjectType = pCDSObj->VMS_FORM_OBJECT_TYPE_CD; //NUMBER(3) N VMS FORM OBJECT 유형 코드
  341. pVmsObj->TextFontName = pCDSObj->VMS_FONT_NAME_CD; //NUMBER(3) N VMS 글꼴 유형 코드
  342. //TODO
  343. pVmsObj->StrTextFontName = CodeToFontName(pVmsObj->TextFontName);
  344. pVmsObj->TextFontColor = pCDSObj->VMS_FONT_COLR_CD; //NUMBER(3) N VMS 글꼴 색상 코드
  345. pVmsObj->TextFontBold = pCDSObj->VMS_FONT_BOLD; //NUMBER(3) Y VMS 글꼴 방식 코드(0:Normal,1:Bold)
  346. pVmsObj->TextFontSize = pCDSObj->VMS_FONT_SIZE; //NUMBER(3) Y 0 VMS 글꼴 크기
  347. pVmsObj->TextAlign = pCDSObj->VMS_FONT_ALIGN; //NUMBER(1) Y 0 VMS 표출 문자열정열방식(0:LEFT,1:RIGHT,2:CENTER)
  348. pVmsObj->PosX = pCDSObj->VMS_DSPL_XCRDN; //NUMBER(5) Y VMS 표출 X좌표
  349. pVmsObj->PosY = pCDSObj->VMS_DSPL_YCRDN; //NUMBER(5) Y VMS 표출 Y좌표
  350. pVmsObj->Width = pCDSObj->VMS_DSPL_WIDTH; //NUMBER(5) Y 0 VMS 표출 넓이
  351. pVmsObj->TextWidth = pCDSObj->VMS_DSPL_WIDTH; //NUMBER(5) Y 0 VMS 표출 넓이
  352. pVmsObj->Height = pCDSObj->VMS_DSPL_HEIGHT; //NUMBER(5) Y 0 VMS 표출 높이
  353. pVmsObj->IsBlinking = pCDSObj->VMS_DSPL_BLINKING; //NUMBER(1) Y 0 VMS 표출 점멸 여부(0:지속, 1:점멸)
  354. pVmsObj->BkColor = pCDSObj->VMS_DSPL_BKCOLOR; //NUMBER(1) Y 0 VMS 표출 배경색상코드
  355. pVmsObj->ObjectSize = pCDSObj->VMS_DSPL_SIZE; //NUMBER(7) Y 0 VMS 표출 크기(문자:문자길이,이미지:이미지전체크기)
  356. if (pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 201 || //동영상명칭
  357. pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 301) //스트리밍영상주소
  358. {
  359. pVmsObj->TextData = pSchUnit->STRM_ADDR; //VARCHAR2(200) Y VMS 표출 텍스트
  360. }
  361. else
  362. {
  363. pVmsObj->TextData = pCDSObj->VMS_DSPL_TXT; //VARCHAR2(200) Y VMS 표출 텍스트
  364. }
  365. if (pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 200 || //동영상이미지
  366. pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 300) //스트리밍영상이미지
  367. {
  368. pVmsObj->ImageId = pSchUnit->SYMB_LIB_NMBR+"0"; //NUMBER(4) N 0 심벌라이브러리 번호
  369. if (pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 200)
  370. {
  371. pVmsObj->PosX = 0; //NUMBER(5) Y VMS 표출 X좌표
  372. pVmsObj->PosY = 0; //NUMBER(5) Y VMS 표출 Y좌표
  373. pVmsObj->Width = pVmsForm->Width; //NUMBER(5) Y 0 VMS 표출 넓이
  374. pVmsObj->Height = pVmsForm->Height; //NUMBER(5) Y 0 VMS 표출 높이
  375. TCDSImage* pTmpImg = CDSImageManager->FLists.Find(pVmsObj->ImageId);
  376. if (pTmpImg)
  377. {
  378. pVmsForm->DSPL_HH = pTmpImg->PLAY_TM;
  379. }
  380. }
  381. }
  382. else
  383. {
  384. pVmsObj->ImageId = pCDSObj->SYMB_LIB_NMBR+"0"; //NUMBER(4) N 0 심벌라이브러리 번호
  385. }
  386. pVmsObj->ImageType = "0"; //Bitmap
  387. if (pVmsObj->ObjectKind != text_object_data)
  388. {
  389. if (pVmsObj->NewImage() != NULL)
  390. {
  391. try
  392. {
  393. pVmsObj->pImageData->Picture->Bitmap->Canvas->Lock();
  394. try
  395. {
  396. if (pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 200 || //동영상이미지
  397. pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 300) //스트리밍영상이미지
  398. {
  399. TCDSImage* pTmpImg = CDSImageManager->FLists.Find(pVmsObj->ImageId);
  400. if (pTmpImg)
  401. {
  402. pVmsObj->pImageData->Picture->Assign(pTmpImg->IMAG_DATA->Picture);
  403. }
  404. else
  405. {
  406. pVmsObj->pImageData->Picture->Assign(pCDSObj->pImage->Picture);
  407. }
  408. }
  409. else
  410. if (CDSAtmpManager &&
  411. (pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 406 || //@통합대기등급 이미지
  412. pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 407 || //@미세먼지등급 이미지
  413. pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 408 || //@초미세먼지등급 이미지
  414. pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 413 ) //@오존등급이미지
  415. )
  416. {
  417. bool isObj = false;
  418. pAtmpObj = CDSAtmpManager->FLists.Find(pCDSObj->VMS_IFSC_ID);
  419. if (pAtmpObj && pAtmpObj->SUCCESS) isObj = true;
  420. if (isObj)
  421. {
  422. //관측장소 정보가 존재하는 경우에만 대기환경이미지를 폼에 적용한다.
  423. int nAtmpGrad = 0;
  424. switch(pCDSObj->VMS_FORM_OBJECT_TYPE_CD)
  425. {
  426. case 406: nAtmpGrad = pAtmpObj->INTG_ATMP_GRAD.ToIntDef(1); break;
  427. case 407: nAtmpGrad = pAtmpObj->PM10_1HH_GRAD.ToIntDef(1); break;
  428. case 408: nAtmpGrad = pAtmpObj->PM25_1HH_GRAD.ToIntDef(1); break;
  429. case 413: nAtmpGrad = pAtmpObj->O3_GRAD.ToIntDef(1); break;
  430. }
  431. if (nAtmpGrad > 0) nAtmpGrad--;
  432. TCDSImage *pTmp1 = CDSImageManager->FLists.Find(pVmsObj->ImageId);
  433. if (pTmp1)
  434. {
  435. AnsiString sGradSymbId = pTmp1->GRAD_SYMB_LIB_NMBR[nAtmpGrad];
  436. TCDSImage *pTmp2 = CDSImageManager->FLists.Find(sGradSymbId);
  437. if (pTmp2) pVmsObj->pImageData->Picture->Assign(pTmp2->IMAG_DATA->Picture);
  438. else pVmsObj->pImageData->Picture->Assign(pTmp1->IMAG_DATA->Picture);
  439. pVmsObj->ImageId = sGradSymbId;
  440. }
  441. else
  442. {
  443. pVmsObj->pImageData->Picture->Assign(pCDSObj->pImage->Picture);
  444. }
  445. }
  446. }
  447. else
  448. {
  449. #if 0
  450. //TODO: 심볼, 이미지 인경우 실재 이미지와 설정된 이미지 크기가 다르면
  451. //설정된 크기에 맞게 이미지를 복사한다.
  452. if (pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 1 || pCDSObj->VMS_FORM_OBJECT_TYPE_CD == 2)
  453. {
  454. if (pCDSObj->VMS_DSPL_WIDTH != pCDSObj->pImage->Picture->Width ||
  455. pCDSObj->VMS_DSPL_HEIGHT != pCDSObj->pImage->Picture->Height)
  456. {
  457. pVmsObj->pImageData->Width = pCDSObj->VMS_DSPL_WIDTH;
  458. pVmsObj->pImageData->Height= pCDSObj->VMS_DSPL_HEIGHT;
  459. //pVmsObj->pImageData->Picture->Width = pCDSObj->VMS_DSPL_WIDTH;
  460. //pVmsObj->pImageData->Picture->Height= pCDSObj->VMS_DSPL_HEIGHT;
  461. pVmsObj->pImageData->Picture->Bitmap->Width = pCDSObj->VMS_DSPL_WIDTH;
  462. pVmsObj->pImageData->Picture->Bitmap->Height= pCDSObj->VMS_DSPL_HEIGHT;
  463. //TODO
  464. SetStretchBltMode(pVmsObj->pImageData->Canvas->Handle, MAXSTRETCHBLTMODE);//HALFTONE);//MAXSTRETCHBLTMODE)//STRETCH_HALFTONE;
  465. //TODO
  466. SetStretchBltMode(pVmsObj->pImageData->Picture->Bitmap->Canvas->Handle, MAXSTRETCHBLTMODE);//HALFTONE);//MAXSTRETCHBLTMODE)//STRETCH_HALFTONE;
  467. pVmsObj->pImageData->Picture->Bitmap->Canvas->CopyRect(Classes::Rect(0, 0, pCDSObj->VMS_DSPL_WIDTH, pCDSObj->VMS_DSPL_HEIGHT),
  468. pCDSObj->pImage->Picture->Bitmap->Canvas,
  469. Classes::Rect(0, 0, pCDSObj->pImage->Picture->Width, pCDSObj->pImage->Picture->Height));
  470. }
  471. else
  472. {
  473. pVmsObj->pImageData->Picture->Assign(pCDSObj->pImage->Picture);
  474. }
  475. }
  476. else
  477. {
  478. pVmsObj->pImageData->Picture->Assign(pCDSObj->pImage->Picture);
  479. }
  480. #else
  481. pVmsObj->pImageData->Picture->Assign(pCDSObj->pImage->Picture);
  482. #endif
  483. }
  484. }
  485. catch(Exception &e)
  486. {
  487. MERROR("SaveMemoryStream1: %s[%s] - %s", pVmsForm->VMS_FORM_ID.c_str(), pVmsObj->ImageId.c_str(), AnsiString(e.Message).c_str());
  488. }
  489. }
  490. __finally
  491. {
  492. pVmsObj->pImageData->Picture->Bitmap->Canvas->Unlock();
  493. pVmsObj->pImageStream->Clear();
  494. pVmsObj->pImageStream->Position = 0;
  495. pVmsObj->pImageData->Picture->Graphic->SaveToStream((Classes::TStream*)pVmsObj->pImageStream);
  496. }
  497. }
  498. }
  499. //폼객체 유형별 Fill In
  500. if (pVmsObj->ObjectType == 0 || //고정문자열
  501. pVmsObj->ObjectType == 201 || //동영상파일명
  502. pVmsObj->ObjectType == 301) //스트리밍영상주소
  503. {
  504. #if 0
  505. if (pObj->FBmpDownload == false && pObj->FIsOldProtocol == false)
  506. {
  507. //신규VMS인 경우 첫자리가 0 인경우 해당 문자를 표출하지 못함
  508. if (pVmsObj->TextData != "")
  509. {
  510. if (pVmsObj->TextData.SubString(1,1) == "0")
  511. {
  512. pVmsObj->TextData = " " + pVmsObj->TextData;
  513. pVmsObj->PosX = pVmsObj->PosX - 5;
  514. }
  515. }
  516. }
  517. #endif
  518. ChangePosition(pVmsObj);
  519. }
  520. else
  521. if (pVmsObj->ObjectType == 501 || //재난안전문자 1열
  522. pVmsObj->ObjectType == 502 || //재난안전문자 2열
  523. pVmsObj->ObjectType == 503 //재난안전문자 3열 ==> 포항은 3단 문자열이 없음
  524. )
  525. {
  526. VMS_SAFE_DETL *pEvt = pSchUnit->SAFE;
  527. if (pEvt)
  528. {
  529. switch(pVmsObj->ObjectType)
  530. {
  531. case 501: //재난안전문자 1열
  532. pVmsObj->TextData = pEvt->MSG_LN_1;
  533. break;
  534. case 502: //재난안전문자 2열
  535. pVmsObj->TextData = pEvt->MSG_LN_2;
  536. break;
  537. case 503: //재난안전문자 3열
  538. pVmsObj->TextData = pEvt->MSG_LN_3;
  539. break;
  540. }
  541. }
  542. ChangePosition(pVmsObj);
  543. }
  544. else
  545. if (pVmsObj->ObjectType == 1 || //심볼
  546. pVmsObj->ObjectType == 2 ) //파일이미지
  547. {
  548. ; //처리없음
  549. }
  550. else
  551. if (pVmsObj->ObjectType == 17 || //1단,소통정보이미지1
  552. pVmsObj->ObjectType == 27 || //2단,소통정보이미지2
  553. pVmsObj->ObjectType == 37 || //3단,소통정보이미지3
  554. pVmsObj->ObjectType == 47 || //4단,소통정보이미지4
  555. pVmsObj->ObjectType == 167 ) //@우회소통정보이미지
  556. {
  557. if (!pVmsObj->pImageData) continue;
  558. TCDSImage *pSymbol = CDSImageManager->FLists.Find(pVmsObj->ImageId);
  559. if (!pSymbol) continue;
  560. try
  561. {
  562. int X, Y;
  563. switch(pVmsObj->ObjectType)
  564. {
  565. case 17: pVmsObj->IFSC_ID = pSchUnit->FRST_IMG_IFSC_ID; break;
  566. case 27: pVmsObj->IFSC_ID = pSchUnit->SECD_IMG_IFSC_ID; break;
  567. case 37: pVmsObj->IFSC_ID = pSchUnit->THIR_IMG_IFSC_ID; break;
  568. case 47: pVmsObj->IFSC_ID = pSchUnit->FOUR_IMG_IFSC_ID; break;
  569. case 167: pVmsObj->IFSC_ID = pSchUnit->SECD_IMG_IFSC_ID; break;
  570. }
  571. FOR_STL(TCDSImageCell*, pCell, pSymbol->FLists)
  572. {
  573. TCDSIfsc *pTmpIfsc = CDSIfscManager->FLists.Find(pVmsObj->IFSC_ID);
  574. if (pTmpIfsc)
  575. {
  576. X = pCell->POSX;
  577. Y = pCell->POSY;
  578. pVmsObj->ImageId = pCDSObj->SYMB_LIB_NMBR + pTmpIfsc->CMTR_GRAD_CD;
  579. pVmsObj->pImageData->Picture->Bitmap->Canvas->Lock();
  580. try
  581. {
  582. pVmsObj->pImageData->Picture->Bitmap->Canvas->Brush->Style = bsSolid;
  583. pVmsObj->pImageData->Picture->Bitmap->Canvas->Brush->Color = GradeToFillColor(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
  584. TColor clColor = pVmsObj->pImageData->Picture->Bitmap->Canvas->Pixels[X][Y];
  585. // TODO: 구미시 부영아파트 등 흰색으로 표출한다.
  586. if (clColor != clWhite)
  587. {
  588. pVmsObj->pImageData->Picture->Bitmap->Canvas->FloodFill(X, Y, clColor, fsSurface);
  589. }
  590. }
  591. __finally
  592. {
  593. pVmsObj->pImageData->Picture->Bitmap->Canvas->Unlock();
  594. }
  595. }
  596. }
  597. pVmsObj->pImageStream->Clear();
  598. pVmsObj->pImageStream->Position = 0;
  599. pVmsObj->pImageData->Picture->Graphic->SaveToStream((Classes::TStream*)pVmsObj->pImageStream);
  600. }
  601. catch(Exception &e)
  602. {
  603. MERROR("MAIN SaveMemoryStreamX: %s[%s] - %s", pVmsForm->VMS_FORM_ID.c_str(), pVmsObj->ImageId.c_str(), AnsiString(e.Message).c_str());
  604. }
  605. }
  606. else
  607. if (pVmsObj->ObjectType == 3) //소통정보 배경이미지
  608. {
  609. if (!pVmsObj->pImageData) continue;
  610. TCDSImage *pSymbol = CDSImageManager->FLists.Find(pVmsObj->ImageId);
  611. if (!pSymbol) continue;
  612. try
  613. {
  614. int X, Y;
  615. FOR_STL(TCDSImageCell*, pCell, pSymbol->FLists)
  616. {
  617. TCDSIfsc *pTmpIfsc = CDSIfscManager->FLists.Find(pCell->VMS_IFSC_ID);
  618. if (pTmpIfsc)
  619. {
  620. X = pCell->POSX;
  621. Y = pCell->POSY;
  622. pVmsObj->pImageData->Picture->Bitmap->Canvas->Lock();
  623. try
  624. {
  625. pVmsObj->pImageData->Picture->Bitmap->Canvas->Brush->Color = GradeToFillColor(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
  626. TColor clColor = pVmsObj->pImageData->Picture->Bitmap->Canvas->Pixels[X][Y];
  627. pVmsObj->pImageData->Picture->Bitmap->Canvas->FloodFill(X, Y, clColor, fsSurface);
  628. }
  629. __finally
  630. {
  631. pVmsObj->pImageData->Picture->Bitmap->Canvas->Unlock();
  632. }
  633. }
  634. }
  635. pVmsObj->pImageStream->Clear();
  636. pVmsObj->pImageStream->Position = 0;
  637. pVmsObj->pImageData->Picture->Graphic->SaveToStream((Classes::TStream*)pVmsObj->pImageStream);
  638. }
  639. catch(Exception &e)
  640. {
  641. MERROR("MAIN SaveMemoryStream2: %s[%s] - %s", pVmsForm->VMS_FORM_ID.c_str(), pVmsObj->ImageId.c_str(), AnsiString(e.Message).c_str());
  642. }
  643. }
  644. else
  645. if (pVmsObj->ObjectType == 61 || //구간명
  646. pVmsObj->ObjectType == 62 || //시점명
  647. pVmsObj->ObjectType == 63 || //종점명
  648. pVmsObj->ObjectType == 64 || //돌발유형
  649. pVmsObj->ObjectType == 65 || //대응문구
  650. pVmsObj->ObjectType == 66 //통제유형
  651. )
  652. {
  653. //돌발문안인 경우임
  654. pVmsObj->TextData = " ";
  655. VMS_EVENT_DETL *pEvt = pSchUnit->EVENT;
  656. if (pEvt)
  657. {
  658. switch(pVmsObj->ObjectType)
  659. {
  660. case 61: pVmsObj->TextData = pEvt->VMS_IFSC_NM; break; //@구간명(사용안함)
  661. case 62: pVmsObj->TextData = pEvt->STRT_LCTN_NM; break; //@시점명
  662. case 63: pVmsObj->TextData = pEvt->END_LCTN_NM; break; //@종점명
  663. case 64: pVmsObj->TextData = pEvt->VMS_INCD_DETL_NM; break; //@돌발유형
  664. case 65: pVmsObj->TextData = pEvt->OCRR_LCTN_NM; break; //@대응문구(사용안함-발생장소로 일단넣음)
  665. case 66: pVmsObj->TextData = pEvt->VMS_INCD_RSTR_TYPE_NM; break; //@통제유형
  666. }
  667. }
  668. if (pVmsObj->TextData == "") pVmsObj->TextData = " ";
  669. ChangePosition(pVmsObj);
  670. //TB_VMS_FORM_OBJECT_TYPE 테이블에 유형추가하고
  671. //돌발화면에서 필요한 항목 추가, TB_INCD_OCRR_VMS 테이블에 컬럼추가해야함
  672. }
  673. else
  674. if (pVmsObj->ObjectType == 71 || //발생장소
  675. pVmsObj->ObjectType == 72 || //INCD_TITL
  676. pVmsObj->ObjectType == 73 || //통제시점명
  677. pVmsObj->ObjectType == 74 || //통제종점명
  678. pVmsObj->ObjectType == 75 || //00차로 차단
  679. pVmsObj->ObjectType == 76 || //00월00일 ~ 00월00일
  680. pVmsObj->ObjectType == 77 || //대응문구
  681. pVmsObj->ObjectType == 78 //@통제유형
  682. )
  683. {
  684. //공사/행사문안 임
  685. pVmsObj->TextData = " ";
  686. VMS_EVENT_DETL *pEvt = pSchUnit->EVENT;
  687. if (pEvt)
  688. {
  689. switch(pVmsObj->ObjectType)
  690. {
  691. case 71: pVmsObj->TextData = pEvt->OCRR_LCTN_NM; break; //발생장소
  692. case 72: pVmsObj->TextData = pEvt->INCD_TITL; break; //@공사행사명
  693. case 73: pVmsObj->TextData = pEvt->STRT_LCTN_NM; break; //통제시점명
  694. case 74: pVmsObj->TextData = pEvt->END_LCTN_NM; break; //통제종점명
  695. case 75:
  696. {
  697. int nLane = pEvt->INCD_CLSR_LANE.ToIntDef(0);
  698. if (nLane == 111111)
  699. pVmsObj->TextData = "차로 차단";
  700. else
  701. if (nLane > 0)
  702. pVmsObj->TextData = "일부 차단";
  703. else
  704. pVmsObj->TextData = " ";
  705. }
  706. break; //00차로 차단
  707. case 76: //00월00일 ~ 00월00일
  708. {
  709. String sFrom = pEvt->INCD_STRT_DT.SubString(5,2) + "월" + pEvt->INCD_STRT_DT.SubString(7,2) + "일 " + pEvt->INCD_STRT_DT.SubString(9,2) + "시";
  710. 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) + "시";
  711. pVmsObj->TextData = sFrom + " ~ " + sTo;
  712. }
  713. break;
  714. case 77: pVmsObj->TextData = pEvt->OCRR_LCTN_NM; break; //대응문구(사용안함-발생장소로 일단넣음)
  715. case 78: pVmsObj->TextData = pEvt->VMS_INCD_RSTR_TYPE_NM; break; //@통제유형
  716. }
  717. }
  718. if (pVmsObj->TextData == "") pVmsObj->TextData = " ";
  719. ChangePosition(pVmsObj);
  720. }
  721. else
  722. if (CDSAtmpManager &&
  723. (pVmsObj->ObjectType == 401 || //@관측장소
  724. pVmsObj->ObjectType == 402 || //@PM10
  725. pVmsObj->ObjectType == 403 || //@PM2.5
  726. pVmsObj->ObjectType == 404 || //@PM10등급
  727. pVmsObj->ObjectType == 405 || //@PM2.5등급
  728. pVmsObj->ObjectType == 409 || //@통합대기등급
  729. pVmsObj->ObjectType == 410 || //@통합대기
  730. pVmsObj->ObjectType == 411 || //@오존
  731. pVmsObj->ObjectType == 412 ) //@오존등급
  732. )
  733. {
  734. bool isObj = false;
  735. pAtmpObj = CDSAtmpManager->FLists.Find(pCDSObj->VMS_IFSC_ID);
  736. if (pAtmpObj && pAtmpObj->SUCCESS) isObj = true;
  737. AnsiString sUnit = "";
  738. bool bUnit = false;
  739. if (pVmsObj->TextData.Pos(" -"))
  740. {
  741. bUnit = true;
  742. sUnit = " ";
  743. }
  744. else
  745. if (pVmsObj->TextData.Pos("-"))
  746. {
  747. bUnit = true;
  748. }
  749. pVmsObj->TextData = " ";
  750. if (pVmsObj->ObjectType == 401)
  751. {
  752. pVmsObj->TextData = pAtmpObj ? pAtmpObj->VMS_DISP_NM : AnsiString("---");
  753. }
  754. else
  755. if (pVmsObj->ObjectType == 402)
  756. {
  757. pVmsObj->TextData = isObj ? pAtmpObj->GetPM10_VAL(false) : AnsiString("-");
  758. //TODO 20200528: 구미기존 도형식 하단쪽에 엘이디 고장난게 있어서 흰색으로 표출해야 해서
  759. // 폰트색상이 흰색인 경우 그냥 흰색으로 표출하는 것으로.....
  760. if (pVmsObj->TextFontColor != 10)
  761. {
  762. pVmsObj->TextFontColor = isObj ? pAtmpObj->GetPM10_CLR() : clRed;
  763. }
  764. if (bUnit) pVmsObj->TextData = pVmsObj->TextData + sUnit + "㎍/㎥";
  765. }
  766. else
  767. if (pVmsObj->ObjectType == 403)
  768. {
  769. pVmsObj->TextData = isObj ? pAtmpObj->GetPM25_VAL(false) : AnsiString("-");
  770. //TODO 20200528: 구미기존 도형식 하단쪽에 엘이디 고장난게 있어서 흰색으로 표출해야 해서
  771. // 폰트색상이 흰색인 경우 그냥 흰색으로 표출하는 것으로.....
  772. if (pVmsObj->TextFontColor != 10)
  773. {
  774. pVmsObj->TextFontColor = isObj ? pAtmpObj->GetPM25_CLR() : clRed;
  775. }
  776. if (bUnit) pVmsObj->TextData = pVmsObj->TextData + sUnit + "㎍/㎥";
  777. }
  778. else
  779. if (pVmsObj->ObjectType == 404)
  780. {
  781. pVmsObj->TextData = isObj ? pAtmpObj->GetPM10_GRAD() : AnsiString("-");
  782. //TODO 20200528: 구미기존 도형식 하단쪽에 엘이디 고장난게 있어서 흰색으로 표출해야 해서
  783. // 폰트색상이 흰색인 경우 그냥 흰색으로 표출하는 것으로.....
  784. if (pVmsObj->TextFontColor != 10)
  785. {
  786. pVmsObj->TextFontColor = isObj ? pAtmpObj->GetPM10_CLR() : clRed;
  787. }
  788. }
  789. else
  790. if (pVmsObj->ObjectType == 405)
  791. {
  792. pVmsObj->TextData = isObj ? pAtmpObj->GetPM25_GRAD() : AnsiString("-");
  793. //TODO 20200528: 구미기존 도형식 하단쪽에 엘이디 고장난게 있어서 흰색으로 표출해야 해서
  794. // 폰트색상이 흰색인 경우 그냥 흰색으로 표출하는 것으로.....
  795. if (pVmsObj->TextFontColor != 10)
  796. {
  797. pVmsObj->TextFontColor = isObj ? pAtmpObj->GetPM25_CLR() : clRed;
  798. }
  799. }
  800. else
  801. if (pVmsObj->ObjectType == 409)
  802. {
  803. pVmsObj->TextData = isObj ? pAtmpObj->GetATMP_GRAD() : AnsiString("-");
  804. //TODO 20200528: 구미기존 도형식 하단쪽에 엘이디 고장난게 있어서 흰색으로 표출해야 해서
  805. // 폰트색상이 흰색인 경우 그냥 흰색으로 표출하는 것으로.....
  806. if (pVmsObj->TextFontColor != 10)
  807. {
  808. pVmsObj->TextFontColor = isObj ? pAtmpObj->GetATMP_CLR() : clRed;
  809. }
  810. }
  811. else
  812. if (pVmsObj->ObjectType == 410)
  813. {
  814. pVmsObj->TextData = isObj ? pAtmpObj->GetATMP_VAL(false) : AnsiString("-");
  815. //TODO 20200528: 구미기존 도형식 하단쪽에 엘이디 고장난게 있어서 흰색으로 표출해야 해서
  816. // 폰트색상이 흰색인 경우 그냥 흰색으로 표출하는 것으로.....
  817. if (pVmsObj->TextFontColor != 10)
  818. {
  819. pVmsObj->TextFontColor = isObj ? pAtmpObj->GetATMP_CLR() : clRed;
  820. }
  821. }
  822. else
  823. if (pVmsObj->ObjectType == 411)
  824. {
  825. pVmsObj->TextData = isObj ? pAtmpObj->GetO3_VAL(false) : AnsiString("-");
  826. //TODO 20200528: 구미기존 도형식 하단쪽에 엘이디 고장난게 있어서 흰색으로 표출해야 해서
  827. // 폰트색상이 흰색인 경우 그냥 흰색으로 표출하는 것으로.....
  828. if (pVmsObj->TextFontColor != 10)
  829. {
  830. pVmsObj->TextFontColor = isObj ? pAtmpObj->GetO3_CLR() : clRed;
  831. }
  832. if (bUnit) pVmsObj->TextData = pVmsObj->TextData + sUnit + "ppm";
  833. }
  834. else
  835. if (pVmsObj->ObjectType == 412)
  836. {
  837. pVmsObj->TextData = isObj ? pAtmpObj->GetO3_GRAD() : AnsiString("-");
  838. //TODO 20200528: 구미기존 도형식 하단쪽에 엘이디 고장난게 있어서 흰색으로 표출해야 해서
  839. // 폰트색상이 흰색인 경우 그냥 흰색으로 표출하는 것으로.....
  840. if (pVmsObj->TextFontColor != 10)
  841. {
  842. pVmsObj->TextFontColor = isObj ? pAtmpObj->GetO3_CLR() : clRed;
  843. }
  844. }
  845. if (pVmsObj->TextData == "") pVmsObj->TextData = " ";
  846. ChangePosition(pVmsObj);
  847. }
  848. else
  849. if (pVmsObj->ObjectType == 101 || //@주차장명
  850. pVmsObj->ObjectType == 102 || //@주차면수
  851. pVmsObj->ObjectType == 103 || //@주차가능면수
  852. pVmsObj->ObjectType == 104 //@주차혼잡도
  853. )
  854. {
  855. TCDSPark *pPark = NULL;
  856. if (CDSParkManager) {
  857. pPark = CDSParkManager->FLists.Find(pCDSObj->VMS_IFSC_ID);
  858. }
  859. if (pPark)
  860. {
  861. AnsiString sFmt = pCDSObj->VMS_DSPL_TXT;
  862. sFmt = StringReplace(sFmt, "@", "", TReplaceFlags() << rfReplaceAll);
  863. switch(pVmsObj->ObjectType) {
  864. case 101:// || //@주차장명
  865. pVmsObj->TextData = pPark->GetParkName();
  866. break;
  867. case 102:// || //@주차면수
  868. pVmsObj->TextData = pPark->GetTotalCo(sFmt);
  869. //pVmsObj->TextFontColor = pPark->GetGradeColor();
  870. break;
  871. case 103:// || //@주차가능면수
  872. pVmsObj->TextData = pPark->GetRemainCo(sFmt);
  873. pVmsObj->TextFontColor = pPark->GetGradeColor();
  874. if (pPark->FULL) {
  875. }
  876. break;
  877. case 104:// //@주차혼잡도
  878. pVmsObj->TextData = pPark->GetCgsSttus();
  879. pVmsObj->TextFontColor = pPark->GetGradeColor();
  880. break;
  881. }
  882. }
  883. else
  884. {
  885. pVmsObj->TextData = "-";
  886. pVmsObj->TextFontColor = clRed;
  887. }
  888. if (pVmsObj->TextData == "") pVmsObj->TextData = " ";
  889. ChangePosition(pVmsObj);
  890. }
  891. else
  892. if (pVmsObj->ObjectType == 81 || //돌발종류
  893. pVmsObj->ObjectType == 82 || //해당도로
  894. pVmsObj->ObjectType == 83 || //우회도로
  895. pVmsObj->ObjectType == 84 ) //발생장소
  896. {
  897. pVmsObj->TextData = " ";
  898. VMS_EVENT_DETL *pEvt = pSchUnit->EVENT;
  899. if (pEvt)
  900. {
  901. switch(pVmsObj->ObjectType)
  902. {
  903. case 81: pVmsObj->TextData = pEvt->VMS_INCD_DETL_NM; break; //돌발종류
  904. case 82: pVmsObj->TextData = pEvt->VMS_IFSC_NM; break; //해당도로
  905. case 83: pVmsObj->TextData = pEvt->VMS_IFSC_NM; break; //우회도로
  906. case 84: pVmsObj->TextData = pEvt->OCRR_LCTN_NM; break; //발생장소
  907. }
  908. }
  909. if (pVmsObj->TextData == "") pVmsObj->TextData = " ";
  910. ChangePosition(pVmsObj);
  911. }
  912. else
  913. {
  914. //객체가 가변(소통정보 표출) 인 경우 가변문자를 설정하자....
  915. AnsiString VMS_IFSC_ID = "";
  916. switch(pVmsObj->ObjectType)
  917. {
  918. case 11: case 12: case 13: case 14: case 15: case 16: case 18: case 19:
  919. VMS_IFSC_ID = pSchUnit->FRST_VMS_IFSC_ID;
  920. if (pVmsForm->VMS_FORM_TYPE_CD == eFormtp_figure)
  921. {
  922. VMS_IFSC_ID = pSchUnit->VMS_IFSC_ID;
  923. }
  924. else
  925. if (pVmsForm->VMS_FORM_TYPE_CD == enFormKindCongest)// && pVmsObj->ObjectType == 18)
  926. {
  927. VMS_IFSC_ID = pSchUnit->VMS_IFSC_ID;
  928. }
  929. break;
  930. case 161: case 162: case 163: case 164: case 165: case 166: case 168:
  931. VMS_IFSC_ID = pSchUnit->SECD_VMS_IFSC_ID;
  932. break;
  933. case 21: case 22: case 23: case 24: case 25: case 26: case 28:
  934. VMS_IFSC_ID = pSchUnit->SECD_VMS_IFSC_ID;
  935. break;
  936. case 31: case 32: case 33: case 34: case 35: case 36: case 38:
  937. VMS_IFSC_ID = pSchUnit->THIR_VMS_IFSC_ID;
  938. break;
  939. case 41: case 42: case 43: case 44: case 45: case 46: case 48:
  940. VMS_IFSC_ID = pSchUnit->FOUR_VMS_IFSC_ID;
  941. break;
  942. case 91: case 92:
  943. VMS_IFSC_ID = pCDSObj->VMS_IFSC_ID; //축통행시간/축소통상황(고정)
  944. break;
  945. case 93: case 94: case 95: case 96:
  946. VMS_IFSC_ID = pSchUnit->VMS_IFSC_ID;
  947. break;
  948. default: continue;
  949. }
  950. pVmsObj->TextData = " ";
  951. TCDSIfsc *pTmpIfsc = CDSIfscManager->FLists.Find(VMS_IFSC_ID);
  952. if (pTmpIfsc)
  953. {
  954. switch(pVmsObj->ObjectType)
  955. {
  956. case 11: case 21: case 31: case 41: case 161: //구간명
  957. pVmsObj->TextData = pTmpIfsc->ROAD_NM;
  958. break;
  959. case 12: case 22: case 32: case 42: case 93: case 162: //시점명
  960. pVmsObj->TextData = pTmpIfsc->DSPL_STRT_NODE_NM;
  961. break;
  962. case 13: case 23: case 33: case 43: case 94: case 163: //종점명
  963. pVmsObj->TextData = pTmpIfsc->DSPL_END_NODE_NM;
  964. break;
  965. case 14: case 24: case 34: case 44: case 92: case 95: case 164: //소통상황
  966. pVmsObj->TextData = GradeToString(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0), pVmsForm->VMS_FORM_TYPE_CD);
  967. //TODO 20200528: 구미기존 도형식 하단쪽에 엘이디 고장난게 있어서 흰색으로 표출해야 해서
  968. // 폰트색상이 흰색인 경우 그냥 흰색으로 표출하는 것으로.....
  969. if (pVmsObj->TextFontColor != 10)
  970. {
  971. pVmsObj->TextFontColor = GradeToColorCode(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
  972. }
  973. break;
  974. case 19: //소통상황(가변)
  975. {
  976. AnsiString sGradText = GradeToString(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0), pVmsForm->VMS_FORM_TYPE_CD);
  977. if (pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0) == grade_smoothness)
  978. {
  979. sGradText.printf("소통원활 약 %d 분", pTmpIfsc->TRVL_HH);
  980. }
  981. pVmsObj->TextData = sGradText;
  982. pVmsObj->TextFontColor = GradeToColorCode(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
  983. }
  984. break;
  985. case 15: case 25: case 35: case 45: case 91: case 96: case 165: //통행시간
  986. if (pTmpIfsc->TRVL_HH > 0)
  987. {
  988. AnsiString sFmt = pCDSObj->VMS_DSPL_TXT;
  989. sFmt = StringReplace(sFmt, "@", "", TReplaceFlags() << rfReplaceAll);
  990. if (sFmt.Pos("0"))
  991. {
  992. sFmt = StringReplace(sFmt, "0000", "%4d", TReplaceFlags() << rfReplaceAll);
  993. sFmt = StringReplace(sFmt, "000", "%3d", TReplaceFlags() << rfReplaceAll);
  994. sFmt = StringReplace(sFmt, "00", "%2d", TReplaceFlags() << rfReplaceAll);
  995. sFmt = StringReplace(sFmt, "0", "%d", TReplaceFlags() << rfReplaceAll);
  996. pVmsObj->TextData.printf(sFmt.c_str(), pTmpIfsc->TRVL_HH);
  997. }
  998. else
  999. {
  1000. pVmsObj->TextData = AnsiString(pTmpIfsc->TRVL_HH);
  1001. }
  1002. pVmsObj->TextFontColor = GradeToColorCode(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
  1003. }
  1004. else
  1005. {
  1006. pVmsObj->TextData = " ";
  1007. pVmsObj->TextFontColor = clBlack;
  1008. }
  1009. break;
  1010. case 16: case 26: case 36: case 46: case 166: //통행속도
  1011. pVmsObj->TextData = AnsiString(pTmpIfsc->SPED);
  1012. pVmsObj->TextFontColor = GradeToColorCode(pTmpIfsc->CMTR_GRAD_CD.ToIntDef(0));
  1013. break;
  1014. case 17: case 27: case 37: case 47: //방향이미지...???
  1015. break;
  1016. case 18: case 28: case 38: case 48: case 168: //지점명
  1017. pVmsObj->TextData = pTmpIfsc->SPOT_NM;
  1018. break;
  1019. }
  1020. ChangePosition(pVmsObj);
  1021. }
  1022. }
  1023. } //FOR_STL(폼객체생성)
  1024. pVmsForm->UnLock();
  1025. } //for(최대 제공 메시지 갯수만큼 생성)
  1026. }
  1027. __finally
  1028. {
  1029. pObj->pForms->UnLock();
  1030. }
  1031. } //iterator(VMS전체루프)
  1032. MINFO("MAIN MakeVmsProvideForm: End. (VMS: %d EA, Forms %d EA)", nSaveVmsCnt, nSaveFormCnt);
  1033. MINFO("MAIN MakeVmsDatabaseForm: Start");
  1034. nSaveVmsCnt = 0;
  1035. nSaveFormCnt= 0;
  1036. //데이터베이스에 저장할 폼을 생성한다.
  1037. for(it=CDSCtlrManager->FLists.FObjects.begin(); it != CDSCtlrManager->FLists.FObjects.end(); ++it)
  1038. {
  1039. TCDSCtlr *pObj = (TCDSCtlr*)it->second;
  1040. if (!pObj->Used) continue;
  1041. if (!pObj->FProvide) continue;
  1042. if (g_AppCfg.BottomTrafficCenter)
  1043. {
  1044. //도형식폼의 하단소통정보위치를 가운데로 정렬하는 경우
  1045. MakeVmsFigureFormPos(pObj);
  1046. }
  1047. if (g_AppCfg.TextTrafficCenter && pObj->TYPE_CD == "VMP2") //2단 12열 일 경우 정렬
  1048. {
  1049. //1단교통정보의 이정을 가운데로 정렬하는 경우
  1050. MakeVmsTrafficFormPos2(pObj);
  1051. }
  1052. nSaveFormCnt += MakeVmsDatabaseForm(pObj);
  1053. nSaveVmsCnt++;
  1054. }
  1055. g_ToggleFormSeq++;
  1056. if (g_ToggleFormSeq >= 6) g_ToggleFormSeq = 1;
  1057. MINFO("MAIN MakeVmsDatabaseForm: End. (VMS: %d EA, Forms %d EA)", nSaveVmsCnt, nSaveFormCnt);
  1058. return VERR_NONE;
  1059. }
  1060. //---------------------------------------------------------------------------
  1061. int __fastcall MakeVmsFigureFormPos(TCDSCtlr *AObj)
  1062. {
  1063. int ARRAWGAP = 7;
  1064. int TRAFFGAP = 17;
  1065. int nSelCnt = 0;
  1066. if (!AObj) return VERR_MEMORY_ALLOC;
  1067. int nFormCnt = AObj->pForms->Count();
  1068. if (nFormCnt == 0) return nSelCnt;
  1069. int nObjCnt;
  1070. int nFormT;
  1071. TVmsFormObj *pArw;
  1072. TVmsFormObj *pStr;
  1073. TVmsFormObj *pEnd;
  1074. TVmsFormObj *pTrf;
  1075. int nTotW;
  1076. int nLeft;
  1077. AObj->pForms->Lock();
  1078. try
  1079. {
  1080. try
  1081. {
  1082. for (int ii = 0; ii < nFormCnt; ii++)
  1083. {
  1084. TVmsForm *pForm = AObj->pForms->GetItem(ii);
  1085. if (pForm->VMS_FORM_TYPE_CD != eFormtp_figure)
  1086. {
  1087. //도형식배경소통정보 폼이 아닌경우 계산하지 않음
  1088. continue;
  1089. }
  1090. nFormT = pForm->Height - 40; //하단소통정보 객체의 최대높이를 설정, 이것보다 작으면 위치조정 하지 않음
  1091. pArw = NULL;
  1092. pStr = NULL;
  1093. pEnd = NULL;
  1094. pTrf = NULL;
  1095. //소통상황 시점 -> 종점
  1096. //시점 -> 종점 소통상황
  1097. //위의 2가지 유형에 대하여 가운데 정렬
  1098. nObjCnt = pForm->Count();
  1099. for (int jj = 0; jj < nObjCnt; jj++)
  1100. {
  1101. TVmsFormObj *pFormObj = pForm->GetItem(jj);
  1102. if (pFormObj->PosY < nFormT)
  1103. {
  1104. continue;
  1105. }
  1106. switch(pFormObj->ObjectType)
  1107. {
  1108. //////////////////////// 20200515 수정함(S)
  1109. case 1: // 심볼 Y
  1110. case 2: // 이미지 Y
  1111. if (pFormObj->TRFC_FILL_CD == "T")
  1112. {
  1113. pArw = pFormObj;
  1114. }
  1115. break;
  1116. case 17: // @소통정보이미지 N
  1117. pArw = pFormObj;
  1118. break;
  1119. //////////////////////// 20200515 수정함(E)
  1120. case 12: // @시점명 Y
  1121. case 93: // @축시점명(순환) Y
  1122. case 13: // @종점명 Y
  1123. case 94: // @축종점명(순환) Y
  1124. if (pFormObj->ObjectType == 12 || pFormObj->ObjectType == 93)
  1125. {
  1126. pStr = pFormObj;
  1127. }
  1128. else
  1129. {
  1130. pEnd = pFormObj;
  1131. }
  1132. break;
  1133. case 14: // @소통상황 Y
  1134. case 15: // @통행시간 Y
  1135. case 16: // @통행속도 N
  1136. case 95: // @축소통상황(순환) Y
  1137. case 96: // @축통행시간(순환) Y
  1138. pTrf = pFormObj;
  1139. break;
  1140. }
  1141. }
  1142. if (pArw && pStr && pEnd && pTrf)
  1143. {
  1144. if ((pStr->TextWidth +
  1145. pArw->TextWidth +
  1146. pEnd->TextWidth +
  1147. pTrf->TextWidth) > (pForm->Width - ARRAWGAP - ARRAWGAP - TRAFFGAP - 10)
  1148. )
  1149. {
  1150. ARRAWGAP = 3;
  1151. TRAFFGAP = 10;
  1152. }
  1153. nTotW = pStr->TextWidth + ARRAWGAP +
  1154. pArw->TextWidth + ARRAWGAP +
  1155. pEnd->TextWidth + TRAFFGAP +
  1156. pTrf->TextWidth;
  1157. nLeft = (pForm->Width - nTotW) / 2;
  1158. if (pStr->PosX < pTrf->PosX)
  1159. {
  1160. //시점 -> 종점 소통상황
  1161. pStr->PosX = nLeft;
  1162. pArw->PosX = pStr->PosX + pStr->TextWidth + ARRAWGAP;
  1163. pEnd->PosX = pArw->PosX + pArw->TextWidth + ARRAWGAP;
  1164. pTrf->PosX = pEnd->PosX + pEnd->TextWidth + TRAFFGAP;
  1165. }
  1166. else
  1167. {
  1168. //소통상황 시점 -> 종점
  1169. pTrf->PosX = nLeft;
  1170. pStr->PosX = pTrf->PosX + pTrf->TextWidth + TRAFFGAP;
  1171. pArw->PosX = pStr->PosX + pStr->TextWidth + ARRAWGAP;
  1172. pEnd->PosX = pArw->PosX + pArw->TextWidth + ARRAWGAP;
  1173. }
  1174. }
  1175. }
  1176. }
  1177. catch(Exception &e)
  1178. {
  1179. MERROR("MAIN MakeVmsFigureFormPos error: %s, %s", AnsiString(e.ClassName()).c_str(), AnsiString(e.Message).c_str());
  1180. }
  1181. }
  1182. __finally
  1183. {
  1184. AObj->pForms->UnLock();
  1185. }
  1186. return nSelCnt;
  1187. }
  1188. //---------------------------------------------------------------------------
  1189. int __fastcall MakeVmsFigureFormPos2(TCDSCtlr *AObj)
  1190. {
  1191. int nSelCnt = 0;
  1192. if (!AObj) return VERR_MEMORY_ALLOC;
  1193. int nFormCnt = AObj->pForms->Count();
  1194. if (nFormCnt == 0) return nSelCnt;
  1195. int nObjCnt;
  1196. int nFormT;
  1197. int nGapL, nGapR;
  1198. TVmsFormObj *pArw;
  1199. TVmsFormObj *pStr;
  1200. TVmsFormObj *pEnd;
  1201. TVmsFormObj *pTrf;
  1202. int nTotW;
  1203. int nLeft;
  1204. AObj->pForms->Lock();
  1205. try
  1206. {
  1207. try
  1208. {
  1209. for (int ii = 0; ii < nFormCnt; ii++)
  1210. {
  1211. TVmsForm *pForm = AObj->pForms->GetItem(ii);
  1212. if (pForm->VMS_FORM_TYPE_CD != eFormtp_figure)
  1213. {
  1214. //도형식배경소통정보 폼이 아닌경우 계산하지 않음
  1215. continue;
  1216. }
  1217. nFormT = pForm->Height - 40; //하단소통정보 객체의 최대높이를 설정, 이것보다 작으면 위치조정 하지 않음
  1218. pArw = NULL;
  1219. pStr = NULL;
  1220. pEnd = NULL;
  1221. pTrf = NULL;
  1222. //소통상황 시점 -> 종점
  1223. //시점 -> 종점 소통상황
  1224. //위의 2가지 유형에 대하여 가운데 정렬
  1225. nObjCnt = pForm->Count();
  1226. for (int jj = 0; jj < nObjCnt; jj++)
  1227. {
  1228. TVmsFormObj *pFormObj = pForm->GetItem(jj);
  1229. if (pFormObj->PosY < nFormT)
  1230. {
  1231. continue;
  1232. }
  1233. switch(pFormObj->ObjectType)
  1234. {
  1235. //////////////////////// 20200515 수정함(S)
  1236. case 1: // 심볼 Y
  1237. case 2: // 이미지 Y
  1238. if (pFormObj->TRFC_FILL_CD == "T")
  1239. {
  1240. pArw = pFormObj;
  1241. }
  1242. break;
  1243. case 17: // @소통정보이미지 N
  1244. pArw = pFormObj;
  1245. break;
  1246. //////////////////////// 20200515 수정함(E)
  1247. case 12: // @시점명 Y
  1248. case 93: // @축시점명(순환) Y
  1249. case 13: // @종점명 Y
  1250. case 94: // @축종점명(순환) Y
  1251. if (pFormObj->ObjectType == 12 || pFormObj->ObjectType == 93)
  1252. {
  1253. pStr = pFormObj;
  1254. }
  1255. else
  1256. {
  1257. pEnd = pFormObj;
  1258. }
  1259. break;
  1260. case 14: // @소통상황 Y
  1261. case 15: // @통행시간 Y
  1262. case 16: // @통행속도 N
  1263. case 95: // @축소통상황(순환) Y
  1264. case 96: // @축통행시간(순환) Y
  1265. pTrf = pFormObj;
  1266. break;
  1267. }
  1268. }
  1269. if (pArw && pStr && pEnd && pTrf)
  1270. {
  1271. nGapL = pArw->PosX - (pStr->PosX + pStr->TextWidth); // 시점 화살표 사이의 간격
  1272. nGapR = pEnd->PosX - (pArw->PosX + pArw->TextWidth); // 종점 화살표 사이의 간격
  1273. if (pStr->PosX < pTrf->PosX)
  1274. {
  1275. //시점 -> 종점 소통상황
  1276. nTotW = (pTrf->PosX + pTrf->TextWidth) - pStr->PosX; // 전체길이
  1277. nLeft = (pForm->Width - nTotW) / 2;
  1278. pStr->PosX = nLeft;
  1279. pArw->PosX = pStr->PosX + pStr->TextWidth + nGapL;
  1280. pEnd->PosX = pArw->PosX + pArw->TextWidth + nGapR;
  1281. pTrf->PosX = (nLeft + nTotW) - pTrf->TextWidth;
  1282. }
  1283. else
  1284. {
  1285. //소통상황 시점 -> 종점
  1286. nTotW = (pEnd->PosX + pEnd->TextWidth) - pTrf->PosX; // 전체길이
  1287. nLeft = (pForm->Width - nTotW) / 2;
  1288. pTrf->PosX = nLeft;
  1289. pEnd->PosX = (nLeft + nTotW) - pEnd->TextWidth;
  1290. pArw->PosX = pEnd->PosX + pArw->TextWidth - nGapR;
  1291. pStr->PosX = pArw->PosX - pStr->TextWidth - nGapL;
  1292. }
  1293. }
  1294. }
  1295. }
  1296. catch(Exception &e)
  1297. {
  1298. MERROR("MAIN MakeVmsFigureFormPos2 error: %s, %s", AnsiString(e.ClassName()).c_str(), AnsiString(e.Message).c_str());
  1299. }
  1300. }
  1301. __finally
  1302. {
  1303. AObj->pForms->UnLock();
  1304. }
  1305. return nSelCnt;
  1306. }
  1307. //---------------------------------------------------------------------------
  1308. int __fastcall MakeVmsTrafficFormPos(TCDSCtlr *AObj)
  1309. {
  1310. int ARRAWGAP = 5;
  1311. int nSelCnt = 0;
  1312. if (!AObj) return VERR_MEMORY_ALLOC;
  1313. int nFormCnt = AObj->pForms->Count();
  1314. if (nFormCnt == 0) return nSelCnt;
  1315. int nObjCnt;
  1316. int nFormT;
  1317. TVmsFormObj *pArw;
  1318. TVmsFormObj *pStr;
  1319. TVmsFormObj *pEnd;
  1320. int nTotW;
  1321. int nLeft;
  1322. AObj->pForms->Lock();
  1323. try
  1324. {
  1325. try
  1326. {
  1327. for (int ii = 0; ii < nFormCnt; ii++)
  1328. {
  1329. TVmsForm *pForm = AObj->pForms->GetItem(ii);
  1330. if (pForm->VMS_FORM_TYPE_CD != eFormTp_traf_1)
  1331. {
  1332. //소통상황(1단) 폼이 아닌경우 계산하지 않음
  1333. continue;
  1334. }
  1335. pArw = NULL;
  1336. pStr = NULL;
  1337. pEnd = NULL;
  1338. // 시점(12) -> 종점(13)
  1339. nObjCnt = pForm->Count();
  1340. for (int jj = 0; jj < nObjCnt; jj++)
  1341. {
  1342. TVmsFormObj *pFormObj = pForm->GetItem(jj);
  1343. switch(pFormObj->ObjectType)
  1344. {
  1345. case 12: // @시점명 Y
  1346. pStr = pFormObj;
  1347. break;
  1348. case 13: // @종점명 Y
  1349. pEnd = pFormObj;
  1350. break;
  1351. }
  1352. }
  1353. for (int jj = 0; jj < nObjCnt; jj++)
  1354. {
  1355. TVmsFormObj *pFormObj = pForm->GetItem(jj);
  1356. switch(pFormObj->ObjectType)
  1357. {
  1358. case 1: // @심볼 Y
  1359. case 2: // @이미지 Y
  1360. case 17: // @소통정보이미지 Y
  1361. //if (pFormObj->TRFC_FILL_CD == "T")
  1362. if (pStr && pFormObj->PosY <= (pStr->PosY+pStr->Height) )
  1363. {
  1364. pArw = pFormObj;
  1365. }
  1366. break;
  1367. }
  1368. }
  1369. if (pArw && pStr && pEnd)
  1370. {
  1371. int nRange = pStr->PosY + pStr->Height;
  1372. if (pArw->PosY <= nRange && pEnd->PosY <= nRange)
  1373. {
  1374. nLeft = 0;
  1375. nTotW = pStr->TextWidth + ARRAWGAP +
  1376. pArw->TextWidth + ARRAWGAP +
  1377. pEnd->TextWidth;
  1378. if (nTotW < pForm->Width)
  1379. {
  1380. nLeft = (pForm->Width - nTotW) / 2;
  1381. }
  1382. nLeft = (pForm->Width - nTotW) / 2;
  1383. pStr->PosX = nLeft;
  1384. pArw->PosX = pStr->PosX + pStr->TextWidth + ARRAWGAP;
  1385. pEnd->PosX = pArw->PosX + pArw->TextWidth + ARRAWGAP;
  1386. }
  1387. }
  1388. }
  1389. }
  1390. catch(Exception &e)
  1391. {
  1392. MERROR("MAIN MakeVmsTrafficFormPos error: %s, %s", AnsiString(e.ClassName()).c_str(), AnsiString(e.Message).c_str());
  1393. }
  1394. }
  1395. __finally
  1396. {
  1397. AObj->pForms->UnLock();
  1398. }
  1399. return nSelCnt;
  1400. }
  1401. //---------------------------------------------------------------------------
  1402. int __fastcall MakeVmsTrafficFormPos2(TCDSCtlr *AObj)
  1403. {
  1404. // 시점 화살표 종점 의 좌표는 폼생성할때 정의된데로 하고
  1405. // 시점 화살표 종점의 전체 길이를 폼의 넓이로 환산하여 가운데 정렬
  1406. // 시점(오른쪽정렬) 화살표(의미없고) 종점(왼쪽정렬) 로 폼설정에서 설정하도록 한다.
  1407. // 시점/화살표/종점의 Y축 좌표도 설정한 데로 표출한다.
  1408. // 시점/화살표/종점을 폼의 가운데에 정렬하는 것이다.
  1409. int nSelCnt = 0;
  1410. if (!AObj) return VERR_MEMORY_ALLOC;
  1411. int nFormCnt = AObj->pForms->Count();
  1412. if (nFormCnt == 0) return nSelCnt;
  1413. int nObjCnt;
  1414. int nGapL;
  1415. TVmsFormObj *pArw;
  1416. TVmsFormObj *pStr;
  1417. TVmsFormObj *pEnd;
  1418. int nTotW;
  1419. int nLeft;
  1420. AObj->pForms->Lock();
  1421. try
  1422. {
  1423. try
  1424. {
  1425. for (int ii = 0; ii < nFormCnt; ii++)
  1426. {
  1427. TVmsForm *pForm = AObj->pForms->GetItem(ii);
  1428. if (pForm->VMS_FORM_TYPE_CD != eFormTp_traf_1)
  1429. {
  1430. //소통상황(1단) 폼이 아닌경우 계산하지 않음
  1431. continue;
  1432. }
  1433. pArw = NULL;
  1434. pStr = NULL;
  1435. pEnd = NULL;
  1436. // 시점(12) -> 종점(13)
  1437. nObjCnt = pForm->Count();
  1438. for (int jj = 0; jj < nObjCnt; jj++)
  1439. {
  1440. TVmsFormObj *pFormObj = pForm->GetItem(jj);
  1441. switch(pFormObj->ObjectType)
  1442. {
  1443. case 12: // @시점명 Y
  1444. pStr = pFormObj;
  1445. break;
  1446. case 13: // @종점명 Y
  1447. pEnd = pFormObj;
  1448. break;
  1449. }
  1450. }
  1451. for (int jj = 0; jj < nObjCnt; jj++)
  1452. {
  1453. TVmsFormObj *pFormObj = pForm->GetItem(jj);
  1454. switch(pFormObj->ObjectType)
  1455. {
  1456. case 1: // @심볼 Y
  1457. case 2: // @이미지 Y
  1458. case 17: // @소통정보이미지 Y
  1459. //if (pFormObj->TRFC_FILL_CD == "T")
  1460. if (pStr && pFormObj->PosY <= (pStr->PosY+pStr->Height) )
  1461. {
  1462. pArw = pFormObj;
  1463. }
  1464. break;
  1465. }
  1466. }
  1467. if (pArw && pStr && pEnd)
  1468. {
  1469. //시점 화살표 종점 순으로 되어 있어야 한다.
  1470. int nRange = pStr->PosY + pStr->Height;
  1471. if (pArw->PosY <= nRange && pEnd->PosY <= nRange)
  1472. {
  1473. nGapL = pArw->PosX - (pStr->PosX + pStr->TextWidth); // 시점 화살표 사이의 간격
  1474. nTotW = (pEnd->PosX + pEnd->TextWidth) - pStr->PosX; // 전체길이
  1475. nLeft = (pForm->Width - nTotW) / 2;
  1476. pStr->PosX = nLeft;
  1477. pArw->PosX = pStr->PosX + pStr->TextWidth + nGapL;
  1478. pEnd->PosX = (nLeft + nTotW) - pEnd->TextWidth;
  1479. }
  1480. }
  1481. }
  1482. }
  1483. catch(Exception &e)
  1484. {
  1485. MERROR("MAIN MakeVmsFigureFormPos2 error: %s, %s", AnsiString(e.ClassName()).c_str(), AnsiString(e.Message).c_str());
  1486. }
  1487. }
  1488. __finally
  1489. {
  1490. AObj->pForms->UnLock();
  1491. }
  1492. return nSelCnt;
  1493. }
  1494. //---------------------------------------------------------------------------
  1495. int __fastcall MakeVmsDatabaseForm(TCDSCtlr *AObj)
  1496. {
  1497. int nSelCnt = 0;
  1498. if (!AObj) return VERR_MEMORY_ALLOC;
  1499. int nFormCnt = AObj->pForms->Count();
  1500. if (nFormCnt == 0) return nSelCnt;
  1501. AObj->pForms->Lock();
  1502. try
  1503. {
  1504. try
  1505. {
  1506. for (int ii = 0; ii < nFormCnt; ii++)
  1507. {
  1508. TVmsForm *pForm = AObj->pForms->GetItem(ii);
  1509. int nObjCnt;
  1510. pForm->pBitmap->Canvas->Lock();
  1511. pForm->pBitmap->PixelFormat = g_AppCfg.PixelFormat;//pf24bit;//pf32bit;//pf24bit;//pf4bit; //TODO
  1512. //TODO
  1513. SetStretchBltMode(pForm->pBitmap->Canvas->Handle, HALFTONE);
  1514. try
  1515. {
  1516. pForm->FormClear(CodeToFormColor(pForm->VMS_FORM_COLR_CD));
  1517. nObjCnt = pForm->Count();
  1518. TRect rc;
  1519. TRect DstRect;
  1520. TRect SrcRect;
  1521. for (int jj = 0; jj < nObjCnt; jj++)
  1522. {
  1523. TVmsFormObj *pFormObj = pForm->GetItem(jj);
  1524. switch(pFormObj->ObjectType)
  1525. {
  1526. case 1: //심볼
  1527. case 2: //이미지
  1528. case 3: //소통정보배경이미지
  1529. case 17: //소통정보이미지1
  1530. case 27: //소통정보이미지2
  1531. case 37: //소통정보이미지3
  1532. case 47: //소통정보이미지4
  1533. case 167: //@우회소통정보이미지
  1534. case 200: //동영상이미지
  1535. case 300: //스트리밍영상이미지
  1536. case 406: //@통합대기등급 이미지
  1537. case 407: //@미세먼지등급 이미지
  1538. case 408: //@초미세먼지등급 이미지
  1539. case 413: //@오존등급이미지
  1540. #if 0
  1541. if (pFormObj->ObjectType == 17 ||
  1542. pFormObj->ObjectType == 27 ||
  1543. pFormObj->ObjectType == 37 ||
  1544. pFormObj->ObjectType == 47 ||
  1545. pFormObj->ObjectType == 167
  1546. )
  1547. {
  1548. rc.Top = pFormObj->PosY;
  1549. rc.Bottom = pFormObj->PosY + pFormObj->pImageData->Picture->Graphic->Height;
  1550. rc.Left = pFormObj->PosX;
  1551. rc.Right = pFormObj->PosX + pFormObj->pImageData->Picture->Graphic->Width;
  1552. pForm->pBitmap->Canvas->StretchDraw(rc, pFormObj->pImageData->Picture->Graphic);
  1553. }
  1554. else
  1555. {
  1556. pForm->pBitmap->Canvas->Draw(pFormObj->PosX, pFormObj->PosY, pFormObj->pImageData->Picture->Graphic);
  1557. }
  1558. #else
  1559. #if 0
  1560. pForm->pBitmap->Canvas->CopyMode = cmSrcCopy;
  1561. DstRect = Rect(pFormObj->PosX, //left, top, right, bottom
  1562. pFormObj->PosY,
  1563. pFormObj->PosX + pFormObj->Width,
  1564. pFormObj->PosY + pFormObj->Height);
  1565. SrcRect = Rect(0, 0, pFormObj->pImageData->Picture->Graphic->Width, pFormObj->pImageData->Picture->Graphic->Height);
  1566. pForm->pBitmap->Canvas->CopyRect(DstRect, pFormObj->pImageData->Picture->Bitmap->Canvas, SrcRect);
  1567. #else
  1568. rc = Rect(pFormObj->PosX, //left, top, right, bottom
  1569. pFormObj->PosY,
  1570. pFormObj->PosX + pFormObj->Width,
  1571. pFormObj->PosY + pFormObj->Height);
  1572. //rc.Top = pFormObj->PosY;
  1573. //rc.Bottom = pFormObj->PosY + pFormObj->Height;
  1574. //rc.Left = pFormObj->PosX;
  1575. //rc.Right = pFormObj->PosX + pFormObj->Width;
  1576. pForm->pBitmap->Canvas->StretchDraw(rc, pFormObj->pImageData->Picture->Bitmap);//Graphic);
  1577. #endif
  1578. #endif
  1579. break;
  1580. default://기타 문자열
  1581. pForm->pBitmap->Canvas->Brush->Color = CodeToBackColor(pFormObj->BkColor);
  1582. #if 0
  1583. //이력저장할때 폰트색상을 코드로 넣기 때문에 색상값을 직접사용할 수 없다.
  1584. switch(pFormObj->ObjectType)
  1585. {
  1586. //case 401: //@관측장소 ==> 관측장소 폰트 색상은 운영자가 입력한 색상을 그대로 사용한다.
  1587. case 402: //@PM10
  1588. case 403: //@PM2.5
  1589. case 404: //@PM10등급
  1590. case 405: //@PM2.5등급
  1591. case 409: //@통합대기등급
  1592. case 410: //@통합대기
  1593. case 411: //@오존
  1594. case 412: //@오존등급
  1595. pForm->pBitmap->Canvas->Font->Color = (TColor)(pFormObj->TextFontColor);
  1596. break;
  1597. default:
  1598. pForm->pBitmap->Canvas->Font->Color = CodeToFontColor(pFormObj->TextFontColor);
  1599. break;
  1600. }
  1601. #else
  1602. pForm->pBitmap->Canvas->Font->Color = CodeToFontColor(pFormObj->TextFontColor);
  1603. #endif
  1604. pForm->pBitmap->Canvas->Font->Name = CodeToFontName(pFormObj->TextFontName);
  1605. pForm->pBitmap->Canvas->Font->Size = pFormObj->TextFontSize;
  1606. if (pFormObj->TextFontBold)
  1607. pForm->pBitmap->Canvas->Font->Style = TFontStyles() << fsBold;
  1608. else
  1609. pForm->pBitmap->Canvas->Font->Style = TFontStyles();
  1610. pForm->pBitmap->Canvas->TextOutA(pFormObj->PosX, pFormObj->PosY, pFormObj->TextData);
  1611. break;
  1612. }
  1613. } // 폼의 객체수 만큼 객체를 폼에 그린다.
  1614. try
  1615. {
  1616. pForm->pStream->Clear();
  1617. pForm->pStream->Position = 0;
  1618. //if (AObj->PROTOCOL_VER == 1) //TEXT VMS
  1619. pForm->pBitmap->PixelFormat = g_AppCfg.PixelFormat;//pf24bit;//pf24bit;//pf4bit; //TODO
  1620. //else
  1621. // pForm->pBitmap->PixelFormat = g_AppCfg.PixelFormat;//pf16bit;//pf24bit;//pf4bit; //TODO
  1622. pForm->pBitmap->SaveToStream(pForm->pStream);
  1623. //SaveToStreamJpg(pForm->pBitmap, pForm->pStream);
  1624. //FTP다운로드 하는 경우 폼을 FTP디렉토리에 저장해야함
  1625. #if 0
  1626. if (pForm->VMS_SCH_FORM_TYPE != eSchTp_hongbo && //홍보(제어기별 폼생성시 CDSForm의 파일명으로 설정되어 있음
  1627. pForm->VMS_SCH_FORM_TYPE != eSchTp_video && //비디오
  1628. pForm->VMS_SCH_FORM_TYPE != eSchTp_stream ) //스트리밍영상 등은 로컬파일로 저장할 필요가 없음
  1629. #else
  1630. if (pForm->VMS_SCH_FORM_TYPE != eSchTp_video && //비디오
  1631. pForm->VMS_SCH_FORM_TYPE != eSchTp_stream ) //스트리밍영상 등은 로컬파일로 저장할 필요가 없음
  1632. #endif
  1633. { //파일이름을 여기서 변경하면 ftp 파일명이 변경된다.
  1634. if (AObj->FIsFtpDownload)
  1635. {
  1636. AnsiString sFormName;
  1637. if (g_AppCfg.IsImageSeqSave)
  1638. {
  1639. //시퀀스_운영모드-순서_폼유형-폼번호.bmp
  1640. sFormName.printf("%d_%c%02d_%X%s.bmp", g_ToggleFormSeq, AObj->CTRLMODE->Control, ii+1, (BYTE)pForm->VMS_SCH_FORM_TYPE, pForm->VMS_FORM_ID.c_str());
  1641. }
  1642. else
  1643. {
  1644. //운영모드-순서_폼유형-폼번호.bmp
  1645. sFormName.printf("%c%02d_%X%s.bmp", AObj->CTRLMODE->Control, ii+1, (BYTE)pForm->VMS_SCH_FORM_TYPE, pForm->VMS_FORM_ID.c_str());
  1646. }
  1647. //sFormName.printf("%s_%d%02d.bmp", AObj->CTLR_NMBR.c_str(), g_ToggleFormSeq, ii+1);
  1648. pForm->LocalFileName = AObj->FLocalFormDir + sFormName;
  1649. pForm->FtpFileName = AObj->FFtpFormDir + sFormName;
  1650. //pForm->pStream->SaveToFile(pForm->LocalFileName+".jpg");
  1651. if (FileExists(pForm->LocalFileName))
  1652. {
  1653. try {
  1654. DeleteFile(pForm->LocalFileName);
  1655. } catch(Exception &e)
  1656. {
  1657. MERROR("MAIN MakeVmsDatabaseForm DeleteFile Failed: %s, %d, %s, %s", AObj->CTLR_NMBR.c_str(), ii, AnsiString(e.ClassName()).c_str(), AnsiString(e.Message).c_str());
  1658. }
  1659. }
  1660. try
  1661. {
  1662. pForm->pBitmap->SaveToFile(pForm->LocalFileName);
  1663. }
  1664. catch(Exception &e)
  1665. {
  1666. pForm->Success = false;
  1667. MERROR("MAIN MakeVmsDatabaseForm SaveFile Failed: %s, %d, %s, %s", AObj->CTLR_NMBR.c_str(), ii, AnsiString(e.ClassName()).c_str(), AnsiString(e.Message).c_str());
  1668. }
  1669. }
  1670. }
  1671. pForm->Success = true;
  1672. switch (pForm->VMS_SCH_FORM_TYPE)
  1673. {
  1674. case eSchTp_traffic: // = 0, //0:교통,
  1675. case eSchTp_incident: // = 1, //1:돌발,
  1676. case eSchTp_gongsa: // = 2, //2:공사행사,
  1677. case eSchTp_deture: // = 4, //4:우회,
  1678. case eSchTp_congest: // = 5, //5:정체,
  1679. pForm->fileType = P_FILE_TYPE_TRAFFIC;
  1680. break;
  1681. case eSchTp_hongbo: // = 3, //3:홍보,
  1682. case eSchTp_safe: // = 6, //6:안전,
  1683. case eSchTp_atmp: // = 9, //9:대기환경
  1684. case eSchTp_park: // = 10, //10:주차정보
  1685. pForm->fileType = P_FILE_TYPE_TEXT;
  1686. break;
  1687. case eSchTp_video: // = 7, //7:동영상,
  1688. pForm->fileType = P_FILE_TYPE_VIDEO;
  1689. pForm->FtpFileName = AnsiString(FTP_VIDEO) + "\\" + pForm->STRM_ADDR;
  1690. //폼디렉토리에 동영상파일을 복사해서 처리하도록 수정해야지..........
  1691. break;
  1692. case eSchTp_stream: // = 8, //8:스트리밍영상
  1693. pForm->fileType = P_FILE_TYPE_STREAM;
  1694. pForm->FtpFileName = pForm->STRM_ADDR;
  1695. break;
  1696. default:
  1697. pForm->Success = false;
  1698. break;
  1699. }
  1700. 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());
  1701. nSelCnt++;
  1702. }
  1703. catch(Exception &e)
  1704. {
  1705. MERROR("MAIN MakeVmsDatabaseForm error1: %s, %s", AnsiString(e.ClassName()).c_str(), AnsiString(e.Message).c_str());
  1706. pForm->LocalFileName = "";
  1707. pForm->FtpFileName = "";
  1708. }
  1709. }
  1710. __finally
  1711. {
  1712. pForm->pBitmap->Canvas->Unlock();
  1713. }
  1714. }
  1715. }
  1716. catch(Exception &e)
  1717. {
  1718. MERROR("MAIN MakeVmsDatabaseForm error2: %s, %s", AnsiString(e.ClassName()).c_str(), AnsiString(e.Message).c_str());
  1719. }
  1720. }
  1721. __finally
  1722. {
  1723. AObj->pForms->UnLock();
  1724. }
  1725. return nSelCnt;
  1726. }
  1727. //---------------------------------------------------------------------------