C# SolidWorks二次开发-实战2,解决SolidWorks2024转step文件名乱码问题

故事

复制代码
	有网友说SolidWorks2024转的Step在低版本上打开是乱码,我第一反映是很奇怪,这是为什么。Solidworks还能有这个低级问题,是欺负中文吗。

测试

复制代码
	我在刚安装的SolidWorks 2024 Sp5.0上自己设计了个强大的模型,如下图:

导出为step文件格式后我再用SolidWorks自己打开,居然打不开。是我人品不好吗? 总装配不显示,而且此时打开的零件文件名我是真的看不懂。(已知原因是因为开了,去掉后就能正常打开,还是非中文)

单独显示后,确实还是我的零件。

我又找了一个低版本的Solidworks 2018来开,这应该就是传说中乱码了。

我再换一个SolidWorks2021打开,结果一样。

猜测一下原因,估计是SolidWorks 要支持更新版本的step版本242,导致的一些问题,我找了一2024中的一些设置,也没找到,可能是因为我没学会吧。

解决思路

复制代码
如果是客户发的step文件名你是不知道的,这样也不好分析是什么编码。不过大概率是utf字符集相关的问题。
目前我自己测试的情况下,就知道乱码前和乱码后的对应关系。我们从这个来反推如何修复这个文件名。

先看第一个结果 零件1 变成了 _X2_96f64ef6_X0_1

这时候我发现了一些情况,X2 X0这些奇怪的东西。为了更全面的验证,我重新修改了一些文件名,让中文 英文 和数字和字符混合出现。

有没有发现什么规律?
这个X2+字符+X0是成对出现的

先查一下中文可以转换成什么

再一个字符转换的网站看一下

看到这个结果和_X2_96f64ef6_X0_1有什么相似之处?

就是中间都有96f6和4ef6(忽略大小写)

看起来Unicode更好,除了每个是用\u开头,其它没有什么特殊的字符。

那么大概率的解决方案就出来了。

  1. 想办法提取汉字转换成unicode的每一组英文+数字
  2. 给母一组前面加上\u再转换成汉字,再拼接起来
  3. 之前是数字或者字母的原位置进行拼接
  4. 拼之前检查长度是否是4的倍数
  5. 异常处理
  6. 读取solidworks文件名,重新命名为解析过的汉字 。

这个时候简单的问一下Chat gpt 让它帮忙写代码

csharp 复制代码
using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string input = "_X2_5b5088c5914d4f53_X0_AAA_X2_59297a7a_X0_BBBB";
        
        // 提取 _X2_ 和 _X0_ 之间的内容
        string pattern = @"_X2_(.*?)_X0_";
        MatchCollection matches = Regex.Matches(input, pattern);
        
        foreach (Match match in matches)
        {
            string hexString = match.Groups[1].Value;
            string result = ConvertHexToUnicode(hexString);
            Console.WriteLine(result);
        }
    }

    static string ConvertHexToUnicode(string hex)
    {
        string result = "";
        for (int i = 0; i + 3 < hex.Length; i += 4)
        {
            string unicodeHex = hex.Substring(i, 4);
            int code = Convert.ToInt32(unicodeHex, 16);
            result += char.ConvertFromUtf32(code);
        }
        return result;
    }
}

大概代码没问题,再让它优化一下。

csharp 复制代码
        private void buttonUnicode_Click(object sender, EventArgs e)
        {
            
            
            string input = "_X2_5b5088c5914d4f53_X0_AAA_X2_59297a7a_X0_BBBB";

            MessageBox.Show($@"输入前->{input}"+System.Environment.NewLine + $@"输入后->{ConvertUnicode(input)}");


        }

        private static string ConvertUnicode(string input)
        {
            string output = Regex.Replace(input, @"_X2_(.*?)_X0_", match =>
            {
                string hexString = match.Groups[1].Value;
                return ConvertHexToUnicode(hexString);
            });
            return output;  
        }


        static string ConvertHexToUnicode(string hex)
        {
            string result = "";
            for (int i = 0; i + 3 < hex.Length; i += 4)
            {
                string unicodeHex = hex.Substring(i, 4);
                int code = Convert.ToInt32(unicodeHex, 16);
                result += char.ConvertFromUtf32(code);
            }
            return result;
        }

结果如下:

说明看起来没有什么大问题了。

下一步就是连接solidWorks 修改名称了。

这个就直接上代码,也没用什么api

csharp 复制代码
 private void buttonUnicode_Click(object sender, EventArgs e)
        {
            //请先打开SolidWorks 并
            SldWorks swApp = Utility.ConnectToSolidWorks();

            //打开step文件,并保存一下。
            var swModel = (ModelDoc2)swApp.ActiveDoc;

            var swAssembly = swModel as AssemblyDoc;
            if (swAssembly != null)
            {

                var allComps = (object[])swAssembly.GetComponents(false);

                var allCompList = allComps.Cast<Component2>().ToList();

                //var allCompList = Array.ConvertAll(allComps, x => (Component2)x);

                for (var index = 0; index < allCompList.Count; index++)
                {
                    var comp = allCompList[index];
                    var filePath = comp.GetPathName();

                    var tempName = System.IO.Path.GetFileNameWithoutExtension(filePath);
                    //var tempFolder = System.IO.Path.GetDirectoryName(filePath);
                    //var tempExt = System.IO.Path.GetExtension(filePath);

                    var ConvertName = ConvertUnicode(tempName);


                    if (!string.Equals(ConvertName, tempName, StringComparison.OrdinalIgnoreCase))
                    {
             
                        var status = swModel.Extension.SelectByID2(comp.GetSelectByIDString(), "COMPONENT", 0, 0, 0, false, 0, null, 0);
                        
                        var renameRes = swModel.Extension
                            .RenameDocument($@"{ConvertName}");

                        if (renameRes!=0)
                        {
                            MessageBox.Show($@"{comp.Name2}改名失败,请检查。");
                        }

                    }

                 
                }
            }

            MessageBox.Show($@"改名完成。");



        }

执行一次,发现有时候不成功。

经过我的分析,在打开step模型的时候,solidworks自己会在后台新建如零件1 零件2 这种模型。这时候就算保存到文件夹,这些文件也还在后台,而刚好我这测试的零件文件名就是零件1 这种,就会改不了名。

重开后执行,完成。 这里就是经验问题了。不成功的时候,可以先关闭之前的再改,可能 能成功哟。

相关推荐
ArabySide2 分钟前
【WCF】通过AOP实现基于JWT的授权与鉴权的实践
c#·jwt·aop·wcf
xiaowu08032 分钟前
C# Task异步的常用方法
c#
阿蒙Amon34 分钟前
C# Linq to Objects 详解:集合处理的终极方案
c#·solr·linq
钢铁男儿38 分钟前
C# 委托(调用带引用参数的委托)
java·mysql·c#
番茄小能手1 小时前
【全网唯一】C# 纯本地离线文字识别Windows版dll插件
开发语言·c#
葬歌倾城2 小时前
waferMap图像渲染
c#·wpf
甄天3 小时前
WPF路由事件:冒泡、隧道与直接全解析
c#·wpf·visual studio
专注VB编程开发20年4 小时前
C#,VB.NET从JSON数据里提取数组中的对象节点值
c#·json·.net
Accpdaiyekun5 小时前
C# 操作mongodb 多次查询快还是使用管道查询速度快
mongodb·c#·lua
Dm_dotnet6 小时前
C#:wpf ui 4.0 是如何实现页面导航的?
c#