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/WellAndSection/ActionWellTrackDeleteItem.cpp

173 lines
5.1 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "stdafx.h"
#include "WellPoleLib/TrackGroup.h"
#include "WellPoleLib/WellPole.h"
#include "ActionWellTrackDeleteItem.h"
CActionWellTrackDeleteItem::CActionWellTrackDeleteItem(CSigmaDoc* ppDoc, UINT actionType, TRACKLIST& delTrackList)
: CActionItem(ppDoc, actionType)
{
m_bDeleted = false;
m_bPerformOperation = false;
GetTrackInfo(delTrackList);
RemoveOperation();//执行删除过程就是保存删除的道注意使用这个删除就不要使用itemSingelWell中的删除它会真删除
//PerformOperation();
}
CActionWellTrackDeleteItem::~CActionWellTrackDeleteItem(void)
{
if (m_bDeleted == true)
{
for (int ii =0; ii< int(m_DelTrackInfos.size()); ii++)
{
if (m_DelTrackInfos[ii].pDelTrack)
delete m_DelTrackInfos[ii].pDelTrack;
if (m_DelTrackInfos[ii].pParentGroup)
delete m_DelTrackInfos[ii].pParentGroup;
}
m_DelTrackInfos.clear();
}
}
void CActionWellTrackDeleteItem::Undo(void)
{
CActionItem::Undo();
AddOperation();
}
void CActionWellTrackDeleteItem::Redo(void)
{
CActionItem::Redo();
RemoveOperation();
}
void CActionWellTrackDeleteItem::Finish()
{
if (!m_bPerformOperation)
RemoveOperation();
CActionItem::Finish();
}
void CActionWellTrackDeleteItem::AddOperation()
{
m_bDeleted = false;
if (m_DelTrackInfos.size() < 1)
return;
for (int ii = 0; ii < int(m_DelTrackInfos.size()); ii++)
{
if (m_DelTrackInfos[ii].pParentGroup)
{
CTrackObj* pBrotherTrack = NULL;
//获得被删除道的兄弟道,并将这个道从其父组合道中删除
if ((*m_DelTrackInfos[ii].groupTrackTrackList.begin()) == m_DelTrackInfos[ii].pDelTrack)
{
pBrotherTrack = *m_DelTrackInfos[ii].groupTrackTrackList.end();
}
else
pBrotherTrack = *m_DelTrackInfos[ii].groupTrackTrackList.begin();
CTrackGroup* ppTrackG = (CTrackGroup*)pBrotherTrack->GetParent();
ppTrackG->RemoveTrack(ppTrackG);
m_DelTrackInfos[ii].pParentGroup->GetTrackList().clear();
m_DelTrackInfos[ii].pParentGroup->GetTrackList().assign(m_DelTrackInfos[ii].groupTrackTrackList.begin(), m_DelTrackInfos[ii].groupTrackTrackList.end());
ppTrackG = (CTrackGroup*)m_DelTrackInfos[ii].pParentGroup->GetParent();
ppTrackG->AddTarckToPos(m_DelTrackInfos[ii].m_iDelParentGroupPos, m_DelTrackInfos[ii].pParentGroup);
}
else
{
CTrackGroup* ppTrackG = (CTrackGroup*)m_DelTrackInfos[ii].pDelTrack->GetParent();
ppTrackG->AddTarckToPos(m_DelTrackInfos[ii].m_iDelTrackPos,m_DelTrackInfos[ii].pDelTrack);
}
}
CTrackGroup* pTrackG = (CTrackGroup*)(m_DelTrackInfos[0].pDelTrack->GetParent());
CWellPole* pWell = pTrackG->GetWell();
CPoint2D ptf = pWell->GetAnchorPoint(); //->GetPos().TopLeft();
pWell->CalculateSize(ptf);
}
void CActionWellTrackDeleteItem::RemoveOperation()
{
m_bDeleted = true;
if (m_DelTrackInfos.size() < 1)
return;
for (int ii = 0; ii < int(m_DelTrackInfos.size()); ii++)
{
if (m_DelTrackInfos[ii].pParentGroup)
{
CTrackGroup* ppTrackG = (CTrackGroup*)m_DelTrackInfos[ii].pParentGroup;
ppTrackG->RemoveTrack(m_DelTrackInfos[ii].pParentGroup);
m_DelTrackInfos[ii].pParentGroup->GetTrackList().clear(); //移走父道的同时清空其子链表
CTrackObj* pBrotherTrack = NULL;
//获得被删除道的兄弟道,并将这个道插入父组合道的位置
if ((*m_DelTrackInfos[ii].groupTrackTrackList.begin()) == m_DelTrackInfos[ii].pDelTrack)
{
pBrotherTrack = *m_DelTrackInfos[ii].groupTrackTrackList.end();
}
else
pBrotherTrack = *m_DelTrackInfos[ii].groupTrackTrackList.begin();
ppTrackG->AddTarckToPos(m_DelTrackInfos[ii].m_iDelParentGroupPos, pBrotherTrack);
}
else
{
CTrackGroup* ppTrackG =(CTrackGroup*)m_DelTrackInfos[ii].pDelTrack->GetParent();
ppTrackG->RemoveTrack(m_DelTrackInfos[ii].pDelTrack);
}
}
CTrackGroup* pTrackG = (CTrackGroup*)(m_DelTrackInfos[0].pDelTrack->GetParent());
CWellPole* pWell = pTrackG->GetWell();
CPoint2D ptf = pWell->GetAnchorPoint(); //->GetPos().TopLeft();
pWell->CalculateSize(ptf);
}
void CActionWellTrackDeleteItem::GetTrackInfo(TRACKLIST& delTrackList)
{
DELTRACKINFO delTrackInfo;
TRACKLIST::iterator it = delTrackList.begin();
for (; it != delTrackList.end(); it++)
{
CTrackGroup* pTrackG = (CTrackGroup*)(*it)->GetParent();
if (pTrackG->GetTrackList().size() == 2 && pTrackG->GetType() != KEP_WELL)
{//此时删除一个道,会引发其父道的删除,并将兄弟道替补父亲道的行为,因此记录父亲道的信息
delTrackInfo.pDelTrack = *it;
delTrackInfo.m_iDelTrackPos = pTrackG->GetTrackPosInList(*it);
delTrackInfo.pParentGroup = pTrackG;
CTrackGroup* ppTrackG = (CTrackGroup*)pTrackG->GetParent();
delTrackInfo.m_iDelParentGroupPos = ppTrackG->GetTrackPosInList(pTrackG);
delTrackInfo.groupTrackTrackList.clear();
delTrackInfo.groupTrackTrackList.assign(pTrackG->GetTrackList().begin(), pTrackG->GetTrackList().end());//父道中的道链表保存起来,
m_DelTrackInfos.push_back(delTrackInfo);
}
else
{
delTrackInfo.pDelTrack = *it;
delTrackInfo.m_iDelTrackPos = pTrackG->GetTrackPosInList(*it);
delTrackInfo.pParentGroup = NULL;
delTrackInfo.m_iDelParentGroupPos = -1;
delTrackInfo.groupTrackTrackList.clear();
m_DelTrackInfos.push_back(delTrackInfo);
}
}
}
void NAction::CActionWellTrackDeleteItem::accept(CActionVisitor& visitor)
{
//visitor.visit(*this);
}