c# 把solidworks装配体里所有零件绝对位置暴露给龙虾/agent/cursor
复制装配体内的链条护板到E:\cqh-图纸\设计模型库\链条护板\测试
先通过插件桥查找装配体里的「链条护板」路径,再复制到目标目录。
{
“success”: true,
“message”: “pong”
}
“drawingPath”: “E:\code\试验\装配体导出\链条护板\链条护板1800-小孔.slddrw”,
“hasDrawing”: true
}
]
}
L1015x95��������-��.SLDPRT 775951 2026/6/16 14:26:26
��������1800-���.slddrw 266567 2026/6/17 16:54:13
��������1800-���.SLDPRT 859116 2026/6/16 14:45:14
��������1800-��.slddrw 343727 2026/6/17 16:54:13
��������1800-��.SLDPRT 878729 2026/6/16 14:45:05
第一个零件的 .sldprt 因路径拼写错误未复制,正在补拷。
L1015x95��������-��.SLDPRT (757.8 KB)
��������1800-���.slddrw (260.3 KB)
��������1800-���.SLDPRT (839 KB)
��������1800-��.slddrw (335.7 KB)
��������1800-��.SLDPRT (858.1 KB)
已从当前装配体 E:\code\试验\装配体导出\装配体3.SLDASM 中,将 4 个链条护板零件(含工程图)复制到目标目录:
E:\cqh-图纸\设计模型库\链条护板\测试
零件名 数量 已复制文件
L1015x95链条护板-14齿
2
.SLDPRT + .slddrw
L1015x95链条护板-小孔
1
.SLDPRT + .slddrw
链条护板1800-大孔
1
.SLDPRT + .slddrw
链条护板1800-小孔
1
.SLDPRT + .slddrw
共 8 个文件(4 个零件 + 4 个工程图)。
如果只想复制其中某一个(例如只复制「1800-大孔」),告诉我零件名即可
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;
using tools;
namespace SolidWorksAddinStudy.Services
{
/// <summary>
/// 从装配体 BOM 采集零件 <c>.sldprt</c> / <c>.sldasm</c> 与同级 <c>.slddrw</c> 磁盘路径(供 Cursor / HTTP 桥接)。
/// </summary>
public sealed class AssemblyPartFileInfo
{
public string PartName { get; set; } = string.Empty;
public string PartType { get; set; } = string.Empty;
public string Quantity { get; set; } = string.Empty;
public string PartPath { get; set; } = string.Empty;
public string DrawingPath { get; set; } = string.Empty;
public bool HasDrawing { get; set; }
}
public static class AssemblyPartPathService
{
/// <summary>
/// 须在 SolidWorks 主线程调用:从装配体 BOM 列出各零件文件路径及同级工程图路径(按零件路径去重)。
/// </summary>
/// <param name="nameKeyword">非空时仅保留零件名包含该子串的行(忽略大小写)。</param>
public static bool TryCollectFromAssembly(
SldWorks swApp,
ModelDoc2 assemblyModel,
string? nameKeyword,
out string assemblyPath,
out List<AssemblyPartFileInfo> rows,
out string errorMessage)
{
assemblyPath = string.Empty;
rows = new List<AssemblyPartFileInfo>();
errorMessage = string.Empty;
if (swApp == null)
{
errorMessage = "SolidWorks 未连接";
return false;
}
if (assemblyModel == null || assemblyModel.GetType() != (int)swDocumentTypes_e.swDocASSEMBLY)
{
errorMessage = "当前文档不是装配体";
return false;
}
assemblyPath = assemblyModel.GetPathName()?.Trim() ?? string.Empty;
if (string.IsNullOrEmpty(assemblyPath))
{
errorMessage = "请先保存装配体文件";
return false;
}
try
{
List<TaskPaneBomPartRow>? bomRows =
asm2bom.CollectPartRowsForTaskPaneAsync(swApp, assemblyModel).GetAwaiter().GetResult();
if (bomRows == null)
{
errorMessage = "采集 BOM 失败(返回为空)";
return false;
}
string keyword = (nameKeyword ?? string.Empty).Trim();
var seenPaths = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
foreach (TaskPaneBomPartRow r in bomRows)
{
if (r == null)
{
continue;
}
string partName = (r.PartName ?? string.Empty).Trim();
if (partName.Length == 0)
{
continue;
}
if (keyword.Length > 0
&& partName.IndexOf(keyword, StringComparison.OrdinalIgnoreCase) < 0)
{
continue;
}
string partPath = (r.PartPath ?? string.Empty).Trim();
if (partPath.Length == 0)
{
continue;
}
if (!seenPaths.Add(partPath))
{
continue;
}
string drawingPath = PartDrawingDrwFileStatus.GetSiblingSlddrwPath(partPath);
rows.Add(
new AssemblyPartFileInfo
{
PartName = partName,
PartType = r.PartType ?? string.Empty,
Quantity = r.Quantity ?? string.Empty,
PartPath = partPath,
DrawingPath = drawingPath,
HasDrawing = drawingPath.Length > 0
});
}
return true;
}
catch (Exception ex)
{
Debug.WriteLine($"AssemblyPartPathService.TryCollectFromAssembly: {ex}");
errorMessage = ex.Message;
return false;
}
}
}
}
更多推荐




所有评论(0)