#include "stdafx.h" #include "KTAdsPickSet.h" #include "KTCadUtility.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif // 默认构造函数 CKTAdsPickSet::CKTAdsPickSet() : m_bHighlight(FALSE), m_bGriplight(FALSE) { acedSSAdd(NULL, NULL, m_ssName); ZeroMemory(m_entMark, sizeof(ads_name)); } // 构造函数 CKTAdsPickSet::CKTAdsPickSet(const CKTAdsPickSet& ssEnt) : m_bHighlight(FALSE), m_bGriplight(FALSE) { acedSSAdd(NULL, NULL, m_ssName); Add(ssEnt); ZeroMemory(m_entMark, sizeof(ads_name)); } // 构造函数 CKTAdsPickSet::CKTAdsPickSet(const ads_name ssName) : m_bHighlight(FALSE), m_bGriplight(FALSE) { acedSSAdd(NULL, NULL, m_ssName); Add(NULL, ssName); ZeroMemory(m_entMark, sizeof(ads_name)); } // 构造函数 CKTAdsPickSet::CKTAdsPickSet(const AcDbObjectIdArray& aridSet) : m_bHighlight(FALSE), m_bGriplight(FALSE) { acedSSAdd(NULL, NULL, m_ssName); Add(aridSet); ZeroMemory(m_entMark, sizeof(ads_name)); } // 析构函数 CKTAdsPickSet::~CKTAdsPickSet() { if (m_bHighlight) Highlight(FALSE); if (m_bGriplight) Griplight(FALSE); RemoveAll(); } // 开始记录实体创建 BOOL CKTAdsPickSet::PickStart() { // RemoveAll(); ads_point adsPt = {0.0, 0.0, 0.0}; struct resbuf* pRb = acutBuildList(RTDXF0, _T("POINT"), 10, adsPt, NULL); int iRet = acdbEntMake(pRb); CKTCadUtility::FreeRbList(pRb); return (RTNORM == iRet && RTNORM == acdbEntLast(m_entMark)); } // 结束记录实体创建 int CKTAdsPickSet::PickEnd() { BOOL bFind; int iCount = 0; ads_name adsEnt; struct resbuf *pRbHead, *pRb; CopyMemory(adsEnt, m_entMark, sizeof(ads_name)); while (acdbEntNext(adsEnt, adsEnt) == RTNORM) { pRbHead = acdbEntGet(adsEnt); for (pRb = pRbHead; NULL != pRb && !(bFind = (0 == pRb->restype && 0 != _tcsicmp(pRb->resval.rstring, _T("VERTEX")) && 0 != _tcsicmp(pRb->resval.rstring, _T("SEQEND")))); pRb = pRb->rbnext) ; CKTCadUtility::FreeRbList(pRbHead); if (bFind) { iCount++; acedSSAdd(adsEnt, m_ssName, m_ssName); } } acdbEntDel(m_entMark); ZeroMemory(m_entMark, sizeof(ads_name)); return iCount; } // 取得ObjectIdArray void CKTAdsPickSet::GetObjectIdArray(AcDbObjectIdArray& aridSet) const { AcDbObjectId id; ads_name adsName; Adesk::Int32 lLen = 0l; acedSSLength(m_ssName, &lLen); for (long l = 0l; l < lLen; l++) { acedSSName(m_ssName, l, adsName); acdbGetObjectId(id, adsName); aridSet.append(id); } } // 取得指定位置的实体 BOOL CKTAdsPickSet::GetAt(int i, ads_name adsEnt) const { return (acedSSName(m_ssName, i, adsEnt) == RTNORM); } BOOL CKTAdsPickSet::GetAt(int i, AcDbObjectId& idEnt) const { ads_name adsName; if (acedSSName(m_ssName, i, adsName) == RTNORM) { return (acdbGetObjectId(idEnt, adsName) == Acad::eOk); } return FALSE; } // 删除选择集 void CKTAdsPickSet::RemoveAll() { acedSSFree(m_ssName); acedSSAdd(NULL, NULL, m_ssName); } // 添加实体或选择集 CKTAdsPickSet& CKTAdsPickSet::Add(const CKTAdsPickSet& ssEnt) { Adesk::Int32 lLen = 0l; acedSSLength(ssEnt.m_ssName, &lLen); ads_name adsName; for (long l = 0l; l < lLen; l++) { acedSSName(ssEnt.m_ssName, l, adsName); acedSSAdd(adsName, m_ssName, m_ssName); } return (*this); } CKTAdsPickSet& CKTAdsPickSet::Add(const AcDbObjectId& idEnt) { ads_name adsName; acdbGetAdsName(adsName, idEnt); acedSSAdd(adsName, m_ssName, m_ssName); return (*this); } CKTAdsPickSet& CKTAdsPickSet::Add(const AcDbObjectIdArray& aridEnts) { ads_name adsName; int iLen = aridEnts.length(); for (int i = 0; i < iLen; i++) { acdbGetAdsName(adsName, aridEnts[i]); acedSSAdd(adsName, m_ssName, m_ssName); } return (*this); } CKTAdsPickSet& CKTAdsPickSet::Add(const ads_name adsEnt, const ads_name ssEnt) { if (adsEnt != NULL) { acedSSAdd(adsEnt, m_ssName, m_ssName); } if (ssEnt != NULL) { Adesk::Int32 lLen = 0l; acedSSLength(ssEnt, &lLen); ads_name adsName; for (long l = 0l; l < lLen; l++) { acedSSName(ssEnt, l, adsName); acedSSAdd(adsName, m_ssName, m_ssName); } } return (*this); } // 删除实体或选择集合 CKTAdsPickSet& CKTAdsPickSet::Delete(const CKTAdsPickSet& ssEnt) { Adesk::Int32 lLen = 0l; acedSSLength(ssEnt.m_ssName, &lLen); ads_name adsName; for (long l = 0l; l < lLen; l++) { acedSSName(ssEnt.m_ssName, l, adsName); acedSSDel(adsName, m_ssName); } return (*this); } CKTAdsPickSet& CKTAdsPickSet::Delete(const AcDbObjectId& idEnt) { ads_name adsName; if ( Acad::eOk == acdbGetAdsName(adsName, idEnt)) { Adesk::Int32 nLen = 0; acedSSLength(m_ssName,&nLen); if (nLen > 0) { acedSSDel(adsName, m_ssName); } } return (*this); } CKTAdsPickSet& CKTAdsPickSet::Delete(const AcDbObjectIdArray& aridEnts) { ads_name adsName; int iLen = aridEnts.length(); for (int i = 0; i < iLen; i++) { acdbGetAdsName(adsName, aridEnts[i]); acedSSDel(adsName, m_ssName); } return (*this); } CKTAdsPickSet& CKTAdsPickSet::Delete(const ads_name adsEnt, const ads_name ssEnt) { if (adsEnt != NULL) { acedSSDel(adsEnt, m_ssName); } if (ssEnt != NULL) { Adesk::Int32 lLen = 0l; acedSSLength(ssEnt, &lLen); ads_name adsName; for (long l = 0l; l < lLen; l++) { acedSSName(ssEnt, l, adsName); acedSSDel(adsName, m_ssName); } } return (*this); } BOOL CKTAdsPickSet::IsInPickSet(const AcDbObjectId& idEnt) const { ads_name adsName; acdbGetAdsName(adsName, idEnt); return (acedSSMemb(adsName, m_ssName) == RTNORM); } void CKTAdsPickSet::Highlight(BOOL bHighlight, BOOL bUpdate) { m_bHighlight = (bHighlight && bUpdate); if (bUpdate) { Adesk::Int32 lLen = 0l; acedSSLength(m_ssName, &lLen); ads_name adsName; for (long l = 0l; l < lLen; l++) { acedSSName(m_ssName, l, adsName); acedRedraw(adsName, (bHighlight ? 3 : 4)); } } } void CKTAdsPickSet::Griplight(BOOL bGriplight, BOOL bUpdate) { BOOL bNoCmd = (curDoc() != NULL && curDoc()->isQuiescent()); m_bGriplight = (bGriplight && bUpdate && bNoCmd); if (bUpdate && bNoCmd) { CKTAdsPickSet ssGrip, ssPick; struct resbuf* pRbGrip = NULL; struct resbuf* pRbPick = NULL; acedSSGetFirst(&pRbGrip, &pRbPick); // struct resbuf* pRb; for (pRb = pRbGrip; pRb != NULL; pRb = pRb->rbnext) { if (pRb->restype == RTPICKS) { ssGrip += pRb->resval.rlname; acedSSFree(pRb->resval.rlname); } } acutRelRb(pRbGrip); // for (pRb = pRbPick; pRb != NULL; pRb = pRb->rbnext) { if (pRb->restype == RTPICKS) { ssPick += pRb->resval.rlname; acedSSFree(pRb->resval.rlname); } } acutRelRb(pRbPick); if (bGriplight) { ssGrip += m_ssName; ssPick += m_ssName; } else { ssGrip -= m_ssName; ssPick -= m_ssName; } acedSSSetFirst((ssGrip.IsEmpty() ? NULL : ssGrip), (ssPick.IsEmpty() ? NULL : ssPick)); } } void CKTAdsPickSet::Distinct() { Adesk::Int32 lLen = 0l; acedSSLength(m_ssName, &lLen); ads_name adsName, adsFind; for (long l = 0l; l < lLen; l++) { acedSSName(m_ssName, l, adsName); for (long g = l+1; g < lLen; g++) { acedSSName(m_ssName, g, adsFind); if (adsName[0] == adsFind[0] && adsName[1] == adsFind[1]) { acedSSDel(adsFind, m_ssName); lLen--; g--; } } } } CKTAdsPickSet::operator AcDbObjectIdArray() { AcDbObjectIdArray arid; GetObjectIdArray(arid); return arid; } CKTAdsPickSet& CKTAdsPickSet::operator=(const CKTAdsPickSet& ssEnt) { RemoveAll(); Add(ssEnt); return (*this); } CKTAdsPickSet& CKTAdsPickSet::operator=(const ads_name ssEnt) { RemoveAll(); Add(NULL, ssEnt); return (*this); } // 操作符重载== BOOL CKTAdsPickSet::operator==(const CKTAdsPickSet& ssEnt) const { CKTAdsPickSet ssSet(ssEnt); ssSet.Delete(*this); return ssSet.IsEmpty(); } BOOL CKTAdsPickSet::operator==(const ads_name ssEnt) const { CKTAdsPickSet ssSet(ssEnt); ssSet.Delete(*this); return ssSet.IsEmpty(); }