找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 938|回复: 7

[求助]:刚学习自定义实体,出现了问题,请指教!

[复制链接]
发表于 2006-6-24 09:41:58 | 显示全部楼层 |阅读模式

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

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

×
我从AcDbEntity派生了一个子类AzhtEntity,然后又从AzhtEntity派生AzhtBreaker,如下:一些必须的重载函数还有些返回值都已省略,
AzhtEntity中:
class AzhtEntity:public AcDbEntity
{
public:
        ACRX_DECLARE_MEMBERS(AzhtEntity);
        AzhtEntity();
                     virtual ~AzhtEntity();
.....................................
.....................................
..................moveGripPointsAt()..........
..................getGripPoints()................
..................transformBy()..................
.........................................................
........................................................
private:
        AcGePoint3d m_insertPt;        //插入点
};

AzhtEntity::getGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const
{
        assertReadEnabled();
        gripPoints.append(m_insertPt);
        return Acad::eOk;
}

AzhtEntity::moveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset)
{
        assertWriteEnabled();
        return Acad::eOk;
}

AzhtEntity::transformBy(const AcGeMatrix3d& xform)
{
        assertWriteEnabled();
        return Acad::eOk;
}
AzhtBreaker中:
class AzhtBreaker:public AzhtEntity
{
public:
        ACRX_DECLARE_MEMBERS(AzhtBreaker);
        AzhtBreaker();
        virtual ~AzhtBreaker();
.....................................
.....................................
..................moveGripPointsAt()..........
..................getGripPoints()................
..................transformBy()..................
.........................................................
........................................................
private:
        AcGePoint3d m_otherPt;        //插入点
};
AzhtBreaker::getGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const
{
        assertReadEnabled();
        int iDirection = ((AzhtEntity*)this)->getDirection();
        AcGePoint3d insertPt = ((AzhtEntity*)this)->getInsertPt();
        gripPoints.append(m_otherPt);
        AzhtEntity::getGripPoints(gripPoints, osnapModes, geomIds);
        return Acad::eOk;
}

AzhtBreaker::moveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset)
{
        assertWriteEnabled();
        //若没有选中点或偏移为0
        if(indices.length()==0 || offset.isZeroLength())
                return Acad::eOk;
        return transformBy(AcGeMatrix3d::translation(offset));
}

AzhtBreaker::transformBy(const AcGeMatrix3d& xform)
{
        assertWriteEnabled();
        AcGePoint3d insertPt = getInsertPt();
        insertPt.transformBy(xform);
        m_otherPt.transformBy(xform);
       
        return Acad::eOk;
}

我这样做之后,能够得到夹点,但在移动的时候出现问题,说什么内存不足!请高手指教一下,谢谢!!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-6-24 11:27:04 | 显示全部楼层

Re: [求助]:刚学习自定义实体,出现了问题,请指教!

最初由 yoursmile 发布
[B]AzhtEntity::getGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const
{
assertReadEnabled();
gripPoints.append(m_insertPt);
return Acad::eOk;
}
[/B]


这个函数可能有问题,因为getGripPoints会连续不断的执行,gripPoints最终会变得很大,应该进行清空处理。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-6-24 11:54:27 | 显示全部楼层

Re: Re: [求助]:刚学习自定义实体,出现了问题,请指教!

最初由 missyou0515 发布
[B][QUOTE]最初由 yoursmile 发布
[B]AzhtEntity::getGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const
{
assertReadEnabled();
gripPoints.append(m_ins... [/B]


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

使用道具 举报

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

使用道具 举报

发表于 2006-6-24 13:59:43 | 显示全部楼层
代码已经帮你改完,问题在于字符串的处理

注意下面的代码

子类的构造必须调用父类的构造,下面的你都写了,这个构造你为什么不写呢
AzhtBreaker::AzhtBreaker():AzhtEntity()
{}

//增加了程序的稳定性,但用指针依然非常危险,,如果m_lpPlantName 没有被赋值,在调用dwgOutFields时会引起异常,建议使用cstring
AzhtEntity::AzhtEntity()
{
        m_lpPlantName = NULL;
        m_lpTypeNum = NULL;
        m_lpNumber = NULL;
}


        acutDelString(m_lpPlantName);
        pFiler->readString(&m_lpPlantName);
        acutDelString(m_lpTypeNum);
        pFiler->readString(&m_lpTypeNum);
        acutDelString(m_lpNumber);
        pFiler->readString(&m_lpNumber);



        if(m_lpPlantName !=        NULL)
                pFiler->writeString(m_lpPlantName);
        if(m_lpTypeNum != NULL)
                pFiler->writeString(m_lpTypeNum);
        if(m_lpNumber != NULL)
                pFiler->writeString(m_lpNumber);

并不匹配

还有
ACRX_DXF_DEFINE_MEMBERS(AzhtBreaker, AcDbEntity, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, 0, BREAKER, "Test")
书写错误,父类写错了

AzhtBreaker::moveGripPointsAt() 函数实现不正确,请不要调用transformBy

AzhtBreaker::transformBy() 函数       
AcGePoint3d insertPt = getInsertPt();
insertPt.transformBy(xform);
有误

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

使用道具 举报

 楼主| 发表于 2006-6-24 14:13:15 | 显示全部楼层
呵呵,谢谢binbin,你太热心了,万分感谢!我还想知道就是这个自定义对象的移动会激发哪些函数的调用呢?
我在想:AzhtBreaker::moveGripPointsAt() 函数为什么不能调用transformBy呢?只有移动了,然后调用transformBy来进行实体中各个点的矩阵变换了嘛!这个好像在SDK的文档里面都是这样的呀

还有
acutDelString(m_lpPlantName);
pFiler->readString(&m_lpPlantName);
acutDelString(m_lpTypeNum);
pFiler->readString(&m_lpTypeNum);
acutDelString(m_lpNumber);
pFiler->readString(&m_lpNumber);



if(m_lpPlantName != NULL)
pFiler->writeString(m_lpPlantName);
if(m_lpTypeNum != NULL)
pFiler->writeString(m_lpTypeNum);
if(m_lpNumber != NULL)
pFiler->writeString(m_lpNumber);

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 01:19 , Processed in 0.514311 second(s), 46 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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