找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 899|回复: 4

[求助]:请REDCAD及众大哥帮忙!

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

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

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

×
我自定义了一个矩形类,就是可以拖放的那种.但是不知道为什么当我拖放完成时候会出现致命错误.无法完成矩形的最终绘制.
哪位大哥可以帮小弟看看是什么原因.

拖放结束后出现: Unhandled Expception C0000005(Access Violation Reading Ox0054)at address 65462AC9h
关掉AUTCAD后 出现 :INTERNAL ERROR!XCOMMAND.cpp@3337:Was Open For Write
代码如下:

class CMARectWindow : public AcDbEntity
{
public:

ACRX_DECLARE_MEMBERS(CMARectWindow);
CMARectWindow();
virtual ~CMARectWindow();
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler) const;
virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* pFiler);
virtual Acad::ErrorStatus dxfInFields(AcDbDxfFiler* pFiler);
virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler* pFiler)const;
virtual Acad::ErrorStatus getGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapMasks, AcDbIntArray& geomIds) const;
virtual Acad::ErrorStatus moveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset);
virtual Adesk::Boolean worldDraw(AcGiWorldDraw* mode);
AcGePoint3d m_UpLeftPt;
AcGePoint3d m_DownRightPt;
AcGePoint3d m_DownLeftPt;
AcGePoint3d m_UpRightPt;
private:
};




ACRX_DXF_DEFINE_MEMBERS(CMARectWindow, AcDbEntity,
AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
0,
CUSTOMENTITY, /*MSG0*/AUTOCAD);


CMARectWindow::CMARectWindow()
{

}

CMARectWindow::~CMARectWindow()
{}

Acad::ErrorStatus CMARectWindow::getGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapMasks, AcDbIntArray& geomIds)const
{
assertReadEnabled();
AcGePoint3d um,lm,rm,bm;
um=m_UpLeftPt+0.5*(m_UpRightPt-m_UpLeftPt);
lm=m_DownLeftPt+0.5*(m_UpLeftPt-m_DownLeftPt);
rm=m_DownRightPt+0.5*(m_UpRightPt-m_DownRightPt);
bm=m_DownLeftPt+0.5*(m_DownRightPt-m_DownLeftPt);
gripPoints.append(um);
gripPoints.append(rm);
gripPoints.append(bm);
gripPoints.append(lm);
return Acad::eOk;
}
Acad::ErrorStatus CMARectWindow::moveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset)
{
assertWriteEnabled();
switch(indices[0]) {
case 0:
m_UpLeftPt[Y]+=offset.y;
m_UpRightPt[Y]+=offset.y;
break;
case 1:
m_UpRightPt[X]+=offset.x;
m_DownRightPt[X]+=offset.y;
break;
case 2:
m_DownLeftPt[Y]-=offset.y;
m_DownRightPt[Y]-=offset.y;
break;
case 3:
m_DownLeftPt[X]-=offset.x;
m_UpLeftPt[X]-=offset.x;
break;
default:
break;
}
return Acad::eOk;
}
Adesk::Boolean CMARectWindow::worldDraw(AcGiWorldDraw* mode)
{
assertReadEnabled();

m_DownLeftPt[0]=m_UpLeftPt[0];
m_DownLeftPt[1]=m_DownRightPt[1];
m_DownLeftPt[2]=0;
m_UpRightPt[0]=m_DownRightPt[0];
m_UpRightPt[1]=m_UpLeftPt[1];
m_UpRightPt[2]=0;
AcGePoint3d pLineArray[5];
pLineArray[0] =m_UpLeftPt;
pLineArray[1] =m_UpRightPt;
pLineArray[2] =m_DownRightPt;
pLineArray[3] =m_DownLeftPt;
pLineArray[4] =m_UpLeftPt;
mode->geometry().polyline(5, pLineArray);

return Adesk::kTrue;
}

Acad::ErrorStatus CMARectWindow::dwgInFields(AcDbDwgFiler* pFiler)
{
assertWriteEnabled();

Acad::ErrorStatus es;
if ((es = AcDbEntity::dwgInFields(pFiler)) != Acad::eOk)
{
return es;
}

pFiler->readItem(&m_UpLeftPt);
pFiler->readItem(&m_DownRightPt);
pFiler->readItem(&m_DownLeftPt);
pFiler->readItem(&m_UpRightPt);
return pFiler->filerStatus();
}

Acad::ErrorStatus CMARectWindow::dwgOutFields(AcDbDwgFiler* pFiler) const
{
assertReadEnabled();

Acad::ErrorStatus es;
if ((es = AcDbEntity::dwgOutFields(pFiler)) != Acad::eOk)
{
return es;
}

pFiler->writeItem(m_UpLeftPt);
pFiler->writeItem(m_DownRightPt);
pFiler->writeItem(m_UpRightPt);
pFiler->writeItem(m_DownLeftPt);
return pFiler->filerStatus();
}

Acad::ErrorStatus CMARectWindow::dxfInFields(AcDbDxfFiler* pFiler)
{
assertWriteEnabled();
Acad::ErrorStatus es=Acad::eOk;
resbuf rb;
if ((AcDbEntity::dxfInFields(pFiler)!=Acad::eOk)||!pFiler->atSubclassData("CMARectWindow"))
{
return pFiler->filerStatus();
}
AcGePoint3d ulPt,urPt,dlPt,drPt;
while ((es==Acad::eOk)&&(es=pFiler->readResBuf(&rb))==Acad::eOk)
{
switch(rb.restype) {
case kDxfXCoord:
ulPt=asPnt3d(rb.resval.rpoint);
break;
case kDxfXCoord+1:
urPt=asPnt3d(rb.resval.rpoint);
break;
case kDxfXCoord+2:
dlPt=asPnt3d(rb.resval.rpoint);
break;
case kDxfXCoord+3:
drPt=asPnt3d(rb.resval.rpoint);
break;
default:
pFiler->pushBackItem();
es=Acad::eEndOfFile;
break;
}
}
if (es!=Acad::eEndOfFile)
{
return Acad::eInvalidResBuf;
}
return es;

}

Acad::ErrorStatus CMARectWindow::dxfOutFields(AcDbDxfFiler* pFiler) const
{
assertReadEnabled();
Acad::ErrorStatus es;
if ((es=AcDbEntity::dxfOutFields(pFiler))!=Acad::eOk)
{
return es;
}
pFiler->writeItem(AcDb::kDxfSubclass,"CMARectWindow");
pFiler->writeItem(AcDb::kDxfXCoord,m_UpLeftPt);
pFiler->writeItem(AcDb::kDxfXCoord+1,m_UpRightPt);
pFiler->writeItem(AcDb::kDxfXCoord+2,m_DownRightPt);
pFiler->writeItem(AcDb::kDxfXCoord+3,m_DownLeftPt);
return es;
}
class AsdkRectJig:public AcEdJig
{
public:
AsdkRectJig(AcGePoint3d &);
void doIt();
virtual DragStatus sampler();
virtual Adesk::Boolean update();
virtual AcDbEntity* entity() const;
protected:
private:
CMARectWindow *mpRect;
AcGePoint3d mUpLeftPt,mDownRightPt;
double m_length,m_height;
AcGeVector3d mNormal;
};

AsdkRectJig::AsdkRectJig(AcGePoint3d &Pt)
{
mpRect=new CMARectWindow();
mpRect->m_UpLeftPt=Pt;
}

void AsdkRectJig::doIt()
{

setDispPrompt("\nRect choose the second point:");
AcEdJig::DragStatus stat=drag();
append();

}

AcEdJig::DragStatus
AsdkRectJig::sampler()
{
DragStatus stat;
setUserInputControls((UserInputControls)
(AcEdJig::kGovernedByOrthoMode
|AcEdJig::kAccept3dCoordinates
|AcEdJig::kNoNegativeResponseAccepted
|AcEdJig::kNoZeroResponseAccepted));
static AcGePoint3d axispointTemp;
stat=acquirePoint(mDownRightPt);
if (axispointTemp!=mDownRightPt)
{
axispointTemp=mDownRightPt;
}
else if(stat==AcEdJig::kNormal)
{
return AcEdJig::kNoChange;
}
return stat;
}

Adesk::Boolean
AsdkRectJig::update()
{
mpRect->m_DownRightPt=mDownRightPt;
return Adesk::kTrue;
}

AcDbEntity *
AsdkRectJig::entity() const
{
return mpRect;
}

// This is command 'REC'
void studyrectrec()
{
// TODO: Implement the command
AcGePoint3d tempPt;
struct resbuf rbFrom,rbTo;
ads_getpoint(NULL,"\nRect choose the first point:",asDblArray(tempPt));
rbFrom.restype=RTSHORT;
rbFrom.resval.rint=1;
rbTo.restype=RTSHORT;
rbTo.resval.rint=0;
ads_trans(asDblArray(tempPt),&rbFrom,&rbTo,Adesk::kFalse,asDblArray(tempPt));
AsdkRectJig *pJig=new AsdkRectJig(tempPt);
pJig->doIt();
delete pJig;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-9-2 12:32:54 | 显示全部楼层
1。类的数据结构有问题;
   定义一个矩形只要两个点就唯一确定了,你却用了四个点,只要左下和右上角点就可以
   了,何必还要左上和右下角点呢?你或者采用左下和右上角点或者采用左上和右下角点
   就可以了。其它两个点不是根据定义的两个点能计算出来的吗?
2。由此你的WordDraw函数存在致命的问题:
   Adesk::Boolean CMARectWindow::worldDraw(AcGiWorldDraw* mode)
{
assertReadEnabled();

m_DownLeftPt[0]=m_UpLeftPt[0];
m_DownLeftPt[1]=m_DownRightPt[1];
m_DownLeftPt[2]=0;
m_UpRightPt[0]=m_DownRightPt[0];
m_UpRightPt[1]=m_UpLeftPt[1];
m_UpRightPt[2]=0;
AcGePoint3d pLineArray[5];
pLineArray[0] =m_UpLeftPt;
pLineArray[1] =m_UpRightPt;
pLineArray[2] =m_DownRightPt;
pLineArray[3] =m_DownLeftPt;
pLineArray[4] =m_UpLeftPt;
mode->geometry().polyline(5, pLineArray);

return Adesk::kTrue;
}

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

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2006-9-2 14:12:03 | 显示全部楼层
谢谢各位大哥了,问题解决了,是小弟的疏忽,在
initApp()
{
    acedRegCmds->addCommand("CMM", "REC", "REC", ACRX_CMD_MODAL, studyrectrec);
       
    //自定义类初始化函数
  //此处忘了添加
  CMARectWindow::rxInit();
    acrxBuildClassHierarchy();
       
}

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

使用道具 举报

发表于 2006-9-2 14:54:48 | 显示全部楼层
这是使用自定义类的时候的常见问题,不过,我发现在ARx2005中使用DBX程序来做自定义类的话,仿佛不需要注册之类的了,只需要放入头文件就OK了,不知有否高手也遇到过这样的情况,我想与各位讨论!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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