找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1103|回复: 19

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

[复制链接]
发表于 2003-8-7 11:04:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
实现对一个矩形区域的剖面线填充:
结果只生成了一个矩形,却没有出现想要得剖面线,哪里出错了呢?
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");

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

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

    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++) {
        line =  new AcDbLine();
        line->setStartPoint(vertexPts);
        line->setEndPoint(vertexPts[(i == 3) ? 0 : i+1]);
        //line->postToDb(line, lineId);
                postToDb(line, lineId);
        dbObjIds.append(lineId);
    }

    // Append an external rectangular loop to hatch boundary
    //
    pHatch->appendLoop(AcDbHatch::kExternal, dbObjIds);

    pHatch->evaluateHatch();
    postToDb(pHatch);
    pHatch->close();

}
void postToDb(AcDbHatch* pHatch)
{
        AcDbBlockTable *pBlockTable=NULL;
    acdbHostApplicationServices()->workingDatabase()
        ->getSymbolTable(pBlockTable, AcDb::kForRead);

    AcDbBlockTableRecord *pBlockTableRecord;
    pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
        AcDb::kForWrite);
    pBlockTable->close();

    AcDbObjectId HatchId;
    pBlockTableRecord->appendAcDbEntity(HatchId, pHatch);

    pBlockTableRecord->close();


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

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-8-7 11:18:32 | 显示全部楼层

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

最初由 ssh 发布
[B]实现对一个矩形区域的剖面线填充:
结果只生成了一个矩形,却没有出现想要得剖面线,哪里出错了呢?
void AsdkMYH()
{
    // TODO: Implement the command
    AcDbHatch* pHatch = new AcDbHatch();

    //... [/B]


填充比例要合适才行,你试试在ACAD里面交互的时候选一个合适的比例,能显示出来后,你修改代码,设置好填充的比例后,再试试。

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

使用道具 举报

 楼主| 发表于 2003-8-7 12:08:25 | 显示全部楼层
填充比例和角度都已根据交互式结果设好,但还是没能画出剖面线。奇怪!还有什么地方是错误呢?请执教
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-8-7 13:35:16 | 显示全部楼层
最初由 ssh 发布
[B]填充比例和角度都已根据交互式结果设好,但还是没能画出剖面线。奇怪!还有什么地方是错误呢?请执教 [/B]


  1. [font=courier]
  2. postToDb(line, lineId);
  3. [/font]
复制代码


这个地方postToDb 你下面定义的参数是添加AcDbHatch 对象,不能添加LINE到数据库,参数应该是AcDbEntity * , 记得添加实体后,一定要CLOSE 对象。

修改下,试试。

而且 postToDb 函数最好有返回值,在主程序里面判断是否成功加如数据库了。这样程序才健壮。

  1. [font=courier]
  2. AcadErrorStatus postToDb(AcDbEntity *& pEnt,AcDbObjectId & objId)
  3. {
  4.     ......
  5.     AcadErrorStatus es=pBlkRec->appendEntity(pEnt,objId);
  6.     return es;
  7. }
  8. [/font]
复制代码


这样你在主程序里面调用:
  1. [font=courier]
  2.   if (postToDb(....)!=Acad::eOk))
  3.   {
  4.        return;
  5.    }
  6.    ......
  7. [/font]
复制代码


或者定义返回值是ObjectId
  1. [font=courier]
  2. AcDbObjectId postToDb(AcDbEntity *& pEnt)
  3. {
  4.     ....
  5.    
  6.     return objId;
  7. }
  8. [/font]
复制代码


主程序里面调用:
  1. [font=courier]

  2. AcDbObjectId mId;
  3. mId=postToDb(pEnt);
  4. if (mId ==AcDb::kNull)
  5. {
  6.     return;
  7. }
  8. ....
  9. [/font]
复制代码

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

使用道具 举报

 楼主| 发表于 2003-8-7 14:32:42 | 显示全部楼层
实际上postToDb是两个函数的,详细的如下面:
void postToDb(AcDbEntity* ent,AcDbObjectId entId)
{
        AcDbEntity* pLine;
        pLine=ent;
        AcDbBlockTable *pBlockTable=NULL;
    acdbHostApplicationServices()->workingDatabase()
        ->getSymbolTable(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();
        entId=lineId;
}
void postToDb(AcDbHatch* pHatch)
{
        AcDbBlockTable *pBlockTable=NULL;
    acdbHostApplicationServices()->workingDatabase()
        ->getSymbolTable(pBlockTable, AcDb::kForRead);

    AcDbBlockTableRecord *pBlockTableRecord;
    pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
        AcDb::kForWrite);
    pBlockTable->close();

    AcDbObjectId HatchId;
    pBlockTableRecord->appendAcDbEntity(HatchId, pHatch);

    pBlockTableRecord->close();
}
直线是可以画出来的,没有问题。就是剖面线部分出不来,但是使用erease删除所有实体是有5个实体被删除。并且最后一个实体就是hatch实体,他的表如下:
((-1 . <图元名: 40069df0>) (0 . "HATCH") (330 . <图元名: 40069cf8>) (5 . "3E")
(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbHatch") (10
0.0 0.0 0.0) (210 0.0 0.0 1.0) (2 . "ANSI31") (70 . 0) (71 . 1) (91 . 0) (75 .
0) (76 . 1) (52 . 0.0) (41 . 0.5) (77 . 0) (78 . 1) (53 . 0.785398) (43 . 0.0)
(44 . 0.0) (45 . -2.24506) (46 . 2.24506) (79 . 0) (98 . 1) (10 0.0 0.0 0.0))
这是怎么回事呢?
手工添加的剖面线表如下:
((-1 . <图元名: 40069e20>) (0 . "HATCH") (330 . <图元名: 40069cf8>) (5 . "44")
(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbHatch") (10
0.0 0.0 0.0) (210 0.0 0.0 1.0) (2 . "ANSI31") (70 . 0) (71 . 1) (91 . 1) (92 .
7) (72 . 0) (73 . 1) (93 . 4) (10 8.0 8.0 0.0) (10 2.0 8.0 0.0) (10 2.0 2.0
0.0) (10 8.0 2.0 0.0) (97 . 4) (330 . <图元名: 40069de0>) (330 . <图元名:
40069de8>) (330 . <图元名: 40069dd0>) (330 . <图元名: 40069dd8>) (75 . 0) (76 .
1) (52 . 0.0) (41 . 0.5) (77 . 0) (78 . 1) (53 . 0.785398) (43 . 0.0) (44 .
0.0) (45 . -1.12253) (46 . 1.12253) (79 . 0) (47 . 0.0221605) (98 . 1) (10
3.70022 6.10229 0.0))
45,46,47表项是不同的。怎么会这样?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-8-7 15:03:21 | 显示全部楼层
最初由 ssh 发布
[B]实际上postToDb是两个函数的,详细的如下面:
void postToDb(AcDbEntity* ent,AcDbObjectId entId)
{
        AcDbEntity* pLine;
        pLine=ent;
        AcDbBlockTable *pBlockTable=NULL;
    acdbHostApplicationServices(... [/B]


1、第一个帖子里面的代码并没有设置比例和角度,你把添加好的,编辑下第一个帖子,修改过来。

2、你设置了HATCH关联,但是你并没有用永久反映器把LOOP和HATCH关联的代码,把他们填上,试试。

下面代码借鉴下:
  1. [font=courier]
  2.                 pattern=pHatch->patternName();
  3.                 AcDbHatch::HatchPatternType type=pHatch->patternType();
  4.                 pHatch->upgradeOpen();
  5.                 if (type==AcDbHatch::kUserDefined)
  6.                         Ret=pHatch->setPatternSpace(scale);
  7.                 else
  8.                         Ret=pHatch->setPatternScale(scale);
  9.                 if (Ret==Acad::eOk){
  10.                         pHatch->setPattern(type,pattern);
  11.                         pHatch->evaluateHatch();
  12.                 }
  13. [/font]
复制代码


上面是设置比例,另外注意pHatch->evaluateHatch();前面一定要加上pHatch->setPattern(type,pattern); 这个是必须的。

下面是添加LOOP同时增加永久反映器的代码,你借鉴下,循环处理你的LINE的数组。

  1. [font=courier]
  2.                 AcDbEntity *pDbPtr;
  3.                 AcDbObjectId pDbPtrId;
  4.                 AcDbObjectIdArray ids1;
  5.                 pHatch->upgradeOpen();
  6.                 for (i=0;i< dbPtr.length();i++){
  7.                         pDbPtr=(AcDbEntity *)dbPtr[i];
  8.                         pDbPtrId=XdDbUtils::appendToDb(pDbPtr);
  9.                         pDbPtr->close();
  10.                         ids1.setLogicalLength(0);
  11.                         ids1.append(pDbPtrId);
  12.                         pHatch->setAssociative(AssociativeFlag);
  13.                         es=pHatch->appendLoop(AcDbHatch::kDefault, ids1);
  14.                         if (AssociativeFlag==Adesk::kTrue) {
  15.                                 if (Acad::eOk==acdbOpenAcDbEntity(pDbPtr,pDbPtrId,AcDb::kForWrite)){
  16.                                         pDbPtr->addPersistentReactor(pHatch->objectId());
  17.                                         pDbPtr->close();
  18.                                 }
  19.                         }
  20.                 }
  21. [/font]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-8-7 16:13:19 | 显示全部楼层
谢谢院长!!!
确实应该形成良好的编程习惯,设置必要的状态返回代码。
经过一番修改,问题出在pHatch->appendLoop(AcDbHatch::kExternal, dbObjIds)上
不能正确的形成loop。
这是什么原因呢?搞不清出了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-8-7 16:17:51 | 显示全部楼层
最初由 ssh 发布
[B]谢谢院长!!!
确实应该形成良好的编程习惯,设置必要的状态返回代码。
经过一番修改,问题出在pHatch->appendLoop(AcDbHatch::kExternal, dbObjIds)上
不能正确的形成loop。
这是什么原因呢?搞不清出了 [/B]



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

使用道具 举报

 楼主| 发表于 2003-8-7 18:41:33 | 显示全部楼层
pHatch->appendLoop(AcDbHatch::kExternal, dbObjIds)不能添加loop.
并且是内部错误,错误码:很长一串。

不能通过能有什么原因呢?
有什么办法检测?并修改呢?
我检查了dbObjIds里面的元素个数是预期的。
请多指导!
谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-8-7 19:29:30 | 显示全部楼层
最初由 ssh 发布
[B]pHatch->appendLoop(AcDbHatch::kExternal, dbObjIds)不能添加loop.

不能通过能有什么原因呢?
有什么办法检测?并修改呢?
我检查了dbObjIds里面的元素个数是预期的。
请多指导!
谢谢! [/B]


没有看到我好几个帖子吗? 请将你修改后的最新代码贴到论坛来。

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

使用道具 举报

 楼主| 发表于 2003-8-7 19:48:17 | 显示全部楼层
修改后的代码:但是appendLoop返回的是O,还是不能添加,哪里出错呢?
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=NULL;
    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++) {
        line =  new AcDbLine();
        line->setStartPoint(vertexPts);
        line->setEndPoint(vertexPts[(i == 3) ? 0 : i+1]);
        //line->postToDb(line, lineId);
                Acad::ErrorStatus es=postToDb(line, lineId);
                if (es==Acad::eOk)
                {
                        acutPrintf("postToDb is ok");
                }
        dbObjIds.append(lineId);
                line->close();
    }
        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");
        }
    postToDb(pHatch);
        pHatch->close();

}
Acad::ErrorStatus postToDb(AcDbEntity* ent,AcDbObjectId entId)
{
        AcDbEntity* pLine;
        if(ent==NULL)
        {
                acutPrintf("\nent is not created");
                return Acad::eOutOfMemory;
        }
        else
                pLine=ent;

        AcDbBlockTable *pBlockTable=NULL;
    Acad::ErrorStatus es=acdbHostApplicationServices()->workingDatabase()
        ->getSymbolTable(pBlockTable, AcDb::kForRead);
        if(es!=Acad::eOk)
        {
                delete pLine;
                return es;
        }

    AcDbBlockTableRecord *pBlockTableRecord;
    es=pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
        AcDb::kForWrite);
        if(es!=Acad::eOk)
        {
                Acad::ErrorStatus es2= pBlockTable->close();
                if (es2!=Acad::eOk)
                {
                        acrx_abort("\napplication close X block table failed,error No:%d",acadErrorStatusText(es2));
                }
                delete pLine;
                return es;

        }
        es=pBlockTable->close();
        if (es!=Acad::eOk)
        {
         acrx_abort("\napplication close X block table failed,error No:%d",acadErrorStatusText(es));

        }

    AcDbObjectId lineId;
    es=pBlockTableRecord->appendAcDbEntity(lineId, pLine);
        if(es!=Acad::eOk)
        {
                Acad::ErrorStatus es2=pBlockTableRecord->close();
                if(es2!=Acad::eOk)
                {
                        acrx_abort("\n应用程序关闭模型空间块表错误,error No:%d",acadErrorStatusText(es2));
                }
                delete pLine;
                return es;
        }

    es=pBlockTableRecord->close();
        if(es!=Acad::eOk)
        {
                acrx_abort("\n应用程序关闭模型空间块表纪录错误,error No:%d",acadErrorStatusText(es));
        }

    es=pLine->close();
        if(es!=Acad::eOk)
        {
                acrx_abort("\n应用程序关闭实体错误,error No:%d",acadErrorStatusText(es));
        }
        entId=lineId;
        return es;
}


//添加剖面线实体
Acad::ErrorStatus postToDb(AcDbHatch* pHatch)
{
        AcDbHatch* pH;
        if(pHatch==NULL)
        {
                acutPrintf("\nent is not created");
                return Acad::eOutOfMemory;
        }
        else
                pH=pHatch;
       
        AcDbBlockTable *pBlockTable=NULL;

    Acad::ErrorStatus es=acdbHostApplicationServices()->workingDatabase()
        ->getSymbolTable(pBlockTable, AcDb::kForRead);
        if(es!=Acad::eOk)
        {
                delete pH;
                return es;
        }


    AcDbBlockTableRecord *pBlockTableRecord;
    es=pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
        AcDb::kForWrite);
        if(es!=Acad::eOk)
        {
                Acad::ErrorStatus es2= pBlockTable->close();
                if (es2!=Acad::eOk)
                {
                        acrx_abort("\napplication close X block table failed,error No:%d",acadErrorStatusText(es2));
                }

                delete pH;
                return es;
        }
    es=pBlockTable->close();
        if (es!=Acad::eOk)
        {
         acrx_abort("\napplication close X block table failed,error No:%d",acadErrorStatusText(es));

        }

    AcDbObjectId HatchId;
    es=pBlockTableRecord->appendAcDbEntity(HatchId, pH);
        if(es!=Acad::eOk)
        {
                Acad::ErrorStatus es2=pBlockTableRecord->close();
                if(es2!=Acad::eOk)
                {
                        acrx_abort("\n应用程序关闭模型空间块表错误,error No:%d",acadErrorStatusText(es2));
                }
                delete pH;
                return es;
        }
    es=pBlockTableRecord->close();
        if(es!=Acad::eOk)
        {
                acrx_abort("\n应用程序关闭模型空间块表纪录错误,error No:%d",acadErrorStatusText(es));
        }

        es=pH->close();
        if(es!=Acad::eOk)
        {
                acrx_abort("\n应用程序关闭实体错误,error No:%d",acadErrorStatusText(es));
        }
   return es;

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-8-7 20:17:45 | 显示全部楼层
最初由 ssh 发布
[B]修改后的代码:但是appendLoop返回的是O,还是不能添加,哪里出错呢?
void AsdkMYH()
{
        // TODO: Implement the command
        AcDbHatch* pHatch = new AcDbHatch();

    // Set hatch plane
    //
    AcGeV... [/B]


上面第六个帖子我已经说了必须在:

if (pHatch->evaluateHatch()!=Acad::eOk)

前面调用 pHatch->setPattern(type,pattern);

type 是类型,pattern是模式名

你还没有加上,修改下,再试试。

另外,你必须保证比例0.5,你手工在ACAD相同的图形交互下也能填充出来,比例设置不对,填充是做不出来的。


下面摘自ARX联机帮助,注意蓝色的文字
  1. [font=courier]
  2. Acad::ErrorStatus

  3. evaluateHatch(

  4. bool bUnderestimateNumLines = false);

  5. bUnderestimateNumLines If true, underestimates the count
  6. before deciding to abort. That is, if AcDbHatch::evaluateHatch
  7. (true) is used, the function will abort if the count is in excess
  8. of 100,000.

  9. This function evaluates the hatch lines or solid fill for the hatch
  10. entity using the specified hatch pattern. For regular hatch
  11. patterns, except for solid, this function performs intersection
  12. calculations between pattern definition lines and hatch
  13. boundary curves to form hatch lines. For a solid fill hatch
  14. pattern, this function performs triangulation of the hatch area
  15. and fills in the triangular meshes with the given color.

  16. This function returns Acad::eOk when successful. Returns Acad::eHatchTooDense if the number of hatch lines is very
  17. high (above 100,000). Otherwise, it returns Acad::eInvalidInput.

  18. [color=blue]Note Be sure to call setPattern() before using this method in
  19. order to update the display.[/color]

  20. [/font]



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

使用道具 举报

 楼主| 发表于 2003-8-7 20:27:35 | 显示全部楼层
谢谢园长!!!
pHatch->evaluateHatch()和pHatch->setPattern必须紧跟使用么?
设置的set部分稍微靠前一点。如下:
// Set hatch pattern to ANSI31 predefined type
//
pHatch->setPattern(AcDbHatch::kPreDefined, "ANSI31");
pHatch->setHatchStyle(AcDbHatch::kNormal);
pHatch->setPatternScale(0.5);
pHatch->setPatternAngle(0.0);
这是关于剖面线部分的一个设定,setPattern设定的应该是正确的。比例也设置了。另外从剖面的列表,对比来看,输出的比例都是(41  . 0.5)所以比例应该是正确的。
不知道为什么还是不能appendLoop了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-8-7 20:32:07 | 显示全部楼层
最初由 ssh 发布
[B]pHatch->evaluateHatch()和pHatch->setPattern必须紧跟使用么?
设置的set部分稍微靠前一点。如下:
// Set hatch pattern to ANSI31 predefined type
//
pHatch->setPattern(AcDbHatch::kPreDefined, "ANSI31")... [/B]


你看看上面我加入的 联机帮助。关于 AcDbHatch::evaluateHatch 的用法。

setPattern 紧跟在evaluateHatch的前面。

你快接近成功了。

另外,你不能在ACAD里面手工画那些线,然后用比例0.5填充下,证实下0.5比例可以正常填充吗?

上面帮助写的很清楚了,填充线不能多于100,000,否则返回Acad::eHatchTooDense, 写程序最好把返回值给打印出来,才能明确错误是什么,才能决定哪些地方是没有问题的。

如果比例正确,没有正确显示,那么就是上面帮助说的了。

Note Be sure to call setPattern() before using this method in
order to update the display

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

使用道具 举报

 楼主| 发表于 2003-8-7 21:21:43 | 显示全部楼层
我已经手工添加了,然后再arx中修改的,还是出问题。
手工添加后的图形如下,通过entget获得的表是:
((-1 . <图元名: 40069e40>) (0 . "HATCH") (330 . <图元名: 40069cf8>) (5 . "48")
(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbHatch") (10
0.0 0.0 0.0) (210 0.0 0.0 1.0) (2 . "ANSI31") (70 . 0) (71 . 1) (91 . 1) (92 .
7) (72 . 0) (73 . 1) (93 . 4) (10 8.0 8.0 0.0) (10 2.0 8.0 0.0) (10 2.0 2.0
0.0) (10 8.0 2.0 0.0) (97 . 4) (330 . <图元名: 40069e08>) (330 . <图元名:
40069e10>) (330 . <图元名: 40069df8>) (330 . <图元名: 40069e00>) (75 . 0) (76 .
1) (52 . 0.0) (41 . 0.5) (77 . 0) (78 . 1) (53 . 0.785398) (43 . 0.0) (44 .
0.0) (45 . -1.12253) (46 . 1.12253) (79 . 0) (47 . 0.0293632) (98 . 1) (10
4.03664 5.57311 0.0))
问题不他可能处在这上面。
通过设置的状态检测,运行是程序输出:appendLoop is ERROR,Error No:0
可见使appendLoop出了问题。
但是该函数需要的参数数组的元素个数确实4个,这是怎么回事,而且添加这四条边的时候是正确的。简直一点办法也没有了!!!
郁闷!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 02:39 , Processed in 0.219464 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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