MainCommF.cpp 93 KB

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