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

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

SolidWorks二次开发 API-增加指示标记

SolidWorks二次开发 API-增加指示标记

大家应该经常会用到solidworks的测量功能。
比如测量一个边的长度(当前正常选中之后 ,右下角就会显示长度,不必测量,所以不要抬杠哈):

我们今天要讲到的就是上面的这标记,显示了长度: 300mm

在solidworks里面它是叫Callout
Allows add-in applications to manipulate single and multi-row callouts.
它显示是需要插件上用的。但是exe上也是可以出来的。
具体的大家可以在API帮助中查找对应的信息,而且也有相关的例子。我这就不多讲了。

上代码:

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

            var colortable = (ColorTable)swApp.GetColorTable();
           

            ModelDoc2 swModel;
            ModelDocExtension swExt;
            SelectionMgr swSelMgr;
            MathUtility mathUtil;

            swModel = (ModelDoc2)swApp.ActiveDoc;
            swExt = swModel.Extension;
            swSelMgr = (SelectionMgr)swModel.SelectionManager;

            var mousePoint = (double[])swSelMgr.GetSelectionPoint2(1, -1);

            mathUtil = (MathUtility)swApp.GetMathUtility();
            calloutHandler handle = new calloutHandler();
            MathPoint mp;
            double[] vPnt = new double[3];
            vPnt[0] = 0.0;
            vPnt[1] = 0.0;
            vPnt[2] = 0.0;
            mp = (MathPoint)mathUtil.CreatePoint(mousePoint);
            Callout myCallout;
            myCallout = swExt.CreateCallout(2, handle);
            myCallout.set_Value(1, "-");
            myCallout.set_IgnoreValue(1, true);
            myCallout.set_Label2(1, "SldWorks API");
            //myCallout.SkipColon = true;
            //myCallout.TextColor[0] = t.GetColorRefAtIndex(0); 这里的颜色颜色好像没有测试出来。
            //myCallout.OpaqueColor = t.GetColorRefAtIndex(1);

            myCallout.SetLeader(true, false);
            myCallout.SetTargetPoint(0, mousePoint[0], mousePoint[1], mousePoint[2]);
            //myCallout.SetTargetPoint(2, -0.001, 0.001, 0);
            myCallout.Position = mp;
            myCallout.set_ValueInactive(0, true);
            myCallout.TextBox = false;
            myCallout.Display(true);

            TextFormat swTextFormat = myCallout.TextFormat;
            ProcessTextFormat(swApp, swModel, swTextFormat);



        }
        public void ProcessTextFormat(SldWorks swApp, ModelDoc2 swModel, TextFormat swTextFormat)
        {

            Debug.Print(" BackWards = " + swTextFormat.BackWards);
            Debug.Print(" Bold = " + swTextFormat.Bold);
            Debug.Print(" CharHeight = " + swTextFormat.CharHeight);
            Debug.Print(" CharHeightInPts = " + swTextFormat.CharHeightInPts);
            Debug.Print(" CharSpacingFactor = " + swTextFormat.CharSpacingFactor);
            Debug.Print(" Escapement = " + swTextFormat.Escapement);
            Debug.Print(" IsHeightSpecifiedInPts = " + swTextFormat.IsHeightSpecifiedInPts());
            Debug.Print(" Italic = " + swTextFormat.Italic);
            Debug.Print(" LineLength = " + swTextFormat.LineLength);
            Debug.Print(" LineSpacing = " + swTextFormat.LineSpacing);
            Debug.Print(" ObliqueAngle = " + swTextFormat.ObliqueAngle);
            Debug.Print(" Strikeout = " + swTextFormat.Strikeout);
            Debug.Print(" TypeFaceName = " + swTextFormat.TypeFaceName);
            Debug.Print(" Underline = " + swTextFormat.Underline);
            Debug.Print(" UpsideDown = " + swTextFormat.UpsideDown);
            Debug.Print(" Vertical = " + swTextFormat.Vertical);
            Debug.Print(" WidthFactor = " + swTextFormat.WidthFactor);

            Debug.Print("");

        }

如果 就是这样了哈

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