找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 377|回复: 0

[求助]:关于建立同名块的一个疑惑???

[复制链接]
发表于 2006-5-18 09:29:59 | 显示全部楼层 |阅读模式

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

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

×
请教大家!先跟大家说下思路:我是想根据不同的lt2_radius建立不同的图快记录,但是还是用原来的快名ASDK_BLOCK_LT2

下面的代码能运行,但是调试输入不同的半径值的时候出现了异常: aced.exe中的0x65117d90处最可能的异常:0xc0000005读取位置0x00000004时发生访问冲突
我调试了好多次,觉得应该是因为前一个块记录 还在内存当中,而输入新半径值时建立一个同名的块记录,所以就发生异常!
不知道是不是???
各位大侠指点一下吧!
万分感激!


double lt2_radius;//这个半径值是通过对话框传过来的
double former_radius;//用来储存前一个半径值
AcDbObjectId makeLt2Block()
{
        //创建LT2带属性定义的块表记录
        //创建并命名一个新块表记录
        //
        AcDbObjectId blockLt2Id;
        ads_point center;
        AcDbBlockTableRecord *pLtBlockTableRec
                =new AcDbBlockTableRecord();
        pLtBlockTableRec->setName("ASDK_BLOCK_LT2");
        pLtBlockTableRec->setOrigin(basePoint);
        //获取块表
        //
        AcDbBlockTable *pBlockTable=NULL;
        acdbCurDwg()->getSymbolTable(pBlockTable,AcDb::kForWrite);
        //将新建的块表记录加入到块表中
        //
        pBlockTable->add(blockLt2Id,pLtBlockTableRec);
        pBlockTable->close();
                     .....................
                  return blockLt2Id;
}



void DrawLt2()
{
        //首先选一个放置冷铁的基准点,以这个点为圆心画一个半径为lt2_radius的圆形冷铁(已实现)
        //这个冷铁应该作为一个块,不论选中哪条线都能弹出对话框,进行重新修改或者选择
       
        ads_name ent0,pick0;
        ads_point center;
        AcDbObjectId blockLt2Id;

        if(acdbEntLast(ent0)!=RTNORM){
                acdbFail("\nFail create last entity.");
                return ;
        }

        if(acedSSAdd(NULL,NULL,pick0)!=RTNORM){
                acdbFail("\nFail create select set.");
                return ;
        }

        setCurLayer(g_strLayer_Core);

        acedGetPoint(NULL,"请选择圆形冷铁的圆心",center);
        CopyPoint(basePoint,center);
       
        //遍历块表,如果块表ASDK_BLOCK_LT2已经存在就调用makeLt2Block(blockId,basePoint);
        //如果没有就直接执行下去!   
        //当重新调用的时候要判断所输入的半径是否发生变
//化?如果改变了就要将上一个快解析掉
        //又重新建立同名的快
        AcDbBlockTable *pBlkTable;
        acdbCurDwg()->getSymbolTable   (pBlkTable,AcDb::kForRead);
       
        //AcDbBlockTableRecord *pBlkTableRec;
        if((!pBlkTable->has("ASDK_BLOCK_LT2"))|(former_radius!=lt2_radius))
        //if(pBlkTable->getAt(ASDK_BLOCK_LT2,pBlkTableRec,AcDb::kForWrite)!=Acad::eOk)
        {
                former_radius=lt2_radius;
                pBlkTable->close();
                blockLt2Id=makeLt2Block();
        }

        else pBlkTable->getAt("ASDK_BLOCK_LT2",blockLt2Id,true);


能运行,但是我调试输入不同的半径值的时候出现了异常: aced.exe中的0x65117d90处最可能的异常:0xc0000005读取位置0x00000004时发生访问冲突
我调试了好多次,觉得应该是因为前一个块记录 还在内存当中,而输入新半径值时建立一个同名的块记录,所以就发生异常!
不知道是不是???
有什么解决方法吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-9-23 12:29 , Processed in 0.187972 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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