You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kev/Drawer/Module/GeoSigmaDraw/ItemMeshProcess.cpp

753 lines
16 KiB
C++

1 month ago
#include "StdAfx.h"
#include "ItemMeshProcess.h"
#include "SigmaDoc.h"
#include "SigmaView.h"
#include "itemmeshprocess.h"
#include "ActionBackupItem.h"
CItemMeshProcess::CItemMeshProcess(CSigmaDoc * ppDoc)
: CItemSelectCurve(ppDoc)
, m_nIdea(0)
{
this->SetType(ITEM_MESH_PROCESS);
m_pItemFocus=new CItemFocusRect(GetDoc());
num=1;
m_dValueZ=0;
m_nLineValueMode=0;
m_dLineValueStep=0;
m_nModeSetZ=0;
m_nVolumeMode=0;
}
CItemMeshProcess::~CItemMeshProcess(void)
{
if(m_pItemFocus) delete m_pItemFocus;
m_pItemFocus=NULL;
//RemoveAllSelect();
}
BOOL CItemMeshProcess::DoSelectEnd(void)
{
if(SelectList.GetCount()<1) return FALSE;
SELECT_ITEM st;
st=SelectList.GetHead();
CCurveEx *pc;
pc=(CCurveEx*)GetDoc()->GetDraw()->GetAtValue(st.pos);
switch(m_nIdea)
{
case MESH_GEOLOGICAL_SECTION:
GeologicalSection(pc);
break;
case MESH_VOLUME:
if(GetVolumeMode()!=-1)
Volume(pc, m_nVolumeMode);
break;
case MESH_SET_VALUE:
if(m_nModeSetZ==0)
SetValue(pc, m_dValueZ, FALSE);
else
SetValue(pc, m_dValueZ, TRUE);
break;
}
CItemSelectCurve::DoSelectEnd();
//GetDoc()->EnableDefaultTool();
return TRUE;
}
void CItemMeshProcess::DoLButtonUp(CRect8& rect)
{
CPositionList select;
GetDoc()->GetDraw()->IsInRange(rect, select);
switch(m_nIdea)
{
case MESH_CUT:
Cut(select);
break;
case MESH_LINE_VALUE:
{
//POSITION pos=GetDoc()->FindFirstElement(DOUBLEFOX_MESH);
//if(pos==NULL) break;
//CMesh* pMesh=(CMesh*)GetDoc()->GetDraw()->GetAtValue(pos);
//LineValue(pMesh, select);
}
break;
}
//GetDoc()->EnableDefaultTool();
}
void CItemMeshProcess::OnLButtonDown(CDC *pCDc, UINT nFlags, CPoint point, int vk)
{
switch(m_nIdea)
{
case MESH_LINE_VALUE:
case MESH_CUT:
//m_pItemFocus->OnLButtonDown(nFlags, point);
break;
default:
//CItemSelectCurve::OnLButtonDown(nFlags, point);
break;
}
}
int CItemMeshProcess::OnMouseMove(CDC *pDC, UINT nFlags, CPoint point)
{
switch(m_nIdea)
{
case MESH_LINE_VALUE:
case MESH_CUT:
//m_pItemFocus->OnMouseMove(nFlags, point);
break;
default:
//CItemSelectCurve::OnMouseMove(nFlags, point);
break;
}
return 1;
}
void CItemMeshProcess::OnLButtonUp(CDC *pDC, UINT nFlags, CPoint point, int vk)
{
switch(m_nIdea)
{
case MESH_LINE_VALUE:
case MESH_CUT:
//m_pItemFocus->OnLButtonUp(nFlags, point);
//{
// CRect8 rect=m_pItemFocus->GetRect();
// if(!rect.IsEmpty())
// DoLButtonUp(rect);
//}
break;
default:
//CItemSelectCurve::OnLButtonUp(nFlags, point);
break;
}
}
BOOL CItemMeshProcess::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch(m_nIdea)
{
case MESH_LINE_VALUE:
case MESH_CUT:
return m_pItemFocus->OnKeyUp(nChar, nRepCnt, nFlags);
break;
default:
return CItemSelectCurve::OnKeyUp(nChar, nRepCnt, nFlags);
break;
}
return FALSE;
}
BOOL CItemMeshProcess::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
switch(m_nIdea)
{
case MESH_LINE_VALUE:
case MESH_CUT:
return m_pItemFocus->OnSetCursor(pWnd, nHitTest, message);
break;
default:
return CItemSelectCurve::OnSetCursor(pWnd, nHitTest, message);
break;
}
return FALSE;
}
void CItemMeshProcess::SetProcessIdea(int nIdea)
{
m_nIdea=nIdea;
}
void CItemMeshProcess::GeologicalSection(CCurveEx* pSplit)
{
CMesh* pm;
CPtrList list;
COne* pOne;
CCurveEx* psection;
CPtrList* pl=GetDoc()->GetDraw()->GetValueList();
POSITION pos=pl->GetHeadPosition();
while(pos)
{
if(GetDoc()->GetDraw()->GetElementType(pos)==DOUBLEFOX_MESH)
{
pm=(CMesh*)GetDoc()->GetDraw()->GetAtValue(pos);
if(pm->GetDimension()==3) //<2F><>ά<EFBFBD><CEAC>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
CDimension3D* pdfg=new CDimension3D;
if(pm->CutSectionDfg(*pSplit, *(CDimension2D*)pdfg)>0)
{
CMesh* pp=new CMesh;
pp->m_nTimes = pm->m_nTimes;
pp->SetMesh(pdfg, MESH_DFG, FALSE);
pOne=new COne;
pOne->SetValue(pp, DOUBLEFOX_MESH);
list.AddTail(pOne);
}
else
delete pdfg;
}
else //<2F><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
psection=new CCurveEx;
if(pm->GeologicalSection(*pSplit, *psection)>0)
{
pOne=new COne;
pOne->SetValue(psection, DOUBLEFOX_CURVE);
list.AddTail(pOne);
}
else
delete psection;
}
}
pl->GetNext(pos);
}
if(list.GetCount()>0)
{
//CMainFrame* pmf = (CMainFrame*)GetDoc()->GetMainFrame();
//CDFDrawProDoc* pDocEnd = (CDFDrawProDoc*) pmf->GetDrawFrame().NewDocument();
POSITION pos=list.GetHeadPosition();
while(pos)
{
pOne=(COne*)list.GetNext(pos);
//pDocEnd->GetDraw()->AddElement(pOne->GetValue(), pOne->GetType());
m_pDoc->GetDraw()->AddElement(pOne->GetValue(), pOne->GetType());
pOne->value=NULL;
delete pOne;
m_pDoc->Modified();
m_pDoc->GetItemView()->Extend(EXTEND_MODE_DEFAULT);
}
}
}
void CItemMeshProcess::Volume(CCurveEx* pCurveRange, int mode)
{
CPoint3D point;
double v=0;
double cz=0; //<2F>պ<EFBFBD><D5BA><EFBFBD>
CMesh* pm;
CPtrList* pl=GetDoc()->GetDraw()->GetValueList();
POSITION pos=pl->GetHeadPosition();
while(pos)
{
if(GetDoc()->GetDraw()->GetElementType(pos)==DOUBLEFOX_MESH)
{
pm=(CMesh*)GetDoc()->GetDraw()->GetAtValue(pos);
switch(mode)
{
case 0: //<2F><><EFBFBD><EFBFBD>ͼ
if(pm->GetHightPoint(pCurveRange, point)>0) //<2F><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>
{
cz=pm->GetClosedZ(*pCurveRange, point.z0); //<2F><><EFBFBD><EFBFBD><EFBFBD>պ<EFBFBD><D5BA><EFBFBD>
v+=pm->Volume(*pCurveRange, cz); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
break;
case 1: //<2F>Ⱥ<EFBFBD>ͼ
v+=pm->Volume(*pCurveRange, 0); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
}
}
pl->GetNext(pos);
}
CString str;
AfxGetPublicFunction()->FloatToString(str, v);
CClipboard cp;
cp.SetText(str);
int i=str.ReverseFind('.');
i-=3;
while(i>0)
{
str.Insert(i,',');
i-=3;
}
CString txt;
txt.Format("Close Z: %lf\n%s", cz, str);
::AfxMessageBox(txt);
}
void NItem::CItemMeshProcess::SetValue(CCurveEx* pCurveRange, double z0, BOOL bInCurve)
{
CPositionList list;
//CActionBackupItem* pAction=new CActionBackupItem(GetDoc(), IDS_STRING_MESH_TITLE);
CPtrList curveList;
curveList.AddTail(pCurveRange);
CWaitCursor wc;
int count=0;
CMesh* pm;
CPtrList* pl=GetDoc()->GetDraw()->GetValueList();
POSITION pos=pl->GetHeadPosition();
while(pos)
{
if(GetDoc()->GetDraw()->GetElementType(pos)==DOUBLEFOX_MESH)
{
pm=(CMesh*)GetDoc()->GetDraw()->GetAtValue(pos);
//pAction->Backup(pos);
pm->SetValue(curveList, z0, bInCurve);
pm->GetBitmap();
count++;
}
pl->GetNext(pos);
}
if(count>0)
{
GetDoc()->Invalidate();
//GetDoc()->SetActionItem(pAction);
}
//else delete pAction;
}
int NItem::CItemMeshProcess::Cut(CMesh* pMesh, CPositionList& select)
{
if(pMesh==NULL) return 0;
double zmin=0, zmax=0;
pMesh->GetM(zmin, zmax);
double delt=zmax-zmin;
CWaitCursor wc;
COne* pOne;
CCurveEx* pCurve;
POSITION pos, pt;
CPtrList solidList, closeList;
pos=select.GetHeadPosition();
while(pos)
{
pt=select.GetNext(pos);
pOne=GetDoc()->GetDraw()->GetAt(pt);
if(pOne->GetType()!=DOUBLEFOX_CURVE) continue;
pCurve=(CCurveEx*)pOne->GetValue();
if(AfxGetPublicFunction()->IsCurveSolid(pCurve->m_type))
solidList.AddTail(pCurve);
else
closeList.AddTail(pCurve);
}
if(solidList.GetCount()>0)
pMesh->SetValue(solidList, zmin-delt, FALSE);
if(closeList.GetCount()>0)
pMesh->SetValue(closeList, zmin-delt, TRUE);
if(solidList.GetCount()>0 || closeList.GetCount()>0)
pMesh->GetBitmap();
return (int)(solidList.GetCount()+closeList.GetCount());
}
void NItem::CItemMeshProcess::Cut(CPositionList& select)
{
if(select.GetCount()==0) return;
CPositionList list;
//CActionBackupItem* pAction=new CActionBackupItem(GetDoc(), IDS_STRING_MESH_TITLE);
int count=0;
CMesh* pm;
CPtrList* pl=GetDoc()->GetDraw()->GetValueList();
POSITION pos=pl->GetHeadPosition();
while(pos)
{
if(GetDoc()->GetDraw()->GetElementType(pos)==DOUBLEFOX_MESH)
{
pm=(CMesh*)GetDoc()->GetDraw()->GetAtValue(pos);
//pAction->Backup(pos);
count+=Cut(pm, select);
}
pl->GetNext(pos);
}
if(count>0)
{
GetDoc()->Invalidate();
GetDoc()->Modified();
//GetDoc()->SetActionItem(pAction);
}
//else
// delete pAction;
}
int NItem::CItemMeshProcess::LineValue(CMesh* pMesh, CPositionList& select)
{
if(pMesh==NULL) return 0;
int count=0;
COne* pOne;
POSITION pos, pt;
//CActionBackupItem* pAction=new CActionBackupItem(GetDoc(), ID_PROCESS_SURFACE_LINEVALUE);
CPointList dp;
dfPoint point;
double dx, dy;
pMesh->GetDelt(dx, dy);
CRect8 range=pMesh->GetRect();
CCurveEx *pCurve;
pos=select.GetHeadPosition();
while(pos)
{
pt=select.GetNext(pos);
pOne=GetDoc()->GetDraw()->GetAt(pt);
if(pOne->GetType()!=DOUBLEFOX_CURVE) continue;
pCurve=(CCurveEx*)pOne->GetValue();
if(!pCurve->IsInRange(range)) continue;
//pAction->Backup(pt);
switch(m_nLineValueMode)
{
case 0://<2F><><EFBFBD><EFBFBD>Դ<EFBFBD>ڵ<EFBFBD>
for(int i=0;i<pCurve->num;i++)
{
if(!range.PtInRect(pCurve->x[i], pCurve->y[i]))continue;
pCurve->z[i]=pMesh->GetValue(pCurve->x[i], pCurve->y[i]);
if(pCurve->nPoint<3) pCurve->nPoint=3;
}
break;
case 1://<2F><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>²<EFBFBD>ֵ
if(m_dLineValueStep<1e-10)
m_dLineValueStep=min(dx, dy);
pCurve->GetPoint(0, point);
if(range.PtInRect(point.x0, point.y0))
point.z0=pMesh->GetValue(point.x0, point.y0);
dp.AddTail(point);
{
int si=1;
int i=0;
double l0=pCurve->l[0]+m_dLineValueStep;
double lmax=pCurve->l[pCurve->num-1];
if(pCurve->l[0]>pCurve->l[pCurve->num-1])
{
l0=pCurve->l[pCurve->num-1]+m_dLineValueStep;
lmax=pCurve->l[0];
si=-1;
i=pCurve->num-2;
}
while(l0<lmax)
{
if(l0>pCurve->l[i])
{
pCurve->GetPoint(i, point);
if(range.PtInRect(point.x0, point.y0))
point.z0=pMesh->GetValue(point.x0, point.y0);
dp.AddTail(point);
i+=si;
}
point.l=l0;
pCurve->GetCoordinate(point.l, point.x0, point.y0, point.z0);
if(range.PtInRect(point.x0, point.y0))
point.z0=pMesh->GetValue(point.x0, point.y0);
dp.AddTail(point);
l0+=m_dLineValueStep;
}
}
pCurve->GetPoint(pCurve->num-1, point);
if(range.PtInRect(point.x0, point.y0))
point.z0=pMesh->GetValue(point.x0, point.y0);
dp.AddTail(point);
if(pCurve->nPoint<3) pCurve->nPoint=3;
pCurve->SetPoints(dp, pCurve->nPoint, pCurve->bAutoLocation);
dp.RemoveAll();
break;
}
count++;
}
//if(count>0)
//{
//GetDoc()->SetModifiedFlag();
//GetDoc()->SetActionItem(pAction);
//}
//else
// delete pAction;
return count;
}
void NItem::CItemMeshProcess::OnOK(void)
{
}
void NItem::CItemMeshProcess::OnCancel(void)
{
}
/*
INT_PTR NItem::CItemMeshProcess::DoModal(UINT nID)
{
CString str;
str.LoadString(nID);
int i=str.Find("\n");
if(i>0) str=str.Left(i);
CPropertiesSheet sheet(str, GetView(), 0, FALSE);
sheet.SetItem(this);
return sheet.DoModal();
}
*/
void NItem::CItemMeshProcess::LineValue(void)
{
//INT_PTR rt=DoModal(MESH_LINE_VALUE);
//if(rt!=IDOK)
// GetDoc()->EnableDefaultTool();
}
bool NItem::CItemMeshProcess::CalculateVolume(CCurveEx* pCurveRange, int mode, double & zOut, double & volumeOut)
{
zOut = volumeOut = 0;
CPoint3D point;
double v = 0;
double cz = 0; //<2F>պ<EFBFBD><D5BA><EFBFBD>
bool bResult = false;
CMesh* pm;
CPtrList* pl = GetDoc()->GetDraw()->GetValueList();
POSITION pos = pl->GetHeadPosition();
while (pos)
{
if (GetDoc()->GetDraw()->GetElementType(pos) == DOUBLEFOX_MESH)
{
pm = (CMesh*)GetDoc()->GetDraw()->GetAtValue(pos);
switch (mode)
{
case 0: //<2F><><EFBFBD><EFBFBD>ͼ
if (pm->GetHightPoint(pCurveRange, point) > 0) //<2F><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>
{
cz = pm->GetClosedZ(*pCurveRange, point.z0); //<2F><><EFBFBD><EFBFBD><EFBFBD>պ<EFBFBD><D5BA><EFBFBD>
v += pm->Volume(*pCurveRange, cz); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bResult = true;
}
break;
case 1: //<2F>Ⱥ<EFBFBD>ͼ
v += pm->Volume(*pCurveRange, 0); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bResult = true;
break;
}
}
pl->GetNext(pos);
}
if (bResult)
{
zOut = cz;
volumeOut = v;
}
return bResult;
}
bool NItem::CItemMeshProcess::SetZOfSurface(CCurveEx* pCurveRange, int zMode, double zIn)
{
if (zMode < 0 || zMode >= 7)
return false;
if (zMode == 0)
{
if (pCurveRange == 0)
return false;
return SetZOfSurfaceInMode12(pCurveRange, zIn, FALSE);
}
else if (zMode == 1)
{
if (pCurveRange == 0)
return false;
return SetZOfSurfaceInMode12(pCurveRange, zIn, TRUE);
}
SetValueZ(zMode, zIn);
return true;
}
bool NItem::CItemMeshProcess::SetZOfSurfaceInMode12(CCurveEx* pCurveRange, double z, BOOL bInCurve)
{
CPositionList list;
CActionBackupItem* pAction = new CActionBackupItem(GetDoc(), IDS_STRING_MESH_TITLE);
CPtrList curveList;
curveList.AddTail(pCurveRange);
int count = 0;
CMesh* pm;
CPtrList* pl = GetDoc()->GetDraw()->GetValueList();
POSITION pos = pl->GetHeadPosition();
while (pos)
{
if (GetDoc()->GetDraw()->GetElementType(pos) == DOUBLEFOX_MESH)
{
pm = (CMesh*)GetDoc()->GetDraw()->GetAtValue(pos);
pAction->Backup(pos);
pm->SetValue(curveList, z, bInCurve);
pm->GetBitmap();
count++;
}
pl->GetNext(pos);
}
if (count > 0)
{
pAction->BackupNew();
GetDoc()->Invalidate();
GetDoc()->SetActionItem(pAction);
}
else
delete pAction;
return count != 0;
}
void NItem::CItemMeshProcess::SetValueZ(void)
{
//INT_PTR rt=DoModal(IDS_STRING_VALUE_Z);
//if(rt!=IDOK)
// GetDoc()->EnableDefaultTool();
//else
//{
// switch(m_nModeSetZ)
// {
// case 0: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߷<EFBFBD>Χ<EFBFBD>ڵ<EFBFBD>ֵΪaֵ
// case 1: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߷<EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD>ֵΪaֵ
// break;
// default:
// SetValueZ(m_nModeSetZ, m_dValueZ);
// GetDoc()->EnableDefaultTool();
// }
//}
}
void NItem::CItemMeshProcess::SetValueZ(int nModeSel, double z)
{
CPositionList list;
//CActionBackupItem* pAction=new CActionBackupItem(GetDoc(), IDS_STRING_VALUE_Z);
//CWaitCursor wc;
COne* pOne;
int count=0;
CMesh* pm;
CPtrList* pl=GetDoc()->GetDraw()->GetValueList();
POSITION pos=pl->GetHeadPosition();
while(pos)
{
pOne=GetDoc()->GetDraw()->GetAt(pos);
if( pOne->GetType()==DOUBLEFOX_MESH &&
pOne->GetLayer()->IsViewAndEdit() &&
pOne->IsView() )
{
pm=(CMesh*)GetDoc()->GetDraw()->GetAtValue(pos);
//pAction->Backup(pos);
pm->SetValueZ(z, nModeSel);
pm->GetBitmap();
count++;
GetDoc()->Modified();
}
pl->GetNext(pos);
}
//if(count>0)
//{
// GetDoc()->SetActionItem(pAction);
// GetDoc()->UpdatePropertyGridContent(NULL);
// GetDoc()->Invalidate();
//}
//else
// delete pAction;
}
void NItem::CItemMeshProcess::ScaleZ(void)
{
CString str;
str.LoadString(ID_PROCESS_SURFACE_SCALE_Z);
int i=str.Find("\n");
if(i>0) str=str.Left(i);
m_dValueZ=1.0;
//CPropertiesSheet sheet(str,GetView(),0,FALSE);
//sheet.SetItem(this);
//if(sheet.DoModal()!=IDOK) return;
CPositionList list;
//CActionBackupItem* pAction=new CActionBackupItem(GetDoc(), ID_PROCESS_SURFACE_SCALE_Z);
CWaitCursor wc;
COne* pOne;
int count=0;
CMesh* pm;
CPtrList* pl=GetDoc()->GetDraw()->GetValueList();
POSITION pos=pl->GetHeadPosition();
while(pos)
{
pOne=GetDoc()->GetDraw()->GetAt(pos);
if( pOne->GetType()==DOUBLEFOX_MESH &&
pOne->GetLayer()->IsViewAndEdit() &&
pOne->IsView() )
{
pm=(CMesh*)GetDoc()->GetDraw()->GetAtValue(pos);
//pAction->Backup(pos);
pm->ScaleZ(m_dValueZ);
GetDoc()->Modified();
count++;
}
pl->GetNext(pos);
}
//if(count>0)
//{
// GetDoc()->SetActionItem(pAction);
// GetDoc()->UpdatePropertyGridContent(NULL);
//}
//else
// delete pAction;
}
int NItem::CItemMeshProcess::GetVolumeMode(void)
{
//int bakMode=m_nIdea;
//SetProcessIdea(MESH_VOLUME_MODE_SELECT);
//CString str;
//str.LoadString(IDS_STRING_VOLUME_MESH);
//CPropertiesSheet sheet(str,GetView(),0,FALSE);
//sheet.SetItem(this);
//if(sheet.DoModal()!=IDOK)
//{
// SetProcessIdea(bakMode);
// return -1;
//}
//SetProcessIdea(bakMode);
return m_nVolumeMode;
}
void NItem::CItemMeshProcess::CutSlice(void)
{
//SetProcessIdea(MESH_CUT_SLICE);
//CDFDrawProView* pView = (CDFDrawProView*)GetDoc()->GetActiveView();
//COne* pOne = pView->GetSelectedOne(DOUBLEFOX_MESH);
//if(pOne==NULL) return;
//CMesh* pm=(CMesh*)pOne->GetValue();
//if(pm->GetDimension()!=3) return;
//m_dValueZ=((CDimension3D*)pm->GetMesh())->range[0];
//INT_PTR rt=DoModal(IDS_STRING_VALUE_Z);
//if(rt!=IDOK)
// return;
//CDimension3D* pdfg=new CDimension3D;
//if(pm->CutSlice(*(CDimension2D*)pdfg, m_dValueZ)<=0)
//{
// delete pdfg;
// return;
//}
//CMesh* pp=new CMesh;
//pp->SetMesh(pdfg, MESH_DFG, FALSE);
//CMainFrame* pmf = (CMainFrame*)GetDoc()->GetMainFrame();
//CDFDrawProDoc* pDocEnd = (CDFDrawProDoc*) pmf->GetDrawFrame().NewDocument();
//pDocEnd->GetDraw()->AddElement(pp, DOUBLEFOX_MESH);
//pDocEnd->SetModifiedFlag();
//pDocEnd->GetItemView().Extend(EXTEND_MODE_DEFAULT);
}