Files
envi-code/SourceCode/Code2026/CoreCommand/KTAdsPickSet.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

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();
}