土木在线论坛 \ 建筑设计 \ CAD下载及教程 \ 梦想CAD控件关于比较问题

梦想CAD控件关于比较问题

发布于:2019-05-15 13:52:15 来自:建筑设计/CAD下载及教程 [复制转发]

全图比较


怎么比较两个CAD图纸文件修改前后的不同部分呢?在工程图纸设计中,我们更多情况下可能需要对同一张工程图的前后修改部分进行对比,以确定工程图纸的改动部分及追溯原因,本教程演示了几种常见的比较方法。


实现图纸比较功能,首先将两个控件放入网页中,js代码如下:



 

   

   

   

   

   

   

   

   

   

   

   

   


   

   不能装载CAD控件。请确认你可以连接网络或者检查浏览器的选项中安全设置。http://www.mxdraw.com/MxDrawX52.msi 安载CAD控件

 

 

   

   

   

   

   

   

   

   

   

   

   

   


   

   不能装载CAD控件。请确认你可以连接网络或者检查浏览器的选项中安全设置。http://www.mxdraw.com/MxDrawX52.msi 安载CAD控件

 


首先通过id得到两个控件,返回控件的数据库对象,把两个控件里面不同的内容标记出来,具体实现js代码如下:


function AllCompare() {

   var ocx1 = document.getElementById("MxDrawXCtrl1");

   var ocx2 = document.getElementById("MxDrawXCtrl2");


   var database1 = ocx1.GetDatabase();

   var database2 = ocx2.GetDatabase();


   var filter = ocx1.NewResbuf();

   var compare1 = ocx1.NewComObject("IMxDrawCompare");

   //开始比较

   //参数一为比较时使用的原始文件 参数二为修改后的,新的文件 参数三为过滤条件

   compare1.Do(database1, database2, filter);

   //返回比较后,被修改的曲线id

   var aryDifferent1 = compare1.GetCurveIdsOfTheDifferent();

   //把修改的地方,标记出来

   //参数一为缩放比例

   //参数二为当前图纸,是新修改的图纸,该变量为true,那么在原图不能找到的对象,为新增加对象

   compare1.DrawFlag(1.0,false);

   // 反过来比较一下,用来确定,那些对象是新增加的。

   var compare2 = ocx1.NewComObject("IMxDrawCompare");


   compare2.Do(database2, database1, filter);


   var aryDifferent2 = compare2.GetCurveIdsOfTheDifferent();


   compare2.DrawFlag(1.0,true);


   var iErase = 0;

   var iModify = 0;

   var iAdd = 0;


   for (var i = 0;i < aryDifferent1.Count; i++)

   {

       //返回链表中的指定位置的对象id

       var lId = aryDifferent1.AtObjectId(i);

       //返回比较后,被修改的曲线的位置。用于图上标记被修改的对象

       if(compare1.GetIsErase(lId))

       {

           iErase = iErase + 1;

       }

       else

       {

           iModify = iModify +1;

       }

   }

   for(var i = 0; i < aryDifferent2.Count;i++)

   {

       var lId = aryDifferent2.AtObjectId(i);

       if(compare2.GetIsErase(lId))

       {

           iAdd = iAdd + 1;

       }

   }


   var modfColor = ocx1.NewComObject("IMxDrawModifyTheColor");

   modfColor.Do(ocx1.GetDatabase(),3289650);

   //把指定实体颜色

   modfColor.DoEntity(aryDifferent1,255);


   alert(iModify + "对象修改," + iErase + "对象删除," + iAdd + "对象被增加");

}


选择范围比较


首先通过id得到两个控件,返回控件的数据库对象,把两个控件里面不同的内容标记出来,具体实现js代码如下:


function DoImpCompare(points, filter) {


   var ocx1 = document.getElementById("MxDrawXCtrl1");

   var ocx2 = document.getElementById("MxDrawXCtrl2");


   var database1 = ocx1.GetDatabase();

   var database2 = ocx2.GetDatabase();


   var compare1 = ocx1.NewComObject("IMxDrawCompare");

   compare1.Bound = points;


   compare1.Do(database1, database2, filter);


   var aryDifferent1 = compare1.GetCurveIdsOfTheDifferent();


   compare1.DrawFlag(1.0, false);

   // 反过来比较一下,用来确定,那些对象是新增加的。

   var compare2 = ocx1.NewComObject("IMxDrawCompare");

   compare2.Bound = points;

   compare2.Do(database2, database1, filter);


   var aryDifferent2 = compare2.GetCurveIdsOfTheDifferent();

   

   compare2.DrawFlag(1.0, true);

   

   var iErase = 0;

   var iModify = 0;

   var iAdd = 0;

   for (var i = 0; i < aryDifferent1.Count; i++) {

       var lId = aryDifferent1.AtObjectId(i);

       if (compare1.GetIsErase(lId)) {

           iErase = iErase + 1;

       }

       else {

           iModify = iModify + 1;

       }

   }

   for (var i = 0; i < aryDifferent2.Count; i++) {

       var lId = aryDifferent2.AtObjectId(i);

       if (compare2.GetIsErase(lId)) {

           iAdd = iAdd + 1;

       }

   }

   alert(iModify + "对象修改," + iErase + "对象删除," + iAdd + "对象被增加");

}


用户可以选取范围内的图纸作比较,具体实现js代码如下:


function BoundCompare() {


   var ocx1  = document.getElementById("MxDrawXCtrl1");

   var getPt = ocx1.NewComObject("IMxDrawUiPrPoint");

   getPt.message = "点取第一点";

   if(getPt.go() != 1)

       return;

   var frstPt = getPt.value();

   var getCorner = ocx1.NewUtility();

   var secondPt =  getCorner.GetCorner(frstPt,"点取第二点:");

   if(secondPt == null)

       return;

   var points = ocx1.NewComObject("IMxDrawPoints");

   points.Add2(frstPt);

   points.Add2(secondPt);

   var filter = ocx1.NewResbuf();

   DoImpCompare( points, filter);

}


选择圆形范围比较


通过圆形范围把两个控件里面不同的内容标记出来,首先需要动态画一个圆,具体实现js代码如下:


 function DoDynWorldDrawFun(dX, dY, pWorldDraw, pData) {

   var sGuid = pData.Guid;

   var ocx1 = document.getElementById("MxDrawXCtrl1");

   ocx1.SetEventRet(0);

   if (sGuid == "DrawCircle") {

       var pt1 = pData.GetPoint("pt1");

       if (pt1 == null)

           return;

       var pt2 = ocx1.NewPoint();

       pt2.x = dX;

       pt2.y = dY;

       var dR = pt1.DistanceTo(pt2);

       pWorldDraw.DrawCircle(pt1.x, pt1.y, dR);

   }


}


用户可以选取圆形范围内的图纸作比较,具体实现js代码如下:


function CircleCompare() {

   var mxOcx  = document.getElementById("MxDrawXCtrl1");

   var getPt1 = mxOcx.NewComObject("IMxDrawUiPrPoint");

   getPt1.message = "指定圆心";

   if (getPt1.go() != 1) {

       return;

   }

   var getPt2 = mxOcx.NewComObject("IMxDrawUiPrPoint");

   getPt2.message = "指定圆上一点";

   getPt2.basePoint = getPt1.value();

   var spDrawData = getPt2.InitUserDraw("DrawCircle");

   spDrawData.SetPoint("pt1", getPt1.value());

   getPt2.setUseBasePt(true);

   if (getPt2.go() != 1) {

       return;

   }

   var cen = getPt1.value();

   var pt2 = getPt2.value();

   var dR = cen.DistanceTo(pt2);

   var circle = mxOcx.NewEntity("IMxDrawCircle");

   circle.Center = cen;

   circle.Radius = dR;

   var points = circle.GetSamplePoints(0.1);


   if (points.Count < 3) {

       alert("圆太小");

   }

   var filter = mxOcx.NewResbuf();

   DoImpCompare(points, filter);

}


全部回复(0 )

只看楼主 我来说两句抢沙发

CAD下载及教程

返回版块

52.09 万条内容 · 682 人订阅

猜你喜欢

阅读下一篇

梦想CAD控件关于id与handle问题

ID和句柄具有各自的特点: (1) ID:在一个任务中,本次任务中都是独一无二的。在不同的任务中,同一个图形对象的ID可能不同。 (2) 句柄:在一个任务中,不能保证每个对象的句柄都唯一,但是在一个图形数据库中所有对象的句柄都是唯一的。句柄随DWG图形一起保存,在两次任务期间同一对象的句柄是相同的。 一、实体id返回实体对象 IMxDrawDatabase::ObjectIdToObject

回帖成功

经验值 +10