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

求助 :如何制作无名块?

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

hdr_37210427 发表于 2007-3-28 16:18:00

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

hdr_37210427 发表于 2007-3-28 16:21:00

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