C# SolidWorks 二次開發 API---刪除零件所有特徵(保留實體)

有時候我們不想把零件的內部細節發給到客戶,通常情況下我們會把一些內部特徵壓縮掉。然後再轉出去,但是壓縮與解壓縮過程中一些關聯比較難控制。
如下圖,中間一個小孔:
原零件
如果不想轉出這個孔,可以利用Tools下面的Defeature來做:
在這裏插入圖片描述
這樣我們可以得到一個新零件,這樣就很好的保護了內部特徵:
在這裏插入圖片描述
不過這個步驟好像查不到什麼api.

還有一些情況,我們的零件比較 簡單,沒有什麼祕密。當然就可以直接利用轉出第三格式,這樣就可以直接變成實體,而沒有步驟。
今天我們來利用一些api函數,在不導出的情況下,直接刪除特徵,而保留實體,我想在某些情況下還是用的到的。
大概思路如下:

  1. 遍歷所有實體,並保存在程序內部
  2. 刪除當前零件中的所有特徵
  3. 把內部的實體生成獨立的實體特徵

在這裏插入圖片描述

以下是代碼:

 /// <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();
            }
        }

運行完之後 結果如下圖: 就像導出之後 ,再導出,還是同樣的名字。只是特徵沒有了。
在這裏插入圖片描述

源碼已經上傳。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章