求助 :如何制作无名块?
<p>如何制作无名块?块中的实体要保留其属性,如赋有材质的话要保留。</p><p>哪位知道的话,望能提供一点原代码,谢谢!!</p> <p>此问题已解决,抄出来与大家分享一下。BlockName=“*U”即为无名块,设为其它值即为有名块。</p><p>void getUcsToWcsOriginMatrix(AcGeMatrix3d& m,const AcGePoint3d& wcsBasePt, AcDbDatabase* db,double angle)<br/>{<br/> ASSERT(db != NULL);<br/> <br/> AcGeMatrix3d tmpMat;<br/> <br/> if (acdbUcsMatrix(tmpMat, db))<br/> {<br/> AcGePoint3d origin;<br/> AcGeVector3d xDir, yDir, zDir;<br/> <br/> tmpMat.getCoordSystem(origin, xDir, yDir, zDir);<br/> origin += wcsBasePt.asVector();<br/> xDir.rotateBy(angle,zDir);<br/> yDir.rotateBy(angle,zDir);<br/> <br/> m.setToAlignCoordSys(origin, xDir, yDir, zDir,<br/> AcGePoint3d::kOrigin, AcGeVector3d::kXAxis,<br/> AcGeVector3d::kYAxis, AcGeVector3d::kZAxis);<br/> }<br/> else <br/> {<br/> ASSERT(0);<br/> m = AcGeMatrix3d::kIdentity;<br/> }<br/>}</p><p>Acad::ErrorStatus cloneAndXformObjects(AcDbDatabase* db, AcDbObjectIdArray entsToClone,const AcDbObjectId& ownerBlockId,<br/> const AcGeMatrix3d& xformMat)<br/>{<br/> ASSERT(db != NULL);<br/> <br/> AcDbIdMapping idMap;<br/> Acad::ErrorStatus es = db->deepCloneObjects(<br/> const_cast<AcDbObjectIdArray&>(entsToClone),<br/> const_cast<AcDbObjectId&>(ownerBlockId), idMap);<br/> <br/> if (es != Acad::eOk)<br/> {<br/> return es;<br/> }<br/> <br/> AcDbEntity* clonedEnt;<br/> AcDbIdPair idPair;<br/> AcDbIdMappingIter iter(idMap);<br/> for (iter.start(); !iter.done(); iter.next())<br/> {<br/> if (!iter.getMap(idPair)) return Acad::eInvalidInput;<br/> <br/> if (idPair.isCloned())<br/> {<br/> es = acdbOpenAcDbEntity(clonedEnt, idPair.value(), AcDb::kForWrite);<br/> if (es == Acad::eOk)<br/> {<br/> if (idPair.isPrimary())<br/> {<br/> clonedEnt->transformBy(xformMat);<br/> }<br/> clonedEnt->close();<br/> }<br/> }<br/> }</p><p> return Acad::eOk;<br/>}</p><p>Acad::ErrorStatus defineNewAnonymousBlock(AcDbBlockTableRecord*& newBlkRec,AcDbObjectId& newBlkRecId, AcDbDatabase* db)<br/>{<br/> ASSERT(db != NULL);</p><p> AcDbBlockTable* blkTbl;<br/> Acad::ErrorStatus es = db->getSymbolTable(blkTbl, AcDb::kForWrite);<br/> if (es != Acad::eOk) return es;<br/> <br/> newBlkRec = new AcDbBlockTableRecord;<br/> newBlkRec->setPathName("");<br/> <br/> es = newBlkRec->setName(_T("*U"));<br/> if (es == Acad::eOk) es = blkTbl->add(newBlkRecId, newBlkRec);<br/> <br/> if (es != Acad::eOk)<br/> {<br/> delete newBlkRec;<br/> newBlkRec = NULL;<br/> } <br/> blkTbl->close();<br/> <br/> return es;<br/>}</p><p>AcDbObjectId fdm_MakeBlock(CString BlockName,AcDbObjectIdArray EntIdArray,const AcGePoint3d &BasePt,double angle,const AcGeScale3d &scale)<br/>{<br/> AcDbObjectId newBlkRecId;<br/> AcDbBlockTableRecord* newBlkRec;<br/> if (defineNewAnonymousBlock(newBlkRec, newBlkRecId, acdbHostApplicationServices()->workingDatabase()) == Acad::eOk)<br/> {<br/> newBlkRec->setName(BlockName);<br/> newBlkRec->setOrigin(AcGePoint3d::kOrigin);<br/> newBlkRec->close();<br/> AcGeMatrix3d matrix;</p><p> getUcsToWcsOriginMatrix(matrix,BasePt,acdbCurDwg(),angle);<br/> if (cloneAndXformObjects(acdbHostApplicationServices()->workingDatabase(), EntIdArray, newBlkRecId, matrix) == Acad::eOk)<br/> {<br/> AcDbObjectId ReferenceId=AcDbObjectId::kNull;<br/> AcDbBlockReference *pReference=new AcDbBlockReference;<br/> pReference->setBlockTableRecord(newBlkRecId);<br/> pReference->setPosition(BasePt);<br/> pReference->setRotation(angle);<br/> pReference->setScaleFactors(scale);<br/> if(fdm_addToModelSpace(ReferenceId,pReference)==Acad::eOk)<br/> {<br/> EraseEntity(EntIdArray);<br/> pReference->close();<br/> return ReferenceId;<br/> }<br/> }<br/> }<br/> <br/> return AcDbObjectId::kNull;<br/>}</p> <p>此问题已解决,抄出来与大家一起分享。 BlockName设为"*U"为无名块,设为其它值为有名块。</p><p>void getUcsToWcsOriginMatrix(AcGeMatrix3d& m,const AcGePoint3d& wcsBasePt, AcDbDatabase* db,double angle)<br/>{<br/> ASSERT(db != NULL);<br/> <br/> AcGeMatrix3d tmpMat;<br/> <br/> if (acdbUcsMatrix(tmpMat, db))<br/> {<br/> AcGePoint3d origin;<br/> AcGeVector3d xDir, yDir, zDir;<br/> <br/> tmpMat.getCoordSystem(origin, xDir, yDir, zDir);<br/> origin += wcsBasePt.asVector();<br/> xDir.rotateBy(angle,zDir);<br/> yDir.rotateBy(angle,zDir);<br/> <br/> m.setToAlignCoordSys(origin, xDir, yDir, zDir,<br/> AcGePoint3d::kOrigin, AcGeVector3d::kXAxis,<br/> AcGeVector3d::kYAxis, AcGeVector3d::kZAxis);<br/> }<br/> else <br/> {<br/> ASSERT(0);<br/> m = AcGeMatrix3d::kIdentity;<br/> }<br/>}</p><p>Acad::ErrorStatus cloneAndXformObjects(AcDbDatabase* db, AcDbObjectIdArray entsToClone,const AcDbObjectId& ownerBlockId,<br/> const AcGeMatrix3d& xformMat)<br/>{<br/> ASSERT(db != NULL);<br/> <br/> AcDbIdMapping idMap;<br/> Acad::ErrorStatus es = db->deepCloneObjects(<br/> const_cast<AcDbObjectIdArray&>(entsToClone),<br/> const_cast<AcDbObjectId&>(ownerBlockId), idMap);<br/> <br/> if (es != Acad::eOk)<br/> {<br/> return es;<br/> }<br/> <br/> AcDbEntity* clonedEnt;<br/> AcDbIdPair idPair;<br/> AcDbIdMappingIter iter(idMap);<br/> for (iter.start(); !iter.done(); iter.next())<br/> {<br/> if (!iter.getMap(idPair)) return Acad::eInvalidInput;<br/> <br/> if (idPair.isCloned())<br/> {<br/> es = acdbOpenAcDbEntity(clonedEnt, idPair.value(), AcDb::kForWrite);<br/> if (es == Acad::eOk)<br/> {<br/> if (idPair.isPrimary())<br/> {<br/> clonedEnt->transformBy(xformMat);<br/> }<br/> clonedEnt->close();<br/> }<br/> }<br/> }</p><p> return Acad::eOk;<br/>}</p><p>Acad::ErrorStatus defineNewAnonymousBlock(AcDbBlockTableRecord*& newBlkRec,AcDbObjectId& newBlkRecId, AcDbDatabase* db)<br/>{<br/> ASSERT(db != NULL);</p><p> AcDbBlockTable* blkTbl;<br/> Acad::ErrorStatus es = db->getSymbolTable(blkTbl, AcDb::kForWrite);<br/> if (es != Acad::eOk) return es;<br/> <br/> newBlkRec = new AcDbBlockTableRecord;<br/> newBlkRec->setPathName("");<br/> <br/> es = newBlkRec->setName(_T("*U"));<br/> if (es == Acad::eOk) es = blkTbl->add(newBlkRecId, newBlkRec);<br/> <br/> if (es != Acad::eOk)<br/> {<br/> delete newBlkRec;<br/> newBlkRec = NULL;<br/> } <br/> blkTbl->close();<br/> <br/> return es;<br/>}</p><p>AcDbObjectId fdm_MakeBlock(CString BlockName,AcDbObjectIdArray EntIdArray,const AcGePoint3d &BasePt,double angle,const AcGeScale3d &scale)<br/>{<br/> AcDbObjectId newBlkRecId;<br/> AcDbBlockTableRecord* newBlkRec;<br/> if (defineNewAnonymousBlock(newBlkRec, newBlkRecId, acdbHostApplicationServices()->workingDatabase()) == Acad::eOk)<br/> {<br/> newBlkRec->setName(BlockName);<br/> newBlkRec->setOrigin(AcGePoint3d::kOrigin);<br/> newBlkRec->close();<br/> AcGeMatrix3d matrix;</p><p> getUcsToWcsOriginMatrix(matrix,BasePt,acdbCurDwg(),angle);<br/> if (cloneAndXformObjects(acdbHostApplicationServices()->workingDatabase(), EntIdArray, newBlkRecId, matrix) == Acad::eOk)<br/> {<br/> AcDbObjectId ReferenceId=AcDbObjectId::kNull;<br/> AcDbBlockReference *pReference=new AcDbBlockReference;<br/> pReference->setBlockTableRecord(newBlkRecId);<br/> pReference->setPosition(BasePt);<br/> pReference->setRotation(angle);<br/> pReference->setScaleFactors(scale);<br/> if(fdm_addToModelSpace(ReferenceId,pReference)==Acad::eOk)<br/> {<br/> EraseEntity(EntIdArray);<br/> pReference->close();<br/> return ReferenceId;<br/> }<br/> }<br/> }<br/> <br/> return AcDbObjectId::kNull;<br/>}</p>
页:
[1]