SolidWorks二次开发系列入门100篇之98、99-分割、保存零件中的实体

SolidWorks二次开发系列入门100篇之98、99-分割、保存零件中的实体_第1张图片
SolidWorks二次开发系列入门100篇之98、99-分割、保存零件中的实体_第2张图片

SolidWorks二次开发系列入门100篇之98、99-分割、保存零件中的实体_第3张图片

SolidWorks二次开发系列入门100篇之98、99-分割、保存零件中的实体_第4张图片

从这四张图,看了来这个保存实体和分割图标是一样的,可能只是选项不一样,所以这里一起写了,不浪费时间。

经过了几个小时的研究,没搞定。大哭
CreateSaveBodyFeature这个没有api例子,2021上有例子,但只有VBA
https://help.solidworks.com/2021/english/api/sldworksapi/Create_Save_Bodies_Feature_and_Create_Assembly_Example_VB.htm
,但C#里面怎么就是失败,2022上只能建出来空装配体,不知道是api有bug还是啥情况,当然也可能 是我水平不行呀。

所以临时只能间接调用宏来简单实现这个功能了。结果如下图了: 至于宏的参数应该怎么指定,后面再写方案。
当前之前我开发实例中已经用别的办法实现过。其实就是把每个实体单独输出成零件,然后再组装成一个装配。
总结下来,有时候solidworks提供了功能,但api不一定好调用。只能靠自己想办法去处理了
SolidWorks二次开发系列入门100篇之98、99-分割、保存零件中的实体_第5张图片

SolidWorks二次开发系列入门100篇之98、99-分割、保存零件中的实体_第6张图片

          //解决方案: 
            // 在2021中找到一个示例,18版本中测试ok.所以可以采用调用宏

            //BodiesToAssembly.swp  保存到D\temp下面

            SldWorks swApp = Utility.ConnectToSolidWorks();
            var swModel = (ModelDoc2)swApp.ActiveDoc;
            var swModelDocExt = swModel.Extension;
            var swSelMgr = (SelectionMgr)swModel.SelectionManager;
            var swFeatMgr = swModel.FeatureManager;

            if (swModel.GetType() != (int)swDocumentTypes_e.swDocPART)
            {
                return;
            }
            int err=0;
            var res= swApp.RunMacro2(RegDllPath("") + @"\BodiesToAssembly.swp", "Macro11", "main", 0, out err);

下面分割的例子拿出来看看,基本上执行正常。

 			SldWorks swApp = Utility.ConnectToSolidWorks();
            var swModel = (ModelDoc2)swApp.ActiveDoc;
            var swModelDocExt = swModel.Extension;
            var swSelMgr = (SelectionMgr)swModel.SelectionManager;
            var swFeatMgr = swModel.FeatureManager;

            //Select the cutting tool
            var boolstatus = swModelDocExt.SelectByID2("Top Plane", "PLANE", 0, 0, 0, true, 0, null, 0);

            object vBodyNames = null;
            object[] bodiesToMark = new Body2[2];
            string[] bodyNames = new string[2];
            object[] bodyOrigins = new Vertex[2];

            //Get bodies that will result from the split operation
            object[] vResultingBodies = null;
            vResultingBodies = (object[])swFeatMgr.PreSplitBody2();

            swModel.ClearSelection2(true);

            //Set up the arrays for the post-split operation

            //If you do not want to assign body origin, set it to nothing so that the default origin is used
            bodyOrigins[0] = null;
            bodyOrigins[1] = null;

            bodiesToMark[0] = vResultingBodies[0];
            bodiesToMark[1] = vResultingBodies[1];

            //Save the first body to a separate part document
            //Substitute the name of the actual folder where to save the body
            bodyNames[0] = "d:\\temp\\Body1.sldprt";
            //Do not save the second body
            bodyNames[1] = "";

            DispatchWrapper[] preSplitBodies = null;
            preSplitBodies = (DispatchWrapper[])ObjectArrayToDispatchWrapperArray((bodiesToMark));
            vBodyNames = bodyNames;
            DispatchWrapper[] originsToUse = null;
            originsToUse = (DispatchWrapper[])ObjectArrayToDispatchWrapperArray((bodyOrigins));

            //Create the Split feature, consuming all split bodies
            var swFeat = (Feature)swFeatMgr.PostSplitBody2((preSplitBodies), true, (originsToUse), (vBodyNames), "");

            if (((swFeat != null)))
            {
                Debug.Print("Split feature: " + swFeat.Name);
                var swSplitBodyFeat = (SplitBodyFeatureData)swFeat.GetDefinition();
                swSplitBodyFeat.AccessSelections(swModel, null);
                swSplitBodyFeat.GetSplitBodies(out object bodyVar, out object PathVar, out object FlagVar);
                swSplitBodyFeat.ReleaseSelectionAccess();
                Debug.Print("Bodies consumed? " + swSplitBodyFeat.Consume);
                Debug.Print(" ");
            }

这个分割的例子没有什么问题,可以用,我了不解释了。唯一的问题就是还不能指定只分割部分实体。

你可能感兴趣的:(SolidWorks,二次开发,C#,API,SolidWorks二次开发,SolidWorks,c#,二开)