除了最后一个输出面积到excel没做,其他都是做了的。只支持AcDbPolyline和AcDbCircle。这是我模仿网上的动态图做的,主要是为了练习。下面我把自己的一些心得分享出来。使用到的一些帮助内可以在张帆、朱文俊的书《AutoCAD ObjectARX(VC)开发基础与实例教程 》找到,csdn有源码,不过大多要积分,我这有源码,可以留言,我发邮箱。这个插件我分享在了明经论坛上了。

我首页就有地址。不过需要的,我也可以发邮件。

开发的时候,一定要在最开始建立一个ErrorStatus 的变量,一般在操作实体的时候都会返回这个类型的值,调试的时候发现哪出错了,可以通过它来知道错误的详细信息,然后在百度上一搜就有解决办法了。

做这个插件的时候,感觉使用了MFC,在打开实体时,如果不对文档进行加锁,打开实体的步骤直接报错,返回Acad::eLockViolation,这时就需要这样做:

acDocManager->lockDocument(acDocManager->curDocument());
//.....操作
acDocManager->unlockDocument(acDocManager->curDocument());

加锁和解锁一定是成对出现的。大概意思就是文档管理器对当前文档加锁和解锁。

在标注面积的时候发现,面积过大,标注面积所用的字体如果不按比例变化,就有可能会很小不方便看,所以,我这里采用了按面积比例的方式改变字体高度。

double area = 0.0;
pl->getArea(area);
if (textHeight <= 0.0) {
textHeight = (int)sqrt(area) / ;
}

在做面积求和的时候,使用到了acedSSGet,这个方法用法多的很,我主要是想实现框选,然后遍历出选择的实体。这个开发文档里面有详细介绍,第一个参数表示:操作类型,二三个是点,第四个是过滤器。
通过acedSSLength(ssName, &length);得到所选实体集合的长度。
通过acedSSName(ssName, i, ent);遍历实体得到实体。
最后通过acdbGetObjectId(oId, ent)得到实体id。

ads_name ssName;
if (acedSSGet(NULL, NULL, NULL, NULL, ssName) != RTNORM) {
return;
} int length;
acedSSLength(ssName, &length); for (int i = ; i < length; i++)
{
ads_name ent;
acedSSName(ssName, i, ent);
AcDbObjectId oId;
if (acdbGetObjectId(oId, ent) == ErrorStatus::eOk) {
AcDbEntity * pEnt = NULL;
ErrorStatus es; es = acdbOpenObject(pEnt, oId, AcDb::OpenMode::kForWrite); if (es == ErrorStatus::eOk)
{
vecEnts.push_back(pEnt); }
}
}

在做统计面积到cad表格中时,用到了acedTraceBoundary这个命令,这个方法是高版本cad才有,
它也有替代方法,我在另一篇博客写过的https://www.cnblogs.com/HelloQLQ/p/12228308.html。
在封闭区间按点的时候,有可能会报错说eInvalidInput,这个时候把图形放大了在点,就准确些。
要实现点一个封闭图形,就在表格添加一行的功能,那就必须先添加好表个的头部,记录这个表格的id,用while循环点击,每点一次就打开关闭一次表格就可以了。
我遇到的问题有CString转ACHAR*,这样可以解决:

ACHAR* ach1=strIndex.AllocSysString();

在做输入面积到txt文档时,用到了c++的流对象:

ofstream  myfile(chPath, ofstream::trunc);

这个对象操作的时char*对象,把CString转成char*的方法:

USES_CONVERSION;
char *chPath= T2A(fpath);
保存文件时弹出对话框的方法:acedGetFileNavDialog。
以上就时我的总结。

objectarx 统计面积的更多相关文章

  1. HDU 1542:Atlantis(扫描线+线段树 矩形面积并)***

    题目链接 题意 给出n个矩形,求面积并. 思路 使用扫描线,我这里离散化y轴,按照x坐标从左往右扫过去.离散化后的y轴可以用线段树维护整个y上面的线段总长度,当碰到扫描线的时候,就可以统计面积.这里要 ...

  2. poj 3675 Telescope (圆与多边形面积交)

    3675 -- Telescope 再来一题.这题的代码还是继续完全不看模板重写的. 题意不解释了,反正就是一个单纯的圆与多边形的交面积. 这题的精度有点搞笑.我用比较高的精度来统计面积,居然wa了. ...

  3. C++ 矩形交集和并集的面积-离散化

    //离散化,x,y坐标分别按从小到大排序 //离散化 //1.首先分离出所有的横坐标和纵坐标分别按升序存入数组X[ ]和Y[ ]中. //2. 设数组XY[ ][ ].对于每个矩形(x1,y1)(x2 ...

  4. | 线段树-地平线horizon

    [题目描述]:在地平线上有n个建筑物.每个建筑物在地平线上可以看成一个下边界和地平线重合的矩形.每个建筑物有三个描述(Li ,Ri,Hi),分别表示该建筑物的左边界,右边界,高度.输出输出这些建筑物在 ...

  5. RaPC栅格化多边形裁剪之——进化0.1

    采用整数二维数组进行cell的归属标记,将所有符合条件的cell输出,不进行整体多边形重构,用以统计面积. 上图: INTERSECT: 网格区域为离散化的空间范围,黄色部分为求交结果. differ ...

  6. 【bzoj5110】[CodePlus2017]Yazid 的新生舞会 Treap

    题目描述 求一个序列所有的子区间,满足区间众数的出现次数大于区间长度的一半. 输入 第一行2个用空格隔开的非负整数n,type,表示序列的长度和数据类型.数据类型的作用将在子任务中说明. 第二行n个用 ...

  7. Atlantis(hdu1542)

    题意:求n个矩阵的面积并. /* 线段树维护扫描线 把每个矩形看成两条线段,从左到右添加线段,如果是矩形左边的线段,那就给线段所在的区间(y值)cover+1,反之则cover-1. 并且如果这条线段 ...

  8. 【LeetCode】695. Max Area of Island 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:DFS 方法二:BFS 日期 题目地址:ht ...

  9. 计算照片的面积(WPF篇)

    昨天,老周突发其想地给大伙伴们说了一下UWP应用中计算照片面积的玩法,而且老周也表示会提供WPF版本的示例.所以,今天就给大伙们补上吧. WPF是集成在.net框架中,属于.net的一部分,千万不要跟 ...

随机推荐

  1. JVM之GC回收信息详解

    一.-XX:+PrintGCDetails 打印GC日志 参数配置:-Xms10M -Xmx10M -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+Pr ...

  2. win7技巧

    win7技巧 快捷键 一.Windows键 + 空格键“Space” [作用]:透明化所有窗口,快速查看桌面(并不切换) [快捷键]:win+空格 [小结]:当你打开了很多程序窗口的时候,这招非常有用 ...

  3. 信息熵为什么要定义成-Σp*log(p)?

    信息熵为什么要定义成-Σp*log(p)? 再解释信息熵之前,需要先来说说什么是信息量. 信息量是对信息的度量,单位一般用bit. 信息论之父克劳德·艾尔伍德·香农(Claude Elwood Sha ...

  4. 小小知识点(二十四)什么是5G

    转自 https://www.ifanr.com/1149419 一个简单且神奇的公式 今天的故事,从一个公式开始讲起.这是一个既简单又神奇的公式.说它简单,是因为它一共只有 3 个字母.而说它神奇, ...

  5. Java线程池学习总结

    一 使用线程池的好处 池化技术相比大家已经屡见不鲜了,线程池.数据库连接池.Http 连接池等等都是对这个思想的应用.池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率. 线程池提供了 ...

  6. 如何修改Docker已运行实例的端口映射

    如何修改Docker已运行实例的端口映射 Docker的端口映射,往往出现在两个阶段需要处理: 1.是在docker启动前就已经确定好,哪个docker实例映射哪个端口(往往这个情况比较,需要提前做规 ...

  7. 写了个 Task.WhenAll(t)的一个例子。

    public static void Main() { var t = Task.Run(() => { throw new Exception("aa"); }); Tas ...

  8. CF449B Jzzhu and Cities 迪杰斯特拉最短路算法

    CF449B Jzzhu and Cities 其实这一道题并不是很难,只是一个最短路而已,请继续看我的题解吧~(^▽^) AC代码: #include<bits/stdc++.h> #d ...

  9. 安装Mysql 8.0的艰难体验

    背景: Mysql 8.0 以后版本,在性能等方面有了很大提升,而且在自动编号.Timestamp等字段的设置上有了很方便的进步,因此在一年前即开始将原有的基于5.5版本的服务器逐渐向8.0转移.但转 ...

  10. 2018 CCPC 网络赛

    The Power Cube is used as a stash of Exotic Power. There are n cities numbered 1,2,…,n where allowed ...