劉金鳳,張現廣
(1.長安大學汽車學院,陜西 西安 710064;2.上海海事大學物流工程學院,上海 201306)
活塞是汽車發動機的重要組成部件,在工作過程中承受較高的機械負荷和熱負荷,因此其設計質量的優劣直接關系到發動機的工作可靠性,繼而影響汽車的工作性能。隨著計算機技術的不斷發展,如同大多數機械零件的設計一樣,汽車發動機活塞的設計過程中也廣泛應用了CAD 技術。而在CAD 技術的實際應用中,參數化設計技術是目前主流的發展方向之一。參數化設計技術大多通過對某款三維設計軟件(如Solidworks,Pro/E,CATIA,UG 等)進行二次開發,以實現在輸入基本參數的情況下自動建立零件的三維模型。這種方法解決了傳統設計方法在設計大量結構相似而幾何參數不同的零件時重復工作量大的問題,提升了設計的工作效率。
Solidworks 通過OLE 和COM 技術提供了豐富的官方應用程序接口(API)以方便用戶通過二次開發對其功能進行定制。用戶編寫的程序通過API 可以訪問Solidworks 的各種功能。
Solidworks 中所有的操作都包含在Solidworks API 對象的屬性或者方法中。本課題的開發常用的為Sldworks 對象和ModelDoc2 對象。Sldworks 對象是最高層次的對象,Solid works 軟件中對文件的打開、關閉、保存等操作包含在此對象的屬性或者方法中,在編寫二次開發程序時,首先應當聲明的對象便是Sldworks;ModelDoc2 是Sldworks 對象的子對象,該對象的屬性以及方法包含了參數修改、目標選取等操作。
支持OLE 和COM 技術的編程語言(VB/VB.net、C++、C#等)都可以用來進行Solidworks 二次開發[1]。C#是目前較為流行的編程語言之一,相對簡單易學且功能強大,適合作為Solidworks 二次開發的編程語言[2]。
Solidworks 本身自帶有宏錄制工具,通過宏錄制可以記錄下相關操作的宏代碼,然后刪除宏代碼中一些輔助操作的代碼(如縮放,視圖轉換等),即可使用。這種方法可以快速地獲取相關操作所用到的Solidworks API 對象中的方法或屬性,特別適合初學者。
Solidworks 二次開發產生的應用程序有兩種形式:AddIn插件形式以及獨立的EXE 程序形式。前者作為插件集成到Solidworks 中,后者獨立于Solidworks,跨進程調用Solid-works API。后者在運行時較為穩定,因此本課題開發獨立的EXE 程序形式。
基于Solidworks 二次開發的參數化設計方法有兩種:編程驅動法與尺寸驅動法[3]。前者是將整個零件模型的繪制過程用代碼描述,從無到有地生成模型。這種方法需要編程大量的代碼,且對計算機性能要求比較高;后者是預先定義一個零件模板,并將該模板的尺寸參數設定為變量,通過改變這些變量的賦值來快速地生成一系列結構相似但尺寸不同的零件。這種方法代碼量少且執行效率高,因此本課題選用尺寸驅動法。

圖1 活塞結構示意圖
發動機活塞的設計中的重要結構參數有:活塞高度、活塞外徑、火力岸高度、環岸高度、壓縮高度、裙部高度以及銷孔內徑等[4],如圖1 所示。此外,活塞外徑與其他結構參數尺寸之間應當滿足一定的比例關系[5],如表1 所示。

表1 活塞結構參數代號及其比例關系
表1 中的參數為參數化設計的變量,此外,為加強活塞頭部的設計細節,額外選取第一環岸高度c1 以及第二環岸高度c2 作為設計變量[6]。
依據本課題的設計需求,用戶應當能夠通過活塞參數化設計系統的人機交互界面建立與Solidworks 軟件的連接、加載活塞的模型、輸入活塞的關鍵尺寸參數、對活塞參數庫進行存取以及生成新的活塞模型等操作。
完成后的人機交互界面如圖2 所示。在進行參數化設計之前,用戶先通過界面上側的菜單欄相關命令進行打開Solidworks 軟件以及加載活塞的模型等準備工作;完成準備工作后,結合界面中部的活塞參數尺寸示意圖,在界面左側的文本框中輸入相關的參數,或者通過下拉框選取活塞參數庫中的尺寸參數,當文本框填寫完成后,即可生成新的活塞模型,或者將輸入的參數存儲到活塞參數庫中。

圖2 活塞參數化設計系統人機交互界面
由于參數化設計系統是獨立的應用程序,與Solidworks分屬兩個獨立的進程,因此需要實現系統對Solidworks 的跨進程調用。
當Solidworks 處于關閉狀態時,通過菜單欄的“打開Solidworks”選項即可完成Solidworks 的啟動。相關的實現代碼如下:SldWorks swApp = null;//聲明一個SldWorks 對象swApp = new SldWorks();//實例化SldWorks 對象swApp.Visible = true;// Solidworks 窗口可見
當Solidworks已經處于打開狀態時,需要獲取Solidworks的進程,實現代碼為:
get_swProcess("",getProcesson("SldWorks"),"Sldworks.Application");//獲取solidworks 進程get_swProcess 與get Processon 函數的詳細定義見參考文獻[7]。
基于尺寸驅動的參數化設計方法需要加載預先設計好的活塞零件模板(為保證該模板的重用性,應當將模板的文件屬性設定為“只讀”。),相關的代碼如下:
string filepath = @"D:汽車實用技術活塞Piston. SLD-PRT"; // 活塞模板的保存文件路徑 int IntError = -1,IntWraning = -1;
swApp.OpenDoc6(filepath, 1, (int)swOpenDocOptions_e.swOpenDocOptions_LoadModel, "", IntError, IntWraning);//Sldworks 對象中的OpenDoc6 方法
為保證用戶輸入的數值符合表1 中的比例關系,可以對與活塞直徑參數有關聯的文本框內容進行控制,以活塞高度參數對應的文本框為具體實現方式如下:
if (textBox2.Text != "")//當文本框內容不為空時進行約束
{
if (0.6 * Convert.ToDouble(textBox1.Text) > Convert.ToDouble(textBox2.Text) || Convert.ToDouble(textBox1.Text) <Convert.ToDouble(textBox2.Text))//約束條件
{
MessageBox.Show("輸入的活塞高度值不符合比例關系!");//彈出提示
textBox2.Clear();//清空文本框
}
}
基于尺寸驅動的參數化設計方法最核心的內容便是對活塞零件模板的尺寸參數進行修改。ModelDoc2 對象包含了代表草圖尺寸參數的屬性,通過對這些屬性的修改即可完成對草圖尺寸參數的修改,繼而通過重建模型即可完成對零件模板的修改。
下面以活塞高度的尺寸修改為例來說明具體實現代碼:
double H = Convert.ToDouble(textBox2.Text);//將輸入值傳遞到變量H 中。
ModelDoc2 SwPartDoc = (ModelDoc2)swApp.ActiveDoc;//聲明一個ModelDoc2 對象。
SwPartDoc.Parameter("D3@草圖 1").SystemValue=H/1000.0;//修改參數。D3@草圖1 表示草圖1 中代號為D3 的尺寸參數;參數的默認單位為m,而設計時往往以mm 為單位,因此需要單位換算。
SwPartDoc.EditRebuild3();//重建模型。
3.6.1 數據表的設計
在名為" Piston "的數據庫中建立一個" PistonParameter "的數據表。數據表的第一個字段" ID "為活塞的型號,其余字段代表圖4 中的各個參數。由于字段值大小寫不敏感,因此參數h 和d 分別的字段分別為hh 和dd。數據表各字段的屬性如表2 所示。此外,SQL Server 2008 字段沒有double 類型,在這里可以用float 類型代替。

表2 數據表字段及屬性
3.6.2 參數庫的讀取
當用戶通過界面中的下拉框選取活塞的型號時,該型號對應的各個參數便會自動地填充到界面對應的文本框中。
(1)首先,建立與數據庫" Piston "的連接[8]:
string constr = "Server=localhost;database= Piston; Integra-ted Security=True";//SQL 字符串語句;
SqlConnection con = new SqlConnection(constr);//建立連接。
(2)建立連接后,在" PistonParameter "數據表中查詢所選取型號對應的參數:
sql_str = "select D,H,H1,H2,hh1,c1,c2,dd from PistonPara-meter where ID ='" + comboBox1.SelectedValue.ToString() +"'";//SQL 查詢語句;
SqlDataAdapter myda = new SqlDataAdapter(sql_str, con);//實例化SqlDataAdapter 對象。
(3)然后將查詢到數據填充到一個DataSet 對象中:DataSet myds = new DataSet(); //實例化DataSet 對象;myda.Fill(myds, " PistonParameter ");//數據填充。
(4)最后,將DataSet 對象中的數據填充到文本框中,以參數活塞直徑" D "的填充為例,代碼為:
textBox1.Text = myds.Tables[0].Rows[0]["D"].ToString()。
3.6.3 參數庫參數的添加
用戶可以將自行輸入到文本框中的參數存儲到現有參數庫中,具體實現方式如下:
(1)首先查詢整個數據表,并將所查詢到的數據填充到一個DataSet 對象中,該過程的代碼與3.6.2 中的步驟(1)~(3)類似,不再贅述,唯一不同的是SQL 查詢語句變為:
sql_str = "select ID,D,H,H1,H2,hh1,c1,c2,dd from Piston-Parameter";
(2)然后在DataSet 對象保存的數據表中新建一行,并寫入新的參數:
DataRow mydr = myds.Tables[0].NewRow();//新建一行;
string str = Interaction.InputBox("型號需為純數字", "請輸入型號", "", -1, -1);//提示用戶輸入型號;
mydr["ID"] = int.Parse(str);//將輸入的型號存為"ID"字段;
mydr["D"] = textBox1.Text;// 將輸入的活塞直徑存為"D"字段。
(3)最后更新數據庫:
SqlCommandBuilder myscb = new SqlCommandBuilder(myda);
myds.Tables[0].Rows.Add(mydr);//把新建的一行加入到數據表中;
myda.Update(myds, " PistonParameter ");//更新數據庫中的數據表。
在對汽車發動機活塞結構進行分析的基礎上,借助Solidworks 官方的二次開發API,在Visual Studio 2010 開發環境下利用C#語言開發了汽車發動機活塞的參數化設計系統,并依托SQL Server 2008 建立了活塞零件的參數庫。用戶可以根據設計需求自行輸入參數,或者調用參數庫中的參數快速建立活塞產品的三維模型,提升了設計效率。此外,用戶可以將符合設計需求的參數存儲到參數庫中,實現設計數據的有效管理。