设为首页收藏本站

中国膜结构网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

膜结构车棚
膜结构车棚膜结构资质国产膜材 膜结构网中国膜结构协会
查看: 68|回复: 0

DWG图纸加密-arx方法

[复制链接]
  • TA的每日心情
    开心
    2021-6-22 09:39
  • 签到天数: 1542 天

    [LV.Master]伴坛终老

    发表于 2021-5-14 12:31 | 显示全部楼层 |阅读模式
    原理很简单,这是实现细节:
    1 选择要加密的实体,并克隆到匿名块定义中,删除或隐藏原实体; 我的程序留有后门,只是隐藏了。
    2 定义一个自定义实体类,只一个数据成员:块引用; 如果不让打印,就设置为defpoints层。
    3 定义一个匿名块,含有上面的自定义实体;
    4 生成第3步中的块引用。
    对第2,第3步中的匿名块定义,可以进行特殊处理,我的程序留有后门,没有处理。

    好了,全部完成了。

    当第三方打开这个图时,因为没有自定义对象的解释器程序,自定义对象变为代理对象。
    这时:
    代理对象在defpoints层,不能打印;
    代理对象不能捕捉;
    当炸开块时,代理对象会消失。

    以下是核心代码。只是省略了自定义类C_TH_5476的实现代码
    1. void buildAllDepthEncryption()
    2. {
    3.         createLayer("defpoints", 7, "continuous");
    4.         //2.1
    5.         //因为AcDbPolyline,AcDbHatch在AutoCAD2002及以前版本,在代理实体中,不显示
    6.         //explode AcDbPolyline
    7.         struct resbuf* pFilter = acutBuildList(
    8.                 RTDXF0, "lwpolyline",
    9.                 0);
    10.         ads_name ss0;
    11.         if (acedSSGet("x", NULL, NULL, pFilter, ss0) != RTNORM)
    12.         {
    13.                 acutRelRb(pFilter);
    14.         }
    15.         else
    16.         {
    17.                 acutRelRb(pFilter);
    18.                 long len = 0;
    19.                 acedSSLength(ss0, &len);
    20.                 for (int i = 0; i < len; i++)
    21.                 {
    22.                         ads_name ename;
    23.                         AcDbObjectId objId;
    24.                         acedSSName(ss0, i, ename);
    25.                         acdbGetObjectId(objId, ename);
    26.                         AcDbEntity* pEnt = NULL;
    27.                         acdbOpenAcDbEntity(pEnt, objId, AcDb::kForWrite);
    28.                         if (pEnt->isKindOf(AcDbPolyline::desc()))
    29.                                 ;
    30.                         AcDbVoidPtrArray newEnts;
    31.                         acutPrintf("\n炸开多义线!");
    32.                         pEnt->explode(newEnts);
    33.                         pEnt->setVisibility(AcDb::kInvisible);
    34.                         pEnt->close();
    35.                         for (int index = 0; index < newEnts.length(); index++)
    36.                         {
    37.                                 AcDbObject* pSubEnt = static_cast<AcDbObject*>(newEnts[index]);
    38.                                 if (!pSubEnt)
    39.                                         continue;
    40.                                 if (NULL != pSubEnt->database())
    41.                                         pSubEnt->close();
    42.                                 else
    43.                                 {
    44.                                         //append
    45.                                         AcDbBlockTable* pBT;
    46.                                         AcDbBlockTableRecord* pMSRec;
    47.                                         acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBT, AcDb::kForRead);
    48.                                         pBT->getAt(ACDB_MODEL_SPACE, pMSRec, AcDb::kForWrite);
    49.                                         pBT->close();
    50.                                         pMSRec->appendAcDbEntity((AcDbEntity*&)pSubEnt);
    51.                                         pSubEnt->close();
    52.                                         pMSRec->close();
    53.                                 }
    54.                         }
    55.                 }
    56.                 acedSSFree(ss0);
    57.         }
    58.         //explode AcDbPolyline
    59.         //2.1

    60.         //2.2 选择实体
    61.         ads_name ss;
    62.         if (acedSSGet(NULL, NULL, NULL, NULL, ss) != RTNORM)
    63.         {
    64.                 acutPrintf("\n选择失败!");
    65.                 return;
    66.         }
    67.         long len = 0;
    68.         acedSSLength(ss, &len);
    69.         ads_name ename;
    70.         AcDbObjectId objId;
    71.         AcDbObjectIdArray objIdArr;
    72.         for (int i = 0; i < len; i++)
    73.         {
    74.                 acedSSName(ss, i, ename);
    75.                 acdbGetObjectId(objId, ename);
    76.                 objIdArr.append(objId);
    77.         }
    78.         acedSSFree(ss);
    79.         //2.2


    80.         AcDbBlockTableRecord* pMyRec = new AcDbBlockTableRecord();
    81.         AcDbBlockTable* pBT = NULL;
    82.         AcDbObjectId myRecId;
    83.         acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBT, AcDb::kForWrite);
    84.         pBT->add(myRecId, pMyRec);
    85.         pBT->close();
    86.         pMyRec->setOrigin(AcGePoint3d::kOrigin);
    87.         pMyRec->setName("*U");
    88.         pMyRec->close();
    89.         AcDbIdMapping idMap;
    90.         if (acdbHostApplicationServices()->workingDatabase()->deepCloneObjects(objIdArr, myRecId, idMap) != Acad::eOk)
    91.         {
    92.                 acutPrintf("\n深层克隆失败了!");
    93.                 acdbOpenAcDbObject((AcDbObject*&)pMyRec, myRecId, AcDb::kForWrite);
    94.                 pMyRec->erase();
    95.                 pMyRec->close();
    96.                 return;
    97.         }
    98.         //hide
    99.         for (i = 0; i < len; i++)
    100.         {
    101.                 AcDbEntity* pEnt = NULL;
    102.                 if (acdbOpenAcDbEntity(pEnt, objIdArr, AcDb::kForWrite) != Acad::eOk)
    103.                 {
    104.                         acutPrintf("\n写打开错误,退出程序!");
    105.                         acdbOpenAcDbObject((AcDbObject*&)pMyRec, myRecId, AcDb::kForWrite);
    106.                         pMyRec->erase();
    107.                         pMyRec->close();
    108.                         return;
    109.                 }
    110.                 pEnt->setVisibility(AcDb::kInvisible);
    111.                 pEnt->close();
    112.         }
    113.         //2.3

    114.         C_TH_5476* gCont = new C_TH_5476;
    115.         gCont->setBlockId(myRecId);
    116.         gCont->setLocation(AcGePoint3d::kOrigin);
    117.         gCont->setLayer("defpoints");
    118.         //2.4

    119.         //2.5 再建立匿名块定义,包含用户化对象
    120.         acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBT, AcDb::kForWrite);
    121.         AcDbBlockTableRecord* pMyRec1 = new AcDbBlockTableRecord();
    122.         AcDbObjectId recId1;
    123.         pBT->add(recId1, pMyRec1);
    124.         pBT->close();
    125.         pMyRec1->setOrigin(AcGePoint3d::kOrigin);


    126.         pMyRec1->setName("*U");

    127.         pMyRec1->appendAcDbEntity(gCont);
    128.         gCont->close();
    129.         pMyRec1->close();


    130.         //2.6 建立匿名块定义的引用实例
    131.         AcDbBlockReference* pRef = new AcDbBlockReference();
    132.         pRef->setPosition(AcGePoint3d::kOrigin);
    133.         pRef->setBlockTableRecord(recId1);
    134.         pRef->setScaleFactors(AcGeScale3d(1.0, 1.0, 1.0));
    135.         AcDbBlockTableRecord* pMSRec;
    136.         acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBT, AcDb::kForRead);
    137.         pBT->getAt(ACDB_MODEL_SPACE, pMSRec, AcDb::kForWrite);
    138.         pBT->close();
    139.         pMSRec->appendAcDbEntity(pRef);
    140.         pRef->close();
    141.         pMSRec->close();
    142.         //2.6


    143.         const char* strFileName;
    144.         acdbHostApplicationServices()->workingDatabase()->getFilename(strFileName);
    145.         CString strNewFileName = strFileName;
    146.         int index = strNewFileName.ReverseFind('.');
    147.         if (index != -1)
    148.         {
    149.                 strNewFileName = strNewFileName.Left(index);
    150.                 if (strNewFileName.Find("_A", strNewFileName.GetLength() - 2) == -1)
    151.                 {
    152.                         strNewFileName += "_A";
    153.                 }
    154.                 strNewFileName += ".dwg";
    155.         }
    156.         else
    157.         {
    158.                 acutPrintf("\n为什么加密后的另存名文件不能加后缀:_A ?");
    159.         }
    160.         if (acdbHostApplicationServices()->workingDatabase()->saveAs(strNewFileName) != Acad::eOk)
    161.         {
    162.                 acutPrintf("\n文件另存出错!");
    163.                 //AfxMessageBox("外部文件存储,失败!");
    164.                 return;
    165.         }
    166. }
    复制代码
    回复


    http://www.mjgw.org/ 专业从事膜结构设计、制作加工、施工安装的膜结构工程服务,能够为客户提供专业的膜结构整体解决方案。做中国最好的膜结构综合服务平台。欢迎大家联系电话:198-7840-1958,QQ:463017170.
    相关关键词:膜结构车棚,膜结构车棚覆盖,膜结构车棚公司,膜结构车棚多少钱,膜结构车棚厂家,膜结构车棚价格,社区膜结构车棚,膜结构车棚膜布厂家 ,膜结构车棚哪家好,膜结构车棚多少钱一米,膜结构车棚报价,膜结构车棚哪里有,膜结构车棚定制,膜结构车棚安装,膜结构车棚设计,膜结构车棚电话,膜结构车棚加工,膜结构车棚膜布价格,膜结构车棚批发,膜结构车棚制造商,膜结构车棚生产厂家,膜结构车棚设计,膜结构车棚施工,膜结构车棚多少钱一平米,膜结构车棚订制,张拉膜车棚,张拉膜车棚覆盖,张拉膜车棚公司,张拉膜车棚多少钱,张拉膜车棚厂家,张拉膜车棚价格,社区张拉膜车棚,张拉膜车棚膜布厂家 ,张拉膜车棚哪家好,张拉膜车棚多少钱一米,张拉膜车棚报价,张拉膜车棚哪里有,张拉膜车棚定制,张拉膜车棚安装,张拉膜车棚设计,张拉膜车棚电话,张拉膜车棚加工,张拉膜车棚膜布价格,张拉膜车棚批发,张拉膜车棚制造商,张拉膜车棚生产厂家,张拉膜车棚设计,张拉膜车棚施工,张拉膜车棚多少钱一平米,张拉膜车棚订制,常用膜材品牌:德国杜肯、法国法拉利、德国海德斯、德国米乐、日本平岗、韩国秀博、比利时希运、美国赫虏伯、中国科宝、上海慧遥。

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    推荐膜材品牌上一条 /6 下一条

    进口膜材 国产膜材 pvdf膜材ptfe膜材ETFE膜材
    最好的膜结构公司 一级膜结构资质 膜结构一级资质
    膜结构设计-膜结构十大品牌-etfe设计-充气膜结构
    诺科膜结构
    遨都膜结构设计
    中国膜结构网
    中国空间膜结构

    QQ|申请友链|手机版|中国膜结构论坛