找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: ssh

[求助]:大家帮我看看这么简单的程序错在哪儿

[复制链接]

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-8-8 00:09:30 | 显示全部楼层
最初由 ssh 发布
[B]我已经手工添加了,然后再arx中修改的,还是出问题。
手工添加后的图形如下,通过entget获得的表是:
((-1 . <图元名: 40069e40>) (0 . "HATCH") (330 . <图元名: 40069cf8>) (5 . "48")
(100 . "AcDbEntity") (... [/B]


这个函数:

Acad::ErrorStatus postToDb(AcDbEntity* ent,AcDbObjectId entId)

你这么定义:

Acad::ErrorStatus postToDb(AcDbEntity* ent,AcDbObjectId &entId)

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

使用道具 举报

 楼主| 发表于 2003-8-8 10:04:55 | 显示全部楼层
问题依旧//sigh
代码修改如下:
    AcGePoint3d vertexPts[4];
    AcDbObjectId lineId, hatchId;
    AcDbObjectIdArray dbObjIds=NULL;

    vertexPts[0].set(2.0, 2.0, 0.0);
    vertexPts[1].set(8.0, 2.0, 0.0);
    vertexPts[2].set(8.0, 8.0, 0.0);
    vertexPts[3].set(2.0, 8.0, 0.0);

    for (int i = 0; i < 4; i++) {
        AcDbLine *line =  new AcDbLine(vertexPts,vertexPts[(i == 3) ? 0 : i+1]);
        AcDbBlockTable* pBlkTbl;
                acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl,AcDb::kForRead);
                AcDbBlockTableRecord* pBlkTblRcd;
                pBlkTbl->getAt(ACDB_MODEL_SPACE,pBlkTblRcd,AcDb::kForWrite);
                pBlkTbl->close();
        pBlkTblRcd->appendAcDbEntity(lineId,line);
                pBlkTblRcd->close();               
        dbObjIds.append(lineId);
                line->close();
    }
还是不能appendLoop.dbObjIds.length()=4的,可就是不能形成loop.怎么回事了?


怎样才能比较AcDbObjectIdArray  dbObjIds里面的id和实体的id的呢?[/COLOR]
Acad::ErrorStatus

appendLoop(

Adesk::Int32 loopType,

const AcDbObjectIdArray& dbObjIds);

loopType Input loop type
dbObjIds Input set of object IDs

This function appends a new boundary loop (path or polyline) to the hatch entity. loopType specifies the type for the loop, which is an enum number of kDefault or kExternal. dbObjIds is a set of object IDs of AcDbEntities that make up the boundary loop. The object IDs will be maintained if the hatch entity is an associative.

This function returns Acad::eOk when successful. Otherwise, it returns Acad::eInvalidInput.
[B]求助:appendLoop的这一用法AcDbObjectIdArray& dbObjIds是什么意思?传给地址?为什么我的总是不能appendLoop呢?该函数该怎么使用?郁闷死了!![/B]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-8-8 15:52:25 | 显示全部楼层
都这么狠,完了,我要回家种地 了喔 呜呜呜呜呜呜!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-8-8 16:30:31 | 显示全部楼层
最初由 ssh 发布
[B]问题依旧//sigh
代码修改如下:
    AcGePoint3d vertexPts[4];
    AcDbObjectId lineId, hatchId;
    AcDbObjectIdArray dbObjIds=NULL;

    vertexPts[0].set(2.0, 2.0, 0.0);
    vertexPts[1].set(8.0... [/B]


& 传递的是引用,以前的C 函数传递指针,然后在函数里面修改指针指向地址的内容来修改函数体外面的变量,在函数体里面要用 (* ptr) 用引用就方便了,在函数体内还使用指针变量名,就可以达到相同的目的。

目的就是在函数体内修改了引用变量值,函数体外也同时修改,这样就可以解决函数返回值多个。

你的代码你在

pBlkTblRcd->appendAcDbEntity(lineId,line);

这行后,判断下LINEID是否是AcDb::kNull,如果不成功这个值就是NULL了。

另外 line->close() 这行你放到dbObjIds.append(lineId);的前面。

还有AcDbObjectIdArray dbObjIds=NULL; 不用NULL,修改成 AcDbObjectIdArray dbObjId;
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-8-8 18:12:44 | 显示全部楼层
修改至如此:
void AsdkMYH()
{
    // TODO: Implement the command
    AcDbHatch* pHatch = new AcDbHatch();

    // Set hatch plane
    //
    AcGeVector3d normal(0.0, 0.0, 1.0);
    pHatch->setNormal(normal);
    pHatch->setElevation(0.0);

    // Set hatch pattern to ANSI31 predefined type
    //
    pHatch->setPattern(AcDbHatch::kPreDefined, "ANSI31");
    pHatch->setHatchStyle(AcDbHatch::kNormal);
    pHatch->setPatternScale(0.5);
    pHatch->setPatternAngle(0.0);

    // Set Associativity
    //
    pHatch->setAssociative(Adesk::kFalse);

    // Construct database AcDbLines
    //
    AcGePoint3d vertexPts[4];
    AcDbObjectId lineId, hatchId;
    AcDbObjectIdArray dbObjIds;
    //AcDbLine *line=NULL;

    vertexPts[0].set(2.0, 2.0, 0.0);
    vertexPts[1].set(8.0, 2.0, 0.0);
    vertexPts[2].set(8.0, 8.0, 0.0);
    vertexPts[3].set(2.0, 8.0, 0.0);

    for (int i = 0; i < 4; i++) {
        AcDbLine *line =  new AcDbLine(vertexPts,vertexPts[(i == 3) ? 0 : i+1]);
        AcDbBlockTable* pBlkTbl;
        acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl,AcDb::kForRead);
        AcDbBlockTableRecord* pBlkTblRcd;
        pBlkTbl->getAt(ACDB_MODEL_SPACE,pBlkTblRcd,AcDb::kForWrite);
        pBlkTbl->close();
        pBlkTblRcd->appendAcDbEntity(lineId,line);
        if(lineId.isNull()||!lineId.isValid())
        {
                acutPrintf("\nERROR!!Id is NULL!");
                return;
        }
        pBlkTblRcd->close();
        line->close();
        dbObjIds.append(lineId);
               
    }
    int Idlen=dbObjIds.length();
    acutPrintf("\ndbObjIds length:%d",Idlen);

    // Append an external rectangular loop to hatch boundary
    //
    Acad::ErrorStatus es=pHatch->appendLoop(AcDbHatch::kExternal, dbObjIds);
    if(es=Acad::eOk)
    {
        acutPrintf("\nappendLoop is ok");
    }
    else
    {
        acutPrintf("\nappendLoop is ERROR,Error No:%d",es);
        pHatch->close();
        return;
    }

    if (pHatch->evaluateHatch()!=Acad::eOk)
   {
        acutPrintf("\nevaluateHatch() is ERROR");
   }
    es=postToDb(pHatch);
   if(es!=Acad::eOk)
   {
        acutPrintf("\npostToDb is ERROR,Error No:%d",es);
        pHatch->close();
        return;
   }
   pHatch->close();
}
但问题依旧,收到的id数组没有说错误,但如果他不出错误,总不会appendLoop函数本身错了吧?
还有一个类似的程序,检验appendLoop,程序如下,但问题时一样的不能appendLoop.这是怎么回事?(其中比例是实现手工获得的,保证每错误)
void Asdkfill()
{
        // TODO: Implement the command
        ads_name ss,entname;
        AcDbObjectId objId;
        AcDbEntity* pEnt=NULL;
        AcDbObjectIdArray dbObjIds;
        acedSSGet(NULL,NULL,NULL,NULL,ss);
        long len;
        acedSSLength(ss,&len);
        for(long i=0;i<len;i++)
        {
                if(acedSSName(ss,i,entname)!=RTNORM)
                {
                        acutPrintf("entname error,No:&ld",i);
                        return;
                }
                acdbGetObjectId(objId,entname);
                if(objId.isNull()||!objId.isValid())
                {
                        acutPrintf("\nERROR!!Id is NULL or invalid!");
                        return;
                }
        dbObjIds.append(objId);
               
        }

        AcDbHatch* pHatch = new AcDbHatch();
    AcGeVector3d normal(0.0, 0.0, 1.0);
    pHatch->setNormal(normal);
    pHatch->setElevation(0.0);
        pHatch->setPattern(AcDbHatch::kPreDefined, "ANSI31");
        pHatch->setHatchStyle(AcDbHatch::kNormal);
        pHatch->setPatternScale(10);
        pHatch->setPatternAngle(0.0);
    // Set Associativity
    //
    pHatch->setAssociative(Adesk::kFalse);

        Acad::ErrorStatus es=pHatch->appendLoop(AcDbHatch::kExternal, dbObjIds);
    if(es=Acad::eOk)
        {
                acutPrintf("\nappendLoop is ok");
        }
        else
        {
                acutPrintf("\nappendLoop is ERROR,Error No:%d",es);
                pHatch->close();
                return;
        }

    if (pHatch->evaluateHatch()!=Acad::eOk)
        {
                acutPrintf("\nevaluateHatch() is ERROR");
        }
    es=postToDb(pHatch);
        if(es!=Acad::eOk)
        {
                acutPrintf("\npostToDb is ERROR,Error No:%d",acadErrorStatusText(es));
                pHatch->close();
                return;
        }

        pHatch->close();
        int Idlen=dbObjIds.length();
        acutPrintf("\ndbObjIds length:%d",Idlen);
}


剖面线填充的一个关键是:设置顺序问题
修改如下,则通过了:
AcDbHatch* pHatch = new AcDbHatch();
AcGeVector3d normal(0.0, 0.0, 1.0);
pHatch->setNormal(normal);
pHatch->setElevation(0.0);
pHatch->setAssociative(Adesk::kFalse);
pHatch->setPatternScale(2);
pHatch->setPatternAngle(0.0);
pHatch->setPattern(AcDbHatch::kPreDefined, "ANSI31");
pHatch->setHatchStyle(AcDbHatch::kNormal);

pHatch->appendLoop(AcDbHatch::kExternal,dbObjIds);
pHatch->evaluateHatch();
postToDb(pHatch);
pHatch->close();
供大家参考。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-14 14:00 , Processed in 0.223537 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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