C# SolidWorks二次开发 API-撤销与重做

C# SolidWorks二次开发 API-撤销与重做

	人非圣人,孰能无错。 不管是做设计还是做什么事,都有可能操作错误或者误操作的情况,熟悉windows的系统的人都知道Ctrl+Z是撤销,Ctrl+Y是重做,所以solidworks中也是有同样的操作的,如下图,在新建一个草图之后,画两条线,在撤销里面就可以看到对应的操作,可以方便的进行撤销与重做操作。如下图:		

查API

既然我们已经知道这个动作,那我们可以在API帮助中搜索对应的关键字,目前虽然没有官方的中文版的API帮助,但我之前共享的翻译文档也是可以参考的哈。

api帮助里面有不少可以查看的信息,这里我就不深入介绍了。

用法


直接上代码,下面就是让程序修改了长和宽,但是在用户界面上可以直接撤销修改。

		private void btnUndoOrRedo_Click(object sender, EventArgs e)
        {

            var swApp = PStandAlone.GetSolidWorks();
            var swModelDoc = (ModelDoc2)swApp.ActiveDoc;
            var swModelDocExt = swModelDoc.Extension;


            //开始记录可以退回的步骤
            swModelDocExt.StartRecordingUndoObject();      

			//这里可以修改多个尺寸,零件,理论上多少步都可以。相当于一个状态备份
			
            Dimension dimension = (Dimension)swModelDoc.Parameter("D1@Extrude2");
            dimension.SetValue3(0.21, 1,null) ;           
            dimension = (Dimension)swModelDoc.Parameter("D4@Sketch1");
            dimension.SetValue3(0.56, 1, null);   
            
            swModelDoc.EditRebuild3();

            //记录结束 ,是否显示在退回列表中。
            swModelDocExt.FinishRecordingUndoObject2("修改长和宽", false);
			
            //撤销
            //swModelDoc.EditUndo2(1);

            //重新执行
            //swModelDoc.EditRedo2(1);


        }
执行完上面程序撤销之前的代码, 现在solidworks上面的撤销功能就亮了,同时我们可以看到有哪几步可以撤销,程序可以显示对应的描述,方便用户执行。
当然也有些操作可能无法撤销,我没有进行太多测试。


好了,今天的撤销的重做就讲这么多了,大家有需要的话可以继续研究。

源代码继续上传在gitee上面。有需要的可以去取。

posted @
2023-02-22 18:15 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源

C# SolidWorks 二次开发 API—获取配合信息

C# SolidWorks 二次开发 API—获取配合信息

好像快有一个月没有更新,最近有个小需求,设计时不时就会把安装螺丝的孔弄错。
想利用工具来检查一下孔径是否正确。这就需要获取到装配体中那些配合特征。
并读取配合的两个直径,来判断设计打孔特征是否做错了。
比如下图,这里需要锁螺丝,或者螺丝过孔。 (模型中是不安装螺丝零件的)

所以我们要读取配合特征,然后通过配合的一些信息来做判断。
通过查找api可以找到这个实例:

        private void btnGetMateInfor_Click(object sender, EventArgs e)
        {
            //请先打开TemplateModel文件夹下的装配TempAssembly.sldasm D:\09_Study\CSharpAndSolidWorks\CSharpAndSolidWorks\TemplateModel

            var swApp = PStandAlone.GetSolidWorks();

            var swModel = (ModelDoc2)swApp.ActiveDoc;

            var swFeat = (Feature)swModel.FirstFeature();

            Feature swMateFeat = null;
            Feature swSubFeat = default(Feature);
            Mate2 swMate = default;
            Component2 swComp = default(Component2);
            MateEntity2[] swMateEnt = new MateEntity2[3];
            //string fileName = null;
            //int errors = 0;
            //int warnings = 0;
            int i = 0;
            double[] entityParameters = new double[8];

            //从特征树中查找配合文件夹 Iterate over features in FeatureManager design tree

            while ((swFeat != null))
            {
                if ("MateGroup" == swFeat.GetTypeName())
                {
                    swMateFeat = (Feature)swFeat;
                    break;
                }
                swFeat = (Feature)swFeat.GetNextFeature();
            }
            Debug.Print(" " + swMateFeat.Name);
            Debug.Print("");

            //获取第一个子配合特征 Get first mate, which is a subfeature
            swSubFeat = (Feature)swMateFeat.GetFirstSubFeature();
            while ((swSubFeat != null))
            {
                swMate = (Mate2)swSubFeat.GetSpecificFeature2();
                if ((swMate != null))
                {
                    for (i = 0; i <= 1; i++)
                    {
                        swMateEnt[i] = swMate.MateEntity(i);
                        Debug.Print(" " + swSubFeat.Name);
                        Debug.Print(" Type = " + swMate.Type);
                        Debug.Print(" Alignment = " + swMate.Alignment);
                        Debug.Print(" Can be flipped = " + swMate.CanBeFlipped);
                        Debug.Print("");
                        swComp = (Component2)swMateEnt[i].ReferenceComponent;
                        Debug.Print(" Component = " + swComp.Name2);
                        Debug.Print(" Mate enity type = " + swMateEnt[i].ReferenceType);
                        entityParameters = (double[])swMateEnt[i].EntityParams;
                        Debug.Print(" (x,y,z) = (" + (double)entityParameters[0] + ", " + (double)entityParameters[1] + ", " + (double)entityParameters[2] + ")");
                        Debug.Print(" (i,j,k) = (" + (double)entityParameters[3] + ", " + (double)entityParameters[4] + ", " + (double)entityParameters[5] + ")");
                        Debug.Print(" Radius 1 = " + (double)entityParameters[6]);
                        Debug.Print(" Radius 2 = " + (double)entityParameters[7]);
                        Debug.Print("");
                    }
                    Debug.Print(" ");
                }
                // 从配合组中遍历 下一个配合 Get the next mate in MateGroup
                swSubFeat = (Feature)swSubFeat.GetNextSubFeature();
            }
        }

输出显示如下图:
可以看出来这个配合的两个孔一个是1.8mm 一个是1.4mm.
后续就可以通过这个来判断是否正确了。

posted @
2023-02-18 08:49 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源

C# SolidWorks 二次开发 API—遍历零件所有可编辑尺寸

C# SolidWorks 二次开发 API—遍历零件所有可编辑尺寸

最近有高校学生问到一个问题,如何得到零件中所有可以编辑的尺寸信息。包括所有的特征以及草图尺寸。
之前的博客中只是写了如何遍历特征以及图纸中的尺寸。
通过查api发现,其实这个和图纸中标注的尺寸一样,直接使用:
先看结果:
零件:

        /// <summary>
        /// 遍历特征
        /// </summary>
        /// <param name="thisFeat"></param>
        /// <param name="isTopLevel"></param>
        public static void TraverseFeatures(Feature thisFeat, bool isTopLevel, bool isShowDimension = false)
        {
            Feature curFeat = default(Feature);
            curFeat = thisFeat;

            while ((curFeat != null))
            {
                //输出特征名称
                Debug.Print(curFeat.Name);
                if (isShowDimension == true) ShowDimensionForFeature(curFeat);

                Feature subfeat = default(Feature);
                subfeat = (Feature)curFeat.GetFirstSubFeature();

                while ((subfeat != null))
                {
                    //if (isShowDimension == true) ShowDimensionForFeature(subfeat);
                    TraverseFeatures(subfeat, false);
                    Feature nextSubFeat = default(Feature);
                    nextSubFeat = (Feature)subfeat.GetNextSubFeature();
                    subfeat = nextSubFeat;
                    nextSubFeat = null;
                }

                subfeat = null;

                Feature nextFeat = default(Feature);

                if (isTopLevel)
                {
                    nextFeat = (Feature)curFeat.GetNextFeature();
                }
                else
                {
                    nextFeat = null;
                }

                curFeat = nextFeat;
                nextFeat = null;
            }
        }

        /// <summary>
        /// 遍历零件中的所有特征
        /// </summary>
        /// <param name="feature"></param>
        public static void ShowDimensionForFeature(Feature feature)
        {
            var thisDisplayDim = (DisplayDimension)feature.GetFirstDisplayDimension();

            while (thisDisplayDim != null)
            {
                var dimen = (Dimension)thisDisplayDim.GetDimension();

                Debug.Print($"---特征 {feature.Name} 尺寸-->" + dimen.GetNameForSelection() + "-->" + dimen.Value);

                thisDisplayDim = (DisplayDimension)feature.GetNextDisplayDimension(thisDisplayDim);
            }
        }

代码已经上传,请自取。

posted @
2023-02-18 08:49 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源

C# SolidWorks二次开发 API-命令标签页的切换与按钮错乱问题

C# SolidWorks二次开发 API-命令标签页的切换与按钮错乱问题

这是一个网友咨询的问题,说他想控制默认打开文件之后solidworks上方工具栏的当前激活标签页。

之前我们提到过,制作Solidworks的插件也会在上面增加一个标签页,用来放自己开发的命令,经常开发的人肯定会遇到有时候更新版本,或者标签页改名之后 ,会导致上面的工具栏状态不正常,有的是新的老的都存在,有的是这个工具的图标和显示在另一个工具下面。
有些解决方法是要去删除用户机器上的一些注册表中保存的UI信息,或者重置。
另一个思路就是上面这些按钮是代码增加的,是不是可以用代码删除掉没有用的这些标签,通过查询 api ,知道肯定是可以的。

我们先要知道这东西的名称

去api中搜索一下,


然后就看这里面管理的东西有好几样,toolbar 、 tab 、menu等。

大概的东西就在这里面了,里面有设置显示的,激活的一些信息。

继续显示我的”优美”界面:

  			var swApp = PStandAlone.GetSolidWorks();
            var swModelDoc = (ModelDoc2)swApp.ActiveDoc;
            var swModelDocExt = swModelDoc.Extension;

            //获取所有标签页
            var  cmdTabs = swModelDocExt.GetCommandTabs();      
            var activeTab = swModelDocExt.ActiveCommandTab;
            Debug.Print("当前标签是" + activeTab);
            var activeTabIndex = swModelDocExt.ActiveCommandTabIndex;
            Debug.Print("当前标签页序号是 " + activeTabIndex);
         
            var retval = swModelDocExt.get_CommandTabVisible(5);
            Debug.Print("序号为5的标签页是否显示 " + retval);

            //设置Sketch(草图)为当前标签页
            swModelDocExt.ActiveCommandTab = "Sketch";
            activeTabIndex = swModelDocExt.ActiveCommandTabIndex;
            //让标签序号为5的激活可见
            swModelDocExt.set_CommandTabVisible(5, true);
                //移除某个标签(插件中才能用)
            //swApp.GetCommandManager().RemoveCommandTab();

执行完:

可以看到sw的上面激活标签变为了sketch了。

就写这么多了,这个api用的不太多,因为用户会经常切换这些标签,但solidworks在指导教程中应该用过,当提示你点击某个命令时候,你可以点击上面的图标,它会自动显示在哪个标签,显示在哪个位置。

posted @
2023-02-14 18:30 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源

C# SolidWorks 二次开发 API —批量修改工程图视角

C# SolidWorks 二次开发 API —批量修改工程图视角

这是前两周帮一个朋友做的一个小功能。仅仅是转换工程图中的视角选项。全部改为第一或者第三视角。
本来开始写好了exe,本地测试无问题。结果他们有加密软件,无法正常运行。又试了dll,还是不行。最后搞了个swp宏给他。
这真是要全能的节奏。
分析下功能:
要改视角,就是修改Soidworks中文档属性里面的一个选项。
然后为了实现批量,就是可以遍历文件夹下面的所有工程图,当然还要考虑工程图中有多个图纸的情况。但是好像文档属性定义了所有图纸的设置。我就没去细看了。

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200711084742103.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3plbmdxaDAzMTQ=,size_16,color_FFFFFF,t_70)
  private void btnSelectFolder_Click(object sender, EventArgs e)
        {
            //选择文件夹对话框
            FolderSelectDialog fsd = new FolderSelectDialog();
            fsd.Title = "选择需要调整的工程图所在路径:";
            fsd.Multiselect = false;

            if (fsd.ShowDialog())
            {
                string[] dirs = fsd.FileNames;
                txtDrawomgPath.Text = dirs[0];
            }
        }

        private void buttonStart_Click(object sender, EventArgs e)
        {
            if (radioFirst.Checked == false && radioThird.Checked == false)
            {
                MessageBox.Show("请先选择视角!");

                return;
            }

            string[] files = Directory.GetFiles(txtDrawomgPath.Text, "*.slddrw", SearchOption.AllDirectories);

            SldWorks swApp = PStandAlone.GetSolidWorks();

            if (swApp == null)
            {
                swApp = PStandAlone.RunSolidWorks(-1, true, false, false, 30, 15);
            }

            swApp.CommandInProgress = true;
            progressBar1.Maximum = files.Length;

            int nowFileCount = 0;

            foreach (string file in files)
            {
                progressBar1.Value = nowFileCount;

                Debug.Print(file);

                swApp.OpenDoc(file, (int)swDocumentTypes_e.swDocDRAWING);

                ModelDoc2 swModel = (ModelDoc2)swApp.ActiveDoc;

                DrawingDoc drawingDoc = default(DrawingDoc);

                Sheet swSheet = default(Sheet);
                double[] sheetProperties = null;

                string activedSheetName = "";

                drawingDoc = (DrawingDoc)swApp.ActiveDoc;

                if (drawingDoc != null)
                {
                    activedSheetName = ((Sheet)drawingDoc.GetCurrentSheet()).GetName();
                    var sheetNames = (string[])drawingDoc.GetSheetNames();
                    for (int i = 0; i < sheetNames.Length; i++)
                    {
                        //var sheet = drawingDoc.Sheet[sheetNames[i]];

                        drawingDoc.ActivateSheet(sheetNames[i]);
                        // Active sheet is Sheet2
                        swSheet = (Sheet)drawingDoc.GetCurrentSheet();
                        sheetProperties = (double[])swSheet.GetProperties2();
                        int prop1;
                        int prop2;
                        bool prop5;
                        bool prop8;
                        prop1 = (int)System.Convert.ToInt32(sheetProperties[0]);
                        prop2 = (int)System.Convert.ToInt32(sheetProperties[1]);

                        if (radioFirst.Checked == true)
                        {
                            prop5 = true;
                        }
                        else
                        {
                            prop5 = false;
                        }

                        //prop5 = (bool)System.Convert.ToBoolean(sheetProperties[4]);

                        prop8 = (bool)System.Convert.ToBoolean(sheetProperties[7]);
                        prop8 = true;

                        swSheet.SetProperties2(prop1, prop2, sheetProperties[2], sheetProperties[3], prop5, sheetProperties[5], sheetProperties[6], prop8);

                        swModel.EditRebuild3();
                    }
                }
                drawingDoc.ActivateSheet(activedSheetName);
                swModel.EditRebuild3();
                swModel.Save();

                swApp.CloseDoc(file);
                nowFileCount = nowFileCount + 1;
            }

            swApp.CommandInProgress = false;
            progressBar1.Value = progressBar1.Maximum;

            swApp.SendMsgToUser("视角转换完成!");
        }

宏的链接:
https://download.csdn.net/download/zengqh0314/12600462

posted @
2023-02-10 07:30 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源

C# SolidWorks 二次开发 API—替换工程图文件关系

C# SolidWorks 二次开发 API—替换工程图文件关系

这篇博文讲的是在某些情况下需要把工程图中的模型进行替换。其实代码写好很久了,没有时间写博客

比如: 本来有A.sldprt和A.slddrw这两个文件,是A零件的模型与A零件的工程图。
我们需要去利用A零件衍生零件B,就改一些尺寸,特征什么的。
正常情况的操作是利用打包功能把A零件与工程图打包并改名为B.sldprt和B.slddrw.

但是也不排除经常会先直接把零件B做完了。然后没有图纸,

这样笨办法比较多,重新出图或者重新打包后改零件。

熟悉的人知道工程图中有下面这个替换模型:

这一步操作下来,你的图纸模型换过来了,但是有时候一些明明同样的参考关系尺寸会找不到参考了。这个bug Solidworks好像还存在,有时候没问题。

更加熟悉软件的人可能 会注意到,打开零件图纸的时候,有一个修改参考关系的选项。

这样可以修改参考的

这一步操作使用起来好像没有报错,我们来看一下这一步的实现,要实现引用关系的修改,其实只需要利用Document Manager来修改,对于装配体 下的零件改名,也是很好的办法。改完之后 重新修改下装配体的引用关系。

 private void btnReplaceReference_Click(object sender, EventArgs e)
        {
            const string sLicenseKey = "yourLicenseKey";//如果正版用户,请联系代理商申请。

            string sDocFileName = @"E:\01_Work\22_Gitee\CSharpAndSolidWorks\CSharpAndSolidWorks\TemplateModel\repleaceReference\part1.SLDDRW";

            SwDMClassFactory swClassFact = default(SwDMClassFactory);
            SwDMApplication swDocMgr = default(SwDMApplication);
            SwDMDocument swDoc = default(SwDMDocument);
            SwDMDocument10 swDoc10 = default(SwDMDocument10);
            SwDMDocument22 swDoc22 = default(SwDMDocument22);

            SwDmDocumentType nDocType = 0;
            SwDmDocumentOpenError nRetVal = 0;
            SwDmPreviewError nError = 0;

            // Determine type of SOLIDWORKS file based on file extension
            if (sDocFileName.ToLower().EndsWith("sldprt"))
            {
                nDocType = SwDmDocumentType.swDmDocumentPart;
            }
            else if (sDocFileName.ToLower().EndsWith("sldasm"))
            {
                nDocType = SwDmDocumentType.swDmDocumentAssembly;
            }
            else if (sDocFileName.ToLower().EndsWith("slddrw"))
            {
                nDocType = SwDmDocumentType.swDmDocumentDrawing;
            }
            else
            {
                // Probably not a SOLIDWORKS file,
                // so cannot open
                nDocType = SwDmDocumentType.swDmDocumentUnknown;
                return;
            }

            swClassFact = new SwDMClassFactory();
            swDocMgr = (SwDMApplication)swClassFact.GetApplication(sLicenseKey);
            swDoc = (SwDMDocument)swDocMgr.GetDocument(sDocFileName, nDocType, false, out nRetVal);

            swDoc10 = (SwDMDocument10)swDoc;
            swDoc22 = (SwDMDocument22)swDoc;

            object vBrokenRefs = null;
            object vIsVirtuals = null;
            object vTimeStamps = null;
            object vIsImported = null;

            string[] vDependArr = null;

            SwDMSearchOption swSearchOpt = default(SwDMSearchOption);

            swSearchOpt = swDocMgr.GetSearchOptionObject();

            vDependArr = (string[])swDoc22.GetAllExternalReferences5(swSearchOpt, out vBrokenRefs, out vIsVirtuals, out vTimeStamps, out vIsImported);

            if ((vDependArr == null)) return;

            var doc16 = (SwDMDocument16)swDoc;

            doc16.ReplaceReference(vDependArr[0], @"E:\01_Work\22_Gitee\CSharpAndSolidWorks\CSharpAndSolidWorks\TemplateModel\repleaceReference\part1new.SLDPRT");

            swDoc.Save();

            swDoc.CloseDoc();
        }

一切都在源码中,请自行下载。记得加个关注,点个赞哈。。。
如果有想法,来发表意见。

posted @
2023-02-01 17:12 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源