用于图纸比较
[ object, uuid(1ADB8B40-FE30-4407-9D6E-C432E5FA6EA6), dual, nonextensible, helpstring("IMxDrawCompare interface"), pointer_default(unique) ]
interface IMxDrawCompare : IDispatch;MxDrawCompare.idl
例如: 选择一个范围,进行比较 VC2005
CString CCompareGraphics2Dlg::GetCompareLayer()
{
IDispatchPtr spDispatch(m_ocx1.GetDatabase(),false);
IMxDrawDatabasePtr spDatabase1;
spDispatch->QueryInterface(&spDatabase1);
if(spDatabase1 == NULL)
return _T("");
// 得到所有图层名
CString sRet;
IMxDrawLayerTablePtr spLayerTable = spDatabase1->GetLayerTable();
IMxDrawLayerTableIteratorPtr spIter = spLayerTable->NewIterator();
for(;!spIter->Done();spIter->Step(VARIANT_TRUE,VARIANT_TRUE))
{
IMxDrawLayerTableRecordPtr spLayerRec = spIter->GetRecord();
CString sName = spLayerRec->GetName();
// 0零层不参加比较
if(sName != "0")
{
if(sRet.IsEmpty())
sRet = sName;
else
{
CString sTmp;
sTmp.Format(_T("%s,%s"),sRet,sName);
sRet = sTmp;
}
}
}
return sRet;
}
CString sLayers = GetCompareLayer();
IMxDrawResbufPtr spFilter;
spFilter.CreateInstance(__uuidof( MxDrawXLib::MxDrawResbuf ));
if(!sLayers.IsEmpty())
{
_bstr_t sBsLayers = sLayers.AllocSysString();
spFilter->AddStringEx(sBsLayers,8);
}
MxDrawXLib::IMxDrawUiPrPointPtr getPt;
getPt.CreateInstance(__uuidof( MxDrawXLib::MxDrawUiPrPoint ));
IMxDrawUiPrPoint* pGetPt = getPt;
pGetPt->put_message(_T("点取第一点"));
if(pGetPt->go() != mcOk)
return;
IMxDrawPointPtr frstPt = pGetPt->value();
if(frstPt == NULL)
return;
MxDrawXLib::IMxDrawUtilityPtr getCorner;
getCorner.CreateInstance(__uuidof( MxDrawXLib::MxDrawUtility ));
IMxDrawPointPtr secondPt = getCorner->GetCorner(frstPt,_T("点取第二点:") );
if(secondPt == NULL)
return;
MxDrawXLib::IMxDrawPointsPtr points;
points.CreateInstance(__uuidof( MxDrawXLib::MxDrawPoints ));
points->Add2(frstPt);
points->Add2(secondPt);
IDispatchPtr spDispatch(m_ocx1.GetDatabase(),false);
IMxDrawDatabasePtr spDatabase1;
spDispatch->QueryInterface(&spDatabase1);
if(spDatabase1 == NULL)
return;
IDispatchPtr spDispatch2(m_ocx2.GetDatabase(),false);
IMxDrawDatabasePtr spDatabase2;
spDispatch2->QueryInterface(&spDatabase2);
if(spDatabase2 == NULL)
return;
IMxDrawComparePtr compare;
compare.CreateInstance(__uuidof( MxDrawXLib::MxDrawCompare));
// 设置比较范围。
compare->PutBound(points);
// 开始比较。
compare->Do(spDatabase1,spDatabase2,spFilter);
IMxDrawResbufPtr aryDifferent = compare->GetCurveIdsOfTheDifferent();
compare->DrawFlag(1.0);
CString sT;
sT.Format(_T("发现:%d个不同对象"),aryDifferent->GetCount() );
AfxMessageBox(sT);例如: JS代码,全图比较
// 返回比较图层,除0层外。0层上的实体,不参加比较. function GetCompareLayer() { var mxocx = document.getElementById("MxDrawXCtrl1") var database = mxocx.GetDatabase(); // 得到所有图层名 var sRet = null; var spLayerTable = database.GetLayerTable(); var spIter = spLayerTable.NewIterator(); for(;!spIter.Done();spIter.Step(true,true)) { var spLayerRec = spIter.GetRecord(); var sName = spLayerRec.Name; // 0零层不参加比较 if(sName != "0") { if(sRet == null) sRet = sName; else { sRet = sRet +","+sName; } } } return sRet; } function AllCompareDWG() { var ocx1 = document.getElementById("MxDrawXCtrl1"); var ocx2 = document.getElementById("MxDrawXCtrl2"); var database1 = ocx1.GetDatabase(); var database2 = ocx2.GetDatabase(); var filter = ocx1.NewResbuf(); // 得到过滤的图层名 var layers = GetCompareLayer(); // 增加图层过滤. if (layers != null) { filter.AddStringEx(layers, 8); } var compare1 = ocx1.NewComObject("IMxDrawCompare"); compare1.Do(database1, database2, filter); var aryDifferent1 = compare1.GetCurveIdsOfTheDifferent(); compare1.DrawFlag(1.0); // 反过来比较一下,用来确定,那些对象是新增加的。 var compare2 = ocx1.NewComObject("IMxDrawCompare"); compare2.Do(database2, database1, filter); var aryDifferent2 = compare2.GetCurveIdsOfTheDifferent(); compare2.DrawFlag(1.0); var iErase = 0; var iModify = 0; var iAdd = 0; var i = 0; for (;i < aryDifferent1.Count; i++) { var lId = aryDifferent1.AtObjectId(i); if(compare1.GetIsErase(lId)) { iErase = iErase + 1; } else { iModify = iModify +1; } } i = 0; for(; 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 ocx2 = document.getElementById("MxDrawXCtrl2");
var filter = ocx1.NewResbuf();
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 database1 = ocx1.GetDatabase();
var database2 = ocx2.GetDatabase();
var compare = ocx1.NewComObject("IMxDrawCompare");
compare.Bound = points;
compare.Do(database1, database2, filter);
var aryDifferent = compare.GetCurveIdsOfTheDifferent();
compare.DrawFlag(1.0);
alert("发现:" + aryDifferent.Count + "个不同对象");
}