Files
envi-code/SourceCode/Code2026/StartApp/cadVerInfo.cs
T
2026-09-28 15:28:50 +08:00

264 lines
6.6 KiB
C#

using System;
using Microsoft.Win32;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;
namespace StartApp
{
public enum CadType
{
eCadType_NONE = 0,
eCadType_AutoCAD = 1,
eCadType_ZWCAD = 2,
};
class CADVerInfo
{
public CADVerInfo()
{
m_sCADName = string.Empty;
m_sMainRegKey = string.Empty;
m_sSubRegKey = string.Empty;
m_sCADLocation = string.Empty;
m_iMainVer = 0;
m_iSubVer = 0;
m_CADType = CadType.eCadType_NONE;
m_sExeName = string.Empty;
}
public string m_sExeName { get; set; }
public CadType m_CADType { get; set; }
// 产品名称 (Autocad 2014 simple chinese)
public string m_sCADName { get; set; }
// 注册表地址
public string m_sMainRegKey { get; set; } //R19.1\\ACAD-D001:8.4
public string m_sSubRegKey { get; set; } // ACAD-D001:8.4
// 安装路径
public string m_sCADLocation { get; set; } //c:\\autocad
// 主版本号
public int m_iMainVer { get; set; } //19
public int m_iSubVer { get; set; } //1
public string m_sVerStr { get; set; }
private bool setVersion(string input, CadType type)
{
if (type == CadType.eCadType_AutoCAD)
{
m_CADType = CadType.eCadType_AutoCAD;
m_sExeName = "acad.exe";
// 基础格式校验
if (string.IsNullOrEmpty(input) || input[0] != 'R' || input.Length < 2)
return false;
// 查找小数点位置
int dotIndex = input.IndexOf('.');
// 分割整数和小数部分
string integerStr = "";
string decimalStr = "";
if (dotIndex == -1)
{
// 没有小数点时,整个R后的内容为整数部分
integerStr = input.Substring(1);
}
else
{
// 提取整数部分(R后到小数点前)
if (dotIndex > 1)
integerStr = input.Substring(1, dotIndex - 1);
// 提取小数部分(小数点后到结尾)
if (input.Length > dotIndex + 1)
decimalStr = input.Substring(dotIndex + 1);
}
// 尝试转换为int类型
if (int.TryParse(integerStr, out int integerPart)
&& int.TryParse(decimalStr, out int decimalPart))
{
m_iMainVer = integerPart;
m_iSubVer = decimalPart;
m_sVerStr = string.Format("R{0}{1}", m_iMainVer, m_iSubVer);
return true;
}
}
else
{
// 基础格式校验
if (string.IsNullOrEmpty(input) || input.Length < 2)
return false;
m_CADType = CadType.eCadType_ZWCAD;
m_sExeName= "zwcad.exe";
string s;
int dotIndex = input.IndexOf('.');
if (dotIndex == -1)
{
s = input.Substring(0);
}
else
{
s = input.Substring(0, dotIndex);
}
if (int.TryParse(s, out int integerPart))
{
m_iMainVer = integerPart;
m_iSubVer = 0;
m_sVerStr = string.Format("Z{0}", m_iMainVer);
return true;
}
}
return false;
}
////////////////////////////////////////////////////////////////
private static bool getAutoCadList(ref List<CADVerInfo> cadLists)
{
string regPath = @"software\autodesk\autocad";
try
{
using (RegistryKey keyCad = Registry.LocalMachine.OpenSubKey(regPath))
{
if (keyCad == null) return false;
// 继续遍历 R18.2 下面子级别
foreach (var version in keyCad.GetSubKeyNames())
{
using (RegistryKey keyVersion = keyCad.OpenSubKey(version))
{
if (keyVersion == null) continue;
foreach (var lang in keyVersion.GetSubKeyNames())
{
using (RegistryKey keyLang = keyVersion.OpenSubKey(lang))
{
if (keyLang == null) continue;
var location = keyLang.GetValue("AcadLocation");
// 判断注册表项是否有效
if (location == null) continue;
if (Directory.GetFiles(location.ToString(), "acad.exe").Length == 0) continue;
CADVerInfo info = new CADVerInfo();
info.setVersion(version, CadType.eCadType_AutoCAD);
info.m_sMainRegKey = $"{version}\\{lang}";
info.m_sSubRegKey = lang;
info.m_sCADLocation = location.ToString();
object ProductName = keyLang.GetValue("ProductName");
if (ProductName != null)
info.m_sCADName = ProductName.ToString();
cadLists.Add(info);
// 一个版本只有一个key是有效的,不需要继续遍历了
break;
}
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show($"无法访问: {ex.Message}");
}
return (cadLists.Count > 0);
}
private static bool getZWCadList(ref List<CADVerInfo> cadLists)
{
string regPath = @"software\ZWSOFT\ZWCAD";
try
{
using (RegistryKey keyCad = Registry.LocalMachine.OpenSubKey(regPath))
{
if (keyCad == null) return false;
foreach (var version in keyCad.GetSubKeyNames())
{
using (RegistryKey keyVersion = keyCad.OpenSubKey(version))
{
if (keyVersion == null) continue;
foreach (var lang in keyVersion.GetSubKeyNames())
{
using (RegistryKey keyLang = keyVersion.OpenSubKey(lang))
{
if (keyLang == null) continue;
var location = keyLang.GetValue("Location");
// 判断注册表项是否有效
if (location == null) continue;
if (Directory.GetFiles(location.ToString(), "zwcad.exe").Length == 0) continue;
CADVerInfo info = new CADVerInfo();
info.setVersion(version, CadType.eCadType_ZWCAD);
info.m_sMainRegKey = $"{version}\\{lang}";
info.m_sSubRegKey = lang;
info.m_sCADLocation = location.ToString();
info.m_sCADName = $"中望CAD-{version}({lang})";
cadLists.Add(info);
// 一个版本只有一个key是有效的,不需要继续遍历了
break;
}
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show($"无法访问: {ex.Message}");
}
return (cadLists.Count > 0);
}
public static bool getCadList(ref List<CADVerInfo> cadLists, CadType type, int min, int max)
{
List<CADVerInfo> lst = new List<CADVerInfo>();
if (type == CadType.eCadType_AutoCAD)
getAutoCadList(ref lst);
else if (type == CadType.eCadType_ZWCAD)
getZWCadList(ref lst);
cadLists = lst.FindAll(x => x.m_iMainVer >= min && x.m_iMainVer <= max);
if (cadLists.Count == 0)
return false;
return true;
}
public static bool getCadList(ref List<CADVerInfo> cadList, List<string> versions)
{
List<CADVerInfo> lstACAD = new List<CADVerInfo>();
List<CADVerInfo> lstZWCAD = new List<CADVerInfo>();
getAutoCadList(ref lstACAD);
getZWCadList(ref lstZWCAD);
lstACAD.AddRange(lstZWCAD);
cadList = lstACAD.FindAll(x => versions.Contains(x.m_sVerStr));
if (cadList.Count == 0)
return false;
return true;
}
};
}