找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 434|回复: 4

[ARX程序]:为什么图层不能进行两次操作,详情间内 ,急急急

[复制链接]
发表于 2003-4-21 21:10:20 | 显示全部楼层 |阅读模式

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

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

×
我在layer.cpp中建立的两个函数,一个是设置当前层,一个是关闭一个层;如下:
Adesk::Boolean setCurLayer(char *lpszLyrName)//设置当前层
{
        assert(lpszLyrName != NULL);//防错
       
        AcDbLayerTable *pLyrTable;
        AcDbLayerTableRecord *pLyrTblRecord;//
        AcDbObjectId lyrId;
        Acad::ErrorStatus es;

        AcDbDatabase *pCurDb = NULL;

        pCurDb = acdbHostApplicationServices()->workingDatabase();

        es = pCurDb->getLayerTable(pLyrTable, AcDb::kForRead);
        if(es != Acad::eOk)
        {
                acutPrintf("\n fail to open layer table for a read operation");
                return Adesk::kFalse;
        }

        if(pLyrTable->has(lpszLyrName))
        {
        es = pLyrTable->getAt(lpszLyrName, pLyrTblRecord, AcDb::kForWrite, Adesk::kFalse);
                if(es != Acad::eOk)
                {
                        acutPrintf("\n fail to open layer table record");
                        return Adesk::kFalse;
                }
        }
        else
        {
                acutPrintf("\n 没有这样的图层");
                return Adesk::kFalse;
        }

        lyrId = pLyrTblRecord->objectId();//取得图层的Id

   
        pLyrTblRecord->close();

        pLyrTable->close();

       
        es = pCurDb->setClayer(lyrId);
        if(es != Acad::eOk)
        {
                acutPrintf("\n 没有设为当前图层");
                return Adesk::kFalse;
        }

       
        return Adesk::kTrue;
}


Adesk::Boolean closeLyrName(char *lpszLyrName)//关闭lpszLyrName
{
        assert(lpszLyrName != NULL);//防错
        //将lpszlyrName设为当前层,并且将其他的层关闭
        AcDbLayerTable *pLyrTable;//不用释放,要关闭
        AcDbLayerTableRecord *pLyrTblRecord;//不用释放,要关闭
        AcDbObjectId lyrId;
        Acad::ErrorStatus es;

        AcDbDatabase *pCurDb = NULL;

   //关闭其他的层
       
    es = pCurDb->getSymbolTable(pLyrTable, AcDb::kForRead);
        if(es != Acad::eOk)
        {
                acutPrintf("\n fail to open layer table for a read operation");
                return Adesk::kFalse;
        }

        AcDbLayerTableIterator *pLyrIterator
        es = pLyrTable->newIterator(pLyrIterator);
        if(es != Acad::eOk)
        {
                acutPrintf("\n 没有创建一个新");
                return Adesk::kFalse;
        }

        char *lpszTempLyrName;

        for(; !pLyrIterator->done(); pLyrIterator->step())//关闭图层
        {
                es = pLyrIterator->getRecord(pLyrTblRecord, AcDb::kForWrite);
                if(es != Acad::eOk)
                {
                        acutPrintf("\n 没有打开图层表记录");
                        continue;
                       
                }

                es = pLyrTblRecord->getName(lpszTempLyrName);
                if(es != Acad::eOk)
                {
                        acutPrintf("\n 没有取得层的名字");
                        continue;
                       
                }
       
                int rc;

                rc = stricmp(lpszLyrName,lpszTempLyrName);
          
            if(rc = 0)
                {
                    pLyrTblRecord->setIsFrozen(TRUE);
                }

                pLyrTblRecord->close();
          
       
        }
       
        delete pLyrIterator;
        pLyrIterator = NULL;
               
        pLyrTable->close();
       
        return Adesk::kTrue;
}

我在layerCommands.cpp中调用这两个函数,先使一个图层成为当前层,在关闭另一个图层,如下:
        char *lpszLyrName = "wall";
        char *lpszWindow = "window";
        setCurLayer(lpszLyrName);
                     closeLyrName(lpszWindow);

但是编译没有问题,但是在autocad中执行时出错,只能执行setCurLayer,而不能执行closeLyrname,why????

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

使用道具 举报

 楼主| 发表于 2003-4-22 19:33:46 | 显示全部楼层
binbin  我在编译的时候说pCurDb没有初始化,所以我用了pCurDb = NULL;
我将他不初试化也没有能解决问题
不过我将closeLyrName()这个函数该了一个后就解决的问题,
改动后的如下:
Adesk::Boolean closeLyrName(char *lpszLyrName)//关闭lpszLyrName
{
        assert(lpszLyrName != NULL);

        AcDbLayerTable *pLyrTable;//不用释放,要关闭
        AcDbLayerTableRecord *pLyrTblRecord;//不用释放,要关闭

        Acad::ErrorStatus es;

        AcDbDatabase *pCurDb;

        pCurDb = acdbHostApplicationServices()->workingDatabase();

        es = pCurDb->getLayerTable(pLyrTable, AcDb::kForRead);
        if(es != Acad::eOk)
        {
                acutPrintf("\n fail to open layer table for a read operation");
                return Adesk::kFalse;
        }

        if(pLyrTable->has(lpszLyrName))
        {
        es = pLyrTable->getAt(lpszLyrName, pLyrTblRecord, AcDb::kForWrite, Adesk::kFalse);
                if(es != Acad::eOk)
                {
                        acutPrintf("\n fail to open layer table record");
                        return Adesk::kFalse;
                }
        }
        else
        {
                acutPrintf("\n 没有这样的图层");
                return Adesk::kFalse;
        }

        if(pLyrTblRecord->isFrozen() == TRUE)
        {
         pLyrTblRecord->setIsFrozen(false);
        }
   
        pLyrTblRecord->close();

        pLyrTable->close();

    acedCommand(RTSTR,"REGEN",0);//当数据库关闭后才能用

        //要将快表和快表记录关闭后才能将此层设为当前的层


        return Adesk::kTrue;
}

但是上一个为什么有问题,我还是没有搞清楚,是不是跌代器for(; !pLyrIterator->done(); pLyrIterator->step())   用的不对,因为在运行成功的这个程序中我没有用跌代器

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

使用道具 举报

发表于 2003-4-22 19:51:00 | 显示全部楼层
不是跌代器!
上一程序,你看
AcDbDatabase *pCurDb = NULL;

//关闭其他的层

es = pCurDb->getSymbolTable(pLyrTable, AcDb::kForRead);

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 01:04 , Processed in 0.216636 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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