找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3025|回复: 13

[ARX程序]:自定义实体类中添加外部文件中已定义的图块--相关问题

[复制链接]
发表于 2005-6-26 16:13:12 | 显示全部楼层 |阅读模式

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

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

×
初学ARX已三个月,虽然还未入门,为答谢论坛各位给我的帮助,将我目前收集的关于自定义实体类的相关内容组织成一个小程序,提供大家分享,同时希望高手可以更好的对我指导。

明经也有我发布的相关帖子,你可以得到其她相关信息[/COLOR] http://www.mjtd.com/bbs/dispbbs. ... ID=39010&page=1

当前程序已经完成:
1. 一个简单的矩形框的自定义实体类创建,内有五个夹点。已经完成了对其基本函数的重载: [/COLOR]
        virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler* pFiler) const;
        virtual Acad::ErrorStatus dxfInFields(AcDbDxfFiler* pFiler);
        virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler) const;
        virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* pFiler);
        virtual Adesk::Boolean worldDraw(AcGiWorldDraw* mode);

        virtual Acad::ErrorStatus getOsnapPoints(AcDb::OsnapMode osnapMode,
                                                 int gsSelectionMark,
                                                 const AcGePoint3d& pickPoint,
                                                 const AcGePoint3d& lastPoint,
                                                 const AcGeMatrix3d& viewXform,
                                                 AcGePoint3dArray& snapPoints,
                                                 AcDbIntArray& geomIds) const;
        virtual Acad::ErrorStatus getGripPoints(AcGePoint3dArray& gripPoints,
                                                AcDbIntArray& osnapModes,
                                                AcDbIntArray& geomIds) const;
        virtual Acad::ErrorStatus moveGripPointsAt(const AcDbIntArray& indices,
                                                   const AcGeVector3d& offset);
        virtual Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform);

2. 可以已经可以显示图块了,添加了一个函数AcDbObjectId cascoCEntity::GetBlockIdFromName(const char *dwgName, const char *blockName)
〔还很不完善,编译会出错,再编译就行,希望各位大侠指导,除去这个问题。〕[/COLOR]
在函数virtual Adesk::Boolean worldDraw(AcGiWorldDraw* mode);给出了一些操作。
        ......
        AcDbBlockReference *ref = new AcDbBlockReference();
        ref->setColorIndex(5);
        ref->setBlockTransform(m_xform);
        ref->setPosition(mCenter);
        AcDbObjectId recordId;
        recordId = GetBlockIdFromName("Drawing0.dwg", "CIRCLE"); //TWO_RECT //CIRCLE
        if(recordId != NULL)
                ref->setBlockTableRecord(recordId);
        ref->worldDraw(mode);
        ......

编译环境、操作步骤、和问题(更为详细的说明参见CEnity工程) [/COLOR]
本程序为VC60+ACAD2002下调试过,使用方法先编译CEntity工程,然后编译EntityTest工程。加载后执行test命令就可以。
单独编译和执行(*.dbx 和*.arx以及*.dwg中的图块要对应起来)TWO_RECT或者CIRCLE都不会有问题。如果调用错了就会出错,我调试能力有限,不知道如何操作。

目的:[/COLOR]
希望能够使用这样的方法(只在自定义实体中创建关联图块名称、夹点等关键属性)创建的自定义实体,使用该实体类,用户只需要选择该实体关联的图块和自定义夹点的位置等属性,就可以用一个或少数几个特征夹点的类实现ACAD自定义的实体类,这样的类定义出的实体具有更大的灵活性。

可是如何进一步控制图块的的操作? [/COLOR]
1. 能够同一个*.dbx 和*.arx就可以显示不同块的、保存后再打开也是一样。
2. 可以拖动自定义实体,完成与自定义实体相连的直线的自动拉伸?
2. 比如完成对图块里面图元的具体操作?

欢迎大家参与讨论,也希望您们和我联系!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-6-27 15:23:01 | 显示全部楼层
我已经下载了,希望能从中有所收获,同时也希望大家在自定义实体这一块多多交流,我一直想实现象圆,直线那样具有动态属性的自定义实体,但一直没有找到方法,一直在探索中......
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-27 15:37:11 | 显示全部楼层
为什么定义了重载类,编译该重载函数的时候,编译器还告知没有重载过?
具体函数和调用如下:
cascoCEntity::cascoCEntity(const char *pdwgName, const char *pblockName)
{
mCenter.set(30.0,30.0,0.0);
mFirst.set(0.0, 0.0, 0.0);
mSecond.set(60.0, 0.0, 0.0);
mThree.set(60.0, 60.0, 0.0);
mFour.set(0.0, 60.0, 0.0);

//Drawing0.dwg  //TWO_RECT //CIRCLE
m_dwgName = pdwgName;
m_blockName = pblockName;
}

cascoCEntity *pMySecondEnt = cascoCEntity("Drawing0.dwg", "CIRCLE");
pTblRcd->appendAcDbEntity(objectID, pMySecondEnt);
pMySecondEnt->close();

重载的目的是向自定义类传送两个变量:m_dwgName ,m_blockName ;有没有其他办法向自定义类传送变量?[/COLOR]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2005-6-29 08:32:17 | 显示全部楼层
你调试跟踪一下,看看执行到那个地方出现的这个问题?很有可能是没有正确读取模板文件。解决办法:(1)在VC编译的时候,执行加载:当前文件目录为EntityTestNet,在其中Drawing0.dwg为模板文件。(2)把模板文件复制一份放置到你的ACAD安装目录下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2006-9-12 00:54:19 | 显示全部楼层
楼主的程序在worldDraw()函数中对ref进行了初始化,如下:

AcDbBlockReference *ref = new AcDbBlockReference();

程序我基本上看完了,可是在程序中的任何地方没有发现对ref显式的delete,这是很危险的,随时有崩溃的危险.

还有你在三楼提出的问题,既然你想定义带参数的构造函数传递参数,那么在程序中还必须定义一个不带参数的构造函数,否则连编译都不能通过,至于为什么可看看C++关于构造函数的语法规定.


请看我写的关于自定义实体中拖动块的程序片断,供参考:

class DLLIMPEXP  PGLline : public  AcDbEntity
{

public:
       
        PGLline(); //如果定义一个带参数的构造函数,还必须定义一个不带参数的构造函数      
        PGLline(const AcGePoint3d basepoint); // 定义一个带参数的构造函数
        virtual ~PGLline();

        //如果成员变量有指针,一定要在构造函数中对其初始化,否则程序崩溃
        //并且要在析构函数中删除指针,否则内存泄漏

        AcDbBlockReference *pBlkRef;  //块引用

        AcGePoint3d basepoint;        //块插入点

        virtual Adesk::Boolean worldDraw(AcGiWorldDraw * mode);
       
} ;


PGLline::PGLline()
{
   // ....
   // 在构造函数中对块引用进行初始化
   pBlkRef = new AcDbBlockReference(basepoint, blockId);
   // ....  
}


PGLline::PGLline(const AcGePoint3d basept)
{
   basepoint = basept;
   // ....
   pBlkRef = new AcDbBlockReference(basepoint, blockId);
   // ....   
}


PGLline::~PGLline()
{
  // 在析构函数中一定要显式的删除指针
  delete  pBlkRef;
  pBlkRef = NULL;       
}


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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 08:23 , Processed in 0.496266 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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