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
编辑 
收藏 
举报  
来源

C# SolidWorks二次开发 API-尺寸链标注

C# SolidWorks二次开发 API-尺寸链标注

今天天气好,适合放大招。
快过年了,提前祝大家

先上结果吧,尺寸链标注:

主要功能就是针对视图上的一些孔,进行尺寸链标注。
主要代码如下:


        private void btnOrdinateDimension_Click(object sender, EventArgs e)
        {

            //请先打开HolePlate-2.slddrw文件

            var swApp = PStandAlone.GetSolidWorks();

            var swModel = (ModelDoc2)swApp.ActiveDoc;

            var swDrawing = (DrawingDoc)swModel;

            //这里改成工程图中的视图名称

            swDrawing.ActivateView("Drawing View1");


            #region 遍历并删除
            //得到视图对象
            var swView = (View)swDrawing.ActiveDrawingView;


            //找最小点
            var baseOrigin = FindOriginVertex(swApp, swView);

            var circleEdges = AddCenterPointForCircle(swApp, swView);

            //视图的外围位置 

            var viewLoc = (double[])swView.GetOutline();


            (baseOrigin as Entity).Select(false);

            // 这里还有个坐标相同的处理可以优化。

            foreach (var item in circleEdges)
            {
                (item as Entity).Select(true);

            }


            swDrawing.AddOrdinateDimension2((int)swAddOrdinateDims_e.swHorizontalOrdinate, 0, viewLoc[1] - 0.01, 0);


            (baseOrigin as Entity).Select(false);

            foreach (var item in circleEdges)
            {
                (item as Entity).Select(true);

            }

            swDrawing.AddOrdinateDimension2((int)swAddOrdinateDims_e.swVerticalOrdinate, viewLoc[0] - 0.01, 0, 0);

            #endregion




            MessageBox.Show("操作完成");



        }

        public Vertex FindOriginVertex(SldWorks swApp, View view)
        {
            Vertex resVertex = null;

            var vComps = (object[])view.GetVisibleComponents();

            foreach (var Comp in vComps)
            {
                var swComp = (Component2)Comp;
                //所以可见点
                var visbaleEnts = (object[])view.GetVisibleEntities2(swComp, (int)swViewEntityType_e.swViewEntityType_Vertex);

                for (int i = 0; i < visbaleEnts.Count(); i++)
                {
                    var swVertex = (Vertex)visbaleEnts[i];
                    (swVertex as Entity).Select(false);
                    if (resVertex == null)
                    {
                        resVertex = swVertex;

                    }
                    else
                    {
                        var vCurOrigCoord = GetVertexCoordinate(swApp, resVertex, view.ModelToViewTransform);
                        var vCoord = GetVertexCoordinate(swApp, swVertex, view.ModelToViewTransform);

                        if (vCoord[0] < vCurOrigCoord[0] && vCoord[1] < vCurOrigCoord[1])
                        {

                            resVertex = swVertex;
                        }



                    }


                }



            }

            return resVertex;

        }

        public List<Edge> AddCenterPointForCircle(SldWorks swApp, View view)
        {
            List<Edge> res = new List<Edge>();



            var vComps = (object[])view.GetVisibleComponents();

            foreach (var Comp in vComps)
            {
                var swComp = (Component2)Comp;
                //所有可见面
                var visbaleEnts = (object[])view.GetVisibleEntities2(swComp, (int)swViewEntityType_e.swViewEntityType_Face);

                for (int i = 0; i < visbaleEnts.Count(); i++)
                {
                    var swFace = (Face2)visbaleEnts[i];

                    var swThisLoop = (Loop2)swFace.GetFirstLoop();
                    while ((swThisLoop != null))
                    {
                        // Hole is inner loop
                        // Circular or elliptical hole has only one edge
                        bool bCount;
                        var bRet = swThisLoop.IsOuter();  //外环
                        var count = swThisLoop.GetEdgeCount(); //边数
                        if (count != 1 && count != 4)
                        {
                            bCount = false;
                        }
                        else
                        {
                            var edges = (object[])swThisLoop.GetEdges();

                            foreach (var e in edges)
                            {
                                var tempEdge = e as Edge;

                                if (tempEdge.IGetCurve().IsCircle())
                                {
                                    res.Add(tempEdge);
                                }
                            }

                            bCount = true;
                        }


                        // Move on to the next
                        swThisLoop = (Loop2)swThisLoop.GetNext();
                    }




                }



            }


            return res;

        }



        private double[] GetVertexCoordinate(SldWorks swApp, Vertex resVertex, MathTransform swViewTransform)
        {
            var vCoorPt = resVertex.GetPoint();
            var swMathPt = (MathPoint)swApp.IGetMathUtility().CreatePoint(vCoorPt);
            swMathPt = (MathPoint)swMathPt.MultiplyTransform(swViewTransform);
            return (double[])swMathPt.ArrayData;
        }

顺带讲一讲思路,通过Solidworks提供的一些API去找到工程图上视图的一些点 边 过滤后进行相应的标注动作。
源码还是在gitee上,国内下载比较快。github有些人还上不去。
需要的自取哈

posted @
2023-01-10 13:45 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源