Fork me on GitHub

objectarx 统计面积

除了最后一个输出面积到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) / 7;
}    

 

 在做面积求和的时候,使用到了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 = 0; 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);

            }
        }
    }
View Code

 在做统计面积到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。
以上就时我的总结。
 
posted @ 2020-02-14 14:34  HelloLLLLL  阅读(932)  评论(9编辑  收藏  举报