找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 891|回复: 5

[ARX程序]:我写的关于arx中读取pline线画的图形的面积!

[复制链接]
发表于 2005-10-9 15:13:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
选取pline,直接读面积!
ads_name ss;
        ads_point e1;
        AcDbObjectId eId;
        double area;       
    acedEntSel("\nSelect an entity: ", ss, e1);
    acdbGetObjectId(eId, ss);
        AcDbPolyline* pPline;
        acdbOpenObject(pPline, eId,AcDb::kForWrite);
        if(pPline==NULL)
        {
                acutPrintf("\n您选择的pline线为空!\n");
        }
        else
        {
               
                if(        pPline->isKindOf(AcDbPolyline::desc()))
                {
                        pPline->getArea(area);
                        acutPrintf("\n面积为 %.3f\n",area);

                }
                else{
                        acutPrintf("\n您选择的不是pline线!");
                }
        }
        pPline->close();
有个问题:当遇到非pline线时,会跳出异常!
:ARX命令中发生异常
未处理的异常C0000005(Access  Violation  Reading 0x0004),地址:65476A9E0h
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 3532个

财富等级: 富可敌国

发表于 2005-10-9 15:30:07 | 显示全部楼层
选择实体后判断一下是否为pline!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-11 11:36:56 | 显示全部楼层
acedEntSel("\nSelect an entity: ", ss, e1);
要判断选择集有效,无效的选择集合是不能打开的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2005-10-14 09:56:55 | 显示全部楼层
选择有可能不是AcDbPolyline,为什么用如下语句
AcDbPolyline* pPline;
acdbOpenObject(pPline, eId,AcDb::kForWrite);
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2005-10-14 11:35:57 | 显示全部楼层

  1. ads_name ss;
  2. ads_point e1;
  3. AcDbObjectId eId;
  4. double area;
  5. acedEntSel("\nSelect an entity: ", ss, e1);
  6. acdbGetObjectId(eId, ss);
  7. AcDbPolyline* pPline;
  8. if (acdbOpenObject(pPline, eId,AcDb::kForWrite)== Acad::eOk) //判断
  9. {
  10.     if(pPline==NULL)
  11.     {
  12.     acutPrintf("\n您选择的pline线为空!\n");
  13.     }  
  14.     else
  15.    {

  16.          if( pPline->isKindOf(AcDbPolyline::desc()))
  17.         {
  18.                  pPline->getArea(area);
  19.                 acutPrintf("\n面积为 %.3f\n",area);

  20.         }
  21.     else{
  22.           acutPrintf("\n您选择的不是pline线!");
  23.      }
  24. }
  25. }
  26. pPline->close();

复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-16 15:55:34 | 显示全部楼层

给出我的成果!大家给点意见!

达到功能:
选择在0层的所有pline线,选出闭合的并且扩展应用程序名字为"xlgis"扩展数据为“居住”的pline线求出其面积和,对于不闭合的并且扩展应用程序名字为"xlgis"扩展数据为“居住”的pline线高亮显示!

程序编译通过,功能还有一些需要完善的!希望能得到大家的意见!谢谢!
#include "StdAfx.h"
#include "StdArx.h"
#include <string.h>
#include "dbidar.h"
#include "acutmem.h"
#include <dbsymtb.h>
char*data, *data1,*data2,*num;
bool readxdata1(AcDbPolyline* ppline,CString appName,char* caption);
Acad::ErrorStatus
getselectpolyarea(const char* szLayerName);
double allarea;
Acad::ErrorStatus
getselectpolyarea(const char* szLayerName)
{
        Acad::ErrorStatus es = Acad::eOk;
        // 判断是否存在层名szLayerName
        AcDbLayerTable *pLayerTable = NULL;
    es = acdbHostApplicationServices()->workingDatabase()
        ->getSymbolTable(pLayerTable, AcDb::kForRead);
        if (es != Acad::eOk) return es;
    AcDbLayerTableRecord *pLayerTableRecord = NULL;
        es = pLayerTable->getAt(szLayerName, pLayerTableRecord,
                AcDb::kForRead);
        if (es != Acad::eOk)
        {
                pLayerTable->close();
                acutPrintf("层'%s'不存在!", szLayerName);
                return es;
        }
        pLayerTableRecord->close();
        // 得到模型空间的块表记录,并遍历它得到所需要的实体
        AcDbBlockTable *pBlockTable = NULL;
    es = acdbHostApplicationServices()->workingDatabase()
        ->getSymbolTable(pBlockTable, AcDb::kForRead);
        if (es != Acad::eOk) {
                acutPrintf("\n以读方式打开块表操作失败!");
                return es;
        }
    AcDbBlockTableRecord *pBlockTableRecord = NULL;
    es = pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
        AcDb::kForRead);
        if (es != Acad::eOk) {
                pBlockTable->close();
                acutPrintf("\n以读方式打开块表记录操作失败!");
                return es;
        }
    pBlockTable->close();
       
    AcDbBlockTableRecordIterator *pBlockIterator = NULL;
    pBlockTableRecord->newIterator(pBlockIterator);

        AcDbBlockTableRecordIterator *pBlkTblRcdItr;        //生成块表记录的迭代器
        pBlockTableRecord->newIterator(pBlkTblRcdItr);
        AcDbEntity *pEnt;        //遍历法获得并打印每一个实体的类名
        int  n=0,m=0;
        allarea=0;
        for (pBlkTblRcdItr->start(); !pBlkTblRcdItr->done(); pBlkTblRcdItr->step())
        {               
                pBlkTblRcdItr->getEntity(pEnt, AcDb::kForRead);
                acutPrintf("\npEnt is: %s\n", (pEnt->isA())->name());        
                if (pEnt->isKindOf(AcDbPolyline::desc()))
                {
                        acutPrintf("\n存在AcDbPolyline!");
                        AcDbPolyline *pPLine;
                        pPLine=AcDbPolyline::cast(pEnt);
                        double area1=0;
                        pPLine->getArea(area1);
                        acutPrintf("\n该不确定pline线的面积为: '%.3f'平方米", area1);
                        if (readxdata1(pPLine,"xlgis","居住")==0)
                        {                       
                                if(pPLine->isClosed()!=0)
                                {       
                                        m=m++;
                                        acutPrintf("\n该pline线是闭合的!");
                                        allarea=allarea+area1;
                                }
                                else
                                {       
                                        acutPrintf("\n该pline线不是闭合的!");
                                      pEnt->highlight();
                                }
                        }
                        pPLine->close();       
                        pEnt->close();
                }
                else{pEnt->close();
                }
                n=n++;
        }
        acutPrintf("\n总面积为: '%.3f'平方米", allarea);
        acutPrintf("有'%d'个对象存在!",n);
        acutPrintf("有'%d'个Xdata匹配成功闭合pline线存在!",m);
        pBlockTableRecord->close();
        //删除块表记录迭代器及数据库指针
        delete pBlkTblRcdItr;
        return Acad::eOk;
}

bool readxdata1(AcDbPolyline* ppline,CString appName,char* caption)
{        //        获取指定对象的扩展实体数据
        char appName1[40];//应用程序名
        strcpy(appName1,appName);
        struct resbuf *pRb;
        if(pRb = ppline->xData(appName1))
        {  
        //        acedAlert("appName匹配成功!");
                if(pRb!=NULL)
                {        
                        pRb=pRb->rbnext;
                        int n=1;
                        for(;pRb!=NULL;pRb=pRb->rbnext)
                        {
                                if(pRb->restype==1000)
                                {       
                                        if (n==1)        data1=pRb->resval.rstring;//得到data1
                                        if (n==2)    data2=pRb->resval.rstring;//得到data2
                                        if (n==3)     num=pRb->resval.rstring;//得到num
                                        n++;
                                }
                                if(*data1==*caption)//判断扩展数据
                                {
                                        acutPrintf("\nxdata匹配成功!!!!!!");
                                }
                                else{
                                        acutRelRb(pRb);
                                        return 1;
                                }
                               
                        }
                }
                else{       
                        acutPrintf("\n该闭合pline扩展数据为空!");
                        acutRelRb(pRb);
                        return 1;
                }
        }       
        else
        {       
                acutPrintf("\nappName匹配不成功!");
                acutRelRb(pRb);
                return 1;
        }
        acutRelRb(pRb);
        return 0;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-20 22:49 , Processed in 0.279336 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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