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

1251 lines
34 KiB
C++

#include "stdafx.h"
#include "TextStyleDlg.h"
#include "SingleRowText.h"
#include "MutiRowTextDlg.h"
#include "FindParser.h"
extern int Big5ToGB(const TCHAR *szSrc, XString &sDest, void *pCodeTable);
extern int GBToBig5(const TCHAR *szSrc, XString &sDest, void *pCodeTable);
extern TARCH_IMPEXP int g_bTextAdjust;
extern AcDbObjectId InitTextStyle(const TCHAR *pszStyle);
// add by xly On 101213 设置文字对象的图层切换属性
extern TARCH_IMPEXP BOOL g_bTextDefaultLayer;
// add by xly On 101213 引入设置实体的图层并将实体添加到图纸中
extern AcDbObjectId AddToSpace(Adesk::Boolean bClosed, TDbEntity *pEntSymb);
////////////////////////////////////////////////////////////////
// Add by lcf 2005-06-30
// 单行文字
class TSimgleRowTextJig : public AcEdJig
{
public:
TSimgleRowTextJig(TDbText *pEnt);
int start(int *pKeyIndex = NULL);
AcDbEntity* entity() const;
DragStatus sampler();
Adesk::Boolean update();
void SetPrompt(const TCHAR *pszPrompt);
void SetKeyword(const TCHAR *pszKeyword);
private:
const TCHAR *m_pszPrompt; //提示信息
const TCHAR *m_pszKeyword; //关键字
TDbText *m_pDrawEnt; //临时实体
AcGePoint3d m_ptIns;
};
TSimgleRowTextJig::TSimgleRowTextJig(TDbText *pEnt)
: m_pDrawEnt(pEnt)
, m_pszPrompt(NULL)
, m_pszKeyword(NULL)
{
}
void TSimgleRowTextJig::SetPrompt(const TCHAR *pszPrompt)
{
m_pszPrompt = pszPrompt;
}
void TSimgleRowTextJig::SetKeyword(const TCHAR *pszKeyword)
{
m_pszKeyword = pszKeyword;
}
int TSimgleRowTextJig::start(int *keyIndex)
{
setDispPrompt( m_pszPrompt );
AcEdJig::DragStatus stat = drag();
if ( kNormal == stat )
append();
else
delete m_pDrawEnt;
int nRet;
if (stat == AcEdJig::kCancel)
nRet = RTCAN;
else if(stat == AcEdJig::kNull)
nRet = RTNONE;
else if (stat <= 0)
nRet = RTNORM;
else
{
if(keyIndex) *keyIndex = stat;
nRet = RTKWORD;
}
return nRet;
}
AcEdJig::DragStatus TSimgleRowTextJig::sampler()
{
setUserInputControls( ( UserInputControls )
( kNullResponseAccepted | kAccept3dCoordinates ));
if(m_pszKeyword)setKeywordList(m_pszKeyword);
AcGePoint3d point;
DragStatus stat = acquirePoint(point);
if (stat == kNormal)
{
if (point == m_ptIns)
return AcEdJig::kNoChange;
else
m_ptIns = point;
}
return stat;
}
Adesk::Boolean TSimgleRowTextJig::update()
{
m_pDrawEnt->SetLocation(m_ptIns);
return Adesk::kTrue;
}
AcDbEntity *TSimgleRowTextJig::entity() const
{
return m_pDrawEnt;
}
// Modify by lcf 2005-06-30
void TextLine()
{
extern TARCH_IMPEXP BOOL g_bAutoFocus;
XPushMemVar<BOOL> vf(g_bAutoFocus,FALSE);//add by whl on 070605,单行文字不支持自动恢复焦点
InitLayer(LAY_TEXT);
CSingleRowText dlg(FALSE, acedGetAcadFrame());
{
CTemporaryResourceOverride vTemp;
if(!dlg.Create(dlg.IDD, acedGetAcadFrame()))
return;
}
dlg.ShowWindow(SW_SHOW);
while(1)
{
acedGetAcadDwgView()->SetFocus();
TDbText *pEnt = new TDbText;
dlg.Dlg2Obj(pEnt);
dlg.m_bPost = TRUE;
// pEnt->SetRotation(Ucs2Wcs(0.0));
// modify by xly on 101213 设置单行文字的图层控制
//pEnt->setLayer(pEnt->GetDefaultLayer());
if (g_bTextDefaultLayer)
{
pEnt->setLayer(pEnt->GetDefaultLayer());
}
TSimgleRowTextJig jig(pEnt);
jig.SetKeyword(_T("`"));
jig.SetPrompt(_T("\n请点取插入位置<退出>:"));
int nRet = jig.start();
if(nRet == RTNORM)
{
dlg.AddToRecent();
if(!dlg.m_bContinue)
break;
dlg.m_bPost = FALSE;
}
else if(nRet == RTKWORD)
{
if(dlg.m_nOperCode == 0)
dlg.GetTextHeight();
else if(dlg.m_nOperCode == 1)
dlg.GetPickText();
else if(dlg.m_nOperCode == 2)
dlg.GetTextAngle();
}
else
{
if(::IsWindow(dlg.m_hWnd))
dlg.DestroyWindow();
return;
}
}
if(::IsWindow(dlg.m_hWnd))
dlg.DestroyWindow();
}
void TextStyleEx()
{
int nDrawMode=DocGetDrawMode();
DocSetDrawMode(DRAW_2D);
CTextStyleDlg dlg(acedGetAcadFrame());
CTemporaryResourceOverride vTemp;
dlg.DoModal(); // DLG only has IDOK;
DocSetDrawMode(nDrawMode);
}
// 编辑单行文字
int EditLineText(AcDbObjectId id)
{
double nHeight = 0.0;
OPENOBJ_BEGIN(id, AcDb::kForRead, TDbText, pText);
if(!pText)
return RTERROR;
CSingleRowText dlg(TRUE, acedGetAcadFrame());
dlg.Obj2Dlg(pText);
{
CTemporaryResourceOverride vTemp;
if(dlg.DoModal() != IDOK)
return RTNONE;
}
if(pText->upgradeOpen()!=Acad::eOk)
return RTERROR;
pText->assertWriteEnabled();
dlg.Dlg2Obj(pText);
pText->downgradeOpen();
OPENOBJ_END();
return RTNONE;
}
void TextLine0()
{
XString sTextStyle;
xg_getvar(_T("TEXTSTYLE"), sTextStyle);
AcDbObjectId idTextStyle=GetTextStyleId(sTextStyle);
if(!idTextStyle)
return;
double nHeight=0.0, nRot=0.0;
OPENOBJ_BEGIN(idTextStyle, AcDb::kForRead, AcDbTextStyleTableRecord, pStyle);
ASSERT(pStyle);
nHeight=pStyle->textSize();
OPENOBJ_END();
XString sText(256);
XPoint ptText;
if(XGetPoint(NULL, _T("\n位置"), ptText)==RTNORM &&
ads_getstring(1, _T("\n文字: "), sText)==RTNORM && !!sText) {
ptText=Ucs2Wcs(ptText);
if(nHeight<1.0E-3) {
if(XGetDist(ptText, _T("\n文字高度"), nHeight, RSG_NOZERO|RSG_NONEG)==RTCAN)
return;
nHeight /= DocGetPScale();
}
if(ads_getangle(ptText, _T("\n旋转角度<0.0>:"), &nRot)==RTCAN)
return;
ptText=Ucs2Wcs(ptText);
TDbText *pText=new TDbText;
pText->SetStyleId(idTextStyle);
pText->SetLocation(ptText);
pText->SetHeight(nHeight);
pText->SetRotation(nRot);
pText->SetText(sText);
pText->AddToCSpace(Adesk::kTrue);
}
}
// 编辑多行文字
int EditMutiText(AcDbObjectId id)
{
double nHeight = 0.0, nPageWidth = 0.0;
OPENOBJ_BEGIN(id, AcDb::kForRead, TDbMText, pText);
if(!pText)
return RTERROR;
CMutiRowTextDlg dlg(TRUE, acedGetAcadFrame());
dlg.Obj2Dlg(pText);
{
CTemporaryResourceOverride vTemp;
if(dlg.DoModal() != IDOK)
return RTNONE;
}
if(pText->upgradeOpen()!=Acad::eOk)
return RTERROR;
pText->assertWriteEnabled();
dlg.Dlg2Obj(pText);
pText->downgradeOpen();
OPENOBJ_END();
//return RTNONE;
return RTNORM;//modified by whl
}
void TextMLine()
{
double nHeight = 0.0,
nRot = 0.0,
nPageWidth = 0.0;
CMutiRowTextDlg dlg(FALSE, acedGetAcadFrame());
// modify by xly on 110310 从图纸中获得文字样式
//// modify by xly on 101014 记录文字样式
////XString sTextStyle;
////xg_getvar(_T("TEXTSTYLE"), sTextStyle);
//static XString sTextStyle;
//if (sTextStyle.Length()<1)
//{
// xg_getvar(_T("TEXTSTYLE"), sTextStyle);
//}
//// add by xly on 110106 如果使用新创建的文字样式,图纸切换时产生bug
//bool bIsHas(false);// 标记文字样式中,是否有当前样式
//for (int m =0; m < dlg.m_lstStyle.Length(); m++)
//{
// // 标记文字样式中有当前样式
// if (dlg.m_lstStyle[m] == sTextStyle)
// {
// bIsHas = true;
// break;
// }
//}
//// 没有当前样式,设置默认样式Stantard
//if (!bIsHas)
//{
// xg_getvar(_T("TEXTSTYLE"), sTextStyle);
//}
static XString sTextStyle;
sTextStyle = DocGetTgSingleTextStyle();
// sg add 110523,检查当前记忆的文字样式是否被PU掉
{
bool bExist = false;
AcDbDatabase *pCurDwg = acdbCurDwg();
AcDbTextStyleTable* pTT = NULL;
VERIFY(pCurDwg->getSymbolTable(pTT, AcDb::kForRead)==Acad::eOk);
AcDbTextStyleTableIterator* pIter = NULL;
VERIFY(pTT->newIterator(pIter)==Acad::eOk);
pTT->close();
for (pIter->start(); !pIter->done(); pIter->step())
{
AcDbTextStyleTableRecord* pTTR;
if (pIter->getRecord(pTTR, AcDb::kForRead) != Acad::eOk)
continue;
const TCHAR* pName = NULL;
if (pTTR->getName(pName) == Acad::eOk && pName != NULL)
{
if (_tcsicmp(pName, sTextStyle) == 0) // 如果存在该样式
{
pTTR->close();
bExist = true;
continue;
}
}
pTTR->close();
}
delete pIter;
if (!bExist)
{
TCHAR sStyle[256]=_T("");
xg_getvar(_T("TEXTSTYLE"), sStyle);
sTextStyle = sStyle;
}
}
// add by xly on 110429 文字样式不存在
if (sTextStyle == _T(""))
{
TCHAR sStyle[256]=_T("");
xg_getvar(_T("TEXTSTYLE"), sStyle);
sTextStyle = sStyle;
}
AcDbObjectId idTextStyle = GetTextStyleId(sTextStyle);
if (!idTextStyle)
return;
OPENOBJ_BEGIN(idTextStyle, AcDb::kForRead, AcDbTextStyleTableRecord, pStyle);
ASSERT(pStyle);
dlg.m_strHeight.Format(_T("%.1f"), pStyle->textSize()); //读文字风格的字高
OPENOBJ_END();
dlg.m_strStyle = (const TCHAR *)sTextStyle;
// delete by xly on 101222多行文字中的转角的变量变为静态变量
// dlg.m_strRotation = _T("0");
{
CTemporaryResourceOverride vTemp;
if(dlg.DoModal() != IDOK || dlg.m_strInputText == _T(""))
return;
}
XPoint ptText, ptRight;
if(XGetPoint(NULL, _T("\n左上角"), ptText)==RTNORM )
{
ptText=Ucs2Wcs(ptText);
TDbMText *pText = new TDbMText;
dlg.Dlg2Obj(pText);
pText->SetLocation(ptText);
pText->SetRotation(pText->GetRotation()+Ucs2Wcs(0.0));//add by whl
// add xly on 101014 记录文字样式
sTextStyle = dlg.m_strStyle;
// add by xly on 110310保存文字样式到图纸中
DocSetTgSingleTextStyle(dlg.m_strStyle);
// modify by xly on 101213 添加实体切换图层的功能
//pText->AddToCSpace(Adesk::kTrue);
AddToSpace(Adesk::kTrue, pText);
}
}
void TextMLine0()
{
XString sTextStyle;
xg_getvar(_T("TEXTSTYLE"), sTextStyle);
AcDbObjectId idTextStyle=GetTextStyleId(sTextStyle);
if(!idTextStyle)
return;
double nHeight=0.0, nRot=0.0;
OPENOBJ_BEGIN(idTextStyle, AcDb::kForRead, AcDbTextStyleTableRecord, pStyle);
ASSERT(pStyle);
nHeight=pStyle->textSize();
OPENOBJ_END();
XString sText(2048);
XPoint ptText, ptRight;
if(XGetPoint(NULL, _T("\n左上角"), ptText)==RTNORM &&
XGetPoint(ptText, _T("\n右上角"), ptRight)==RTNORM &&
ads_getstring(1, _T("\n文字: "), sText)==RTNORM && !!sText) {
if(nHeight<1.0E-3) {
if(XGetDist(ptText, _T("\n文字高度"), nHeight, RSG_NOZERO|RSG_NONEG)==RTCAN)
return;
nHeight /= DocGetPScale();
}
TDbMText *pText=new TDbMText;
pText->SetStyleId(idTextStyle);
pText->SetLocation(ptText);
pText->SetHeight(nHeight);
pText->SetRotation(ads_angle(ptText, ptRight));
pText->SetText(sText);
pText->SetPageWidth(ptText.Distance2d(ptRight), FALSE);
pText->SetLineSpace(nHeight/4);
pText->AddToCSpace(Adesk::kTrue);
}
}
// Command: 转化文字 (AcDbText -> TDbText)
void TextConvert()
{
RBList mask(RTDXF0, _T("TEXT"), NULL);
PickSet ss(SS_FREE);
if(SelectEntities(_T("\n请选择ACAD单行文字: "), ss, mask)==RTNORM) {
PickSet ss1(SS_FREE|SS_CREATE);
long lCount=ss.Length();
for(long i=0; i<lCount; i++) {
Entity ent=ss[i];
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbText, pText);
if(pText) {
TDbText *pNewText = new TDbText;
if(pNewText->ConvertFrom(pText)) {
//add by whl on 070108
if(pNewText->GetAlignment()>9)
pNewText->SetAlignment(XExplodeDraw::kBottomLeft);
AddToCurrentSpace(pNewText, Adesk::kTrue);
pText->erase();
} else {
ss1 += ent;
delete pNewText;
}
} else {
ss1 += ent;
}
OPENOBJ_END();
}
/*
long num=ss1.Length();
if(num) {
adsout << _T("\n有") << int(num) << _T("个对象不能被转化!");
ss1.Redraw(3);
} else {
adsout << _T("\n全部选中的") << int(lCount) << _T("个ACAD文字成功的转化为上华文字!");
}*/
}
}
static double g_textCmpHeight;//add by whl
static bool IsSameLine(const TDbText*p1,const TDbText*p2)
{
XPoint pt1=p1->GetLocation(),pt2=p2->GetLocation();
double nRot=p1->GetRotation();
ads_matrix mat;
pt1.GetRotationMatrix(-nRot,mat);
pt2.TransformBy(mat);
if((pt1.y-pt2.y>g_textCmpHeight)||(pt2.y-pt1.y>g_textCmpHeight))
return false;
return true;
}
static int CompTextPos(const TDbText *p1, const TDbText *p2)
{
//modified by whl on 061113,使用包围盒的ptMin来比较
//XPoint pt1=p1->GetLocation(),pt2=p2->GetLocation();
//ads_matrix mat;
//pt1.GetRotationMatrix(-nRot,mat);
//pt2.TransformBy(mat);
double nRot=p1->GetRotation();
TDbText *pText1=(TDbText*)p1->clone();
TDbText *pText2=(TDbText*)p2->clone();
AcGeMatrix3d matRot;
matRot.setToRotation(-nRot,AcGeVector3d::kZAxis);
pText1->transformBy(matRot);
pText2->transformBy(matRot);
XPoint ptTemp,pt1,pt2;
pText1->GetExtents2d(pt1,ptTemp);
pText2->GetExtents2d(pt2,ptTemp);
delete pText1;
delete pText2;
if(pt1.y-pt2.y>g_textCmpHeight)
return -1;
else if(pt2.y-pt1.y>g_textCmpHeight)
return 1;
else//同一行
return pt1.x<pt2.x?-1:1;
}
// Command: 合并文字
//void MergeText()
//{
// DList<TDbText> lstTexts;
// RBList mask(RTDXF0, _T("TEXT,ATS_TEXT"), NULL);
// PickSet ss(SS_FREE);
// if(SelectEntities(_T("\n请选择一排文字: "), ss, mask)!=RTNORM)
// return;
// long lCount=ss.Length();
// for(long i=0; i<lCount; i++) {
// Entity ent=ss[i];
// OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt);
// ASSERT(pEnt);
// if(pEnt->isKindOf(TDbText::desc()))
// lstTexts.Append((TDbText *)pEnt->clone());
// else if(pEnt->isKindOf(AcDbText::desc())){
// TDbText *pText=new TDbText;
// if(pText->ConvertFrom((AcDbText *)pEnt))
// lstTexts.Append(pText);
// else {
// delete pText;
// adsout << _T("\n发现不能转换的文字: ") << ((AcDbText *)pText)->textString();
// return;
// }
// }
// OPENOBJ_END();
// }
// if(lstTexts.Length()<2)
// return;
// double nRot=lstTexts[0]->GetRotation();
// double nHeight=lstTexts[0]->GetHeight();
// for(int n=1; n<lstTexts.Length(); n++) {
// if(!CT_IsExactSameDrt(nRot, lstTexts[n]->GetRotation(), _angSnap)) {
// adsout << _T("\n旋转角度不一致, 无法合并!");
// return;
// }
// nHeight=max(lstTexts[n]->GetHeight(), nHeight);
// }
//
// lstTexts.QuickSort(CompTextPos);
// TDbText *pFirst=lstTexts[0];
// double nWidth1, nHeight1, nTemp;
// pFirst->GetExtents(&nWidth1, &nHeight1, &nTemp);
// XPoint ptBase = pFirst->Align2Base(pFirst->GetLocation(), XPoint(nWidth1, nHeight1,nTemp));
// pFirst->SetHeight(nHeight);
// CString sText=(const TCHAR *)pFirst->GetText();
// for(n=1; n<lstTexts.Length(); n++) {
// TDbText *pText=lstTexts[n];
// sText += (const TCHAR *)pText->GetText();
// }
// pFirst->SetAlignment(XExplodeDraw::kBottomLeft);
// pFirst->SetLocation(ptBase);
// pFirst->SetText(sText);
//
// ss.Erase();
// AddToCurrentSpace((TDbText *)pFirst->clone(), Adesk::kTrue);
//}
void MergeText()
{
DList<TDbText> lstTexts;
RBList mask(RTDXF0, _T("TEXT,ATS_TEXT"), NULL);
PickSet ss(SS_FREE);
if(SelectEntities(_T("\n请选择要合并的文字段落<退出>: "), ss, mask)!=RTNORM)
return;
long lCount=ss.Length();
for(long i=0; i<lCount; i++) {
Entity ent=ss[i];
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt);
ASSERT(pEnt);
if(pEnt->isKindOf(TDbText::desc()))
lstTexts.Append((TDbText *)pEnt->clone());
else if(pEnt->isKindOf(AcDbText::desc())){
TDbText *pText=new TDbText;
if(pText->ConvertFrom((AcDbText *)pEnt))
lstTexts.Append(pText);
else {
adsout << _T("\n发现不能转换的文字: ") << ((AcDbText *)pEnt)->textString();
delete pText;
return;
}
}
OPENOBJ_END();
}
if(lstTexts.Length()<2)
return;
double nRot=lstTexts[0]->GetRotation();
double nHeight=lstTexts[0]->GetHeight();
for(int n=1; n<lstTexts.Length(); n++) {
if(!CT_IsExactSameDrt(nRot, lstTexts[n]->GetRotation(), _angSnap)) {
adsout << _T("\n旋转角度不一致, 无法合并!");
return;
}
nHeight=max(lstTexts[n]->GetHeight(), nHeight);
}
g_textCmpHeight=nHeight*DocGetPScale();//add by whl
lstTexts.QuickSort(CompTextPos);
TDbText *pFirst=lstTexts[0];
CString sText=(const TCHAR *)pFirst->GetText();
bool bMLine;
TCHAR sKey[256];
int nRet;
INITGET_BEG(0,_T("D"));
nRet=acedGetKword(_T("\n[合并为单行文字(D)]<合并为多行文字>:"),sKey);
INITGET_END();
if(nRet==RTNORM)
bMLine=false;
else if(nRet==RTNONE)
bMLine=true;
else if(nRet==RTCAN)
return;
TDbText*pLast=pFirst;
for(n=1; n<lstTexts.Length(); n++)
{
TDbText *pText=lstTexts[n];
if(!bMLine)
sText +=(const TCHAR*)pText->GetText();
else if(IsSameLine(pLast,pText))
//sText +=CString(_T(" "))+(const TCHAR*)pText->GetText();
sText +=(const TCHAR*)pText->GetText();//modified by whl on 051118
else
sText += CString(_T("\r\n"))+(const TCHAR *)pText->GetText();
pLast=pText;
}
XPoint ptLow,ptUp;
ss.GetExtend(ptLow,ptUp);
ptLow.y=ptUp.y;
double width=ptUp.x-ptLow.x;
PickSet ssRes(SS_FREE);
ssRes.IncludeBegin();
if(bMLine)
{
TDbMText *pMText=new TDbMText;
pMText->CopyPropertiesFrom(pFirst,AcDbMatchProperties::kSetAllFlagsOn);
pMText->SetLocation(ptLow);
pMText->SetText(sText);
pMText->SetLineSpace(0.4*nHeight);
XPoint pt0,pt1;
pMText->GetExtents2d(pt0,pt1);
if(pt1.x-pt0.x>_DIST_SNAP)//因为在页宽为0时有时有问题
width=pt1.x-pt0.x;
pMText->SetPageWidth(width,FALSE);
pMText->SetAlignment(XExplodeDraw::kLeft);
AddToCurrentSpace(pMText, Adesk::kTrue);
}
else
{
TDbText *pText=(TDbText*)(pFirst->clone());
pText->SetLocation(ptLow);
pText->SetText(sText);
AddToCurrentSpace(pText,Adesk::kTrue);
}
ssRes.IncludeEnd();
TARCH_IMPEXP int DragMovePickSet(PickSet &ss, const TCHAR *pszPrompt, const XPoint &ptBase, XPoint &ptFinal);
TADSGePoint3d pt(Wcs2Ucs(ptLow));
XPoint xp;
nRet= TchExport::DragMovePickSet(ssRes,_T("\n移动到目标位置<替换原文字>:"),pt,xp);
if(nRet==RTNONE)
ss.Erase();
else if(nRet!=RTNORM)
ssRes.Erase();
}
// Command: 文字自调(调角度)
void TextAdjust()
{
RBList mask(RTDXF0, _T("ATS_TEXT"), NULL);
PickSet ss(SS_FREE);
if(SelectEntities(_T("\n请选择上华文字: "),ss, mask)!=RTNORM)
return;
for(long i=0;i<ss.Length();i++)
{
Entity ent=ss[i];
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbText, pText);
if(pText)
{
BOOL bOldVal=g_bTextAdjust;
g_bTextAdjust=TRUE;
pText->transformBy(AcGeMatrix3d::kIdentity);
g_bTextAdjust = bOldVal;
}
OPENOBJ_END();
}
}
void TextTogAdjust()
{
BOOL bAdjust=g_bTextAdjust!=0;
int nAns=YesNoQuestion(_T("\n是否打开文字自调开关"), bAdjust? Q_YES : Q_NO);
BOOL bNewAdjust=(nAns==Q_YES)? TRUE : FALSE;
if(g_bTextAdjust!=bNewAdjust)
g_bTextAdjust=bNewAdjust;
}
void TextMaskArg(BOOL bTrue)
{
PickSet ss(SS_FREE);
RBList mask(RTDXF0, _T("ATS_SPACE,ATS_TEXT"), NULL);
if(SelectEntities(_T("\n选择文字:"), ss, mask)==RTNORM) {
long lCount=ss.Length();
for(long i=0L;i<lCount;i++) {
Entity ent=ss[i];
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbEntity, pEnt);
if(pEnt->isKindOf(TDbText::desc())) {
((TDbText *)pEnt)->SetMaskFlag(bTrue);
} else if(pEnt->isKindOf(TDbSpace::desc())) {
((TDbSpace *)pEnt)->SetMask(bTrue);
}
OPENOBJ_END();
}
}
}
// Command: 文字屏蔽
void TextMask()
{
TextMaskArg(TRUE);
}
void UnTextMask()
{
TextMaskArg(FALSE);
}
void ConvertHz(BOOL bToBig5, Entity ent, unsigned char *pData)
{
if(ent.Is(_T("INSERT"))) {
Entity entNext, entTemp=ent;
BOOL bUpdateIt=FALSE;
while(ads_entnext(entTemp, entNext)==RTNORM && entNext.Is(_T("ATTRIB"))) {
ConvertHz(bToBig5, entNext, pData);
entTemp=entNext;
entNext.FreeGroups();
bUpdateIt=TRUE;
}
if(bUpdateIt)
ent.Update();
} else {
/* 暂时不转扩展数据
RBList ebufx=DlgHzChg::bConvertWhole?
ads_entgetx(ent, (resbuf *)&Groups(_T("*"))) : ads_entget(ent);
resbuf * rb=ebufx;
int bModified=0;
while(DlgHzChg::bConvertWhole && (rb=AT_get_resbuf(rb, XD_STR))) {
assert(rb->resval.rstring!=NULL);
unsigned char szOut[2048]=_T("");
unsigned int nOut;
if(nConvertCode==CHG_FTOJ)
big_2_gb((unsigned char *)rb->resval.rstring, _tcslen(rb->resval.rstring), szOut, &nOut, szBuf);
else if(nConvertCode==CHG_JTOF)
gb_2_big((unsigned char *)rb->resval.rstring, _tcslen(rb->resval.rstring), szOut, &nOut, szBuf);
else AntiUnicode((unsigned char *)rb->resval.rstring, szOut);
free(rb->resval.rstring);
rb->resval.rstring=strdup((const char *)szOut);
bModified=1;
rb=rb->rbnext;
}
*/
// Then Change Data of Entity TEXT, ATTDEF, ATTRIB
XString sEntType;
ent.GetData(0, sEntType);
TCHAR szWild[40]=_T("TCH_*");
if(sEntType==_T("ATTDEF") || sEntType==_T("ATTRIB") || sEntType==_T("TEXT")) {
XString szOut; //[2048]=_T("");
TCHAR szIn[2048]=_T("");
ent.GetData(1, szIn);
int nRet=bToBig5? GBToBig5(szIn, szOut, pData) : Big5ToGB(szIn, szOut, pData);
if(nRet==RTNORM)
ent.SetData(1, (const TCHAR *)szOut);
if(sEntType==_T("ATTDEF") || sEntType==_T("ATTRIB")) {
VERIFY(ent.GetData(2, szIn)==RTNORM);
nRet=bToBig5? GBToBig5(szIn, szOut, pData) : Big5ToGB(szIn, szOut, pData);
if(nRet==RTNORM)
ent.SetData(2, (const TCHAR *)szOut);
if(sEntType==_T("ATTDEF")) {
VERIFY(ent.GetData(3, szIn)==RTNORM);
nRet=bToBig5? GBToBig5(szIn, szOut, pData) : Big5ToGB(szIn, szOut, pData);
if(nRet==RTNORM)
ent.SetData(3, (const TCHAR *)szOut);
}
}
ent.Modify();
/*
unsigned int nOut;
if(nConvertCode==CHG_FTOJ)
big_2_gb(szIn, _tcslen((TCHAR *)szIn), szOut, &nOut, szBuf);
else
gb_2_big(szIn, _tcslen((TCHAR *)szIn), szOut, &nOut, szBuf);
*/
} else if(ads_wcmatch(sEntType, sEntType)==RTNORM) {
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbEntity, pEnt);
if(pEnt) {
if(pEnt->isKindOf(TDbEntity::desc())) {
((TDbEntity *)pEnt)->ConvertText(bToBig5? GBToBig5 : Big5ToGB, pData);
} else if(pEnt->isKindOf(TDbCurveEntity::desc())) {
((TDbCurveEntity *)pEnt)->ConvertText(bToBig5? GBToBig5 : Big5ToGB, pData);
}
}
OPENOBJ_END();
}
}
}
class CComplexToSimplyDlg : public CAcUiDialog
{
DECLARE_DYNAMIC(CComplexToSimplyDlg)
public:
CComplexToSimplyDlg(CWnd* pParent = NULL); // 标准构造函数
virtual ~CComplexToSimplyDlg();
virtual BOOL OnInitDialog();
// 对话框数据
enum { IDD = IDD_DLGSIMTOCOM };
protected:
static BOOL g_bToSimply;//TRUE 到简体 FALSE 到繁体
static BOOL g_bSelectAll;//TRUE 当前图面全选 FALSE 窗选
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedTocomplex();
afx_msg void OnBnClickedTosimply();
afx_msg void OnBnClickedAll();
afx_msg void OnBnClickedSelect();
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedCancel();
};
// CComplexToSimplyDlg 对话框
BOOL CComplexToSimplyDlg::g_bSelectAll = FALSE;
BOOL CComplexToSimplyDlg::g_bToSimply = TRUE;
extern void HzConvertArg(BOOL bToBig5, BOOL bSelectAll);
IMPLEMENT_DYNAMIC(CComplexToSimplyDlg, CAcUiDialog)
CComplexToSimplyDlg::CComplexToSimplyDlg(CWnd* pParent /*=NULL*/)
: CAcUiDialog(CComplexToSimplyDlg::IDD, pParent)
{
}
CComplexToSimplyDlg::~CComplexToSimplyDlg()
{
}
void CComplexToSimplyDlg::DoDataExchange(CDataExchange* pDX)
{
CAcUiDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CComplexToSimplyDlg, CAcUiDialog)
ON_BN_CLICKED(IDC_TOCOMPLEX, OnBnClickedTocomplex)
ON_BN_CLICKED(IDC_TOSIMPLY, OnBnClickedTosimply)
ON_BN_CLICKED(IDC_ALL, OnBnClickedAll)
ON_BN_CLICKED(IDC_SELECT, OnBnClickedSelect)
ON_BN_CLICKED(IDOK, OnBnClickedOk)
ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
END_MESSAGE_MAP()
BOOL CComplexToSimplyDlg::OnInitDialog()
{
BOOL bRes = CAcUiDialog::OnInitDialog();
CWnd* pWnd = NULL;
if (g_bToSimply)
pWnd = GetDlgItem(IDC_TOSIMPLY);
else
pWnd = GetDlgItem(IDC_TOCOMPLEX);
((CButton*)pWnd)->SetCheck(1);
if(g_bSelectAll)
pWnd = GetDlgItem(IDC_ALL);
else
pWnd = GetDlgItem(IDC_SELECT);
((CButton*)pWnd)->SetCheck(1);
return bRes;
}
// CComplexToSimplyDlg 消息处理程序
void CComplexToSimplyDlg::OnBnClickedTocomplex()
{
// TODO: 在此添加控件通知处理程序代码
g_bToSimply = FALSE;
}
void CComplexToSimplyDlg::OnBnClickedTosimply()
{
// TODO: 在此添加控件通知处理程序代码
g_bToSimply = TRUE;
}
void CComplexToSimplyDlg::OnBnClickedAll()
{
// TODO: 在此添加控件通知处理程序代码
g_bSelectAll = TRUE;
}
void CComplexToSimplyDlg::OnBnClickedSelect()
{
// TODO: 在此添加控件通知处理程序代码
g_bSelectAll = FALSE;
}
void CComplexToSimplyDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
// BeginEditorCommand(); //将控制权交给CAD
OnOK();
if (g_bToSimply)
{
if(g_bSelectAll)
HzConvertArg(FALSE, TRUE);
else
HzConvertArg(FALSE, FALSE);
}
else
{
if(g_bSelectAll)
HzConvertArg(TRUE, TRUE);
else
HzConvertArg(TRUE, FALSE);
}
// CompleteEditorCommand();//将控制权交给对话框
}
void CComplexToSimplyDlg::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
OnCancel();
}
//modified by zkm on 050530
void HzConvertArg(BOOL bToBig5, BOOL bSelectAll)
{
unsigned char *szBuf=NULL;
const TCHAR *szTabFile=(!bToBig5)? _T("GB.TBL"):_T("BIG_5.TBL");
XString sTabPath(128);
if(!FindFile(szTabFile, sTabPath)) {
adsout << _T("\nCan not find file ") << szTabFile;
return;
}
FILE *fp=_tfopen(sTabPath, _T("rb"));
if(!fp) {
adsout << _T("\nCan not open file ") << szTabFile << _T(" to read!");
return;
}
// Zyu modify on 100726,去掉编译警告
//long fsize=filelength(fileno(fp));
long fsize = _filelength(_fileno(fp));
if(fsize>=65535L) {
_tprintf(_T("\nHz code table is large than 64K!"));
return;
}
szBuf=new unsigned char [(unsigned int)(fsize+1)];
fread(szBuf, sizeof(char), (unsigned int)fsize, fp);
fclose(fp);
szBuf[(unsigned int)fsize]=0;
PickSet ssAll(SS_FREE);
if(!bSelectAll)
{
RBList mask(RTDXF0, _T("TEXT,ATTDEF,INSERT,TCH_*"), NULL);
if(SelectEntities(_T("\n选择包含文字的图元:"), ssAll, mask)==RTNORM)
{
long len=ssAll.Length();
for(long i=0; i<len; i++)
{
Entity ent=ssAll[i];
ConvertHz(bToBig5, ent, szBuf);
}
}
}
//ADD BY ZKM
else
{
ssAll.Get(_T("X"), NULL, NULL, RBList(RTDXF0, _T("TEXT,ATTDEF,INSERT,TCH_*"), NULL));
long len=ssAll.Length();
for(long i=0; i<len; i++)
{
Entity ent=ssAll[i];
ConvertHz(bToBig5, ent, szBuf);
}
}
delete[] szBuf;
}
//void HzConvertArg(BOOL bToBig5)
//{
// unsigned char *szBuf=NULL;
// char *szTabFile=(!bToBig5)? "GB.TBL":"BIG_5.TBL";
// XString sTabPath(128);
// if(!FindFile(szTabFile, sTabPath)) {
// adsout << "\nCan not find file " << szTabFile;
// return;
// }
//
// FILE *fp=fopen(sTabPath, "rb");
// if(!fp) {
// adsout << "\nCan not open file " << szTabFile << " to read!";
// return;
// }
//
// long fsize=filelength(fileno(fp));
// if(fsize>=65535L) {
// printf("\nHz code table is large than 64K!");
// return;
// }
// szBuf=new unsigned char [(unsigned int)(fsize+1)];
// fread(szBuf, sizeof(char), (unsigned int)fsize, fp);
// fclose(fp);
// szBuf[(unsigned int)fsize]=0;
//
//
// PickSet ssAll(SS_FREE);
// RBList mask(RTDXF0, "TEXT,ATTDEF,INSERT,TCH_*", NULL);
// if(SelectEntities("\n选择包含文字的图元:", ssAll, mask)==RTNORM) {
// long len=ssAll.Length();
// for(long i=0; i<len; i++) {
// Entity ent=ssAll[i];
// ConvertHz(bToBig5, ent, szBuf);
// }
// }
// delete[] szBuf;
//}
//void BIG5_GB()
//{
// HzConvertArg(FALSE);
//}
//add by zkm
void BIG5_GB()//简繁转换
{
CTemporaryResourceOverride vTemp;
CComplexToSimplyDlg simDlg;
simDlg.DoModal();
}
void FindAndReplace0()
{
RBList mask(RTDXF0, _T("ATS_TEXT"), NULL);
Entity ent;
XString sSubText, sRepText;
if(ads_getstring(0, _T("\n输入待查找文字:"), sSubText)==RTNORM &&
ads_getstring(0, _T("\n待替换文字:"), sRepText)==RTNORM &&
ent.FilterSelect(_T("\n选择文字:"), mask)==RTNORM) {
int nPos=0;
XScreenDc dc(1,1);
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbText, pText);
CString csText=pText->GetText();
XPoint ptExt=pText->GetExtents(); //x, y方向的尺寸
XPoint ptTextBase=pText->Align2Base(pText->GetLocation(), ptExt); //左下角
double nRot=pText->GetRotation(); //转角
XPoly2D polyExt(1);
BOOL bRepAll=FALSE;
int nFindAndReplace=0, nFindNum=0;
while(1) {
int nFindPos=csText.Find(sSubText, nPos);
if(nFindPos<0)
break;
nFindNum++;
// Zyu modify on 100726,去掉编译警告
//XString sPrefix(_tcslen(csText)+1), sSuffix(_tcslen(csText)+1);
XString sPrefix((int)_tcslen(csText)+1), sSuffix((int)_tcslen(csText)+1);
StrCpy(sPrefix, csText, &((const TCHAR *)csText)[nFindPos]); //前面的字符串
StrCpy(sSuffix, &((const TCHAR *)csText)[nFindPos+_tcslen(sSubText)], NULL);
XString sKeyWord;
if(!bRepAll) {
XPoint ptLowLeft;
TDbText *pClone=(TDbText *)pText->clone();
pClone->SetText(sPrefix);
XPoint extTemp=pClone->GetExtents();
ads_polar(ptTextBase, nRot, extTemp.x, ptLowLeft);
pClone->SetText(sSubText);
extTemp = pClone->GetExtents();
delete pClone;
// 求找到的位置范围
polyExt.Reset();
polyExt.AppendNode(ptLowLeft);
XPoint ptTemp;
ads_polar(ptLowLeft, nRot, extTemp.x, ptTemp);
polyExt.AppendNode(ptTemp);
ads_polar(ptTemp, nRot+PI/2, extTemp.y, ptTemp);
polyExt.AppendNode(ptTemp);
ads_polar(ptLowLeft, nRot+PI/2, extTemp.y, ptTemp);
polyExt.AppendNode(ptTemp);
// 确保找到的位置范围可见
XPoint ptMin, ptMax;
polyExt.GetExtend(ptMin, ptMax);
AssureOnScreen(ptMin, ptMax);
dc << polyExt;
adsout << _T("\n替换[R]/全部替换[A]/下一个[N]/<结束>:");
int nRetCode;
INITGET_BEG(0, _T("R A N"));
nRetCode=ads_getkword(_T(""), sKeyWord);
INITGET_END();
ads_redraw(NULL, 1);
if(nRetCode!=RTNORM)
return;
}
if(bRepAll || sKeyWord[0]==_T('R') || sKeyWord[0]==_T('A')) { //替换并转到下一个
CString csNewString;
csNewString += (const TCHAR *)sPrefix;
csNewString += (const TCHAR *)sRepText;
csNewString += (const TCHAR *)sSuffix;
// Zyu modify on 100726,去掉编译警告
//nPos = nFindPos + _tcslen(sRepText);
nPos = nFindPos + (int)_tcslen(sRepText);
//if(nPos==nFindPos)
// nPos++;
csText=csNewString;
if(pText->upgradeOpen()==Acad::eOk) {
pText->SetText(csNewString);
pText->downgradeOpen();
} else {
adsout << _T("\n无法修改文字对象!");
return;
}
nFindAndReplace++;
if(!bRepAll) {
if(sKeyWord[0]==_T('A'))
bRepAll=TRUE;
}
} else if(sKeyWord[0]==_T('N')) {
//if(!nFindPos)
// nPos ++;
//else
// Zyu modify on 100726,去掉编译警告
//nPos=nFindPos+_tcslen(sSubText);
nPos = nFindPos + (int)_tcslen(sSubText);
}
}
adsout << _T("\n找到") << nFindNum << _T("个; 替换") << nFindAndReplace << _T("个");
OPENOBJ_END();
}
}
void ReplaceFindText()
{
RBList mask(RTDXF0, _T("TCH_*"), NULL);
PickSet ss(SS_FREE);
XString sSubText, sRepText;
if(ads_getstring(0, _T("\n输入待查找文字:"), sSubText)!=RTNORM ||
ads_getstring(0, _T("\n待替换文字:"), sRepText)!=RTNORM ||
SelectEntities(_T("\n选择文字:"), ss, mask)!=RTNORM)
return;
XScreenDc dc(1,1);
BOOL bRepAll=FALSE;
int nFindAndReplace=0, nFindNum=0;
// sg add 110504,解决查找时,可能受“全字匹配”影响的问题,临时去掉全字匹配的设置
DWORD dwMaskOld = g_FindParser.GetFindOption(),
dwMaskNew = dwMaskOld;
dwMaskNew = dwMaskNew & ~FP_WHOLE_WORD;
g_FindParser.SetFindOption(dwMaskNew);
long lCount=ss.Length();
for(long i=0L; i<lCount; i++) {
Entity ent=ss[i];
int nPos=0;
OPENOBJ_BEGIN(ent, AcDb::kForRead,TDbEntity, pText);
if(!pText) continue;
TTextPosition pos;
while(1) {
TTextRange range;
TTextPosition posFind=pText->FindSubText(sSubText, pos, &range);
if(!posFind)
break;
nFindNum++;
XString sKeyWord;
if(!bRepAll) {
XPoint ptMin, ptMax;
if(range.GetExtend(ptMin, ptMax)) {
AssureInCurrentView(ptMin, ptMax);
for(int n=0; n<range.m_lstRanges.Length(); n++)
dc << (*range.m_lstRanges[n]);
}
adsout << _T("\n替换[R]/全部替换[A]/下一个[N]/<结束>:");
int nRetCode;
INITGET_BEG(0, _T("R A N"));
nRetCode=ads_getkword(_T(""), sKeyWord);
INITGET_END();
ads_redraw(NULL, 1);
if(nRetCode!=RTNORM)
return;
}
if(bRepAll || sKeyWord[0]==_T('R') || sKeyWord[0]==_T('A')) { //替换并转到下一个
if(pText->upgradeOpen()==Acad::eOk) {
pos=pText->ReplaceSubText(posFind, sRepText);
pText->downgradeOpen();
} else {
adsout << _T("\n无法修改文字对象!");
break;;
}
nFindAndReplace++;
if(!bRepAll) {
if(sKeyWord[0]==_T('A'))
bRepAll=TRUE;
}
} else if(sKeyWord[0]==_T('N')) {
}
if(!pos)
break;
}
OPENOBJ_END();
}
// sg add 110504,解决查找时,可能受“全字匹配”影响的问题,恢复默认
g_FindParser.SetFindOption(dwMaskOld);
adsout << _T("\n找到") << nFindNum << _T("个; 替换") << nFindAndReplace << _T("个");
}