久久中文视频-久久中文网-久久中文亚洲国产-久久中文字幕久久久久-亚洲狠狠成人综合网-亚洲狠狠婷婷综合久久久久

Rss & SiteMap

曙海教育集團(tuán)論壇 http://www.bjzhda.cn

曙海教育集團(tuán)論壇
共1 條記錄, 每頁(yè)顯示 10 條, 頁(yè)簽: [1]
[瀏覽完整版]

標(biāo)題:Protel99原理圖顯示庫(kù)的開發(fā)

1樓
wangxinxin 發(fā)表于:2010-11-29 12:07:12
摘要:電路原理圖的顯示是開發(fā)電路故障診斷等軟件中的關(guān)鍵技術(shù)。本文利用Visual C++6.0和面向?qū)ο蠓椒ㄩ_發(fā)了Protel99原理圖顯示庫(kù)。在分析Protel99原理圖文件的格式的基礎(chǔ)上,詳細(xì)描述了顯示庫(kù)的主要的類和方法函數(shù)的設(shè)計(jì)原理。顯示庫(kù)在某電源測(cè)試臺(tái)軟件中得到成功的應(yīng)用,稍作修改,便可用于其它矢量圖形的顯示,如AutoCAD圖形。

關(guān)鍵詞: Protel99;原理圖;Visual C++;面向?qū)ο?/p>

 1 引言

在進(jìn)行電路故障診斷等軟件設(shè)計(jì)時(shí),會(huì)遇到電路圖的顯示、拓?fù)浞治龅葐栴}。在自己的程序中,直接實(shí)現(xiàn)上述功能是不現(xiàn)實(shí)的。Protel99是國(guó)內(nèi)使用非常廣泛的電路圖的繪制工具,于是筆者開發(fā)了Protel99原理圖顯示庫(kù),該顯示庫(kù)讀取Protel99生成的原理圖文件,完成電路圖的顯示、拓?fù)浞治龅裙δ,為測(cè)試人員提供盡可能多的測(cè)試信息,引導(dǎo)測(cè)試人員進(jìn)行故障隔離定位及元件的檢測(cè)、方便電路的維修。具體如下:①讀取Protel99原理圖文件,轉(zhuǎn)變?yōu)樽远x格式的原理圖文件,并顯示;②實(shí)現(xiàn)了電路圖的自由縮放、元件和電氣節(jié)點(diǎn)的點(diǎn)選、定位和屬性的設(shè)置;③查詢和導(dǎo)出電路圖的網(wǎng)表。

2 Protel99原理圖顯示庫(kù)的開發(fā)

Protel99原理圖顯示庫(kù)需要把Protel99原理圖文件轉(zhuǎn)換成自定義格式的原理圖文件,因此先介紹Protel99原理圖的文件格式。

2.1  Protel99原理圖的文件格式

Protel99原理圖文件(SCH)是Protel99存儲(chǔ)原理圖的格式,存儲(chǔ)了許多供Protel99使用的信息,通常是以二進(jìn)制格式存放的,格式比較復(fù)雜,所以首先把SCH格式轉(zhuǎn)換為ASC格式。ASC格式是文本文件,簡(jiǎn)明易讀,包含了構(gòu)造自定義格式原理圖所需的所有信息。文本文件中每一行表達(dá)一個(gè)確定的信息,對(duì)于一行而言,每個(gè)字符串之間是用空格隔開的。Protel99原理圖文件(ASC)的基本結(jié)構(gòu)如下:

(1)[Font_Table]區(qū)段

定義原理圖文本顯示使用的字體。

(2)Library……EndLibrary區(qū)段

定義元件庫(kù),每個(gè)庫(kù)用“Component…EndComponent”描述,包含了該元件庫(kù)的信息:庫(kù)的描述、庫(kù)名、庫(kù)的組成元素(用“Part…EndNormalPart”段描述)。本區(qū)段有很多信息僅供Protel99使用的,可以忽略。

(3)[Sheet……EndSheet]區(qū)段

原理圖中元素的描述。位于緊接Sheet后的一行是描述頁(yè)面(頁(yè)面的尺寸,背景顏色,是否顯示網(wǎng)格等)的;Template…EndTemplate描述原理圖的模板(標(biāo)簽,線條,圖標(biāo)等);位于EndTemplate之后的內(nèi)容描述原理圖的中的元素(元件、導(dǎo)線、總線、網(wǎng)絡(luò)標(biāo)簽等)。本區(qū)段有很多信息僅供Protel99使用的,可以忽略。

2.2  Protel99原理圖顯示庫(kù)的類的設(shè)計(jì)

VisualC++ 是面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,其MFC封裝了幾乎所有的WINDOWS API函數(shù),提供了完善的圖形繪制能力,可以繪制原理圖中的各種圖形元素,如矩形、點(diǎn)、線等。

分析可知,Protel99原理圖是由以下圖形元素組成的,直線、連續(xù)直線及多邊形區(qū)域、橢圓及橢圓區(qū)域、矩形及矩形區(qū)域、圓弧及橢圓弧、文本等,Protel99原理圖文件中已包含了各種圖形元素的具體參數(shù)和組織方式。在了解了Protel99原理圖的文件格式之后,就可以進(jìn)行類的設(shè)計(jì)。設(shè)計(jì)的思想是面向?qū)ο蠛蚉rotel99原理圖的文件格式相結(jié)合的方法。主要設(shè)計(jì)了如下幾個(gè)類:

2.2.1  圖形元素基類(CDrawElement)

對(duì)各類圖形元素進(jìn)行分析,可以發(fā)現(xiàn)各類圖形元素具有一些相同的屬性和操作功能,如圖形元素的顏色、線型、線寬等和繪制圖形元素等操作。把各類圖形元素中共性的屬性和操作放在圖形元素基類(CDrawElement)中,具體的圖形元素類(圓弧類、多邊形類等)由這個(gè)類派生,不再一一贅述。

class CDrawElement : public CObject 

{  long m_lColorPen;  //筆色                 

short m_sLineWide;          //線寬(像素)

………//其它屬性  

void CalNewCoordinate(BOOL bMir, short sOriCom, int nComX, int nComY,

int nX,int nY,int *nNewX, int *nNewY);// 計(jì)算絕對(duì)坐標(biāo)函數(shù),參數(shù)依次為:元件鏡像否、

          //元件的方向、元件的起點(diǎn)坐標(biāo)XY、原始坐標(biāo)XY、絕對(duì)坐標(biāo)XY指針

          //根據(jù)所屬元件的位置屬性和本元素的相對(duì)坐標(biāo)計(jì)算本元素的絕對(duì)坐標(biāo)

virtual void Draw(CDC *pDC, BOOL bMirrored,       short sOrientation, int nComX, int nComY,)=0;

//繪制元素的純虛函數(shù),參數(shù)依次為:繪圖設(shè)備上下文指針、元件鏡像否、元件的方向、

//元件的起點(diǎn)坐標(biāo)XY

virtual BOOL ReadWriteFile(CFile *file, BOOL bWrite);

//存儲(chǔ)或讀取自定義矢量原理圖二進(jìn)制文件

………//其它方法};

說明:①該類是各個(gè)具體的圖形元素類的基類;②如果該類的派生類元素包含在某一元件庫(kù)中(如管腳Pin類),該元素的坐標(biāo)是相對(duì)坐標(biāo)(相對(duì)于所屬元件起點(diǎn)坐標(biāo)的坐標(biāo)),該元素的絕對(duì)坐標(biāo)是根據(jù)所屬元件的位置屬性(起點(diǎn)、方向、是否鏡像)和本元素的相對(duì)坐標(biāo)計(jì)算得出的;如果該類的派生類元素直接包含在原理圖中(如導(dǎo)線Wire類),則該元素的坐標(biāo)就是絕對(duì)坐標(biāo);③該類中定義了繪制元素的純虛函數(shù),以便在其派生類中實(shí)現(xiàn)多態(tài),繪制不同的元素,如直線、圓弧等;④ReadWriteFile是存取自定義格式二進(jìn)制文件,本類僅存取公共屬性,而派生類中不僅存取公共屬性而且存取各類元素特有的屬性。

2.2.2  元件類(CComponentSche)

分析Protel99原理圖文件可知,各個(gè)元件的信息是這樣組織的,元件的繪制信息,即元件的組成元素,如:管腳、直線、多邊形等,是存放在元件庫(kù)中的,其它信息,如元件的起點(diǎn)坐標(biāo)、元件庫(kù)的索引、元件名稱等是單獨(dú)存放的。本文設(shè)計(jì)了元件庫(kù)類(CComLibSche)和元件類(CComponentSche),元件庫(kù)類(CComLibSche)見2.2.3。

元件類(CComponentSche)派生于CObject,封裝了元件的起點(diǎn)坐標(biāo)、元件庫(kù)的索引、元件名稱等屬性和元件的繪制(結(jié)合對(duì)應(yīng)的元件庫(kù))、屬性的存取、元件的點(diǎn)選、得到元件的邊界矩形等操作,類代碼從略。下面給出元件的繪制的算法:

void CComponentSche::Draw(CDC *pDC)

{    CComLibSche  *pComLib;// 元件庫(kù)指針

根據(jù)本元件的元件庫(kù)的索引得到相應(yīng)的元件庫(kù)并把地址賦給pComLib;

pComLib->Draw(pDC,m_bMirrored,m_sOrientation,m_nX,m_nY);

//把繪圖設(shè)備上下文指針、鏡像否、方向、起點(diǎn)坐標(biāo)等參數(shù)傳遞給

//元件庫(kù)的繪制函數(shù),讓元件庫(kù)完成元件的繪制。

繪制元件名稱;       

繪制元件型號(hào);

根據(jù)本元件的選中狀態(tài),繪制邊界矩形;}

2.2.3  元件庫(kù)類(CComLibSche)

派生于CObject,封裝了該類元件的組成元素(如:管腳、直線、多邊形等,各類圖形對(duì)象按照數(shù)組的形式組織)、元件庫(kù)的索引等屬性和該類元件的繪制等操作,類代碼從略。下面給出該類元件的繪制的算法:

void CComLibSche::Draw(CDC *pDC, BOOL bMirrored, short sOrientation,

int nComX, int nComY)// 參數(shù)依次為:繪圖設(shè)備上下文指針、元件鏡像否、

//元件的方向、元件的起點(diǎn)坐標(biāo)XY

{    n=GetPinNums();//得到管腳對(duì)象數(shù)組中元素的個(gè)數(shù)

while(n--){  CPinElement* pPin;//管腳類指針

pPin =GetPin(n)//從管腳對(duì)象數(shù)組中得到一個(gè)管腳對(duì)象

pPin ->Draw(pDC,bMirrored,sOrientation,nComX,nComY);

//把繪圖設(shè)備上下文指針、元件鏡像否、元件的方向、元件起點(diǎn)坐標(biāo)XY等參數(shù)

//傳遞給管腳類的繪制函數(shù),讓管腳類完成管腳的繪制。

}

………//完成其它各類圖形對(duì)象的繪制}

說明:元件庫(kù)類(CComLibSche)的設(shè)計(jì)充分體現(xiàn)了面向?qū)ο蟮姆庋b特性。元件庫(kù)的管理機(jī)制體現(xiàn)在分層上,元件庫(kù)類(CComLibSche)只是封裝了各類圖形對(duì)象,不直接管理到每個(gè)圖形,各類圖形對(duì)象的操作(如:繪制、屬性的存取等)由各類圖形對(duì)象類具體負(fù)責(zé)。這種分層結(jié)構(gòu)帶來了程序設(shè)計(jì)和管理上的便利,分層結(jié)構(gòu)是本顯示庫(kù)設(shè)計(jì)的特色之一,原理圖類(CSCheFigure)的設(shè)計(jì)也用到了這種結(jié)構(gòu),見2.2.4的算法示例。

2.2.4  原理圖類(CSCheFigure)

派生于CObject,封裝了Protel99原理圖顯示庫(kù)的所有功能,是該顯示庫(kù)的對(duì)外接口,包含了原理圖中的相應(yīng)元素,如:元件庫(kù)、元件、電氣節(jié)點(diǎn)、字體表、圖紙等。類代碼如下:

class __declspec(dllexport) CSCheFigure : public CObject 

{CTypedPtrArray<CObArray,CComLibSche*>m_ComLibArray;//元件庫(kù)對(duì)象指針數(shù)組

CTypedPtrArray<CObArray,CComponentSche*>m_ComponentArray; //元件對(duì)象指針數(shù)組

CTypedPtrArray<CObArray,CNetNodeGroup*>m_NetGroupArray; //電氣節(jié)點(diǎn)對(duì)象指針數(shù)組

float m_fScale,; //比例尺

………//其它屬性               

BOOL WriteSSS(CString strSSSFile);//把CSCheFigure對(duì)象的信息寫入自定義矢量原理圖二進(jìn)制文件

BOOL ReadProtel(CString strSchFile);//讀取Protel99原理圖文本文件ASC,初始化CSCheFigure對(duì)象

void Draw(CDC *pDC);//繪制原理圖

………//其它方法};

下面給出本類中一些函數(shù)的算法:

(1)ReadProtel函數(shù)的算法

BOOL CSCheFigure::ReadProtel(CString strSchFile)

{ 打開文件strSchFile;

跳過文件頭;

生成字體表;

依次生成各個(gè)元件庫(kù)對(duì)象,并添加到元件庫(kù)對(duì)象數(shù)組;

生成頁(yè)面對(duì)象;

根據(jù)讀到的字符串,生成各個(gè)對(duì)象(如元件、導(dǎo)線、網(wǎng)絡(luò)標(biāo)簽、標(biāo)簽等),并添加到相應(yīng)對(duì)象數(shù)組;

跳過"Version 2.0 Sheet"行及以后內(nèi)容;

關(guān)閉文件strSchFile;

合并各個(gè)導(dǎo)線(Wire)、連接點(diǎn)(Junction)和電源端口(PowerObject) 對(duì)象,依次生成各個(gè)電氣節(jié)點(diǎn)對(duì)象,并添加到電氣節(jié)點(diǎn)對(duì)象數(shù)組;

return TRUE;}

(2)原理圖繪制函數(shù)的算法

void CSCheFigure::Draw(CDC *pDC)

{    m_pSheetType->Draw(pDC);//m_pSheetType為圖紙對(duì)象指針,繪制圖紙

n= GetComponentNums ();//得到元件對(duì)象數(shù)組中元素的個(gè)數(shù)

while(n--){    CComponentSche* pCom;// 元件類指針

pCom =GetComponent(n)//從元件對(duì)象數(shù)組中得到一個(gè)元件對(duì)象

pCom -> Draw(pDC); //繪制元件對(duì)象

}

………//完成其它各類圖形對(duì)象的繪制}

(3)WriteSSS函數(shù)的算法

BOOL WriteSSS(CString strSSSFile)

{    CFile file;

if(!file.Open(strDesFile,CFile::modeCreate|CFile::modeWrite,NULL))

return FALSE;

n= GetComponentNums ();//得到元件對(duì)象數(shù)組中元素的個(gè)數(shù)

file.Write((unsigned char *)&n,sizeof(int));

………//把其它對(duì)象數(shù)組中元素的個(gè)數(shù)寫入file

n= GetComponentNums ();//得到元件對(duì)象數(shù)組中元素的個(gè)數(shù)

while(n--){    CComponentSche* pCom;// 元件類指針

pCom =GetComponent(n)//從元件對(duì)象數(shù)組中得到一個(gè)元件對(duì)象

pCom -> ReadWriteFile(&file,TRUE); //把元件對(duì)象的信息寫入file

}

………//把其它各類對(duì)象的信息寫入file

file.Close();

return TRUE;}

其它類的設(shè)計(jì),如:字體類、圖紙類等,不再一一贅述。

2.2.5  坐標(biāo)的轉(zhuǎn)換和圖形的縮放

Protel99使用的坐標(biāo)系是數(shù)學(xué)坐標(biāo)系,坐標(biāo)原點(diǎn)位于原理圖的左下角,以像素為單位,向右為X軸正方向,向上為Y軸正方向。為方便起見,本顯示庫(kù)采用的Windows映像方式為MM_TEXT,因?yàn)镸M_TEXT方式的坐標(biāo)也是以像素為單位。但是在MM_TEXT方式下,屏幕(窗口)的原點(diǎn)在左上角,而X和Y的正方向分別是向右和向下,所以必須進(jìn)行坐標(biāo)的轉(zhuǎn)換。為完成圖形的縮放,需要定義一個(gè)比例尺m_fScale,該比例尺記錄的是一個(gè)顯示坐標(biāo)單位所代表的實(shí)際坐標(biāo)數(shù)值。

確定比例尺的算法:

float fScale1;

fScale1=(float)(原理圖實(shí)際寬度/當(dāng)前視圖的寬度);

m_fScale=(float)(原理圖實(shí)際高度)/(當(dāng)前視圖的高度);

if(fScale1>m_fScale)    m_fScale=fScale1;

實(shí)際坐標(biāo)轉(zhuǎn)變?yōu)轱@示坐標(biāo)的算法:

顯示坐標(biāo)X=(int)(實(shí)際坐標(biāo)X/m_fScale);

顯示坐標(biāo)Y =(int)( (原理圖實(shí)際高度-實(shí)際坐標(biāo)Y)/m_fScale);

顯示坐標(biāo)轉(zhuǎn)變?yōu)閷?shí)際坐標(biāo)的算法(略)

本顯示庫(kù)把上述算法封裝在原理圖類(CSCheFigure)中,需要坐標(biāo)轉(zhuǎn)換時(shí)只要調(diào)用原理圖類的函數(shù)即可。

 3結(jié)論

     本文介紹了Protel99原理圖顯示庫(kù)開發(fā)中的關(guān)鍵技術(shù)。本顯示庫(kù)是使用Visual C++開發(fā)的,采用面向?qū)ο蟮脑O(shè)計(jì)方法,提高了代碼的可重用性;忽略了Protel99原理圖文件中一些不必要的信息;能夠用于需要顯示Protel99原理圖的軟件中,用戶也可以根據(jù)功能的需要進(jìn)行擴(kuò)充。在某電源測(cè)試臺(tái)軟件中Protel99原理圖顯示庫(kù)得到成功的應(yīng)用,取得了滿意的效果,如圖1所示。本顯示庫(kù)稍作修改,便可用于其它矢量圖形的顯示,如AutoCAD圖形。

  

圖1  Protel99原理圖顯示庫(kù)在某電源測(cè)試臺(tái)軟件中的應(yīng)用

共1 條記錄, 每頁(yè)顯示 10 條, 頁(yè)簽: [1]

Copyright © 2000 - 2009 曙海教育集團(tuán)
Powered By 曙海教育集團(tuán) Version 2.2
Processed in .03125 s, 2 queries.
主站蜘蛛池模板: 日本无卡码免费一区二区三区 | 一区二区三区伦理 | 亚洲精品综合一二三区在线 | 一级高清毛片免费a级高清毛片 | 美女把张开腿男生猛戳免费视频 | 香蕉成人国产精品免费看网站 | 亚洲国产成人久久一区www | 亚洲国产一级毛片 | 国产男女爽爽爽爽爽视频 | 欧美成人免费观看国产 | 欧美国产精品一区二区免费 | 欧美一区二区在线 | 久久亚洲精品视频 | 精品欧美一区二区在线观看欧美熟 | 国产91精品高清一区二区三区 | 亚洲a级片在线观看 | 免费人成黄页网站在线观看国产 | 久久人人草 | 日韩欧美视频一区二区在线观看 | 亚洲图片视频在线观看 | a级国产精品片在线观看 | 亚洲日本一区二区三区 | 久久综合免费视频 | 欧美成免费 | 国产毛片精品 | 欧美日韩亚洲第一页 | 高清日本在线成人免费视频 | 免费一级成人毛片 | 萌白酱香蕉白丝护士服喷浆 | 美女在线网站免费的 | 成人免费一级毛片在线播放视频 | 又黄又爽又刺激的视频 | 国产精品亚洲专区在线播放 | 美女131爽爽爽做爰中文视频 | 欧美深夜影院 | 欧美另类videosbestsex久久 | 免费在线观看a | 在线观看国产一区二三区 | 亚洲天堂伊人 | gay毛片| 久久综合狠狠综合久久97色 |