PLT文件格式

PLT文件源自于HP绘图仪,PLT文件格式是基于矢量的,由Hewlett Packard开发。在诸如AutoCAD这样的程序中,用于打印绘图仪上的绘图。其它应用程序,例如CorelDraw ,可以解释HPGL的子集以及HPGL/2 命令集。

PLT概述

查看軟件

HPGL即惠普图形语言,是一个被绝大多数 CAD 绘图软件所支持的输出文件格式.可以使用ViewCompanion Pro查看、打印 HPGL, HPGL/2 图像文件。

解析库

开源解析库,转换出来的文件直接就是绘图仪的轨迹了,全部都是直线段,丢失了原始信息

命令行参数示例

hp2xx.exe datafile.hpgl hp2xx.exe -m dxf -f my_output.dxf datafile.hpgl

hpgl.c源码第381行有内存泄露,请读者自行修正:

strbuf = malloc(strbufsize);//strbuf内存没有释放

if (strbuf == NULL) {
strbuf = malloc(strbufsize);
if (strbuf == NULL) {
fprintf(stderr, "\nNo memory !\n");
exit(ERROR);
}
}
strbuf[0] = '\0';

另外一个库http://pldaniels.com/hpgl-dxf/代码不太行

商业库https://www.guthcad.com/hpgl2cad.htm,效果比较好,保留了矢量/文字等信息

常用指令

PLT文件中设备单位与标准长度单位的换算关系如下: 1016个绘图仪单位 = 1 英寸 或 40个绘图仪单位 = 1 mm

PLT的操作指令非常丰富, 不过常用以下几种指令就差不多够了

  • PA 到达指定的绝对位置
  • PU 抬笔动作
  • PD 下笔动作
  • SP 换笔动作
  • AA 圆弧动作
  • LB 文本路径

比如PU10023,23402;PA10023,23402;PU;都是一个意思

PA1234 4567;(注意,两个数值之间有空格或者’,’分隔符)

PA1234,4567,8324,2345;(多坐标放在一起)

一般而言,从CorelDraw或AutoCAD/R14版生成的PLT文件,其路径大部分只包含PU,PA,PD,SP有效指令,且路径已经为最优化的运动轨迹了,省去开发人员对最短路径的优化处理,而DXF文件则需要根据工艺,需要再次优化,因为它的路径与绘图顺序有关,这样有时频繁编辑或修改出来的图形路径 会非常纹乱,不适合直接加工处理,所以还需要开发人员再次优化路径,以达到最好的加工轨迹。

实例解析

20220720120247

// 如画一个五边形,其中四边是直线,一条边是曲线。画的第一条线是曲线
IN; //初始化
VS32,1; //笔的选择
VS32,2;
VS32,3;
VS32,4;
VS32,5;
VS32,6;
VS32,7;
VS32,8;
WU0;
PW0.350,1; //笔1的宽度
PW0.350,2;
PW0.350,3;
PW0.350,4;
PW0.350,5;
PW0.350,6;
PW0.350,7;
PW0.350,8;
LT; //开始画线,第一条线
SP1; //选择第一种画笔
PU-1757 885; // 指令PU PD后面的数字即为x,y坐标
PD-1757 885;
PD-1801 915;
PD-1843 945;
PD-1882 976;
PD-1919 1006;
PD-1953 1037;
PD-1987 1069;
PD-2018 1102;
PD-2048 1136;
PD-2077 1171;
PD-2105 1208;
PD-2132 1247;
PD-2158 1287;
PD-2184 1330;
PD-2209 1375;
PD-2235 1422;
PD-2261 1473;
PD-2261 1473;
PD-2279 1502;
PD-2303 1530;
PD-2333 1557;
PD-2367 1585;
PD-2405 1612;
PD-2446 1639;
PD-2488 1666;
PD-2532 1694;
PD-2576 1722;
PD-2619 1750;
PD-2661 1780;
PD-2701 1811;
PD-2738 1843;
PD-2770 1876;
PD-2798 1911;
PD-2820 1948;
PD-2820 1948;
PD-2829 1973;
PD-2835 2004;
PD-2839 2041;
PD-2841 2083;
PD-2841 2128;
PD-2841 2174;
PD-2841 2222;
PD-2842 2270;
PD-2843 2316;
PD-2847 2360;
PD-2852 2400;
PD-2860 2436;
PD-2872 2465;
PD-2887 2488;
PD-2907 2502;
PD-2932 2507;
LT; //开始画第二条线
SP1;
PU-60 1631;
PD-1794 876;
LT; //开始画第三条线
SP1;
PU-60 3309;
PD-60 1631;
LT; //开始画第四条线
SP1;
PU-1403 4036;
PD-60 3309;
LT;
SP1; //开始画第五条线
PU-2932 2507;
PD-1403 4036;
SP0; //结束

HPGL语法

HP-GL 的命令由两个字符的字母表的命令部分、参数部分和终止符部分组成,如下所示。为了在命令部分的下一个使用多个参数,需要用分隔符分隔每个参数。

Example :PA5000,1000;

(command) PA (parameter) 5000 (separator) , (parameter) 1000 (terminator) ;

默认分隔符是逗号,默认终止符是分号。另外,LB 和BL 命令的结束符是结束文本代码ETX。即 ASCII 码十进制数中的 3。除了 LB 和 BL 命令下的标签外,空格、C/R 和 L/F 代码将被忽略。记住最后一条命令出来的参数,如果省略参数,则使用前向参数。

坐标系统

坐标系是二维 XY 直角坐标。

  • 绘图仪坐标系XY 最小绘图仪移动单位为0.025mm。这被制成一个单元并整体表示。绘图的可能范围随绘图仪种类而变化。
  • 用户坐标系 用户坐标系可以通过预先设置比例尺和原点来指定坐标,这些坐标系由用户坐标系结合IP命令和SC命令转换为绘图仪坐标系。如果不执行此设置,将使用绘图仪坐标系。除整数外,用户坐标系的 X 和 Y 可以使用实数。

绘图仪的设置

IN(Initialize)

绘图仪变为初始状态。IN;

DF(Defalt)

绘图仪变为正常状态。DF;

  • DF 命令不影响下一个状态。此外,下一个状态也将 IN 命令变为初始状态。
  • P1 和 P2 的位置, 当前笔,其位置,向上/向下

IP(Input P1 and P2)

与 SC 指令配合使用,SC 指令由下节解释,设定坐标系的比例尺和原点位置。设置缩放点 P1(p1x, p1y) 和 P2(p2x, p2y)。

IP p1x,p1y,p2x,p2y;

P1(p1x, p1y) 和 P2(p2x, p2y) 是绘图仪坐标。

IP:它返回到每种绘图仪类型的不同初始状态的 P1 和 P2

SC(Scale)

对通过前项IP命令设置的缩放点P1(p1x, p1y)和P2(p2x, p2y),分配用户坐标的位置,并改变为用户坐标系。

SC xmin,xmax,ymin,ymax;

用户坐标 (xmin, ymin) 分配给绘图仪坐标的 P1 (p1x, p1y),用户坐标 (xmax, ymax) 分配绘图仪坐标的 P2 (p2x, p2y)。下一条命令用于从用户坐标系返回绘图仪坐标系。

20220721091319

示例 1:左图 用户坐标系 (X: 0..100, Y:0..100) 分配给绘图仪坐标系 (X: 0..4000, Y:0..4000)。用户坐标系统变为与 mm 相同的单位。

示例 2:右图 用户坐标系 (X:-75..300, Y:-75..225) 分配给绘图仪坐标系 (X:-6000..24000, Y:-6000..18000) .用户坐标系变为两倍 mm

基础绘图命令

SP(Select Pen)

笔被选中。虽然笔数的范围随着绘图仪的种类而变化,但最大为 0..255

SP PenNumber;

SP0; 它将绘图仪具有的笔存储在笔式绘图仪中。

PU(Pen Up)

笔举起。PU;

笔被抬起,然后,它移动到坐标 (x, y) 的位置。此外,使用以前使用坐标的绝对坐标(PA 指令)或相对坐标(PR 指令)。初始值为绝对坐标。

PU x,y(,x,y...);如果复数(x,y)继续,它将按顺序移动到那些位置。

PD(Pen Down)

笔举起。PD;

笔下降,然后,它移动到坐标(x,y)的位置。此外,使用以前使用坐标的绝对坐标(PA 指令)或相对坐标(PR 指令)。初始值为绝对坐标。

PD x,y(,x,y...);如果复数(x,y)继续,它将按顺序移动到那些位置

PA(Plot Absolute) PR(Plot Relative)

PA 笔移动到绝对坐标 (x, y) 的位置。

PA x,y(,x,y...);如果复数(x,y)继续,它将按顺序移动到那些位置

IN;IP0,0,4000,4000;SC0,100,0,100; 
SP1;
PA0,0;
PD;
PA100,0;
PA100,100;
PA0,100;
PA0,0;
PU;

PR和PA差不多,笔从现在的位置移动到相对坐标 (x, y) 的位置。

LT(Line Type)

直线、圆、圆弧、矩形的绘制所使用的线的种类被设定。

LT PatternNumber(,PatternLength);

PatternNumber 含义 英文
0 点绘制在指定点 Point
1 点的虚线 Dotted_Line
2 短虚线 Short_dotted_line
3 长虚线 Long_dotted_line
4 短划线 Short_dashed_line
5 长划线 Long_dashed_line
6 两点虚线 Two-point_phantom_line

Pattern length通过缩放点 P1 和 P2 之间距离的百分比来指定一个图案的长度。如果没有指定,它将变为 4%。

20220721100324

IN;IP0,0,4000,4000;SC0,100,0,100;SP1; 
PU0,0;PD100,0;
LT0,4;PU0,5;PD100,5;
LT1,4;PU0,10;PD100,10;
LT2,4;PU0,15;PD100,15;
LT3,4;PU0,20;PD100,20;
LT4,4;PU0,25;PD100,25;
LT5,4;PU0,30;PD100,30;
LT6,5;PU0,35;PD100,35;

圆弧多边形

CT(Chord Tolerance)

选择CI、AA、AR、WG、EW指令的分辨率参数是设为弦角(单位:度),还是设为弦高(单位:当前坐标系的尺寸)。圆和弧近似为多边形并绘制。参数的角度是指与一侧多边形中心点的角度。此外,弦高是指从真圆的边缘到多边形一侧的距离。虽然画出了分辨率参数小、圆弧这样漂亮的圆,但是画起来还是需要时间的。

CT n;当 n 为 0 时,设置为角度。当 n 为 1 时,设置为弦高。初始值为 0

20220721100655

CI(Circle)

圆由指定的半径(当前坐标系的尺寸)和以当前笔的位置为中心的分辨率绘制。在 CI 命令中,不需要 PD 命令。 CI 命令后的上/下笔将处于 CI 命令之前的状态。如果省略分辨率,它将变成五个角度。

CI Radius (,resolution);

20220721100954

IN;IP0,0,4000,4000;SC0,100,0,100;SP1; 
CT0;
PA10,10;
CI10;
PA40,10;
CI10,30;
PA70,10;
CI10,45;
CT1;
PA10,40;
CI10,0.5;
PA40,40;
CI10,1.0;
PA70,40;
CI10,1.5;

AA(Arc Absolute) AR(Arc Relative)

AA以绝对坐标给定的点(xc,yc)为中心点,以当前笔的位置为起点,以参数指定的中心角(单位:度)和分辨率作图。如果省略分辨率,它将变成五个角度。

AA xc, yc, CentralAngle (,Resolution);

AR和AA差不多,给定相对坐标

20220721101312

IN;IP0,0,4000,4000;SC0,100,0,100;SP1; 
CT0;
PU;PA5,0;PD;
AR0,5,-180;
PR10,0;
AR0,-5,-180,30;
PR-10,0;

FT(Fill Type)

它与 FP、RA、RR 和 WG 命令一起使用,并指定了着色模型(绘制和阴影)。

FT (model (,space (,angle))); model默认为1

model 含义
1 在PT指令指定的空间进行交互画出(FT 指令间隔和角度忽略)
2 在PT指令指定的空间进行单方向的画出(FT 指令间距和角度忽略)
3 由FT指令指定的空间和角度的单一方向影线
4 由FT指令指定的空间和角度的交叉影线。

space 是平行阴影线之间的距离,是当前坐标系。初始值为 P1 和 P2 之间距离的 1%。

angle 用阴影线的角度用度数表示单位。初始值为 0 度。

PT(Pen Thickness)

与FP、FT、RR、RA、WG指令配合使用,根据笔的粗细规定涂漆空间(单位mm)在0.1~5.0之间。初始值为 0.3mm。PT PaintingOutSpace;

WG(Fill Wedge) EW(Edge Wedge)

WG与 FT 和 PT 命令一起使用,Wedge 内部的阴影由半径、起点角度(单位:度)确定,并执行以当前位置为中心的分辨率。WG Radius, StartingAngle, CentralAngle (,Resolution);

EW以当前位置为中心绘制由半径、起点角度(单位:度)和分辨率确定的楔形。EW忽略FT指令的填充,因为只画边。EW Radius, StartingAngle, CentralAngle (,Resolution);

20220721102129

IN;IP0,0,4000,4000;SC0,100,0,100;SP1; 
PU;PA50,50;
FT3,5;
WG50,90,180;
SP2;FT4,5,45;
WG50,270,60;
SP3;FT1;
WG50,330,120;
SP4;
EW50,90,180;
EW50,270,60;
EW50,330,120;

RA(Fill Rectangle Absolute) EA(Edge Rectangle Absolute)

RA与 FT 和 PT 命令和矩形内部的阴影一起使用,使对角点坐标 (x, y) 指定当前位置,并在此处执行。命令后的笔位置和笔向上/向下状态将处于命令之前的状态。RA x,y;

EA使对角坐标 (x, y) 指定当前位置并在此处绘制的矩形。命令后的笔位置和笔向上/向下状态将处于命令之前的状态。EA忽略FT指令的填充,因为只画边。EA x,y;

20220721102503

IN;IP0,0,4000,4000;SC0,100,0,100;SP1; 
PU;PA0,0;
FT1;
RA40,40;
SP2;
FT3,4;
PA60,0;
RA100,40;
SP3;
FT4,4,45;
PA0,60;
RA40,100;
SP4;
FT2;
PA60,60;
RA100,100;
SP5;
PA0,0;
EA40,40;
PA60,0;
EA100,40;
PA0,60;
EA40,100;
PA60,60;
EA100,100;

RR(Fill Rectangle Relative) ER(Edge Rectangle Relative)

和RA/EA指令类似,替换成相对坐标

EP(Edge Polygon)

绘制由 PM、PA/PR、PU/PD、AA/AR、CI 和 CT 命令定义为多边形缓冲区的多边形周长。命令后的笔位置和笔向上/向下状态将处于命令之前的状态。

FP(Fill Polygon)

执行由 PM、PA/PR、PU/PD、AA/AR、CI 和 CT 命令定义为多边形缓冲区的多边形内部的着色。命令后的笔位置和笔向上/向下状态将处于命令之前的状态。

PM(Polygon Mode)

它是多边形定义模式。 PM指令与PA/PR、PU/PD、AA/AR、CI、CT指令配合使用,可定义多边形。定义的多边形由多边形缓冲区存储。 EP 和 FP 命令用于绘制定义的多边形。可以定义两个或多个多边形。当多边形在多边形中时,如果用 FP 命令进行着色,则从外包含关系轮流重复(绘画)/(不绘画)。PM n;

n取值 含义
0 多边形缓冲区被清除并进入多边形定义模式。
1 定义下的多边形是闭合的。
2 关闭定义中的多边形,取消多边形定义模式。
PM0;多边形缓冲区被清除,并成为多边形定义模式。
PM1;第一个多边形是闭合的。
PM1;第二个多边形是闭合的。
……
PM2;最后一个多边形关闭,多边形模式被取消。

多边形是使用PA/PR/PU/PD/AA/AR/CI/CT命令定义的两个或更多。

FP;EP;绘制多边形阴影和多边形周长。

20220721103614

IN;IP0,0,4000,4000;SC0,100,0,100;SP1; 
PU;PA25,0;
PM0;PD;
AA25,25,-180;
PA75,50;
AA75,25,-180;
PA25,0;
PM1;
PU;PA25,25;
CI10;
PM1;
PU;PA65,15;PD;
PR0,20,20,0,0,-20,-20,0;PU;
PM2;
FT3,2,45;
FP;EP;

字符绘图命令

LB(Label)

字符由设置字符集绘制。可以将回车(C/R)和换行(L/F)放入字符串。字符绘图后的笔位置移动到下一个字符串的原点。LB<CharacterString>ETX

ETX 是结束文本线,是 ASCII 码十进制数中的 3。可通过 DT 命令换成另一条线。

如果下述 CS 和 CA 指令定义为 101,则 2 字节的 JIS 代码日文可用于 LB 指令的字符串

DT(Define Terminator)

标签终止符的字符由 LB 和 BL 命令改变。DT<Character>(,Mode);

HP-GL 中没有modal 参数。它在 HP-GL/2 中。当模式为 0 并且标签终止符是打印字符时打印。 mode 为 1 时,即使是打印字符也不打印。HP-GL/2 的初始值为 mode 1。HP-GL 始终与 mode 0 相同。

Next 用于返回 ETX(End Of文本代码)的初始值。

SI(Absolute Character Size) SR(Relative Character Size) SU(User Unit Character Size)

SI字符宽度和高度的单位以厘米为单位指定。初始值为 0.285 厘米宽和 0.375 厘米高。SI CharacterWidth, CharacterHeight;

SR字符宽度由缩放点 P1 和 P2 之间的 X 距离的百分比指定。字符高度由 P1 和 P2 之间的 Y 距离的百分比指定。SR CharacterWidth, CharacterHeight;

SU字符宽度和高度以用户坐标系为单位指定。SU CharacterWidth, CharacterHeight;

SL(Character Slant) DI(Absolute Direction) DR(Relative Direction) DU(User Unit Direction) DV(Vertical Label Direction)

SL由 tangent(theta) 指定字符垂直线的倾斜度。SL Tangent;

DI字符串的角度由run(倾斜的水平距离)和rise(倾斜的垂直距离)指定。DI run,rise;

DR字符串的角度由run(它是缩放点P1和P2的X距离相对于倾斜的水平距离的百分比)和rise(它是缩放点P1和P2的Y距离相对于倾斜的垂直距离的百分比)指定。DR run,rise;

DU字符串的角度由run(它是用户坐标系关于倾斜水平距离的单位)和rise(它是用户坐标系关于倾斜垂直距离的单位)指定。DU run,rise;

DV字改为横写和竖写。DV n;. 如果 n 为 0,它将成为标准的横向书写。如果 n 为 1,它将变为垂直书写。

20220721135113

IN;IP0,0,4000,4000;SC0,100,0,100;SP1; 
PU;PA0,0;DT$,1;
SI0.3,0.4;

LBW0.3cm,H0.4cm$

PA0,7;SL;LBSL$
PA0,14;SL-1;LBSL-1$
PA0,21;SL1;LBSL1$

PA50,50;DI1,1;LB____DI1,1$
PA50,50;DI0,1;LB____DI0,1$
PA50,50;DI-1,0;LB____DI-1,0$
PA50,50;DI-1,-1;LB____DI-1,-1$

DI;
PA50,50;DV1;LB____DV1$
PA50,50;DV0;LB____DV0$

LO(Label origin)

指定将字符绘制到当前笔位置的位置LO LocationNumber;

位置编号和当前笔的位置与字符之间的关系如下。

位置
3 6 9
2 5 8
1 4 7

如果在上述位置编号上加 10,则除“Inside Inside”之外的位置将偏移到字符的外侧。偏移量为 SI/SR 设置的字符宽度的 1/2 和字符高度的 1/2

20220721135636

IN;IP0,0,4000,4000;SC0,100,0,100;SP1; 
PU;PA0,0;PD50,0;
PU;PA0,8;PD50,8;
PU;PA0,16;PD50,16;
PU;PA0,0;PD0,16;
PU;PA25,0;PD25,16;
PU;PA50,0;PD50,16;
PU;SP2;
DT$;SI0.23,0.32;
PA0,0;LO1;LBLO1$
PA0,8;LO2;LBLO2$
PA0,16;LO3;LBLO3$
PA25,0;LO4;LBLO4$
PA25,8;LO5;LBLO5$
PA25,16;LO6;LBLO6$
PA50,0;LO7;LBLO7$
PA50,8;LO8;LBLO8$
PA50,16;LO9;LBLO9$
SP1;
PU;PA0,24;PD50,24;
PU;PA0,32;PD50,32;
PU;PA0,40;PD50,40;
PU;PA0,24;PD0,40;
PU;PA25,24;PD25,40;
PU;PA50,24;PD50,40;
PU;SP2;
PA0,24;LO11;LBLO11$
PA0,32;LO12;LBLO12$
PA0,40;LO13;LBLO13$
PA25,24;LO14;LBLO14$
PA25,32;LO15;LBLO15$
PA25,40;LO16;LBLO16$
PA50,24;LO17;LBLO17$
PA50,32;LO18;LBLO18$
PA50,40;LO19;LBLO19$

CP(Character Plot)

只有指定为水平方向和纵向方向的字符数移动笔。在水平方向的情况下,加号时向右移动,负号时向左移动。纵向时,正时向上移动,负时向下移动 CP NumberOfHorizontalCharacters, NumberOfLengthwiseCharacters;

CP;执行回车换行操作

20220721144641

IN;IP0,0,4000,4000;SC0,100,0,100;SP1; 
PU;PA0,50;PD50,50;
DT$;SP2;
PU;PA0,50;CP2,0.3;LBPA0,50;CP2,0.3$
PA50,50;CP-2,-1;LBPA50,50;CP-2,-1$

ES(Extra Space)

调整字符的字符间距和行距。字符间距和行距是使 NCP 单元格的宽度和高度为 1 的比率。 NCP 单元格是指定一个字符的标准间距,大小是英文大写字符高度的 2 倍,宽度的 1.5 倍。 0 为标准,正值从标准扩展空间,负值从标准缩小ES CharacterGap(,LineSpacing);

20220721144734

IN;IP0,0,4000,4000;SC0,100,0,100;SP1; 
PU;PA0,10;
DT$;
ES0.2,0.2;
LBES0.2,0.2
AAAAAAAAAAA$
PA0,50;
ES-0.2,-0.2;
LBES-0.2,-0.2
AAAAAAAAAAA$
PA0,30;
ES;
LBES0,0
AAAAAAAAAAA$

BL(Buffer Label) PB(Print Bufferd Label)

BL 标签缓冲区中存储最多 150 个字符的标签字符串。可以包含控制代码,例如回车和换行。 PB命令可以多次绘制缓冲区中存储的字符串BLCharacterString<ETX>

ETX 是结束文本线,在 ASCII 码十进制数中是 3。可通过DT指令换成另一条线.BL; LB;缓冲区被清除。如果新的 BL 命令到来,缓冲区将被重写

PB 将当前位置设为左下角,标绘标签缓冲区的字符串。 LO 命令的位置被忽略。

IN;IP0,0,4000,4000;SC0,100,0,100;SP1; 
PU;PA0,10;PD60,10;PU;
DT$;
BLABCDEFG 012345
abcdefg 67890$
PA0,10;PB;

改变绘图区域

IW(Input window)

它用于在此处指定的区域之外执行绘图的剪切。裁剪区域的左下点(x1,y1)和右上点(x2,y2)以绘图仪坐标系为单位指定IW x1,y1,x2,y2;

IW:剪裁被取消,绘图仪被绘制到可以绘制的整个区域

20220721150309

IN; 
IP-2000,-1000,2000,1000;
SC-2000,2000,-1000,1000;
SP1;
PUPA-2000,-1000;
PDPA2000,1000;
PUPA-2000,1000;
PDPA2000,-1000;
PUPA-2000,0;
PDPA2000,0;
PUPA0,-1000;
PDPA0,1000;
IW-1000,-500,1000,500;
SP2;
PUPA-2100,-1000;
PDPA2100,1000;
PUPA-2100,1000;
PDPA2100,-1000;
PUPA-2000,0;
PDPA2000,0;
PUPA0,-1000;

RO(Rotate Coodinate System)

绘图仪坐标系旋转RO90;

RO; 或者 RO0;返回到不旋转的状态

20220721150631

RO90; 
SP1;
PU;PA0,0;PD;PA4000,0,2000,2000,2000,-2000,PA4000,0;
RO;
SP2;
PU;PA0,0;PD;PA4000,0,PA2000,2000,PA2000,-2000,PA4000,0;