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/InterfaceFileOperation.cpp

1607 lines
40 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.

#undef min
#undef max
#include "stdafx.h"
#include "SigmaView.h"
#include "ItemSelect.h"
#include "ItemSaveToMark.h"
#include "ItemMakeMark.h"
#include "ItemFocusRect.h"
#include "TinyXml\tinyxml.h"
#include "pystring.h"
#include "DrawOperator\FileUtility.h"
#include <deque>
#include ".\WellAndSection\WellPoleDoc.h"
#include ".\WellAndSection\WellPoleView.h"
CPoint2D c_down, c_last;
CStringList FileList;
CMap<int, int, CPoint, CPoint> maps;
double m_height;
double m_width;
CString xmlExport;
extern "C" __declspec(dllexport)
void ImageFileMerge(CSigmaView* pView, LPCTSTR fileName, bool onBottom,
double locationX, double locationY, double endX, double endY, LPCTSTR layerName)
{
CXy* pxy = pView->m_pDoc->GetDraw();
POSITION pos = pxy->ReadImageRecognise(fileName);
COne* pOne = pxy->RemoveAtNoClear(pos);
pos = NULL;
switch (pOne->GetType())
{
case DOUBLEFOX_WMF:
{
CMetaFile* pmf = (CMetaFile*)pOne->GetValue();
pmf->x0 = locationX;
pmf->y0 = locationY;
pmf->m_size.cx = endX - locationX;
pmf->m_size.cy = endY - locationY;
//pos = pxy->AddHeadOne(pOne);
}
break;
case DOUBLEFOX_IMAGE:
{
CImageInsert* pImage = (CImageInsert*)pOne->GetValue();
pImage->x0 = locationX;
pImage->y0 = locationY;
pImage->m_size.cx = endX - locationX;
pImage->m_size.cy = endY - locationY;
//pos = pDoc->GetDraw()->AddTailOne(pOne);
}
break;
}
CLayer* pLayer = pxy->FindAddLayer(layerName);
pOne->SetLayer(pLayer);
if (onBottom) {
pos = pxy->AddHeadOne(pOne);
}
else {
pos = pxy->AddTailOne(pOne);
}
}
extern "C" __declspec(dllexport)
void FileMerge(CSigmaView* pView, LPCTSTR fileName, bool onBottom)
{
//CRect8 rect(1e100, -1e100, -1e100, 1e100);
//pView->m_pDoc->m_pXy->GetRange(rect);
CString strExt;
CSplitPath sp(fileName);
strExt = sp.GetExtension();
strExt.MakeLower();
CXy* pxy = new CXy;
if (strExt == _T(".dfb") || strExt == _T(".dft"))
pView->m_pDoc->SerializeRead(pxy, fileName);
else if (strExt == _T(".dfd") || strExt == _T(".kev"))
{
CString path(fileName);
pxy->ReadWithExtension(path);
}
else if (!pxy->ReadOtherWithExtension(fileName)) //读取其它类型不成功时
{
pxy->ReadWithExtension(fileName);
}
if (!pxy->GetProjection().IsEmpty() && !pView->m_pDoc->GetDraw()->GetProjection().IsEmpty())
pxy->ChangeToProjection(pView->m_pDoc->GetDraw()->GetProjection());
CPositionList select;
if (onBottom == TRUE)
{
pView->m_pDoc->GetDraw()->MoveInBottom(pxy, select);
}
else
{
int flag = pView->m_pDoc->GetDraw()->MoveIn(pxy, select);
}
delete pxy;
}
extern "C" __declspec(dllexport)
void WellPoleFileMerge(CSigmaView* pView, LPCTSTR fileName, bool onBottom)
{
//CRect8 rect(1e100, -1e100, -1e100, 1e100);
//pView->m_pDoc->m_pXy->GetRange(rect);
CString filePath(fileName);
if (!filePath.IsEmpty())
{
CXy* pXy = pView->m_pDoc->GetDraw();
CXyDC* pXyDC = &pView->m_pDoc->GetDC();
CRect8 srect = pXy->GetRange();
pXy->PCG_InsertWellOrSectionToMap(filePath, &pView->m_pDoc->GetDC());
WellExtentObjMoveToPoint(NULL, srect.left, srect.top, pXy->GetLatestReadOnes());
pView->m_pDoc->Invalidate();
}
}
extern "C" __declspec(dllexport)
void MultiWellSectionFileMerge(CSigmaView* pView, LPCTSTR fileName, bool onBottom)
{
//CRect8 rect(1e100, -1e100, -1e100, 1e100);
//pView->m_pDoc->m_pXy->GetRange(rect);
CString filePath(fileName);
if (!filePath.IsEmpty())
{
CXy* pXy = pView->m_pDoc->GetDraw();
CRect8 srect = pXy->GetRange();
pXy->PCG_InsertWellOrSectionToMap(filePath, &pView->m_pDoc->GetDC());
WellExtentObjMoveToPoint(NULL, srect.left, srect.top, pXy->GetLatestReadOnes());
pView->m_pDoc->Invalidate();
}
}
extern "C" __declspec(dllexport)
void FileMergeBefore(CSigmaView* pView, LPCTSTR fileName, LPCTSTR layerName)
{
CString strExt;
CSplitPath sp(fileName);
strExt = sp.GetExtension();
strExt.MakeLower();
CXy* pxy = new CXy;
if (strExt == _T(".dfb") || strExt == _T(".dft"))
pView->m_pDoc->SerializeRead(pxy, fileName);
else if (!pView->m_pDoc->GetDraw()->ReadOtherWithExtension(fileName)) // 读取其它类型不成功时
pxy->ReadWithExtension(fileName);
if (!pxy->GetProjection().IsEmpty() && !pView->m_pDoc->GetDraw()->GetProjection().IsEmpty())
pxy->ChangeToProjection(pView->m_pDoc->GetDraw()->GetProjection());
CPositionList select;
pView->m_pDoc->GetDraw()->MoveInBefore(pxy, select, layerName);
delete pxy;
}
extern "C" __declspec(dllexport)
void FileMergeAfter(CSigmaView* pView, LPCTSTR fileName, LPCTSTR layerName)
{
CString strExt;
CSplitPath sp(fileName);
strExt = sp.GetExtension();
strExt.MakeLower();
CXy* pxy = new CXy;
if (strExt == _T(".dfb") || strExt == _T(".dft"))
pView->m_pDoc->SerializeRead(pxy, fileName);
else if (!pView->m_pDoc->GetDraw()->ReadOtherWithExtension(fileName)) // 读取其它类型不成功时
pxy->ReadWithExtension(fileName);
if (!pxy->GetProjection().IsEmpty() && !pView->m_pDoc->GetDraw()->GetProjection().IsEmpty())
pxy->ChangeToProjection(pView->m_pDoc->GetDraw()->GetProjection());
CPositionList select;
pView->m_pDoc->GetDraw()->MoveInAfter(pxy, select, layerName);
delete pxy;
}
extern "C" __declspec(dllexport)
void FileSaveView(CSigmaView* pView, LPCTSTR fileName)
{
CStdioFile fw;
if (!fw.Open(fileName, CFile::modeCreate | CFile::modeWrite))
{
return;
}
pView->m_pDoc->GetDraw()->DFD_WriteViewData(*(CFile*)&fw, CUR_VERSION);
fw.Close();
}
extern "C" __declspec(dllexport)
void FileSaveSelect(CSigmaView* pView, LPCTSTR fileName)
{
CItemSelect* pItemSelect = pView->m_pDoc->GetSelectItem();
if (pItemSelect == NULL) return;
CStdioFile fw;
if (!fw.Open(fileName, CFile::modeCreate | CFile::modeWrite))
{
return;
}
pView->m_pDoc->GetDraw()->DFD_Write(*(CFile*)&fw, pItemSelect->m_selection);
fw.Close();
}
extern "C" __declspec(dllexport)
BOOL BtnEnable(CSigmaView* pView)
{
CItemSelect* pItem = pView->m_pDoc->GetSelectItem();
if (pItem == NULL)
{
return false;
}
else if (pItem->GetSelectedCount() <= 0)
{
return false;
}
else
{
return true;
}
}
extern "C" __declspec(dllexport)
void FileSavePoint(CSigmaView* pView, LPCTSTR fileName)
{
CStdioFile fw;
if (!fw.Open(fileName, CFile::modeCreate | CFile::modeWrite))
{
return;
}
pView->m_pDoc->GetDraw()->DFD_WriteSelectData(*(CFile*)&fw, DOUBLEFOX_POINT, CUR_VERSION);
fw.Close();
}
extern "C" __declspec(dllexport)
void FileSaveCurve(CSigmaView* pView, LPCTSTR fileName)
{
CStdioFile fw;
if (!fw.Open(fileName, CFile::modeCreate | CFile::modeWrite))
{
return;
}
pView->m_pDoc->GetDraw()->DFD_WriteSelectData(*(CFile*)&fw, DOUBLEFOX_CURVE, CUR_VERSION);
fw.Close();
}
extern "C" __declspec(dllexport)
void FileSaveSolid(CSigmaView* pView, LPCTSTR fileName)
{
CStdioFile fw;
if (!fw.Open(fileName, CFile::modeCreate | CFile::modeWrite))
{
return;
}
pView->m_pDoc->GetDraw()->DFD_WriteSelectPline(*(CFile*)&fw, CUR_VERSION, PLINE_SOLID, TRUE);
fw.Close();
}
extern "C" __declspec(dllexport)
void FileSaveText(CSigmaView* pView, LPCTSTR fileName)
{
CStdioFile fw;
if (!fw.Open(fileName, CFile::modeCreate | CFile::modeWrite))
{
return;
}
pView->m_pDoc->GetDraw()->DFD_WriteSelectData(*(CFile*)&fw, DOUBLEFOX_TEXT, CUR_VERSION);
fw.Close();
}
extern "C" __declspec(dllexport)
void FileSaveCleanCurve(CSigmaView* pView, LPCTSTR fileName)
{
CStdioFile fw;
if (!fw.Open(fileName, CFile::modeCreate | CFile::modeWrite))
{
return;
}
pView->m_pDoc->GetDraw()->DFD_WritePurePline(*(CFile*)&fw);
fw.Close();
}
extern "C" __declspec(dllexport)
void FileSaveToXyz(CSigmaView* pView, LPCTSTR fileName)
{
CStdioFile fw;
if (!fw.Open(fileName, CFile::modeCreate | CFile::modeWrite))
{
return;
}
pView->m_pDoc->GetDraw()->DFD_WriteXYZ(*(CFile*)&fw);
fw.Close();
}
extern "C" __declspec(dllexport)
void FileSaveToMark(CSigmaView* pView, LPCTSTR fileName)
{
CItemSaveToMark* pItem = (CItemSaveToMark*)pView->m_pDoc->FindItem(ITEM_SAVE_TO_MARK);
if (pItem)
{
if (pView->m_pDoc->m_pItemMakeMark)
pItem->m_rect = pView->m_pDoc->m_pItemMakeMark->m_rect;
pView->m_pDoc->SetItem(pItem);
}
}
CRect8 GetRect(void)
{
CRect8 rect(c_down.x0, c_down.y0, c_last.x0, c_last.y0);
/*if (m_bShiftDown)
{
int sf = 1;
if (c_last.x0 > c_down.x0)
{
if (c_last.y0 < c_down.y0)
sf = -1;
}
else if (c_last.y0 > c_down.y0)
sf = -1;
rect.bottom = rect.top + rect.Width()*sf;
}*/
rect.NormalizeRect();
return rect;
}
extern "C" __declspec(dllexport)
BOOL OnLButtonUpOther(CSigmaView* pView, double firstX, double firstY, double lastX, double lastY, HDC hdc, int vk=0)
{
CPoint firstPt, lastPt;
firstPt.x = firstX;
firstPt.y = firstY;
lastPt.x = lastX;
lastPt.y = lastY;
CRect rect;
CXyDC* pDC = &pView->m_pDoc->GetDC();
rect = pView->GetClientRect(); //可能会出错
CPoint2D firstDp = pDC->GetReal(firstPt);
CPoint2D lastDp = pDC->GetReal(lastPt);
c_down = firstDp;
c_last = lastDp;
CDC* pCdc = CDC::FromHandle(hdc);
return pView->OnLButtonUpOther(pCdc, 0, lastPt, vk);
}
extern "C" __declspec(dllexport)
void BtnOkSaveMarkToFile(CSigmaView* pView, LPCTSTR fileName, LPCTSTR symbolName)
{
//CItemSelect * itemSelect = pView->m_pDoc->GetSelectItem();
//if (itemSelect == 0)
// return;
CRect8 rect = GetRect();
//CRect rect;
//CXyDC* pDC = &pView->m_pDoc->GetDC();
//rect = pView->GetClientRect(); //可能会出错
//CRect8 rt = pDC->GetReal(rect);
CList<POSITION, POSITION> select;
pView->m_pDoc->GetDraw()->IsInRange(rect, select);
if (select.GetCount() > 0)
{
CStdioFile sfw;
if (!sfw.Open(fileName, CFile::modeCreate | CFile::modeWrite | CFile::modeNoTruncate))
{
////::AfxMessageBox(IDS_STRING_OPEN_WRITE_ERROR);
//pView->m_pDoc->EnableDefaultTool();
return;
}
sfw.SeekToEnd();
CFile &fw = *(CFile*)&sfw;
CString str;
str.Format("New %s", symbolName);
AfxGetPublicFunction()->WriteLine(fw, str);
//GetDoc()->BeginProgress(IDS_STRING_WriteFile);
pView->m_pDoc->GetDraw()->DFD_Write(fw, select);
//GetDoc()->EndProgress();
AfxGetPublicFunction()->WriteLine(fw, "EndNew");
select.RemoveAll();
fw.Close();
}
pView->m_pDoc->ClearItems();
}
extern "C" __declspec(dllexport)
void BtnCancelSaveMarkToFile(CSigmaView* pView)
{
pView->m_pDoc->ClearItems();
}
void InsertChar(CString &line)
{
for (int i = 0; i < maps.GetCount(); i++)
{
if (line.GetLength() < maps[i].x) continue;
switch (maps[i].y)
{
case 0:
line.Insert(maps[i].x, ",");
break;
case 1:
line.Insert(maps[i].x, " ");
break;
}
}
line.Replace(",", " ");
}
CString LoadFile(CString name)
{
CString m_length;
CString m_data;
int rows = 0;
if (name.IsEmpty()) return "";
CStdioFile fr;
if (fr.Open(name, CFile::modeRead) == FALSE)return "";
m_length.Format("%.3lfK", fr.GetLength()*1.0 / 1024.0);
m_data.Empty();
CString str, line, strRowCount;
int count = 0;
char en[3]; en[0] = 13; en[1] = 10; en[2] = '\0';
//while (fr.ReadString(str) && ++count <= 400)
while (fr.ReadString(str))
{
rows++;
InsertChar(str);
line.Format("%3d |%s", count, str);
m_data += line;
m_data += en;
}
fr.Close();
//if (count > 400) m_data += "......";
strRowCount.Format(_T("%d"), rows);
m_data += "#" + strRowCount;
return m_data;
}
int GetParameter(CString cmd, CStringList &list)
{
if (cmd.IsEmpty()) return 0;
int i, j;
CString str;
char c[256];
i = 0;
j = 0;
BOOL bb = FALSE;
for (i = 0; i < cmd.GetLength(); i++)
{
if (bb)
{
if (cmd[i] == '\"')
{
c[j] = 0;
bb = FALSE;
list.AddTail(c);
j = 0;
continue;
}
c[j] = cmd[i];
}
if (cmd[i] == '\"')
{
bb = TRUE;
continue;
}
else
{
if (cmd[i] == ' ' && bb == FALSE)
{
if (j > 0)
{
c[j] = 0;
list.AddTail(c);
j = 0;
}
continue;
}
c[j] = cmd[i];
}
j++;
}
if (j > 0)
{
c[j] = 0;
list.AddTail(c);
}
return (int)list.GetCount();
}
#define __MaxFileListString 409600
extern "C" __declspec(dllexport)
int InputFile(CSigmaView* pView, LPCTSTR fileName, BYTE* Content)
{
CString fileContent;
FileList.RemoveAll();
GetParameter(fileName, FileList);
if (FileList.GetCount() > 0)
fileContent = LoadFile(FileList.GetHead());
int nLen = fileContent.GetLength();
memcpy(Content, fileContent.GetBuffer(0), nLen);
return nLen;
}
extern "C" __declspec(dllexport)
int GetFileLength(CSigmaView* pView, LPCTSTR fileName)
{
CString fileContent;
FileList.RemoveAll();
GetParameter(fileName, FileList);
if (FileList.GetCount() > 0)
fileContent = LoadFile(FileList.GetHead());
int nLen = fileContent.GetLength();
return nLen;
}
extern "C" __declspec(dllexport)
int InsertChar(CSigmaView* pView, int nCharIndex, int nb, BYTE* Content)
{
////UpdateData();
CPoint point, pt;
////CEdit m_ConData;
int m_insert = 1;
////int fvl = m_ConData.GetFirstVisibleLine();
////pt = m_ConData.GetCaretPos();
//pt.x = x;
//pt.y = y;
//int n = m_ConData.CharFromPos(pt);
//int nLineIndex = HIWORD(n);
//int nCharIndex = LOWORD(n);
//int nb = m_ConData.LineIndex();
point.x = nCharIndex - nb - 5;
//point.x = nCharIndex - nb;
if (point.x < 0) return -1;
point.y = m_insert;
for (int i = 0; i < maps.GetCount(); i++)
{
if (maps[i].x > point.x)
{
pt = maps[i];
pt.x += 1;
maps[i] = point;
point = pt;
}
}
maps[(int)maps.GetCount()] = point;
CString fileContent = LoadFile(FileList.GetHead());
int nLen = fileContent.GetLength();
memcpy(Content, fileContent.GetBuffer(0), nLen);
return nLen;
}
int CutString(CStringArray &m_type, CString str)
{
int i, j;
i = 1;
char s[256];
j = 0;
m_type.RemoveAll();
if (str.IsEmpty()) return 0;
for (i = 0; i < str.GetLength(); ++i)
{
if (str[i] < 33 && str[i] >= 0)
{
if (j)
{
s[j] = 0;
m_type.Add(s);
}
j = 0;
}
else
{
s[j] = str[i];
j++;
}
}
s[j] = 0;
m_type.Add(s);
return (int)m_type.GetSize();
}
BOOL IsDigit(CString& line)
{
return AfxGetPublicFunction()->IsDigit(line);
}
CStringArray* SplitString(CString string, char pattern)
{
CStringArray* strArray = new CStringArray();
CString strTemp;
strTemp = string;
int iPos = 0;
while (iPos != -1)
{
iPos = strTemp.Find(pattern);
if (iPos == -1)
{
break;
}
strArray->Add(strTemp.Left(iPos));
strTemp = strTemp.Mid(iPos + 1, strTemp.GetLength());
}
strArray->Add(strTemp);
return strArray;
}
void ImportBasePoints(CSigmaView* pView, BYTE * buffCurve, int buffLen)
{
CXy* pXy = new CXy;
CMemFile mf(buffCurve, buffLen);
pXy->DML_Read2(mf);
CPtrList* pList = pXy->GetValueList();
POSITION pos;
COne* pOne;
pos = pList->GetHeadPosition();
while (pos)
{
pOne = (COne*)pList->GetNext(pos);
if (pOne->GetType() != DOUBLEFOX_POINT)continue;
CString LayerName = pOne->GetLayer()->GetPathName();
pView->m_pDoc->m_pXy->SetCurrentLayer(LayerName);
CPoint* pPoint = (CPoint*)pOne->GetValue();
pView->m_pDoc->m_pXy->AddElement(pPoint, DOUBLEFOX_POINT);
}
/*if (selectType == "PointClass")
{
point = new CPointNameEx;
point->x0 = x0;
point->y0 = y0;
point->z0 = z0;
point->SetName(CString(arrValue[pName - 1]));
pxy->AddElement(point, DOUBLEFOX_POINT);
}
else if (selectType == "ScatterPoint")
{
pxyz = new CPointXyz;
pxyz->x0 = x0;
pxyz->y0 = y0;
pxyz->z0 = z0;
pxyz->SetName();
pxy->AddElement(pxyz, DOUBLEFOX_POINT);
}*/
}
static void ImportData(const std::string& xml, std::function<void(TiXmlElement *)> cb)
{
TiXmlDocument xmlDoc;
xmlDoc.Parse(xml.c_str());
TiXmlElement* rootElement = xmlDoc.RootElement();
if (rootElement == nullptr)
{
std::cout << "Invalid XML format." << std::endl;
return;
}
TiXmlElement* pointElement = rootElement->FirstChildElement("Data");
while (pointElement != nullptr)
{
cb(pointElement);
pointElement = pointElement->NextSiblingElement("Data");
}
}
static const char* GetFirstChildElementText(TiXmlElement* element, const char *key)
{
TiXmlElement* child = element->FirstChildElement(key);
if (child == nullptr)
{
return nullptr;
}
return child->GetText();
}
extern "C" __declspec(dllexport)
void ImportFractionPoint(CSigmaView* pView, BYTE * buff, int buffLen)
{
CXy* pXy = pView->m_pDoc->GetDraw();
std::string xml((char*)buff, buffLen);
auto cb = [pXy](TiXmlElement* pointElement)
{
const char* x = GetFirstChildElementText(pointElement, "X");
const char* y = GetFirstChildElementText(pointElement, "Y");
const char* numerator = GetFirstChildElementText(pointElement, "分子");
const char* denominator = GetFirstChildElementText(pointElement, "分母");
const char* layer = GetFirstChildElementText(pointElement, "图层");
CPointTwoName* pPoint = new CPointTwoName();
pPoint->x0 = std::stod(x);
pPoint->y0 = std::stod(y);
pPoint->m_name1.SetName(numerator);
pPoint->m_name2.SetName(denominator);
CLayer* pLayer = pXy->FindAddLayer(layer);
POSITION pos = pXy->AddElement(pPoint, DOUBLEFOX_TWOPOINT);
COne* pOne = pXy->GetAt(pos);
pOne->SetLayer(pLayer);
};
ImportData(xml, cb);
}
extern "C" __declspec(dllexport)
void ImportCrossPoint(CSigmaView* pView, BYTE * buff, int buffLen)
{
CXy* pXy = pView->m_pDoc->GetDraw();
std::string xml((char*)buff, buffLen);
auto cb = [pXy](TiXmlElement* pointElement)
{
const char* x = GetFirstChildElementText(pointElement, "X");
const char* y = GetFirstChildElementText(pointElement, "Y");
const char* z = GetFirstChildElementText(pointElement, "Z");
const char* layer = GetFirstChildElementText(pointElement, "图层");
const char* name1 = GetFirstChildElementText(pointElement, "第一象限");
const char* name2 = GetFirstChildElementText(pointElement, "第二象限");
const char* name3 = GetFirstChildElementText(pointElement, "第三象限");
const char* name4 = GetFirstChildElementText(pointElement, "第四象限");
CPointCrossName* pPoint = new CPointCrossName();
pPoint->x0 = std::stod(x);
pPoint->y0 = std::stod(y);
pPoint->m_name1.SetName(name1);
pPoint->m_name2.SetName(name2);
pPoint->m_name3.SetName(name3);
pPoint->m_name4.SetName(name4);
CLayer* pLayer = pXy->FindAddLayer(layer);
POSITION pos = pXy->AddElement(pPoint, DOUBLEFOX_CROSSPOINT);
COne* pOne = pXy->GetAt(pos);
pOne->SetLayer(pLayer);
};
ImportData(xml, cb);
}
/**
* 导入普通点
*
* \param pView
* \param buff
* \param bufLen
*/
extern "C" __declspec(dllexport)
void ImportNormalPoint(CSigmaView * pView, BYTE * buff, int bufLen)
{
CXy* pXy = pView->m_pDoc->GetDraw();
std::string xml((char*)buff, bufLen);
auto cb = [pXy](TiXmlElement* pointElement)
{
const char* name = GetFirstChildElementText(pointElement, "名称");
const char* x = GetFirstChildElementText(pointElement, "X");
const char* y = GetFirstChildElementText(pointElement, "Y");
const char* z = GetFirstChildElementText(pointElement, "Z");
const char* layer = GetFirstChildElementText(pointElement, "图层");
CPointNameEx* pPoint = new CPointNameEx();
pPoint->SetName(name);
pPoint->x0 = std::stod(x);
pPoint->y0 = std::stod(y);
if (z != nullptr)
{
pPoint->z0 = std::stod(z);
}
CLayer* pLayer = pXy->FindAddLayer(layer);
POSITION pos = pXy->AddElement(pPoint, DOUBLEFOX_POINT);
COne* pOne = pXy->GetAt(pos);
pOne->SetLayer(pLayer);
};
ImportData(xml, cb);
}
/**
* 导入散点
*
* \param pView
* \param buff
* \param bufLen
*
* 格式示例如下Layer 也可能有多层
*/
extern "C" __declspec(dllexport)
void ImportScatterPoint(CSigmaView * pView, BYTE * buff, int bufLen)
{
CXy* pXy = pView->m_pDoc->GetDraw();
std::string xml((char*)buff, bufLen);
auto cb = [pXy](TiXmlElement* pointElement)
{
const char* x = GetFirstChildElementText(pointElement, "X");
const char* y = GetFirstChildElementText(pointElement, "Y");
const char* z = GetFirstChildElementText(pointElement, "Z");
const char* layer = GetFirstChildElementText(pointElement, "图层");
CPointNameEx* pPoint = new CPointNameEx();
pPoint->x0 = std::stod(x);
pPoint->y0 = std::stod(y);
if (z != nullptr)
pPoint->z0 = std::stod(z);
CLayer* pLayer = pXy->FindAddLayer(layer);
POSITION pos = pXy->AddElement(pPoint, DOUBLEFOX_POINT);
COne* pOne = pXy->GetAt(pos);
pOne->SetLayer(pLayer);
};
ImportData(xml, cb);
}
void AddCurve(CList<dfPoint, dfPoint> &dp, CString name, int HaveLocate, CXy* pxy)
{
if (dp.GetCount() < 0) return;
CCurveEx *curve;
curve = new CCurveEx;
curve->SetPoints(dp, HaveLocate);
curve->SetName(name);
//curve->width = 20;
dp.RemoveAll();
pxy->AddElement(curve, DOUBLEFOX_CURVE);
}
int OpenFile(CXy* pXy, BYTE * buffCurve, int bufLen)
{
CMemFile mf(buffCurve, bufLen);
pXy->DML_Read2(mf);
return 1;
}
struct LineEntry
{
double x;
double y;
double z;
double l;
CString name;
CString layer;
};
void ImportLinesClass(CSigmaView* pView, BYTE * buffCurve, int bufLen, BOOL is123)
{
std::string xml((char *)buffCurve, bufLen);
std::list<std::shared_ptr<LineEntry>> entries;
auto cb = [&entries](TiXmlElement* dataElement)
{
const char* x = GetFirstChildElementText(dataElement, "X");
const char* y = GetFirstChildElementText(dataElement, "Y");
const char* z = GetFirstChildElementText(dataElement, "Z");
const char* l = GetFirstChildElementText(dataElement, "L");
const char* name = GetFirstChildElementText(dataElement, "名称");
const char* layer = GetFirstChildElementText(dataElement, "图层");
if (x == nullptr || y == nullptr)
{
return;
}
std::shared_ptr<LineEntry> entry = std::make_shared<LineEntry>();
entry->x = std::stod(x);
entry->y = std::stod(y);
if (z != nullptr)
entry->z = std::stod(z);
if (l != nullptr)
entry->l = std::stod(l);
entry->name = name;
entry->layer = layer;
entries.push_back(entry);
};
ImportData(xml, cb);
// 按拆图层拆分
std::map<CString, std::vector<std::shared_ptr<LineEntry>>> layerMap;
for (const auto& entry : entries)
{
layerMap[entry->layer].push_back(entry);
}
for (const auto& pair : layerMap)
{
CString layerName = pair.first;
const auto& lineEntries = pair.second;
using LineEntries = std::vector<std::shared_ptr<LineEntry>>;
std::deque<std::pair<CString, LineEntries>> lineStack;
// 内部再按名称拆分,这样就拆分出了不同的线,名称相同且连续的点表示是同一条线
for (const auto& lineEntry : lineEntries)
{
if (lineStack.empty() || lineStack.back().first != lineEntry->name)
{
lineStack.push_back({ lineEntry->name, { lineEntry } });
}
else
{
lineStack.back().second.push_back(lineEntry);
}
}
CXy* pXy = pView->m_pDoc->GetDraw();
// 添加图层
CLayer* pLayer = pXy->FindAddLayer(layerName);
// 添加曲线
for (const auto& pair : lineStack)
{
CString lineName = pair.first;
const auto& lineEntries = pair.second; // 这里是一条线
CCurveEx* pCurve = new CCurveEx();
pCurve->SetName(lineName);
pCurve->Create((int)lineEntries.size());
pCurve->width = 1;
for (size_t i = 0; i < lineEntries.size(); i++)
{
const auto &line = lineEntries[i];
pCurve->x[i] = line->x;
pCurve->y[i] = line->y;
pCurve->z[i] = line->z;
pCurve->l[i] = line->l;
}
// 不管用户输不输入桩号,我们都重新计算一遍,用户给的桩号值有可能是错误的
pCurve->GetLocation();
POSITION pos = pXy->AddElement(pCurve, DOUBLEFOX_CURVE);
COne* pOne = pXy->GetAt(pos);
pOne->SetLayer(pLayer);
}
}
}
extern "C" __declspec(dllexport)
void WriteXy2DFD(CXy* pXy, BYTE*& buffData, int& bufLen)
{
pXy->WriteMemory(buffData, bufLen, 1);
}
extern "C" __declspec(dllexport)
void CreateXyFromDFD(BYTE* buffData, int bufLen, CXy*& pXy)
{
pXy = new CXy;
pXy->ReadMemory(buffData, bufLen, 1);
}
extern "C" __declspec(dllexport)
void ImportData(CSigmaView* pView, BYTE * buffCurve, int bufLen)
{
CMemFile mf(buffCurve, bufLen);
// pView->m_pDoc->m_pXy->DML_Read2(mf);
pView->m_pDoc->m_pXy->DML_ReadData(mf);
}
extern "C" __declspec(dllexport)
void ImportCurve(CSigmaView* pView, BYTE * buffFileContent, int bufLen, LPCTSTR selectType)
{
CString selType = selectType;
if (selType == "LinesClass")
{
ImportLinesClass(pView, buffFileContent, bufLen, false);
}
else if (selType == "LinesClass123")
{
ImportLinesClass(pView, buffFileContent, bufLen, true);
}
}
enum EImportTypeID
{
typePointBase = 1,
typePointXyz = 2,
typeCurveBase = 3,
typeCurve123 = 4,
typeWellOffset = 5,
typeWellAvgAngle1 = 6,
typeWellAvgAngle2 = 7,
typeWellMinCurvature = 8,
typeWellPositionCoordinate = 11,
typePointCross = 9,
typePointTwo = 10
};
// 井斜实体类
struct WellDeviationEntry
{
double x;
double y;
CString name; // 井名
CString layer; // 图层
double dx; // 横偏移
double dy; // 纵偏移
double bevel; // 井斜角
double azimuth; // 方位角
double xh; // 斜深
double vh; // 垂深
};
static std::shared_ptr<WellDeviationEntry> CreateWellDeviationEntry(TiXmlElement* dataElement)
{
auto entry = std::make_shared<WellDeviationEntry>();
memset(entry.get(), 0, sizeof(entry));
const char* x = GetFirstChildElementText(dataElement, "X");
const char* y = GetFirstChildElementText(dataElement, "Y");
const char* name = GetFirstChildElementText(dataElement, "名称");
const char* layer = GetFirstChildElementText(dataElement, "图层");
const char* dx = GetFirstChildElementText(dataElement, "DX");
const char* dy = GetFirstChildElementText(dataElement, "DY");
const char* bevel = GetFirstChildElementText(dataElement, "井斜角");
const char* azimuth = GetFirstChildElementText(dataElement, "方位角");
const char* xh = GetFirstChildElementText(dataElement, "斜深");
const char* vh = GetFirstChildElementText(dataElement, "垂深");
entry->x = std::stod(x);
entry->y = std::stod(y);
entry->name = name;
entry->layer = layer;
if (dx != nullptr && dy != nullptr)
{
entry->dx = std::stod(dx);
entry->dy = std::stod(dy);
}
if (bevel != nullptr)
{
entry->bevel = std::stod(bevel);
}
if (azimuth != nullptr)
{
entry->azimuth = std::stod(azimuth);
}
if (xh != nullptr)
{
entry->xh = std::stod(azimuth);
}
if (vh != nullptr)
{
entry->vh = std::stod(vh);
}
return entry;
}
static void FillTrackPointList(const std::vector<std::shared_ptr<WellDeviationEntry>>& entries, int nMode, CWellTrackPointList &arrPoints)
{
for (const auto& entry : entries)
{
CWellTrack::CWellTrackPoint wop;
wop.InitPoint();
wop.point.x0 = entry->x;
wop.point.y0 = entry->y;
switch (nMode)
{
case typeWellOffset:
wop.dx = entry->dx;
wop.dy = entry->dy;
break;
case typeWellMinCurvature:
case typeWellAvgAngle1:
wop.bevel = entry->bevel;
wop.azimuth = entry->azimuth;
wop.xh = entry->azimuth;
break;
case typeWellAvgAngle2:
wop.bevel = entry->bevel;
wop.azimuth = entry->azimuth;
wop.vh = entry->vh;
break;
case typeWellPositionCoordinate:
//pxy->SetCurrentLayer(layerName);
//AddCurve(dp, arrValue[0], HaveLocate, pxy);
break;
}
arrPoints.AddTail(wop);
}
}
static void ImportWellDeviation(CSigmaView * pView, BYTE * buff, int bufLen, int nMode)
{
CXy *pXy = pView->m_pDoc->GetDraw();
std::string xml((char *)buff, bufLen);
// 按井名分类
std::map<CString, std::vector<std::shared_ptr<WellDeviationEntry>>> entryMap;
auto cb = [&entryMap](TiXmlElement* dataElement)
{
auto entry = CreateWellDeviationEntry(dataElement);
entryMap[entry->name].push_back(entry);
};
ImportData(xml, cb);
if (nMode == typeWellPositionCoordinate) // 如果是井位坐标,那就是已经算好了,不需要再进行计算了
{
for (auto& pair : entryMap)
{
CString name = pair.first;
const auto& line = pair.second;
CCurveEx* pCurve = new CCurveEx();
pCurve->SetName(name);
pCurve->width = 1;
pCurve->Create((int)line.size());
for (int i = 0; i < line.size(); i++)
{
pCurve->x[i] = line[i]->x;
pCurve->y[i] = line[i]->y;
}
CLayer *pLayer = pXy->FindAddLayer(line[0]->layer);
POSITION pos = pXy->AddElement(pCurve, DOUBLEFOX_CURVE);
COne* pOne = pXy->GetAt(pos);
pOne->SetLayer(pLayer);
}
}
else // 计算井斜轨迹
{
// 拆分成不同的线
for (auto& pair : entryMap)
{
CWellTrackPointList arrPoints;
FillTrackPointList(pair.second, nMode, arrPoints);
CWellTrack wellTrack;
CList<dfPoint, dfPoint> dp;
int HaveLocate = wellTrack.CreateTrack(arrPoints, dp, (CWellTrack::ETrackType)nMode);
if (HaveLocate > 0)
{
AddCurve(dp, pair.first, HaveLocate, pXy);
}
}
}
}
/**
* 偏移量法
*
* \param pView
* \param buff
* \param bufLen
*/
extern "C" __declspec(dllexport)
void ImportOffestMethod(CSigmaView * pView, BYTE * buff, int bufLen)
{
ImportWellDeviation(pView, buff, bufLen, typeWellOffset);
}
/**
* 平均角法一
*
* \param pView
* \param buff
* \param bufLen
*/
extern "C" __declspec(dllexport)
void ImportAverageFirstMethod(CSigmaView * pView, BYTE * buff, int bufLen)
{
ImportWellDeviation(pView, buff, bufLen, typeWellAvgAngle1);
}
/**
* 平均角法二
*
* \param pView
* \param buff
* \param bufLen
*/
extern "C" __declspec(dllexport)
void ImportAverageSecondMethod(CSigmaView * pView, BYTE * buff, int bufLen)
{
ImportWellDeviation(pView, buff, bufLen, typeWellAvgAngle2);
}
/**
* 井位坐标
*
* \param pView
* \param buff
* \param bufLen
*/
extern "C" __declspec(dllexport)
void ImportWellPosition(CSigmaView * pView, BYTE * buff, int bufLen)
{
ImportWellDeviation(pView, buff, bufLen, typeWellPositionCoordinate);
}
CXyDC* GetDC(CSigmaView* pView)
{
if (pView->m_pDoc == NULL)
return NULL;
return &pView->m_pDoc->GetDC();// m_xyDC;
}
CMemoryDC* ExportImage(CSigmaView* pView, CSize sz, UINT bpp)
{
if (sz.cx <= 0 || sz.cy <= 0) return NULL;
CMemoryDC *pImageDC = new CMemoryDC;
if (!pImageDC->Create(sz, bpp))
{
delete pImageDC;
//::AfxMessageBox("Create Image error!");
return NULL;
}
CDC* pBakDC = GetDC(pView)->GetDC();
CRect BakRT = GetDC(pView)->GetViewRect();
pImageDC->Erase(RGB(255, 255, 255));
CRect rect(0, 0, sz.cx, sz.cy);
pView->m_pDoc->SetCDC(pImageDC);
pView->m_pDoc->GetDC().SetViewRect(rect);
pView->m_pDoc->OnDraw(pView->m_pDoc->GetDC());
pView->m_pDoc->SetCDC(pBakDC);
pView->m_pDoc->GetDC().SetViewRect(BakRT);
return pImageDC;
}
BOOL ExportWMF(CSigmaView* pView, LPCTSTR lpFileName, CSize sz)
{
CDC* pBakDC = GetDC(pView)->GetDC();
CRect BakRT = GetDC(pView)->GetViewRect();
CRect rect, rt;
rect.SetRect(0, 0, sz.cx, sz.cy);
//CFile::Remove(lpFileName);
DeleteFile(lpFileName);
CMetaFileDC wmf;
wmf.SetMapMode(MM_TEXT);
//由像素转换为0.01毫米单位
double HorzsizePerPixel = (double)(pBakDC->GetDeviceCaps(HORZSIZE)) / (double)pBakDC->GetDeviceCaps(HORZRES);//一个象素的宽度(单位:毫米/象素)
double VertsizePerPixel = (double)(pBakDC->GetDeviceCaps(VERTSIZE)) / (double)pBakDC->GetDeviceCaps(VERTRES);//一个光栅行(象素)的高度(单位:毫米/象素)
sz.cx = AfxGetPublicFunction()->FloatToLong(sz.cx*HorzsizePerPixel * 100); //单位为0.01毫米
sz.cy = AfxGetPublicFunction()->FloatToLong(sz.cy*VertsizePerPixel * 100); //单位为0.01毫米
//pDC->DPtoHIMETRIC(&sz);
rt.SetRect(0, 0, sz.cx, sz.cy);
if (!wmf.CreateEnhanced(pBakDC, lpFileName, rt, "DoubleFox sj\0\0")) return FALSE;
wmf.SetAttribDC(pBakDC->m_hAttribDC);
pView->m_pDoc->SetCDC(&wmf);
pView->m_pDoc->GetDC().SetViewRect(rect);
pView->m_pDoc->OnDraw(pView->m_pDoc->GetDC());
::DeleteEnhMetaFile(wmf.CloseEnhanced());
pView->m_pDoc->SetCDC(pBakDC);
pView->m_pDoc->GetDC().SetViewRect(BakRT);
return TRUE;
}
void ExportImage(CSigmaView* pView, LPCTSTR lpFileName, CSize sz, UINT bpp)
{
CMemoryDC *pImageDC = ExportImage(pView, sz, bpp);
if (pImageDC == NULL)
return;
CImageInsert *pii = new CImageInsert;
CRect rect(0, 0, sz.cx, sz.cy);
CRect8 rt = pView->m_pDoc->GetDC().GetReal(rect);
pii->x0 = rt.left;
pii->y0 = rt.bottom;
pii->m_size = rt.GetSize();
//pii->m_size.SetSize(GetDC()->GetRealWidth(sz.cx), fabs(GetDC()->GetRealHeight(sz.cy)));
pii->m_pImage = new CImageBase;
//设置图像分辨率
//if (GetPreferences().WorkaroundSave.m_nExportModeDPI == 1) //自定义分辨率
//{
int dpi = 300;
pii->m_pImage->SetXDPI(dpi);
pii->m_pImage->SetYDPI(dpi);
//}
pii->m_pImage->CreateFromHBITMAP((HBITMAP)*pImageDC);
//pii->m_pImage->Attach(pImageDC->Detach());
//::AfxMessageBox(pii->m_pImage->GetLastError());
if (!pii->SaveAs(lpFileName))
//if(!pImageDC->Save(lpFileName))
//::AfxMessageBox("Save image Error");
delete pii;
delete pImageDC;
}
extern "C" __declspec(dllexport)
void GetShowSize(CSigmaView* pView, int* width, int* height)
{
//double width = 0;
//double height = 0;
//获得导出图件的大小
CRect8 rect(1e100, -1e100, -1e100, 1e100);
pView->m_pDoc->GetDrawRange(rect);
//CRect8 rect=GetDoc()->GetDraw()->m_range;
rect.left = pView->m_pDoc->GetDC().left;
rect.top = pView->m_pDoc->GetDC().top;
double dx = rect.Width();
double dy = rect.Height();
CSize sz(pView->m_pDoc->GetDC().GetScreenWidth(dx), abs(pView->m_pDoc->GetDC().GetScreenHeight(dy)));
//str.Format("%lf,%lf,%d,%d",dx,dy,sz.cx,sz.cy);::AfxMessageBox(str);
if (dx < -1e20) sz.cx = 630;
if (dy < -1e20) sz.cy = 470;
*width = sz.cx + 10;
*height = sz.cy + 10;
m_width = sz.cx + 10;
m_height = sz.cy + 10;
}
extern "C" __declspec(dllexport)
int ExportFiles(CSigmaView* pView, LPCTSTR layerName, int nMode)
{
CList<POSITION, POSITION> select;
POSITION pos, pt;
pView->m_pDoc->GetDraw()->GetElement(layerName, select, TRUE);
if (select.IsEmpty())
{
//::AfxMessageBox("No data");
return -1;
}
int total = 0;
total = select.GetCount();
pos = select.GetHeadPosition();
double ptX = 0;
double ptY = 0;
double ptZ = 0;
TiXmlPrinter printer;
string xmlstr;
TiXmlDocument *xmlDocument = new TiXmlDocument();
TiXmlDeclaration * decl = new TiXmlDeclaration("1.0", "UTF-8", "");
xmlDocument->LinkEndChild(decl);
// 根元素。
TiXmlElement *rootElement = new TiXmlElement("ROOT");
xmlDocument->LinkEndChild(rootElement);
CStdioFile fw;
int index = 0;
while (pos)
{
pt = select.GetNext(pos);
COne* pOne = pView->m_pDoc->GetDraw()->GetAt(pt);
int type = pOne->GetType();
int tmp = pOne->GetType();
if (pOne->GetType() == DOUBLEFOX_POINT || pOne->GetType() == DOUBLEFOX_CURVE)
{
if (nMode == DOUBLEFOX_POINT && tmp == nMode)
{
TiXmlElement *itemElement = new TiXmlElement("Item");
rootElement->LinkEndChild(itemElement);
TiXmlElement *WellElement = new TiXmlElement("WellName");
TiXmlElement *LayerElement = new TiXmlElement("Layer");
TiXmlElement *xElement = new TiXmlElement("X");
TiXmlElement *yElement = new TiXmlElement("Y");
TiXmlElement *zElement = new TiXmlElement("Z");
itemElement->LinkEndChild(WellElement);
itemElement->LinkEndChild(LayerElement);
itemElement->LinkEndChild(xElement);
itemElement->LinkEndChild(yElement);
itemElement->LinkEndChild(zElement);
CString name = pOne->GetName();
TiXmlText *wellValue = new TiXmlText(name);
WellElement->LinkEndChild(wellValue);
CString layer = pOne->GetLayer()->GetPathName();
TiXmlText *layerValue = new TiXmlText(layer);
LayerElement->LinkEndChild(layerValue);
CPointNameEx* pPoint = (CPointNameEx*)pOne->GetValue();
CString x;
AfxGetPublicFunction()->FloatToString(x, pPoint->x0, 3);
TiXmlText *xValue = new TiXmlText(x);
xElement->LinkEndChild(xValue);
CString y;
AfxGetPublicFunction()->FloatToString(y, pPoint->y0, 3);
TiXmlText *yValue = new TiXmlText(y);
yElement->LinkEndChild(yValue);
CString z;
AfxGetPublicFunction()->FloatToString(z, pPoint->z0, 3);
TiXmlText *zValue = new TiXmlText(z);
zElement->LinkEndChild(zValue);
}
else if (nMode == DOUBLEFOX_CURVE && tmp == nMode)
{
if (type == 1)
{
return -1;
}
TiXmlElement *lineElement = new TiXmlElement("Line");
rootElement->LinkEndChild(lineElement);
CString txt;
CCurveEx* pCurve = (CCurveEx*)pOne->GetValue();
for (int i = 0; i < pCurve->num; i++)
{
TiXmlElement *itemElement = new TiXmlElement("Item");
lineElement->LinkEndChild(itemElement);
TiXmlElement *IDElement = new TiXmlElement("ID");
TiXmlElement *LayerElement = new TiXmlElement("Layer");
TiXmlElement *xElement = new TiXmlElement("X");
TiXmlElement *yElement = new TiXmlElement("Y");
TiXmlElement *zElement = new TiXmlElement("Z");
TiXmlElement *nameElement = new TiXmlElement("Name");
itemElement->LinkEndChild(IDElement);
itemElement->LinkEndChild(LayerElement);
itemElement->LinkEndChild(xElement);
itemElement->LinkEndChild(yElement);
itemElement->LinkEndChild(zElement);
itemElement->LinkEndChild(nameElement);
ptX = pCurve->x[i];
ptY = pCurve->y[i];
ptZ = pCurve->z[i];
txt.Format(_T("%.3lf"), ptX);
TiXmlText *xValue = new TiXmlText(txt);
xElement->LinkEndChild(xValue);
txt.Format(_T("%.4f"), ptY);
TiXmlText *yValue = new TiXmlText(txt);
yElement->LinkEndChild(yValue);
//判断是否有Z值
if (pCurve->nPoint >= 3)
{
txt.Format(_T("%g"), ptZ);
TiXmlText *zValue = new TiXmlText(txt);
zElement->LinkEndChild(zValue);
}
if (pCurve->name != NULL)
{
TiXmlText *nameValue = new TiXmlText(pCurve->name);
nameElement->LinkEndChild(nameValue);
}
txt = pOne->GetLayer()->GetPathName();
TiXmlText *layerValue = new TiXmlText(txt);
LayerElement->LinkEndChild(layerValue);
txt.Format("%d", index);
TiXmlText *IDValue = new TiXmlText(txt);
IDElement->LinkEndChild(IDValue);
}
}
index++;
}
}
xmlDocument->Accept(&printer);
xmlstr = printer.CStr();
xmlExport = CString(xmlstr.c_str());
int len = xmlExport.GetLength();
delete xmlDocument;
return len;
}
extern "C" __declspec(dllexport)
void MemoCopyExportXml(BYTE* xml)
{
int len = xmlExport.GetLength();
memcpy(xml, xmlExport.GetBuffer(0), len);
}
int GetUnitSel(int CurSel, int selectIndex)
{
switch (selectIndex)
{
default:
case 0://公里
case 1://米
case 2://分米
case 3://厘米
case 4://毫米
break;
case 5://英尺
case 6://英寸
case 7://英里
case 8://码
case 9://海里
case 10://象素
CurSel += 2;
break;
}
return CurSel;
}
long GetScreenW(CSigmaView* pView, CDC* pDC, double x, int unit_sel)
{
//一个象素的宽度(单位:毫米/象素)
double HorzsizePerPixel = (double)(GetDC(pView)->GetDC()->GetDeviceCaps(HORZSIZE)) / (double)GetDC(pView)->GetDC()->GetDeviceCaps(HORZRES);
CUnit cu;
x = cu.Millimetres(x, (CUnit::EType)unit_sel);//转换为毫米
return long(x / HorzsizePerPixel + 0.5);
}
long GetScreenH(CSigmaView* pView, CDC* pDC, double y, int unit_sel)
{
//一个光栅行(象素)的高度(单位:毫米/象素)
double VertsizePerPixel = (double)(GetDC(pView)->GetDC()->GetDeviceCaps(VERTSIZE)) / (double)GetDC(pView)->GetDC()->GetDeviceCaps(VERTRES);
CUnit cu;
y = cu.Millimetres(y, (CUnit::EType)unit_sel);//转换为毫米
return long(y / VertsizePerPixel + 0.5);
}
double GetRealW(CSigmaView* pView, CDC* pDC, long x, int unit_sel)
{
//一个象素的宽度(单位:毫米/象素)
double HorzsizePerPixel = (double)(GetDC(pView)->GetDC()->GetDeviceCaps(HORZSIZE)) / (double)GetDC(pView)->GetDC()->GetDeviceCaps(HORZRES);
CUnit cu;
return x * HorzsizePerPixel / cu.Millimetres(unit_sel);//转换为实际单位
}
double GetRealH(CSigmaView* pView, CDC* pDC, long y, int unit_sel)
{
//一个光栅行(象素)的高度(单位:毫米/象素)
double VertsizePerPixel = (double)(GetDC(pView)->GetDC()->GetDeviceCaps(VERTSIZE)) / (double)GetDC(pView)->GetDC()->GetDeviceCaps(VERTRES);
CUnit cu;
return y * VertsizePerPixel / cu.Millimetres(unit_sel);//转换为实际单位
}
extern "C" __declspec(dllexport)
void UnitChange(CSigmaView* pView, int selectIndex)
{
int sel = GetUnitSel(selectIndex, selectIndex);
//UpdateData();
//if (sel == GetUnitSel(m_unit)) return;
//((CComboBox*)GetDlgItem(IDC_COMBO_unit))->GetLBText(m_unit, m_unitW);
//((CComboBox*)GetDlgItem(IDC_COMBO_unit))->GetLBText(m_unit, m_unitH);
CUnit cu;
double ds, du;
if (GetDC(pView)->GetDC() != NULL)
{
if (sel == 12)
{
m_height = GetRealH(pView, GetDC(pView)->GetDC(), (long)m_height, GetUnitSel(selectIndex, selectIndex));
m_width = GetRealW(pView, GetDC(pView)->GetDC(), (long)m_width, GetUnitSel(selectIndex, selectIndex));
}
else if (GetUnitSel(selectIndex, selectIndex) == 12)
{
m_height = GetScreenH(pView, GetDC(pView)->GetDC(), m_height, sel);
m_width = GetScreenW(pView, GetDC(pView)->GetDC(), m_width, sel);
}
else
{
ds = cu.Millimetres(sel);
du = cu.Millimetres(GetUnitSel(selectIndex, selectIndex));
m_height = m_height * ds / du;
m_width = m_width * ds / du;
}
}
//UpdateData(FALSE);
}