土木在线论坛 \ 建筑设计 \ CAD下载及教程 \ [arx]插入图块代码

[arx]插入图块代码

发布于: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();

}
  • biechen
    biechen 沙发
    //这个不完整.如果图块名是个dwg文件,不在当前数据库,是插不进出的.
    //我来完整的.

    //完整的一份代码
    //云帆
    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;
    }
    2006-12-31 10:29:31

    回复 举报
    赞同0
这个家伙什么也没有留下。。。

CAD下载及教程

返回版块

52.09 万条内容 · 682 人订阅

猜你喜欢

阅读下一篇

求《组策略高手完全手册入门至高级完全篇》

请大家帮忙下载《组策略高手完全手册入门至高级完全篇》http://co.163.com/forum/content/213_594190_1.htm

回帖成功

经验值 +10