📄 objlist.cpp
字号:
// ObjList.cpp: implementation of the CObjList class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ObjList.h"
#include "ObjRgn.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CObjList::CObjList()
{
m_pRoot = m_pLast = NULL;
m_pSelect = NULL;
m_pPrev = m_pNext = NULL;
}
CObjList::CObjList(CObjList& list)
{
m_pRoot = m_pLast = NULL;
m_pSelect = NULL;
CopyList(&list);
}
CObjList::~CObjList()
{
if( m_pRoot ) Clear();
}
BOOL CObjList::Add(CObjRgn* pObj)
{
if( m_pLast )
{
m_pLast->m_pNext = pObj;
pObj->m_pPrev = m_pLast;
m_pLast = pObj;
}
else
{
m_pRoot = pObj;
m_pLast = pObj;
}
pObj->m_Size = m_Size;
CObjRgn* pRgn = m_pRoot;
while(pRgn != pObj )
{
pObj->m_ObjRgn.CombineRgn( &(pObj->m_ObjRgn), &(pRgn->m_ObjRgn), RGN_DIFF );
pRgn = pRgn->m_pNext;
}
return TRUE;
}
BOOL CObjList::Delete(int n)
{
CObjRgn* pObj;
pObj = m_pRoot;
CObjRgn* pNext;
CObjRgn* pPrev;
for( int i = 0 ; i < n ; i++ )
{
if( !pObj ) return FALSE;
pObj = pObj->m_pNext;
}
if( pObj == m_pRoot )
{
m_pRoot = m_pRoot->m_pNext;
if( m_pRoot )
m_pRoot->m_pPrev = NULL;
else
m_pLast = NULL;
}
else if( pObj == m_pLast )
{
m_pLast = m_pLast->m_pPrev;
m_pLast->m_pNext = NULL;
}
else
{
pNext = pObj->m_pNext;
pPrev = pObj->m_pPrev;
pPrev->m_pNext = pNext;
pNext->m_pPrev = pPrev;
}
delete pObj;
return TRUE;
}
BOOL CObjList::Delete(CObjRgn* pObject)
{
CObjRgn* pObj;
pObj = pObject;
CObjRgn* pNext;
CObjRgn* pPrev;
if( pObj == m_pRoot )
{
m_pRoot = m_pRoot->m_pNext;
if( m_pRoot )
m_pRoot->m_pPrev = NULL;
else
m_pLast = NULL;
}
else if( pObj == m_pLast )
{
m_pLast = m_pLast->m_pPrev;
m_pLast->m_pNext = NULL;
}
else
{
pNext = pObj->m_pNext;
pPrev = pObj->m_pPrev;
pPrev->m_pNext = pNext;
pNext->m_pPrev = pPrev;
}
delete pObj;
return TRUE;
}
int CObjList::GetTotal()
{
int n = 0;
CObjRgn* pObj;
pObj = m_pRoot;
while(pObj)
{
n++;
pObj = pObj->m_pNext;
}
return n;
}
BOOL CObjList::Clear()
{
CObjRgn* pObj;
CObjRgn* pNext;
pObj = m_pRoot;
while(pObj)
{
pNext = pObj->m_pNext;
delete pObj;
pObj = pNext;
}
m_pRoot = m_pLast = m_pSelect = NULL;
return TRUE;
}
void CObjList::Paint(CDC* pDC, COLORREF col)
{
CObjRgn* pObj;
pObj = m_pRoot;
while(pObj)
{
if( pObj == m_pSelect )
pObj->Paint(pDC, RGB(255,255,0) );
else
pObj->Paint(pDC, col);
pObj = pObj->m_pNext;
}
}
CObjRgn* CObjList::GetObject(int n)
{
CObjRgn* pObj = m_pRoot;
for( int i = 0 ; i < n ; i++ )
{
if( !pObj ) return NULL;
pObj = pObj->m_pNext;
}
return pObj;
}
CObjRgn* CObjList::FindObject(CPoint point)
{
CObjRgn* pObj = m_pRoot;
while(pObj)
{
if( pObj->PtInRgn(point) ) return pObj;
pObj = pObj->m_pNext;
}
return NULL;
}
void CObjList::Select(CPoint point)
{
m_pSelect = FindObject(point);
}
void CObjList::ClearSelect()
{
m_pSelect = NULL;
}
void CObjList::ModifyEdge(CEdgeList* pList)
{
if( m_pSelect )
m_pSelect->Modify(pList);
else
{
CObjRgn* pObj = m_pRoot;
while(pObj)
{
if( pObj->Modify(pList) ) break;
pObj = pObj->m_pNext;
}
}
}
BOOL CObjList::Write(CFile* pFile)
{
CObjRgn* pObj;
pObj = m_pRoot;
int n = GetTotal();
pFile->Write( &n, sizeof(int) );
while(pObj)
{
if( !pObj->Write(pFile) ) return FALSE;
pObj = pObj->m_pNext;
}
return TRUE;
}
BOOL CObjList::Read(CFile* pFile)
{
CObjRgn* pObj;
int n;
pFile->Read( &n, sizeof(int) );
for( int i = 0 ; i < n ; i++ )
{
pObj = new CObjRgn;
if( pObj )
{
if( !pObj->Read(pFile) ) return FALSE;
Add(pObj);
}
else
return FALSE;
}
return TRUE;
}
CObjRgn* CObjList::GetSelected()
{
return m_pSelect;
}
void CObjList::Render(GLUquadricObj* pQuad, CImage* pImage, BOOL bGlobal)
{
CObjRgn* pObj = m_pRoot;
while(pObj)
{
pObj->Render(pQuad, pImage, bGlobal);
pObj = pObj->m_pNext;
}
}
void CObjList::SetSize(CSize size)
{
m_Size = size;
}
void CObjList::operator = (CObjList& list)
{
Clear();
CopyList(&list);
}
void CObjList::CopyList(CObjList* pList)
{
if( !pList ) return;
int n = pList->GetTotal();
CObjRgn* pObj;
for( int i = 0 ; i < n ; i++ )
{
pObj = new CObjRgn( *pList->GetObject(i) );
Add( pObj );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -