// WellPoleDoc.cpp: 实现文件 // #include "stdafx.h" #include "ItemWellSection.h" // WellPoleDoc #include "DrawOperator/XyIO.h" #include "DrawOperator/FileUtility.h" #include "WellPoleLib/WellBaseObj.h" #include "WellPoleLib/InTrackDepthSegment.h" #include "WellPoleLib/TrackObj.h" #include "WellPoleLib/TrackGroup.h" #include "WellPoleLib/InclinedWellPole.h" #include "WellPoleLib/InclinedTrack.h" #include "WellPoleLib/TrackDepth.h" #include "WellPoleLib/TrackCurve.h" #include "WellPoleLib/TrackResult.h" #include "WellPoleLib/WellPole.h" #include "WellPoleLib/WellObjExtendInfo.h" #include "MultiWellSectionLib/SectionWellObj.h" #include "MultiWellSectionLib/FaultObj.h" #include "MultiWellSectionLib/BendObj.h" #include "MultiWellSectionLib/WellSection.h" #include "MultiWellSectionDoc.h" #include "MultiWellSectionlView.h" #include "SigmaStore.h" #include "../../UndoManager/UndoManager.h" CMultiWellSectionDoc::CMultiWellSectionDoc() { m_pItemView = nullptr; m_pItemView = std::make_unique(this); m_pLastAction = NULL; } CMultiWellSectionDoc::~CMultiWellSectionDoc() { DeleteItem(); } BOOL CMultiWellSectionDoc::OpenFile(LPCTSTR lpszFileName, BOOL bMergeFile) { if (!bMergeFile) { if (m_pXy != NULL) { m_pXy->Clear(); } // GdfCloseFile(); } if (m_pXy == NULL) m_pXy = new CXy; m_pXy->SetXyType(CXy::XYTYPE::wellSection); // 如果是恢复模式,就用备份的数据和Action替换从文件获取内容 if (m_recoverMode) { if (CSigmaStore::GetInstance().Load(this, lpszFileName)) { return TRUE; } return FALSE; } AfxGetPublicFunction()->EnableJudgeRange(TRUE); if (m_pXy->ReadOtherWithExtension(lpszFileName)) { m_FileName = lpszFileName; return TRUE; } CString path(lpszFileName); m_TempFileName = PreprocessFile(path); if (m_TempFileName.IsEmpty()) { return FALSE; } std::vector oneList = m_pXy->GetLatestReadOnes(); oneList.clear(); CSplitPath sp(m_TempFileName); CString ext = sp.GetExtension(); if (ext == ".pcg") { if (m_pXy == NULL) m_pXy = new CXy; GetDraw()->PCG_Read3(m_TempFileName); } else { CFile file; if (file.Open(m_TempFileName, CFile::modeRead)) { m_FileName = lpszFileName; // FIXME: 我们基础库暂时依赖这个来获取要保存的文件名 //AfxGetPublicFunction()->__CurrentSaveFilePath = lpszFileName; CArchive ar(&file, CArchive::load); Serialize(ar); ar.Close(); file.Close(); } } if (m_pXy != nullptr) { m_pXy->EnableMeshPackage(m_bEnableMeshPackage); } if (!m_TempFileName.IsEmpty() && m_TempFileName != path) { CFile::Remove(m_TempFileName); m_TempFileName = ""; } return TRUE; } BOOL CMultiWellSectionDoc::SaveFile(LPCTSTR lpszPathName) { CString newName = lpszPathName; newName.MakeLower(); if (newName.GetLength() > 4) newName = newName.Right(4); if (newName.Find(".pcg") == 0) m_nDocTypeID = DF_FORMAT_PCG; m_FileName = lpszPathName; CFile file; if (file.Open(m_FileName, CFile::modeCreate | CFile::modeWrite)) { CArchive ar(&file, CArchive::store); Serialize(ar); ar.Close(); file.Close(); PostProcessFile(m_FileName); SaveActionPosition(); return TRUE; } return FALSE; // success } // WellPoleDoc 命令 CItem* CMultiWellSectionDoc::FindItem(int nType) { CItem* pit = NULL; if (nType == ITEM_WELLSECTION) { pit = new CItemWellSection(this); return pit; } else return CSigmaDoc::FindItem(nType); } int CMultiWellSectionDoc::GetNodeWidth(void) { return 2; } CItemSelect* CMultiWellSectionDoc::GetSelectItem(void) { if (GetItem() == NULL) return NULL; if (GetItem()->GetType() != ITEM_SELECT && !GetItem()->IsNestItem()) return NULL; return (CItemSelect*)GetItem(); } void CMultiWellSectionDoc::RemoveAt(COne* pOne) { GetDraw()->RemoveAt(pOne); } CSize CMultiWellSectionDoc::GetDocSize(void) { CSize sizeTotal(100, 100); if (GetDraw() == NULL)return sizeTotal; if (GetDraw()->GetCount() == 0)return sizeTotal; CRect8 rect = GetDraw()->m_range; double xm, ym, dx, dy; dx = rect.right - rect.left; dy = rect.top - rect.bottom; xm = GetDC().left - rect.left; ym = rect.top - GetDC().top; int hts = GetDC().GetScreenWidth(dx); int vts = GetDC().GetScreenHeight(fabs(dy)); vts = abs(vts); sizeTotal.cx = hts; sizeTotal.cy = vts; return sizeTotal; } POSITION CMultiWellSectionDoc::AddElement(COne* pOne) { return GetDraw()->AddTailOne(pOne); } void CMultiWellSectionDoc::OnDraw(CXyDC& dc) { //TRACE(_T("CDrawDoc::OnDraw(CXyDC&),count=%ld\n"), GetDraw()->GetCount()); GetDraw()->Draw(dc, false); } void CMultiWellSectionDoc::Serialize(CArchive& ar) { CPublicFunction& pf = *AfxGetPublicFunction(); if (ar.IsStoring()) { short ver = -1; if (m_nDocTypeID == DF_FORMAT_PCG) { //BeginProgress(IDS_STRING_WriteFile); CWellSection* pWellSection = GetWellSection(); if (pWellSection) { CXy* pxy = GetDraw(); CXyIO xy; xy.AttachInput(pxy, false); CRect rt = GetView()->GetClientRect(); pxy->m_display = GetDC().GetReal(rt); pxy->m_display.NormalizeRect(); GetDC().GetScale(pxy->m_scaleSize.cx, pxy->m_scaleSize.cy); pxy->PCG_WriteCrossSection(*ar.GetFile(), ver);//本操作会导致剖面图元的POSITION发生变化,因此需要在操作完成后,重新设置Item中的POSITION } } else { CSigmaDoc::Serialize(ar); } } else { //CSigmaDoc::Serialize(ar); if (m_pXy == NULL) m_pXy = new CXy; //BeginProgress(IDS_STRING_OpenFile); CString name = ar.GetFile()->GetFileName(); name.MakeLower(); CSplitPath sp(name); CString ext = sp.GetExtension(); //ar.m_pDocument = this; // set back-pointer in archive if (ext == _T(".dfb") || ext == _T(".dft")) { m_pXy->m_version = m_pXy->DFB_ReadVersion(ar); m_pXy->DFB_ReadEncrypt(ar, m_pXy->m_version); if (m_pXy->IsEncrypted()) { //if (!VerifyPassword(GetDraw())) //{ // m_bCancelRead = TRUE; // EndProgress(); // return; //} } m_pXy->DFB_Serialize(ar, m_pXy->m_version); } else if (ext == ".dml" || ext == ".xml") m_pXy->DML_Read2(*(ar.GetFile())); else if (ext == ".pcg") GetDraw()->PCG_Read3(ar.m_strFileName);//m_pXy->PCG_Read2(*(ar.GetFile())); else if (ext == ".kev") { m_pXy->DFD_Read2(*(ar.GetFile())); } else if (ext == ".dfd") { m_pXy->DFD_Read2(*(ar.GetFile())); } else if (ext == ".xyz") { m_pXy->DFD_Read2(*(ar.GetFile())); } } } BOOL CMultiWellSectionDoc::GetElementRect(POSITION pos, CRect8& range) { if (pos == NULL) return FALSE; range = GetDraw()->GetAt(pos)->GetRect(); return TRUE; } void CMultiWellSectionDoc::SetActionItem(CActionItem* pAction, bool bDo/*=true*/) { m_pLastAction = pAction; if (bDo) m_pLastAction->Do(); } //CWellPole* CMultiWellSectionDoc::GetWellPole() //{ // CWellPole *pWell = NULL; // POSITION pos = GetDraw()->GetValueList()->GetHeadPosition(); // while(pos != NULL) // { // COne* pOne = (COne*)GetDraw()->GetValueList()->GetNext(pos); // if (pOne->GetType() == KEP_WELL) // { // pWell = (CWellPole*)pOne->GetValue(); // break; // } // } // // return pWell; //} // //COne* CMultiWellSectionDoc::GetWellPoleOne() //{ // CWellPole *pWell = NULL; // POSITION pos = GetDraw()->GetValueList()->GetHeadPosition(); // while (pos != NULL) // { // COne* pOne = (COne*)GetDraw()->GetValueList()->GetNext(pos); // if (pOne->GetType() == KEP_WELL) // { // return pOne; // break; // } // } // // return NULL; //} CWellSection* CMultiWellSectionDoc::GetWellSection() { CWellSection *pWellSection = NULL; POSITION pos = GetDraw()->GetValueList()->GetHeadPosition(); while (pos != NULL) { COne* pOne = (COne*)GetDraw()->GetValueList()->GetNext(pos); if (pOne->GetType() == KEP_WELLSECTION) { pWellSection = (CWellSection*)pOne->GetValue(); break; } } return pWellSection; } COne* CMultiWellSectionDoc::GetWellSectionOne() { CWellPole *pWell = NULL; POSITION pos = GetDraw()->GetValueList()->GetHeadPosition(); while (pos != NULL) { COne* pOne = (COne*)GetDraw()->GetValueList()->GetNext(pos); if (pOne->GetType() == KEP_WELLSECTION) { return pOne; break; } } return NULL; } void CMultiWellSectionDoc::NormalEXTLogFont(GDFLOGFONTEXT& font) { long nH = font.m_logFont.lfHeight; double dScaleX = 1; double dScaleY = 1; GetDC().GetScale(dScaleX, dScaleY); GetDC().SetScale(0.1, 0.1); font.m_dHeight = GetDC().GetRealHeight(nH*72.0 / GetDC().GetDC()->GetDeviceCaps(LOGPIXELSY)); GetDC().SetScale(dScaleX, dScaleY); if (font.m_logFont.lfFaceName == "Times New Roman") font.m_dWidth = font.m_dHeight*0.4; else font.m_dWidth = font.m_dHeight*0.5; } BOOL CMultiWellSectionDoc::GetDrawRange(CRect8& rect) { CWellSection* pWellSection= GetWellSection(); if(pWellSection == NULL) return CSigmaDoc::GetDrawRange(rect); else { rect = pWellSection->GetRect(); rect.InflateRect(100, 100); } return TRUE; } void CMultiWellSectionDoc::ClearSelection(void) { if (GetItemType() == ITEM_SELECT || GetItemType() == ITEM_WELLSECTION) GetSelectItem()->CancelSelection(); } int CMultiWellSectionDoc::Undo() { CItem* pItem = GetItem(); if (pItem != NULL && pItem->GetType() == ITEM_WELLSECTION) { CItemWellSection *pWellItem = (CItemWellSection *)pItem; pWellItem->m_WellObjSelectlist.RemoveAll(); } return m_pActionMgr->Undo(); } int CMultiWellSectionDoc::Redo() { CItem* pItem = GetItem(); if (pItem != NULL && pItem->GetType() == ITEM_WELLSECTION) { CItemWellSection *pWellItem = (CItemWellSection *)pItem; pWellItem->m_WellObjSelectlist.RemoveAll(); } return m_pActionMgr->Redo(); } CWellSection* CMultiWellSectionDoc::CreateNewWellSection(LPCTSTR title, double depthScale, double levelScale, double horizonScale) { CWellSection* pWellSection = new CWellSection(); GetDraw()->AddElement(pWellSection, KEP_WELLSECTION); pWellSection->m_strTitleName = title; pWellSection->m_fDepthScale = depthScale; pWellSection->m_fHorzScale = horizonScale; pWellSection->m_fLevelScale = levelScale; pWellSection->m_bResForm = TRUE; pWellSection->GetFeature()->m_nBendFillStyle = 1; return pWellSection; } CSectionWellObj* CMultiWellSectionDoc::AddNewWell(LPCSTR wellName, double depthScale, double top, double bottom, double x, double y, double bushingLevel, LPCTSTR wellTemplateFile) { CSectionWellObj* pWellPole = NULL; if (wellTemplateFile != NULL && wellName != NULL) { CKXmlParse xp; if (xp.ReadXmlFile((char*)wellTemplateFile)) { CSectionWellObj* pWell1 = new CSectionWellObj(); int ret = pWell1->ReadPCG(xp, -1); if (ret == 0) delete pWell1; else { pWellPole = pWell1; pWellPole->SetDepthProportion(depthScale); pWellPole->SetWellDepth(top, bottom); pWellPole->SetWellName(wellName); pWellPole->SetTitle(wellName); pWellPole->m_fX = x; pWellPole->m_fY = y; pWellPole->m_fLevel = bushingLevel; CWellSection *pWellSection = GetWellSection(); pWellSection->m_WellList.AddTail(pWellPole); pWellPole->CWellBaseObj::SetParent(pWellSection); //要使用基类的函数,否则会将所有track的parent设置为剖面 pWellPole->SetParentXY(this->GetDraw()); pWellPole->CalculateSize(pWellPole->GetRect().TopLeft()); } } } return pWellPole; } void CMultiWellSectionDoc::WellSectionReSetAllWellsPosition(BOOL bNeedComputedDepth, double topExtent, double bottomExtent) { CWellSection* pWellSection = GetWellSection(); double fXPre; double fYPre; CSectionWellObj *pSectionWell; BOOL bFirst = TRUE; POSITION pos = pWellSection->m_WellList.GetHeadPosition(); while (pos != NULL) { pSectionWell = (CSectionWellObj*)pWellSection->m_WellList.GetNext(pos); if (bFirst) { pSectionWell->m_fHorzDistance = 0; fXPre = pSectionWell->m_fX; fYPre = pSectionWell->m_fY; bFirst = FALSE; } else { pSectionWell->m_fHorzDistance = sqrt((pSectionWell->m_fX - fXPre)*(pSectionWell->m_fX - fXPre) + (pSectionWell->m_fY - fYPre)*(pSectionWell->m_fY - fYPre)); fXPre = pSectionWell->m_fX; fYPre = pSectionWell->m_fY; } if (bNeedComputedDepth) { double top, bottom; pSectionWell->GetDatasTopBottomDepth(top, bottom); top -= topExtent; bottom += bottomExtent; pSectionWell->SetWellDepth(top, bottom); } else { pSectionWell->SetWellDepth(pSectionWell->m_dSdep - topExtent, pSectionWell->m_dEdep + bottomExtent); } } pWellSection->ComputeSectionPosition(); pWellSection->ReSetPosition(); } void CMultiWellSectionDoc::WellSectionConnectLayers(CStringArray& strTrackTypeArr) { if (strTrackTypeArr.GetSize() == 0) return; std::vector trackInfos = CWellObjExtendInfoMgr::GetInstance()->GetWellTrackInfos(); std::vector trackTypes; for (int i = 0; i < strTrackTypeArr.GetSize(); i++) { for (int j = 0; j < trackInfos.size(); j++) { if (strTrackTypeArr[i] == trackInfos[j]->m_cTypeStr) trackTypes.push_back(trackInfos[j]->m_type); } } CWellSection* pWellSection = GetWellSection(); CItemWellSection* pItemWellSection = new CItemWellSection(this); pItemWellSection->SetDrawObj(pWellSection); pItemWellSection->CreateLayers(trackTypes); delete pItemWellSection; }