成人在线视频爽爽爽,手机在线观看国产巨作AV,91免费看 日韩一区二区,国产91av视频,中文字幕乱妇无码AV在线,久久精品无码一区二区日韩av,久久精品成人免费观看三,中文无码久久精品,97天天日,美女天天干天天操,97干,亚洲国产精品成人综合久久,日韩精品久久久免费观看夜色,亚洲三区电影,日韩永久免费69页在线观看,日韩国产中文字幕在线观看,日本不卡dvd在线视频

AUTOCAD中條形碼生成控件的設(shè)計(jì)

2013-7-3 17:10:25

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ù)期目的。



關(guān)閉
138-2377-4796 工作時(shí)間:
上午8:30-12:00
下午13:30-18:30