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

C# SolidWorks 二次开发 API—插件的打包注册与分发

C# SolidWorks 二次开发 API—插件的打包注册与分发

在完成插件的开发之后,我们需要把软件分发到用户的机器上面。
一般我使用的有两种方法:

  1. 直接插件注册:
    这也是我最常用的方法了,直接利用安装器把插件注册一下,重新打开solidworks就可以了。
    使用这个有一个条件,就是你的其它dll都是.net可以直接调用的,不需要再次注册的情况。 就目前的理解来看,大多数情况都可以直接使用这个工具就行了。
    大家如果还有别的需求也可以去修改此工具来进行操作,比如,批量安装时的创建路径,复制文件。

    下载路径:https://gitee.com/painezeng/SolidWorksAddinInstaller

  2. 制作安装包:
    这一种情况感觉比较高端一点,可以生成msi格式的安装包,就像网上下载的其它软件一样,需要进行安装,公司的IT可以进行批量推送安装插件。
    这种方式我经常使用的是Inno Setup 5这个软件,来制作安装包。它的功能比较强大,大家可以自行学习。
    它的好处就是当前有很多文件需要包装的时候,压缩比还是不错的。
    能够生成快捷方式,插件注册,文件释放,程序菜单的生成,自动生成删除程序的信息,可以在windows的程序列表中显示。
    可以设置多种语言文件,还有安装时显示各种许可信息。

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

C# SolidWorks 二次开发 API—方法中有I和没有I的区别

C# SolidWorks 二次开发 API—方法中有I和没有I的区别

在api帮助中查找资料的时候,可能大家都会有一些疑问。一个对象有会出现名称差异,功能描述一样的。一个带字母 “I” 一个不带。
如下图,我们之前的代码中最常用的ActiveDoc

其实api帮助最前面有提到过这个,只是一般人不会从头开始看。

以及名个语言语法上的区别示例:

回归正题:
带I的是属于接口,返回的是指定对象的类型,无法直接进行事件访问。


看这两个图中,最明显的就是带i的对象中没有小闪电的事件访问。

如果开发中不涉及事件的处理,尽量都使用带I的接口对象,这样不需要进行强制类型转换。
如以前我们经常写的:
获取当前文档

 ModelDoc2 swModel = (ModelDoc2)swApp.ActiveDoc;

就可以写成

 ModelDoc2 swModel = swApp.IActiveDoc2;

当然最简单的肯定是前面直接用var代替:

 var swModel = swApp.IActiveDoc2;

从api帮助第一个内容开始看,你会发现很多知识点都有说明。希望对大家有所帮助。

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

SolidWorks二次开发 API-获取当前语言与重命名文件

SolidWorks二次开发 API-获取当前语言与重命名文件

新的一年了,开始新的分享。
做SolidWorks二次开发的时候,难免会遇到多语言的问题。
针对不同语言的客户生成不同语言的菜单,所以我们要知道Solidworks的当前界面语言是什么。
这个就简单的说一下方法: GetCurrentLanguage
看结果:


这个说明比较清楚,还有个相对应的方法,看上面这个例子。
Get Language and Localized Menu Names (VBA)

当然在实际 开发中可以采用资源文件来进行多语言处理,这里就不多介绍了。

下面我们主要看一下如何重命名文件。
就是下面这个

先录制宏,看一下有没有什么收获。
好像是可以录到,关键方法是RenameDocument
关闭当前装配后重新执行宏,也可以执行成功。说明没有问题。

上Api中搜索一下。

看api中的描述说明,临时把选中的组件重命名为指定的名称
关于返回值表示的结果状态,也需要大家注意。

然后备注里说有一些要注意的点,而且提到了另一个方法IRenamedDocumentReferences 大家可以扩展看一下。

还是老样子,改写成C#语句。
这个重命名,前提是要选中对应的组件。
上代码:

     var swModel = (ModelDoc2)swApp.ActiveDoc;

            var boolstatus = swModel.Extension.SelectByID2("bodies-零件2-1@bodies", "COMPONENT", 0, 0, 0, false, 0, null, 0);

            var longstatus = swModel.Extension.RenameDocument("bodies-零件2-newName");

            if (longstatus==0)
            {
                swApp.SendMsgToUser("已经重命名!保存后生效。");
             }
            else
            {
                swApp.SendMsgToUser("失败了!");
            }


这里给大家一个思考,这样修改了文件名,旧的文件还在吗? 工程图的名称怎么办?
再一个是如何做到批量修改,做到方便快速的得到想要的结果 。
所以说要达到实用标准还是有很多的东西要考虑的。

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