最新资讯 New
搜索   Search

AUTOCAD中条形码生成控件的设计

2013-7-3 17:10:25

AutoCAD平台下条形码的生成方法和算法流程,解决了对AutoCAD文档进行唯一标识和计算机识别的问题,并开发了相应的系统控件。

一、引言

条形码技术最早出现在上世纪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。

⑥校验位(符)数值=10 – d。

⑦使用“C”方法计算校验位(符)模块数据值。

例:求“123456789012”的校验位(符),如图1所示。

① a = 2 + 4 + 6 + 8 + 0 + 2 = 22

② a = 3 * a = 66

③ b = 1 + 3 + 5 + 7 + 9 + 1 = 26

④ c = a + b = 66 + 26 = 92

⑤ d = 2

⑥ 校验位(符)数值 = 10 – d = 8

⑦ 校验位(符)模块数据值 = 1001000

 

表3


数值 A方法 B方法 C方法
0 0001101 0100111 1110010
1 0011001 0110011 1100110
2 0010011 0011011 1101100
3 0111101 0100001 1000010
4 0100011 0011101 1011100
5 0110001 0111001 1001110
6 0101111 0000101 1010000
7 0111011 0010001 1000100
8 0110111 0001001 1001000
9 0001011 0010111 1110100


请检验一下,如图1所示,“123456789012”的模块数据值应为:“10100100110111101001110101100010000101001000101010100100011101001110010110011011011001001000101”我们依次把这些数字中的“1”绘成一定尺寸(宽度和高度已在前面提过)的黑条;把数字中的“0”留出一定尺寸的白空也就绘出了相应的条形码。

第二步,设计产生模块数据值的算法。依据以上规则,设计MAKECODE函数,输入12位阿拉伯数字,输出其产生的模块数据值,即由“0”和“1” 组成的字符串。将其作为绘制函数的输入。

第三步,绘制条形码。依据第二步中计算出的模块数据值,在AutoCAD中绘制黑条和留出白空。我们使用了AutoCAD中的多段线(PLine)对象来绘制黑条,因为这种实体对象的长度和线粗等属性都很好控制。之后还应该考虑在相应的位置绘出条形码代表的字符值,以便人的识别。注意,我们使用的是AutoCAD2000版本,R14版以前的版本没有提供VB的官方标准开发接口。

第四步,功能的完善。经过第二、三步,我们已经达到了绘制条形码的最基本的要求,程序员可以输入一个条形码码值作为函数Drawbar code的参数,并调用这个函数来绘制对应的条形码。但这还不够,我们应考虑以指定的位置、比例、角度和颜色绘制条形码的功能。为此给函数Drawbar code添加参数如下:draw Scale,获取比例值、PTX,获取起始位置的横坐标、PTY, 获取起始位置的纵坐标、nPI(可选参数),获取旋转角度、Show Value ,获取是否要绘制条形码码值的信息、bColor,获取颜色等。

三、设计过程中的关键问题:

1、微软公司在其office系列中包含有一个简单条形码控件:Microsoft Access Barcode Control9.0(以下称为:MSBCODE9),只要安装了微软的Access2000(Office2000 套件之一,其它版本不一定包含该控件)系统就会注册该控件。该控件支持11种条形码格式,只需把条形码码值赋给其“Value”属性,该控件即可显示相应的条形码。

我们最初有过这样的思路:获取用户给出的条形码码值后,先用MSBCODE9得到相应条形码图形,然后在AutoCAD中处理条形码图形。但MSBCODE9不具备类似图片控件的属性,无法简单地把条形码图形拷贝出来,因此只能使用API函数BitBlt(该函数对指定的源设备环境区域中的像素进行位块转换,以传送到目标设备环境)来拷贝MSBCODE9中的条形码图形,不过经过考虑我们放弃了这种思路。首先,按上述思路产生的图形属于位图而不是矢量图,图形中的黑条和白空尺寸不严格,从而绘制出的条形码无法识别。其次,向AutoCAD中粘贴图形时,AutoCAD提供两种方式,一种需要关联到图形文件,这肯定是不可取的;另一种是以OLE对象来处理图形,但用这种方式无法对粘贴上去的图形再进行尺寸调整和角度旋转。基于以上考虑,我们采用在CAD中直接绘制条码,设计一个DRAWCODE函数,根据条码生成函数输出的“0”、“1”字符串,依次在CAD绘出PLINE实体。


2、 任意角度的绘制条形码。要求条形码按一定角度绘制,需要把构成条形码的所有多段线和文字(码值)对象都按一定角度倾斜绘出。图2是表示条形码

 

图2

不旋转(旋转角度=0)时的样子,注意,坐标原点不是AutoCAD中坐标系的(0,0)点,而是用户给函数Drawbar code的起始位置参数(PTX,PTY),表示条形码应该从什么地方开始绘制,函数Drawbar code的参数已在前面介绍过。图2中箭头所指处为文字“1”的起始位置M(a,b),下面我们以该点为例说明如何处理旋转时的位置变化。如图3所示,M点就是图2中的M点,为了方便说明,对其位置进行了放大。条形码以插入点O点(PTX,PTY)为圆心,逆时钟旋转一定角度后,M点的位置变为:M’(a’,b’),求出M’点的位置是解决这个问题的关键。设旋转角度α,即∠BOP = α,从M’点向OP引垂线,垂足为:D,从M’点向坐标轴线垂线,垂足分别为:B和C,从D点向横坐标引垂线,垂足为:A,DA与CM’垂直相交于点E。因M’点由M点旋转而来,所以DM’ = b, OD = a。容易求出∠ADM’ = ∠AOD =α,因此AB = EM’ = DM’ * Sinα = bSinα;OA = OD * Cosα = aCosα,OB = aCosα + bSinα。用类似的方法可以求出:OC = aSinα – bCosα。而线段OB和OC的长度刚好是M’点的坐标值a’和b’。这样,我们就得到了条形码中任一点M(a,b)以插入点为圆心,旋转某一角度α后,该点相对于插入点的新的位置M’(a’,b’)的计算公式:

 

图3

 

M’点在AutoCAD中的具体位置为:M’(PTX + aCosα + bSinα,PTY + aSinα – bCosα)。计算出M’点的位置后,实现绘制任意旋转角度的条形码的功能就不再困难。

四、结束语:

使用条形码绘制控件后,程序开发人员在AutoCAD中绘制条形码变得非常简单,只需确定条形码码值、插入位置、图形比例和旋转角度等基本信息,剩下的工作全部由控件来完成。该条形码控件目前在企业的《图号自动生成及管理系统》项目中运行良好,取得较好的效果,达到预期目的。



关闭
138-2377-4796 工作时间:
上午8:30-12:00
下午13:30-18:30