#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 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; iConvertFrom(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 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; iisKindOf(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; nGetRotation(), _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; nGetText(); // } // pFirst->SetAlignment(XExplodeDraw::kBottomLeft); // pFirst->SetLocation(ptBase); // pFirst->SetText(sText); // // ss.Erase(); // AddToCurrentSpace((TDbText *)pFirst->clone(), Adesk::kTrue); //} void MergeText() { DList 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; iisKindOf(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; nGetRotation(), _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; nGetText(); 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;itransformBy(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;iisKindOf(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=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; iGetText(); 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; iFindSubText(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:"); 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("个"); }