资源描述
AUTOCAD中条形码生成控件的设计
摘 要 本文给出了AutoCAD平台下条形码的生成方法和算法流程,解决了对AutoCAD文档进行唯一标识和计算机识别的问题,并开发了相应的系统控件。关键词 AutoCAD 控件 条形码 VB 一、引言条形码技术最早出现在上世纪40年代,但直到70年代左右它才得到实际应用,而随着现代电子技术和信息技术的发展,条形码技术已经被世界上的国家和地区普遍使用,并逐步渗透到多个技术领域。条形码种类很多,常见的大概有二十多种码制,其中包括:Code39码、Codabar码、Code25码、ITF25码、Matrix25码、UPC-A码、UPC-E码、EAN-13码、EAN-8码、中国邮政码、Code-B码、MSI码、Code11码、Code93码、ISBN码、ISSN码、Code128码、Code39EMS等一维条码和PDF417等二维条码。目前,国际上广泛采用的条形码种类有EAN、UPC码、Code39码、ITF25码、Codebar码、Code93码、Code128码等。其中,EAN码是当今世界上广为使用的商品条码,已成为电子数据交换的基础;UPC码主要为美国和加拿大使用;Code39码因其可采用数字与字母共同组成的方式而在行业内部管理上被广泛使用;Codebar码则主要应用于血库、图书馆和照相馆的业务流程中。本文所述的条形码控件目前只用于生成EAN-13码,因为它能很好的被所有条形码扫描器兼容。二、控件算法与设计设计需求:2004年2月我们有一套软件系统开发任务,系统中要求能够对每张设计图纸发放唯一的图号,并能在日后对已发放图号的图纸进行审核和管理。为了能够唯一标识图纸,同时满足方便电脑识别的要求,我们决定采用条形码技术。EAN-13码是我国目前用得极为普遍的条码种类,其码位数量符合我公司目前图纸编号位数,并能完整记录我公司特殊的连图号信息;同时又由于其对打印质量要求不是很苛刻,现有打印设备即能满足使用,最终在系统中采用了EAN-13码。控件的算法实现:AUTOCAD是一个专业工程图绘制软件,其文件格式是目前工业电子文档的事实标准,但在其内部并没有集成条形码生成功能,只能采用二次开发的方式来实现条形码的生成及绘制。我们所做的就是把生成EAN-13码的算法逻辑和AutoCAD绘制条形码的过程封装在一个外部函数库中,并将其分发给程序开发人员,使他们只需调用这个函数就能在AutoCAD中绘制条形码,而不再需要考虑具体的条码生成和绘制细节。图1第一步,掌握EAN-13码的编码规则。EAN-13被称为标准版的EAN条码,其结构如图1所示,从左到右各部分依次为:左侧空白区、起始符、左侧数据符、中间分隔符、右侧数据符、校验符、终止符、右侧空白区。表1是各部分的信息,其中模块数据值“1”表示黑条;“0”表示白空。表1结构名称所占模块数模块数据值左侧空白区9无起始符3恒为“101”左侧数据符42通过A方法或B方法计算中间分隔符5恒为“01010”右侧数据符35通过C方法计算校验符7后面有详细说明终止符3恒为“101”右侧空白区9无在EAN-13码中共113个模块,每个模块的宽度为。总宽度为,其中条码部分宽度为。总高度为,左、右侧数据符高度为(显示码值)或;起始符、中间分隔符、终止符高度为 。支持放大倍数为 ~ 2倍。EAN-13码可记录12位有效数据,第13位为校验位,占7个模块。我们把这12位有效数中的第1位称为前置字符。前置字符用来确定左侧数据符的数据值是通过“A”方法还是“B”方法来计算,而前置字符本身并不占用任何模块。其余每位有效数据(共11位,左侧数据符中有6位,右侧数据符中有5位)各占7个模块。表2是前置字符与“A”“B”方法的对照表2前置字符每位数据值对应的计算方法第一位第二位第三位第四位第五位第六位0AAAAAA1AABABB2AABBAB3AABBBA4ABAABB5ABBAAB6ABBBAA7ABABAB8ABABBA9ABBABA例如,图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方法0000110101001111110010100110010110011110011020010011001101111011003011110101000011000010401000110011101101110050110001011100110011106010111100001011010000701110110010001100010080110111000100110010009000101100101111110100请检验一下,如图1所示,“123456789012”的模块数据值应为:“10100100110111101001110101100010000101001000101010100100011101001110010110011011011001001000101”我们依次把这些数字中的“1”绘成一定尺寸的黑条;把数字中的“0”留出一定尺寸的白空也就绘出了相应的条形码。第二步,设计产生模块数据值的算法。依据以上规则,设计MAKECODE函数,输入12位阿拉伯数字,输出其产生的模块数据值,即由“0”和“1” 组成的字符串。将其作为绘制函数的输入。第三步,绘制条形码。依据第二步中计算出的模块数据值,在AutoCAD中绘制黑条和留出白空。我们使用了AutoCAD中的多段线对象来绘制黑条,因为这种实体对象的长度和线粗等属性都很好控制。之后还应该考虑在相应的位置绘出条形码代表的字符值,以便人的识别。注意,我们使用的是AutoCAD2000版本,R14版以前的版本没有提供VB的官方标准开发接口。第四步,功能的完善。经过第二、三步,我们已经达到了绘制条形码的最基本的要求,程序员可以输入一个条形码码值作为函数Drawbar code的参数,并调用这个函数来绘制对应的条形码。但这还不够,我们应考虑以指定的位置、比例、角度和颜色绘制条形码的功能。为此给函数Drawbar code添加参数draw Scale,获取比例值、PTX,获取起始位置的横坐标、PTY, 获取起始位置的纵坐标、nPI,获取旋转角度、Show Value ,获取是否要绘制条形码码值的信息、bColor,获取颜色等。三、设计过程中的关键问题:1、微软公司在其office系列中包含有一个简单条形码控件:Microsoft Access Barcode ,只要安装了微软的Access2000系统就会注册该控件。该控件支持11种条形码格式,只需把条形码码值赋给其“Value”属性,该控件即可显示相应的条形码。我们最初有过这样的思路:获取用户给出的条形码码值后,先用MSBCODE9得到相应条形码图形,然后在AutoCAD中处理条形码图形。但MSBCODE9不具备类似图片控件的属性,无法简单地把条形码图形拷贝出来,因此只能使用API函数BitBlt来拷贝MSBCODE9中的条形码图形,不过经过考虑我们放弃了这种思路。首先,按上述思路产生的图形属于位图而不是矢量图,图形中的黑条和白空尺寸不严格,从而绘制出的条形码无法识别。其次,向AutoCAD中粘贴图形时,AutoCAD提供两种方式,一种需要关联到图形文件,这肯定是不可取的;另一种是以OLE对象来处理图形,但用这种方式无法对粘贴上去的图形再进行尺寸调整和角度旋转。基于以上考虑,我们采用在CAD中直接绘制条码,设计一个DRAWCODE函数,根据条码生成函数输出的“0”、“1”字符串,依次在CAD绘出PLINE实体。2、 任意角度的绘制条形码。要求条形码按一定角度绘制,需要把构成条形码的所有多段线和文字对象都按一定角度倾斜绘出。图2是表示条形码图2不旋转时的样子,注意,坐标原点不是AutoCAD中坐标系的点,而是用户给函数Drawbar code的起始位置参数,表示条形码应该从什么地方开始绘制,函数Drawbar code的参数已在前面介绍过。图2中箭头所指处为文字“1”的起始位置M,下面我们以该点为例说明如何处理旋转时的位置变化。如图3所示,M点就是图2中的M点,为了方便说明,对其位置进行了放大。条形码以插入点O点为圆心,逆时钟旋转一定角度后,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以插入点为圆心,旋转某一角度α后,该点相对于插入点的新的位置M’(a’,b’)的计算公式:图3M’点在AutoCAD中的具体位置为:M’(PTX + aCosα + bSinα,PTY + aSinα – bCosα)。计算出M’点的位置后,实现绘制任意旋转角度的条形码的功能就不再困难。四、结束语:使用条形码绘制控件后,程序开发人员在AutoCAD中绘制条形码变得非常简单,只需确定条形码码值、插入位置、图形比例和旋转角度等基本信息,剩下的工作全部由控件来完成。该条形码控件目前在我企业的《图号自动生成及管理系统》项目中运行良好,取得较好的效果,达到预期目的。参考文献1. 湘电股份信息中心《图号自动生成及图号管理系统科研任务书》. AUTOCAD R2000 使用手册之VBA开发部分3. 《计算机软件工程规范国家标准汇编》 中国标准出版社 . 《新编 Windows API 参考大全》 电子工业出版社
展开阅读全文