# 模型反馈与图像

## 1. 先读轻量摘要

```aardio
import com.sldWorks;
import JSON;
var sw,err = com.sldWorks(false);
if(!sw){ print(err); return; }
var info,infoError = sw.GetDocInfo();
if(!info){ print(infoError); return; }
print(JSON.stringify(info,true));
```

`GetDocInfo(doc)` 返回普通表，不含 COM 对象：

| 字段 | 含义 |
| --- | --- |
| `title,path` | 当前标题与文件路径；尚未保存时 path 为空字符串 |
| `documentType,documentTypeName` | 1/part、2/assembly、3/drawing |
| `modified,readOnly` | 未保存修改、只读打开标志 |
| `configuration,configurations` | 零件或装配体的活动配置与全部配置名 |
| `units` | 文档显示单位：`length`/`angle` 名称与 `lengthFactor`/`angleFactor`（每米、每弧度对应的单位数，例如 mm 为 1000） |
| `material` | 仅零件：`name`、`database`、`density`（kg/m³）；未指定材料时名称为空、密度为文档默认值 |
| `selectionCount` | 当前选择数 |
| `hasActiveSketch` | 原生接口是否返回活动草图；工程图的图纸草图也可能为 true |
| `editingSketch` | 仅零件/装配体提供；工程图不以此字段推断 UI 编辑模式 |
| `solidBodyCount,surfaceBodyCount` | 仅零件；包含隐藏实体 |
| `approximateBounds,boundsUnit` | 仅非空零件；`[xmin,ymin,zmin,xmax,ymax,zmax]`，单位 m |

工程图即使没有进入零件式的草图编辑，也可能返回活动图纸草图。因此不要把 `hasActiveSketch=true` 直接当作“需要退出草图”的命令条件。

它不自动激活或重建文档，不计算质量，也不递归读取装配体/特征树。大模型需要什么再取什么，避免每个动作后都遍历全部几何。

## 2. 有限的特征诊断

```aardio
import com.sldWorks;
var sw,err = com.sldWorks(false);
if(!sw){ print(err); return; }
var features,truncated = sw.GetFeatures(,200);
if(!features){ print(truncated); return; } // 失败时第 2 返回值为错误说明

var issues = [];
for i,item in features {
    if(item.code) table.push(issues,item);
}
print({issues=issues;truncated=truncated;scanned=#features});
```

每项包含 `index,name,typeName,suppressed,code,isWarning`；草图特征（`ProfileFeature`）另有 `constrainedStatus,constrainedStatusName`（3/`fullyDefined` 才是完全定义）：

- `typeName` 来自 `GetTypeName2()`，不依赖界面语言；`name` 可能被用户修改或本地化。
- `code=0` 表示该特征没有报告错误。非零时才检查 `isWarning`。
- `truncated=true` 表示达到数量上限，后面还有特征。默认上限 200，可指定 1..10000。
- 只读取顶层特征，不递归子特征，不保证顺序等同于 UI 的 FeatureManager 树。
- “已扫描项目无错误”不是整个模型的完整健康证明；压缩、未解析、子特征和任务几何要求仍需单独检查。

需要原生特征对象时用 `eachFeature(doc)` 或 `FindFeature(doc,name)`。不要把 COM 对象放进 JSON 结果；提取实际需要的字段。

## 2.1 草图状态、尺寸与面

```aardio
import com.sldWorks;
var sw,err = com.sldWorks(false);
if(!sw){ print(err); return; }
var doc,findError = sw.FindDoc();
if(!doc){ print(findError); return; }

// 本段针对 plate-with-hole 示例创建的零件。
print(sw.GetSketchInfo(doc,"AA_Profile"));          // constrainedStatusName、segmentCount、contourCount ...
var dimensions,truncated = sw.GetDimensions(doc,"AA_Block");
for i,item in dimensions { print(item.fullName,item.value,item.unit,item.driven); }
var faces = sw.GetFaces(doc);
for i,face in faces {
    if(face.isPlane) print(face.index,face.normal,face.area,face.point);
}
```

- `GetSketchInfo(doc,feature)`：草图是否完全定义（`fullyDefined`）、线段/点/闭合轮廓/区域数量。拉伸前要求至少一个闭合轮廓；欠定义草图仍可拉伸，但设计意图不稳定。
- `GetDimensions(doc,feature,limit)`：特征及其草图的全部显示尺寸，值为米或弧度；`driven=true` 的从动尺寸不能驱动几何。省略 `feature` 时遍历全部顶层特征并按 `fullName` 去重。
- `SetDimension(doc,"D1@AA_Block",0.03[,configuration[,rebuild]])`：写入、重建、读回；状态码 0 以外返回 `null,说明,状态码`（2 无效值、3 从动尺寸、5 冻结特征）。
- `GetFaces(doc,limit)`：零件所有实体的面。`normal` 只对平面给出；`point` 是面上实际点，直接用于 `SelectByPoint(doc,"FACE",...)`、`NewSketch` 目标。`index` 在特征变更后会改变，不是持久引用。

## 3. 整体质量属性与 SI 单位

`GetMassProperties(doc,accuracy)` 返回：

- `centerOfMass`：质心 `[x,y,z]`，米。
- `volume`：立方米。
- `surfaceArea`：平方米。
- `mass`：千克。
- `inertia`：质心处 `[XX,YY,ZZ,XY,ZX,YZ]`，kg·m²。
- `units`：单位说明；`status`：原生计算状态。

`accuracy` 可为 0（现有精度）、1（默认）、2（最高）。本库使用兼容接口 `GetMassProperties2(...,false)`，明确计算整个模型，而不是当前选中的组件子集；不会清除选择。此原生接口已被较新的 `IMassProperty2` 取代，但仍用于提供清晰的整体范围与兼容行为。

只有零件/装配体支持质量属性。空零件、纯曲面模型、未解析模型等情况可能计算失败，会返回 `null,说明,原生状态码`，不会用 0 冒充有效结果。装配体压缩组件不计入计算。

**质量依赖材质/密度及模型设置。** 未指定材质时，不能从“质量有数值”推断材料正确；验证普通几何时通常优先检查体积。

| 换算 | 公式 |
| --- | --- |
| m → mm | × 1000 |
| m² → mm² | × 1000000 |
| m³ → mm³ | × 1000000000 |
| kg → g | × 1000 |

## 4. 当前模型视图导出

```aardio
import com.sldWorks;
var sw,err = com.sldWorks(false);
if(!sw){ print(err); return; }
var doc,findError = sw.FindDoc();
if(!doc){ print(findError); return; }

// view 参数：isometric/front/top/... 先切换标准视图再缩放到适合；"fit" 仅缩放；省略则保持当前视角。
var image,imageError = sw.CaptureView("/output/model.png",doc,960,720,"isometric");
if(!image){ print(imageError); return; }
print(image); // path,width,height,title,documentPath,source
```

`CaptureView(path,doc,width,height,view)`：

- 默认尺寸 1024 × 768，宽高为 0..8192 的整数。任一为 0 时由原生接口使用当前窗口尺寸；请读返回的实际尺寸。
- `path` 省略时生成临时 PNG。也支持 BMP、JPG、JPEG。
- 自动创建图像目录；先由 `SaveBMP` 生成中间 BMP，再用 GDI+ 实际转码，不是只改扩展名。
- 会激活目标文档并重绘；省略 `view` 时不改变视角/缩放。`view` 可为 `fit`、`front`、`back`、`left`、`right`、`top`、`bottom`、`isometric`、`trimetric`、`dimetric` 或 `swStandardViews_e` 数值 1..9；工程图只执行缩放到适合。不自动重建或保存模型。
- 返回 `{path,width,height,title,documentPath,source="model-view"}`；失败返回 `null,说明`。
- 中间 BMP 自动清理。最终图像由调用者管理；临时反馈用完后可 `io.remove(image.path)`。

这是**模型视图**，不是桌面截图，也不包含独立对话框、完整软件界面或文件的旧预览缩略图。不要把图像像素直接视为草图平面上的米制坐标。

不保证最小化、隐藏文档、无交互桌面或异常显卡驱动环境下仍能正确渲染。若图像为空白/黑屏，应检查窗口和图形环境；函数成功仅表示文件生成，不证明视觉内容正确。

## 5. 反馈优先级

1. 先核对目标路径、类型、配置、编辑状态。
2. 判断 API 返回对象/布尔值及错误、警告码。
3. 重建后验证实体数、关键尺寸、体积或其他任务不变量。
4. 需要时进行有限特征扫描，明确保留截断标志。
5. 最后看图像检查方向、遮挡、显示范围等。
6. 保存后有条件地关闭重开，再读取关键几何量验证持久化结果。

结构化检查不应由模糊视觉识别替代。图像和数值互相补充，才能形成可靠的小闭环。

## 官方接口

- [GetErrorCode2](https://help.solidworks.com/2025/english/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.IFeature~GetErrorCode2.html)
- [GetMassProperties2](https://help.solidworks.com/2025/english/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.IModelDocExtension~GetMassProperties2.html)
- [SaveBMP](https://help.solidworks.com/2025/english/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.IModelDoc2~SaveBMP.html)

[返回首页](index.html)
