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

291 lines
6.6 KiB
C++

#include "stdafx.h"
#include "FileTransformer.h"
#include "SigmaDoc.h"
static LPCTSTR CopyStr(LPCTSTR sourceStr)
{
size_t len = strlen(sourceStr);
if (len <= 0)
return NULL;
len++;
LPCTSTR dest = (LPCTSTR)malloc(len);
memset((void *)dest, 0, len);
memcpy((void *)dest, sourceStr, len - 1);
return dest;
}
FileTransformationInfo * FileTransformationInfo::Copy()
{
FileTransformationInfo * info = new FileTransformationInfo();
info->fileNamesSelected = CopyStr(fileNamesSelected);
info->kindOfoutputDirectory = kindOfoutputDirectory;
info->outputDirectorySpecified = CopyStr(outputDirectorySpecified);
info->format = format;
info->bMark = bMark;
info->bClassification = bClassification;
return info;
}
FileTransformer::FileTransformer(CSigmaDoc * pDoc)
:m_fileTransInfo(nullptr),
m_stopTransforation(false),
m_indexOfFileByTransformed(-1),
m_bClearNoUseMark(false),
m_bClearNoUseLayer(false),
m_pDoc(pDoc)
{
}
void FileTransformer::SetFileTransInfo(FileTransformationInfo * fileTransInfo)
{
m_fileTransInfo = fileTransInfo;
//解析出文件列表
GetFileNamesByTransfored();
}
FileTransformer::RESULT FileTransformer::Execute()
{
m_stopTransforation = false;
m_indexOfFileByTransformed = -1;
if (m_fileTransInfo == nullptr)
{
return RESULT_INNER_OBJECT_NULL;
}
int nOutMode = m_fileTransInfo->kindOfoutputDirectory;// pSheet->pageFileSelect.m_nOutMode;
//CString strPath = pSheet->pageFileSelect.m_strPath;
CString strPath;
if (m_fileTransInfo->kindOfoutputDirectory == 0)
{
strPath = "";
} else if (m_fileTransInfo->kindOfoutputDirectory == 1){
if (m_fileTransInfo->outputDirectorySpecified == nullptr)
return RESULT_OUTPUT_DIRECTORY_NULL;
strPath = m_fileTransInfo->outputDirectorySpecified;
}
else
{
return RESULT_OUTPUT_VALUE_ERROR; //记录异常
}
if (nOutMode == 1 && strPath.IsEmpty())
{
m_indexOfFileByTransformed = 0;
//::AfxMessageBox("Path is empty");
return RESULT_OUTPUT_OUTPUT_PATH_ERROR;
}
//int total = (int)pSheet->pageFileSelect.m_listFile.GetCount();
int total = m_fileNamesSelected.GetCount();
int count = 0;
if (total == 0)
{
//::AfxMessageBox("Please select files");
m_indexOfFileByTransformed = -2;
return RESULT_OUTPUT_INPUT_FILES_EMPTY;
}
//m_bConversion = TRUE;
//EnableOther(FALSE);
//CWnd* pWndInfo = GetDlgItem(IDC_STATIC_PROGRESS);
CString str;
CString name;
//POSITION pos = pSheet->pageFileSelect.m_listFile.GetHeadPosition();
//m_progress.SetRange32(1, count);
POSITION pos = m_fileNamesSelected.GetHeadPosition();
while (pos)
{
m_indexOfFileByTransformed++;
name = m_fileNamesSelected.GetNext(pos);
switch (m_fileTransInfo->format)
{
//case 0: //不用做双狐转二进制
// ConversionToBinary(strPath, name, nOutMode);
// break;
case 1:
ConversionToAscii(strPath, name, nOutMode);
break;
//case 2: //不用做双狐转DML
// ConversionToDML(strPath, name, nOutMode);
// break;
case 3:
ConversionToPCG(strPath, name, nOutMode);
break;
default:
return RESULT_FORAMT_ERROR;
}
//AfxGetPublicFunction()->PeekMessageLoop();
}
m_indexOfFileByTransformed = 1000;
//::AfxMessageBox("Finished");
return RESULT_OK;
}
void FileTransformer::StopTransform(bool b)
{
m_stopTransforation = b;
}
int FileTransformer::GetIndexOfFileByTransformation()
{
return m_indexOfFileByTransformed;
}
bool FileTransformer::GetFileNamesByTransfored()
{
CStringList strList;
if (m_fileTransInfo == NULL)
return false;
if (m_fileTransInfo->fileNamesSelected == NULL)
{
return false;
}
CString fileNames(m_fileTransInfo->fileNamesSelected);
SplitStr(fileNames, ";", m_fileNamesSelected);
if (m_fileNamesSelected.IsEmpty())
{
return false;
}
return true;
}
void FileTransformer::SplitStr(CString strSrc, CString strGap, CStringList &strResult)
{
int nPos = strSrc.Find(strGap);
CString strLeft = _T("");
while (0 <= nPos)
{
strLeft = strSrc.Left(nPos);
if (!strLeft.IsEmpty())
{
strResult.AddTail(strLeft);
}
strSrc = strSrc.Right(strSrc.GetLength() - nPos - strGap.GetLength());
nPos = strSrc.Find(strGap);
}
if (!strSrc.IsEmpty())
{
strResult.AddTail(strSrc);
}
}
int FileTransformer::ConversionToAscii(CString strPath, CString strFileName, int nOutMode)
{
CString output = GetOutputFileName(strPath, strFileName, nOutMode, _T(".kev"));
if (output.IsEmpty())
return 0;
//AfxGetPublicFunction()->SetProgress(&m_one);
CXy* pxy = (CXy*)ReadFile(strFileName);
if (pxy == NULL) return 0;
ClearNoUse(pxy);
//pxy->DFD_Write(output, -1, ::GetPreferences().WorkaroundSave.m_bSaveAllLayer);
pxy->DFD_Write(output, -1, true);
delete pxy;
//AfxGetPublicFunction()->SetProgress(NULL);
return 1;
}
int FileTransformer::ConversionToPCG(CString strPath, CString strFileName, int nOutMode)
{
CString output = GetOutputFileName(strPath, strFileName, nOutMode, _T(".pcg"));
if (output.IsEmpty())
return 0;
//AfxGetPublicFunction()->SetProgress(&m_one);
CXy* pxy = (CXy*)ReadFile(strFileName);
if (pxy == NULL) return 0;
ClearNoUse(pxy);
//pxy->PCG_Write(output, 2, ::GetPreferences().WorkaroundSave.m_bSaveAllLayer);
pxy->PCG_Write(output, 2, true);
delete pxy;
//AfxGetPublicFunction()->SetProgress(NULL);
return 1;
}
CString FileTransformer::GetOutputFileName(CString strPath, CString strFileName, int nOutMode, CString strExt)
{
CSplitPath sp(strFileName);
CString output = _T("");
switch (nOutMode)
{
case 0:
output = sp.GetPath() + sp.GetName() + strExt;
break;
case 1:
if (strPath[strPath.GetLength() - 1] == '\\')
output = strPath + sp.GetName() + strExt;
else
output = strPath + _T("\\") + sp.GetName() + strExt;
break;
default:
return _T("");
}
return output;
}
void FileTransformer::ClearNoUse(CXy* pxy)
{
if (m_fileTransInfo != NULL)
{
m_bClearNoUseMark = m_fileTransInfo->bMark != 0;
m_bClearNoUseLayer = m_fileTransInfo->bClassification != 0;
}
if (!m_bClearNoUseMark && !m_bClearNoUseLayer)
return;
if (m_bClearNoUseMark)
pxy->ClearNoUseMark(NULL);
if (m_bClearNoUseLayer)
pxy->ClearLayerNoneData(NULL);
//清除符号中的不使用的信息,使用递归调用清除所有符号中的(包括符号中的符号中的)
CString str;
int count = 0;
void *pDraw;
CMapStringToPtrNoCase* pMark = pxy->GetMark();
POSITION pos = pMark->GetStartPosition();
while (pos)
{
pMark->GetNextAssoc(pos, str, pDraw);
if (pDraw == NULL) continue;
ClearNoUse((CXy*)pDraw);
}
}
void * FileTransformer::ReadFile(CString strFileName)
{
CXy* pxy = new CXy();
CSplitPath sp(strFileName);
CString sext = sp.GetExtension();
sext.MakeLower();
int rt = 0;
if (sext == ".dfb")
rt = m_pDoc->SerializeRead(pxy, strFileName);
else
rt = pxy->ReadWithExtension(strFileName);
if (rt > 0) return pxy;
delete pxy;
return NULL;
}