CATIA插件二次開(kāi)發(fā)C#
1. 引言
由于項(xiàng)目中要使用WISEGLOVE數(shù)據(jù)手套,近搜集整理了一些關(guān)于CATIA二次開(kāi)發(fā)的資料,網(wǎng)絡(luò)的相關(guān)資料比較有限,因此剛開(kāi)始遇到了不少問(wèn)題,通過(guò)分析一些示例,以及結(jié)合CATIA的宏錄制功能生成的代碼,才算是對(duì)CATIA的開(kāi)發(fā)方式有所了解?,F(xiàn)總結(jié)一下學(xué)習(xí)中遇到的相關(guān)問(wèn)題及解決辦法,以共享各位小朋友。
2. CATIA簡(jiǎn)介
CATIA(Computer Aided Three Dimensional Interactive Application)是法國(guó)達(dá)索公司的產(chǎn)品開(kāi)發(fā)旗艦解決方案。作為PLM協(xié)同解決方案的一個(gè)重要組成部分,它可以幫助制造廠商設(shè)計(jì)他們未來(lái)的產(chǎn)品,并支持從項(xiàng)目前階段、具體的設(shè)計(jì)、分析、模擬、組裝到維護(hù)在內(nèi)的全部工業(yè)設(shè)計(jì)流程。通過(guò)使企業(yè)能夠重用產(chǎn)品設(shè)計(jì)知識(shí),縮短開(kāi)發(fā)周期,CATIA解決方案加快企業(yè)對(duì)市場(chǎng)的需求的反應(yīng)。CATIA比較廣泛的用于汽車、航空航天、輪船、軍工、儀器儀表、建筑工程、電氣管道、通信等方方面面(來(lái)源-百度百科-CATIA)。
3. CATIA開(kāi)發(fā)模式
CATIA提供了AutomationAPI組件和組件應(yīng)用架構(gòu)(CAA,Component Application Architecture)兩種開(kāi)發(fā)模式。
3.1 Automation組件
Automation API具備與任何OLE所兼容的平臺(tái)進(jìn)行通訊能力,自動(dòng)化(Automation)組件使用VBScript作為編輯工具。通過(guò)宏錄制功能(Macro Record),可以記錄用戶的操作過(guò)程并自動(dòng)生成VBScript代碼。這種方式比較簡(jiǎn)單,在CATIA環(huán)境就中可完成。
3.2 組件應(yīng)用架構(gòu)(CAA)
CAA采用組件對(duì)象模型(COM)和對(duì)象的連接和嵌入(OLE)技術(shù),COM作為一種軟件架構(gòu)具備了更好的模塊獨(dú)立性、可擴(kuò)展性,使CAA的程序設(shè)計(jì)更加容易且趨于標(biāo)準(zhǔn)化,使程序的代碼更加簡(jiǎn)潔明了。在CATIA運(yùn)行的情況下,外部進(jìn)程可以通過(guò)訪問(wèn)COM組件實(shí)現(xiàn)對(duì)CATIA的操作,如創(chuàng)建、修改CATIA環(huán)境和幾何形體的數(shù)據(jù)、尺寸等。
4. 為什么采用C#作為開(kāi)發(fā)語(yǔ)言
VBScript腳本方法過(guò)于簡(jiǎn)單,無(wú)法實(shí)現(xiàn)CATIA的某些功能,如碰撞檢測(cè)功能,且無(wú)法與現(xiàn)有項(xiàng)目進(jìn)行集成。CAA/C++模式是*復(fù)雜的開(kāi)發(fā)模式,其可以實(shí)現(xiàn)幾乎所有的CATIA功能,但是其過(guò)于復(fù)雜,需要一定的學(xué)習(xí)時(shí)間,無(wú)法很快進(jìn)行功能實(shí)現(xiàn)。因此這兩種實(shí)現(xiàn)方式都不是很適合。由于CATIA提供了COM支持,因此我們可以通過(guò).Net平臺(tái)引入COM組件進(jìn)行開(kāi)發(fā),其有如下優(yōu)勢(shì):
1. 由于項(xiàng)目本身采用的是CSharp語(yǔ)言,因此能夠很好的集成到項(xiàng)目中,并且能夠滿足項(xiàng)目需求。
2. 學(xué)習(xí)成本較低,通過(guò)對(duì)宏生成代碼進(jìn)行少許改造即可在.Net平臺(tái)中運(yùn)行。
3. 可以將通用操作進(jìn)行封裝,方便今后項(xiàng)目的開(kāi)發(fā),降低開(kāi)發(fā)成本。
5. 準(zhǔn)備開(kāi)發(fā)
5.1 所需軟件
- CATIA V5 R20
- Visual Studio 2010
5.2 引入類庫(kù)
在正確安裝CATIA之后即可在項(xiàng)目中引用CATIA COM類庫(kù),其類庫(kù)名稱均以CATIA V5開(kāi)頭。在引用為類庫(kù)后,我們即可進(jìn)行開(kāi)發(fā)工作。

5.3 開(kāi)發(fā)示例
該示例演示了如何連接CATIA,并生成一個(gè)新的Product。
namespace CATIATest
{
class Program
{
static void Main(string[] args)
{
// 連接CATIA
Application Catia =(Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Catia.Application");
// 獲取當(dāng)前活動(dòng)ProductDocument
ProductDocument pd = (ProductDocument)Catia.ActiveDocument;
// 創(chuàng)建一個(gè)ID為newProduct的Product
pd.Product.Products.AddNewProduct("newProduct");
}
}
}
【注意】在調(diào)試之前請(qǐng)確保CATIA已經(jīng)運(yùn)行,否則無(wú)法連接到CATIA,程序無(wú)法運(yùn)行。
6. 開(kāi)發(fā)中使用到的操作總結(jié)
6.1 加載CATIA文件
public void AddNewComponent(string filePath)
{
object[] files = new object[1] { filePath };
this.ActiveProductDocument.Product.Products.AddComponentsFromFiles(files, "All");
}
6.2 向當(dāng)前Product中添加Part
// 向當(dāng)前Product中添加一個(gè)指定長(zhǎng)度的圓柱體
public void CreateCylinder(string name, double length)
{
// 添加一個(gè)新零件
Product product = this.ActiveProductDocument.Product.Products.AddNewComponent("Part", name);
// 繪制圓
Part part = ((PartDocument)this._catia.Documents.Item(name + ".CATPart")).Part;
Sketch sketch = (part.Bodies.GetItem("零件幾何體") as Body).Sketches.Add(
(Reference)part.OriginElements.PlaneXY);
sketch.SetAbsoluteAxisData(new object[] { 0, 0, 0, 1, 0, 0, 0, 1, 0 });
part.InWorkObject = sketch;
Factory2D factory = sketch.OpenEdition();
Axis2D axis = (Axis2D)sketch.GeometricElements.GetItem("絕對(duì)軸");
(axis.GetItem("橫向") as Line2D).ReportName = 1;
(axis.GetItem("縱向") as Line2D).ReportName = 2;
Circle2D circle = factory.CreateClosedCircle(0, 0, 5);
circle.CenterPoint = (Point2D)axis.GetItem("原點(diǎn)");
circle.ReportName = 3;
sketch.CloseEdition();
part.Update();
// 繪制圓柱
(part.ShapeFactory as ShapeFactory).AddNewPad(sketch, length);
part.Update();
}
6.3 查找Product
// 根據(jù)產(chǎn)品名稱獲取指定Product
public Product GetProduct(string productId)
{
return (Product)this.ActiveProductDocument.Product.Products.GetItem(productId);
}
6.4 移除Product
protected void RemoveProduct(Product product)
{
Selection selection = this.ActiveProductDocument.Selection;
selection.Clear();
selection.Add(product);
selection.Delete();
}
6.5 碰撞檢測(cè)
// 檢測(cè)兩個(gè)產(chǎn)品間是否存在沖突
public bool ConflictCheck(Product product1, Product product2)
{
Groups groups = this.ActiveProductDocument.Product.GetTechnologicalObject("Groups") as Groups;
Group first = groups.Add();
Group second = groups.Add();
first.AddExplicit(product1);
second.AddExplicit(product2);
Clash clash = (this.ActiveProductDocument.Product.GetTechnologicalObject("Clashes") as Clashes).Add();
clash.ComputationType = CatClashComputationType.catClashComputationTypeBetweenTwo;
clash.InterferenceType = CatClashInterferenceType.catClashInterferenceTypeContact;
clash.FirstGroup = first;
clash.SecondGroup = second;
clash.Compute();
Conflicts conflicts = clash.Conflicts;
groups.Remove(first.get_Name());
groups.Remove(second.get_Name());
return conflicts.Count != 0;
}
6.6 自動(dòng)調(diào)整視圖
protected void AdapteAllView()
{
this._catia.ActiveWindow.ActiveViewer.Reframe();
}
7. 其他功能探索
一般來(lái)說(shuō),對(duì)于CATIA中能夠手工解決的問(wèn)題均應(yīng)能夠通過(guò)編程的方式處理,我們可以通過(guò)以下三種途徑獲取編程幫助以及Sample。
- V5 Automation API 手冊(cè)(推薦)
- CATIA 宏錄制功能
- Baidu 以及 Google
方式一:在安裝好CATIA后,再其安裝目錄中%Install Root%\Dassault Systemes\B20\intel_a\code\bin中已經(jīng)包含了V5 Automation API .chm幫助文檔。該文檔中包含了全部的可用API及類繼承結(jié)構(gòu),同時(shí)提供了豐富的代碼示例供讀者參考。
方式二:通過(guò)啟用CATIA的宏錄制功能,可以獲得所有操作的VBScript代碼,我們可以參考該代碼進(jìn)行CSharp代碼的開(kāi)發(fā)。下圖通過(guò)CATIA錄制了一個(gè)繪制圓柱的過(guò)程,右側(cè)窗口內(nèi)顯示的即為生成的VBScript代碼。
8. WISEGLOVE數(shù)據(jù)手套在CATIA中使用
按照上面的方法, 各位小朋友應(yīng)該能和我們一樣實(shí)現(xiàn)WISEGLOVE數(shù)據(jù)手套在CATIA中的應(yīng)用。
- 上一篇:Unity3d碰撞器與觸發(fā)器的區(qū)別 2018/8/7
- 下一篇:手指力反饋解決方案 2018/6/14