- UID
- 5043
- 积分
- 1347
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-5-13
- 最后登录
- 1970-1-1
|
发表于 2016-9-18 17:42:53
|
显示全部楼层
本帖最后由 LoveArx 于 2016-9-18 17:44 编辑
手里有篇文献,对特定实体禁用COPY,你可以参照下来实现对某些对象禁用你的MIRROR命令。
通过创建一个 AcEditorReactor 反应器并重载 beginDeepClone and beginDeepCloneXlation 通知来实现禁用AUTOCAD的COPY命令。
在beginDeepClone 函数的内部,把禁用COPY的实体的ID添加到ID map中,AUTOCAD处理这些对象的时候好像他们已经完成了拷贝,然后你在beginDeepCloneXlation期间,移除这些ID。
下面的代码,你可以先用DisableCopy 命令添加要保护的对象禁止拷贝他们,通过命令EnableCopy ,恢复正常。需要注意的是由于ID是在命令反应器生效时间才保护这些对象。
第一步 : 在你的反应器头文件里面加入:
 - private:
- AcDbObjectIdArray m_ids;
- public:
- // overrides
- virtual void beginDeepCloneXlation(AcDbIdMapping& x0,
- Acad::ErrorStatus* x1);
- virtual void beginDeepClone(AcDbDatabase* pTo,
- AcDbIdMapping& x0);
- // other custom methods
- Adesk::Boolean addObject(const AcDbObjectId& id);
- Adesk::Boolean removeObject(const AcDbObjectId& id);
第二步: 在你的反应器里面重载:
 - //
- // Override method implementation
- //
- void ADSEditorRctr::beginDeepClone(AcDbDatabase* pTo,
- AcDbIdMapping& x0)
- {
- // Only for Copy Context
- if(AcDb::kDcCopy != x0.deepCloneContext())
- return;
- // Mock up a fake clone: place our ids in the map
- for(int i=0; i<m_ids.length(); i++)
- {
- x0.assign(
- AcDbIdPair(
- m_ids,
- m_ids,
- Adesk::kTrue,
- Adesk::kTrue
- )
- );
- }
- }
- //
- // Override method implementation
- //
- void ADSEditorRctr::beginDeepCloneXlation(AcDbIdMapping& x0,
- Acad::ErrorStatus* x1)
- {
- // Only for Copy Context
- if(AcDb::kDcCopy != x0.deepCloneContext())
- return;
- // Remove them here
- for(int i=0; i<m_ids.length(); i++)
- {
- x0.del(m_ids);
- }
- }
- //
- // Custom method implementation
- //
- Adesk::Boolean ADSEditorRctr::addObject(const AcDbObjectId& id)
- {
- int at;
- if(!m_ids.find(id,at))
- {
- m_ids.append(id);
- return Adesk::kTrue;
- }
- return Adesk::kFalse;
- }
- //
- // Custom method implementation
- //
- Adesk::Boolean ADSEditorRctr::removeObject(const AcDbObjectId& id)
- {
- int at;
- if(m_ids.find(id,at))
- {
- m_ids.removeAt(at);
- return Adesk::kTrue;
- }
- return Adesk::kFalse;
- }
第三步:增加命令 enable/disable 对某些实体的COPY操作。
 -
- // DISABLECOPY command
- static void DISABLECOPY(void)
- {
- ads_name ss;
- if(acedSSGet(NULL,NULL,NULL,NULL,ss)==RTNORM)
- {
- ads_name ent;
- AcDbObjectId id;
- long length;
- if(acedSSLength(ss, &length)==RTNORM)
- {
- for(int i=0; i<length; i++)
- {
- if(ads_ssname(ss, i, ent)==RTNORM)
- {
- if(acdbGetObjectId(id,ent) == Acad::eOk)
- DocVars.docData().gEditorRctr.addObject(id);
- }
- }
- }
- }
- acedSSFree(ss);
- }
- // ENABLECOPY command
- static void ENABLECOPY(void)
- {
- ads_name ss;
- if(acedSSGet(NULL,NULL,NULL,NULL,ss)==RTNORM)
- {
- ads_name ent;
- AcDbObjectId id;
- long length;
- if(acedSSLength(ss, &length)==RTNORM)
- {
- for(int i=0; i<length; i++)
- {
- if(ads_ssname(ss, i, ent)==RTNORM)
- {
- if(acdbGetObjectId(id,ent) == Acad::eOk)
- DocVars.docData().gEditorRctr.removeObject(id);
- }
- }
- }
- }
- acedSSFree(ss);
- }
第四步:在CDocData类中增加编辑器反应器的实例
|
|