• 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。
    以上就时我的总结。
  • 相关阅读:
    php课程 6-23 mb_substr字符串截取怎么用
    js进阶 10-6 jquery中的属性选择器有哪些
    php实现 明明的随机数
    js进阶 10-5 jquery中的层级选择器有哪些
    js进阶 10-4 jquery中基础选择器有哪些
    请问开发手机游戏需要什么软件?
    阿里云服务器apache服务器局域网访问公网访问配置
    js进阶 10-3 jquery中为什么用document.ready方法
    js进阶 10-2 JQuery基础语法是什么
    js进阶 9 js操作表单知识点总结
  • 原文地址:https://www.cnblogs.com/HelloQLQ/p/12307335.html
Copyright © 2020-2023  润新知