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—方法中有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
编辑 
收藏 
举报  
来源

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

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

C# SolidWorks 二次开发 API—让用户选择对象后执行操作

C# SolidWorks 二次开发 API—让用户选择对象后执行操作

在做一些交互操作的时候,有时候需要用户做选择。比如对象很多的时候,让用户指定选择某个特征,或者基准面等等。
我用一个简单的例子说明一下如何处理。
这个是例用了solidworks提供的事件来操作,我们需要进行事件的绑定。
查看我的API中文宝典,发现有个官方例子:

这例子也比较简单,我就不多说了。

代码部分:

  //用于事件对象共享。
        private PartDoc partDoc = null;

        private void btnUserSelectFirst_Click(object sender, EventArgs e)
        {
            SldWorks swApp = Utility.ConnectToSolidWorks();

            if (swApp != null)
            {
                ModelDoc2 swModel = (ModelDoc2)swApp.ActiveDoc;

                partDoc = swModel as PartDoc;
                //为当前文件增加选择对象之后 通知事件
                partDoc.UserSelectionPostNotify += PartDoc_UserSelectionPostNotify;
            }
        }

        /// <summary>
        /// 选择之后 处理事件内容
        /// </summary>
        /// <returns></returns>
        private int PartDoc_UserSelectionPostNotify()
        {
            SldWorks swApp = Utility.ConnectToSolidWorks();

            ModelDoc2 swModel = (ModelDoc2)swApp.ActiveDoc;

            var swSelMgr = (SelectionMgr)swModel.SelectionManager;

            var selectType = swSelMgr.GetSelectedObjectType3(1, -1);

            SendMessageToUser("You Select :" + Enum.GetName(typeof(swSelectType_e), selectType));

            return 1;
        }

        /// <summary>
        /// 做完通知之后 ,去掉事件绑定
        /// </summary>
        /// <param name="s"></param>
        private void SendMessageToUser(string s)
        {
            SldWorks swApp = Utility.ConnectToSolidWorks();

            ModelDoc2 swModel = (ModelDoc2)swApp.ActiveDoc;

            swApp.SendMsgToUser(s);

            partDoc.UserSelectionPostNotify -= PartDoc_UserSelectionPostNotify;
        }

逻辑如下:当点击界面上的按钮之后,会给当前零件增加一个事件绑定。用于当用户选择对象之后,进行某些操作。
执行完操作之后,删除绑定(这里按实际需要处理)。

我这个例子结果如下:

posted @
2022-12-23 11:51 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源

C# SolidWorks 二次开发 API —取整坐标

C# SolidWorks 二次开发 API —取整坐标

这是博文来自于网友的提问。
从CAD中复制一些轮廓到Solidworks的草图里面之后,因为软件转换的精度问题,会导致草图直线的一些坐标出来1999.88这种小数,但是实际都是要取整的。 咨询我有没有好的办法可以解决这个问题。
思路: 遍历草图直线,或者端点,在获取完坐标之后 进行取整操作,并修改坐标点位。(因为当前草图全部为活动状态,所以就可以任意修改)
原始状态:

关键代码:

        private void btnRoundPointLoc_Click(object sender, EventArgs e)
        {
            SldWorks swApp = PStandAlone.GetSolidWorks();

            ModelDoc2 swModel = default(ModelDoc2);
            ModelDocExtension swModelDocExt = default(ModelDocExtension);
            SelectionMgr swSelMgr = default(SelectionMgr);
            Feature swFeature = default(Feature);

            //连接文件

            swModel = (ModelDoc2)swApp.ActiveDoc;

            swModelDocExt = (ModelDocExtension)swModel.Extension;

            //选中草图
            var status = swModelDocExt.SelectByID2("Sketch1", "SKETCH", 0, 0, 0, false, 0, null, 0);

            swSelMgr = (SelectionMgr)swModel.SelectionManager;
            //转换
            swFeature = (Feature)swSelMgr.GetSelectedObject6(1, -1);
            //进入编辑草图
            swModel.EditSketch();

            //获取草图中的所有草图点来修改坐标

            var swSketch = (Sketch)swFeature.GetSpecificFeature2();

            var points = (object[])swSketch.GetSketchPoints2();

            for (int i = 0; i < points.Length; i++)
            {
                var p = (SketchPoint)points[i];

                var x = p.X * 1000;
                var y = p.Y * 1000;

                p.X = Math.Round(x, 0) / 1000;
                p.Y = Math.Round(y, 0) / 1000;

                //Debug.Print(p.X.ToString() + " " + p.Y.ToString());
            }

            swModel.EditRebuild3();

            swModel.EditSketch();

            MessageBox.Show("完成了!");
        }

结果:

posted @
2022-12-22 10:18 
painezeng  阅读(
0)  评论(
0
编辑 
收藏 
举报  
来源