arcengine 圖層中節點抽稀功能(c++)
while (bdtbEnt.valid()) { dan::Vector<dan::Vector<dan::Point3DF> > bdtbCircleNode = bdtbEnt->getNodes(); //獲得BDTB圖層的環節點 QNodesArray bdtbNodesArray = SDFUN::nodes3dTonodesArray(bdtbCircleNode); //轉成QVector dan::Vector<int> deleteEnt; bool isok; for (int t = 0; t != bdtbNodesArray.size(); ++t) { for (int i = 0; i != bdtbNodesArray[t].size(); ++i) { dan::Object<iDataPlugin::IPGEntityCursor> xzqEntCursor = ipDatabase->iDataSSGetPath(xzqLayer, bdtbEnt->getNodes(), iDataPlugin::IPGDataBase::IntersectsItemShape); //得到相接的xzqEntCursor dan::Object<iDataPlugin::IPGEntity> xzqEnt = xzqEntCursor->next(); int ttk = 0; isok = true; while (xzqEnt.valid()) { ttk++; if (ttk == 1) { isok = false; } test = 2; dan::Vector<dan::Vector<dan::Point3DF> > xzqCircleNode = xzqEnt->getNodes(); //獲得BDTB圖層的環節點; QNodesArray xzqNodesArray = SDFUN::nodes3dTonodesArray(xzqCircleNode); //轉成QList for (int m = 0; m != xzqNodesArray.size(); ++m) { QPointF ptclose; int nidx; double dparam; double distanceShort = SquarePtDistPoly(bdtbNodesArray[t][i], xzqNodesArray[m], ptclose, nidx, dparam); //得到點到面的最短距離 if (distanceShort < 1e-3) //如果距離最近則說明該點位於相交線上;而後進行判斷是否為同一點: { for (QPointF var : xzqNodesArray[m]) { double dist_tmp = square2dDist(bdtbNodesArray[t][i], var); if (dist_tmp < 1e-3)//只要有一個點的距離很小,就認為是同一點 { isok = true; break; } } } } xzqEnt = xzqEntCursor->next(); } if (!isok) { //需要再判斷是否在其他圖層當中--.-- bdtbNodesArray[t].removeAt(i); i--; test = 0; } } } if (test == 0) { bdtbEnt->setNodes(SDFUN::nodes3dTonodesArray(bdtbNodesArray)); modifyEntList.append(bdtbEnt); } if (modifyEntList.size() > 5000) { ipDatabase->modifyEntityFromDatabase(bdtbLayer, modifyEntList); //刪除節點後修改 modifyEntList.clear(); } bdtbEnt = bdtbEntCursor->next(); } progressbar->closeProgress(); if (modifyEntList.size() > 0) { ipDatabase->modifyEntityFromDatabase(bdtbLayer, modifyEntList); //修改實體到圖層 QMessageBox::warning(NULL, QString::fromLocal8Bit("節點去除"), QString::fromLocal8Bit("多餘節點去除完成")); } adapter->refresh();