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) { |
另外一个库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文件则需要根据工艺,需要再次优化,因为它的路径与绘图顺序有关,这样有时频繁编辑或修改出来的图形路径 会非常纹乱,不适合直接加工处理,所以还需要开发人员再次优化路径,以达到最好的加工轨迹。
实例解析
// 如画一个五边形,其中四边是直线,一条边是曲线。画的第一条线是曲线 |
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)。下一条命令用于从用户坐标系返回绘图仪坐标系。
示例 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; |
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%。
IN;IP0,0,4000,4000;SC0,100,0,100;SP1; |
圆弧多边形
CT(Chord Tolerance)
选择CI、AA、AR、WG、EW指令的分辨率参数是设为弦角(单位:度),还是设为弦高(单位:当前坐标系的尺寸)。圆和弧近似为多边形并绘制。参数的角度是指与一侧多边形中心点的角度。此外,弦高是指从真圆的边缘到多边形一侧的距离。虽然画出了分辨率参数小、圆弧这样漂亮的圆,但是画起来还是需要时间的。
CT n;
当 n 为 0 时,设置为角度。当 n 为 1
时,设置为弦高。初始值为 0
CI(Circle)
圆由指定的半径(当前坐标系的尺寸)和以当前笔的位置为中心的分辨率绘制。在 CI 命令中,不需要 PD 命令。 CI 命令后的上/下笔将处于 CI 命令之前的状态。如果省略分辨率,它将变成五个角度。
CI Radius (,resolution);
IN;IP0,0,4000,4000;SC0,100,0,100;SP1; |
AA(Arc Absolute) AR(Arc Relative)
AA以绝对坐标给定的点(xc,yc)为中心点,以当前笔的位置为起点,以参数指定的中心角(单位:度)和分辨率作图。如果省略分辨率,它将变成五个角度。
AA xc, yc, CentralAngle (,Resolution);
AR和AA差不多,给定相对坐标
IN;IP0,0,4000,4000;SC0,100,0,100;SP1; |
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);
IN;IP0,0,4000,4000;SC0,100,0,100;SP1; |
RA(Fill Rectangle Absolute) EA(Edge Rectangle Absolute)
RA与 FT 和 PT 命令和矩形内部的阴影一起使用,使对角点坐标 (x, y)
指定当前位置,并在此处执行。命令后的笔位置和笔向上/向下状态将处于命令之前的状态。RA x,y;
EA使对角坐标 (x, y)
指定当前位置并在此处绘制的矩形。命令后的笔位置和笔向上/向下状态将处于命令之前的状态。EA忽略FT指令的填充,因为只画边。EA x,y;
IN;IP0,0,4000,4000;SC0,100,0,100;SP1; |
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;多边形缓冲区被清除,并成为多边形定义模式。 |
多边形是使用PA/PR/PU/PD/AA/AR/CI/CT命令定义的两个或更多。
FP;EP;绘制多边形阴影和多边形周长。
IN;IP0,0,4000,4000;SC0,100,0,100;SP1; |
字符绘图命令
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,它将变为垂直书写。
IN;IP0,0,4000,4000;SC0,100,0,100;SP1; |
LO(Label origin)
指定将字符绘制到当前笔位置的位置LO LocationNumber;
位置编号和当前笔的位置与字符之间的关系如下。
位置 | 左 | 内 | 右 |
---|---|---|---|
上 | 3 | 6 | 9 |
内 | 2 | 5 | 8 |
下 | 1 | 4 | 7 |
如果在上述位置编号上加 10,则除“Inside Inside”之外的位置将偏移到字符的外侧。偏移量为 SI/SR 设置的字符宽度的 1/2 和字符高度的 1/2
IN;IP0,0,4000,4000;SC0,100,0,100;SP1; |
CP(Character Plot)
只有指定为水平方向和纵向方向的字符数移动笔。在水平方向的情况下,加号时向右移动,负号时向左移动。纵向时,正时向上移动,负时向下移动
CP NumberOfHorizontalCharacters, NumberOfLengthwiseCharacters;
CP;执行回车换行操作
IN;IP0,0,4000,4000;SC0,100,0,100;SP1; |
ES(Extra Space)
调整字符的字符间距和行距。字符间距和行距是使 NCP 单元格的宽度和高度为
1 的比率。 NCP 单元格是指定一个字符的标准间距,大小是英文大写字符高度的
2 倍,宽度的 1.5 倍。 0
为标准,正值从标准扩展空间,负值从标准缩小ES CharacterGap(,LineSpacing);
IN;IP0,0,4000,4000;SC0,100,0,100;SP1; |
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; |
改变绘图区域
IW(Input window)
它用于在此处指定的区域之外执行绘图的剪切。裁剪区域的左下点(x1,y1)和右上点(x2,y2)以绘图仪坐标系为单位指定IW x1,y1,x2,y2;
IW:剪裁被取消,绘图仪被绘制到可以绘制的整个区域
IN; |
RO(Rotate Coodinate System)
绘图仪坐标系旋转RO90;
RO; 或者 RO0;返回到不旋转的状态
RO90; |