乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 170|回复: 12

从AcDbPolyLine派生

[复制链接]

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2009-3-24 01:45:15 | 显示全部楼层 |阅读模式
我有一个从AcDbployLine派生的类,(不是一个自定义对象),在我向数据库添加一些这些对象后,然后尝试卸载我的ARX应用程序,Acad崩溃。
我做错了什么吗?我用来添加实体的代码代码0]
h

  1. #pragma once
  2. #include "TypedValue.h"
  3. #include "pcode.h"
  4. #define ISEOK(statement)  { Acad::ErrorStatus st = (statement); if (st != Acad::eOk) return st; }
  5. class CrpRectangle: public AcDbPolyline
  6. {
  7. public:
  8.   CrpRectangle(DataMap &tvmap);
  9.   CrpRectangle(const AcGePoint2d &pt, double width, double height, PCode::Location loc);
  10.   virtual ~CrpRectangle(void);
  11. public:
  12.   Acad::ErrorStatus getWidth(double &width) const;
  13.   Acad::ErrorStatus setWidth(double width);
  14.   Acad::ErrorStatus getHeight(double &height) const;
  15.   Acad::ErrorStatus setHeight(double height);
  16.   Acad::ErrorStatus drawFrom(const AcGePoint3d &point);
  17.   Acad::ErrorStatus drawFrom(const AcGePoint2d &point);
  18.   Acad::ErrorStatus drawFrom(const AcGeVector2d &vec);
  19. private:
  20.   void calcLocation(const AcGePoint2d &startPoint, double width, double height, PCode::Location loc);
  21. public:
  22. AcGePoint2d getPt1() const;
  23. AcGePoint2d getPt2() const;
  24. AcGePoint2d getPt3() const;
  25. AcGePoint2d getPt4() const;
  26. AcGePoint2d getMPB() const;
  27. AcGePoint2d getMPR() const;
  28. AcGePoint2d getMPT() const;
  29. AcGePoint2d getMPL() const;
  30. AcGePoint2d getCenter() const;
  31. __declspec(property(get = getPt1))AcGePoint2d PT1;
  32. __declspec(property(get = getPt2))AcGePoint2d PT2;
  33. __declspec(property(get = getPt3))AcGePoint2d PT3;
  34. __declspec(property(get = getPt4))AcGePoint2d PT4;
  35. __declspec(property(get = getMPB))AcGePoint2d MPB;
  36. __declspec(property(get = getMPR))AcGePoint2d MPR;
  37. __declspec(property(get = getMPT))AcGePoint2d MPT;
  38. __declspec(property(get = getMPL))AcGePoint2d MPL;
  39. __declspec(property(get = getCenter))AcGePoint2d Center;
  40. };

cpp代码2]
添加了07的arx(命令为test)

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2009-3-24 03:26:31 | 显示全部楼层

派生类是一个自定义对象,它只是碰巧它没有覆盖
普通自定义对象的任何必需的虚函数。 因此,AcDbPolyline正在完成所有
绘图,归档,选择等。 该对象仍然是CrpRectangle类型,当
Autocad要求对象提供其RTTI时,它会得到CrpRectangle,只要加载
了您的应用程序,就会有一个VTable条目用于CrpRectangle的代码。 卸载
应用程序,对象仍为 CrpRectangle 类型,但 VTable 条目
不再有效并导致崩溃。
只有当绘图保存并重新加载时,您的 CrpRectangle 现在才真正成为
AcDbPolyline 对象。
保罗
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2009-3-24 03:39:16 | 显示全部楼层
好吧,这是有道理的,我想我可能应该学习如何以正确的方式制作自定义对象,或者重做我的类以创建多段线。
谢谢
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2009-3-24 03:53:14 | 显示全部楼层
我总是可以通过acrxDynamicLinker->lockApplication();
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2009-3-24 05:01:36 | 显示全部楼层
Paul所说的要点是,您可以向数据库添加对象(因为它们是从AcDbObject派生的,所以它们通过了“isA”测试),但是当调用db fileout方法时,它会崩溃,因为没有函数来处理调用。
对于您的折线对象,您只需在自定义的fileout函数中调用它的fileout()函数,它会自动处理,但是对于任何自定义数据,您都需要将文件写出/输入函数,以便正确归档。一般来说,这并不太难,因为大多数数据都是doubles或text,您可以将它们与内置的db对象相关联,以赋予它一些“智能”或自定义修改或抓取/捕捉行为,您只需记住在IRC中颠倒filein和fileout操作的顺序。
所有这些都应该在dbx dll中处理,您的自定义行为不会在arx中归档,当然,您的行为方法在dbx中,但是使它们发生的命令通常驻留在arx中。
高温。
回复

使用道具 举报

27

主题

193

帖子

5

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
300
发表于 2009-3-24 05:04:09 | 显示全部楼层
文档中有一个部分涵盖了归档对象的最低要求以及如何做到这一点,这并不难,最难的是事情的行为方面(使它们可靠/防错)IMO。
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2009-3-24 05:23:43 | 显示全部楼层
感谢Mick,
Ill查看有关构建自定义对象的文档,我认为那里也有一个示例视频。
我不需要改变实体的行为方式,我只想添加我自己构造对象的方式。
锁定应用程序似乎可以防止AutoCAD崩溃,尽管这可能是一个麻烦
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2009-3-24 13:14:47 | 显示全部楼层

抱歉Dan,我误解了你的第一个问题(我在考虑卸载dwg),锁定应用程序我停止它崩溃,但仍然有一个问题,正如你所说。
卸载应用程序不会将对象归档入/出,那么当您尝试保存文件时会发生什么?如果您希望保存对象并重新读取,您需要编写文件程序代码,如果不是,您可能必须在保存之前销毁对象,但这也有点笨手笨脚。
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2009-3-24 15:25:38 | 显示全部楼层
经过额外的测试,只要Arx在创建对象的会话中保持加载状态,似乎一切都很顺利。
保存,关闭等所有工作。正如保罗所说,这可能与VTable有关。
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2009-3-24 21:52:56 | 显示全部楼层

每次创建从arxwizard添加的自定义对象时都会有一个注释......例如:
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-6 04:12 , Processed in 0.542523 second(s), 77 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表