摘 要 本文给出了AutoCAD平台下条形码的生成方法和算法流程,解决了对AutoCAD文档进行唯一标识和计算机识别的问题,并开发了相应的系统控件。
关键词 AutoCAD 控件 条形码 VB
一、引言
条形码技术最早出现在上世纪40年代,但直到70年代左右它才得到实际应用,而随着现代电子技术和信息技术的发展,条形码技术已经被世界上的国家和地区普遍使用,并逐步渗透到多个技术领域。条形码种类很多,常见的大概有二十多种码制,其中包括:Code39码(标准39码)、Codabar码(库德巴码)、Code25码(标准25码)、ITF25码(交叉25码)、Matrix25码(矩阵25码)、UPC-A码、UPC-E码、EAN-13码(EAN-13国际商品条码)、EAN-8码(EAN-8国际商品条码)、中国邮政码(矩阵25码的一种变体)、Code-B码、MSI码、Code11码、Code93码、ISBN码、ISSN码、Code128码(Code128码,包括EAN128码)、Code39EMS(EMS专用的39码)等一维条码和PDF417等二维条码。
目前,国际上广泛采用的条形码种类有EAN、UPC码(商品条码,用于在世界范围内唯一标识一种商品。我们在超市中畛<木褪荅AN和UPC条码)、Code39码(可表示数字和字母,在管理领域应用最广)、ITF25码(在物流管理中应用较多)、Codebar码(多用于医疗、图书领域)、Code93码、Code128码等。其中,EAN码是当今世界上广为使用的商品条码,已成为电子数据交换(EDI)的基础;UPC码主要为美国和加拿大使用;Code39码因其可采用数字与字母共同组成的方式而在行业内部管理上被广泛使用;Codebar码则主要应用于血库、图书馆和照相馆的业务流程中。
本文所述的条形码控件目前只用于生成EAN-13码,因为它能很好的被所有条形码扫描器兼容。
二、控件算法与设计
2.1设计需求:
2004年2月我们有一套软件系统开发任务,系统中要求能够对每张设计图纸(由AutoCAD绘制)发放唯一的图号,并能在日后对已发放图号的图纸进行审核和管理。为了能够唯一标识图纸,同时满足方便电脑识别的要求,我们决定采用条形码技术。EAN-13码是我国目前用得极为普遍的条码种类,其码位数量符合我公司目前图纸编号位数,并能完整记录我公司特殊的连图号信息;同时又由于其对打印质量要求不是很苛刻,现有打印设备即能满足使用,最终在系统中采用了EAN-13码。
2.2控件的算法实现:
AUTOCAD是一个专业工程图绘制软件,其文件格式是目前工业电子文档的事实标准,但在其内部并没有集成条形码生成功能,只能采用二次开发的方式来实现条形码的生成及绘制。我们所做的就是把生成EAN-13码的算法逻辑和AutoCAD绘制条形码的过程封装在一个外部函数库(Barcode.dll)中,并将其分发给程序开发人员,使他们只需调用这个函数就能在AutoCAD中绘制条形码,而不再需要考虑具体的条码生成和绘制细节。

图1
第一步,掌握EAN-13码的编码规则。EAN-13被称为标准版的EAN条码,其结构如图1所示,从左到右各部分依次为:左侧空白区、起始符、左侧数据符、中间分隔符、右侧数据符、校验符、终止符、右侧空白区。表1是各部分的信息,其中模块数据值“1”表示黑条;“0”表示白空。
表1
|
结构名称 |
所占模块数 |
模块数据值 |
|
左侧空白区 |
9 |
无 |
|
起始符 |
3 |
恒为“101” |
|
左侧数据符 |
42(6位数值,图中的“2~7”) |
通过A方法或B方法计算 |
|
中间分隔符 |
5 |
恒为“01010” |
|
右侧数据符 |
35(5位数值,图中的“89012”) |
通过C方法计算 |
|
校验符 |
7(1位数值,图中的最后一位“8”) |
后面有详细说明 |
|
终止符 |
3 |
恒为“101” |
|
右侧空白区 |
9 |
无 |
在EAN-13码中共113个模块,每个模块的宽度为0.33mm。总宽度为37.29mm,其中条码部分宽度为31.35mm。总高度为26.26mm,左、右侧数据符高度为22.85mm(显示码值)或23.18mm(不显示码值);起始符、中间分隔符、终止符高度为24.50mm 。支持放大倍数为0.8 ~ 2倍。
EAN-13码可记录12位有效数据,第13位为校验位(符),占7个模块。我们把这12位有效数中的第1位称为前置字符。前置字符用来确定左侧数据符的数据值是通过“A”方法还是“B”方法来计算(见表1),而前置字符本身并不占用任何模块(见图1中的第一位“1”)。其余每位有效数据(共11位,左侧数据符中有6位,右侧数据符中有5位)各占7个模块。
表2是前置字符与“A”“B”方法(左侧数据符中每位数据值的计算方法)的对照
表2
|
前置字符 |
每位数据值对应的计算方法 | |||||
|
第一位 |
第二位 |
第三位 |
第四位 |
第五位 |
第六位 | |
|
0 |
A |
A |
A |
A |
A |
A |
|
1 |
A |
A |
B |
A |
B |
B |
|
2 |
A |
A |
B |
B |
A |
B |
|
3 |
A |
A |
B |
B |
B |
A |
|
4 |
A |
B |
A |
A |
B |
B |
|
5 |
A |
B |
B |
A |
A |
B |
|
6 |
(中国)A |
B |
B |
B |
A |
A |
|
7 |
A |
B |
A |
B |
A |
B |
|
8 |
A |
B |
A |
B |
B |
A |
|
9 |
A |
B |
B |
A |
B |
A |
例如,图1中的前置字符为“1”,我们要使用表2 中的第2行数据,也就是左侧数据符中第一位数值(“2”)应通过“A”方法来计算…第五位数值(“6”)应通过“B”方法来计算…
表3是不同的数值经“A”、“B”、“C”三种方法计算出来的结果,其中“1”表示黑条;“0”表示白空。例如:左侧数据符中第一位数值(“2”)通过“A”方法计算出来的结果为:“0010011”;右侧数据符中第三位数值(“0”)通过“C”方法计算出来的结果为:“1110010”。
下面是计算校验位(符)模块数据值的步骤:
①把12位有效数据值所有偶数位的数字代码求和赋值a。
②将①中的a乘以3赋值a。
③把12位有效数据值所有奇数位的数字代码求和赋值b。
④将a和b相加赋值c。
⑤取c的个位数d。