Civil 3D横断面图体积表格的奇葩问题
2023年12月6日
QQ群友提出了这样一个问题:
我的第一反应是事务没有提交,
于是与群友开玩笑说:
之后此群有申请我加QQ好友,
通过后发送代码截图给我,
他使用了IFOX库,
一眼看不出事务是否提交,
于是我建议他不要使用IFox库,
只用纯AutoCAD API写代码,
修改后,
问题依旧,
经过一系列折腾后,
仍未见效,
于是我准备自己写测试代码。
我自己的测试代码写完后,
经过测试,
复现了他的问题,
表格显示不出来,
并且在尝试保存时会有以下提示信息:
此问题后来通过运行审核命令后可以修复,
但此时仍未找到解决问题的具体方法。
在不断的测试过程中,
偶尔乱写了一行代码,
调试过程中通过快速监视查看了体积表格的一些属性,
没想到程序运行结束后,
体积表格顺利显示,
以为找到了解决问题的方法(下午继续测试后发现此方法并不真正解决问题,至于为什么表格能显示出来还不得而知),
此时也到了我回家吃午饭的时间,
群友为我感谢我,
给我买了两杯咖啡,
下午两点准时送到,
咖啡还没喝几口,
就发现问题并没有真正解决,
之前能够出现的表格不再出现了,
于是继续折腾,
使用2018和2022两个版本同时进行测试,
重复上午的操作,
表格成功出现过2次,
但没能成功出现第3次,
通过审核修复后,
群友把他的测试文件发送给我,
我在他的文件中进行测试,
表格均不能正常出现……
啥也没能核查出来,
核查之后就能保存,
这个问题也解释不了。
于是进一步简化自己的测试代码,
只创建横断面图没有问题,
只要创建了体积表格,
就出问题,
于是可断定问题出现在创建体积表格的几行代码中,
不知不觉中,
又折腾了一下午:
分析来分析去,
总跟觉跟事务有关系,
于是尝试着写下了下面的代码:
此行代码加上后,
运行时没有出错,
并且表格也顺利出来了!
我的测试代码附后:
public void C_SVtest() { CivilDocument cdoc = CivilApplication.ActiveDocument; Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; Database db = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database; Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor; PromptEntityOptions peo = new PromptEntityOptions("\n拾取采样线"); peo.SetRejectMessage("\n拾取对象应为采样线"); peo.AddAllowedClass(typeof(SampleLine), true); PromptEntityResult per = ed.GetEntity(peo); if (per.Status != PromptStatus.OK) return; PromptPointResult ppr = doc.Editor.GetPoint("\n拾取插入点:"); if (ppr.Status != PromptStatus.OK) return; System.Guid guid; ObjectId svID; using (Transaction tr = doc.TransactionManager.StartTransaction()) { SampleLine sl = tr.GetObject(per.ObjectId, OpenMode.ForRead) as SampleLine; SampleLineGroup sampleLineGrp = tr.GetObject(sl.GroupId, OpenMode.ForWrite) as SampleLineGroup; guid = sampleLineGrp.GetMappingGuid("填挖方"); svID = SectionView.Create("Test", per.ObjectId, ppr.Value); var sv = svID.GetObject(OpenMode.ForWrite) as SectionView; var tables = sv.VolumeTables; var tableId = sv.VolumeTables.CreateVolumeTable(VolumeTableType.TotalVolume, guid); var table = tableId.GetObject(OpenMode.ForWrite); tr.AddNewlyCreatedDBObject(table, true); tr.Commit(); } }
测试前提是要进行采样源设置并进行材质计算,
材质列表名称为:填挖方
总结:
1.创建Civil 3d对象后,
需要自己手动添加到事务中,
这是第一次遇到。
起初就感觉问题的原因跟事务有关,
最终的解决方法也确实证实跟事务有关。
2.出现提示:此图形中一个或多个对象无法保存为指定格式......
通过运行Audit可以修复,
其他情况也曾遇到过类似提示(多数是运行插件时遇到的,比如烂天正),
可以尝试audit。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?