admin 发表于 2024-9-26 10:27:49

C++ CAD 高亮显示要素

void CTransUtil::ZoomWindow(AcDbDatabase* pDb, AcDbExtents& ext)
{
        assert(pDb);
       
        //AcDbViewportTable* pViewportTable = NULL;
        //if (pDb->getViewportTable(pViewportTable, AcDb::kForRead) == Acad::eOk)
        {
                //AcDbViewportTableRecord* pRecord = NULL;
                //if (pViewportTable->getAt(TEXT("*ACTIVE"), pRecord, AcDb::kForWrite) == Acad::eOk)
                {
                        AcGePoint3d center = CGeometryOper::GetMiddlePoint(ext.minPoint(), ext.maxPoint());
                        double height = ext.maxPoint().y - ext.minPoint().y;
                        double width = ext.maxPoint().x - ext.minPoint().x;
                        /*pRecord->setCenterPoint(CGeometryOper::Pt3dTo2d(center));
                        pRecord->setHeight(height * 1.01);
                        pRecord->setWidth(width * 2.0);
                        pRecord->close();*/

                        AcDbViewTableRecord pVwRec;
                        pVwRec.setCenterPoint(CGeometryOper::Pt3dTo2d(center));
                        pVwRec.setWidth(width * 1.01);
                        pVwRec.setHeight(height * 2.0);
                        acedSetCurrentView(&pVwRec, NULL);
                }
               

                //pViewportTable->close();
        }       
}





ACHAR layerName;
if (acedGetString(Adesk::kFalse, _T("\n输入句柄:\n"), layerName) != RTNORM)
{
        return;
}
CString nstr = layerName;
AcApDocument* pDoc = acDocManager->curDocument();
CString filePath = pDoc->fileName();
int nPos = filePath.ReverseFind(_T('\\'));
if (nPos == -1)
{
        return;
}
acDocManager->lockDocument(pDoc, AcAp::kWrite, NULL, NULL, true);
AcTransaction* pTrans = actrTransactionManager->startTransaction();
if (!pTrans)
{
        acDocManager->unlockDocument(pDoc);
        return;
}
HRESULT hr;
AutoCAD::IAcadApplication* pAcad = nullptr;
hr = NOERROR;

LPDISPATCH pAcadDisp = acedGetIDispatch(TRUE);
hr = pAcadDisp->QueryInterface(AutoCAD::IID_IAcadApplication, (void**)&pAcad);
if (SUCCEEDED(hr)) {
        //pAcad->ZoomAll();
        pAcad->ZoomExtents();
        pAcadDisp->Release();
        pAcad->Release();
        acdbHostApplicationServices()->workingDatabase()->updateExt(TRUE);
}
// 选择JZD图层上的所有多线段
struct resbuf* rb; // 结果缓冲区链表
ads_name jzdssname; //选择集名称
rb = acutBuildList(RTDXF0, TEXT("POLYLINE"), 8, _T("JZD"), AcDb::kDxfRegAppName, _T("SOUTH"), RTNONE);//LWPOLYLINE POLYLINE

acedSSGet(_T("A"), NULL, NULL, rb, jzdssname);
acutRelRb(rb);
long jzdlen;
if (RTNORM != acedSSLength(jzdssname, &jzdlen))
{
        acedSSFree(jzdssname);
        acDocManager->unlockDocument(acDocManager->curDocument());
        return;
}
//修改鼠标等待样式
CWaitCursor WaitCursor;
ads_namesset_temp;
//遍历选择集
for (int i = 0; i < jzdlen; i++)
{
        ads_name jzdent;
        if (RTNORM != acedSSName(jzdssname, i, jzdent))
        {
                continue;
        }
        AcDbObjectId jzdId;
        if (Acad::eOk != acdbGetObjectId(jzdId, jzdent))
        {
                acedSSFree(jzdent);
                continue;
        }               
        //句柄
                       
        ACHAR handbuf = { 0 };
        AcDbHandle handle = jzdId.handle();
        handle.getIntoAsciiBuffer(handbuf);
        CString str = handbuf;
        if (str == nstr)
        {
                AcDbObjectPointer<AcDbEntity> jzdEnt(jzdId, AcDb::kForRead);
                if (Acad::eOk != jzdEnt.openStatus())
                {
                        continue;
                }
                AcDbExtents ext;
                if (jzdEnt->getGeomExtents(ext) == Acad::eOk) //输出实体的ext
                {
                        CTransUtil::ZoomWindow(pDoc->database(), ext);
                        //acutPrintf(_T("\n找到!\n"));
                }
                //jzdEnt->highlight();
                //acedUpdateDisplay();       
                acedSSAdd(jzdent, NULL, sset_temp); //初始化一个选择
                break;
        }
        acedSSFree(jzdent);
}
acedSSFree(jzdssname);

WaitCursor.Restore();
actrTransactionManager->endTransaction();
acDocManager->unlockDocument(pDoc);
acedSSSetFirst(sset_temp, NULL);
acedSSFree(sset_temp);
acutPrintf(_T("\n完成!\n"));
页: [1]
查看完整版本: C++ CAD 高亮显示要素