MainCommF.cpp 80 KB

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