Files
envi-code/SourceCode/Code2026/tg_shs/shs_kernal/BatchSaveAsFileForFolder.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

320 lines
8.0 KiB
C++

// TransFormDlg.cpp : implementation file
//
#include "stdafx.h"
#include "BatchSaveAsFileForFolder.h"
#include "resource.h"
//#include <AdAChar.h>
#include <vector>
using namespace std;
// CTransFormDlg dialog
IMPLEMENT_DYNAMIC(TBatchSaveAsFileForFolderDlg, CDialog)
TBatchSaveAsFileForFolderDlg::TBatchSaveAsFileForFolderDlg(CWnd* pParent /*=NULL*/)
: CDialog(TBatchSaveAsFileForFolderDlg::IDD, pParent),
m_nTangentType(0), m_nCADType(0), m_bReplace(false) { }
TBatchSaveAsFileForFolderDlg::~TBatchSaveAsFileForFolderDlg() { }
void TBatchSaveAsFileForFolderDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_CMB_SAVETYPE, m_wndCmbSaveType);
DDX_Control(pDX, IDC_CMB_CADTYPE, m_wndCmbCadType);
DDX_Control(pDX, IDC_EDT_SOURCE, m_wndEdtSource);
DDX_Control(pDX, IDC_EDT_OBJECTIVE, m_wndEdtObjective);
}
BOOL TBatchSaveAsFileForFolderDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CComboBox *pComST = (CComboBox*)GetDlgItem(IDC_CMB_SAVETYPE);
CComboBox *pComCT = (CComboBox*)GetDlgItem(IDC_CMB_CADTYPE);
if (!pComST || ! pComCT) return FALSE;
pComST->AddString(_T("上华3文件(*.dlg)"));
pComCT->AddString(_T("AutoCAD R14文件"));
pComST->AddString(_T("上华5文件(*.dlg)"));
pComST->AddString(_T("上华6文件(*.dlg)"));
pComST->AddString(_T("上华7文件(*.dlg)"));
pComST->AddString(_T("上华8文件(*.dlg)"));
pComST->AddString(_T("上华9文件(*.dlg)"));
#if ADS >= 15
pComCT->AddString(_T("AutoCAD 2000文件"));
#endif
#if ADS >= 16
pComCT->AddString(_T("AutoCAD 2004文件"));
#endif
#if ADS >= 17
pComCT->AddString(_T("AutoCAD 2007文件"));
#endif
#if ADS >= 18
pComCT->AddString(_T("AutoCAD 2010文件"));
#endif
#if ADS >= 19
pComCT->AddString(_T("AutoCAD 2013文件"));
#endif
m_wndCmbSaveType.SetCurSel(m_nTangentType);
m_wndCmbCadType.SetCurSel(m_nCADType);
return TRUE;
}
CString TBatchSaveAsFileForFolderDlg::GetFolderPath()
{
CString sFolderPath;
BROWSEINFO folderInfo;
ACHAR Buffer[MAX_PATH];
//浏览文件夹对话框的父窗体句柄
folderInfo.hwndOwner = NULL;
//ITEMIDLIST结构的地址,包含浏览时的初始根目录,
//而且只有被指定的目录和其子目录才显示在浏览文件夹对话框中。
//该成员变量可以是NULL,在此时桌面目录将被使用。
folderInfo.pidlRoot =NULL;
//用来保存用户选中的目录字符串 的内存地址。该缓冲区的大小缺省是定义的MAX_PATH常量宏。
folderInfo.pszDisplayName = Buffer;
//该浏览文件夹对话框的显示文本,用来提示该浏览文件夹对话框的功能、作用和目的。
folderInfo.lpszTitle = _T("获取文件夹路径");
//该标志位描述了对话框的选项。它可以为0,也可以是以下常量的任意组合:
folderInfo.ulFlags = BIF_EDITBOX;//BIF_DONTGOBELOWDOMAIN;
//应用程序定义的浏览对话框回调函数的地址。当对话框中的事件发生时,
//该对话框将调用回调函数。该参数可用为NULL。
folderInfo.lpfn = NULL;
//对话框传递给回调函数的一个参数指针。
folderInfo.lParam=NULL;
//与选中目录相关的图像。该图像将被指定为系统图像列表中的索引值。
folderInfo.iImage=NULL;//IDR_MAINFRAME;
LPITEMIDLIST pIDList = SHBrowseForFolder(&folderInfo);//调用显示选择对话框
if(pIDList)
{
SHGetPathFromIDList(pIDList, Buffer);
sFolderPath = Buffer;
}
LPMALLOC lpMalloc;
if(FAILED(SHGetMalloc(&lpMalloc)))
return _T("0");
lpMalloc->Free(pIDList);
lpMalloc->Release();
return sFolderPath;
}
void TBatchSaveAsFileForFolderDlg::CollectFolderFiles(const CString &strSourceFolder, const CString &strObjectiveFolder)
{
CFileFind filefinder;
BOOL bFind=filefinder.FindFile(strSourceFolder+_T("//*.*"));
while(bFind)
{
bFind = filefinder.FindNextFile();
if(filefinder.IsDots()) continue;
if(filefinder.IsDirectory())
{
CreateDirectory((strObjectiveFolder+_T("//")+filefinder.GetFileName()),NULL);
CollectFolderFiles(strSourceFolder+_T("//")+filefinder.GetFileName(),strObjectiveFolder+_T("//")+filefinder.GetFileName());
}
::SetFileAttributes(strSourceFolder+_T("//")+filefinder.GetFileName(),FILE_ATTRIBUTE_NORMAL);
::AfxGetApp()->DoWaitCursor(1);
//判断文件类型
if ( _T("dwg")==(strSourceFolder+_T("//")+filefinder.GetFileName()).Right(3))
{
m_vecSrcPath.push_back(strSourceFolder+_T("//")+filefinder.GetFileName());
CString fName(filefinder.GetFileName());
if (m_bReplace)
{
fName = filefinder.GetFileName().Left(filefinder.GetFileName().GetLength()-4);
fName += _T("_.dwg");
}
m_vecDescPath.push_back(strObjectiveFolder+_T("//")+fName);
}
::AfxGetApp()->DoWaitCursor(-1);
}
}
BOOL TBatchSaveAsFileForFolderDlg::CheckDir(CString &strdirName, bool bCheckReadOnly)
{
BOOL bRel(FALSE);
DWORD attr;
attr = GetFileAttributes(strdirName);
CString str(_T("路径存在问题,请检查."));
do
{
if (strdirName.IsEmpty())
{
bRel = FALSE;
str = _T("路径不能为空!");
break;
}
if (attr == (DWORD)(-1))
{
bRel = FALSE;
break;
}
if (!(attr & FILE_ATTRIBUTE_DIRECTORY))
{
bRel = FALSE;
str = _T("请选择一个路径!");
break;
}
if (bCheckReadOnly && (attr & FILE_ATTRIBUTE_READONLY))
{
bRel = FALSE;
str = _T("请选择一个可写的文件夹!");
break;
}
bRel = TRUE;
} while (false);
if (!bRel)
AfxMessageBox(str);
return bRel;
}
int TBatchSaveAsFileForFolderDlg::GetTangentType()
{
return m_nTangentType;
}
int TBatchSaveAsFileForFolderDlg::GetCadType()
{
return m_nCADType;
}
void TBatchSaveAsFileForFolderDlg::GetSrcFileLst( std::vector<CString> &vec )
{
vec = m_vecSrcPath;
}
void TBatchSaveAsFileForFolderDlg::GetDescFileLst( std::vector<CString> &vec )
{
vec = m_vecDescPath;
}
BEGIN_MESSAGE_MAP(TBatchSaveAsFileForFolderDlg, CDialog)
ON_BN_CLICKED(IDC_BTN_SOURCE, &TBatchSaveAsFileForFolderDlg::OnBnClickedBtnSource)
ON_BN_CLICKED(IDC_BTN_OBJECTIVE, &TBatchSaveAsFileForFolderDlg::OnBnClickedBtnObjective)
ON_BN_CLICKED(IDOK, &TBatchSaveAsFileForFolderDlg::OnBnClickedOk)
ON_BN_CLICKED(IDCANCEL, &TBatchSaveAsFileForFolderDlg::OnBnClickedCancel)
ON_CBN_SELCHANGE(IDC_CMB_CADTYPE, &TBatchSaveAsFileForFolderDlg::OnCbnSelchangeCmbCadtype)
ON_CBN_SELCHANGE(IDC_CMB_SAVETYPE, &TBatchSaveAsFileForFolderDlg::OnCbnSelchangeCmbSavetype)
END_MESSAGE_MAP()
void TBatchSaveAsFileForFolderDlg::OnBnClickedBtnSource()
{
CString strSFolderPath(GetFolderPath());
m_wndEdtSource.SetWindowText(strSFolderPath);
}
void TBatchSaveAsFileForFolderDlg::OnBnClickedBtnObjective()
{
CString strTemp;
m_wndEdtSource.GetWindowText(strTemp);
CString strOFolderPath(GetFolderPath());
if (strOFolderPath == strTemp)
{
if(IDYES == ::MessageBox(NULL,_T("目的路径和源路径一样,是否替换?"),_T("注意"),MB_YESNO))
{
m_wndEdtObjective.SetWindowText(strOFolderPath);
m_bReplace = true;
}
else
{
return;
}
}
m_wndEdtObjective.SetWindowText(strOFolderPath);
}
void TBatchSaveAsFileForFolderDlg::OnBnClickedOk()
{
CString strGetSourcePath;
m_wndEdtSource.GetWindowText(strGetSourcePath);
if (!CheckDir(strGetSourcePath)) return;
CString strGetObjectPath;
m_wndEdtObjective.GetWindowText(strGetObjectPath);
if(!CheckDir(strGetObjectPath, true)) return;
CollectFolderFiles(strGetSourcePath,strGetObjectPath);
OnOK();
}
void TBatchSaveAsFileForFolderDlg::OnBnClickedCancel()
{
OnCancel();
}
CString TBatchSaveAsFileForFolderDlg::GetPostfix()
{
int ttype = GetTangentType();
CString str(_T(""));
str.Format(_T("_t%d"), ttype);
return str;
}
void TBatchSaveAsFileForFolderDlg::OnCbnSelchangeCmbCadtype()
{
m_nCADType = m_wndCmbCadType.GetCurSel() + 14;
}
void TBatchSaveAsFileForFolderDlg::OnCbnSelchangeCmbSavetype()
{
int idx = m_wndCmbSaveType.GetCurSel();
if (idx == LB_ERR)
{
m_nTangentType = 3;
return;
}
switch (idx)
{
case 0:
m_nTangentType = 3;
break;
case 1:
m_nTangentType = 5;
break;
case 2:
m_nTangentType = 6;
break;
case 3:
m_nTangentType = 7;
break;
case 4:
m_nTangentType = 8;
break;
case 5:
m_nTangentType = 9;
break;
default:
m_nTangentType = 3;
break;
}
return;
}