578 lines
14 KiB
C++
578 lines
14 KiB
C++
#include "StdAfx.h"
|
||
#include "utility.h"
|
||
#include "TGAs.h"
|
||
|
||
static XStringList g_lstWinfont;
|
||
static DList<int> g_lstCharset, g_lstPitch;
|
||
|
||
int utility::CompareString( const CString& strFirst, const CString& strSecond )
|
||
{
|
||
int nRet = ::CompareString(GetThreadLocale(),
|
||
NORM_IGNOREWIDTH|SORT_STRINGSORT, strFirst,strFirst.GetLength(), strSecond, strSecond.GetLength()/*, NULL, NULL, 0*/);
|
||
if(nRet == CSTR_LESS_THAN) //升序
|
||
return -1;
|
||
else if(nRet == CSTR_GREATER_THAN)
|
||
return 1;
|
||
else
|
||
return 0;
|
||
}
|
||
|
||
CString utility::GetInstallDir()
|
||
{
|
||
CString str(g_sAppPath), str1(g_sAppPath);
|
||
str.MakeUpper();
|
||
int iIndex = str.Find(_T("\\SYS"));
|
||
if (iIndex != -1)
|
||
{
|
||
str = str1.Left(iIndex);
|
||
}
|
||
else
|
||
{
|
||
AfxMessageBox(_T("获取安装目录失败!"));
|
||
str = _T("");
|
||
}
|
||
return str;
|
||
}
|
||
|
||
CString utility::GetCurFileName(AcDbDatabase *pData)
|
||
{
|
||
if (!pData) return _T("");
|
||
AcApDocument *pDoc = acDocManager->document(pData);
|
||
if (!pDoc) return _T("");
|
||
CString strFile;
|
||
strFile.Format(_T("%s"),pDoc->fileName());
|
||
int iIndex = strFile.Find('.');
|
||
if (iIndex != -1)
|
||
{
|
||
strFile = strFile.Left(iIndex);
|
||
}
|
||
return strFile;
|
||
}
|
||
|
||
void utility::GetAccmColorByString(CString sColor, AcCmColor &color)
|
||
{
|
||
int iColor(0);
|
||
bool bColor(false);
|
||
CString sSwap(sColor);
|
||
if (sSwap.Find(_T(',')) == -1) // 索引值
|
||
{
|
||
if(sSwap == _T("红"))
|
||
{
|
||
iColor = 1;
|
||
}
|
||
else if(sSwap == _T("黄"))
|
||
{
|
||
iColor = 2;
|
||
}
|
||
else if(sSwap == _T("绿"))
|
||
{
|
||
iColor = 3;
|
||
}
|
||
else if(sSwap == _T("青"))
|
||
{
|
||
iColor = 4;
|
||
}
|
||
else if(sSwap == _T("蓝"))
|
||
{
|
||
iColor = 5;
|
||
}
|
||
else if(sSwap == _T("洋红"))
|
||
{
|
||
iColor = 6;
|
||
}
|
||
else if(sSwap == _T("白") || sSwap == _T("黑"))
|
||
{
|
||
iColor = 7;
|
||
}
|
||
else if(sSwap == _T("BYLAYER"))
|
||
{
|
||
color.setColorMethod(AcCmEntityColor::kByLayer);
|
||
return;
|
||
}
|
||
else if(sSwap == _T("BYBLOCK"))
|
||
{
|
||
color.setColorMethod(AcCmEntityColor::kByBlock);
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
iColor = _ttoi(sColor);
|
||
}
|
||
}
|
||
else // RGB颜色值
|
||
{
|
||
bColor = true;
|
||
}
|
||
if (bColor)
|
||
{
|
||
int iIndex = sSwap.Find(',');
|
||
CString sR(sSwap.Left(iIndex));
|
||
sSwap = sSwap.Right(sSwap.GetLength() - iIndex - 1);
|
||
iIndex = sSwap.Find(',');
|
||
CString sG(sSwap.Left(iIndex));
|
||
CString sB(sSwap.Right(sSwap.GetLength() - iIndex - 1));
|
||
Acad::ErrorStatus bOk = color.setRGB(Adesk::UInt8(_ttoi(sR)), Adesk::UInt8(_ttoi(sG)), Adesk::UInt8(_ttoi(sB)));
|
||
}
|
||
else
|
||
{
|
||
color.setColorIndex(iColor);
|
||
}
|
||
}
|
||
|
||
AcDbObjectId utility::GetIdByName(LPCTSTR name)
|
||
{
|
||
AcDbObjectId id = AcDbObjectId::kNull;
|
||
AcDbLinetypeTable *pTbl = NULL;
|
||
acdbCurDwg()->getSymbolTable(pTbl, AcDb::kForRead);
|
||
if (!pTbl) return id;
|
||
|
||
do
|
||
{
|
||
if (pTbl->has(name))
|
||
pTbl->getAt(name, id);
|
||
else
|
||
break;
|
||
} while (false);
|
||
|
||
pTbl->close();
|
||
if (id.isNull())
|
||
{
|
||
id = InitLineType(name);
|
||
if (id.isNull())
|
||
id = InitTchLineType(name);
|
||
if (id.isNull())
|
||
id = LoadTArch20LineType(name);
|
||
}
|
||
return id;
|
||
}
|
||
|
||
bool utility::ReadHatchMaterialConfigFile( const CString& strMaterialType, std::vector< std::pair<CString, CString> >& materialName )
|
||
{
|
||
CString strMaerial = _T("[");
|
||
strMaerial += strMaterialType;
|
||
strMaerial += _T("]");
|
||
|
||
CStdioFile file;
|
||
if(!file.Open(utility::GetHatchMaterialConfigFilePath(), CFile::modeRead))
|
||
return false;
|
||
CString strLine;
|
||
bool bFindMaterial = false;
|
||
while(file.ReadString(strLine))
|
||
{
|
||
if(strMaerial.CompareNoCase(strLine) == 0)
|
||
{
|
||
bFindMaterial = true;
|
||
break;
|
||
}
|
||
}
|
||
if(!bFindMaterial)
|
||
{
|
||
file.Close();
|
||
return false;
|
||
}
|
||
CString strLeft, strRight;
|
||
int nPos = -1;
|
||
int nLenght;
|
||
materialName.clear();
|
||
while(file.ReadString(strLine))
|
||
{
|
||
if(strLine.IsEmpty())
|
||
continue;
|
||
strLine.Trim();
|
||
if(strLine[0] == _T('[')) //下一种材料开始
|
||
break;
|
||
nPos = strLine.Find(_T('*'));
|
||
if(nPos == -1)
|
||
{
|
||
strLeft = strLine;
|
||
strRight = strLine;
|
||
}
|
||
else
|
||
{
|
||
nLenght = strLine.GetLength();
|
||
strLeft = strLine.Left(nPos);
|
||
strRight = strLine.Right(nLenght - nPos - 1);
|
||
}
|
||
strLeft.Trim(_T(" ,,"));
|
||
strRight.Trim(_T(" ,,"));
|
||
materialName.push_back(std::make_pair(strLeft, strRight));
|
||
}
|
||
file.Close();
|
||
return true;
|
||
}
|
||
|
||
CString utility::getConfigFilePath( const CString& fileName )
|
||
{
|
||
CString sPath;
|
||
::GetModuleFileName(_hdllInstance, sPath.GetBuffer(MAX_PATH), MAX_PATH);
|
||
sPath.ReleaseBuffer();
|
||
sPath = sPath.Left(sPath.ReverseFind(_T('\\')));
|
||
sPath = sPath.Left(sPath.ReverseFind(_T('\\')));
|
||
sPath += _T("\\SYS\\");
|
||
sPath += fileName;
|
||
return sPath;
|
||
}
|
||
|
||
AcDbObjectId utility::LoadTArch20LineType(const TCHAR* szLineType)
|
||
{
|
||
AcDbObjectId id = GetTArch20LinetypeIdFromString(szLineType);
|
||
if(id != AcDbObjectId::kNull)
|
||
return id;
|
||
|
||
XString xsDbfFile;
|
||
if(!FindFile(_T("linetype.dbf"), xsDbfFile))
|
||
{
|
||
AfxMessageBox(_T("对不起,没有发现linetype.dbf文件!"));
|
||
return id;
|
||
}
|
||
|
||
CodeBase db;
|
||
XDbfTable *pTable = db.Open(xsDbfFile);
|
||
if(!pTable)
|
||
{
|
||
CString csTmp;
|
||
csTmp.Format(_T("%s文件只读或损坏!"), xsDbfFile);
|
||
AfxMessageBox(csTmp);
|
||
// AfxMessageBox(_T("TK文件只读或损坏!"));
|
||
return id;
|
||
}
|
||
|
||
for(pTable->MoveFirst();!pTable->IsEOF();pTable->MoveNext()){
|
||
CString sName, sComment, sContent, sNum, sFit, sLength;
|
||
GET_FIELD(pTable, _T("Name"), sName);
|
||
if(_tcsicmp(sName, szLineType) == 0){
|
||
GET_FIELD(pTable, _T("Comment"), sComment);
|
||
GET_FIELD(pTable, _T("Num"), sNum);
|
||
GET_FIELD(pTable, _T("Scale"), sFit);
|
||
GET_FIELD(pTable, _T("Length"), sLength);
|
||
GET_FIELD(pTable, _T("Content"), sContent);
|
||
bool bFit;
|
||
if(sFit == _T("1"))
|
||
bFit = true;
|
||
else
|
||
bFit = false;
|
||
LoadLineType((const TCHAR*)sName, (const TCHAR*)sComment, _ttoi(sNum), bFit, _tstof(sLength), (const TCHAR*)sContent);
|
||
id = GetTArch20LinetypeIdFromString((const TCHAR*)sName);
|
||
break;
|
||
}
|
||
}
|
||
return id;
|
||
}
|
||
|
||
int CALLBACK EnumFontFamExProc2(ENUMLOGFONTEX *lplf, NEWTEXTMETRICEX *lpntme,
|
||
int FontType, LONG lParam)
|
||
{
|
||
if (!(FontType & TRUETYPE_FONTTYPE))
|
||
return 1 ;
|
||
if (*(lplf->elfLogFont.lfFaceName))
|
||
{
|
||
if(!_tcsicmp(lplf->elfLogFont.lfFaceName, _T("marlett")))
|
||
return 1;
|
||
|
||
if(g_lstWinfont.Index(lplf->elfLogFont.lfFaceName, 0) < 0 &&
|
||
_tcsicmp((const TCHAR*)lplf->elfScript, _T("CHINESE_GB2312")) == 0) {// winFont
|
||
g_lstWinfont.Append(tstrnew(lplf->elfLogFont.lfFaceName));
|
||
g_lstCharset.Append(new int(lplf->elfLogFont.lfCharSet));
|
||
g_lstPitch.Append(new int(lplf->elfLogFont.lfPitchAndFamily));
|
||
}
|
||
}
|
||
return 1 ;
|
||
}
|
||
|
||
int utility::GetPScale()
|
||
{
|
||
double nScale=DocGetPScale();
|
||
int cvport;
|
||
VERIFY(xg_getvar(_T("CVPORT"), &cvport)==RTNORM);
|
||
if(cvport==1)
|
||
nScale=1.0;
|
||
// return ads_retint( AS_INT(nScale));
|
||
return (int)nScale;
|
||
}
|
||
|
||
AcDbObjectId utility::InitLineTypeTextStyle_Thunder()
|
||
{
|
||
CString g_csLineTypeChnShx = _T("HZTXT");
|
||
CString g_csLineTypeEngShx = _T("SIMPLEX");
|
||
double g_dLineTypeScale = 0.8;
|
||
AcDbObjectId idRet=GetTextStyleId(_T("TG_LINETYPE_THUND"));
|
||
if(idRet == NULL) {
|
||
|
||
g_lstWinfont.Reset();
|
||
g_lstCharset.Reset();
|
||
g_lstPitch.Reset();
|
||
|
||
CDC *pDC = acedGetAcadDwgView()->GetDC();
|
||
ASSERT(pDC);
|
||
LOGFONT lf;
|
||
ZeroMemory(&lf,sizeof(lf));
|
||
lf.lfCharSet = DEFAULT_CHARSET;
|
||
EnumFontFamiliesEx(pDC->m_hDC, &lf,
|
||
(FONTENUMPROC)EnumFontFamExProc2, NULL, 0);
|
||
acedGetAcadDwgView()->ReleaseDC(pDC);
|
||
|
||
AcDbTextStyleTableRecord *pStyle=new AcDbTextStyleTableRecord;
|
||
pStyle->setName(_T("TG_LINETYPE_THUND"));
|
||
pStyle->setTextSize(5.5);
|
||
|
||
int idx = g_lstWinfont.Index(g_csLineTypeChnShx);
|
||
if(idx < 0){
|
||
pStyle->setFileName(g_csLineTypeEngShx);
|
||
pStyle->setBigFontFileName(g_csLineTypeChnShx);
|
||
}
|
||
else{
|
||
int iCharset = *g_lstCharset[idx];
|
||
int iPitch = *g_lstPitch[idx];
|
||
#if ADS < 21
|
||
pStyle->setFont(g_csLineTypeChnShx, FALSE, FALSE, iCharset, iPitch);
|
||
#else
|
||
typedef Autodesk::AutoCAD::PAL::FontUtils::FontPitch FontPitch;
|
||
typedef Autodesk::AutoCAD::PAL::FontUtils::FontFamily FontFamily;
|
||
FontPitch pitch((FontPitch)(iPitch & 0x3));
|
||
FontFamily family((FontFamily)(iPitch & 0xF0));
|
||
pStyle->setFont(g_csLineTypeChnShx, FALSE, FALSE, (Charset)iCharset, pitch, family);
|
||
#endif
|
||
}
|
||
|
||
|
||
pStyle->setXScale(g_dLineTypeScale);
|
||
idRet = AddTextStyle(pStyle, TRUE);
|
||
}
|
||
return idRet;
|
||
}
|
||
|
||
AcDbObjectId utility::InitLineTypeTextStyle()
|
||
{
|
||
CString g_csLineTypeStyle = _T("TG_LINETYPE");
|
||
CString g_csLineTypeChnShx = _T("HZTXT");
|
||
CString g_csLineTypeEngShx = _T("SIMPLEX");
|
||
double g_dLineTypeHeight = 3;
|
||
double g_dLineTypeScale = 0.8;
|
||
|
||
if (g_nProductId == 16)
|
||
{
|
||
//修改电气的TG_LINETYPE线型设置注册表读取位置 axc add 2015-09-01
|
||
CRegProperty regProp(GetRegLocation(), _T("TElecConfig"));
|
||
regProp.SetTopRootKey(HKEY_CURRENT_USER);
|
||
regProp.GetValue(_T("LineTypeChnShx"), g_csLineTypeChnShx);
|
||
regProp.GetValue(_T("LineTypeEngShx"), g_csLineTypeEngShx);
|
||
regProp.GetValue(_T("LineTypeHeight"), g_dLineTypeHeight);
|
||
regProp.GetValue(_T("LineTypeScale"), g_dLineTypeScale);
|
||
}
|
||
else
|
||
{
|
||
CRegProperty regProp(GetRegLocation(), _T("TWTConfig"));
|
||
regProp.SetTopRootKey(HKEY_CURRENT_USER);
|
||
regProp.GetValue(_T("LineTypeChnShx"), g_csLineTypeChnShx);
|
||
regProp.GetValue(_T("LineTypeEngShx"), g_csLineTypeEngShx);
|
||
regProp.GetValue(_T("LineTypeHeight"), g_dLineTypeHeight);
|
||
regProp.GetValue(_T("LineTypeScale"), g_dLineTypeScale);
|
||
}
|
||
|
||
AcDbObjectId idRet=GetTextStyleId(g_csLineTypeStyle);
|
||
if(idRet == NULL) {
|
||
|
||
g_lstWinfont.Reset();
|
||
g_lstCharset.Reset();
|
||
g_lstPitch.Reset();
|
||
|
||
CDC *pDC = acedGetAcadDwgView()->GetDC();
|
||
ASSERT(pDC);
|
||
LOGFONT lf;
|
||
ZeroMemory(&lf,sizeof(lf));
|
||
lf.lfCharSet = DEFAULT_CHARSET;
|
||
EnumFontFamiliesEx(pDC->m_hDC, &lf,
|
||
(FONTENUMPROC)EnumFontFamExProc2, NULL, 0);
|
||
acedGetAcadDwgView()->ReleaseDC(pDC);
|
||
|
||
AcDbTextStyleTableRecord *pStyle=new AcDbTextStyleTableRecord;
|
||
pStyle->setName(g_csLineTypeStyle);
|
||
pStyle->setTextSize(g_dLineTypeHeight);
|
||
|
||
int idx = g_lstWinfont.Index(g_csLineTypeChnShx);
|
||
if(idx < 0){
|
||
pStyle->setFileName(g_csLineTypeEngShx);
|
||
pStyle->setBigFontFileName(g_csLineTypeChnShx);
|
||
}
|
||
else{
|
||
int iCharset = *g_lstCharset[idx];
|
||
int iPitch = *g_lstPitch[idx];
|
||
#if ADS < 21
|
||
pStyle->setFont(g_csLineTypeChnShx, FALSE, FALSE, iCharset, iPitch);
|
||
#else
|
||
typedef Autodesk::AutoCAD::PAL::FontUtils::FontPitch FontPitch;
|
||
typedef Autodesk::AutoCAD::PAL::FontUtils::FontFamily FontFamily;
|
||
FontPitch pitch((FontPitch)(iPitch & 0x3));
|
||
FontFamily family((FontFamily)(iPitch & 0xF0));
|
||
pStyle->setFont(g_csLineTypeChnShx, FALSE, FALSE, (Charset)iCharset, pitch, family);
|
||
#endif
|
||
}
|
||
|
||
|
||
pStyle->setXScale(g_dLineTypeScale);
|
||
idRet = AddTextStyle(pStyle, TRUE);
|
||
}
|
||
return idRet;
|
||
}
|
||
|
||
void utility::GetLineDashData(int i, CString csContent, double &dLen, CString &csText, CString &csStyle, double &dScale, double &dRotation, double &dX, double &dY)
|
||
{
|
||
int idx1 = csContent.Find(_T("["));
|
||
int idx(0);
|
||
CString csDesh;
|
||
while(idx1>-1){
|
||
int idx2 = csContent.Find(_T("]"), idx1);
|
||
if(idx2 < 0)
|
||
break;
|
||
CString csTmp;
|
||
csTmp = csContent.Mid(idx1+1, idx2-idx1-1);
|
||
if(idx == i){
|
||
csDesh = csTmp;
|
||
break;
|
||
}
|
||
idx++;
|
||
idx1 = csContent.Find(_T("["), idx2);
|
||
}
|
||
if(csDesh == _T(""))
|
||
return;
|
||
|
||
idx1 = csDesh.Find(_T(","));
|
||
CString csTmp = csDesh.Mid(0, idx1);
|
||
dLen = _tstof(csTmp);
|
||
int idx2 = csDesh.Find(_T(","), idx1+1);
|
||
idx=1;
|
||
while(idx1 > -1){
|
||
csTmp = csDesh.Mid(idx1+1, idx2-idx1-1);
|
||
idx1 = idx2;
|
||
idx2 = csDesh.Find(_T(","), idx1+1);
|
||
if(idx == 1)
|
||
csText = csTmp;
|
||
else if(idx == 2)
|
||
csStyle = csTmp;
|
||
else if(idx == 3)
|
||
dScale = _tstof(csTmp);
|
||
else if(idx == 4)
|
||
dRotation = _tstof(csTmp);
|
||
else if(idx == 5)
|
||
dX = _tstof(csTmp);
|
||
else if(idx == 6)
|
||
dY = _tstof(csTmp);
|
||
idx++;
|
||
if(idx2<0)
|
||
break;
|
||
}
|
||
}
|
||
|
||
AcDbObjectId utility::CreateShxStyle(CString csShxFile)
|
||
{
|
||
AcDbObjectId idRet=GetTextStyleId(csShxFile);
|
||
if(idRet == NULL) {
|
||
AcDbTextStyleTableRecord *pStyle=new AcDbTextStyleTableRecord;
|
||
pStyle->setName(csShxFile);
|
||
pStyle->setFileName(csShxFile);
|
||
pStyle->setIsShapeFile(TRUE);
|
||
idRet = AddTextStyle(pStyle, TRUE);
|
||
}
|
||
return idRet;
|
||
}
|
||
|
||
BOOL utility::LoadLineType(CString csName, CString csComment, int num, bool fit, double dLength, CString csContent)
|
||
{
|
||
|
||
// AcDbObjectId idRet=InitLineTypeTextStyle();
|
||
if(csName.Find(_T("×")) > -1)
|
||
InitLineTypeTextStyle_Thunder();
|
||
else
|
||
InitLineTypeTextStyle();
|
||
|
||
AcDbLinetypeTable *pLinetypeTbl = NULL;
|
||
acdbCurDwg()->getLinetypeTable(pLinetypeTbl, AcDb::kForWrite);
|
||
if(pLinetypeTbl == NULL){
|
||
return FALSE;
|
||
}
|
||
|
||
BOOL bHasIt = pLinetypeTbl->has((const TCHAR*)csName);
|
||
if(bHasIt){
|
||
pLinetypeTbl->close();
|
||
adsout << _T("\n已经存在同名线型!");
|
||
return FALSE;
|
||
}
|
||
AcDbLinetypeTableRecord* newRec = new AcDbLinetypeTableRecord;
|
||
newRec->setName(csName);
|
||
const TCHAR* szName;
|
||
newRec->getName(szName);
|
||
if(_tcsicmp(szName, _T("")) == 0){
|
||
pLinetypeTbl->close();
|
||
adsout << _T("\n线形名非法,建议使用全角!");
|
||
delete newRec;
|
||
return FALSE;
|
||
}
|
||
|
||
newRec->setAsciiDescription(csComment);
|
||
newRec->setComments(csComment);
|
||
|
||
newRec->setPatternLength(dLength);
|
||
newRec->setNumDashes(num);
|
||
newRec->setIsScaledToFit(fit);
|
||
for(int i=0;i<num;i++){
|
||
CString csText, csStyle;
|
||
double dLen,dScale, dRotaion(0), dX(0), dY(0);
|
||
GetLineDashData(i, csContent, dLen, csText, csStyle, dScale, dRotaion, dX, dY);
|
||
|
||
newRec->setDashLengthAt(i, dLen);
|
||
if(csText != _T("")){// && fabs(dLen) > 0.0001 sr remove it 2007-3-22 TG_x 不支持
|
||
if(csStyle.Find(_T(".shx")) > 0)
|
||
{
|
||
//2008-11-18 支持形文件
|
||
AcDbObjectId idTextStyle = CreateShxStyle(csStyle);
|
||
newRec->setShapeStyleAt(i, idTextStyle);
|
||
int iShapeNum = _ttoi(csText);
|
||
newRec->setShapeNumberAt(i, iShapeNum);
|
||
newRec->setShapeScaleAt(i, dScale);
|
||
newRec->setShapeRotationAt(i, dRotaion);
|
||
AcGeVector2d vt(-dX, -dY);
|
||
newRec->setShapeOffsetAt(i, vt);
|
||
}
|
||
else
|
||
{
|
||
AcDbObjectId idTextStyle = GetTextStyleId(csStyle);
|
||
newRec->setShapeStyleAt(i, idTextStyle);
|
||
newRec->setTextAt(i, csText);
|
||
newRec->setShapeScaleAt(i, dScale);
|
||
newRec->setShapeRotationAt(i, dRotaion);
|
||
AcGeVector2d vt(-dX, -dY);
|
||
newRec->setShapeOffsetAt(i, vt);
|
||
}
|
||
}
|
||
}
|
||
|
||
pLinetypeTbl->add(newRec);
|
||
newRec->close();
|
||
pLinetypeTbl->close();
|
||
return TRUE;
|
||
}
|
||
|
||
AcDbObjectId utility::GetTArch20LinetypeIdFromString(const TCHAR* pStr)
|
||
{
|
||
AcDbDatabase *pDb = acdbCurDwg();
|
||
AcDbObjectId id = AcDbObjectId::kNull;
|
||
if(pStr)
|
||
{
|
||
AcDbLinetypeTable* pLinetypeTable = NULL;
|
||
//modified by whl on 060301
|
||
//Acad::ErrorStatus err = acdbCurDwg()->getLinetypeTable(
|
||
Acad::ErrorStatus err = pDb->getLinetypeTable(pLinetypeTable, AcDb::kForRead);
|
||
if (err == Acad::eOk && pLinetypeTable)
|
||
{
|
||
err = pLinetypeTable->getAt(pStr, id);
|
||
pLinetypeTable->close();
|
||
}
|
||
}
|
||
return id;
|
||
}
|
||
|
||
CString utility::GetHatchMaterialConfigFilePath()
|
||
{
|
||
return getConfigFilePath(_T("TArch20HatchMaterialConfig.txt"));
|
||
}
|