实体反应器的用法

#i nclude "dbapserv.h"
#i nclude 
"dbents.h"
#i nclude 
"accmd.h"


// 下面这个例子为直线A添加一个反应器,并且关联到标注,当A有变化时,标注也会随之变化
void addToModelSpace(AcDbObjectId &objId, AcDbEntity* pEntity);

// AsdkObjectToNotify - 反应器对象
class AsdkObjectToNotify : public AcDbObject
{
public:
    ACRX_DECLARE_MEMBERS(AsdkObjectToNotify);
    AsdkObjectToNotify() 
{};
    
void eLinkage(AcDbObjectId i) {mId=i;}
    
void              modified(const AcDbObject*);
    Acad::ErrorStatus dwgInFields(AcDbDwgFiler
*);
    Acad::ErrorStatus dwgOutFields(AcDbDwgFiler
*const;
    Acad::ErrorStatus dxfInFields(AcDbDxfFiler
*);
    Acad::ErrorStatus dxfOutFields(AcDbDxfFiler
*const;
private:
    AcDbObjectId mId;
}
;

ACRX_DXF_DEFINE_MEMBERS(AsdkObjectToNotify, AcDbObject, 
    AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, 
    
0, ASDKOBJECTTONOTIFY, persreac);


// 每次直线实体变化时会通知反应器,就会调用反应器的这个函数.  
// 调用时,传入的是修改的那个直线指针,在这个函数里对你的要起反应的直线修改
// 
void AsdkObjectToNotify::modified(const AcDbObject* pObj)
{
    AcDbLine 
*pLine = AcDbLine::cast(pObj);
    
if (pLine == NULL) 
 
{
        
const char* cstr = pObj->isA()->name();
        acutPrintf(
"这是一个 %s实体。 ", cstr);
        acutPrintf(
"我只能处理直线。 ");
        
return;
    }

    acutPrintf(
" 直线 %lx的反应器在修改标注 %lx。 ", pLine->objectId(), mId);

    AcDbAlignedDimension 
*pDim;
    
if (acdbOpenObject((AcDbObject*&)pDim, mId, AcDb::kForWrite) == Acad::eOk)
    
{
  
// 修改标注
  pDim->setXLine1Point(pLine->startPoint());
  pDim
->setXLine2Point(pLine->endPoint());
  pDim
->close();
    }

}



// 反应器导入函数
Acad::ErrorStatus
AsdkObjectToNotify::dwgInFields(AcDbDwgFiler
* filer)
{
    assertWriteEnabled();
    AcDbObject::dwgInFields(filer);
    filer
->readItem((AcDbSoftPointerId*&mId);
    
return filer->filerStatus();
}



// 反应器导出
Acad::ErrorStatus
AsdkObjectToNotify::dwgOutFields(AcDbDwgFiler
* filer) const
{
    assertReadEnabled();
    AcDbObject::dwgOutFields(filer);
    filer
->writeItem((AcDbSoftPointerId&)mId);
    
return filer->filerStatus();
}



// dxf函数
Acad::ErrorStatus
AsdkObjectToNotify::dxfInFields(AcDbDxfFiler
* filer)
{
    assertWriteEnabled();
    Acad::ErrorStatus es;
    
if ((es = AcDbObject::dxfInFields(filer)) != Acad::eOk)
    
{
        
return es;
    }


    
if(!filer->atSubclassData("AsdkObjectToNotify")) 
 
{
        
return Acad::eBadDxfSequence;
    }


    
struct resbuf rbIn;
    
while (es == Acad::eOk) 
 
{
        
if ((es = filer->readItem(&rbIn)) == Acad::eOk) {
   
if (rbIn.restype == AcDb::kDxfSoftPointerId)
            
{
                
// ObjectIds are filed in as ads_names.
                 acdbGetObjectId(mId, rbIn.resval.rlname);
            }
 
   
else 
   
{   // invalid group
                return(filer->pushBackItem());
            }

        }

    }

    
return filer->filerStatus();
}



// dxf函数
Acad::ErrorStatus
AsdkObjectToNotify::dxfOutFields(AcDbDxfFiler
* filer) const
{
    assertReadEnabled();
    AcDbObject::dxfOutFields(filer);
    filer
->writeItem(AcDb::kDxfSubclass, "AsdkObjectToNotify");
    filer
->writeItem(AcDb::kDxfSoftPointerId, mId);
    
return filer->filerStatus();
}



// 创建一条线和一个标注,并让他们互相关联起来(通过反应器)
void
assocLines()
{
    AcDbDatabase 
*pDb = acdbHostApplicationServices()->workingDatabase();
    AcDbObjectId aId, dimId;
    AcDbLine 
*pLineA = new AcDbLine;
    pLineA
->setDatabaseDefaults(pDb);
    pLineA
->setStartPoint(AcGePoint3d(110));
    pLineA
->setEndPoint(AcGePoint3d(210));
    addToModelSpace(aId, pLineA);
    acutPrintf( 
"Line A is %lx from 1,1 to 2,1. ", pLineA->objectId());

 AcDbAlignedDimension 
*pDim = new AcDbAlignedDimension(
  AcGePoint3d(
1100),
  AcGePoint3d(
2100),
  AcGePoint3d(
1100),
  NULL,
  AcDbObjectId::kNull);
 addToModelSpace(dimId, pDim);
 pDim
->close();

    
// 打开命名对象词典, 并且检查是否有条目“ASDK_DICT”存在
    
// 如果没有,创建一个字典,并且添加到命名对象字典中
    
// 
    AcDbDictionary *pNamedObj = NULL;
    AcDbDictionary 
*pNameList = NULL;
    pDb
->getNamedObjectsDictionary(pNamedObj, AcDb::kForWrite);

    
if (pNamedObj->getAt("ASDK_DICT", (AcDbObject*&)pNameList, AcDb::kForWrite) == Acad::eKeyNotFound)
    
{
        pNameList 
= new AcDbDictionary;
        AcDbObjectId DictId;
        pNamedObj
->setAt("ASDK_DICT", pNameList, DictId);
    }

    pNamedObj
->close();

    
// 为直线A创建反应器
    AsdkObjectToNotify *pObj = new AsdkObjectToNotify();
    pObj
->eLinkage(dimId); // 把标注的ID存入反应器,以便在A被修改时,能修改标注

    AcDbObjectId objId;
    
if ((pNameList->getAt("object_to_notify_A", objId)) == Acad::eKeyNotFound)
    
{
        pNameList
->setAt("object_to_notify_A", pObj, objId);
        pObj
->close();
    }
 else {
        delete pObj;
        acutPrintf(
"object_to_notify_A already exists ");
    }


    
// 为直线A添加永久反应器
    pLineA->addPersistentReactor(objId);
    pLineA
->close();
    pNameList
->close();
}


// 添加一个实体到模型空间
void
addToModelSpace(AcDbObjectId 
&objId, AcDbEntity* pEntity)
{
    AcDbBlockTable 
*pBlockTable;
    AcDbBlockTableRecord 
*pSpaceRecord;
    acdbHostApplicationServices()
->workingDatabase()
        
->getSymbolTable(pBlockTable, AcDb::kForRead);
    pBlockTable
->getAt(ACDB_MODEL_SPACE, pSpaceRecord, AcDb::kForWrite);
    pBlockTable
->close();
    pSpaceRecord
->appendAcDbEntity(objId, pEntity);
    pSpaceRecord
->close();
    
return;
}


// 初始化应用程序
void initApp()
{
    acedRegCmds
->addCommand("ASDK_ALINES""ASDK_ALINES",
        
"ALINES", ACRX_CMD_MODAL, assocLines);
    AsdkObjectToNotify::rxInit();
    acrxBuildClassHierarchy();
}


void unloadApp()
{
    acedRegCmds
->removeGroup("ASDK_ALINES");
    
// 删除自定义反应器
    deleteAcRxClass(AsdkObjectToNotify::desc());
}


// 入口函数
//
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();
    }

    
return AcRx::kRetOK;
}


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值