AUTOCAD中條形碼生成控件的設(shè)計(jì)
AutoCAD平臺(tái)下條形碼的生成方法和算法流程,解決了對(duì)AutoCAD文檔進(jìn)行唯一標(biāo)識(shí)和計(jì)算機(jī)識(shí)別的問題,并開發(fā)了相應(yīng)的系統(tǒng)控件。
一、引言
條形碼技術(shù)最早出現(xiàn)在上世紀(jì)40年代,但直到70年代左右它才得到實(shí)際應(yīng)用,而隨著現(xiàn)代電子技術(shù)和信息技術(shù)的發(fā)展,條形碼技術(shù)已經(jīng)被世界上的國家和地區(qū)普遍使用,并逐步滲透到多個(gè)技術(shù)領(lǐng)域。條形碼種類很多,常見的大概有二十多種碼制,其中包括:Code39碼(標(biāo)準(zhǔn)39碼)、Codabar碼(庫德巴碼)、Code25碼(標(biāo)準(zhǔn)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碼(商品條碼,用于在世界范圍內(nèi)唯一標(biāo)識(shí)一種商品。我們?cè)诔兄蓄常见的就是EAN和UPC條碼)、Code39碼(可表示數(shù)字和字母,在管理領(lǐng)域應(yīng)用最廣)、ITF25碼(在物流管理中應(yīng)用較多)、Codebar碼(多用于醫(yī)療、圖書領(lǐng)域)、Code93碼、Code128碼等。其中,EAN碼是當(dāng)今世界上廣為使用的商品條碼,已成為電子數(shù)據(jù)交換(EDI)的基礎(chǔ);UPC碼主要為美國和加拿大使用;Code39碼因其可采用數(shù)字與字母共同組成的方式而在行業(yè)內(nèi)部管理上被廣泛使用;Codebar碼則主要應(yīng)用于血庫、圖書館和照相館的業(yè)務(wù)流程中。
本文所述的條形碼控件目前只用于生成EAN-13碼,因?yàn)樗芎芎玫谋凰袟l形碼掃描槍兼容。
二、控件算法與設(shè)計(jì)
2.1設(shè)計(jì)需求:
2004年2月我們有一套軟件系統(tǒng)開發(fā)任務(wù),系統(tǒng)中要求能夠?qū)γ繌堅(jiān)O(shè)計(jì)圖紙(由AutoCAD繪制)發(fā)放唯一的圖號(hào),并能在日后對(duì)已發(fā)放圖號(hào)的圖紙進(jìn)行審核和管理。為了能夠唯一標(biāo)識(shí)圖紙,同時(shí)滿足方便電腦識(shí)別的要求,我們決定采用條形碼技術(shù)。EAN-13碼是我國目前用得極為普遍的條碼種類,其碼位數(shù)量符合我公司目前圖紙編號(hào)位數(shù),并能完整記錄我公司特殊的連圖號(hào)信息;同時(shí)又由于其對(duì)打印質(zhì)量要求不是很苛刻,現(xiàn)有打印設(shè)備即能滿足使用,最終在系統(tǒng)中采用了EAN-13碼。
2.2控件的算法實(shí)現(xiàn):
AUTOCAD是一個(gè)專業(yè)工程圖繪制軟件,其文件格式是目前工業(yè)電子文檔的事實(shí)標(biāo)準(zhǔn),但在其內(nèi)部并沒有集成條形碼生成功能,只能采用二次開發(fā)的方式來實(shí)現(xiàn)條形碼的生成及繪制。我們所做的就是把生成EAN-13碼的算法邏輯和AutoCAD繪制條形碼的過程封裝在一個(gè)外部函數(shù)庫(Barcode.dll)中,并將其分發(fā)給程序開發(fā)人員,使他們只需調(diào)用這個(gè)函數(shù)就能在AutoCAD中繪制條形碼,而不再需要考慮具體的條碼生成和繪制細(xì)節(jié)。
圖1
第一步,掌握EAN-13碼的編碼規(guī)則。EAN-13被稱為標(biāo)準(zhǔn)版的EAN條碼,其結(jié)構(gòu)如圖1所示,從左到右各部分依次為:左側(cè)空白區(qū)、起始符、左側(cè)數(shù)據(jù)符、中間分隔符、右側(cè)數(shù)據(jù)符、校驗(yàn)符、終止符、右側(cè)空白區(qū)。表1是各部分的信息,其中模塊數(shù)據(jù)值“1”表示黑條;“0”表示白空。表1
結(jié)構(gòu)名稱 | 所占模塊數(shù) | 模塊數(shù)據(jù)值 |
左側(cè)空白區(qū) | 9 | 無 |
起始符 | 3 | 恒為“101” |
左側(cè)數(shù)據(jù)符 | 42(6位數(shù)值,圖中的“2~7”) | 通過A方法或B方法計(jì)算 |
中間分隔符 | 5 | 恒為“01010” |
右側(cè)數(shù)據(jù)符 | 35(5位數(shù)值,圖中的“89012”) | 通過C方法計(jì)算 |
校驗(yàn)符 | 7(1位數(shù)值,圖中的最后一位“8”) | 后面有詳細(xì)說明 |
終止符 | 3 | 恒為“101” |
右側(cè)空白區(qū) | 9 | 無 |
在EAN-13碼中共113個(gè)模塊,每個(gè)模塊的寬度為0.33mm?倢挾葹37.29mm,其中條碼部分寬度為31.35mm?偢叨葹26.26mm,左、右側(cè)數(shù)據(jù)符高度為22.85mm(顯示碼值)或23.18mm(不顯示碼值);起始符、中間分隔符、終止符高度為24.50mm 。支持放大倍數(shù)為0.8 ~ 2倍。
EAN-13碼可記錄12位有效數(shù)據(jù),第13位為校驗(yàn)位(符),占7個(gè)模塊。我們把這12位有效數(shù)中的第1位稱為前置字符。前置字符用來確定左側(cè)數(shù)據(jù)符的數(shù)據(jù)值是通過“A”方法還是“B”方法來計(jì)算(見表1),而前置字符本身并不占用任何模塊(見圖1中的第一位“1”)。其余每位有效數(shù)據(jù)(共11位,左側(cè)數(shù)據(jù)符中有6位,右側(cè)數(shù)據(jù)符中有5位)各占7個(gè)模塊。
表2是前置字符與“A”“B”方法(左側(cè)數(shù)據(jù)符中每位數(shù)據(jù)值的計(jì)算方法)的對(duì)照表2
前置字符 | 每位數(shù)據(jù)值對(duì)應(yīng)的計(jì)算方法 | |||||
第一位 |
第二位 |
第三位 |
第四位 |
第五位 |
第六位 |
|
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行數(shù)據(jù),也就是左側(cè)數(shù)據(jù)符中第一位數(shù)值(“2”)應(yīng)通過“A”方法來計(jì)算…第五位數(shù)值(“6”)應(yīng)通過“B”方法來計(jì)算…
表3是不同的數(shù)值經(jīng)“A”、“B”、“C”三種方法計(jì)算出來的結(jié)果,其中“1”表示黑條;“0”表示白空。例如:左側(cè)數(shù)據(jù)符中第一位數(shù)值(“2”)通過“A”方法計(jì)算出來的結(jié)果為:“0010011”;右側(cè)數(shù)據(jù)符中第三位數(shù)值(“0”)通過“C”方法計(jì)算出來的結(jié)果為:“1110010”。
下面是計(jì)算校驗(yàn)位(符)模塊數(shù)據(jù)值的步驟:
①把12位有效數(shù)據(jù)值所有偶數(shù)位的數(shù)字代碼求和賦值a。
②將①中的a乘以3賦值a。
③把12位有效數(shù)據(jù)值所有奇數(shù)位的數(shù)字代碼求和賦值b。
④將a和b相加賦值c。
⑤取c的個(gè)位數(shù)d。
⑥校驗(yàn)位(符)數(shù)值=10 – d。
⑦使用“C”方法計(jì)算校驗(yàn)位(符)模塊數(shù)據(jù)值。
例:求“123456789012”的校驗(yàn)位(符),如圖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
⑥ 校驗(yàn)位(符)數(shù)值 = 10 – d = 8
⑦ 校驗(yàn)位(符)模塊數(shù)據(jù)值 = 1001000
表3
數(shù)值 | 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 |
請(qǐng)檢驗(yàn)一下,如圖1所示,“123456789012”的模塊數(shù)據(jù)值應(yīng)為:“10100100110111101001110101100010000101001000101010100100011101001110010110011011011001001000101”我們依次把這些數(shù)字中的“1”繪成一定尺寸(寬度和高度已在前面提過)的黑條;把數(shù)字中的“0”留出一定尺寸的白空也就繪出了相應(yīng)的條形碼。
第二步,設(shè)計(jì)產(chǎn)生模塊數(shù)據(jù)值的算法。依據(jù)以上規(guī)則,設(shè)計(jì)MAKECODE函數(shù),輸入12位阿拉伯?dāng)?shù)字,輸出其產(chǎn)生的模塊數(shù)據(jù)值,即由“0”和“1” 組成的字符串。將其作為繪制函數(shù)的輸入。
第三步,繪制條形碼。依據(jù)第二步中計(jì)算出的模塊數(shù)據(jù)值,在AutoCAD中繪制黑條和留出白空。我們使用了AutoCAD中的多段線(PLine)對(duì)象來繪制黑條,因?yàn)檫@種實(shí)體對(duì)象的長度和線粗等屬性都很好控制。之后還應(yīng)該考慮在相應(yīng)的位置繪出條形碼代表的字符值,以便人的識(shí)別。注意,我們使用的是AutoCAD2000版本,R14版以前的版本沒有提供VB的官方標(biāo)準(zhǔn)開發(fā)接口。
第四步,功能的完善。經(jīng)過第二、三步,我們已經(jīng)達(dá)到了繪制條形碼的最基本的要求,程序員可以輸入一個(gè)條形碼碼值作為函數(shù)Drawbar code的參數(shù),并調(diào)用這個(gè)函數(shù)來繪制對(duì)應(yīng)的條形碼。但這還不夠,我們應(yīng)考慮以指定的位置、比例、角度和顏色繪制條形碼的功能。為此給函數(shù)Drawbar code添加參數(shù)如下:draw Scale,獲取比例值、PTX,獲取起始位置的橫坐標(biāo)、PTY, 獲取起始位置的縱坐標(biāo)、nPI(可選參數(shù)),獲取旋轉(zhuǎn)角度、Show Value ,獲取是否要繪制條形碼碼值的信息、bColor,獲取顏色等。
三、設(shè)計(jì)過程中的關(guān)鍵問題:
1、微軟公司在其office系列中包含有一個(gè)簡單條形碼控件:Microsoft Access Barcode Control9.0(以下稱為:MSBCODE9),只要安裝了微軟的Access2000(Office2000 套件之一,其它版本不一定包含該控件)系統(tǒng)就會(huì)注冊(cè)該控件。該控件支持11種條形碼格式,只需把條形碼碼值賦給其“Value”屬性,該控件即可顯示相應(yīng)的條形碼。
我們最初有過這樣的思路:獲取用戶給出的條形碼碼值后,先用MSBCODE9得到相應(yīng)條形碼圖形,然后在AutoCAD中處理?xiàng)l形碼圖形。但MSBCODE9不具備類似圖片控件的屬性,無法簡單地把條形碼圖形拷貝出來,因此只能使用API函數(shù)BitBlt(該函數(shù)對(duì)指定的源設(shè)備環(huán)境區(qū)域中的像素進(jìn)行位塊轉(zhuǎn)換,以傳送到目標(biāo)設(shè)備環(huán)境)來拷貝MSBCODE9中的條形碼圖形,不過經(jīng)過考慮我們放棄了這種思路。首先,按上述思路產(chǎn)生的圖形屬于位圖而不是矢量圖,圖形中的黑條和白空尺寸不嚴(yán)格,從而繪制出的條形碼無法識(shí)別。其次,向AutoCAD中粘貼圖形時(shí),AutoCAD提供兩種方式,一種需要關(guān)聯(lián)到圖形文件,這肯定是不可取的;另一種是以O(shè)LE對(duì)象來處理圖形,但用這種方式無法對(duì)粘貼上去的圖形再進(jìn)行尺寸調(diào)整和角度旋轉(zhuǎn)。基于以上考慮,我們采用在CAD中直接繪制條碼,設(shè)計(jì)一個(gè)DRAWCODE函數(shù),根據(jù)條碼生成函數(shù)輸出的“0”、“1”字符串,依次在CAD繪出PLINE實(shí)體。
2、 任意角度的繪制條形碼。要求條形碼按一定角度繪制,需要把構(gòu)成條形碼的所有多段線和文字(碼值)對(duì)象都按一定角度傾斜繪出。圖2是表示條形碼
圖2
不旋轉(zhuǎn)(旋轉(zhuǎn)角度=0)時(shí)的樣子,注意,坐標(biāo)原點(diǎn)不是AutoCAD中坐標(biāo)系的(0,0)點(diǎn),而是用戶給函數(shù)Drawbar code的起始位置參數(shù)(PTX,PTY),表示條形碼應(yīng)該從什么地方開始繪制,函數(shù)Drawbar code的參數(shù)已在前面介紹過。圖2中箭頭所指處為文字“1”的起始位置M(a,b),下面我們以該點(diǎn)為例說明如何處理旋轉(zhuǎn)時(shí)的位置變化。如圖3所示,M點(diǎn)就是圖2中的M點(diǎn),為了方便說明,對(duì)其位置進(jìn)行了放大。條形碼以插入點(diǎn)O點(diǎn)(PTX,PTY)為圓心,逆時(shí)鐘旋轉(zhuǎn)一定角度后,M點(diǎn)的位置變?yōu)?M’(a’,b’),求出M’點(diǎn)的位置是解決這個(gè)問題的關(guān)鍵。設(shè)旋轉(zhuǎn)角度α,即∠BOP = α,從M’點(diǎn)向OP引垂線,垂足為:D,從M’點(diǎn)向坐標(biāo)軸線垂線,垂足分別為:B和C,從D點(diǎn)向橫坐標(biāo)引垂線,垂足為:A,DA與CM’垂直相交于點(diǎn)E。因M’點(diǎn)由M點(diǎn)旋轉(zhuǎn)而來,所以DM’ = b, OD = a。容易求出∠ADM’ = ∠AOD =α,因此AB = EM’ = DM’ * Sinα = bSinα;OA = OD * Cosα = aCosα,OB = aCosα + bSinα。用類似的方法可以求出:OC = aSinα – bCosα。而線段OB和OC的長度剛好是M’點(diǎn)的坐標(biāo)值a’和b’。這樣,我們就得到了條形碼中任一點(diǎn)M(a,b)以插入點(diǎn)為圓心,旋轉(zhuǎn)某一角度α后,該點(diǎn)相對(duì)于插入點(diǎn)的新的位置M’(a’,b’)的計(jì)算公式:
圖3
M’點(diǎn)在AutoCAD中的具體位置為:M’(PTX + aCosα + bSinα,PTY + aSinα – bCosα)。計(jì)算出M’點(diǎn)的位置后,實(shí)現(xiàn)繪制任意旋轉(zhuǎn)角度的條形碼的功能就不再困難。
四、結(jié)束語:
使用條形碼繪制控件后,程序開發(fā)人員在AutoCAD中繪制條形碼變得非常簡單,只需確定條形碼碼值、插入位置、圖形比例和旋轉(zhuǎn)角度等基本信息,剩下的工作全部由控件來完成。該條形碼控件目前在企業(yè)的《圖號(hào)自動(dòng)生成及管理系統(tǒng)》項(xiàng)目中運(yùn)行良好,取得較好的效果,達(dá)到預(yù)期目的。
- 生活中處處創(chuàng)意條形碼圖片集 2013/7/3
- 條碼與其他自動(dòng)識(shí)別技術(shù)的比較 2013/7/3
- 訊寶MC3000條碼采集器終端評(píng)測(cè) 2013/7/3
- 教您使用CorelDRAW軟件制作條形碼 2013/7/3
- 條形碼技術(shù)的識(shí)別原理是什么 2013/7/3
- 條形碼技術(shù)引入安全管理系統(tǒng)方案 2013/7/3
- 日本設(shè)計(jì)師條形碼照亮條碼光芒 2013/7/3
- 關(guān)于商品條形碼Ean碼的一些知識(shí) 2013/7/3
- 條形碼技術(shù)的相關(guān)編程實(shí)例 2013/7/3
- 常見一維條形碼特點(diǎn)以及應(yīng)用 2013/7/3
推薦:閱讀了本文的人,還閱讀了如下部分相關(guān)內(nèi)容: