乐筑天下

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

求助 :如何制作无名块?

[复制链接]

2

主题

7

帖子

1

银币

初来乍到

Rank: 1

铜币
15
发表于 2007-3-27 17:10:00 | 显示全部楼层 |阅读模式
如何制作无名块?块中的实体要保留其属性,如赋有材质的话要保留。
哪位知道的话,望能提供一点原代码,谢谢!!
回复

使用道具 举报

2

主题

7

帖子

1

银币

初来乍到

Rank: 1

铜币
15
发表于 2007-3-28 16:18:00 | 显示全部楼层
此问题已解决,抄出来与大家分享一下。BlockName=“*U”即为无名块,设为其它值即为有名块。
void getUcsToWcsOriginMatrix(AcGeMatrix3d& m,const AcGePoint3d& wcsBasePt, AcDbDatabase* db,double angle)
{
  ASSERT(db != NULL);
  
  AcGeMatrix3d tmpMat;
  
  if (acdbUcsMatrix(tmpMat, db))
  {
    AcGePoint3d origin;
    AcGeVector3d xDir, yDir, zDir;
   
    tmpMat.getCoordSystem(origin, xDir, yDir, zDir);
    origin += wcsBasePt.asVector();
    xDir.rotateBy(angle,zDir);
    yDir.rotateBy(angle,zDir);
   
    m.setToAlignCoordSys(origin, xDir, yDir, zDir,
      AcGePoint3d::kOrigin, AcGeVector3d::kXAxis,
      AcGeVector3d::kYAxis, AcGeVector3d::kZAxis);
  }
  else
  {
    ASSERT(0);
    m = AcGeMatrix3d::kIdentity;
  }
}
Acad::ErrorStatus cloneAndXformObjects(AcDbDatabase* db, AcDbObjectIdArray entsToClone,const AcDbObjectId& ownerBlockId,
                        const AcGeMatrix3d& xformMat)
{
  ASSERT(db != NULL);
  
  AcDbIdMapping idMap;
  Acad::ErrorStatus es = db->deepCloneObjects(
    const_cast(entsToClone),
    const_cast(ownerBlockId), idMap);
  
  if (es != Acad::eOk)
  {
    return es;
  }
  
  AcDbEntity* clonedEnt;
  AcDbIdPair idPair;
  AcDbIdMappingIter iter(idMap);
  for (iter.start(); !iter.done(); iter.next())
  {
    if (!iter.getMap(idPair)) return Acad::eInvalidInput;
   
    if (idPair.isCloned())
    {
      es = acdbOpenAcDbEntity(clonedEnt, idPair.value(), AcDb::kForWrite);
      if (es == Acad::eOk)
      {
        if (idPair.isPrimary())
        {
          clonedEnt->transformBy(xformMat);
        }
        clonedEnt->close();
      }
    }
  }
  return Acad::eOk;
}
Acad::ErrorStatus defineNewAnonymousBlock(AcDbBlockTableRecord*& newBlkRec,AcDbObjectId& newBlkRecId, AcDbDatabase* db)
{
ASSERT(db != NULL);
  AcDbBlockTable* blkTbl;
  Acad::ErrorStatus es = db->getSymbolTable(blkTbl, AcDb::kForWrite);
  if (es != Acad::eOk) return es;
  
  newBlkRec = new AcDbBlockTableRecord;
  newBlkRec->setPathName("");
  
  es = newBlkRec->setName(_T("*U"));
  if (es == Acad::eOk) es = blkTbl->add(newBlkRecId, newBlkRec);
  
  if (es != Acad::eOk)
  {
    delete newBlkRec;
    newBlkRec = NULL;
  }  
  blkTbl->close();
  
  return es;
}
AcDbObjectId fdm_MakeBlock(CString BlockName,AcDbObjectIdArray EntIdArray,const AcGePoint3d &BasePt,double angle,const AcGeScale3d &scale)
{
  AcDbObjectId newBlkRecId;
  AcDbBlockTableRecord* newBlkRec;
  if (defineNewAnonymousBlock(newBlkRec, newBlkRecId, acdbHostApplicationServices()->workingDatabase()) == Acad::eOk)
  {
    newBlkRec->setName(BlockName);
    newBlkRec->setOrigin(AcGePoint3d::kOrigin);
    newBlkRec->close();
    AcGeMatrix3d matrix;
    getUcsToWcsOriginMatrix(matrix,BasePt,acdbCurDwg(),angle);
    if (cloneAndXformObjects(acdbHostApplicationServices()->workingDatabase(), EntIdArray, newBlkRecId, matrix) == Acad::eOk)
    {
      AcDbObjectId ReferenceId=AcDbObjectId::kNull;
      AcDbBlockReference *pReference=new AcDbBlockReference;
      pReference->setBlockTableRecord(newBlkRecId);
      pReference->setPosition(BasePt);
      pReference->setRotation(angle);
      pReference->setScaleFactors(scale);
      if(fdm_addToModelSpace(ReferenceId,pReference)==Acad::eOk)
      {
        EraseEntity(EntIdArray);
        pReference->close();
        return ReferenceId;
      }
    }
  }
  
  return AcDbObjectId::kNull;
}
回复

使用道具 举报

2

主题

7

帖子

1

银币

初来乍到

Rank: 1

铜币
15
发表于 2007-3-28 16:21:00 | 显示全部楼层
此问题已解决,抄出来与大家一起分享。 BlockName设为"*U"为无名块,设为其它值为有名块。
void getUcsToWcsOriginMatrix(AcGeMatrix3d& m,const AcGePoint3d& wcsBasePt, AcDbDatabase* db,double angle)
{
  ASSERT(db != NULL);
  
  AcGeMatrix3d tmpMat;
  
  if (acdbUcsMatrix(tmpMat, db))
  {
    AcGePoint3d origin;
    AcGeVector3d xDir, yDir, zDir;
   
    tmpMat.getCoordSystem(origin, xDir, yDir, zDir);
    origin += wcsBasePt.asVector();
    xDir.rotateBy(angle,zDir);
    yDir.rotateBy(angle,zDir);
   
    m.setToAlignCoordSys(origin, xDir, yDir, zDir,
      AcGePoint3d::kOrigin, AcGeVector3d::kXAxis,
      AcGeVector3d::kYAxis, AcGeVector3d::kZAxis);
  }
  else
  {
    ASSERT(0);
    m = AcGeMatrix3d::kIdentity;
  }
}
Acad::ErrorStatus cloneAndXformObjects(AcDbDatabase* db, AcDbObjectIdArray entsToClone,const AcDbObjectId& ownerBlockId,
                        const AcGeMatrix3d& xformMat)
{
  ASSERT(db != NULL);
  
  AcDbIdMapping idMap;
  Acad::ErrorStatus es = db->deepCloneObjects(
    const_cast(entsToClone),
    const_cast(ownerBlockId), idMap);
  
  if (es != Acad::eOk)
  {
    return es;
  }
  
  AcDbEntity* clonedEnt;
  AcDbIdPair idPair;
  AcDbIdMappingIter iter(idMap);
  for (iter.start(); !iter.done(); iter.next())
  {
    if (!iter.getMap(idPair)) return Acad::eInvalidInput;
   
    if (idPair.isCloned())
    {
      es = acdbOpenAcDbEntity(clonedEnt, idPair.value(), AcDb::kForWrite);
      if (es == Acad::eOk)
      {
        if (idPair.isPrimary())
        {
          clonedEnt->transformBy(xformMat);
        }
        clonedEnt->close();
      }
    }
  }
  return Acad::eOk;
}
Acad::ErrorStatus defineNewAnonymousBlock(AcDbBlockTableRecord*& newBlkRec,AcDbObjectId& newBlkRecId, AcDbDatabase* db)
{
ASSERT(db != NULL);
  AcDbBlockTable* blkTbl;
  Acad::ErrorStatus es = db->getSymbolTable(blkTbl, AcDb::kForWrite);
  if (es != Acad::eOk) return es;
  
  newBlkRec = new AcDbBlockTableRecord;
  newBlkRec->setPathName("");
  
  es = newBlkRec->setName(_T("*U"));
  if (es == Acad::eOk) es = blkTbl->add(newBlkRecId, newBlkRec);
  
  if (es != Acad::eOk)
  {
    delete newBlkRec;
    newBlkRec = NULL;
  }  
  blkTbl->close();
  
  return es;
}
AcDbObjectId fdm_MakeBlock(CString BlockName,AcDbObjectIdArray EntIdArray,const AcGePoint3d &BasePt,double angle,const AcGeScale3d &scale)
{
  AcDbObjectId newBlkRecId;
  AcDbBlockTableRecord* newBlkRec;
  if (defineNewAnonymousBlock(newBlkRec, newBlkRecId, acdbHostApplicationServices()->workingDatabase()) == Acad::eOk)
  {
    newBlkRec->setName(BlockName);
    newBlkRec->setOrigin(AcGePoint3d::kOrigin);
    newBlkRec->close();
    AcGeMatrix3d matrix;
    getUcsToWcsOriginMatrix(matrix,BasePt,acdbCurDwg(),angle);
    if (cloneAndXformObjects(acdbHostApplicationServices()->workingDatabase(), EntIdArray, newBlkRecId, matrix) == Acad::eOk)
    {
      AcDbObjectId ReferenceId=AcDbObjectId::kNull;
      AcDbBlockReference *pReference=new AcDbBlockReference;
      pReference->setBlockTableRecord(newBlkRecId);
      pReference->setPosition(BasePt);
      pReference->setRotation(angle);
      pReference->setScaleFactors(scale);
      if(fdm_addToModelSpace(ReferenceId,pReference)==Acad::eOk)
      {
        EraseEntity(EntIdArray);
        pReference->close();
        return ReferenceId;
      }
    }
  }
  
  return AcDbObjectId::kNull;
}
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-6 00:54 , Processed in 0.266003 second(s), 58 queries .

© 2020-2025 乐筑天下

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