⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exam04a.cpp

📁 ARX/CAD二次开发
💻 CPP
字号:
#include <rxregsvc.h>
#include <aced.h>

#include <dbidmap.h>
#include <lngtrans.h>
#include <dbltrans.h>

#include <dbmain.h>
#include <dbsymtb.h>
#include <dbents.h>
#include <dbapserv.h>
#include <adslib.h>

void
refEdit()
{

    AcDbObjectId transId;
    AcDbDatabase* pDb;
    char *fname;
    struct resbuf *rb;

    rb = acutNewRb(RTSTR);
    int stat = acedGetFileD("Pick a drawing", NULL, "dwg", 0, rb);
    
    if ((stat != RTNORM) || (rb == NULL)) 
	{
        acutPrintf("\nYou must pick a drawing file.");
        return;
    }

    fname = (char*)acad_malloc(strlen(rb->resval.rstring) + 1);
    strcpy(fname, rb->resval.rstring);
    acutRelRb(rb);
    
    pDb = new AcDbDatabase(Adesk::kFalse);
    if (pDb->readDwgFile(fname) != Acad::eOk) 
	{
        acutPrintf("\nSorry, that draing is probably already open.");
        return;
    }

    AcDbBlockTable *pBlockTable;
    pDb->getSymbolTable(pBlockTable, AcDb::kForRead);
    AcDbBlockTableRecord *pOtherMsBtr;
    pBlockTable->getAt(ACDB_MODEL_SPACE, pOtherMsBtr, AcDb::kForRead);
    pBlockTable->close();

    AcDbBlockTableRecordIterator *pIter;
    pOtherMsBtr->newIterator(pIter);

    AcDbObjectIdArray objIdArray;

    for (pIter->start(); !pIter->done(); pIter->step()) {
        AcDbEntity *pEntity;
        pIter->getEntity(pEntity, AcDb::kForRead);

        if (pEntity->isKindOf(AcDbCircle::desc())) {
            objIdArray.append(pEntity->objectId());
        }
        pEntity->close();
    }
    delete pIter;
    pOtherMsBtr->close();

    if (objIdArray.isEmpty()) {
        acad_free(fname);
        acutPrintf("\nYou must pick a drawing file that contains circles.");
        return;
    }

    AcDbBlockTable *pThisBlockTable;
    acdbHostApplicationServices()->workingDatabase()
        ->getSymbolTable(pThisBlockTable, AcDb::kForRead);

    AcDbBlockTableRecord *pThisMsBtr;
    pThisBlockTable->getAt(ACDB_MODEL_SPACE, pThisMsBtr, AcDb::kForWrite);
    pThisBlockTable->close();
    
    AcDbObjectId id = pThisMsBtr->objectId();
    pThisMsBtr->close();


    AcDbIdMapping errorMap;
    acapLongTransactionManagerPtr()->checkOut(transId, objIdArray, id, errorMap);

    int colorIndex;
	double radius;
    acedGetInt("\nEnter color number to circles center line: ", &colorIndex);
	acedGetReal("\nEnter circle radius: ",&radius);
	if (radius<=0)
	{
		acutPrintf("\nError:Radius can't less than 0!");
		return;
	}
    AcDbObject* pObj;
    if (acdbOpenObject(pObj, transId, AcDb::kForRead) == Acad::eOk) 
	{

        AcDbLongTransaction* pLongTrans = AcDbLongTransaction::cast(pObj);
        if (pLongTrans != NULL) 
		{

            AcDbLongTransWorkSetIterator* pWorkSetIter;
            pLongTrans->newWorkSetIterator(pWorkSetIter);

            for (pWorkSetIter->start(); !pWorkSetIter->done(); pWorkSetIter->step()) 
			{
                AcDbEntity *pEntity;
                acdbOpenAcDbEntity(pEntity, pWorkSetIter->objectId(), AcDb::kForWrite);
			    pEntity->setColorIndex(colorIndex);
				((AcDbCircle*)pEntity)->setRadius(radius);
                pEntity->close();
            }
            delete pWorkSetIter;
        }
        pObj->close();
    }

    char str[132];
    acedGetString(0, "\nSee the new colors and radius. Press return to back", str);

    acapLongTransactionManagerPtr()->checkIn(transId, errorMap);

    pDb->saveAs(fname);

    delete pDb;
    pDb = NULL;

    acad_free(fname);
}

void
initApp()
{

    acedRegCmds->addCommand("EXAM04A", 
		"LONGTRANS", 
		"LONGTRANS", 
		ACRX_CMD_MODAL, 
		refEdit);

}


void unloadApp()
{
    acedRegCmds->removeGroup("EXAM04A");

}

extern "C" AcRx::AppRetCode 
acrxEntryPoint(AcRx::AppMsgCode msg, void* appId)
{
    switch (msg) {
    case AcRx::kInitAppMsg:
        acrxDynamicLinker->unlockApplication(appId);
        acrxDynamicLinker->registerAppMDIAware(appId);
        initApp();
        break;
    case AcRx::kUnloadAppMsg:
        unloadApp();
        break;
    case AcRx::kLoadDwgMsg:

        break;
    case AcRx::kUnloadDwgMsg:

        break;
    case AcRx::kInvkSubrMsg:

        break;
    default:
        ;
    }
    return AcRx::kRetOK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -