FrmMainCommF.cpp 62 KB

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