zoukankan      html  css  js  c++  java
  • 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。
    以上就时我的总结。
  • 相关阅读:
    阿里取消周报
    摇滚明星原则
    t
    B树、B+树索引算法原理(下)
    订单业务楼层化 view管理器和model管理器进行了model和view的全面封装处理 三端不得不在每个业务入口上线时约定好降级开关,于是代码中充满了各种各样的降级开关字段
    单元测试
    项目管理图 有任务分解、技术风险 风险预案
    CPU飙高,系统性能问题如何排查?

    如何让淘宝不卡顿? 读写比例 动态扩容 分布式化路线 mysql 优化
  • 原文地址:https://www.cnblogs.com/HelloQLQ/p/12307335.html
Copyright © 2011-2022 走看看