欢迎来到我的博客
Civil 3D开发与应用,欢迎加入QQ群:484124761
AutoCAD开发,欢迎加入QQ群:193522571

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。

 

posted @   david96007  阅读(163)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示