394 lines
7.7 KiB
C++
394 lines
7.7 KiB
C++
#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();
|
|
}
|