乐筑天下

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

AcDbHatch填充学习与求教

[复制链接]

63

主题

1203

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1455
发表于 2013-9-26 11:42:00 | 显示全部楼层 |阅读模式
一般的外形用以下填充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);就是采用调 用命令生成填充对象


填充测试文件2007版DWG

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

63

主题

1203

帖子

10

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1455
发表于 2013-9-26 12:11:00 | 显示全部楼层
我对这个测试DWG分析了一上午,发现是因为图形里面有内环造成的。我把内环删除了可以用ARX填充生成。怎么让上面的ARX程序能区分内环还是外环呢?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-5 07:53 , Processed in 0.228393 second(s), 61 queries .

© 2020-2025 乐筑天下

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