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

578 lines
14 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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"));
}