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-命令标签页的切换与按钮错乱问题

这是一个网友咨询的问题,说他想控制默认打开文件之后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
编辑 
收藏 
举报  
来源

C# SolidWorks 二次开发 API—零件组合之后保留颜色

C# SolidWorks 二次开发 API—零件组合之后保留颜色

solidworks默认在一个零件中把另一个零件组合进来,颜色会丢失。
组合前:

组合后:

这个例子只是简单引导一下,也是一个实际需求延申出来的。因为有时候发给客户是一个整体,并且有些颜色是有特殊意义的。
所以我们需要保留:
到这里大家可以考虑一下,有什么解决方案???

=分割线===================

方案一: 不组合,直接利用把装配另存为零件/x_t,这样能保证颜色的存在,而且发出去的是一个零件。 这样特征会丢失,同时也不方便更新后操作。

方案二: 写代码,在每次生成组合(Join)特征之后 ,把特征的颜色修改掉,改为零件的颜色。 这样保证了参数的保留,也解决了颜色 的问题。

简单方案的代码如下:

 /// <summary>
        /// 组合零件后保留零件颜色
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnJoinKeepBodyColor_Click(object sender, EventArgs e)
        {
            //请先打开45_JoinTest.sldasm

            JoinPart(@"clamp1-1@45_JoinTest", @"JoinPart2-1@45_JoinTest");

        }

        /// <summary>
        /// 组合零件
        /// </summary>
        /// <param name="BasePartSelectID">基础零件</param>
        /// <param name="JoinPartSelectId">要组合进来的零件</param>
        private bool JoinPart(string BasePartSelectID, string JoinPartSelectId)
        {
            SldWorks swApp = PStandAlone.GetSolidWorks();
            ModelDoc2 swModel = (ModelDoc2)swApp.ActiveDoc;
            AssemblyDoc assemblyDoc = (AssemblyDoc)swModel;

            var boolstatus = swModel.Extension.SelectByID2(BasePartSelectID, "COMPONENT", 0, 0, 0, false, 0, null, 0);

            assemblyDoc.EditPart();

            var resSel = swModel.Extension.SelectByID2(JoinPartSelectId, "COMPONENT", 0, 0, 0, false, 0, null, 0);

            if (resSel == true)
            {
                var resJoin = assemblyDoc.InsertJoin2(true, false);

                if (resJoin == true)
                {
                    swModel.SelectedFeatureProperties(0, 0, 0, 0, 0, 0, 0, true, false, "JoinColor");

                    assemblyDoc.EditAssembly();

                    swModel.ClearSelection();

                    boolstatus = swModel.Extension.SelectByID2(BasePartSelectID, "COMPONENT", 0, 0, 0, false, 0, null, 0);

                    assemblyDoc.OpenCompFile();

                    var swPart = (PartDoc)swApp.ActiveDoc;

                    var thisFeatureClip = (Feature)swPart.FeatureByName("JoinColor");

                    if (thisFeatureClip != null)
                    {
                        var vFaceProp = (double[])swPart.MaterialPropertyValues;

                        var vProps = (double[])thisFeatureClip.GetMaterialPropertyValues2(1, null);
                        //这里指定为红色,正常是要从被组合的零件中获取的。
                        vProps[0] = 1;
                        vProps[1] = 0;
                        vProps[2] = 0;
                        vProps[3] = vFaceProp[3];
                        vProps[4] = vFaceProp[4];
                        vProps[5] = vFaceProp[5];
                        vProps[6] = vFaceProp[6];
                        vProps[7] = vFaceProp[7];
                        vProps[8] = vFaceProp[8];

                        thisFeatureClip.SetMaterialPropertyValues2(vProps, 1, null);

                        vProps = null;

                        vFaceProp = null;
                        swPart.EditRebuild();


                    }
                }
                else
                {
                    MessageBox.Show("Error to Insert Join!");
                }
            }

            return true;
        }
   

结果如下图:

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

SolidWorks二次开发API (C#)—工程图中获取注释或球标关联的零件

SolidWorks二次开发API (C#)—工程图中获取注释或球标关联的零件

最近因为一些原因,博客没更新。
这篇文章给大家介绍一下工程图中怎么获取零件对象,这个问题之前也有网友问过,一直在计划中。

下面这个简单的工程图中,我们要获取clamp这个零件,我们可以选择的方式很多:

  • 左侧特征树
  • 关联和球标
  • 关联的注释文字
  • 零件上面的面/边/线

也许还有别的方式:

大家可以自己思考一下,上在这几种方式都如何去获取到这个零件。
模板文件在源代码中: TemplateModel\TempAssembly.SLDDRW

给大家十分钟,能搞定,就不用继续看了。


直接上代码加注释:

        /// <summary>
        /// 这里有两种代码,一个是直接在工程图中选中了零件,另一个在工程图中选中了注释 或者球标(有引线指向零件)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnGetCompFromBalloon_Click(object sender, EventArgs e)
        {
            SldWorks swApp = PStandAlone.GetSolidWorks();

            var swModel = swApp.IActiveDoc2;

            //var drawingDoc = (DrawingDoc)swModel;

            //选择管理器
            var swSelMgr = (SelectionMgr)swModel.SelectionManager;

            //检查是否有选择对象
            if (swSelMgr.GetSelectedObjectCount2(-1) == 0)
            {
                MessageBox.Show("还有没选择对象");
                return;
            }

            //遍历选中对象 (经验觉得第一个选中对象一直是视图,第二个开始才是要选中的对象)
            //所以下在的循环应该可以从2开始
            for (int i = 1; i <= swSelMgr.GetSelectedObjectCount(); i++)
            {
                //获取选中的对象,转为DrawingComponent
                var swDrawingComponent = (DrawingComponent)swSelMgr.GetSelectedObjectsComponent4(i, -1);

                if (swDrawingComponent != null)
                {
                    var swComponent = (Component2)swDrawingComponent.Component;

                    MessageBox.Show(swComponent.Name2);
                }

                //如果选择的是球标 或者 注释
                if (swSelMgr.GetSelectedObjectType3(i, -1) == (int)swSelectType_e.swSelNOTES)
                {
                    //获取Note
                    var thisNote = (Note)swSelMgr.GetSelectedObject6(i, -1);
                    //获取Annotation
                    var ann = (Annotation)thisNote.GetAnnotation();
                    //获取关联实体
                    var attEntity = (Entity)ann.IGetAttachedEntities();
                    //获取实体所对应的Component
                    var comp = attEntity.IGetComponent2();

                    MessageBox.Show(comp.Name2);
                }
            }
        }
  

完美运行


源代码在码云和github上都有,地址就不贴了,自己找下就有。

posted @
2023-01-14 11:26 
painezeng  阅读(
1)  评论(
0
编辑 
收藏 
举报  
来源