明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1448|回复: 9

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

[复制链接]
发表于 2020-7-18 10:16 | 显示全部楼层 |阅读模式
附件压缩包中是利用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文件在压缩包中已附带,不需要另行下载了。


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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2020-7-22 14:05 | 显示全部楼层
先下载了,后面再学习,现在没有机会做CAD二次开发,无奈!
发表于 2021-12-13 22:53 | 显示全部楼层
大佬你好,我也是做测绘的,现在主要用cass3d做图。不知道你用不用这款软件?
 楼主| 发表于 2021-12-14 11:14 | 显示全部楼层
本帖最后由 cairunbin 于 2021-12-14 11:16 编辑
yanshengjiang 发表于 2021-12-13 22:53
大佬你好,我也是做测绘的,现在主要用cass3d做图。不知道你用不用这款软件?
这一按Ctrl-Enter,竟然自动回复了!
我们公司也用,好多套正版CASS软件。公司有些人也在用cass 3d。不过,我没用过,

发表于 2021-12-14 14:43 | 显示全部楼层
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);
        }
}
 楼主| 发表于 2021-12-14 16:32 | 显示全部楼层
yanshengjiang 发表于 2021-12-14 14:43
哦 这样啊。有个问题不知道你有没有兴趣帮忙解决一下
cass3d给了段二次开发的源码例子,好像是c++的 , ...

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

那太遗憾了。测绘界的一大损失。  不过还是很感谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-7 16:16 , Processed in 0.310130 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表