明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 887|回复: 6

workingdatabase 获取指针失败

[复制链接]
发表于 2022-2-17 17:38:01 | 显示全部楼层 |阅读模式
通过com 读取Excel 数据,根据数据在cad画图。
1.读取Excel数据,成功。2.添加图块成功 3.添加图层失败,在workingdatabase 获取指针失败。先是锁定文档,添加图层,再解除锁定。没有报错。在第3步,先锁定文档,再获取workingdatabase指针失败。提示access violation reading .请各位大佬不吝赐教
 楼主| 发表于 2022-2-18 15:45:01 | 显示全部楼层
现在把读excle 注释掉,先添加图层,再添加图块,调试进入获取workingdatabase2失败,db=00000000000000000,
static void addlayerblock()   // 添加图层
{
        ErrorStatus es;
        AcDbDatabase *db = NULL;
        acDocManager->lockDocument(acDocManager->curDocument());
        AcDbLayerTable *playerTable = NULL;
        if (!(db = acdbHostApplicationServices()->workingDatabase()))
        {
                acutPrintf(L"获取workingdata1失败");
delete db;
                return;
        }
        if (Acad::eOk != (es = db->getSymbolTable(playerTable, AcDb::kForWrite)))
        {
                acutPrintf(L"获取workingdata1失败");
                return;
        }
        if (!(playerTable->has(L"轮廓线")))
        {
                AcDbLayerTableRecord *playerTableR = new AcDbLayerTableRecord;
                playerTableR->setName(L"轮廓线");
                AcCmColor col;
                col.setColorIndex(255);
                playerTableR->setColor(col);
                playerTable->add(playerTableR);
                playerTableR->close();
        }
        playerTable->close();
        delete db;
        acDocManager->unlockDocument(acDocManager->curDocument());
}
static void makeBlock()  // 添加图块
{
        ErrorStatus es;
AcDbDatabase *db = NULL;
        acDocManager->lockDocument(acDocManager->mdiActiveDocument());
        AcGeVector3d nrm(0, 0, 1);
        AcDbBlockTable *blockt = NULL;
        if (!(db = acdbHostApplicationServices()->workingDatabase()))
        {
                acutPrintf(L"获取workingdata2失败");
                return;
        }
        if (Acad::eOk != (es = db->getBlockTable(playerTable, AcDb::kForWrite)))
        {
                acutPrintf(L"获取getBlockTable失败");
                return;
        }
        if (!(blockt->has(L"mM2")))   //添加M2螺纹孔
        {
                AcDbBlockTableRecord *ptblR = new AcDbBlockTableRecord;
                ptblR->setName(L"mM2");
                AcDbObjectId pid;
                blockt->add(pid, ptblR);
                AcGePoint3d ce(1.25, 0, 0);
                AcGePoint3d p(0, 0, 0);
                AcGePoint3d p0(2.5, 0, 0);
                AcDbLine *pl1 = new AcDbLine(p, p0);
                pl1->setLayer(L"中心线");
                ptblR->appendAcDbEntity(pid, pl1);
                ptblR->setOrigin(ce);
                pl1->close();
                ptblR->close();
        }
        blockt->close();
        acDocManager->unlockDocument(acDocManager->curDocument());
}

发表于 2022-2-18 16:16:36 | 显示全部楼层
直接写
AcDbDatabase* db = acdbHostApplicationServices()->workingDatabase();
非要
AcDbDatabase *db = NULL;
....
if (!(db = acdbHostApplicationServices()->workingDatabase()))
{
    acutPrintf(L"获取workingdata2失败");
    return;
}

自己给自己难受!

 楼主| 发表于 2022-2-18 16:31:25 | 显示全部楼层
gzxl 发表于 2022-2-18 16:16
直接写
AcDbDatabase* db = acdbHostApplicationServices()->workingDatabase();
非要

改成您这种方法,db依然是0,空指针,我查到非模态对话框,获取空指针,改进后使用了锁定文档,但是好像不管用啊
发表于 2022-2-18 16:38:47 | 显示全部楼层
QQ群:630401507
 楼主| 发表于 2022-2-22 16:57:15 | 显示全部楼层
自己收个尾,在用com 读取Excel时候,选取了多文档模式,导致锁存文档的混乱问题
发表于 2022-3-8 10:04:32 | 显示全部楼层
本帖最后由 2499569249 于 2022-3-14 18:35 编辑
gzxl 发表于 2022-2-18 16:16
直接写
AcDbDatabase* db = acdbHostApplicationServices()->workingDatabase();
非要

您好 可以把里程标注的插件发我试用下吗 我的邮箱:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 03:03 , Processed in 0.162520 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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