cairunbin 发表于 2020-7-18 10:16:37

C++自定义实体方法实现超大影像AutoCAD秒加载

附件压缩包中是利用C++和AutoCAD自定义实体方法实现的超大影像快速加载软件源代码,非常不完善,仅供大家做开发思路参考。

新版CASS有一个超大影像管理功能,可以实现BigTiff等超大影像在AutoCAD中的加载与显示。除了初次加载由于需要计算金字塔等运行速度较慢,后面再次加载基本上都是秒加载,效率很高。由于类似于勘察设计的行业需要经常处理超大影像,所以这个功能很有用。

这个软件必须在cass环境下运行,因此测绘专业利用这个功能处理完成的图像,到了没有cass软件系统的设计专业人员手里就又打不开了。这有点过分了,你总不能让设计方也购买cass软件吧。类似于这种View的功能,市面上国内外大多数软件都是免费的。和南方公司联系了一下,人家坚持说要钱。

为此,自己尝试着用C++语言,AutoCAD自定义实体方法,实现类似功能。

使用C++编程是很久远的事了,自从有了C#,就没碰过C++了。我的C++代码大家将就看吧。

我只是做了一个尝试,基本框架有了,但是非常不完善,可能是存在内存渗漏的问题吧,经常导致AutoCAD崩溃,还不能正常使用。我发这个帖子,目的是给想了解自定义对象、图像处理等技术的朋友们提供一个参考。

这个功能没有继续完善的原因有以下三点:
(1)我感觉cass这个方式本身就是一条错误的技术路线:不管收费与否,用户总是要安装软件在后台进行支持,这本身就不友好。
(2)AutoCAD支持影像金字塔读取,如果在影像中生成有足够级别的金字塔,AutoCAD处理大影像已经可以做到秒开了,效率已不成问题。
(3)关于AutoCAD不支持BigTiff格式影像的问题,以及AutoCAD加载大尺寸影像效率低下的问题,完全可以开发一个工具,实现将BigTiff影像裁切为小尺寸常规GeoTiff影像、生成影像金字塔等功能,利用这个工具处理过的影像,就能在AutoCAD中快速加载了。利用这种思路处理过的影像,转到第三方(如设计人员)的AutoCAD中,不需要额外软件支持,直接利用AutoCAD原生功能即可快速打开,解决了(1)中的问题。

压缩包中的C++项目,基于的环境是GDAL开源图像处理软件包、Visualstudio2019、AutoCAD2020。GDAL库所需的dll文件在压缩包中已附带,不需要另行下载了。


最后,如果哪位能将该项目完善一下,还请再发回到论坛。我们从明经学到很多,得到很多帮助,让我们回馈明经,让明经的精神继续传递。


cghdy 发表于 2020-7-20 16:22:52

曲高和寡

sieben 发表于 2020-7-22 14:05:15

先下载了,后面再学习,现在没有机会做CAD二次开发,无奈!

spp_wall 发表于 2021-12-12 12:00:03

顶一下!!!!!!!!

yanshengjiang 发表于 2021-12-13 22:53:53

大佬你好,我也是做测绘的,现在主要用cass3d做图。不知道你用不用这款软件?

cairunbin 发表于 2021-12-14 11:13:46

本帖最后由 cairunbin 于 2021-12-14 11:17 编辑

抱歉,,,,,,,,

cairunbin 发表于 2021-12-14 11:14:38

本帖最后由 cairunbin 于 2021-12-14 11:16 编辑

yanshengjiang 发表于 2021-12-13 22:53
大佬你好,我也是做测绘的,现在主要用cass3d做图。不知道你用不用这款软件?这一按Ctrl-Enter,竟然自动回复了!
我们公司也用,好多套正版CASS软件。公司有些人也在用cass 3d。不过,我没用过,{:1_1:}

yanshengjiang 发表于 2021-12-14 14:43:51

cairunbin 发表于 2021-12-14 11:14
这一按Ctrl-Enter,竟然自动回复了!
我们公司也用,好多套正版CASS软件。公司有些人也在用cass 3d。不过 ...

哦 这样啊。有个问题不知道你有没有兴趣帮忙解决一下
cass3d给了段二次开发的源码例子,好像是c++的 ,不知道能不能编译成功能函数让lsp调用,如果很麻烦那这段代码能不能添砖加瓦,让他选择我给的没有高程的坐标文件 ,在模型里面把高程返回出来。
之所以需要这样的程序是因为cass3d自带的,只能entsel这样单选多段线提取线上高程,很少麻烦。

这是他们给的源码

void Get3DHeightFromPt()
{根据坐标点获取z值
        ads_point pt = { 0 };
        int err = ads_getpoint(NULL, _T("
根据坐标获取高程:"), pt);
        if (err != RTNORM)
        {
                return;
        }
        resbuf *list = NULL;
        resbuf *result = NULL;
        list = acutBuildList(RTSTR, _T("cass3D_getHeight"), RTPOINT, pt, RTNONE);

        if (list != NULL)
        {
                err = acedInvoke(list, &result);
                ads_relrb(list);
                if (err != RTNORM)
                {//三维窗口未打开或者获取高程失败
                        return;
                }
        }
        double z = 0.0;//根据xy计算出来的模型上的高程
        if (result != NULL)
        {
                if (RTREAL == result->restype)
                {
                        z = result->resval.rreal;
                }
                ads_relrb(result);
        }
}

cairunbin 发表于 2021-12-14 16:32:18

yanshengjiang 发表于 2021-12-14 14:43
哦 这样啊。有个问题不知道你有没有兴趣帮忙解决一下
cass3d给了段二次开发的源码例子,好像是c++的 , ...

C++的东西我现在基本上做不了了。差不多20年都没怎么用过C++了

yanshengjiang 发表于 2021-12-14 17:51:19

cairunbin 发表于 2021-12-14 16:32
C++的东西我现在基本上做不了了。差不多20年都没怎么用过C++了

那太遗憾了。测绘界的一大损失。不过还是很感谢。
页: [1]
查看完整版本: C++自定义实体方法实现超大影像AutoCAD秒加载