从AcDbPolyLine派生
我有一个从AcDbployLine派生的类,(不是一个自定义对象),在我向数据库添加一些这些对象后,然后尝试卸载我的ARX应用程序,Acad崩溃。我做错了什么吗?我用来添加实体的代码代码0]
h
#pragma once
#include "TypedValue.h"
#include "pcode.h"
#define ISEOK(statement){ Acad::ErrorStatus st = (statement); if (st != Acad::eOk) return st; }
class CrpRectangle: public AcDbPolyline
{
public:
CrpRectangle(DataMap &tvmap);
CrpRectangle(const AcGePoint2d &pt, double width, double height, PCode::Location loc);
virtual ~CrpRectangle(void);
public:
Acad::ErrorStatus getWidth(double &width) const;
Acad::ErrorStatus setWidth(double width);
Acad::ErrorStatus getHeight(double &height) const;
Acad::ErrorStatus setHeight(double height);
Acad::ErrorStatus drawFrom(const AcGePoint3d &point);
Acad::ErrorStatus drawFrom(const AcGePoint2d &point);
Acad::ErrorStatus drawFrom(const AcGeVector2d &vec);
private:
void calcLocation(const AcGePoint2d &startPoint, double width, double height, PCode::Location loc);
public:
AcGePoint2d getPt1() const;
AcGePoint2d getPt2() const;
AcGePoint2d getPt3() const;
AcGePoint2d getPt4() const;
AcGePoint2d getMPB() const;
AcGePoint2d getMPR() const;
AcGePoint2d getMPT() const;
AcGePoint2d getMPL() const;
AcGePoint2d getCenter() const;
__declspec(property(get = getPt1))AcGePoint2d PT1;
__declspec(property(get = getPt2))AcGePoint2d PT2;
__declspec(property(get = getPt3))AcGePoint2d PT3;
__declspec(property(get = getPt4))AcGePoint2d PT4;
__declspec(property(get = getMPB))AcGePoint2d MPB;
__declspec(property(get = getMPR))AcGePoint2d MPR;
__declspec(property(get = getMPT))AcGePoint2d MPT;
__declspec(property(get = getMPL))AcGePoint2d MPL;
__declspec(property(get = getCenter))AcGePoint2d Center;
};
cpp代码2]
添加了07的arx(命令为test)
**** Hidden Message *****
派生类是一个自定义对象,它只是碰巧它没有覆盖
普通自定义对象的任何必需的虚函数。 因此,AcDbPolyline正在完成所有
绘图,归档,选择等。 该对象仍然是CrpRectangle类型,当
Autocad要求对象提供其RTTI时,它会得到CrpRectangle,只要加载
了您的应用程序,就会有一个VTable条目用于CrpRectangle的代码。 卸载
应用程序,对象仍为 CrpRectangle 类型,但 VTable 条目
不再有效并导致崩溃。
只有当绘图保存并重新加载时,您的 CrpRectangle 现在才真正成为
AcDbPolyline 对象。
保罗 好吧,这是有道理的,我想我可能应该学习如何以正确的方式制作自定义对象,或者重做我的类以创建多段线。
谢谢
我总是可以通过acrxDynamicLinker->lockApplication(); Paul所说的要点是,您可以向数据库添加对象(因为它们是从AcDbObject派生的,所以它们通过了“isA”测试),但是当调用db fileout方法时,它会崩溃,因为没有函数来处理调用。
对于您的折线对象,您只需在自定义的fileout函数中调用它的fileout()函数,它会自动处理,但是对于任何自定义数据,您都需要将文件写出/输入函数,以便正确归档。一般来说,这并不太难,因为大多数数据都是doubles或text,您可以将它们与内置的db对象相关联,以赋予它一些“智能”或自定义修改或抓取/捕捉行为,您只需记住在IRC中颠倒filein和fileout操作的顺序。
所有这些都应该在dbx dll中处理,您的自定义行为不会在arx中归档,当然,您的行为方法在dbx中,但是使它们发生的命令通常驻留在arx中。
高温。 文档中有一个部分涵盖了归档对象的最低要求以及如何做到这一点,这并不难,最难的是事情的行为方面(使它们可靠/防错)IMO。 感谢Mick,
Ill查看有关构建自定义对象的文档,我认为那里也有一个示例视频。
我不需要改变实体的行为方式,我只想添加我自己构造对象的方式。
锁定应用程序似乎可以防止AutoCAD崩溃,尽管这可能是一个麻烦
抱歉Dan,我误解了你的第一个问题(我在考虑卸载dwg),锁定应用程序我停止它崩溃,但仍然有一个问题,正如你所说。
卸载应用程序不会将对象归档入/出,那么当您尝试保存文件时会发生什么?如果您希望保存对象并重新读取,您需要编写文件程序代码,如果不是,您可能必须在保存之前销毁对象,但这也有点笨手笨脚。 经过额外的测试,只要Arx在创建对象的会话中保持加载状态,似乎一切都很顺利。
保存,关闭等所有工作。正如保罗所说,这可能与VTable有关。
每次创建从arxwizard添加的自定义对象时都会有一个注释......例如:
页:
[1]
2