明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2020|回复: 1

AcDbHatch填充学习与求教

[复制链接]
发表于 2013-9-26 11:42:48 | 显示全部楼层 |阅读模式
一般的外形用以下填充ARX程序可以成功看到填充出来的对象,但是我这个DWG上面的图用ARX填充看不到填充出来的实体。不知是哪里不对? 但是调用命令来填充时却可以。实在弄不懂,所以在这里请教一下咱们明经大侠了。
代码如下:

填充涵数代码:
AcDbObjectId CreateHatch(AcDbObjectIdArray InIDList,bool CommandmodelPD/*=FALSE*/,ACHAR *cLayer/*[MAX_PATH]*//*="0"*/, ACHAR *cPattern/*[MAX_PATH]*//* = "SOLID"*/, int nColor/* = 256*/, double dAngle/* = 0.0*/, double dScale/* = 1.0*/)
{
AcDbObjectId DbOId,ObjID;
DbOId.setNull();
if (InIDList.length()==0)
{
  return DbOId;
}
if (CommandmodelPD==FALSE)
{
  AcCmColor CmC;
  AcDbObjectIdArray DbOIdA ;
  AcDbBlockTable * pDbBT;
  AcDbBlockTableRecord * pDbBTR;
  AcDbDatabase * pDbDatab = acdbHostApplicationServices()->workingDatabase();
  AcGeVector3d normal(0.0, 0.0, 1.0);
  DbOIdA=NULL;
  for (int i=0;InIDList.length()>i;i++)
  {
   ObjID=InIDList.at(i);
   if (ObjID.isErased()==TRUE)continue;
   DbOIdA.append(ObjID);
  }
  AcDbHatch* pDbHat = new AcDbHatch();
  pDbHat->setDatabaseDefaults();
  pDbHat->setAssociative(Adesk::kTrue); //False填充线边界与填充不关连、TRUE填充边界线与填充对象关连,关连时,改边界线,填充跟随修改// BUG: doesn't do squat! have to set the reactor yourself to get associativity!
  pDbHat->appendLoop(AcDbHatch::kExternal, DbOIdA);//添加外环边界实体,内环边界实体是AcDbHatch::kDefault
  pDbHat->setPatternScale(dScale);//填充图的比例,控制图案的疏密程度
  pDbHat->setPatternAngle(dAngle);//填充图的角度,控制图案的疏密程度
  pDbHat->setPattern(AcDbHatch::kPreDefined, cPattern);
  pDbHat->setNormal(normal);//填充区域的法向矢量设置
  pDbHat->evaluateHatch(); //合成剖面线 crucial call or nothing gets displayed!
  pDbDatab->getSymbolTable(pDbBT, AcDb::kForRead);
  pDbBT->getAt(ACDB_MODEL_SPACE, pDbBTR, AcDb::kForWrite);
  pDbBTR->appendAcDbEntity(DbOId, pDbHat);
  pDbHat->setLayer(cLayer);
  CmC.setColorIndex(nColor);
  ((AcDbEntity *)pDbHat)->setColor(CmC);
  pDbBT->close();
  pDbBTR->close();
  pDbHat->close();
}else if (CommandmodelPD==TRUE)
{
  ads_name Ename,SS;
  acedSSAdd(NULL,NULL,SS);
  for(int i=0;InIDList.length()>i;i++){
   acdbGetAdsName(Ename,InIDList.at(i));
   acedSSAdd(Ename,SS,SS);
  }
  acdbEntLast(Ename);
  acdbGetObjectId(ObjID,Ename);
  if (acedCommand(RTSTR,_T("-hatch"),RTSTR,_T("s"),RTPICKS,SS,RTSTR,_T(""),RTSTR,_T(""),0)==RTNORM)
  {
   acdbEntLast(Ename);
   acdbGetObjectId(DbOId,Ename);
   if (DbOId==ObjID)
   {
    DbOId.setNull();
   }
  }
  acedSSFree(Ename);
  acedSSFree(SS);
}
return DbOId;
}

测试代码:
ads_name Ename,SS;
  ads_point p1;
  AcDbObjectId Objid;
  AcDbObjectIdArray IDList;
  AcDbEntity *pEnt = NULL;
  if (acedSSGet(NULL,NULL,NULL,NULL,SS)!=RTNORM)return;
  long SSLen;
  acedSSLength(SS,&SSLen);
  for (int i=0;SSLen>i;i++)
  {
   acedSSName(SS,i,Ename);
   acdbGetObjectId(Objid,Ename);
   IDList.append(Objid);
  }
CreateHatch(IDList);///第二个参数默认方式为FALSE说明使用ARX直接生成填充,如果为CreateHatch(IDList,TRUE);就是采用调 用命令生成填充对象

本帖子中包含更多资源

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

x
 楼主| 发表于 2013-9-26 12:11:37 | 显示全部楼层
我对这个测试DWG分析了一上午,发现是因为图形里面有内环造成的。我把内环删除了可以用ARX填充生成。怎么让上面的ARX程序能区分内环还是外环呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-29 00:56 , Processed in 0.155569 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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