乐筑天下

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

请高手帮忙:同样的命令却有两种结局???

[复制链接]

2

主题

7

帖子

3

银币

初来乍到

Rank: 1

铜币
15
发表于 2005-11-24 18:44:00 | 显示全部楼层 |阅读模式
我在无模式对话框编程中想生成一直线报错(\Dlg.cpp(215) : error C2660: 'new' : function does not take 3 parameters)
但是同样的命加入到命令程序中(没有对话框)正常,在家折腾了几天,没有结果,高手能帮帮吗?
下面是我的程序。
void CDlg::xh_creatTab()
{
    AcGePoint3d startPt(4.0, 2.0, 0.0);
    AcGePoint3d endPt(24.0,2.0,0.0);
    AcDbLine *pLine = new AcDbLine(startPt, endPt);
AcDbBlockTable *pBlockTable;
    acdbCurDwg()->getBlockTable(pBlockTable,
        AcDb::kForRead);
    AcDbBlockTableRecord *pBlockTableRecord;
    pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
        AcDb::kForWrite);
    pBlockTable->close();
    AcDbObjectId lineId;
    pBlockTableRecord->appendAcDbEntity(lineId, pLine);
    pBlockTableRecord->close();
    pLine->close();
}
回复

使用道具 举报

124

主题

837

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1333
发表于 2005-11-24 18:56:00 | 显示全部楼层
把整个工程文件发上来吧,这样容易调试
回复

使用道具 举报

1

主题

9

帖子

1

银币

初来乍到

Rank: 1

铜币
13
发表于 2005-11-24 20:04:00 | 显示全部楼层
Modeless dialog is in Application context, that to say, document is not locked and you need explictly lock the document in case you want to open something for write. In the document context, autocad will lock the document for you, that's why the same code can run successfully in command.
PS: You need not locking the document when you just open something for read.

回复

使用道具 举报

2

主题

7

帖子

3

银币

初来乍到

Rank: 1

铜币
15
发表于 2005-11-24 22:40:00 | 显示全部楼层
好的,我将上面一段代码放在void runID()里面,在调用对话框前执行。
我发现这段代码在没有对话框的工程中运行一点问题都没有,但是一旦到含有对话框的工程中(不论是模式还是非模式对话框都一样)就出上上面所讲的问题,谢谢你帮我查查,我就发上来
回复

使用道具 举报

2

主题

7

帖子

3

银币

初来乍到

Rank: 1

铜币
15
发表于 2005-11-24 23:01:00 | 显示全部楼层
怎么没传上去啊,出错
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:crfv1jelau4.rar 
下载次数:0  文件大小:29.7 KB  售价:2银币 [记录]
下载权限: 不限 以上或 Vip会员   [开通Vip]   [签到领银币]  [免费赚银币]

回复

使用道具 举报

1

主题

9

帖子

1

银币

初来乍到

Rank: 1

铜币
13
发表于 2005-11-25 20:20:00 | 显示全部楼层
Debug the code and check the return value of each function and all the pointer value, from these you can get some clue about the error.
回复

使用道具 举报

124

主题

837

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1333
发表于 2005-11-25 22:18:00 | 显示全部楼层
看看以下内容,是否能有帮助:
默认状态下AutoCAD2004是多文档应用程序,系统变量SDI=0,
acdbHostApplicationServices()->workingDatabase();
不是指一个文档,而是多个文档.当使用模态对话框时,这个对话框资源属于唯一的一个文档,所以不会产生错误;
而使用非模态对话框时,对话框资源不属于任何一个文档,如果修改往数据库(写操作),就会导致AutoCAD异常.
解决的方法是:
使用非模态对话框时要显式地管理文档的状态,当然,如果不需要多文档,则将系统变量SDI设为1也能解决非模态对话框的问题,
一般以写的方式操作实体时,要将当前文档锁定,操作结束后,解锁文档,而以读的方式打开对象,不需要锁定文档:
acDocManager->lockDocument(acDocManager->curDocument(), AcAp::kWrite, NULL, NULL, true);
这个函数的使用是锁定文档以便访问它们的资源,这些资源包括与文档相关联的的数据库对象(AcDbDatabases objects associated with a document),以及这些数据库中的实体对象(AcDbObject objects),还有数据库常驻系统变量(all AcDbDatabase resident system variables).
它还包括了基于系统变量的所有文档(all document based system variables),及与文档关联的事务管理器(the Transaction Manager associated with a document).文档在以AcDb::kForRead打开一个AcDbObject对象时不需要锁定,读取系统变量时也不需要锁定文档.
...
acDocManager->unlockDocument(acDocManager->curDocument());

示例:
void lockDocument_Test()
{
AcGePoint3d start(0.0,0.0,0.0), end(10.0,10.0,0.0);
AcDbLine *line = new AcDbLine(start, end);
AcDbBlockTable *pBlockTable;
// 锁定当前文档
acDocManager->lockDocument(acDocManager->curDocument(), AcAp::kWrite, NULL, NULL, true);
acDocManager->curDocument()->database()->getBlockTable(pBlockTable, AcDb::kForRead);
//acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);
AcDbBlockTableRecord *pBlockTableRec;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRec, AcDb::kForWrite);
pBlockTable->close();
AcDbObjectId objId;
pBlockTableRec->appendAcDbEntity(objId, line);
line->close();
pBlockTableRec->close();
// 运行完解锁文档
acDocManager->unlockDocument(acDocManager->curDocument());
}
回复

使用道具 举报

2

主题

7

帖子

3

银币

初来乍到

Rank: 1

铜币
15
发表于 2005-11-27 00:21:00 | 显示全部楼层
谢谢王咣生版主回答,但是我用的是AutoCADR14版本(因为单位用的是R14版本的)。
我测试了一下,只要我用MFC AppWizard[dll]生成工程,就出这方面的问题(不论是模式对话框不是非模式对话框),我估计应该是MFC中有什么函数与它发生冲突,但又不象(真想不明白MFC会重载这个函数),这个问题只有象你这类高手才能解决,我很菜,不知ARX怎样调试,看论谈,好象是先设断点,再按F5等就进入CAD内进行调试,但这个工程无法编译
回复

使用道具 举报

5

主题

25

帖子

1

银币

初来乍到

Rank: 1

铜币
45
发表于 2005-12-28 20:42:00 | 显示全部楼层
你还应该加一个让cad获得焦点的函数
回复

使用道具 举报

2

主题

37

帖子

3

银币

初来乍到

Rank: 1

铜币
45
发表于 2005-12-28 21:13:00 | 显示全部楼层
大概是 MFC在 CDlg 中重定义 new,  好在编译没有通过,如果通过,重定义的 new 与 ACAD中要求的 new 可能不一致,可能会引起内存泄漏!
你可以在 CDlg外 new 一个 AcDbLine:
AcDbLine *MyNewLine(AcGePoint3d  startPt,  AcGePoint3d endPt)
{
    return  new AcDbLine(startPt, endPt);
}
void CDlg::xh_creatTab()
{
    AcGePoint3d startPt(4.0, 2.0, 0.0);
    AcGePoint3d endPt(24.0,2.0,0.0);
   ///////////////////// AcDbLine *pLine = new AcDbLine(startPt, endPt);
  AcDbLine *pLine = MyNewLine(startPt, endPt);   //

AcDbBlockTable *pBlockTable;
    acdbCurDwg()->getBlockTable(pBlockTable,
        AcDb::kForRead);
......................................
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-5 14:40 , Processed in 0.220241 second(s), 88 queries .

© 2020-2025 乐筑天下

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