找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2448|回复: 16

[ARX程序]:如何把一个图层设为当前层?

[复制链接]
发表于 2003-7-30 11:19:06 | 显示全部楼层 |阅读模式

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

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

×
在vc++中arx编程,如何把一个图层设为当前层?能具体一点回答我吗?谢谢!急!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-7-30 11:25:05 | 显示全部楼层

Re: [ARX程序]:如何把一个图层设为当前层?

最初由 lidexiang 发布
[B]在vc++中arx编程,如何把一个图层设为当前层?能具体一点回答我吗?谢谢!急! [/B]


设置系统变量clayer的值, 事先要保证这个图层存在.

char * clyr="abc";

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

使用道具 举报

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

使用道具 举报

发表于 2003-7-30 12:01:22 | 显示全部楼层
最初由 lidexiang 发布
[B]在vc++上开发objectarx,如何把一个图层设置为当前层?谢谢 [/B]


用这个函数将你指定的图层设置为当前层:

-----------------------------------------------------------------------------
Acad::ErrorStatus  setClayer(AcDbObjectId objId);

objId Input object ID of desired LayerTableRecord

Sets the LayerTableRecord with object ID objId to be the CLAYER value of the database.

See the System Variables section of the AutoCAD Command Reference for information on CLAYER.

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

使用道具 举报

 楼主| 发表于 2003-7-30 12:31:41 | 显示全部楼层
我知道那是objectarx的帮助,但我是一个新手,不会使用,能具体一点?比如举一个例子.谢谢!急啊,我在线等!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
设置系统变量clayer的值, 事先要保证这个图层存在.

char * clyr="abc";

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

使用道具 举报

发表于 2003-7-30 13:48:09 | 显示全部楼层
1.ads_setvar("clayer",&clyr);
ads_setvar 是用来设置系统变量的函数,也就是将系统变量clayer(当前图层)设置为clyr里面存储的值。
2.给你一个关于图层操作的例子看看!
(引至《autoCAD2000 objectarx 编程指南》)
-----------------
Adesk::Boolean getNewLyrLtId(AcDbObjectId& ltypeId)
{
        // We know that the linetype 'CONTINUOUS' exists
        // so give the user a choice of pressing [ENTER]
        // for 'CONTINUOUS' linetype or a listing option
        // to show all the linetype available or input a
        // linetype name.

        char kw[20];
        char linType[50];
        char *pLtName;
        AcDbDatabase *pCurDb = NULL;
        AcDbLinetypeTable *pltTable;
        AcDbLinetypeTableRecord *pLtTableRcd;
        AcDbLinetypeTableIterator *pLtIterator;
        int rc;

        pCurDb = acdbHostApplicationServices()->workingDatabase();

        acedInitGet(NULL, "Name List Continuous");
        rc = acedGetKword("\nLinetype - [Name/List/Continuous]<Continuous>: ", kw);

        switch(rc)
        {
                case RTCAN:
                        acutPrintf("\nUser canceled.");
                        return Adesk::kFalse;
                case RTERROR:
                        acutPrintf("\nFailed in getNewLyrLtId() function. ");
                        return Adesk::kFalse;
                break;

                case RTNONE:
                        pCurDb->getLinetypeTable(pltTable, AcDb::kForRead);
                        pltTable->getAt("CONTINUOUS", ltypeId);
                        pltTable->close();
                        return Adesk::kTrue;
                break;

                case RTNORM:
                        if(strcmp(kw, "Name") == 0)
                        {
                                rc = acedGetString(0, "\nEnter linetype string name: ", linType);
                                switch(rc)
                                {
                                        case RTCAN:
                                        case RTERROR:
                                                acutPrintf("\nError in retreiving linetype name.");
                                                return Adesk::kFalse;
                                        break;

                                        case RTNORM:
                                                if(linType[0] == '\0')
                                                {
                                                        acutPrintf("\nNo layer name given.");
                                                        return Adesk::kFalse;
                                                }

                                                // Check to see if the linetype
                                                // exists
                                                pCurDb->getLinetypeTable(pltTable, AcDb::kForRead);
                                                if(pltTable->has(linType))
                                                {
                                                        // Retreive the AcDbObjecId of the layer table record
                                                        pltTable->getAt(linType, ltypeId);
                                                        pltTable->close();
                                                        return Adesk::kTrue;
                                                }

                                                acutPrintf("\nLinetype '%s' does not exist using CONTINUOUS. ",
                                                                                linType);

                                                pltTable->getAt("CONTINUOUS", ltypeId);
                                                pltTable->close();
                                                return Adesk::kTrue;
                                        break;
                                }// switch
                        }// if
                        else if(strcmp(kw, "List") == 0)
                        {
                                // Here we will use a Linetype Table Iteraror
                                // to list out all the available linetype
                                // and then ask the user to enter a
                                // valid name for one of the layers

                                acutPrintf("\nThe following linetypes are available. ");

                                pCurDb->getLinetypeTable(pltTable, AcDb::kForRead);

                                pltTable->newIterator(pLtIterator);
                                for(; !pLtIterator->done(); pLtIterator->step())
                                {
      
                                        // get the current linetype record from the iterator,
                                        // opened for read

                                pLtIterator->getRecord(pLtTableRcd, AcDb::kForRead);

                                        // get the linetype name from the linetype record
                                        // and store it in pLtName

                                        pLtTableRcd->getName(pLtName);

                                        // close the linetype record
                                        pLtTableRcd->close();
      
                                acutPrintf("\nLinetype name: %s", pLtName);

                                        delete [] pLtName;

                                }// for

                                // Don't forget to delete the iterator
                                // that's your responsibility

                                delete pLtIterator;

                                rc = acedGetString(0, "\n\nEnter linetype string name: ", linType);
                                switch(rc)
                                {
                                        case RTCAN:
                                        case RTERROR:
                                                acutPrintf("\nError in retreiving linetype name.");
                                                return Adesk::kFalse;
                                        break;

                                        case RTNORM:
                                                if(linType[0] == '\0')
                                                {
                                                        acutPrintf("\nNo layer name given.");
                                                        return Adesk::kFalse;
                                                }

                                                // Check to see if the linetype
                                                // exists
                                                pCurDb->getLinetypeTable(pltTable, AcDb::kForRead);
                                                if(pltTable->has(linType))
                                                {
                                                        // Retreive the AcDbObjecId of the layer table record
                                                        pltTable->getAt(linType, ltypeId);
                                                        pltTable->close();
                                                        return Adesk::kTrue;
                                                }

                                                acutPrintf("\nLinetype '%s' does not exist using CONTINUOUS. ",
                                                                                linType);

                                                pltTable->getAt("CONTINUOUS", ltypeId);
                                                pltTable->close();
                                                return Adesk::kTrue;
                                        break;
                                }// switch


                        }
                        else if(strcmp(kw, "Continuous") == 0)
                        {
                                // Remember the CONTINUOUS linetype always
                                // exists in a drawing file.
                                pCurDb->getLinetypeTable(pltTable, AcDb::kForRead);
                                pltTable->getAt("CONTINUOUS", ltypeId);
                                pltTable->close();
                                return Adesk::kTrue;
                        }
                        else
                        {
                                return Adesk::kFalse;
                        }
                break;

        }// switch

        return Adesk::kFalse;
}


// This function called by 'cnl()' which is found on
// Ch4_1Commands.cpp
void createNewLayer(char* lyrname, Adesk::UInt16 clr, AcDbObjectId ltypeId, Adesk::Boolean current)
{
        // We need to check if the layer name exists
        // If the layer name exists, apply the color
        // linetype id and whither to make it current
        // or not. In order to be current it cannot be
        // frozen, so we need to check for this also.
        // If the layer name does not exist we just create
        // a new layer with the properties contained in the arguments
       
        AcDbLayerTable *pLyrTable;
        AcDbLayerTableRecord *pLyrTblRecord;
        AcDbObjectId recId;

        AcCmColor color;
        color.setColorIndex(clr); // set color to parameter clr

        AcDbDatabase *pCurDb = NULL;

        pCurDb = acdbHostApplicationServices()->workingDatabase();


        pCurDb->getLayerTable(pLyrTable, AcDb::kForRead);
        // Check to see if the layer name exists
        if(pLyrTable->has(lyrname))
        {
                pLyrTable->getAt(lyrname, pLyrTblRecord, AcDb::kForWrite, Adesk::kFalse);
                // pLyrTblRecord now points at the layer table record
                // which was opened for write
                pLyrTblRecord->setIsFrozen(Adesk::kFalse);
                pLyrTblRecord->setColor(color);
                pLyrTblRecord->setLinetypeObjectId(ltypeId);

        }
        else
        {
                // Note how we can change the open mode
                // of the layer table from AcDb::kForRead
                // to AcDb::kForWrite

                pLyrTable->upgradeOpen();
                pLyrTblRecord = new AcDbLayerTableRecord;

                pLyrTblRecord->setName(lyrname);
                pLyrTblRecord->setColor(color);
                pLyrTblRecord->setLinetypeObjectId(ltypeId);

                pLyrTable->add(pLyrTblRecord);

        }

        // Get the layer Table ObjectId
        recId = pLyrTblRecord->objectId();

        pLyrTblRecord->close();
        pLyrTable->close();

        // Set the layer current if current
        // is equal to Adesk::kTrue
        // pCurDb is point to the current
        // drawing database
        // The database AcDbDatabase has a number of
        // query and edit functions for the header variables

        if(current)
        {
                pCurDb->setClayer(recId);
        }

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

使用道具 举报

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

使用道具 举报

发表于 2003-7-30 15:02:17 | 显示全部楼层
最初由 lidexiang 发布
[B]谢谢,我搞定了,这个论坛回答得很快! [/B]


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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-7-30 15:06:28 | 显示全部楼层
最初由 lidexiang 发布
[B]谢谢,我搞定了,这个论坛回答得很快! [/B]


欢迎你常来!

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

使用道具 举报

发表于 2003-7-30 15:07:43 | 显示全部楼层
园长最近来的多了(整天在蹲点,是不是专职的了?)。
新斑竹的三把火也烧的很厉害~~  :P

现在XDCAD已经是国内ARX方面——或者说是CAD方面办的最好的网站了。。。。。

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

使用道具 举报

 楼主| 发表于 2003-7-30 16:02:48 | 显示全部楼层
说实话,我现在可以上的网站就是贵网,还有一个是明经通道,其他就是java,msdn,什么的,我是现在每天都来.呵呵,我的代码比较长,写得也不好,有好用的代码我会传上来的.今天先谢谢园长和斑竹的帮忙(其实这个网站是网友介绍的,说问题回答的比较快,的确是!!!)其实我刚接触objectarx,还请各位多多帮助
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-7-30 16:24:19 | 显示全部楼层
最初由 lidexiang 发布
[B]说实话,我现在可以上的网站就是贵网,还有一个是明经通道,其他就是java,msdn,什么的,我是现在每天都来.呵呵,我的代码比较长,写得也不好,有好用的代码我会传上来的.今天先谢谢园长和斑竹的帮忙(其实这个网站是网友介绍... [/B]


ARX你可能是新接触的,但是VC一定很不错,ARX离不开VC, 欢迎以后多来, 把你的经验传授给大家.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2005-12-11 21:52:29 | 显示全部楼层
的确,一个网站能办到这样应该是很不错了,我也从中得到了很多帮助,所以我在尽最大力量来帮助需要帮助的朋友
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 18:26 , Processed in 0.221997 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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