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.

2519 lines
72 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 "ItemWellSection.h"
#include "WellPoleLib/WellCommonDef.h"
#include "WellPoleLib/WellBaseObj.h"
#include "WellPoleLib/WellClassObjGroup.h"
#include "WellPoleLib/InTrackDepthSegment.h"
#include "WellPoleLib\InTrackResult.h"
#include "WellPoleLib\InTrackLayerGroup.h"
#include "WellPoleLib/WellPole.h"
#include "MultiWellSectionLib/FaultObj.h"
#include "MultiWellSectionLib\BendObj.h"
#include "MultiWellSectionLib/SectionWellObj.h"
#include "MultiWellSectionLib\WellSection.h"
#include "MultiWellSectionLib\VirtualWellObj.h"
#include "MultiWellSectionLib\MWSectionScaleBox.h"
//#include "WellPoleLib\InTrackStandardLayer.h"
#include "../ItemWellBase.h"
#include "ItemBend.h"
#include "ItemFault.h"
#include "ItemAddFault.h"
#include "ItemVirtualWell.h"
#include "ItemSectionWell.h"
#include "ItemWcsTrackIn.h"
#include "MultiWellSectionDoc.h"
#include "MultiWellSectionlView.h"
//#include "GDataBinder/DataBindTemplate.h"
BOOL GetLinesWithSegmentPt1(PointF &tp, PointF down, PointF local, PointF LinePt1, PointF LinePt2)
{
double x, y;
// 获取这两条线段所占的矩形区域
if (LinePt1.X == LinePt2.X&&local.X == down.X)
return FALSE;
if (LinePt1.Y == LinePt2.Y&&local.Y == down.Y)
return FALSE;
if (abs((local.X - down.X)*(LinePt1.Y - LinePt2.Y) - (local.Y - down.Y)*(LinePt1.X - LinePt2.X)) < 0.000001)
return FALSE; //两条直线平行
//如果某一条线段为横向水平线段
//if (fabs(down.X-local.X)<0.001)
if (down.X == local.X)
{
//那么交点的横坐标一定和该线段上所有点的横坐标相同
tp.X = down.X;
// 根据直角三角形三边之间的关系可以得出交点的纵坐标,看不懂的可以自己画个图
tp.Y = LinePt1.Y + (LinePt2.Y - LinePt1.Y)*(tp.X - LinePt1.X) / (LinePt2.X - LinePt1.X);
}
else//同理根据直角三角形三边之间的关系可以确立下面的公式,看不懂的可以自己画个图
{
x = ((local.Y - down.Y)*(LinePt2.X - LinePt1.X)*down.X - (LinePt2.Y - LinePt1.Y)*(local.X - down.X)*LinePt1.X
+ (LinePt1.Y - down.Y)*(local.X - down.X)*(LinePt2.X - LinePt1.X)) /
((local.Y - down.Y)*(LinePt2.X - LinePt1.X) - (local.X - down.X)*(LinePt2.Y - LinePt1.Y));
tp.X = x;//+0.000001;
//double k1,k2;
//k1 = (down.Y - local.Y)/(down.X - local.X); k2 = (LinePt1.Y - LinePt2.Y)/(LinePt1.X - LinePt2.X);
//double b1,b2;
//b1 = down.Y - k1*down.X; b2 = LinePt1.Y - k2*LinePt1.X;
//double xx = (b2-b1)/(k1-k2);
y = down.Y + (local.Y - down.Y)*(x - down.X) / (local.X - down.X);
tp.Y = y;//+0.000001;
if (LinePt1.Y == LinePt2.Y)
tp.Y = LinePt1.Y;
}
double maxx, minx, maxy, miny;
maxx = down.X > local.X ? down.X : local.X;
minx = down.X > local.X ? local.X : down.X;
maxy = down.Y > local.Y ? down.Y : local.Y;
miny = down.Y > local.Y ? local.Y : down.Y;
double lmaxx, lminx, lmaxy, lminy;
lmaxx = LinePt1.X > LinePt2.X ? LinePt1.X : LinePt2.X;
lminx = LinePt1.X > LinePt2.X ? LinePt2.X : LinePt1.X;
lmaxy = LinePt1.Y > LinePt2.Y ? LinePt1.Y : LinePt2.Y;
lminy = LinePt1.Y > LinePt2.Y ? LinePt2.Y : LinePt1.Y;
if (((minx - 0.000001) < tp.X && tp.X < (maxx + 0.000001))
&& (miny - 0.000001 < tp.Y && tp.Y < (maxy + 0.000001))
&& ((lminx - 0.000001) < tp.X && tp.X < (lmaxx + 0.000001))
&& (lminy - 0.000001 < tp.Y && tp.Y < (lmaxy + 0.000001)))
return TRUE;
return FALSE;
}
BOOL IsValidIntersect(PointF tp, int ptNum1, int l1id1, PointF down, int l1id2, PointF local, int ptNum2, int l2id1, PointF LinePt1, int l2id2, PointF LinePt2)
{
BOOL b = FALSE;
double dis = 1;
double tmp;
if (l1id1 == 0)
{
tmp = sqrt((tp.X - down.X)*(tp.X - down.X) + (tp.Y - down.Y)*(tp.Y - down.Y));
if (tmp < dis)
return b;
}
if (l1id2 == ptNum1 - 1)
{
tmp = sqrt((tp.X - local.X)*(tp.X - local.X) + (tp.Y - local.Y)*(tp.Y - local.Y));
if (tmp < dis)
return b;
}
if (l2id1 == 0)
{
tmp = sqrt((tp.X - LinePt1.X)*(tp.X - LinePt1.X) + (tp.Y - LinePt1.Y)*(tp.Y - LinePt1.Y));
if (tmp < dis)
return b;
}
if (l2id2 == ptNum2 - 1)
{
tmp = sqrt((tp.X - LinePt2.X)*(tp.X - LinePt2.X) + (tp.Y - LinePt2.Y)*(tp.Y - LinePt2.Y));
if (tmp < dis)
return b;
}
b = TRUE;
return b;
}
namespace NItem
{
CItemWellSection::CItemWellSection(CSigmaDoc* pDoc)
: CItemWcsSingleWell(pDoc)
{
SetType(ITEM_WELLSECTION);
m_bUseAddItem = FALSE;
m_pItemOilWaterBoundary = NULL;
m_pWellSection = NULL;
//m_bDeleteControls = TRUE;
//CMapSectionCtrl* pmf = (CMapSectionCtrl*)GetDoc()->GetActiveFrame()->GetMapCtrl();
//if(pmf)pmf->ShowToolBar(IDR_TOOLBAR_SECTIONWELL, TRUE);
}
CItemWellSection::~CItemWellSection(void)
{
if(m_pItemOilWaterBoundary != NULL)
{
delete m_pItemOilWaterBoundary;
m_pItemOilWaterBoundary = NULL;
}
//CMapSectionCtrl* pmf = (CMapSectionCtrl*)GetDoc()->GetActiveFrame()->GetMapCtrl();
//if(pmf)pmf->ShowToolBar(IDR_TOOLBAR_SECTIONWELL, FALSE);
}
CWellSection *CItemWellSection::GetWellSection()
{
return this->m_pWellSection; // (CWellSection *)GetDoc()->GetDraw()->GetAtValue(GetPos());
}
CItemWellBase* CItemWellSection::CreateItem(CWellBaseObj* pObj)
{
CItemWellBase* pItem = NULL;
if(pObj->GetType() == KEP_WELL)
{
CItemSectionWell* pItemSectionWell = new CItemSectionWell(GetDoc());
pItem = pItemSectionWell;
pItem->SetPos(GetPos());
pItemSectionWell->SetDrawObj(pObj);
//pItemSectionWell->SetWellFrame(FALSE);
}
else if(pObj->GetType() == KEP_SECTIONBEND)
{
pItem = new CItemBend(GetDoc());
pItem->SetPos(GetPos());
((CItemBend*)pItem)->SetDrawObj(pObj);
pItem->m_WellObjSelectlist.AddTail(pObj);
}
else if (pObj->GetType()==KEP_SECTIONFAULT)
{
pItem = new CItemFault(GetDoc());
pItem->SetPos(GetPos());
((CItemFault*)pItem)->SetDrawObj(pObj);
}
//else if (pObj->GetType()==KEP_SECTIONRULER)
//{
// pItem = new CItemRuler(GetWnd());
// pItem->SetPos(GetPos());
// ((CItemRuler*)pItem)->SetDrawObj((CRulerObj*)pObj);
//}
else if (pObj->GetType()==KEP_SECTIONVIRTUALWELL)
{
pItem = new CItemVirtualWell(GetDoc());
pItem->SetPos(GetPos());
((CItemVirtualWell*)pItem)->SetDrawObj((CVirtualWellObj*)pObj);
}
//else if (pObj->GetType()==KEP_SECTIONSCALEBOX)
//{
// pItem = new CItemScaleBox(GetWnd());
// pItem->SetPos(GetPos());
// ((CItemScaleBox*)pItem)->SetDrawObj(pObj);
//}
else if (pObj->GetType()==KEP_TEXTBOX)
{
//pItem = new CItemTextBox(GetWnd());
//pItem->SetPos(GetPos());
//((CItemTextBox*)pItem)->SetDrawObj(pObj);
}
else if (pObj->GetType()==KEP_MARK)
{
//pItem = new CItemWellMark(GetWnd());
//pItem->SetPos(GetPos());
//((CItemWellMark*)pItem)->SetDrawObj(pObj);
}
//else if (pObj->GetType()==DOUBLEFOX_ELLIPSE)
//{
// pItem = new CItemWellEllipse(GetWnd());
// pItem->SetPos(GetPos());
// ((CItemWellEllipse*)pItem)->SetDrawObj(pObj);
//}
//else if (pObj->GetType()==DOUBLEFOX_ARC)
//{
// pItem = new CItemWellArc(GetWnd());
// pItem->SetPos(GetPos());
// ((CItemWellArc*)pItem)->SetDrawObj(pObj);
//}
//else if (pObj->GetType()==KEP_SECTIONLINE)
//{
// pItem = new CItemWellEquilateral(GetWnd());
// pItem->SetPos(GetPos());
// ((CItemWellEquilateral*)pItem)->SetDrawObj(pObj);
//}
//else if (pObj->GetType()==KEP_SECTIONLEGEND)
//{
// pItem = new CItemLegend(GetWnd());
// pItem->SetPos(GetPos());
// ((CItemLegend*)pItem)->SetDrawObj(pObj);
//}
if(pItem != NULL)
pItem->SetItemSection(this);
return pItem;
}
void CItemWellSection::OnLButtonDown(CDC *pDC, UINT nFlags, CPoint point, int vk)
{
if(m_bUseAddItem)
{
if(m_pItemSelected != NULL)
{
m_pItemSelected->OnLButtonDown(pDC,nFlags,point,vk);
return;
}
}
m_bLDown = TRUE;
CPoint2D ptReal = GetDC()->GetReal(point);
m_downPoint = m_firstPoint = m_lastPoint = point;
selectMode = ESelectMode::selnone;
CWellSection *pWellSection = GetWellSection();
CWellBaseObj* pObj = NULL;
if (m_WellObjSelectlist.GetCount()==1)
{
pObj = m_WellObjSelectlist.GetHead();
int nHandleSize = HANDLESIZE;
double dHandleSize = GetDC()->GetRealSize(CSize(nHandleSize/2, nHandleSize/2)).cx;
nDragHandle = pObj->HitTest(ptReal,dHandleSize,TRUE);
if (nDragHandle!=0)
{
if(m_pItemSelected != NULL)
{
//m_pItemSelected->OnLButtonDown(pDC,nFlags, point,vk);
//return;
if (m_pItemSelected->GetType() != ITEM_BEND)
{
m_pItemSelected->OnLButtonDown(pDC, nFlags, point, vk);
return;
}
else
{//Bend 对象的选中操作复杂内部有几个选中区域只有本次Hit的点与前次选中的区域匹配才能认为是有效DragHandle.
CItemBend* pItemBend = (CItemBend*)m_pItemSelected;
CBendObj* pBend = (CBendObj*)pObj;
if (pItemBend->m_SelectCurveMode == CItemBend::CurveBend && pBend->m_HitTestSelectId == 1)
{
pItemBend->OnLButtonDownAfterHitTest(nFlags, point, nDragHandle,pDC);
return;
}
else if (pItemBend->m_SelectCurveMode == CItemBend::CurveTopLine && pBend->m_HitTestSelectId == 2)
{
pItemBend->OnLButtonDownAfterHitTest(nFlags, point, nDragHandle, pDC);
return;
}
else if (pItemBend->m_SelectCurveMode == CItemBend::CurveBotLine && pBend->m_HitTestSelectId == 3)
{
pItemBend->OnLButtonDownAfterHitTest(nFlags, point, nDragHandle, pDC);
return;
}
else
{
nDragHandle = 0;
}
}
}
if (nDragHandle != 0)
{
selectMode = ESelectMode::size;
}
}
}
if (selectMode==CItemSelect::selnone)
{
int nHandleSize= HANDLESIZE;
double dHandleSize = GetDC()->GetRealSize(CSize(nHandleSize/2, nHandleSize/2)).cx;
CRect8 r(ptReal.x0,ptReal.y0,ptReal.x0,ptReal.y0);
CSize8 sz=GetDoc()->GetSelectSize();
double sx=GetDC()->GetRealWidth(sz.cx);
double sy=fabs(GetDC()->GetRealHeight(sz.cy));
r.InflateRect(sx,sy);
pObj = pWellSection->ObjectAt(r,dHandleSize);
BOOL bChange = FALSE;
if(!IsSelected(pObj))
{
bChange = TRUE;
//OnDraw(GetDC());
if(m_pItemSelected != NULL)
{//井柱的选中操作使用的是贴图绘制方式即将选中的状态画到一个图片上然后贴到memdc上其它对象的选中绘制是使用Rop2方式两种方式需要协调一致。
BOOL oldItemWell = m_pItemSelected->GetType() == ITEM_SECTIONWELL ? TRUE : FALSE;
if (!oldItemWell)
OnDraw(GetDC()); //当选中的不是井时,需要绘制一次,消除前一个对象的绘制。
delete m_pItemSelected;
m_pItemSelected = NULL;
CMultiWellSectionView *pView = (CMultiWellSectionView*)GetView();
if (oldItemWell)
{//当前一个对象不是井时需要重新绘制一次选择bmpdc清楚上次井的对象的影响。
DrawHandle(GetDC());// (&xyDC);
}
else
{
if (pObj != NULL && pObj->GetType() == KEP_WELL)
GetDoc()->Invalidate();//当本次对象选中井时重绘一次整个的memdc,可以清除上次选中对象的影响。
}
}
}
//选中
Select(pObj);
if(pObj!=NULL)
{
selectMode = ESelectMode::move;
if(m_pItemSelected == NULL)
{
m_pItemSelected = CreateItem((CWellBaseObj*)pObj);
//if(m_pItemSelected != NULL)
// OnDraw(GetDC());
}
if(m_pItemSelected != NULL)
{
if (bChange)
{
m_pItemSelected->OnLButtonDown(pDC,nFlags, point,vk);
OnDraw(GetDC(),pDC);
return; //需要返回因为内部的item会修改属性页。
}
else
{
if (m_pItemSelected->GetType() != ITEM_WELL)//同一层位对象内部的选中状态发生了变化,所以需要自绘一次消除上次的影响。
{
//m_pItemSelected->OnDraw(GetDC(),pDC);
m_pItemSelected->OnLButtonDown(pDC,nFlags, point,vk);
//m_pItemSelected->OnDraw(GetDC(),pDC);
//OnDraw(GetDC());
return; //需要返回因为内部的item会修改属性页。
}
}
}
else
{
//GetView()->SetCapture();
}
}
else
{
//m_WellObjSelectlist.RemoveAll();
if(m_pItemSelected != NULL)
{
m_pItemSelected->OnLButtonDown(pDC,nFlags, point,vk);
return;
}
c_down = ptReal;
c_last = ptReal;
selectMode = netSelect;
//GetView()->SetCapture();
}
if(bChange)
OnDraw(GetDC(),pDC);
}
//刷新属性页
}
void CItemWellSection::OnLButtonUp(CDC *pDC, UINT nFlags, CPoint point, int vk)
{
//if (m_pItemOilWaterBoundary!=NULL)
//{
// ReleaseCapture();
// m_bDrag = FALSE;
// m_bLDown = FALSE;
// nDragHandle = 0;
// delete m_pItemOilWaterBoundary;
// m_pItemOilWaterBoundary=NULL;
//}
if(m_pItemSelected != NULL)
{
m_pItemSelected->OnLButtonUp(pDC,nFlags, point,vk);
return ;
}
m_firstPoint = m_lastPoint = point;
CPoint2D downPoint = GetDC()->GetReal(m_downPoint);
CPoint2D lastPoint = GetDC()->GetReal(m_lastPoint);
if((m_downPoint.x-m_lastPoint.x)!=0 || (m_downPoint.y-m_lastPoint.y)!=0)
{
if (m_WellObjSelectlist.GetCount() == 1)
{
CWellBaseObj* pObj = (CWellBaseObj* )m_WellObjSelectlist.GetHead();
CRect rect = GetDC()->GetScreen(pObj->GetPos());
rect.InflateRect(10,10);
GetDoc()->Invalidate();
if (IsCaptureState())
{
SetReUnDoAction();
if(selectMode==CItemSelect::move)
{
CRect8 position = pObj->GetPos();
CPoint2D delta(lastPoint.x0-downPoint.x0,lastPoint.y0-downPoint.y0);
pObj->m_delta = delta;
position.OffsetRect(delta.x0, delta.y0);
pObj->MoveTo(position);
}
else if (selectMode==CItemSelect::size && nDragHandle!=0)
{
//内置对象交互句柄
pObj->m_delta = CPoint2D(0,0);
CRect8 oldRectReal = pObj->GetPos();
pObj->MoveHandleTo(nDragHandle, lastPoint);
CRect8 newRectReal = pObj->GetPos();
////矩阵变换(针对椭圆类图元)
//REAL elements[6]; memset(elements,0,sizeof(REAL)*6);
//elements[0] = newRectReal.Width()/oldRectReal.Width();
//elements[1] = 0.0;
//elements[2] = 0.0;
//elements[3] = newRectReal.Height()/oldRectReal.Height();
//elements[4] = (double)m_lastPoint.x - (double)m_downPoint.x*elements[0];
//elements[5] = (double)m_lastPoint.y - (double)m_downPoint.y*elements[3];
//pObj->Transform(GetDC(), elements);
}
//重新计算剖面范围
CWellSection* pWellSection = GetWellSection();
pWellSection->ReSetPosition();
//GetView()->SetScrollBarRange();
rect = GetDC()->GetScreen(pObj->GetPos());
rect.InflateRect(10,10);
GetDoc()->Invalidate();
}
}
}
m_bDrag = FALSE;
m_bLDown = FALSE;
nDragHandle = 0;
CRect8 rect=GetRect();
DrawMode(pDC,&rect);
ReleaseCapture();
if(selectMode == netSelect)
DoLButtonUp(pDC);
}
void CItemWellSection::DoLButtonUp(CDC* pDC)
{
if(m_WellObjSelectlist.GetCount() > 0)
return;
CRect8 rect=GetRect();
CWellSection* pWellSection = GetWellSection();
CBendObj* pBend = NULL;
POSITION pos = pWellSection->m_BendList.GetTailPosition();
while(pos != NULL)
{
pBend = (CBendObj *)pWellSection->m_BendList.GetPrev(pos);
if (pBend->IsInRange(rect))
{
m_WellObjSelectlist.AddTail(pBend);
}
}
if(m_WellObjSelectlist.GetCount() > 0)
{
CItemBend* pItemBend= new CItemBend(GetDoc());
SetItem(pItemBend);
pItemBend->SetItemSection(this);
pItemBend->SetSelectCurveMode(CItemBend::CurveBend);
pItemBend->SetPos(GetPos());
pos = m_WellObjSelectlist.GetHeadPosition();
while(pos != NULL)
pItemBend->m_WellObjSelectlist.AddTail(m_WellObjSelectlist.GetNext(pos));
//m_WellObjSelectlist.RemoveAll();
pItemBend->OnDraw(GetDC(), pDC);
}
}
int CItemWellSection::OnMouseMove(CDC *pDC, UINT nFlags, CPoint point)
{
//if (m_pItemOilWaterBoundary!=NULL)
//{
// m_pItemOilWaterBoundary->OnMouseMove(pDC, nFlags, point);
// return;
//}
if(m_pItemSelected != NULL)
{
m_pItemSelected->OnMouseMove(pDC,nFlags, point);
return 0;
}
if(m_WellObjSelectlist.GetCount() == 0)
{
CItemSelect::OnMouseMove(pDC,nFlags, point);
return 1;
}
CPoint2D lastPoint = GetDC()->GetReal(point);
CWellBaseObj* pObjSelected = m_WellObjSelectlist.GetHead();
if(IsCaptureState() && m_bLDown)
{
//刷新
OnDraw(GetDC(), pDC);
m_bDrag = TRUE;
m_lastPoint = point;
if (selectMode==CItemSelect::move)// 移动图元(道头、曲线头)
{
CPoint2D endPoint = GetDC()->GetReal(m_lastPoint);
CPoint2D startPoint = GetDC()->GetReal(m_firstPoint);
CPoint2D delta(endPoint.x0-startPoint.x0,endPoint.y0-startPoint.y0);
pObjSelected->SetDelta(delta);
}
//刷新
OnDraw(GetDC(), pDC);
m_firstPoint = m_lastPoint;
}
else
m_lastPoint = point;
return 1;
}
BOOL CItemWellSection::OnSetCursor(CPoint pt, int& handle)
{
//if (m_pItemOilWaterBoundary!=NULL)
//{
// return m_pItemOilWaterBoundary->OnSetCursor(pWnd, nHitTest, message);
//}
if(m_pItemSelected != NULL)
{
return m_pItemSelected->OnSetCursor( pt, handle);
}
if(m_WellObjSelectlist.GetCount() == 0)
{
//SetCursor(AfxGetApp()->LoadStandardCursor(IDC_UPARROW));
handle = -1;
return TRUE;
}
CWellBaseObj* pObjSelected = m_WellObjSelectlist.GetHead();
CPoint2D lastPoint = GetDC()->GetReal(m_lastPoint);
int nHandleSize = HANDLESIZE; //
double dHandleSize = GetDC()->GetRealSize(CSize(nHandleSize/2, nHandleSize/2)).cx;
int nHandle = pObjSelected->HitTest(lastPoint,dHandleSize,TRUE);
if (nHandle != 0)
{
handle = -1;
}
else
handle = 4;
return TRUE;
}
int CItemWellSection::GetSubMenu()
{
// 井
int iRMenu = 0;
//if (m_pItemSelected!=NULL)
//{
// if (m_pItemSelected->GetType()==ITEM_VIRTUALWELL)
// {
// iRMenu = 35;
// }
// else if (m_pItemSelected->GetType()==ITEM_SCALE_RULER)
// {
// iRMenu = 37;
// }
// else if (m_pItemSelected->GetType()==ITEM_FAULT)
// {
// iRMenu = 39;
// }
// //else if (m_pItemSelected->GetType()==ITEM_TEXTBOX)
// //{
// // iRMenu = 41;
// //}
// //else if (m_pItemSelected->GetType()==ITEM_WELLMARK)
// //{
// // iRMenu = 42;
// //}
// else
// return m_pItemSelected->GetSubMenu();
//}
if(m_WellObjSelectlist.GetCount() == 0)
return 0;
if (m_pItemSelected != NULL)
return m_pItemSelected->GetSubMenu();
return iRMenu;
}
void CItemWellSection::OnDraw(CXyDC* pXyDC)
{
DrawHandle(pXyDC);// (GetDC());
if(m_pItemSelected != NULL)
{
m_pItemSelected->OnDraw(pXyDC);
}
}
void CItemWellSection::OnDraw(CXyDC* pXyDC,CDC* pDC)
{
DrawHandle(pXyDC);// (GetDC());
if (m_pItemSelected != NULL)
{
m_pItemSelected->OnDraw(pXyDC,pDC);
}
}
//删除井并删除相关bend层
void CItemWellSection::RemoveWell(CWellPole* pWellObj)
{
CWellSection* WellSection = GetWellSection();
POSITION posFind = WellSection->m_WellList.Find(pWellObj);
POSITION posTemp = posFind;
CWellPole* pPreWell = NULL;
CWellPole* pNextWell = NULL;
if (posFind==WellSection->m_WellList.GetHeadPosition())
{
WellSection->m_WellList.GetNext(posTemp);
if (posTemp!=NULL)
{
pNextWell = (CWellPole*)WellSection->m_WellList.GetNext(posTemp);
}
}
else if (posFind==WellSection->m_WellList.GetTailPosition())
{
WellSection->m_WellList.GetPrev(posTemp);
if (posTemp!=NULL)
{
pPreWell = (CWellPole*)WellSection->m_WellList.GetPrev(posTemp);
}
}
else
{
WellSection->m_WellList.GetPrev(posTemp);
if (posTemp!=NULL)
{
pPreWell = (CWellPole*)WellSection->m_WellList.GetPrev(posTemp);
}
posTemp = posFind;
(CWellPole*)WellSection->m_WellList.GetNext(posTemp);
if (posTemp!=NULL)
{
pNextWell = (CWellPole*)WellSection->m_WellList.GetNext(posTemp);
}
}
if (posFind!=NULL)
{
BOOL b1 = FALSE;
BOOL b2 = FALSE;
BOOL b3 = FALSE;
POSITION posBend = WellSection->m_BendList.GetHeadPosition();
while (posBend!=NULL)
{
CBendObj* pBend = (CBendObj*)WellSection->m_BendList.GetNext(posBend);
if (pBend->m_pWellLeft == pWellObj || pBend->m_pWellRight == pWellObj)
WellSection->DeleteBend(pBend);
//b1 = FALSE;
//b2 = FALSE;
//b3 = FALSE;
//CBendObj* pBend = (CBendObj*)WellSection->m_BendList.GetNext(posBend);
//if (pBend->m_pLayerLeft->GetWell() == pWellObj||(pBend->m_pLayerRight!=NULL&&pBend->m_pLayerRight->GetWell() ==pWellObj))
//{
// b1 = TRUE;
//}
//if (pPreWell!=NULL)
//{
// if (pBend->m_pLayerLeft->GetWell() == pPreWell&&pBend->m_pLayerRight==NULL&&pBend->m_ptEndBreak.x0>pPreWell->GetPos().right)
// {
// b2 = TRUE;
// }
//}
//if (pNextWell!=NULL)
//{
// if (pBend->m_pLayerLeft->GetWell() == pNextWell&&pBend->m_pLayerRight==NULL&&pBend->m_ptEndBreak.x0<pNextWell->GetPos().left)
// {
// b3 = TRUE;
// }
//}
//if (b1||b2||b3)
//{
// WellSection->DeleteBend(pBend);
//}
}
WellSection->m_WellList.RemoveAt(posFind);
m_pItemSelected = NULL;
delete pWellObj;
m_WellObjSelectlist.RemoveAll();
}
}
void CItemWellSection::OnLButtonDblClk(UINT nFlags, CPoint point)
{
if(m_bUseAddItem)
{
SetState(FALSE);
if(m_pItemSelected != NULL)
{
if (m_pItemSelected->GetType()==ITEM_ADDFAULT)
{
m_pItemSelected->OnLButtonDblClk(nFlags,point);//当新断层建立时执行该函数后m_pItemSelected将由CItemAddFault变化为CItemFault
Invalidate();
return;
}
delete m_pItemSelected;
}
m_pItemSelected = NULL;
}
else
{
if(m_pItemSelected != NULL)
{
m_pItemSelected->OnLButtonDblClk(nFlags,point);//当新断层建立时执行该函数后m_pItemSelected将由CItemAddFault变化为CItemFault
}
}
}
void CItemWellSection::Clear()
{
if(m_pItemSelected != NULL)
delete m_pItemSelected;
m_pItemSelected = NULL;
if(m_pItemOilWaterBoundary != NULL)
delete m_pItemOilWaterBoundary;
m_pItemOilWaterBoundary = NULL;
m_WellObjSelectlist.RemoveAll();
}
void CItemWellSection::DeleteItem()
{
CItemWellBase::DeleteItem();
if(m_pItemOilWaterBoundary != NULL)
delete m_pItemOilWaterBoundary;
m_pItemOilWaterBoundary = NULL;
m_WellObjSelectlist.RemoveAll();
}
int CItemWellSection::DeleteSelection(void)
{
//if (m_WellObjSelectlist.GetCount() == 0)
//{
// return;
//}
if (m_pItemSelected!=NULL)
{
if (m_pItemSelected->GetType() == ITEM_BEND || m_pItemSelected->GetType() == ITEM_FAULT)
SetReUnDoAction(FALSE, IDS_STRING_ACTION_MOVE,2);
else
SetReUnDoAction(FALSE);
((CItemWellBase*)m_pItemSelected)->DeleteSelection();
}
if (m_pItemSelected)
delete m_pItemSelected;
m_pItemSelected = NULL;
Clear();
GetWellSection()->ReSetPosition();
//GetView()->SetScrollBarRange();
GetDoc()->Invalidate();
return 1;
}
void SetBendDataForDFOld(CWellSection* pSection ,CBendObj* pBend ,CWellPole* pWell,CWellPole* pWellAnother, CWellBaseObj*pLayerDrawObj , CWellBaseObj* pTrackInObject, int nInt)
{
double xLeftValue, xRightValue;
pBend->GetBendXValue(xLeftValue, xRightValue);
pBend->m_nLithoBreakStyle = 2;
pBend->m_fLithoBreakWidth = 0.1;
pBend->m_fTopLithoBreakPoint = 0.5;
pBend->m_fBottomLithoBreakPoint = 0.5;
pBend->m_fOutBendControlLevel = 0.0;
if (pTrackInObject->GetType() == KEP_RESULT)
{
CInTrackResult* pLayerLeft = (CInTrackResult*)pBend->m_pLayerLeft;
CInTrackResult* pLayerRight = (CInTrackResult*)pBend->m_pLayerRight;
if ((pLayerLeft->m_strResult != pLayerRight->m_strResult) && !(pLayerLeft->m_strResult == "干层" || pLayerRight->m_strResult == "干层"))
{
pBend->m_fWaterTop = pBend->m_fGasBottom = pLayerLeft->GetPos().CenterPoint().y0 - (pLayerLeft->GetPos().CenterPoint().y0 - pLayerRight->GetPos().CenterPoint().y0) / 2;
}
}
double yLeftValue = pLayerDrawObj->GetPos().CenterPoint().y0;
double yRightValue = pTrackInObject->GetRect().CenterPoint().y0;
double HeightLeft = pLayerDrawObj->GetPos().Height();
double HeightRight = pTrackInObject->GetRect().Height();
if (nInt == 1)
{
pSection->ComputeBendPosition(pBend, yRightValue, yLeftValue, HeightRight, HeightLeft);
}
else if (nInt == 2)
{
pSection->ComputeBendPosition(pBend, yLeftValue, yRightValue, HeightLeft, HeightRight);
}
pBend->AddControlPoints(xLeftValue, yLeftValue, xRightValue, yRightValue, xRightValue - xLeftValue);
dfPoint ptTemp;
ptTemp.x0 = xLeftValue;
ptTemp.y0 = yLeftValue + HeightLeft * 0.5;
pBend->m_ptArrCurveTopOld.Add(ptTemp);
ptTemp.y0 = yLeftValue - HeightLeft * 0.5;
pBend->m_ptArrCurveBotOld.Add(ptTemp);
ptTemp.x0 = xRightValue;
ptTemp.y0 = yRightValue + HeightRight * 0.5;
pBend->m_ptArrCurveTopOld.Add(ptTemp);
ptTemp.y0 = yRightValue - HeightRight * 0.5;
pBend->m_ptArrCurveBotOld.Add(ptTemp);
//添加Bend的断层链表
pBend->SetSlotType();
pBend->BendAddFault();
pBend->ComputeSlopeAndConstant();
pBend->CreateBendLines();
CString strLithoLeft;
CString strLithoRight;
CString strResultLeft;
CString strResultRight;
if (pLayerDrawObj->GetType() == KEP_RESULT)
{
CInTrackResult* pLayerLeft = (CInTrackResult*)pBend->m_pLayerLeft;
strLithoLeft = pLayerLeft->m_strLitho;
strResultLeft = pLayerLeft->m_strResult;
if (NULL != pBend->m_pLayerRight)
{
CInTrackResult* pLayerRight = (CInTrackResult*)pBend->m_pLayerRight;
strLithoRight = pLayerRight->m_strLitho;
strResultRight = pLayerRight->m_strResult;
}
}
else if (pLayerDrawObj->GetType() == KEP_LAYERGROUP)
{
CInTrackLayerGroup* pLayerLeft = (CInTrackLayerGroup*)pBend->m_pLayerLeft;
strLithoLeft = pLayerLeft->m_strLitho;
if (NULL != pBend->m_pLayerRight)
{
CInTrackLayerGroup* pLayerRight = (CInTrackLayerGroup*)pBend->m_pLayerRight;
strLithoRight = pLayerRight->m_strLitho;
}
}
if ((/*!strLithoLeft.IsEmpty() && !strLithoRight.IsEmpty() && */strLithoLeft != strLithoRight) ||
(/*!strResultLeft.IsEmpty() && !strResultRight.IsEmpty() && */strResultLeft != strResultRight))
{
pBend->bBreakLithoTemp = TRUE;
pBend->CreateBendLithoBreak();
}
pBend->CreateBendFills();
pBend->SetShowFill(TRUE);
pBend->SetShowTopLine(TRUE);
pBend->SetShowBotLine(TRUE);
if (pSection->IsStratumSmooth())
{
pBend->SmoothBendLines();
}
}
void SetBendDataForResFormPCG(CWellSection* pSection, CBendObj* pBend, CWellPole* pWell, CWellPole* pWellAnother, CWellBaseObj*pLayerDrawObj, CWellBaseObj* pTrackInObject, int nInt)
{
pBend->SetSlotType();
if (pBend->m_pLayerRight->GetPos().left > pBend->m_pLayerLeft->GetPos().left)
{
pBend->m_ptBeginBreak.x0 = pBend->m_pLayerLeft->GetPos().right;
pBend->m_ptBeginBreak.y0 = pBend->m_pLayerLeft->GetPos().CenterPoint().y0;
CWellPole* pWellLeft = pBend->m_pWellLeft;
pBend->m_ptEndBreak.x0 = pBend->m_pLayerRight->GetPos().left;
pBend->m_ptEndBreak.y0 = pBend->m_pLayerRight->GetPos().CenterPoint().y0;
}
//逆连层
else
{
pBend->m_ptBeginBreak.x0 = pBend->m_pLayerLeft->GetPos().left;
pBend->m_ptBeginBreak.y0 = pBend->m_pLayerLeft->GetPos().CenterPoint().y0;
pBend->m_ptEndBreak.x0 = pBend->m_pLayerRight->GetPos().right;
pBend->m_ptEndBreak.y0 = pBend->m_pLayerRight->GetPos().CenterPoint().y0;
}
pBend->InitBendControlPoints();
}
BOOL compareTwoLayerName(CInTrackDepthSegment* pParentInTrack , CInTrackDepthSegment* pParentThatIn)
{
if (pParentInTrack->GetType() != pParentThatIn->GetType())
return FALSE;
if (pParentInTrack->GetLayerName() == pParentThatIn->GetLayerName())
return TRUE;
return FALSE;
}
//是否有bend与这个线段交叉
BOOL ComputeIntersectBend(CWellSection *pSection, CPoint2D pt1, CPoint2D pt2, CString leftWell, CString rightWell)
{
CPoint2D bpt1, bpt2, rpt;
POSITION pos = pSection->m_BendList.GetHeadPosition();
while (pos != NULL)
{
CBendObj *pBend = (CBendObj*)pSection->m_BendList.GetNext(pos);
if (pBend->m_pLayerRight != NULL)
{
if (pBend->m_pWellLeft->GetWellName() == leftWell && pBend->m_pWellRight->GetWellName() == rightWell)
{
bpt1 = pBend->m_pLayerLeft->GetRect().CenterPoint();
bpt2 = pBend->m_pLayerRight->GetRect().CenterPoint();
if (nsWellPoleFunc::LineIntersect(rpt, pt1, pt2, bpt1, bpt2))
{
return TRUE;
}
}
}
}
return FALSE;
}
////////////// 层按左右名称添加连层
void CItemWellSection::ConnectOnName(CWellBaseObj* pLayerDrawObj,int nInt, std::vector<CWellBaseObj*>& linkbends)
{
linkbends.clear();
ETrackType trackTypeClass[4]; //地层道的级别
trackTypeClass[0] = Track_Stratum;
trackTypeClass[1] = Track_OilLayerGroup;
trackTypeClass[2] = Track_SandLayer;
trackTypeClass[3] = Track_Result;
CTrackObj* pTrack = (CTrackObj*)pLayerDrawObj->GetParent();
int trackClassId = -1;
for (int i = 0; i < 4; i++)
{
if (trackTypeClass[i] == pTrack->GetTrackType())
{
trackClassId = i; break;
}
}
CTrackObj* pthisParent = NULL;
CWellPole * pWell = (CWellPole *)pTrack->GetParent();
if (trackClassId > 0)
{//获得当前连地层的父级别的地层道
for (int i = trackClassId - 1; i > -1; i--)
{
TRACKLIST tracklist;
pWell->GetAllTrack(&tracklist, trackTypeClass[i]);
if (tracklist.size() > 0)
{
if ((*tracklist.begin())->GetChildren().size() > 0)
{
pthisParent = (*tracklist.begin());
break;
}
}
}
}
CInTrackDepthSegment* pCurrentInTrack = (CInTrackDepthSegment*)pLayerDrawObj;
CInTrackDepthSegment* pParentInTrack = NULL;
if (pthisParent != NULL)
{
WELLOBJLIST::iterator it = pthisParent->GetChildren().begin();
for (; it!= pthisParent->GetChildren().end(); it++)
{
if ((*it)->IsTrackChildTopEnd())
{
CInTrackDepthSegment* ptIn = (CInTrackDepthSegment*)(*it);
if ((ptIn->m_fSdep - 0.0001) < pCurrentInTrack->m_fSdep && (ptIn->m_fEdep + 0.0001) > pCurrentInTrack->m_fEdep)
{
pParentInTrack = ptIn;
break;
}
}
}
}
CWellSection* pSection = (CWellSection*)pWell->GetParent();
if (NULL == pSection)
{
return;
}
CWellPole* pWellAnother = NULL;
POSITION posFind = pSection->m_WellList.Find(pWell);
if (nInt == 1)
{
pSection->m_WellList.GetPrev(posFind);
}
else if (nInt == 2)
{
pSection->m_WellList.GetNext(posFind);
}
if (posFind!=NULL)
{
if (nInt == 2)
{
pWellAnother = (CWellPole*)pSection->m_WellList.GetNext(posFind);
}
else if (nInt == 1)
{
pWellAnother = (CWellPole*)pSection->m_WellList.GetPrev(posFind);
}
}
if (pWellAnother == NULL)
{
return;
}
else
{
CInTrackDepthSegment* pParentThatIn = NULL;
CTrackObj* pthatParent = NULL;
if (pParentInTrack != NULL)
{//搜集两边同级别地层的父级地层道,父级地层, 获得对面井内的父级地层对象
TRACKLIST tracklist;
pWellAnother->GetAllTrack(&tracklist, pthisParent->GetTrackType());
if (tracklist.size() > 0)
{
if ((*tracklist.begin())->GetChildren().size() > 0)
{
pthatParent = (*tracklist.begin());
WELLOBJLIST::iterator it = pthatParent->GetChildren().begin();
for (; it != pthatParent->GetChildren().end(); it++)
{
if ((*it)->IsTrackChildTopEnd())
{
CInTrackDepthSegment* ptIn = (CInTrackDepthSegment*)(*it);
if (compareTwoLayerName(pParentInTrack, ptIn))
{
pParentThatIn = ptIn; break;
}
}
}
}
}
}
TRACKLIST tracklist;
pWellAnother->GetAllTrack(&tracklist, pTrack->GetTrackType());
TRACKLIST::iterator it = tracklist.begin();
for(; it!= tracklist.end(); it++)
{
CTrackObj* pNextTrackObj = (CTrackObj*)*it;
if (pNextTrackObj->GetTrackType() == pTrack->GetTrackType())
{
WELLOBJLIST::iterator wit = pNextTrackObj->GetChildren().begin();
for(; wit != pNextTrackObj->GetChildren().end(); wit++)
{
CWellBaseObj* pTrackInObject = *wit;
BOOL bName = FALSE;
if (!pTrackInObject->IsTrackChildTopEnd())
{
continue;
}
CInTrackDepthSegment* pt = (CInTrackDepthSegment*)pTrackInObject;
if (compareTwoLayerName(pCurrentInTrack, pt) == FALSE)
continue;
if(ComputeIntersectBend(pSection,pCurrentInTrack->GetRect().CenterPoint(), pt->GetRect().CenterPoint(), pWell->GetWellName(), pWellAnother->GetWellName()))
continue;
if (pParentThatIn)
{//进行连层的判断,防止出现跨越父级的串层。
if ((pParentThatIn->m_fSdep - 0.0001) < pt->m_fSdep && pt->m_fEdep < (pParentThatIn->m_fEdep + 0.0001))
bName = TRUE;
}
else
bName = TRUE;
if (bName)
{
POSITION posBend = pSection->m_BendList.GetHeadPosition();
BOOL bCreate = TRUE;
while (posBend!=NULL)
{
BOOL bFirst,bSceond,bThird;
CBendObj* pBend = (CBendObj*)pSection->m_BendList.GetNext(posBend);
if (nInt == 1)
{
/////////若两个层之间已经有连层则跳出 不创建新的连层
bFirst = (pBend->m_pLayerLeft == (CInTrackDepthSegment*)pTrackInObject && pBend->m_pLayerRight == (CInTrackDepthSegment*)pLayerDrawObj)
|| (pBend->m_pLayerRight == (CInTrackDepthSegment*)pTrackInObject && pBend->m_pLayerLeft == (CInTrackDepthSegment*)pLayerDrawObj);
////////若左边层已经连接了一个尖灭层则跳出 不创建新的连层
bSceond = pBend->m_pLayerLeft == (CInTrackDepthSegment*)pTrackInObject && pBend->m_pLayerRight == NULL
&& pBend->m_ptArrControls[0].X<pBend->m_ptArrControls[1].X;;
////////若当前层已经连接了一个尖灭层则跳出 不创建新的连层
bThird = pBend->m_pLayerLeft == (CInTrackDepthSegment*)pLayerDrawObj && pBend->m_pLayerRight == NULL
&& pBend->m_ptArrControls[0].X>pBend->m_ptArrControls[1].X;;
}
else if (nInt == 2)
{
/////////若两个层之间已经有连层则跳出 不创建新的连层
bFirst = (pBend->m_pLayerLeft == (CInTrackDepthSegment*)pTrackInObject && pBend->m_pLayerRight == (CInTrackDepthSegment*)pLayerDrawObj)
|| (pBend->m_pLayerRight == (CInTrackDepthSegment*)pTrackInObject && pBend->m_pLayerLeft == (CInTrackDepthSegment*)pLayerDrawObj);
////////若左边层已经连接了一个尖灭层则跳出 不创建新的连层
bSceond = pBend->m_pLayerLeft == (CInTrackDepthSegment*)pTrackInObject && pBend->m_pLayerRight == NULL
&& pBend->m_ptArrControls[0].X>pBend->m_ptArrControls[1].X;
////////若当前层已经连接了一个尖灭层则跳出 不创建新的连层
bThird = pBend->m_pLayerLeft == (CInTrackDepthSegment*)pLayerDrawObj && pBend->m_pLayerRight == NULL
&& pBend->m_ptArrControls[0].X<pBend->m_ptArrControls[1].X;
}
if (bFirst || bSceond || bThird)
{
bCreate = FALSE;
}
}
if (bCreate)
{
CBendObj *pBend = new CBendObj();
pBend->SetParent(pSection);
if (nInt == 1)
{
pBend->m_pWellLeft = pWellAnother;
pBend->m_pWellRight = pWell;
pBend->m_pLayerLeft = (CInTrackDepthSegment*)pTrackInObject;
pBend->m_LeftLayerName = ((CInTrackDepthSegment*)pTrackInObject)->GetLayerName();
pBend->m_pLayerRight =(CInTrackDepthSegment*)pLayerDrawObj;
pBend->m_RightLayerName = ((CInTrackDepthSegment*)pLayerDrawObj)->GetLayerName();
}
else
{
pBend->m_pWellLeft = pWell;
pBend->m_pWellRight = pWellAnother;
pBend->m_pLayerLeft = (CInTrackDepthSegment*)pLayerDrawObj;
pBend->m_LeftLayerName = ((CInTrackDepthSegment*)pLayerDrawObj)->GetLayerName();
pBend->m_pLayerRight = (CInTrackDepthSegment*)pTrackInObject;
pBend->m_RightLayerName = ((CInTrackDepthSegment*)pTrackInObject)->GetLayerName();
}
pBend->m_ptBeginBreak.x0 = pLayerDrawObj->GetPos().CenterPoint().x0;
pBend->m_ptEndBreak.x0 = pTrackInObject->GetRect().CenterPoint().x0;
CTrackObj* pTrack1 = (CTrackObj*)pBend->m_pLayerLeft->GetParent();
//// 若添加的连层与相关两口井之间已经存在的连层出现交叉情况则取消连层的创建(注意通过位置进行判断是否bend交叉)
POSITION pos = pSection->m_BendList.GetHeadPosition();
BOOL bBreak = FALSE;
while(pos != NULL)
{
CWellBaseObj* pObj = pSection->m_BendList.GetNext(pos);
if (pObj->GetType() == KEP_SECTIONBEND)
{
CBendObj* pBendObj = (CBendObj*)pObj;
CTrackObj* pTrack2 = (CTrackObj*)pBendObj->m_pLayerLeft->GetParent();
if (pTrack1->GetTrackType() != pTrack2->GetTrackType())
continue; //如果不是一种类型的层位bend不用比较
double topLeft,topRight;
double TLeft,TRight;
if (pBendObj->m_pLayerRight != NULL)
{
CWellPole* pWellLeft = (CWellPole*)pBendObj->m_pLayerLeft->GetWell();
CWellPole* pWellRight = (CWellPole*)pBendObj->m_pLayerRight->GetWell();
if ((pWellLeft == pWell && pWellRight ==pWellAnother) || (pWellLeft == pWellAnother && pWellRight == pWell))
{
if (pBendObj->m_pLayerRight->GetPos().left > pBendObj->m_pLayerLeft->GetPos().left)
{
topLeft = pBendObj->m_pLayerLeft->GetPos().top;
topRight = pBendObj->m_pLayerRight->GetPos().top;
}
else
{
topLeft = pBendObj->m_pLayerRight->GetPos().top;
topRight = pBendObj->m_pLayerLeft->GetPos().top;
}
if (pBend->m_pLayerRight->GetPos().left > pBend->m_pLayerLeft->GetPos().left)
{
TLeft = pBend->m_pLayerLeft->GetPos().top;
TRight = pBend->m_pLayerRight->GetPos().top;
}
else
{
TLeft = pBend->m_pLayerRight->GetPos().top;
TRight = pBend->m_pLayerLeft->GetPos().top;
}
BOOL bOne = topLeft > TLeft&&topRight < TRight;
BOOL bSecond = topLeft < TLeft&&topRight > TRight;
if (bOne || bSecond)
{
bBreak = TRUE;
break;
}
}
}
}
}
if (bBreak)
{
pBend = NULL;
delete pBend;
continue;
}
//////////按名称左连接
if (nInt == 1)
{
((CInTrackDepthSegment*)pLayerDrawObj)->m_BendLeftList.push_back(pBend);
((CInTrackDepthSegment*)pTrackInObject)->m_BendRightList.push_back(pBend);
ReOrederList(((CInTrackDepthSegment*)pLayerDrawObj)->m_BendLeftList,1);
ReOrederList(((CInTrackDepthSegment*)pTrackInObject)->m_BendRightList,2);
}
/////////按名称右链接
else if (nInt == 2)
{
((CInTrackDepthSegment*)pLayerDrawObj)->m_BendRightList.push_back(pBend);
((CInTrackDepthSegment*)pTrackInObject)->m_BendLeftList.push_back(pBend);
ReOrederList(((CInTrackDepthSegment*)pLayerDrawObj)->m_BendRightList,2);
ReOrederList(((CInTrackDepthSegment*)pTrackInObject)->m_BendLeftList,1);
}
if (pSection->m_bResForm)
{
SetBendDataForResFormPCG(pSection, pBend, pWell, pWellAnother, pLayerDrawObj, pTrackInObject, nInt);
}
else
SetBendDataForDFOld(pSection, pBend, pWell,pWellAnother, pLayerDrawObj, pTrackInObject, nInt);
pSection->m_BendList.AddTail(pBend);
linkbends.push_back(pBend);
}
}
}
break;
}
}
tracklist.clear();
}
}
//////层中连层链表的重新排序
BOOL bCompareBendLayer(WELLOBJLIST::iterator& it, WELLOBJLIST::iterator& nextIt, int nInt)
{
BOOL b = FALSE;
CWellBaseObj* pObj = *it;
CWellBaseObj* pObjAnOther = *nextIt;
if (pObj->GetType() == KEP_SECTIONBEND && pObjAnOther->GetType() == KEP_SECTIONBEND)
{
CBendObj* pBendObj = (CBendObj*)pObj;
CInTrackDepthSegment* pLayer = NULL;
CBendObj* pBendObjAnother = (CBendObj*)pObjAnOther;
CInTrackDepthSegment* pLayerAnother = NULL;
///////按连层左边层位的高低排序
if (nInt == 1)
{
if (pBendObj->m_pLayerLeft->GetPos().left < pBendObj->m_pLayerRight->GetPos().left)
{
pLayer = pBendObj->m_pLayerLeft;
}
else/////////若连层是逆连层(左边横坐标比右边横坐标大)
{
pLayer = pBendObj->m_pLayerRight;
}
}
///////按连层右边层位的高低排序
else if (nInt == 2)
{
if (pBendObj->m_pLayerLeft->GetPos().left < pBendObj->m_pLayerRight->GetPos().left)
{
pLayer = pBendObj->m_pLayerRight;
}
else/////////若连层是逆连层(左边横坐标比右边横坐标大)
{
pLayer = pBendObj->m_pLayerLeft;
}
}
///////按连层左边层位的高低排序
if (nInt == 1)
{
if (pBendObjAnother->m_pLayerLeft->GetPos().left < pBendObjAnother->m_pLayerRight->GetPos().left)
{
pLayerAnother = pBendObjAnother->m_pLayerLeft;
}
else/////////若连层是逆连层(左边横坐标比右边横坐标大)
{
pLayerAnother = pBendObjAnother->m_pLayerRight;
}
}
///////按连层右边层位的高低排序
else if (nInt == 2)
{
if (pBendObjAnother->m_pLayerRight->GetPos().left > pBendObjAnother->m_pLayerLeft->GetPos().left)
{
pLayerAnother = pBendObjAnother->m_pLayerRight;
}
else/////////若连层位逆连层(左边横坐标比右边横坐标大)
{
pLayerAnother = pBendObjAnother->m_pLayerLeft;
}
}
if (pLayerAnother->GetPos().top > pLayer->GetPos().top)
{
b = TRUE;
}
}
return b;
}
void CItemWellSection::ReOrederList(WELLOBJLIST& BendList, int nInt)
{
if (BendList.size() < 2)
return;
//根据层位置有高到低链表重新排序
bool swapped;
auto endIt = BendList.end(); // 用于优化,记录未排序部分的结束位置
do {
swapped = false;
WELLOBJLIST::iterator it = BendList.begin();
WELLOBJLIST::iterator nextIt = std::next(it);
while (nextIt != endIt)
{
if (bCompareBendLayer(it,nextIt,nInt))
{
std::iter_swap(it, nextIt);
swapped = true;
}
++it;
++nextIt;
}
--endIt; // 每次循环后,最大的元素已经冒泡到最后,无需再比较
} while (swapped); // 如果没有发生交换,说明已经有序
}
void CItemWellSection::ApplingTemplateFile(CFile &fr,BOOL bAll)
{
//应用模板的井链表
CWellBaseObjList WellList;
CWellSection * pSection = (CWellSection *)GetWellSection();
if (bAll)
{
POSITION posWell = pSection->m_WellList.GetHeadPosition();
while(posWell!=NULL)
{
CWellPole *pWellObj = (CWellPole *)pSection->m_WellList.GetNext(posWell);
WellList.AddTail(pWellObj);
}
}
else
{
if(m_WellObjSelectlist.GetCount() == 1)
{
CWellBaseObj* pDrawObj = (CWellBaseObj*)m_WellObjSelectlist.GetHead();
if (pDrawObj->GetType() == KEP_WELL)
{
CWellPole *pWellObj = (CWellPole *)pDrawObj;
WellList.AddTail(pWellObj);
}
}
}
BOOL bDelete = FALSE;
CPointArr fDistance;
//////保存井之间的间距
POSITION posSectionWell = pSection->m_WellList.GetHeadPosition();
CWellPole* pWellNext = NULL;
while(posSectionWell != NULL)
{
CWellPole* pWellObj = (CWellPole*)pSection->m_WellList.GetNext(posSectionWell);
POSITION posFind = pSection->m_WellList.Find(pWellObj);
pSection->m_WellList.GetNext(posFind);
if (posFind!=NULL)
{
pWellNext = (CWellPole*)pSection->m_WellList.GetNext(posFind);
dfPoint temppoint;
temppoint.x0 = pWellNext->GetPos().left - pWellObj->GetPos().right;
fDistance.Add(temppoint);
}
}
//////保存断层在两口井之间的相对位置
POSITION posBend = pSection->m_BendList.GetHeadPosition();
//while(NULL != posBend)
//{
// double XLeft = 0.0;
// double XRight = 0.0;
// CBendObj* pBend = (CBendObj*)pSection->m_BendList.GetNext(posBend);
// pBend->GetBendXValue(XLeft,XRight);
// for (int i = 0; i<pBend->m_faultArr.GetCount(); i++)
// {
// CFaultObj* pFault = (CFaultObj*)pBend->m_faultArr.GetAt(i).pFault;
// for (int j = 0;j<pFault->m_ptArr.GetCount(); j++)
// {
// pFault->m_ptArr[j].z0 = pFault->m_ptArr[j].x0-XLeft;
// }
// }
//}
POSITION posWell = WellList.GetHeadPosition();
while(posWell!=NULL)
{
CWellPole *pWellObj = (CWellPole *)WellList.GetNext(posWell);
fr.SeekToBegin();
//备份井内道对象
TRACKLIST tracklist;
tracklist.assign(pWellObj->GetTrackList().rbegin(), pWellObj->GetTrackList().rend()); // 这样将井的所有道,包括组合道都获得
//pWellObj->GetAllTrack(&tracklist);
pWellObj->GetTrackList().clear(); // ->RemoveAll();
CString strWellTitle = pWellObj->m_strTitle;
CString strWellName = pWellObj->GetWellName();
double fx = 0.0;
double fy = 0.0;
fx = ((CSectionWellObj*)pWellObj)->m_fX;
fy = ((CSectionWellObj*)pWellObj)->m_fY;
double fLevel = pWellObj->m_fLevel;
double topDepth = pWellObj->m_dSdep;
double endDepth = pWellObj->m_dEdep;
double left = pWellObj->GetPos().left;
double proportion = pWellObj->m_fProportion;
double dOldTrackHead = pWellObj->m_dHeightTrackHead;
double dOldWellHead = pWellObj->m_dHeightWellHead;
double tracktop = pWellObj->GetPos().top-dOldWellHead-dOldTrackHead;
double nWellId = pWellObj->GetId();
std::vector<CWellPole::well_interval > oldWellIntervalVec;
oldWellIntervalVec.insert(oldWellIntervalVec.begin(),pWellObj->GetIntervalVec()->begin(),pWellObj->GetIntervalVec()->end());
AfxGetPublicFunction()->SetCodeType(CODE_GB2321);
if(pWellObj->ReadPCG(fr, -1) == 0)
{
//恢复道备份
pWellObj->GetTrackList().assign(tracklist.begin(), tracklist.end());
tracklist.clear();
return ;
}
else
{
////释放以前的组对象
pWellObj->m_strTitle = strWellTitle;
pWellObj->SetWellName(strWellName);
//pWellObj->ReSetWellHead();
pWellObj->m_fLevel = fLevel;
((CSectionWellObj*)pWellObj)->m_fX=fx;
((CSectionWellObj*)pWellObj)->m_fY=fy;
pWellObj->GetPos().left = left;
pWellObj->GetPos().top = tracktop+pWellObj->m_dHeightWellHead+pWellObj->m_dHeightTrackHead;
pWellObj->m_dSdep = topDepth;
pWellObj->m_dEdep = endDepth;
pWellObj->GetIntervalVec()->clear();
pWellObj->GetIntervalVec()->insert(pWellObj->GetIntervalVec()->begin(),oldWellIntervalVec.begin(),oldWellIntervalVec.end());
pWellObj->m_fProportion = proportion;
pWellObj->m_fMarginLR = pWellObj->m_fMarginTB = 0.0;
pWellObj->SetId(nWellId);
pWellObj->CalculateSize(pWellObj->GetPos().TopLeft());
//应用井模板
TRACKLIST::iterator it;
pWellObj->GetTemplateList().assign(tracklist.begin(), tracklist.end());
//多井剖面时,重新设置连层指针
tracklist.clear();
pWellObj->GetAllTrack(&tracklist);
POSITION posBend = pSection->m_BendList.GetTailPosition();
while(posBend != NULL)
{
CBendObj* pBend = (CBendObj*)pSection->m_BendList.GetPrev(posBend);
if (pBend->m_pWellLeft == pWellObj || pBend->m_pWellRight == pWellObj)
{
BOOL bExist = FALSE;
it = tracklist.begin();
for(; it!= tracklist.end(); it++)
{
CTrackObj *pTrack = *it;
if (((CTrackObj*)pBend->m_pLayerLeft->GetParent())->GetTrackType() == pTrack->GetTrackType())
{
bExist = TRUE;
break;
}
else if (pBend->m_pLayerRight != NULL &&
((CTrackObj*)pBend->m_pLayerRight->GetParent())->GetTrackType() == pTrack->GetTrackType())
{
bExist = TRUE;
break;
}
else if (pBend->m_pLayerRight == NULL && pBend->m_pWellRight == pWellObj)
{
bExist = TRUE;
break;
}
}
if (!bExist)
{
pSection->DeleteBend(pBend);
}
}
}
tracklist.clear();
pWellObj->ApplingTemplate(TRUE,pWellObj->m_dHeightTrackHead,pWellObj->m_dHeightWellHead);
CItemWcsSingleWell itemwell(GetDoc());
itemwell.ImportDataAll(pWellObj, FALSE);
}
//AfxGetPublicFunction()->SetCodeType((DWORD)::GetPreferences().WorkaroundSave.m_nCodeMode);
}
fr.Close();
//重新计算连层
CRect8 oldrect = pSection->GetRect();
if (fDistance.GetCount()>0)
{
int nWell = 0;
double dWellRight = 0;
POSITION pos = pSection->m_WellList.GetHeadPosition();
while (pos != NULL)
{
CWellPole* pWellObj = (CWellPole*)pSection->m_WellList.GetNext(pos);
//重新计算井位置
if(nWell > 0)
{
pWellObj->GetPos().left = fDistance.GetAt(nWell-1).x0 + dWellRight;
pWellObj->CalculateSize(pWellObj->GetPos().TopLeft());
}
nWell ++;
dWellRight = pWellObj->GetPos().right;
}
}
posWell = pSection->m_WellList.GetHeadPosition();
while(posWell!=NULL)
{
CWellPole *pWellObj = (CWellPole *)pSection->m_WellList.GetNext(posWell);
pSection->ReComputeBends(pWellObj);
}
//////重新计算断层的位置
posBend = pSection->m_BendList.GetHeadPosition();
while(NULL != posBend)
{
double XLeft = 0.0;
double XRight = 0.0;
CBendObj* pBend = (CBendObj*)pSection->m_BendList.GetNext(posBend);
pBend->GetBendXValue(XLeft,XRight);
for (int i = 0; i<pBend->m_faultArr.GetCount(); i++)
{
CFaultObj* pFault = (CFaultObj*)pBend->m_faultArr.GetAt(i).pFault;
for (int j = 0;j<pFault->m_ptArr.GetCount(); j++)
{
pFault->m_ptArr.GetAt(j).x0 = XLeft + pFault->m_ptArr.GetAt(j).z0;
}
}
}
POSITION posFault = pSection->m_FaultList.GetHeadPosition();
while(posFault != NULL)
{
CFaultObj* pFault = (CFaultObj*)pSection->m_FaultList.GetNext(posFault);
pFault->FaultReCut();
}
//计算剖面范围
pSection->ReSetPosition();
//刷新
CRect8 rect = pSection->GetRect();
rect.CombinRect(oldrect);
CRect rt = GetDC()->GetScreen(rect);
rt.InflateRect(10,10);
GetDoc()->Invalidate();
WellList.RemoveAll();
}
void CItemWellSection::ApplingWellDbTemplate(BOOL bAll)
{
//CDlgApplyTemplate dlg("Section");
//if(dlg.DoModal() == IDCANCEL)
// return;
//if(dlg.m_pMemFile)
// ApplingTemplateFile(*dlg.m_pMemFile,bAll);
}
void CItemWellSection::ApplingWellTemplate(BOOL bAll)
{
//撤销
//SetReUnDoAction(FALSE);
//CFileDialog dlg(TRUE,NULL,"", OFN_EXPLORER|OFN_ENABLESIZING|OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT,
// "Well Template (*.dml)|*.dml|",NULL,0);
//CString filepathstr;
//if (dlg.DoModal()!=IDOK)
//{
// return;
//}
////保存路径
//filepathstr=dlg.GetPathName();
//CString ext = dlg.GetFileExt();
//if(ext == "dml") //dml格式
//{
// SetReUnDoAction(FALSE);
// CStdioFile fr;
// if(!fr.Open(filepathstr,CFile::modeRead))
// return;
// ApplingTemplateFile(fr,bAll);
//}
}
void CItemWellSection::GetLegendObject(const CStringArray &StyleList,CRect8 rt)
{
if (NULL == m_pWellSection || StyleList.GetCount() == 0)
{
return;
}
CXy* pXy = (CXy*)m_pWellSection->GetParentXY();
if (NULL == pXy)
{
return;
}
WELLOBJLIST Objectlist;
CStringArray StrArr;
POSITION pos = m_pWellSection->m_WellList.GetHeadPosition();
//while(pos)
//{
// CWellBaseObj* pObj = (CWellBaseObj*)m_pWellSection->m_WellList.GetNext(pos);
// if (pObj->GetType() == KEP_WELL)
// {
// CWellPole* pWell = (CWellPole*)pObj;
// GetSymbolObj(Objectlist,StyleList,pWell);
// }
//}
//CreatLegendObject(Objectlist,rt,pXy);
}
void CItemWellSection::ConnectLayer(CSectionWellObj* pWell, int TrackType, int layerType)
{
CTrackObj* pTrack = NULL;
//////地层连层
pTrack = pWell->FindTrack(ETrackType(TrackType));
std::vector<CWellBaseObj*> linkBends;
if (NULL != pTrack)
{
//POSITION pos1 = pTrack->GetChildObjList().GetHeadPosition();
WELLOBJLIST::iterator pos1 = pTrack->GetChildren().begin();
for (; pos1 != pTrack->GetChildren().end(); pos1++)
{
CWellBaseObj* pObj1 = *pos1;
if (pObj1->GetType() == layerType)
{
CInTrackDepthSegment* pTopEnd = (CInTrackDepthSegment*)pObj1;
if (pTopEnd->m_fSdep >= pWell->m_dSdep && pTopEnd->m_fEdep <= pWell->m_dEdep)
{
ConnectOnName(pTopEnd, 2,linkBends);
}
}
}
}
}
void CItemWellSection::CreateLayers()
{
if (NULL == m_pWellSection)
{
return;
}
POSITION pos = m_pWellSection->m_WellList.GetHeadPosition();
while(pos != m_pWellSection->m_WellList.GetTailPosition())
{
CWellBaseObj* pObj = m_pWellSection->m_WellList.GetNext(pos);
if (pObj->GetType() == KEP_WELL)
{
CSectionWellObj* pWell = (CSectionWellObj*)pObj;
ConnectLayer(pWell, Track_Stratum, KEP_LAYERGROUP); //地层连层
ConnectLayer(pWell, Track_StandardLayer, KEP_STANDARD); //标准层连层
ConnectLayer(pWell, Track_OilLayerGroup, KEP_LAYERGROUP); //油层组连层
ConnectLayer(pWell, Track_SandLayer, KEP_LAYERGROUP); //砂层组连层
ConnectLayer(pWell, Track_Result, KEP_RESULT);///解释连层
}
}
if (m_pWellSection->m_bResForm)
{//在这种情况下上面的操作只是生成了bend并进行ben的参数设置。
m_pWellSection->ComputeAllBendsTopBottomForResForm();
m_pWellSection->ComputeAllBendsByThreads();
}
}
void CItemWellSection::CreateLayers(std::vector<int>layersTrackType)
{
if (NULL == m_pWellSection)
{
return;
}
POSITION pos = m_pWellSection->m_WellList.GetHeadPosition();
while (pos != m_pWellSection->m_WellList.GetTailPosition())
{
CWellBaseObj* pObj = m_pWellSection->m_WellList.GetNext(pos);
if (pObj->GetType() == KEP_WELL)
{
CSectionWellObj* pWell = (CSectionWellObj*)pObj;
for (int i = 0; i < layersTrackType.size(); i++)
{
if(layersTrackType[i] == Track_Stratum)
ConnectLayer(pWell, Track_Stratum, KEP_LAYERGROUP);
if (layersTrackType[i] == Track_StandardLayer)
ConnectLayer(pWell, Track_StandardLayer, KEP_STANDARD);
if (layersTrackType[i] == Track_OilLayerGroup)
ConnectLayer(pWell, Track_OilLayerGroup, KEP_LAYERGROUP);
if (layersTrackType[i] == Track_SandLayer)
ConnectLayer(pWell, Track_SandLayer, KEP_LAYERGROUP);
if (layersTrackType[i] == Track_Result)
ConnectLayer(pWell, Track_Result, KEP_RESULT);
}
//ConnectLayer(pWell, Track_Stratum, KEP_LAYERGROUP); //地层连层
//ConnectLayer(pWell, Track_StandardLayer, KEP_STANDARD); //标准层连层
//ConnectLayer(pWell, Track_OilLayerGroup, KEP_LAYERGROUP); //油层组连层
//ConnectLayer(pWell, Track_SandLayer, KEP_LAYERGROUP); //砂层组连层
//ConnectLayer(pWell, Track_Result, KEP_RESULT);///解释连层
}
}
if (m_pWellSection->m_bResForm)
{//在这种情况下上面的操作只是生成了bend并进行ben的参数设置。
m_pWellSection->ComputeAllBendsTopBottomForResForm();
m_pWellSection->ComputeAllBendsByThreads();
}
}
void CItemWellSection::BreakLayers()
{
if (NULL == m_pWellSection)
{
return;
}
POSITION pos = m_pWellSection->m_BendList.GetTailPosition();
while(pos != NULL)
{
CWellBaseObj* pObj = m_pWellSection->m_BendList.GetPrev(pos);
m_pWellSection->DeleteBend((CBendObj*)pObj);
}
m_pWellSection->m_BendList.RemoveAll();
if (this->m_pItemSelected != NULL)
{
if (this->m_pItemSelected->GetType() == ITEM_BEND)
{
delete m_pItemSelected;
m_pItemSelected = NULL;
m_WellObjSelectlist.RemoveAll();
}
}
GetDoc()->Invalidate();
}
CItem* CItemWellSection::GetItem()
{ //ggff 20160526
if(m_pItemSelected)
return m_pItemSelected;
else
return CItemWcsSingleWell::GetItem();
}
void CItemWellSection::MakeFaultFromFaultPoint()
{
if (NULL == m_pWellSection)
{
return;
}
m_pWellSection->MakeFaultFromFaultPoint();
}
void CItemWellSection::SetAllWellColumnLineShape()
{
if (NULL == m_pWellSection)
{
return;
}
CSize8 size = GetDC()->GetRealSize(CSize(2,0));
m_pWellSection->SetAllWellColumnLineShape(size.cx);
}
void CItemWellSection::DeleteAllFaults()
{
if (NULL == m_pWellSection)
{
return;
}
SetItem(NULL);
m_WellObjSelectlist.RemoveAll();
m_pWellSection->DeleteAllFaults();
}
BOOL GetFaultsIntersect(CFaultObj* pFault1,CFaultObj*pFault2,dfPoint &retPt,int& f1Id,int& f2Id)
{
BOOL b= FALSE;
PointF tp,f1pt1,f1Pt2,f2pt1,f2pt2;
for(int ii = 0; ii<pFault1->m_ptArr.GetSize() -1; ii++)
{
if(b)
break;
f1pt1.X = pFault1->m_ptArr[ii].x0; f1pt1.Y = pFault1->m_ptArr[ii].y0;
f1Pt2.X = pFault1->m_ptArr[ii+1].x0; f1Pt2.Y = pFault1->m_ptArr[ii+1].y0;
for(int jj = 0; jj<pFault2->m_ptArr.GetSize()-1; jj++)
{
f2pt1.X = pFault2->m_ptArr[jj].x0; f2pt1.Y = pFault2->m_ptArr[jj].y0;
f2pt2.X = pFault2->m_ptArr[jj+1].x0; f2pt2.Y = pFault2->m_ptArr[jj+1].y0;
if(GetLinesWithSegmentPt1(tp,f1pt1,f1Pt2,f2pt1,f2pt2))
{
if(IsValidIntersect(tp,pFault1->m_ptArr.GetSize(),ii,f1pt1,ii+1,f1Pt2,pFault2->m_ptArr.GetSize(),jj,f2pt1,jj+1,f2pt2))//判断是否是有效断点,防止出现一条断层线的两头端点只是简单接触另一条的情况
{
f1Id = ii;
f2Id =jj;
retPt.x0 = tp.X; retPt.y0 = tp.Y;
b = TRUE;
break;
}
}
}
}
return b;
}
void CItemWellSection::GetIntersectFaults(FAULTVECTOR &faultVec1,FAULTVECTOR &faultVec2,CPointArr &retPtArr,CUIntArray &f1idArr,CUIntArray &f2idArr)
{
if (NULL == m_pWellSection)
{
return;
}
if(m_pWellSection->m_FaultList.GetSize() == 0)
return;
CFaultObj *pFaultObj1,*pFaultObj2;
FAULTVECTOR allFaultVec;
POSITION pos = m_pWellSection->m_FaultList.GetHeadPosition();
while(pos)
{
pFaultObj1 = (CFaultObj *)m_pWellSection->m_FaultList.GetNext(pos);
if(pFaultObj1->m_strName.IsEmpty())
continue;
allFaultVec.push_back(pFaultObj1);
}
if(allFaultVec.size()<1)
return;
dfPoint retPt;
int f1Id,f2Id;
for(int ii = 0; ii< allFaultVec.size()-1; ii++)
{
pFaultObj1 = allFaultVec[ii];
if(pFaultObj1->m_strName.IsEmpty())
continue;
for(int jj = ii+1; jj<allFaultVec.size(); jj++)
{
pFaultObj2 = allFaultVec[jj];
if(pFaultObj2->m_strName.IsEmpty())
continue;
if(GetFaultsIntersect(pFaultObj1,pFaultObj2,retPt,f1Id,f2Id))
{
faultVec1.push_back(pFaultObj1);
faultVec2.push_back(pFaultObj2);
retPtArr.Add(retPt);
f1idArr.Add(f1Id);
f2idArr.Add(f2Id);
}
}
}
}
//沿着断层线移动移动一个点
dfPoint MovePtalongFault(dfPoint fpt,double offv,CFaultObj *pCutFault,int cutId)
{
dfPoint retPt = fpt;
double miny,maxy;
dfPoint pt1,pt2;
for(int ii =0; ii< pCutFault->m_ptArr.GetSize()-1; ii++)
{
pt1 = pCutFault->m_ptArr[ii] ; pt2 = pCutFault->m_ptArr[ii+1];
maxy = pt1.y0 > pt2.y0 ? pt1.y0 : pt2.y0;
miny = pt1.y0 < pt2.y0 ? pt1.y0 : pt2.y0;
if(((miny-0.000001)< (fpt.y0+offv)) && ((fpt.y0+offv)<(maxy+0.000001)))
{
retPt.y0 = fpt.y0+offv;
if(abs(pt1.x0-pt2.x0)<0.000001)
{
retPt.x0 = pt1.x0;
}
else
{
if(abs(pt1.y0 - pt2.y0)< 0.000001)
retPt.x0 = pt2.x0;
else
retPt.x0 = pt1.x0 + (pt2.x0 - pt1.x0)*(retPt.y0 - pt1.y0)/(pt2.y0 - pt1.y0);
}
break;
}
}
return retPt;
}
//对被切割的断层点进行一些调整移动,按照切割它的断层断距,pHCutFault是指切断被切层的头部的断层,pTCutFault是指尾部
void MoveBeCutFault(CWellSection *pSection,CFaultObj *pBeCutFault,CFaultObj *pHCutFault,int hCutId,CFaultObj *pTCutFault,int tCutId)
{
CSectionWellObj *pWell =(CSectionWellObj *) pSection->m_WellList.GetHead();
double v;
if(pHCutFault)
{
dfPoint retPt;
if(pBeCutFault->m_ptArr[0].x0 > pBeCutFault->m_ptArr[pBeCutFault->m_ptArr.GetSize()-1].x0)
v = pWell->HeightToScreenCY(pHCutFault->m_fLeftThrow);
else
v = pWell->HeightToScreenCY(-pHCutFault->m_fRightThrow);
retPt = MovePtalongFault(pBeCutFault->m_ptArr[0],v,pHCutFault,hCutId);
pBeCutFault->m_ptArr[0] = retPt;
}
if(pTCutFault)
{
dfPoint retPt;
if(pBeCutFault->m_ptArr[0].x0 > pBeCutFault->m_ptArr[pBeCutFault->m_ptArr.GetSize()-1].x0)
v = pWell->HeightToScreenCY(-pTCutFault->m_fRightThrow);
else
v = pWell->HeightToScreenCY(pTCutFault->m_fLeftThrow);
retPt = MovePtalongFault(pBeCutFault->m_ptArr[pBeCutFault->m_ptArr.GetSize()-1],v,pTCutFault,tCutId);
pBeCutFault->m_ptArr[pBeCutFault->m_ptArr.GetSize()-1] = retPt;
}
}
void AddFaultPoint(CFaultObj *pNewFault,dfPoint newPt)
{
if(pNewFault->m_ptArr.GetSize()>0)
{
dfPoint tpoint = pNewFault->m_ptArr[pNewFault->m_ptArr.GetSize()-1];
if(!(abs(tpoint.x0 - newPt.x0)<0.01 && abs(tpoint.y0 - newPt.y0)<0.01)) //如果新加入的点同已有的最后一点重复,就不加了
pNewFault->m_ptArr.Add(newPt);
}
else
pNewFault->m_ptArr.Add(newPt);
}
void CItemWellSection::DoFaultsIntersect(CFaultObj *pBeCutFault,CUIntArray &PtIdArr,CPointArr &SectPointArr,FAULTVECTOR &CutFaultVec,CUIntArray &CutPtIdArr,FAULTVECTOR &newFaultVec)
{
if (NULL == m_pWellSection)
{
return;
}
if(m_pWellSection->m_FaultList.GetSize() == 0 || PtIdArr.GetSize()==0)
return;
CFaultObj *pNewFault;
pNewFault = new CFaultObj;
pNewFault->m_strName = pBeCutFault->m_strName;
pNewFault->m_fLeftThrow = pBeCutFault->m_fLeftThrow; pNewFault->m_fRightThrow = pBeCutFault->m_fRightThrow;
pNewFault->SetParent(m_pWellSection);
for(int ii = 0; ii<=PtIdArr[0]; ii++)
{
AddFaultPoint(pNewFault,pBeCutFault->m_ptArr[ii]);//pNewFault->m_ptArr.Add(pBeCutFault->m_ptArr[ii]);
}
AddFaultPoint(pNewFault,SectPointArr[0]);
newFaultVec.push_back(pNewFault);
MoveBeCutFault(m_pWellSection,pNewFault,NULL,0,CutFaultVec[0],CutPtIdArr[0]);
for(int ii = 0; ii<PtIdArr.GetSize()-1; ii++)
{
pNewFault = new CFaultObj;
pNewFault->m_strName = pBeCutFault->m_strName;
pNewFault->m_fLeftThrow = pBeCutFault->m_fLeftThrow; pNewFault->m_fRightThrow = pBeCutFault->m_fRightThrow;
AddFaultPoint(pNewFault,SectPointArr[ii]);
pNewFault->SetParent(m_pWellSection);
for(int jj = PtIdArr[ii]+1; jj<=PtIdArr[ii+1]; jj++)
{
AddFaultPoint(pNewFault,pBeCutFault->m_ptArr[jj]);//pNewFault->m_ptArr.Add(pBeCutFault->m_ptArr[jj]);
}
AddFaultPoint(pNewFault,SectPointArr[ii+1]);
newFaultVec.push_back(pNewFault);
MoveBeCutFault(m_pWellSection,pNewFault,CutFaultVec[ii],CutPtIdArr[ii],CutFaultVec[ii+1],CutPtIdArr[ii+1]);
}
pNewFault = new CFaultObj;
pNewFault->m_strName = pBeCutFault->m_strName;
pNewFault->m_fLeftThrow = pBeCutFault->m_fLeftThrow; pNewFault->m_fRightThrow = pBeCutFault->m_fRightThrow;
AddFaultPoint(pNewFault,SectPointArr[SectPointArr.GetSize()-1]);
pNewFault->SetParent(m_pWellSection);
for(int ii = PtIdArr[PtIdArr.GetSize()-1]+1; ii< pBeCutFault->m_ptArr.GetSize(); ii++)
{
AddFaultPoint(pNewFault,pBeCutFault->m_ptArr[ii]);
}
newFaultVec.push_back(pNewFault);
MoveBeCutFault(m_pWellSection,pNewFault,CutFaultVec[CutFaultVec.size()-1],CutPtIdArr[CutPtIdArr.GetSize()-1],NULL,0);
}
BOOL CItemWellSection::IsAddBendLayerPoint()
{
if (m_pItemSelected == NULL)
return FALSE;
BOOL b = FALSE;
if (m_pItemSelected->GetType() == ITEM_BEND)
{
b = TRUE;
}
return b;
}
BOOL CItemWellSection::IsAddFaultPoint()
{
if (m_pItemSelected == NULL)
return FALSE;
BOOL b = FALSE;
if (m_pItemSelected->GetType() == ITEM_FAULT)
{
b = TRUE;
}
return b;
}
void CItemWellSection::AddBendLayerPoint()
{
if (m_pItemSelected->GetType() == ITEM_BEND)
{
CItemBend *pItemBend = (CItemBend *)m_pItemSelected;
pItemBend->AddBendLayerPoint();
}
}
void CItemWellSection::DeleteBendLayerPoint()
{
if (m_pItemSelected->GetType() == ITEM_BEND)
{
CItemBend *pItemBend = (CItemBend *)m_pItemSelected;
pItemBend->DeleteBendLayerPoint();
}
}
void CItemWellSection::SetPos(POSITION pos)
{
CItem::SetPos(pos);
COne* pOne = GetDoc()->GetDraw()->GetAt(pos);
if (pOne->GetType() == KEP_WELLSECTION)
{
SetDrawObj((CWellBaseObj*)pOne->GetValue());
if (m_pItemSelected != NULL)
{
delete m_pItemSelected;
m_pItemSelected = NULL;
}
m_WellObjSelectlist.RemoveAll();
}
//this->m_pWellSection
}
CWellBaseObj* CItemWellSection::GetDrawObj()
{
return m_pWellSection;
}
BOOL CItemWellSection::ApplingTemplate(CKXmlParse& xp, CSectionWellObj* pSelectWellObj)
{
CWellBaseObjList WellList;
CWellSection* pSection = (CWellSection*)GetWellSection();
if (pSelectWellObj == NULL)
{
POSITION posWell = pSection->m_WellList.GetHeadPosition();
while (posWell != NULL)
{
CWellPole* pWellObj = (CWellPole*)pSection->m_WellList.GetNext(posWell);
WellList.AddTail(pWellObj);
}
}
else
{
WellList.AddTail(pSelectWellObj);
//if (m_WellObjSelectlist.GetCount() == 1)
//{
// CWellBaseObj* pDrawObj = (CWellBaseObj*)m_WellObjSelectlist.GetHead();
// if (pDrawObj->GetType() == KEP_WELL)
// {
// CWellPole* pWellObj = (CWellPole*)pDrawObj;
// WellList.AddTail(pWellObj);
// }
//}
}
BOOL bDelete = FALSE;
CPointArr fDistance;
//////保存井之间的间距
POSITION posSectionWell = pSection->m_WellList.GetHeadPosition();
CWellPole* pWellNext = NULL;
while (posSectionWell != NULL)
{
CWellPole* pWellObj = (CWellPole*)pSection->m_WellList.GetNext(posSectionWell);
POSITION posFind = pSection->m_WellList.Find(pWellObj);
pSection->m_WellList.GetNext(posFind);
if (posFind != NULL)
{
pWellNext = (CWellPole*)pSection->m_WellList.GetNext(posFind);
dfPoint temppoint;
temppoint.x0 = pWellNext->GetPos().left - pWellObj->GetPos().right;
fDistance.Add(temppoint);
}
}
//////保存断层在两口井之间的相对位置
POSITION posBend = pSection->m_BendList.GetHeadPosition();
//while(NULL != posBend)
//{
// double XLeft = 0.0;
// double XRight = 0.0;
// CBendObj* pBend = (CBendObj*)pSection->m_BendList.GetNext(posBend);
// pBend->GetBendXValue(XLeft,XRight);
// for (int i = 0; i<pBend->m_faultArr.GetCount(); i++)
// {
// CFaultObj* pFault = (CFaultObj*)pBend->m_faultArr.GetAt(i).pFault;
// for (int j = 0;j<pFault->m_ptArr.GetCount(); j++)
// {
// pFault->m_ptArr[j].z0 = pFault->m_ptArr[j].x0-XLeft;
// }
// }
//}
POSITION posWell = WellList.GetHeadPosition();
while (posWell != NULL)
{
CWellPole* pWellObj = (CWellPole*)WellList.GetNext(posWell);
//fr.SeekToBegin();
//备份井内道对象
TRACKLIST tracklist;
//TRACKLIST::reverse_iterator rit = pWellObj->GetTrackList().rbegin();
//for(; rit != pWellObj->GetTrackList().rend(); rit++)
//{
// tracklist.push_front(*rit);
//}
tracklist.assign(pWellObj->GetTrackList().rbegin(), pWellObj->GetTrackList().rend()); // 这样将井的所有道,包括组合道都获得
//pWellObj->GetAllTrack(&tracklist);
pWellObj->GetTrackList().clear(); // ->RemoveAll();
CString strWellTitle = pWellObj->m_strTitle;
CString strWellName = pWellObj->GetWellName();
double fx = 0.0;
double fy = 0.0;
fx = ((CSectionWellObj*)pWellObj)->m_fX;
fy = ((CSectionWellObj*)pWellObj)->m_fY;
double fLevel = pWellObj->m_fLevel;
double topDepth = pWellObj->m_dSdep;
double endDepth = pWellObj->m_dEdep;
double left = pWellObj->GetPos().left;
double proportion = pWellObj->m_fProportion;
double dOldTrackHead = pWellObj->m_dHeightTrackHead;
double dOldWellHead = pWellObj->m_dHeightWellHead;
double tracktop = pWellObj->GetPos().top - dOldWellHead - dOldTrackHead;
double nWellId = pWellObj->GetId();
std::vector<CWellPole::well_interval > oldWellIntervalVec;
oldWellIntervalVec.insert(oldWellIntervalVec.begin(), pWellObj->GetIntervalVec()->begin(), pWellObj->GetIntervalVec()->end());
AfxGetPublicFunction()->SetCodeType(CODE_GB2321);
xp.InitRootNode(); //每次需要从新设置一下读取的井根节点
if (pWellObj->ReadPCG(xp, -1) == 0)
{
//恢复道备份
pWellObj->GetTrackList().assign(tracklist.begin(), tracklist.end());
//POSITION pos = tracklist.GetTailPosition();
//while (pos!=NULL)
//{
// CTrackObj* pTrackObj = (CTrackObj*)tracklist.GetPrev(pos);
// pWellObj->GetTrackList()->AddHead(pTrackObj);
//}
tracklist.clear();
//恢复组合道备份
//pos = trackGroupList.GetHeadPosition();
//while (pos!=NULL)
//{
// CTrackGroupObj* pTrackGroupObj = trackGroupList.GetNext(pos);
// pWellObj->GetTrackGroupList()->AddTail(pTrackGroupObj);
//}
//trackGroupList.RemoveAll();
//AfxGetPublicFunction()->SetCodeType((DWORD)::GetPreferences().WorkaroundSave.m_nCodeMode);
return FALSE;
}
else
{
////释放以前的组对象
//pos = trackGroupList.GetTailPosition();
//while(pos != NULL)
//{
// delete trackGroupList.GetPrev(pos);
//}
//trackGroupList.RemoveAll();
pWellObj->m_strTitle = strWellTitle;
pWellObj->SetWellName(strWellName);
//pWellObj->ReSetWellHead();
pWellObj->m_fLevel = fLevel;
((CSectionWellObj*)pWellObj)->m_fX = fx;
((CSectionWellObj*)pWellObj)->m_fY = fy;
pWellObj->GetPos().left = left;
pWellObj->GetPos().top = tracktop + pWellObj->m_dHeightWellHead + pWellObj->m_dHeightTrackHead;
pWellObj->m_dSdep = topDepth;
pWellObj->m_dEdep = endDepth;
pWellObj->GetIntervalVec()->clear();
pWellObj->GetIntervalVec()->insert(pWellObj->GetIntervalVec()->begin(), oldWellIntervalVec.begin(), oldWellIntervalVec.end());
pWellObj->m_fProportion = proportion;
pWellObj->m_fMarginLR = pWellObj->m_fMarginTB = 0.0;
pWellObj->SetId(nWellId);
pWellObj->CalculateSize(pWellObj->GetPos().TopLeft());
//应用井模板
//pos = tracklist.GetHeadPosition();
//TRACKLIST::iterator it = tracklist.begin();
//for (; it != tracklist.end(); it++)
// pWellObj->GetTemplateList().push_front(*it);
pWellObj->GetTemplateList().assign(tracklist.begin(), tracklist.end());
//while(pos != NULL)
// pWellObj->GetTemplateList().AddHead(tracklist.GetNext(pos));
//多井剖面时,重新设置连层指针
tracklist.clear();
pWellObj->GetAllTrack(&tracklist);
POSITION posBend = pSection->m_BendList.GetTailPosition();
TRACKLIST::iterator it;
while (posBend != NULL)
{//使用新井模板状态下删除用不到的bend保留有用的bend
CBendObj* pBend = (CBendObj*)pSection->m_BendList.GetPrev(posBend);
if (pBend->m_pWellLeft == pWellObj || pBend->m_pWellRight == pWellObj)
{
BOOL bExist = FALSE;
it = tracklist.begin();
for (; it != tracklist.end(); it++)
{
CTrackObj* pTrack = *it;
if (((CTrackObj*)pBend->m_pLayerLeft->GetParent())->GetTrackType() == pTrack->GetTrackType())
{
bExist = TRUE;
break;
}
else if (pBend->m_pLayerRight != NULL &&
((CTrackObj*)pBend->m_pLayerRight->GetParent())->GetTrackType() == pTrack->GetTrackType())
{
bExist = TRUE;
break;
}
else if (pBend->m_pLayerRight == NULL && pBend->m_pWellRight == pWellObj)
{
bExist = TRUE;
break;
}
}
if (!bExist)
{
pSection->DeleteBend(pBend);
}
}
}
tracklist.clear();
pWellObj->ApplingTemplate(TRUE, pWellObj->m_dHeightTrackHead, pWellObj->m_dHeightWellHead);
//CItemWcsSingleWell itemwell(GetDoc());
//itemwell.ImportDataAll(pWellObj, FALSE);
}
//AfxGetPublicFunction()->SetCodeType((DWORD)::GetPreferences().WorkaroundSave.m_nCodeMode);
}
//fr.Close();
//重新计算连层
CRect8 oldrect = pSection->GetRect();
if (fDistance.GetCount() > 0)
{
int nWell = 0;
double dWellRight = 0;
POSITION pos = pSection->m_WellList.GetHeadPosition();
while (pos != NULL)
{
CWellPole* pWellObj = (CWellPole*)pSection->m_WellList.GetNext(pos);
//重新计算井位置
if (nWell > 0)
{
pWellObj->GetPos().left = fDistance.GetAt(nWell - 1).x0 + dWellRight;
pWellObj->CalculateSize(pWellObj->GetPos().TopLeft());
}
nWell++;
dWellRight = pWellObj->GetPos().right;
}
}
posWell = pSection->m_WellList.GetHeadPosition();
while (posWell != NULL)
{
CWellPole* pWellObj = (CWellPole*)pSection->m_WellList.GetNext(posWell);
pSection->ReComputeBends(pWellObj);
}
//////重新计算断层的位置
posBend = pSection->m_BendList.GetHeadPosition();
while (NULL != posBend)
{
double XLeft = 0.0;
double XRight = 0.0;
CBendObj* pBend = (CBendObj*)pSection->m_BendList.GetNext(posBend);
pBend->GetBendXValue(XLeft, XRight);
for (int i = 0; i < pBend->m_faultArr.GetCount(); i++)
{
CFaultObj* pFault = (CFaultObj*)pBend->m_faultArr.GetAt(i).pFault;
for (int j = 0; j < pFault->m_ptArr.GetCount(); j++)
{
pFault->m_ptArr.GetAt(j).x0 = XLeft + pFault->m_ptArr.GetAt(j).z0;
}
}
}
POSITION posFault = pSection->m_FaultList.GetHeadPosition();
while (posFault != NULL)
{
CFaultObj* pFault = (CFaultObj*)pSection->m_FaultList.GetNext(posFault);
pFault->FaultReCut();
}
//计算剖面范围
pSection->ReSetPosition();
//刷新
CRect8 rect = pSection->GetRect();
rect.CombinRect(oldrect);
CRect rt = GetDC()->GetScreen(rect);
rt.InflateRect(10, 10);
//GetDoc()->Invalidate(rt);
WellList.RemoveAll();
return TRUE;
}
BOOL CItemWellSection::ApplyingTemplateFileForWell(CString filePath, ULONGLONG wellHandle)
{
BOOL b = FALSE;
CString strExt = "";
if (filePath.GetLength() < 4)
return FALSE;
strExt = filePath.Right(4);
strExt = strExt.MakeLower();
if (strExt == ".pcg")
{
CKXmlParse xp;
if (xp.ReadXmlFile(filePath.GetBuffer()))
{
SetReUnDoAction();
if (wellHandle != 0)
{
CSectionWellObj* pWell = (CSectionWellObj*)wellHandle;
b = ApplingTemplate(xp, pWell);
}
else
b = ApplingTemplate(xp, NULL);
}
}
return b;
}
BOOL CItemWellSection::ApplyingWellTemplateForSection(ULONGLONG wellHandle)
{
CWellPole* pWellObj = (CWellPole*)(wellHandle);
SetReUnDoAction();
pWellObj->SetActionTemplate(TRUE);
pWellObj->SetNoSaveCallouts(TRUE);
CMemFile fw;
DWORD tcode = AfxGetPublicFunction()->GetCodeType();
AfxGetPublicFunction()->SetCodeType(CODE_GB2321);
//AfxGetPublicFunction()->WriteDML_Head_Version(fw);
//AfxGetPublicFunction()->WriteDML_Head_Xmlns(fw);
nsWellPoleFunc::WritePCG_Head_Version(fw);
pWellObj->WritePCG(fw, 2, 1);//pWellObj->WriteDML(fw, -1, 1);
nsWellPoleFunc::WritePCG_Tail(fw);
//AfxGetPublicFunction()->SetCodeType((DWORD)::GetPreferences().WorkaroundSave.m_nCodeMode);
AfxGetPublicFunction()->InitSaveCounter();
pWellObj->SetActionTemplate(FALSE);
pWellObj->SetNoSaveCallouts(FALSE);
AfxGetPublicFunction()->SetCodeType(tcode);
int fileLen = fw.GetLength();
//char* pBuf = new char[fileLen];
BYTE* pBuf = fw.Detach();
//fw.Read(pBuf,fileLen);
CKXmlParse xp;
if (xp.SetXmlFileBuffer((char*)pBuf, fileLen))
{
ApplingTemplate(xp, NULL);
}
else
return FALSE;
return TRUE;
}
}