找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 950|回复: 4

[求助]:程序执行时出错,请各位帮忙看看

[复制链接]
发表于 2002-5-28 00:20:49 | 显示全部楼层 |阅读模式

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

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

×
这个问题本来已经在另一个帖子里贴过了,经sv300大侠指点修改了一些错误(感谢),但还是没完全解决。感觉贴的位置过于隐秘了,没什么人看到,这里再贴一次,还望各位大侠帮我看看。(重复发贴,不好意思,故已将原贴删除)

浏览多段线顶点,输出坐标。

#include <stdlib.h>
#include <string.h>
#include <rxobject.h>
#include <rxregsvc.h>
#include <aced.h>
#include <adslib.h>
#include <dbsymtb.h>
#include <acdb.h>
#include <dbents.h>
#include <acestext.h>
#include <dbmain.h>

void polyLine();
AcDbObjectId selectObject();
void initApp();
void unloadApp();
extern "C" AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode,void*);


void polyLine()
{AcDbObjectId  polyId=selectObject();
   if(polyId==NULL){ads_printf("null");
               return;
                                }
   AcDb2dPolyline *pPoly;
    acdbOpenObject(pPoly, polyId, AcDb::kForWrite);
        if(strcmp(pPoly->isA()->name(),"AcDb2dPolyline")==0)
        {
    AcDbObjectIterator *pVertIter;
        pVertIter= pPoly->vertexIterator();
    pPoly->close();// Finished with the pline header.

    AcDb2dVertex *pVertex;
    AcGePoint3d location;
    AcDbObjectId vertexId;

    for (int Number = 0; !pVertIter->done();Number++, pVertIter->step())
    {
        vertexId = pVertIter->objectId();
        acdbOpenObject(pVertex, vertexId,AcDb::kForRead);
        location = pVertex->position();
        pVertex->close();
        ads_printf("\n第%d点坐标为:%lf, %lf, %lf",Number,location[X], location[Y], location[Z]);
    }
    delete pVertIter;
        }
}


//取Id
AcDbObjectId
selectObject()
{ int ss;
  ads_name en;
  ads_point pt;
  ss=ads_entsel("\n请选择实体:",en,pt);

//等待用户选择实体
//返回实体的实体名到变量en,并返回选中的实体的点到变量pt
  char handleStr[132];
  AcDbObjectId eId;
  switch(ss){
          case RTNORM:
            break;
          case RTKWORD:
               if((ads_handent(handleStr,en)==RTNORM))
                           {
                 break;
                           }
//获取en控制句柄
          default:
            ads_printf("没有实体被选中,返回码Code==%d\n",ss);
            return NULL;
                        }

  Acad::ErrorStatus retStat;
  retStat=acdbGetObjectId(eId,en);
//映射实体名到对象ID,eId
   if(retStat!=Acad::eOk)
   {
    ads_printf("\n函数acdbGetObjectId()失败!");
    ads_printf("\nen==(%1x,%1x),retStat==%d\n",en[0],en[1],eId);
    return NULL;
   }


//容错处理
ads_printf("\neId=%d",eId);
return eId;
}


void initApp()
{
        ads_printf("\npolyLine Sample--initApp\n");
        acedRegCmds->addCommand("polytLine_COMMANDS","polyLine","polyLine",ACRX_CMD_MODAL,polyLine);
}


void unloadApp()
{
        ads_printf("\npolyLine Sample--kUnloadAppMsg  \n");
        acedRegCmds->removeGroup("polyLine_COMMANDS");
}

extern "C" AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg,void* pkt)
{
        switch(msg){
                case AcRx::kInitAppMsg:
                        initApp();
                        break;
                case AcRx::kUnloadAppMsg:
                        unloadApp();
                        break;
        }
        return AcRx::kRetOK;
}



在AUTOCAD里选取多段线线的时候出现了以下错误:
unhandled exception coooooo5(access violation reading oxffffffff) at address 65645920h
估计是那里冲突了,请各位帮我看看,拜谢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2002-5-28 01:28:14 | 显示全部楼层
void polyLine()
{
        AcDbObjectId polyId=selectObject();
        if(polyId==NULL){
                ads_printf("null");
        return;
        }
        AcDbEntity *pEnt;
        AcDb2dPolyline *pPoly;
        acdbOpenObject(pEnt, polyId, AcDb::kForWrite);
        if(strcmp(pEnt->isA()->name(),"AcDb2dPolyline")==0)
        {
                AcDbObjectIterator *pVertIter;
                pPoly=(AcDb2dPolyline*&)pEnt;
                pVertIter= pPoly->vertexIterator();
//                pPoly->close();// Finished with the pline header.
               
                AcDb2dVertex *pVertex;
                AcGePoint3d location;
                AcDbObjectId vertexId;
               
                for (int Number = 0; !pVertIter->done();Number++, pVertIter->step())
                {
                        vertexId = pVertIter->objectId();
                        acdbOpenObject(pVertex, vertexId,AcDb::kForRead);
                        location = pVertex->position();
                        pVertex->close();
                        ads_printf("\n第%d点坐标为:%lf, %lf, %lf",Number,location[X], location[Y], location[Z]);
                }
                delete pVertIter;
        }
        pEnt->close();
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-5-28 06:29:16 | 显示全部楼层
多谢帮忙。
试了一下,果然没有错误信息了^_^
不过用它来去pline生成的多段线,还是不能输出坐标。估计是因为您所说的pline生成的不一定是acdb2dpolyline,那么在AutoCAD里应该是用什么命令来生成AcDb2dPolyline的?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-5-28 21:47:43 | 显示全部楼层
PLINETYPE=0
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-5-29 08:57:13 | 显示全部楼层
明白了

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 02:17 , Processed in 0.565464 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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