有時候我們不想把零件的內部細節發給到客戶,通常情況下我們會把一些內部特徵壓縮掉。然後再轉出去,但是壓縮與解壓縮過程中一些關聯比較難控制。
如下圖,中間一個小孔:
如果不想轉出這個孔,可以利用Tools下面的Defeature來做:
這樣我們可以得到一個新零件,這樣就很好的保護了內部特徵:
不過這個步驟好像查不到什麼api.
還有一些情況,我們的零件比較 簡單,沒有什麼祕密。當然就可以直接利用轉出第三格式,這樣就可以直接變成實體,而沒有步驟。
今天我們來利用一些api函數,在不導出的情況下,直接刪除特徵,而保留實體,我想在某些情況下還是用的到的。
大概思路如下:
- 遍歷所有實體,並保存在程序內部
- 刪除當前零件中的所有特徵
- 把內部的實體生成獨立的實體特徵
以下是代碼:
/// <summary>
/// 刪除零件特徵,但保留實體,類似於導出
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDeleteFeature_Click(object sender, EventArgs e)
{
ISldWorks swApp = Utility.ConnectToSolidWorks();
var swModel = (ModelDoc2)swApp.ActiveDoc;
if (swModel != null)
{
PartDoc part = (PartDoc)swModel;
var vBodies = GetBodyCopies(part);
DeleteAllUserFeature(swModel);
CreateFeatureForBodies(part, vBodies);
}
}
/// <summary>
/// 獲取零件實體的備份
/// </summary>
/// <param name="partDoc"></param>
/// <returns></returns>
private Body2[] GetBodyCopies(PartDoc partDoc)
{
var vBodies = partDoc.GetBodies2((int)swBodyType_e.swAllBodies, true);
Body2[] newBodies = new Body2[vBodies.Length];
for (int i = 0; i < vBodies.Length; i++)
{
var swBody2 = (Body2)vBodies[i];
newBodies[i] = swBody2.Copy();
}
return newBodies;
}
/// <summary>
/// 把備份的實體 生成特徵
/// </summary>
/// <param name="partDoc"></param>
/// <param name="bodies"></param>
private void CreateFeatureForBodies(PartDoc partDoc, Body2[] bodies)
{
for (int i = 0; i < bodies.Length; i++)
{
partDoc.CreateFeatureFromBody3(bodies[i], false, (int)swCreateFeatureBodyOpts_e.swCreateFeatureBodySimplify);
}
}
/// <summary>
/// 刪除當前所有的特徵
/// </summary>
/// <param name="modelDoc2"></param>
private void DeleteAllUserFeature(ModelDoc2 modelDoc2)
{
SelectAllUserFeature(modelDoc2);
modelDoc2.Extension.DeleteSelection2((int)swDeleteSelectionOptions_e.swDelete_Children + (int)swDeleteSelectionOptions_e.swDelete_Absorbed);
}
/// <summary>
/// 選擇所有的特徵
/// </summary>
/// <param name="modelDoc2"></param>
private void SelectAllUserFeature(ModelDoc2 modelDoc2)
{
modelDoc2.ClearSelection2(true);
var swFeature = (Feature)modelDoc2.FirstFeature();
// var selectFeat = false;
while (swFeature != null)
{
if (swFeature != null)
{
swFeature.Select2(true, 1);
}
else
{
if (swFeature.GetTypeName2() == "OriginProfileFeature")
{
// selectFeat = true;
}
}
swFeature = swFeature.GetNextFeature();
}
}
運行完之後 結果如下圖: 就像導出之後 ,再導出,還是同樣的名字。只是特徵沒有了。
源碼已經上傳。