明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2013|回复: 7

哪位高手帮我看下程序啊

[复制链接]
发表于 2012-4-10 11:12:33 | 显示全部楼层 |阅读模式
static void XiangMu_lvdi(void)
    {
        double area;
        /*double allarea=500;*/
        // Add your code for command XiangMu._lvdi here
        AcDbLayerTable *pLayerTbl;
        acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pLayerTbl,AcDb::kForRead);
        if(!pLayerTbl->has(_T("绿地")))
        {
            acutPrintf(_T("当前图形不包含该图层"));
            pLayerTbl->close();
            return;
        }
        AcDbObjectId layerId;
        pLayerTbl->getAt(_T("绿地"),layerId);
        pLayerTbl->close();
        AcDbBlockTable *pBlkTbl;
        acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl,AcDb::kForRead);
        AcDbBlockTableRecord *pBlkTblRcd;
        pBlkTbl->getAt(ACDB_MODEL_SPACE,pBlkTblRcd,AcDb::kForRead);
        pBlkTbl->close();
        AcDbBlockTableRecordIterator *pltr;
        pBlkTblRcd->newIterator(pltr);
        AcDbEntity *pEnt;
        for(pltr->start();!pltr->done();pltr->step())
        {
            pltr->getEntity(pEnt,AcDb::kForWrite);
            if(pEnt->layerId()==layerId)
            {
                AcDb2dPolyline *pPolyLine=AcDb2dPolyline::cast(pEnt);
                pPolyLine->getArea(area);
            }
            pEnt->close();

        }
        /*lvdilv=area/allarea;*/
        acutPrintf(_T("%10.2f\n"),area);

        delete pltr;
        pBlkTblRcd->close();

    }
} ;
执行命令之后出现acad.exe 中的 0x1001231e (XiangMu.arx) 处最可能的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
错误

 楼主| 发表于 2012-4-10 11:13:38 | 显示全部楼层
我把acutPrintf(_T("%10.2f\n"),area);删了就没有错了
发表于 2012-4-10 19:36:02 | 显示全部楼层
       AcDbEntity *pEnt;
        for(pltr->start();!pltr->done();pltr->step())
        {
            pltr->getEntity(pEnt,AcDb::kForWrite);
            if(pEnt->layerId()==layerId)
            {
                AcDb2dPolyline *pPolyLine=AcDb2dPolyline::cast(pEnt);
                pPolyLine->getArea(area);
            }
            pEnt->close();

        }
        /*lvdilv=area/allarea;*/
        acutPrintf(_T("%10.2f\n"),area);上面这段有些地方不理解:
(1)pltr->getEntity(pEnt,AcDb::kForWrite);,kForWrite没有必要,改为kForRead好
(2)图层“绿地”上的物件都是这个AcDb2dPolyline类型吗,如果不是应该会出错。
(3)pPolyLine->getArea(area);这个取面积很多次,但好像只用到最后一次的面积
 楼主| 发表于 2012-4-10 19:39:12 | 显示全部楼层
多谢多谢,已经搞定了
发表于 2012-4-10 19:56:26 | 显示全部楼层
第七根弦 发表于 2012-4-10 19:39
多谢多谢,已经搞定了

具体什么原因?
 楼主| 发表于 2012-4-10 20:07:49 | 显示全部楼层
hgf876 发表于 2012-4-10 19:56
具体什么原因?

线的类型不对,再问一个问题啊,一个封闭的图形怎么计算面积的,getarea()函数得到的值怎么为0啊
 楼主| 发表于 2012-4-10 20:08:48 | 显示全部楼层
第七根弦 发表于 2012-4-10 20:07
线的类型不对,再问一个问题啊,一个封闭的图形怎么计算面积的,getarea()函数得到的值怎么为0啊

我把线的类型改成acdbline了
 楼主| 发表于 2012-4-10 20:09:25 | 显示全部楼层
就一般的封闭线段怎么求面积。要转化成什么吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 10:13 , Processed in 0.192698 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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