2016년 1월 13일

HPGL 을 이용한 가공 데이타 처리방법

HP-GL은 HP사의 Graphics Language 란 의미로 프린터를 제어하기 위한 언어입니다. 최초에는 플로터(plotter)를 제어하기 위해 사용되었고 이후 PCL(Printer Command Language)로 갈아탄(?)것으로 보입니다. 때문에 HPGL 에 대한 사양이 10여년째 변화가 없어 점차 사라지는 기술로 보여지기도 합니다.

어쨋든, 초기 HPGL은 텍스트 기반으로 알파벳 두 글자의 명령어와 인자로 구성되고 세미콜론(;)으로 구분하는 단순한 포맷입니다. (참고 : https://en.wikipedia.org/wiki/HPGL) 이후 버전2로 개선되고 바이너리 포맷도 지원하게 된것으로 보입니다.

An example HP-GL file
CommandMeaning
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,lengthset line type and its repetition length
CSxxset character set (e.g. 33 is German)
DIx,yset 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 추가 예정

시리우스 라이브러리 홈페이지 오픈

현재 시리우스(Sirius) 라이브러리라는 제품을 개발하고 이를 소개하는 홈페이지를 오픈 하였습니다. 관심있는 분들의 많은 방문 요청드립니다. 앞으로 업데이트 소식및 변경사항은 스파이럴랩 홈페이지를 통해 진행할 예정입니다. 스파이럴랩 홈페이지 :  h...