Revit API导入管件CSV尺寸表超10行报错手动操作正常问题求解
解决方案
问题根因
该问题是Revit API接口的已知兼容性问题,常见于2020~2023版本,核心原因有两个:
- API导入CSV时对编码格式要求严格,仅默认支持带BOM的UTF-8编码,无BOM的UTF-8、GBK等编码在文件行数较多时会出现行解析截断,触发「Line is too short」报错;UI导入时会自动兼容多种编码,所以不会触发错误。
- API导入前未做文档重生成时,族文件的几何缓存未更新,大尺寸参数的行导入时会触发几何校验失败,出现「Can't create the surface of revolution」报错,UI导入时会自动触发隐式重生成,所以可以正常导入。
修复步骤
- 调整CSV编码格式,统一转为带BOM的UTF-8格式,示例代码如下:
// 按CSV原文件编码调整读取时的编码格式 string csvContent = File.ReadAllText(csvPath, Encoding.Default); // 写入带BOM的UTF-8格式文件 File.WriteAllText(csvPath, csvContent, new UTF8Encoding(encoderShouldEmitUTF8Identifier: true));
- 优化导入事务逻辑,导入前增加文档重生成步骤,同时读取
errorInfo的详细报错信息方便定位:
FamilySizeTableManager TableManager = FamilySizeTableManager.GetFamilySizeTableManager(famDoc, famDoc.OwnerFamily.Id); if (TableManager.IsValidObject) { // 导入前先删除旧表避免缓存冲突 if (TableManager.HasSizeTable(tableDimensions)) { using (Transaction delTrans = new Transaction(famDoc, "删除旧尺寸表")) { delTrans.Start(); TableManager.RemoveSizeTable(tableDimensions); delTrans.Commit(); } } using (Transaction trans = new Transaction(famDoc, "导入尺寸表")) { trans.Start(); // 强制重生成文档,更新几何缓存 famDoc.Regenerate(); FamilySizeTableErrorInfo errorInfo = new FamilySizeTableErrorInfo(); bool importResult = TableManager.ImportSizeTable(famDoc, csvPath, errorInfo); if (importResult) { trans.Commit(); } else { // 导入失败时输出详细错误信息 Console.WriteLine($"导入失败:错误行号{errorInfo.Row},错误类型{errorInfo.FamilySizeTableErrorType},错误描述{errorInfo.ErrorMessage}"); trans.RollBack(); } } }
- 若仍存在报错,可逐行读取CSV内容,手动拆分导入10行以上的内容,规避API的行数限制bug。
内容的提问来源于stack exchange,提问作者JPais
相关产品推荐
相关产品推荐

