- UID
- 765036
- 积分
- 483
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2016-11-25
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2018-5-16 10:10:38
|
显示全部楼层
这个,是我学习ARXDBG时的副产品。但愿在特殊时候,给朋友们有点帮助。
原理很简单,这是实现细节:
1 选择要加密的实体,并克隆到匿名块定义中,删除或隐藏原实体; 我的程序留有后门,只是隐藏了。
2 定义一个自定义实体类,只一个数据成员:块引用; 如果不让打印,就设置为defpoints层。
3 定义一个匿名块,含有上面的自定义实体;
4 生成第3步中的块引用。
对第2,第3步中的匿名块定义,可以进行特殊处理,我的程序留有后门,没有处理。
好了,全部完成了。
当第三方打开这个图时,因为没有自定义对象的解释器程序,自定义对象变为代理对象。
这时:
代理对象在defpoints层,不能打印;
代理对象不能捕捉;
当炸开块时,代理对象会消失。
以下是核心代码。只是省略了自定义类C_TH_5476的实现代码
 - void buildAllDepthEncryption()
- {
- createLayer("defpoints", 7, "continuous");
- //2.1
- //因为AcDbPolyline,AcDbHatch在AutoCAD2002及以前版本,在代理实体中,不显示
- //explode AcDbPolyline
- struct resbuf* pFilter = acutBuildList(
- RTDXF0, "lwpolyline",
- 0);
- ads_name ss0;
- if (acedSSGet("x", NULL, NULL, pFilter, ss0) != RTNORM)
- {
- acutRelRb(pFilter);
- }
- else
- {
- acutRelRb(pFilter);
- long len = 0;
- acedSSLength(ss0, &len);
- for (int i = 0; i < len; i++)
- {
- ads_name ename;
- AcDbObjectId objId;
- acedSSName(ss0, i, ename);
- acdbGetObjectId(objId, ename);
- AcDbEntity* pEnt = NULL;
- acdbOpenAcDbEntity(pEnt, objId, AcDb::kForWrite);
- if (pEnt->isKindOf(AcDbPolyline::desc()))
- ;
- AcDbVoidPtrArray newEnts;
- acutPrintf("\n炸开多义线!");
- pEnt->explode(newEnts);
- pEnt->setVisibility(AcDb::kInvisible);
- pEnt->close();
- for (int index = 0; index < newEnts.length(); index++)
- {
- AcDbObject* pSubEnt = static_cast<AcDbObject*>(newEnts[index]);
- if (!pSubEnt)
- continue;
- if (NULL != pSubEnt->database())
- pSubEnt->close();
- else
- {
- //append
- AcDbBlockTable* pBT;
- AcDbBlockTableRecord* pMSRec;
- acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBT, AcDb::kForRead);
- pBT->getAt(ACDB_MODEL_SPACE, pMSRec, AcDb::kForWrite);
- pBT->close();
- pMSRec->appendAcDbEntity((AcDbEntity*&)pSubEnt);
- pSubEnt->close();
- pMSRec->close();
- }
- }
- }
- acedSSFree(ss0);
- }
- //explode AcDbPolyline
- //2.1
- //2.2 选择实体
- ads_name ss;
- if (acedSSGet(NULL, NULL, NULL, NULL, ss) != RTNORM)
- {
- acutPrintf("\n选择失败!");
- return;
- }
- long len = 0;
- acedSSLength(ss, &len);
- ads_name ename;
- AcDbObjectId objId;
- AcDbObjectIdArray objIdArr;
- for (int i = 0; i < len; i++)
- {
- acedSSName(ss, i, ename);
- acdbGetObjectId(objId, ename);
- objIdArr.append(objId);
- }
- acedSSFree(ss);
- //2.2
- AcDbBlockTableRecord* pMyRec = new AcDbBlockTableRecord();
- AcDbBlockTable* pBT = NULL;
- AcDbObjectId myRecId;
- acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBT, AcDb::kForWrite);
- pBT->add(myRecId, pMyRec);
- pBT->close();
- pMyRec->setOrigin(AcGePoint3d::kOrigin);
- pMyRec->setName("*U");
- pMyRec->close();
- AcDbIdMapping idMap;
- if (acdbHostApplicationServices()->workingDatabase()->deepCloneObjects(objIdArr, myRecId, idMap) != Acad::eOk)
- {
- acutPrintf("\n深层克隆失败了!");
- acdbOpenAcDbObject((AcDbObject*&)pMyRec, myRecId, AcDb::kForWrite);
- pMyRec->erase();
- pMyRec->close();
- return;
- }
- //hide
- for (i = 0; i < len; i++)
- {
- AcDbEntity* pEnt = NULL;
- if (acdbOpenAcDbEntity(pEnt, objIdArr, AcDb::kForWrite) != Acad::eOk)
- {
- acutPrintf("\n写打开错误,退出程序!");
- acdbOpenAcDbObject((AcDbObject*&)pMyRec, myRecId, AcDb::kForWrite);
- pMyRec->erase();
- pMyRec->close();
- return;
- }
- pEnt->setVisibility(AcDb::kInvisible);
- pEnt->close();
- }
- //2.3
- C_TH_5476* gCont = new C_TH_5476;
- gCont->setBlockId(myRecId);
- gCont->setLocation(AcGePoint3d::kOrigin);
- gCont->setLayer("defpoints");
- //2.4
- //2.5 再建立匿名块定义,包含用户化对象
- acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBT, AcDb::kForWrite);
- AcDbBlockTableRecord* pMyRec1 = new AcDbBlockTableRecord();
- AcDbObjectId recId1;
- pBT->add(recId1, pMyRec1);
- pBT->close();
- pMyRec1->setOrigin(AcGePoint3d::kOrigin);
- pMyRec1->setName("*U");
- pMyRec1->appendAcDbEntity(gCont);
- gCont->close();
- pMyRec1->close();
- //2.6 建立匿名块定义的引用实例
- AcDbBlockReference* pRef = new AcDbBlockReference();
- pRef->setPosition(AcGePoint3d::kOrigin);
- pRef->setBlockTableRecord(recId1);
- pRef->setScaleFactors(AcGeScale3d(1.0, 1.0, 1.0));
- AcDbBlockTableRecord* pMSRec;
- acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBT, AcDb::kForRead);
- pBT->getAt(ACDB_MODEL_SPACE, pMSRec, AcDb::kForWrite);
- pBT->close();
- pMSRec->appendAcDbEntity(pRef);
- pRef->close();
- pMSRec->close();
- //2.6
- const char* strFileName;
- acdbHostApplicationServices()->workingDatabase()->getFilename(strFileName);
- CString strNewFileName = strFileName;
- int index = strNewFileName.ReverseFind('.');
- if (index != -1)
- {
- strNewFileName = strNewFileName.Left(index);
- if (strNewFileName.Find("_A", strNewFileName.GetLength() - 2) == -1)
- {
- strNewFileName += "_A";
- }
- strNewFileName += ".dwg";
- }
- else
- {
- acutPrintf("\n为什么加密后的另存名文件不能加后缀:_A ?");
- }
- if (acdbHostApplicationServices()->workingDatabase()->saveAs(strNewFileName) != Acad::eOk)
- {
- acutPrintf("\n文件另存出错!");
- //AfxMessageBox("外部文件存储,失败!");
- return;
- }
- }
|
评分
-
查看全部评分
|