摘 要:為了提高標牌行業中繪制標牌的工作效率,操作流程的標準化,研究標牌參數化繪制方法及技術,結合ObjectARX2008與Visual Studio 2008中的C#進行了Auto CAD的二次開發。詳細闡述了標牌參數化繪圖系統的結構、設計流程以及應用設計結果進行參數化繪圖的過程,使標牌企業繪制人員在繪制的過程中,只需輸入必要參數就可以由計算機自動生成所要繪制的標牌。只要調整必要的參數就可以實現標牌的動態修改,從而大大提高了工作效率并擴展了CAD二次開發的范圍。關鍵詞:ObjectARX; AutoCAD二次開發; 標牌; 參數化繪制
中圖分類號:TN874-33; TP39172文獻標識碼:A
文章編號:1004-373X(2010)16-0184-04
Research of ObjectARX-Based Parameterization Drawing Method for Scutcheons
YU Xiao-rong
(Computer Science Engineering College, Jiangsu University of Science and Technology, Zhenjiang 212003, China)
Abstract: In order to improve the efficiency of the scutcheon drawing in the sign industry and achieve the standardization of operational process, the parameterization drawing method and technology are researched. Thecustomised secondary deve-lopment of AutoCAD was performed in the combination with ObjectARX2008 and C# in Visual Studio 2008. The structure of the parameterization cartography system, the design flow and the process of the parameterization cartography using the design result are elaborated. In the process of drawing, the scutcheons are automatically generated with the necessary parameters inputted into a computer directly, and moreover, the dynamic modification of scutcheons can also be achieved by adjusting the parameters. The actual applications show that the proposed method can greatly improve the working efficiency. The scope of AutoCAD secondary developmen is extended by employing the method.
Keywords: ObjectARX; AutoCAD secondary development; scutcheon; parameterization drawing
0 引 言
儀器儀表標牌是標牌行業的重要組成部分,無錫宜興的標牌企業對標牌的繪制在國內占有了很大市場,其中一家標牌企業在20多年的發展中已繪制過十幾萬種標牌,主要是儀器儀表標牌,在儀器儀表標牌中壓力表比重也很大,而壓力表的繪制方法在溫度表、百分表、冷媒表等類型標牌的繪制中完全適用。無錫宜興主要的標牌企業在80年代采用手工繪制,從90年代到現在則使用專用軟件進行繪制。AutoCAD軟件已出現了十幾年,但并沒有在標牌企業中流行起來,但由于儀器儀表標牌的特殊性,操作起來很復雜,很不方便,很耗時間,所以這些標牌企業仍然使用十幾年前開發的軟件。
但現在使用十幾年前開發的軟件存在很大的問題,由于軟件開發年代的限制,操作的復雜性相對較大,一個新的員工完全熟悉該軟件需要半年時間;在熟悉軟件的情況下,繪制一個標牌的時間還是相對較長,離真正自動繪制還有一段距離,應該說是半自動的方式;最主要的是繪制好的標牌參數不能同時保存,造成了修改的困難;而且鼠標的操作方式和現在的軟件有很大的區別,不太方便。參數化設計軟件屬于專業應用軟件,開發這種軟件需要在繪圖支撐軟件的基礎上進行[1]。由于AutoCAD具有功能強大,易用性好,運行穩定,用戶多等特點,是二次開發的理想平臺[2],根據標牌繪制的現狀,本文對壓力表標牌在AutoCAD中的參數化繪制進行了研究,目的是為了減少繪制標牌的復雜度,縮短新員工的軟件培訓時間;增加標牌繪制的自動化程度,通過輸入必要的參數,加快標牌繪制的速度。參數化設計是基于約束的產品建模方法,用約束描述產品的形狀特征,通過改變約束(主要是尺寸約束)來獲取不同的產品設計方案[3];增加標牌的動態修改功能。
1 系統流程
系統采用ObjectARX[4]程序設計方法來實現,并結合Visual Studio 2008的C#進行二次開發。ObjectARX編程的一大特點是圖形數據庫的功能,在繪制對象的同時可以將繪制該對象相關的參數保存到專門的數據庫中[5],在下次選擇對象的同時得到保存的參數,修改參數后可以修改該對象。
因此本文使用ObjectARX在實現繪制的同時,更主要的是實現方便的修改功能[6]。
本文是以壓力表模塊為研究實例,識別壓力表模塊標牌的通用參數,分別開發繪制圓弧,繪制均分的刻度,繪制刻度值,繪制按角度偏轉的線形刻度,繪制按相對位置偏移的線形刻度等功能,用參數化的方式自動繪制出壓力表標牌。本系統的優點是解決現有繪制方法繪制標牌操作復雜、繪制耗時的問題,提高了工作效率。繪制的步驟如圖1所示。
圖1 繪制步驟圖示
首先用戶根據要繪制的壓力表標牌的弧的參數,先輸入到繪制圓弧的窗口中,生成弧,將弧的參數寫入圖形數據庫中,再根據標牌中刻度的均分與否,進入相應的繪制窗口。如果是均分刻度,進入“繪制均分刻度”窗口,選擇刻度方向,輸入刻度的旋轉參數,均分格數等,所有的刻度將添加到AutoCAD窗口中。在AutoCAD中如果線段的寬度達到一定的值,會出現線段兩端是圓頭的情況,這樣出圖照排出來是不合格的,所有在繪制均分刻度包括后面的不均分刻度都轉換成了多段線[7]。如果是不均分刻度,由于繪制標牌的企業收到的刻度參數表有2種情況,直接根據角度旋轉的刻度作為參數,還有根據某一固定的、均分弧的刻度中偏移倍數作為參數,用戶可以分別進入相應的界面進行操作。與均分刻度的區別在于不均分需要用戶依次將不同角度或偏移值的刻度加入下方的列表框中,可以一次性加好,也可以分次操作,加好后添加到AutoCAD窗口中;為了方便用戶的操作,加快繪制速度,在增加不均分刻度的同時,還可以輸入刻度值的參數,將刻度與刻度值一起繪制出來。完成刻度繪制后,進入繪制刻度值的窗口,選擇或輸入刻度值的參數,刻度值也分為按角度均分旋轉和不規則角度2種。兩者的區別在于均分刻度值的參數一次性生成在列表框中,不規則角度的刻度值依次輸入到列表框中,輸入好后生成標牌的刻度值。以上操作都將對象所有的參數寫入圖形數據庫中,當鼠標選擇了任意對象,根據對象的類型,自動將參數顯示在相對應的窗口中,修改參數后選擇“修改”按鈕,可實現動態的修改對象[8]。壓力表標牌中有多條不同半徑弧的時候,重復以上步驟。系統界面主要有繪制圓弧,繪制均分的刻度,繪制刻度值,繪制按角度偏轉的線形刻度,繪制按相對位置偏移的線形刻度等。繪制圓弧的界面如圖2所示,繪制均分刻度如圖3所示,圓弧的起點角度和終點角度與刻度線的起終角度不一定一樣,因為刻度線不一定布滿整個圓弧,根據刻度線均分格數、短刻度間隔就確定了長短刻度線的多少,而且在同一條圓弧上可以加幾種均分刻度,也可以均分與不均分刻度混合。
圖2 繪制圓弧
圖3 繪制均分的刻度
繪制刻度值的界面如圖4所示,刻度值不一定總是垂直的,也有對準中心點的方向,也有特殊的刻度值偏轉某一角度,刻度值也分為均分和不均分兩種。由均分刻度值設置起終點角度,起終點數值、步長值就可以一次性添加到下面的列表框中,有多少個刻度值就有多少行,對于有些標牌來說,總共50個刻度值,48個刻度值是均分的,有2個刻度根據儀表的要求要偏一點點,把該標牌歸類到不均分的刻度值中不太合適,并且操作起來不方便了,需要將50個刻度值逐個地添加到列表框中,浪費時間。對于此類標牌同樣按均分的方法來操作,當50個刻度值參數自動添加到列表框中時,再個別修改其中的兩行,改變偏轉角度等參數就可以了。壓力表標牌或類似壓力表標牌中刻度不均分的情況是很多的,不均分的刻度參數表有兩種情況,直接根據角度旋轉的刻度,還有根據某一固定的、均分的弧的刻度的偏移倍數作為參數,2種方法界面類似,只列出第2種,第1種情況直接根據角度旋轉,第2種情況先根據預設的偏轉角度換算成整數偏移值,再根據每個刻度的偏移值進行計算,得到真實偏轉角度后進行旋轉。有些標牌長刻度線是不均分的,但短刻度線在長刻度線之間又是均分的,如果將全部刻度按照不均分的方式逐個添加到列表框中無疑是浪費時間,通過選擇短刻度在長刻度之間等分可以自動在長刻度線中均分繪制短刻度,提高了工作效率。在繪制刻度的同時,由于刻度值與刻度有相應的對應關系,可以同時繪出刻度值。繪制不均分的刻度如圖5所示。
圖4 普通場間行內插
圖5 繪制不均分的刻度
2 實現壓力表模塊自動繪圖的關鍵技術
2.1 刻度值的定位
儀表標牌的一個重要特征就是精確,刻度、刻度值的定位一定要準確,否則貼到儀表上可謂“失之毫厘,謬之千里”,自動繪制時間加快了,如果不精確,不如回到手工的繪制方式去。AutoCAD中插入多行文字的定位點是多行文字的左上角,根據圖紙,標牌刻度值的插入位置一般都正對著刻度線的方向,除非有特殊的調整,刻度值距離弧線的位置是固定的,如圖6所示。
圖6 刻度值的位置
如果按照AutoCAD默認的左上角分別旋轉繪制刻度值就會發現,從弧的一側第一個刻度值的位置到另一側最后的刻度值離弧線的距離從小變大再從大變小,大部分刻度值距離弧線的位置都不對,如圖7所示。出現這種情況的原因就是AutoCAD默認的左上角點插入方式,解決問題的方法就是找到多行文字的中心點,再進行旋轉,這樣每個刻度值相對弧線的位置就不變了,如圖8所示。算法如下:
MText.Location.x=MText.Location.x-(MText.MaxPoint。x-MText.MinPoint.x)/2
MText.Location.y=MText.Location.y+(MText.MaxPoint。y-MText.MinPoint.y)/2
關鍵代碼如下:
Extents3d ext=mtext.GeometricExtents;
double loc1=(ext.MaxPoint.X-ext.MinPoint.X)/2;
double loc2=(ext.MaxPoint.Y-ext.MinPoint.Y)/2;
location=new Point3d(polarPoint.X-loc1,polarPoint.Y+loc2,0);
mtext.Location=location;
圖7 調整前的刻度值
圖8 高速后的刻度值
2.2 圓弧轉換為多段線
由于標牌要求圓弧的起點和終點不能是圓頭的情況,需要將圓弧按多段線繪制,由于圓弧多段線的繪制涉及到起點坐標和終點坐標,但這些坐標開始是沒有的,只有圓弧的起始終止角度、半徑、線粗等參數,解決方法是先繪制圓弧,再轉換為多段線。關鍵代碼如下:
Arc arcEnt=new Arc(centerPoint,radius,startAngle*PI/180.0f,endAngle*PI/180.0f);
Polyline polylineEnt=new Polyline();
Point3d p1=arcEnt.StartPoint;
Point3d p2=arcEnt.EndPoint;
Point2d[] pt=new Point2d[2];
pt[0]=new Point2d(p1.X,p1.Y);
pt[1]=new Point2d(p2.X,p2.Y);
Point2dCollection pts = new Point2dCollection(pt);
Double bulge=Math.Tan((arcEnt.Length/arcEnt.Radius)/4);
for(int i=0;i { polylineEnt.AddVertexAt(i, pts[i],bulge,lineWidth,lineWidth); } 2.3 對象的遍歷修改問題 在繪制壓力表模塊標牌的同時,需要將繪制的參數存入CAD文件自帶的圖形數據庫中,目的是為了以后查看和修改參數,在此所要做的第一件事情就是將各種對象類型和對象組編號,制作對象類型表和對象組表,用于選擇對象時對象遍歷的識別。對于單個對象,比如圓弧,一個組就一個對象,參數的保存和調出顯示只要根據對象編號就可以,對于對象組,比如刻度組或刻度值組,在繪制刻度時要同時將繪制的刻度放在一個組內,存入圖形數據庫[9],便于刻度的整體修改,當需要修改時,選擇組內的任何一個刻度,得到該刻度的組編號,再遍歷將同組中所有刻度的參數全部顯示出來,修改后完成組的更新。關鍵代碼如下: PromptSelectionResult sel=ed.SelectImplied(); if (sel.Status==PromptStatus.OK) { ObjectId[] id=sel.Value.GetObjectIds(); ResultBuffer xDataOut=id[0].GetXData(appName); TypedValue[] xdata=xDataOut.AsArray(); int type=Convert.ToInt32(xdata[1].Value.ToString());//得到對象類型 switch(type) { case 1://刻度均分 groupScaleValueID=xdata[2].Value.ToString();//得到刻度組編號 Database db=HostApplicationServices.WorkingDatabase; using (Transaction trans=db.TransactionManager.StartTransaction()) { DBDictionary dict=(DBDictionary)trans.GetObject(db.GroupDictionaryId,OpenMode.ForRead); ObjectId gpid=dict.GetAt(groupScaleValueID); Group gp=(Group)trans.GetObject(gpid,OpenMode.ForRead); //獲取組對象中的所有實體的ObjectId ObjectId[] ids1=gp.GetAllEntityIds(); foreach (ObjectId ids in ids1);//循環遍歷 { ResultBuffer xDataOut1=ids.GetXData(appName); TypedValue[] xdata1=xDataOut1.AsArray();//循環得到參數數組 … }}}} 3 應用實例 本文以標牌企業的壓力表標牌為例,根據圖1的操作步驟,逐一繪制圖中的4條弧。先繪制圓弧,由于該壓力表的刻度是均分的,根據刻度起始角度、終止角度、均分格數、各刻度線的參數繪制刻度。 由于刻度值的分布也是均分的,刻度數值是等差的,在刻度值的繪制窗口中輸入相應的參數,完成一條弧的繪制,以最里面的弧舉例,參數為半徑30 mm,起始角度315°,終止角度225°,總均分50格,短刻度均分5格,刻度參數見表1,其他弧同上所述。需要查詢對象參數或需要修改對象的時候,鼠標選擇某一對象,如圖9選擇了刻度值后,在繪制刻度值窗口中列表框中會顯示此刻度值組的所有刻度值參數,修改參數后完成刻度值的動態修改功能。 圖9 實例圖 表1 參數表mm 序號名稱弧高(R)弧寬字母高數字高長刻度線長度長刻度線寬度短刻度線長度短刻度線寬度顏色備注 1弧1300.21.81.31.750.41.250.24黑 4 結 語 利用ObjectARX2008與VS 2008中的C#的結合,針對標牌行業進行AutoCAD二次開發,拓寬了AutoCAD二次開發的范圍,開發出來的壓力表標牌參數化繪制系統具有良好的通用性、可擴展性,可廣泛用于儀表標牌企業的各種壓力表標牌和類壓力表標牌的繪制,提高標牌制作的自動性,操作流程的標準化, 與AutoCAD系統界面保持了良好的一致性[10],更方便修改,極大地提高了企業繪制人員的工作效率。 參考文獻 [1]張麗萍.橋梁墩臺參數化設計[J].計算機輔助工程,2009,6(2):68-72. [2]童時中,李平.二次開發是CAD取得實效的關鍵環節[J].電子機械工程,1999(4):64-68. [3]李東浩,彭潤華,吳君華,等.參數化設計中圖形信息的前置處理技術[J].計算機輔助工程,2000,9(3):54-58. [4]王大鵬,張立文,張國梁,等.ObjectARX中結合MFC開發AutoCAD ARX應用程序[J].計算機輔助工程,2001,10(4):55-58. [5]王才平,張國軍,邵新宇.基于ObjectARX的圖塊重用研究與實現[J].計算機應用與軟件,2006(12):37-38. [6]李長勛.AutoCAD ObjectARX程序開發技術[M].北京:國防工業出版社,2005. [7]吳紅丹,梅樹立,李麗,等.采用ObjectARX2006的多段線自動生成及編輯[J].工程圖學學報,2007(2):179-182. [8]杜立,趙韓,董玉德,等.基于ObjectARX齒輪設計系統的開發與研究,2008(12):75-77. [9]老大中,趙占強.AutoCAD 2000 ARX二次開發實例精粹(ObjectARX)[M].北京:國防工業出版社,2001. [10]薛長健,黃靖.AutoCAD 2000高級使用及開發[M].北京:人民郵電出版社,2000.