发布于:2006-12-31 10:16:31
来自:建筑设计 / CAD下载及教程
[复制转发]
//声明
//插入图块
void insertBlock(const char * strBlockName, AcGePoint3d insertPt,AcGeScale3d xyzScale = AcGeScale3d(1,1,1), double dAngle = 0);
/*****************************************************************************************************
插入图块
参数:
strBlockName : 图块名称
insertPt : 插入基点,默认为(0,0,0)
xyzScale : xyz方向的比例,默认为(1,1,1)
dAngle : 旋转角,默认为0
******************************************************************************************************/
void insertBlock(const char * strBlockName, AcGePoint3d insertPt,AcGeScale3d xyzScale, double dAngle)
{
AcDbBlockTable * pBlockTable;
AcDbBlockTableRecord * pBlockTableRecord;
////////////////////////////////////
//得到指定块的Id
AcDbObjectId blockId;
blockId = getBlockId(strBlockName);
if(!blockId) return;
///////////////////////////////////
//创建块引用对象
AcDbBlockReference * pBlockReference = new AcDbBlockReference;
//设置块引用的图块ID
pBlockReference->setBlockTableRecord(blockId);
//设置块引用的插入点
pBlockReference->setPosition(insertPt);
//设置块引用的旋转角
pBlockReference->setRotation(dAngle);
//设置块引用X、Y、Z方向的比例系数
pBlockReference->setScaleFactors(xyzScale);
//打开当前数据库模型空间的块表记录
//AcDbBlockTable * pBlockTable;
acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);
//AcDbBlockTableRecord * pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
pBlockTable->close();
//将块引用加入当前数据库模型空间的块表记录中
AcDbObjectId entId;
pBlockTableRecord->appendAcDbEntity(entId, pBlockReference);
pBlockTableRecord->close();
pBlockReference->close();
}
全部回复(1 )
只看楼主 我来说两句 抢板凳//我来完整的.
//完整的一份代码
//云帆
BOOL InsertBlk( IN const CString& sBlkFileName,
IN CString sBlkName,
IN AcGePoint3d pos,
IN double dAng,
IN double dScale,
OUT AcDbObjectId& idBlkRef
)
{
if(sBlkName.IsEmpty())
{
char szDrive[MAX_PATH];
char szDir[MAX_PATH];
char szExt[MAX_PATH];
char szBlkName[MAX_PATH];
_splitpath(sBlkFileName, szDrive, szDir, szBlkName, szExt);
sBlkName = szBlkName;
}
if( sBlkFileName.IsEmpty() || sBlkName.IsEmpty() )
{
return FALSE;
}
AcDbBlockTableRecordPointer spBlkRec( sBlkName,acdbHostApplicationServices()->workingDatabase(), AcDb::kForRead );
AcDbObjectId blkRecId;
if( spBlkRec.openStatus() == Acad::eOk )
{
blkRecId = spBlkRec->objectId();
spBlkRec->close();
}
else
{
AcDbDatabase db = AcDbDatabase( Adesk::kFalse );
if( db.readDwgFile( sBlkFileName ) != Acad::eOk )
{
GXBUG("readDrwFile failed");
return FALSE;
}
AcDbBlockTablePointer spBlkTab( acdbHostApplicationServices()->workingDatabase(), AcDb::kForWrite );
if( spBlkTab.openStatus() != Acad::eOk )
{
GXASSERT(0);
return FALSE;
}
AcDbBlockTableRecord* pNewBlkRecord = new AcDbBlockTableRecord;
pNewBlkRecord->setName(sBlkName);
spBlkTab->add(pNewBlkRecord);
pNewBlkRecord->close();
spBlkTab->close();
if ( acdbHostApplicationServices()->workingDatabase()->insert( blkRecId, sBlkName, &db ) != Acad::eOk )
{
GXBUG( " insert error !" );
return FALSE;
}
}
AcDbBlockReference* pBlkRef = new AcDbBlockReference;
pBlkRef->setBlockTableRecord(blkRecId);
pBlkRef->setPosition(pos);
pBlkRef->setScaleFactors(dScale);
AcDbBlockTableRecordPointer spModeSpaceRec( ACDB_MODEL_SPACE,acdbHostApplicationServices()->workingDatabase(),AcDb::kForWrite);
spModeSpaceRec->appendAcDbEntity( idBlkRef, pBlkRef );
pBlkRef->close();
return TRUE;
}
回复 举报