어쨋든, 초기 HPGL은 텍스트 기반으로 알파벳 두 글자의 명령어와 인자로 구성되고 세미콜론(;)으로 구분하는 단순한 포맷입니다. (참고 : https://en.wikipedia.org/wiki/HPGL) 이후 버전2로 개선되고 바이너리 포맷도 지원하게 된것으로 보입니다.
Command | Meaning |
---|---|
IN; | initialize, start a plotting job |
IP; | set the initial point (origin), in this case the default 0,0 |
SC0,40,0,40; | allows scaling in millimeters since 1 mm = 40 plotter units. Each user-unit is 1 millimeter, in both X and Y directions |
SP1; | select pen 1 |
PU0,0; | lift Pen Up and move to starting point for next action |
PD100,0,100,100,0,100,0,0; | put Pen Down and move to the following locations (draw a box around the page) |
PU50,50; | Pen Up and move to X,Y coordinates 50,50 (in this case mm, after the SC command) |
CI25; | draw a circle with radius 25 (mm) |
SS; | select the standard font |
DT*,1; | set the text delimiter to the asterisk, and do not print them (the 1, meaning "true") |
PU20,80; | lift the pen and move to 20,80 |
LBHello World*; | draw a label |
LTlinetype,length | set line type and its repetition length |
CSxx | set character set (e.g. 33 is German) |
DIx,y | set direction of text given as the catheti |
SIww,hh |
캐드상의 복잡한 가공 형상이 있고 이 데이타를 X,Y 등의 단순 데이타를 추출하여 여러 기계장치에서 사용하기에는 단순한 HPGL 포맷만한 것도 없습니다.
이를 위해서는 우선 캐드상에서 PLOT" 명령어를 사용하여 좌표정보를 외부 plt 파일로 생성해야 합니다. 대략 다음과 같은 내용의 PLT 텍스트 파일을 만들수 있습니다.
IN;SC;PU;RO0;IP;IW;VS15;VS15;VS15;VS15;VS15;VS15;SP1;PU;PA0,0;SP1;LT;PA3560,5155;PDPA3569,5155;PUPA3655,5246;PDPA4110,5701;PUPA4197,5792;PDPA4206,5792;PUPA3423,4654;PDPA3432,4654;PUPA3518,4745;PDPA3973,5200;PUPA4060,5291;PDPA4069,5291;PUPA4155,5382;PDPA4610,5837;PUPA4697,5928;PDPA4706,5928;PUPA4792,6019;PDPA4794,6021;PUPA3382,4245;PDPA3837,4700;PUPA3924,4791;PDPA3933,4791;PUPA4019,4882;PDPA4474,5337;PUPA4561,5428;PDPA4570,5428;PUPA4656,5519;PDPA5110,5974;PUPA3348,3847;PDPA3700,4199;PUPA3787,4290;PDPA3796,4290;PUPA3882,4381;PDPA4337,4836;PUPA4424,4927;PDPA4433,4927;PUPA4519,5018;PDPA4974,5473;PUPA5061,5564;PDPA5070,5564;PUPA5156,5655;PDPA5516,6015;PUPA3430,3566;PDPA3564,3699;PUPA3651,3790;PDPA3660,3790;PUPA3746,3881;PDPA4201,4336;PUPA4288,4427;PDPA4297,4427;PUPA4383,4518;PDPA4837,4973;PUPA4924,5064;PDPA4933,5064;PUPA5019,5155;PDPA5474,5610;PUPA5561,5701;PDPA5570,5701;PUPA5656,5792;PDPA5797,5932;PUPA3609,3381;PDPA4064,3836;PUPA4151,3927;PDPA4160,3927;PUPA4246,4018;PDPA4701,4472;PUPA4788,4563;PDPA4797,4563;PUPA4883,4654;PDPA5338,5109;PUPA5425,5200;PDPA5434,5200;PUPA5520,5291;PDPA5975,5746;PUPA3693,3100;PDPA3928,3335;PUPA4015,3426;PDPA4024,3426;PUPA4110,3517;PDPA4565,3972;PUPA4652,4063;PDPA4661,4063;PUPA4747,4154;PDPA5201,4609;PUPA5288,4700;PDPA5297,4700;PUPA5383,4791;PDPA5838,5246;PUPA5925,5337;PDPA5934,5337;PUPA6020,5428;PDPA6262,5670;PUPA3878,2926;PDPA3887,2926;PUPA3973,3017;PDPA4428,3472;PUPA4515,3563;PDPA4524,3563;PUPA4610,3654;PDPA5065,4109;PUPA5152,4199;PDPA5161,4199;PUPA5247,4290;PDPA5702,4745;PUPA5789,4836;PDPA5798,4836;PUPA5884,4927;PDPA6339,5382;PUPA6426,5473;PDPA6435,5473;PUPA4062,2742;PDPA4292,2971;PUPA4379,3062;PDPA4388,3062;PUPA4474,3153;PDPA4928,3608;PUPA5015,3699;PDPA5024,3699;PUPA5110,3790;PDPA5565,4245;PUPA5652,4336;PDPA5661,4336;PUPA5747,4427;PDPA6202,4882;PUPA6289,4973;PDPA6298,4973;PUPA6384,5064;PDPA6620,5300;PUPA4337,2653;PDPA4792,3108;PUPA4879,3199;PDPA4888,3199;PUPA4974,3290;PDPA5429,3745;PUPA5516,3836;PDPA5525,3836;PUPA5611,3927;PDPA6066,4381;PUPA6153,4472;PDPA6162,4472;PUPA6248,4563;PDPA6703,5018;PUPA4540,2492;PDPA4656,2607;PUPA4743,2698;PDPA4752,2698;PUPA4837,2789;PDPA5292,3244;PUPA5379,3335;PDPA5388,3335;PUPA5474,3426;PDPA5929,3881;PUPA6016,3972;PDPA6025,3972;PUPA6111,4063;PDPA6566,4518;PUPA6653,4609;PDPA6662,4609;PUPA6748,4700;PDPA6870,4822;PUPA4830,2418;PDPA5156,2744;PUPA5243,2835;PDPA5252,2835;PUPA5338,2926;PDPA5793,3381;PUPA5880,3472;PDPA5889,3472;PUPA5975,3563;PDPA6430,4018;PUPA6517,4109;PDPA6526,4109;PUPA6612,4199;PDPA6945,4533;PUPA5201,2425;PDPA5656,2880;PUPA5743,2971;PDPA5752,2971;PUPA5838,3062;PDPA6293,3517;PUPA6380,3608;PDPA6389,3608;PUPA6475,3699;PDPA6930,4154;PUPA5607,2471;PDPA5616,2471;PUPA5702,2562;PDPA6157,3017;PUPA6244,3108;PDPA6253,3108;PUPA6339,3199;PDPA6793,3654;PUPA6880,3745;PDPA6889,3745;PUPA6368,2864;PDPA6498,2994;PUPA6971,4223;PDPA6969,4307,6963,4392,6954,4476,6940,4559,6922,4642,6901,4724,6876,4805,6847,4884,6815,4962,6779,5039,6740,5114,6697,5187,6651,5257,6601,5326,6549,5392,6493,5456,6435,5517,6374,5576,6310,5631,6243,5684,6175,5733,6104,5780,6031,5822,5956,5862,5880,5898,5801,5930,5722,5959,5641,5984,5559,6005,5476,6023,5393,6036,5309,6046,5224,6052,5140,6054,5055,6052,4971,6046,4887,6036,4803,6023,4721,6005,4639,5984,4558,5959,4478,5930,4400,5898,4324,5862,4249,5822,4176,5780,4105,5733,4036,5684,3970,5631,3906,5576,3845,5517,3787,5456,3731,5392,3679,5326,3629,5257,3583,5187,3540,5114,3501,5039,3465,4962,3432,4884,3404,4805,3379,4724,3357,4642,3340,4559,3326,4476,3316,4392,3311,4307,3309,4223,3311,4138,3316,4054,3326,3970,3340,3886,3357,3803,3379,3721,3404,3641,3432,3561,3465,3483,3501,3406,3540,3331,3583,3259,3629,3188,3679,3119,3731,3053,3787,2989,3845,2928,3906,2869,3970,2814,4036,2761,4105,2712,4176,2666,4249,2623,4324,2583,4400,2547,4478,2515,4558,2486,4639,2461,4721,2440,4803,2423,4887,2409,4971,2399,5055,2393,5140,2391,5224,2393,5309,2399,5393,2409,5476,2423,5559,2440,5641,2461,5722,2486,5801,2515,5880,2547,5956,2583,6031,2623,6104,2666,6175,2712,6243,2761,6310,2814,6374,2869,6435,2928,6493,2989,6549,3053,6601,3119,6651,3188,6697,3259,6740,3331,6779,3406,6815,3483,6847,3561,6876,3641,6901,3721,6922,3803,6940,3886,6954,3970,6963,4054,6969,4138,6971,4223;PU;PA0,0;SP;
이 파일을 파싱하여 사용한다면 레이저나 CNC 장비등의 가공기계에서 다방면으로 활용가능합니다. 파서를 직접 구현하기 귀찮으신분들은 오픈소스를 사용하면 쉽게 제작이이 될겁니다. (오픈소스 링크 : http://www.opensource.apple.com/source/cups/cups-97.1/filter/ )
여기에 나오는 오픈소스는 CUPS 란 프로젝트의 일부이며, CUPS 에 대해서는 위키를 참고 (https://ko.wikipedia.org/wiki/CUPS)해 보시기 바랍니다.
CUPS(영어: Common Unix Printing System, 공식 명칭으로 CUPS가 더 자주 쓰임)는 컴퓨터를 인쇄 서버로 기능하도록 해주는 유닉스 계열 운영 체제를 위한 모듈 방식의 프린팅 시스템이다. CUPS는 유닉스 계열의 운영 체제에서 프린터 형식과 형태마다 독자적으로 써야 했던 장치 드라이버의 작성을 용이하게 해 주었는데, 과거 유닉스 계열 운영 체제가 지원하던 특수 라인 프린터와 포스트 스크립트 프린터 뿐만 아니라, 매킨토시, 윈도용으로 시판되는 프린터의 대부분을 유닉스 계열 운영 체제에서 사용할 수 있게 하였다.
CUPS를 사용하는 컴퓨터는 클라이언트 컴퓨터에서 인쇄 작업을 수신하는 서버가 되어, 해당 작업을 처리하고 적절한 프린터로 자료를 보낸다. 또한 그 때에는 HTTP의 Basic 인증 및 Digest 인증, 로컬 인증, 128비트 TLS/SSL 암호화 등을 이용할 수도 있다.
CUPS는 유닉스 인쇄 스풀러와 스케줄러 필터 시스템 및 백엔드 시스템으로 구성된다. 이 중 필터 시스템은 인쇄 데이터를 프린터가 인식할 수 있는 형식으로 변환하고, 백엔드 시스템이 이 데이터를 프린터로 보내는 역할을 수행한다. CUPS는 인쇄 작업과 대기열을 취급하는 기반으로 IPP (Internet Printing Protocol)을 이용하고 있다. 또한, CUPS는 유닉스에서 기존에 지원하던 System V 형식과 BSD 형식의 커멘드라인 인터페이스도 지원하고 SMB 프로토콜도 부분적으로 지원한다. CUPS가 제공하는 장치 드라이버는 어도비의 PPD (PostScript Printer Description) 형식의 텍스트 파일을 이용하여 설정이 가능하다. CUPS를 설정하는 CUPS 스스로는 웹(HTTP)을 이용한 임베디드 인터페이스를 지원하고 있다.
필요한 파일들은 hpgl- main, attr, char, config, input, polygon, prolog, tops, vector 들로 이 파일들을 추려내어서 컴파일해 보시고 쉽게 몇몇 참조 에러를 해결하시면 되겠습니다.
이를 사용하여 plt 파일을 분석해 보면 대략 다음과 같이 파싱되는것을 보실수 있습니다.
파싱되는 순서를 파악해 보면 맨 처음 페이지에 대한 변환행렬을 설정하고, IN (초기화)되고, SC(펜 선택), PU(펜 Up), RO(Rotate), IP(초기위치 설정) 등 HPGL 포맷을 분석하는 모습을 볼 수 있습니다. 해당 오픈소스에서 지원하는 HPGL 명령어들 목록은 다음과 같습니다.
{ "BP", BP_begin_plot },
{ "DF", DF_default_values },
{ "IN", IN_initialize },
{ "IP", IP_input_absolute },
{ "IR", IR_input_relative },
{ "IW", IW_input_window },
{ "PG", PG_advance_page },
{ "RO", RO_rotate },
{ "RP", RP_replot },
{ "SC", SC_scale },
{ "AA", AA_arc_absolute },
{ "AR", AR_arc_relative },
{ "AT", AT_arc_absolute3 },
{ "CI", CI_circle },
{ "PA", PA_plot_absolute },
{ "PD", PD_pen_down },
{ "PE", PE_polyline_encoded },
{ "PR", PR_plot_relative },
{ "PS", PS_plot_size },
{ "PU", PU_pen_up },
{ "RT", RT_arc_relative3 },
{ "EA", EA_edge_rect_absolute },
{ "EP", EP_edge_polygon },
{ "ER", ER_edge_rect_relative },
{ "EW", EW_edge_wedge },
{ "FP", FP_fill_polygon },
{ "PM", PM_polygon_mode },
{ "RA", RA_fill_rect_absolute },
{ "RR", RR_fill_rect_relative },
{ "WG", WG_fill_wedge },
{ "AD", AD_define_alternate },
{ "CF", CF_character_fill },
{ "CP", CP_character_plot },
{ "DI", DI_absolute_direction },
{ "DR", DR_relative_direction },
{ "DT", DT_define_label_term },
{ "DV", DV_define_variable_path },
{ "ES", ES_extra_space },
{ "LB", LB_label },
{ "LO", LO_label_origin },
{ "SA", SA_select_alternate },
{ "SD", SD_define_standard },
{ "SI", SI_absolute_size },
{ "SL", SL_character_slant },
{ "SR", SR_relative_size },
{ "SS", SS_select_standard },
{ "TD", TD_transparent_data },
{ "AC", AC_anchor_corner },
{ "FT", FT_fill_type },
{ "LA", LA_line_attributes },
{ "LT", LT_line_type },
{ "NP", NP_number_pens },
{ "PC", PC_pen_color },
{ "CR", CR_color_range },
{ "PW", PW_pen_width },
{ "RF", RF_raster_fill },
{ "SM", SM_symbol_mode },
{ "SP", SP_select_pen },
{ "UL", UL_user_line_type },
{ "WU", WU_width_units }
HP-GL/2 버전과 텍스트 포맷(바이너리 미지원)만 지원하는것으로 보입니다.
실제 가공장치에서는 Pen Up/Down 되는 좌표를 가져와 구동시키는 방식으로 처리해 주시면 되겠습니다. 위 오픈소스에서는 함수포인터와 퀵 소팅을 사용하는 우아한(?) 방법을 사용하고 있네요.
*이미지및 로고등에 대한 PLOT 추가 예정
댓글 없음:
댓글 쓰기