admin1 发表于 2024-5-4 10:45:06

ObjectArx块操作封装

得到块定义中的所有实体id(通过块名和数据库指针)//************************************
// Summary:得到块定义中的所有实体id(通过块名和数据库指针)
// Parameter:
//      arrid -    输出块定义中所有实体id集合
//      szBlkTblRcdName -    输入块表记录名(块定义名、块名)(模型空间的名字是:ACDB_MODEL_SPACE)
//      pDb -    输入块定义所在数据库指针
// Return:       
// Update Time: 2021-7-16 16:06:42    peihaodong
//************************************
bool PhdArxBlock::GetAllEntId(AcDbObjectIdArray& arrid, LPCTSTR szBlkTblRcdName, AcDbDatabase* pDb /*= acdbCurDwg()*/) const
{
        AcDbBlockTableRecordPointer pBlkTblRcd(szBlkTblRcdName, pDb, AcDb::kForRead);
        if (pBlkTblRcd.openStatus() != Acad::eOk)
                return false;

        AcDbBlockTableRecordIterator* pBTRIter = NULL;
        Acad::ErrorStatus es = pBlkTblRcd->newIterator(pBTRIter);
        if (Acad::eOk != es)
                return false;
        //绑定智能指针
        std::unique_ptr<AcDbBlockTableRecordIterator> apBTRIter(pBTRIter);

        for (apBTRIter->start(); !apBTRIter->done(); apBTRIter->step())
        {
                AcDbEntity* pTempEnt = NULL;
                es = apBTRIter->getEntity(pTempEnt, AcDb::kForRead);
                if (Acad::eOk != es)
                        continue;
                arrid.append(pTempEnt->objectId());
                pTempEnt->close();
        }

        return true;
}

admin1 发表于 2024-5-4 10:45:22

2、得到块定义中的所有实体id(通过块定义id)//************************************
// Summary:得到块定义中的所有实体id(通过块定义id)
// Parameter:
//      arrid -    输出块定义中所有实体id集合
//      idBlkTblRcd -    输入块表记录id
// Return:       
// Update Time: 2021-7-16 16:08:35    peihaodong
//************************************
bool PhdArxBlock::GetAllEntId(AcDbObjectIdArray& arrid, const AcDbObjectId& idBlkTblRcd) const
{
        AcDbBlockTableRecordPointer pBlkTblRcd(idBlkTblRcd, AcDb::kForRead);
        Acad::ErrorStatus es = pBlkTblRcd.openStatus();
        if (es != Acad::eOk)
                return false;

        AcDbBlockTableRecordIterator* pBTRIter = NULL;
        es = pBlkTblRcd->newIterator(pBTRIter);
        if (Acad::eOk != es)
                return false;
        //绑定智能指针
        std::unique_ptr<AcDbBlockTableRecordIterator> apBTRIter(pBTRIter);

        for (apBTRIter->start(); !apBTRIter->done(); apBTRIter->step())
        {
                AcDbEntity* pTempEnt = NULL;
                es = apBTRIter->getEntity(pTempEnt, AcDb::kForRead);
                if (Acad::eOk != es)
                        continue;
                arrid.append(pTempEnt->objectId());
                pTempEnt->close();
        }

        return true;
}

admin1 发表于 2024-5-4 10:45:36

3、得到块定义id(通过块名和数据库指针)//************************************
// Summary:得到块定义id(通过块名和数据库指针)
// Parameter:
//      idBlkDef -    输出块定义id
//      szBlkName -    输入块名
//      pDb -    输入该块所在的数据库指针
// Return:       
// Update Time: 2021-7-16 16:20:52    peihaodong
//************************************
bool PhdArxBlock::GetBlkDefId(AcDbObjectId& idBlkDef, LPCTSTR szBlkName, AcDbDatabase* pDb /*= acdbCurDwg()*/) const
{
        AcDbBlockTableRecordPointer pBlkTblRec(szBlkName, pDb, AcDb::kForRead);
        if (Acad::eOk != pBlkTblRec.openStatus())
                return false;

        idBlkDef = pBlkTblRec->objectId();
        return true;
}

admin1 发表于 2024-5-4 10:45:50

得到块定义id(通过块参照id)bool PhdArxBlock::GetBlkDefId(AcDbObjectId& idBlkDef, const AcDbObjectId& idBlkRef) const
{
        AcDbObjectPointer<AcDbBlockReference> pRef(idBlkRef, AcDb::kForRead);
        if (Acad::eOk != pRef.openStatus())
                return false;

        idBlkDef = pRef->blockTableRecord();
        return true;
}

admin1 发表于 2024-5-4 10:46:04

得到块定义id(通过图纸、块名和数据库指针;如果数据库中没有该块定义,就从目标图纸中拷贝到指定数据库中)bool PhdArxBlock::GetBlkDefId(AcDbObjectId& idBlkDef, LPCTSTR szDwgPath, LPCTSTR szBlkName, AcDbDatabase* pDb /*= acdbCurDwg()*/) const
{
        AcDbBlockTableRecordPointer pInsertBlkTblRcd(szBlkName, pDb, AcDb::kForRead);
        if (Acad::eOk == pInsertBlkTblRcd.openStatus())
        {
                idBlkDef = pInsertBlkTblRcd->objectId();//当前数据库存在该块,返回该块定义id
                return true;
        }

        //打开图纸
        AcDbDatabase* pDbDwg = new AcDbDatabase(false);
        std::unique_ptr<AcDbDatabase> apDbDwg(pDbDwg);
        //Acad::ErrorStatus es = apDbDwg->readDwgFile(szDwgPath, _SH_DENYNO);//zrx2010
        Acad::ErrorStatus es = apDbDwg->readDwgFile(szDwgPath, AcDbDatabase::kForReadAndAllShare);//arx2017
        if (Acad::eOk != es)
                return false;
       
        //从图纸数据库得到块定义id
        AcDbObjectId idTempBlkDef = AcDbObjectId::kNull;
        if (!GetBlkDefId(idTempBlkDef, szBlkName, apDbDwg.get()))
                return false;

        //将图纸数据库中的块定义拷贝到pDb数据库中
        if (!g_ArxDatabase->DbCopyOfBlock(apDbDwg.get(), idTempBlkDef, pDb, szBlkName, idBlkDef))
                return false;

        return true;
}

admin1 发表于 2024-5-4 10:46:18

、得到所有的块定义名(得到数据库中所有的块名)bool PhdArxBlock::GetAllBlkDefName(AcArray<CString>& arrBlkDefName, AcDbDatabase* pDb /*= acdbCurDwg()*/) const
{
        AcDbBlockTablePointer pBlkTbl(pDb, AcDb::kForRead);
        if (Acad::eOk != pBlkTbl.openStatus())
                return false;
        AcDbBlockTableIterator* pIt = NULL;
        Acad::ErrorStatus es = pBlkTbl->newIterator(pIt);
        if (Acad::eOk != es)
                return false;
        std::unique_ptr<AcDbBlockTableIterator> apIt(pIt);

        for (apIt->start(); !apIt->done(); apIt->step())
        {
                AcDbBlockTableRecord* pBTRecord = NULL;
                if (apIt->getRecord(pBTRecord, AcDb::kForRead) == Acad::eOk)
                {
                        TCHAR* szName = NULL;
                        pBTRecord->getName(szName);
                        CString BlockName = szName;
                        if (_tcslen(szName) > 0)//过滤掉名称为空的块表;
                        {
                                if (BlockName.Find(_T("Model_Space")) == -1 && BlockName.Find(_T("Paper_Space")) == -1)
                                        arrBlkDefName.append(BlockName);
                        }
                        acutDelString(szName);//必须清除动态字符串;
                        pBTRecord->close();
                }
        }

        return true;
}

admin1 发表于 2024-5-4 10:46:34

7、得到所有的块定义id(得到数据库中所有的块定义id)bool PhdArxBlock::GetAllBlkDefId(AcDbObjectIdArray& arridBlkDef, AcDbDatabase* pDb /*= acdbCurDwg()*/) const
{
        AcDbBlockTablePointer pBlkTbl(pDb, AcDb::kForRead);
        if (Acad::eOk != pBlkTbl.openStatus())
                return false;
        AcDbBlockTableIterator* pIt = NULL;
        Acad::ErrorStatus es = pBlkTbl->newIterator(pIt);
        if (Acad::eOk != es)
                return false;
        std::unique_ptr<AcDbBlockTableIterator> apIt(pIt);

        for (apIt->start(); !apIt->done(); apIt->step())
        {
                AcDbBlockTableRecord* pBTRecord = NULL;
                if (apIt->getRecord(pBTRecord, AcDb::kForRead) == Acad::eOk)
                {
                        TCHAR* szName = NULL;
                        pBTRecord->getName(szName);
                        CString BlockName = szName;
                        if (_tcslen(szName) > 0)//过滤掉名称为空的块表;
                        {
                                if (BlockName.Find(_T("Model_Space")) == -1 && BlockName.Find(_T("Paper_Space")) == -1)
                                        arridBlkDef.append(pBTRecord->objectId());
                        }
                        acutDelString(szName);//必须清除动态字符串;
                        pBTRecord->close();
                }
        }

        return true;
}

admin1 发表于 2024-5-4 10:47:57

objectARX 定义块、删除定义块或快参照 1. 如何定义块

2. 根据定义删除块(块参照)

第一步:通过块定义名称找到实体idlist

当前图形数据库-->块表-->检查该块定义是否在块表存在-->存在,则通过定义名称,找到实体idlist

第二步:遍历块表的实体id,若属于某定义块idlist且存在块参照,则设置实体为不透明;

setColorIndex //对于单色OLED,此函数功能为是否显示对象。可以理解为透明还是不透明。对于有灰度值的屏幕则是一个灰度值,此函数功能为设置实体的颜色
1)方法定义

   u8g.setColorIndex(uint8_t color_index)   
2)参数
color_index:
①1:表示显示,不透明

②0:表示不显示,透明。

pBlkTblRcd->newIterator(pIte)遍历

pEnt->isKindOf(AcDbBlockReference::desc())   

::desc() 返回调用该函数的对象类型;

ClassA调用isKindOf(classB) 若ClassA与ClassB一致,或者递归ClassA父类,存在ClassA是ClassB的派生类,则为true

void CArrowsBlock::DeleteBlockRefByBlockName( CString& strBlockName )
{
        AcDbObjectId objId;
        bool bBlock = CArrowsBlock::IsBlock(strBlockName,objId);

        acutPrintf(_T("\n bBlock = %d"),bBlock);

        // 获得当前图形数据库的块表
        AcDbBlockTable *pBlkTbl;
        acdbHostApplicationServices()->workingDatabase() ->getBlockTable(pBlkTbl, AcDb::kForWrite);   

        // 创建新的块表记录
        AcDbBlockTableRecord *pBlkTblRcd = NULL;
        pBlkTbl->getAt(ACDB_MODEL_SPACE,pBlkTblRcd,kForRead);
        pBlkTbl->close();

        AcDbBlockTableRecordIterator *pIte = NULL;
       
        Acad::ErrorStatus es;
        es = pBlkTblRcd->newIterator(pIte);
        AcDbEntity *pEnt = NULL;
        int i = 0;
        for(pIte->start(); !pIte->done(); pIte->step())
        {
                i++;
                acutPrintf(_T("\n i = %d"),i);
                pIte->getEntity(pEnt,AcDb::kForWrite);

                if (pEnt->id() == objId)
                {
                        bool dd = pEnt->isKindOf(AcDbBlockReference::desc());
                        acutPrintf(_T("\n 块参照 = %d"),dd);
                        if (dd)
                        {
                                es = pEnt->setColorIndex(1);
                        }
                }
               
                pEnt->close();
        }
        delete pIte;
        pBlkTblRcd->close();
}

bool CArrowsBlock::IsBlock(const CString& strBlkName,AcDbObjectId& blkDefId)
{
        // 获得块定义名称
        CString strBlkDef = strBlkName;

        // 获得当前数据库的块表
        AcDbBlockTable *pBlkTbl;
        acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForWrite);

        // 查找用户指定的块定义是否存在
        if (!pBlkTbl->has(strBlkDef))
        {
                acutPrintf(_T("\n 当前图形中未包含指定名称的块定义!"));
                pBlkTbl->close();

                return false;
        }
        else
        {
                acutPrintf(_T("\n 当前图形中找到!"));
                // 获得用户指定的块表记录      
                pBlkTbl->getAt(strBlkDef, blkDefId);
                acutPrintf(_T("\n ID = %x!"),blkDefId);
                pBlkTbl->close();
                return true;
        }
}

admin1 发表于 2024-5-4 10:49:14

ObjectARX 得到快参照名称、插入图块//功能:得到快参照名称
CString GetBlkName(AcDbEntity* pEnt);

CString CZzzBlock::GetBlkName(AcDbEntity* pEnt)
{
        CString strBlkName;
        AcDbBlockReference* pBlock = AcDbBlockReference::cast(pEnt);
        AcDbObjectId idBlkDef = pBlock->blockTableRecord();

        AcDbBlockTableRecordPointer pBlkTblRcd(idBlkDef, AcDb::kForRead);
        if (Acad::eOk != pBlkTblRcd.openStatus())
                return strBlkName;
        TCHAR* szName = NULL;
        pBlkTblRcd->getName(szName);
        strBlkName = szName;

        return strBlkName;
}

admin1 发表于 2024-5-4 10:49:30

//功能: 插入图块
AcDbObjectId InsertBlock(LPCTSTR blockName, AcGePoint3d ptInsert, bool bExpolor = false);

AcDbObjectId CZzzBlock::InsertBlock(LPCTSTR blockName, AcGePoint3d ptInsert, bool bExpolor /*= false*/)
{
        AcDbDatabase* pDb = acdbCurDwg();
        AcDbBlockTable* pBlkTable;
        AcDbObjectId blockId;
        pDb->getBlockTable(pBlkTable, AcDb::kForRead);
        if (pBlkTable->has(blockName))
        {
                pBlkTable->getAt(blockName, blockId);
                //ads_point pt;
                //int rc = acedGetPoint(NULL, _T("\n请选择插入点"),pt);
                AcDbBlockReference* pBlkRef = new AcDbBlockReference(ptInsert, blockId);

                //获得模型空间块表记录
                AcDbBlockTable* pBlockTable;
                acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);
                AcDbBlockTableRecord* pBlockTableRecord;
                pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
                pBlockTable->close();
                pBlockTableRecord->appendAcDbEntity(blockId, pBlkRef);
                pBlockTableRecord->close();

                if (bExpolor)
                {
                        pBlkRef->explodeToOwnerSpace();//插入图块时分解块。(必须在添加模型空间块表记录并关闭后再执行)
                }
                pBlkRef->close();
        }
        pBlkTable->close();
        return blockId;
}
页: [1] 2 3
查看完整版本: ObjectArx块操作封装