hdr_37210427 发表于 2007-3-27 17:10:00

求助 :如何制作无名块?

如何制作无名块?块中的实体要保留其属性,如赋有材质的话要保留。
哪位知道的话,望能提供一点原代码,谢谢!!

hdr_37210427 发表于 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;
}

hdr_37210427 发表于 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;
}
页: [1]
查看完整版本: 求助 :如何制作无名块?