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

1622 lines
44 KiB
C++

// InsTextDlg.cpp : implementation file
//
#include "stdafx.h"
#include <TWireDim.h>
#include <TLampDim.h>
#include <DbVPipeDim.h>
#include <DbEquipDimNew.h>
#include <TDbWireDimNew.h>
#include <DbRadiator.h>
#include <DbSymbolAnnotate.h>
#include <TDbPipeMultDim.h>
#include "InsTextDlg.h"
#include "tapi.h"
#include "xtext.h"
#include "TextHeightDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern double g_nDimHeight, g_nScaleDim ;
extern CString g_csDimStyle;
//************************************************************************************
// 统一字高
//************************************************************************************
void SetBlkAttrHeight(Entity entBlk, const TCHAR*szTag, double nHeight)
{
SetLayer0UnLocked();
AcDbBlockReference *pBlockRef = NULL;// 定义块表指针
AcDbObjectId eId;
acdbGetObjectId(eId, entBlk);
acdbOpenObject(pBlockRef, eId, AcDb::kForRead);
if(!pBlockRef)
return;
AcDbObjectIterator *pIterator;
pIterator = pBlockRef -> attributeIterator();
for (pIterator -> start(); !pIterator -> done(); pIterator -> step())
{
//遍历块中实体
AcDbObjectId att_id;
att_id = pIterator -> objectId();
AcDbEntity *pEnt;
AcDbAttribute *pAtt;
acdbOpenAcDbEntity(pEnt, att_id, AcDb::kForWrite);
pAtt = AcDbAttribute::cast(pEnt);
if(pAtt != NULL)
{
TCHAR *cname = pAtt->tag();//得到标记
if(_tcsicmp(cname, szTag) == 0){
pAtt->setHeight(nHeight*DocGetPScale());
}
delete[] cname;
}
pEnt->close();
}
delete pIterator;
pBlockRef->close();
}
void EqualTextHeight()
{
RBList rbMask = ads_buildlist( -4, _T("<or"), RTDXF0, _T("ATS_TEXT"),
RTDXF0, _T("ATS_MTEXT"),
RTDXF0, _T("ATS_PIPEMULTDIM"),
RTDXF0, _T("TEXT"),
RTDXF0, _T("INSERT"), 8, GetLayerNames(_T("标注")), 2, _T("$TelecSys$*"),
RTDXF0, _T("INSERT"), 8, GetLayerNames(_T("设备")), 2, _T("$equip*"),
RTDXF0, _T("ATS_PIPE"),
RTDXF0, _T("ATS_VPIPEDIM"),
RTDXF0, _T("ATS_RADIATOR"),
RTDXF0, _T("ATS_ARROW"),
RTDXF0, _T("ATS_PIPETEXT"),
RTDXF0, _T("ATS_EQUIPDIM2"),
RTDXF0, _T("ATS_WIREDIM2"),
RTDXF0, _T("ATS_DBHEQUIPMENT"), // add by hh 2012-07-27 支持处理暖通设备和阀门中的文字
RTDXF0, _T("ATS_WIREDIM"), -4, _T("or>"), NULL);
PickSet ss(SS_FREE);
if(SelectEntities(_T("\n请选择要修改的文字(ACAD文字,上华文字,上华标注)<退出>"), ss, rbMask) != RTNORM)
return;
BOOL bHasAcad(FALSE), bHasTch(FALSE), bHasDim(FALSE), bHasEquip(FALSE);
long len2 = ss.Length();
for(long j=0;j<len2;j++)
{
Entity ent = ss[j];
if(ent.Is(_T("ATS_TEXT"))) //上华文字
bHasTch = TRUE;
else if(ent.Is(_T("ATS_PIPETEXT"))) //管线文字
bHasDim = TRUE;
else if(ent.Is(_T("ATS_PIPEMULTDIM")))//多管标注
bHasDim = TRUE;
else if(ent.Is(_T("ATS_PIPE"))) //管径标注
bHasDim = TRUE;
else if(ent.Is(_T("ATS_ARROW"))) //箭头文字
bHasDim = TRUE;
else if(ent.Is(_T("ATS_MTEXT"))) //多行文字
bHasTch = TRUE;
else if(ent.Is(_T("TEXT"))) //ACAD文字
bHasAcad = TRUE;
else if(ent.Is(_T("ATS_VPIPEDIM"))) //立管标注
bHasDim = TRUE;
else if(ent.Is(_T("ATS_EQUIPDIM2"))) //设备标注 (新)
bHasDim = TRUE;
else if(ent.Is(_T("ATS_WIREDIM2"))) //导线标注(新)
bHasDim = TRUE;
else if(ent.Is(_T("ATS_WIREDIM"))) //导线标注
bHasDim = TRUE;
else if(ent.Is(_T("ATS_RADIATOR"))) //暖通设备 散热器
bHasDim = TRUE;
else if(ent.Is(_T("ATS_DBHEQUIPMENT")))//暖通设备 阀门
bHasDim = TRUE;
else if(ent.Is(_T("INSERT"))) //标导线数 & 电气图块
{
bHasDim = TRUE;
}
}
double nHeight(3.5);
if((bHasTch && !bHasAcad && !bHasDim) || (!bHasTch && !bHasAcad && bHasDim) || (bHasAcad && !bHasTch && !bHasDim)){
ads_getreal(_T("\n字高() <3.5mm>"), &nHeight);
if(nHeight > 20){
AfxMessageBox(_T("输入字高太大了!应为实际出图字高"));
return;
}
}
else{
CAcModuleResourceOverride vTemp;
CTextHeightDlg dlg;
dlg.m_bAcad = bHasAcad;
dlg.m_bDim = bHasDim;
dlg.m_bTch = bHasTch;
if(dlg.DoModal() != IDOK)
return;
nHeight = dlg.m_nHeight;
bHasAcad = dlg.m_bAcad;
bHasDim = dlg.m_bDim;
bHasTch = dlg.m_bTch;
if(dlg.m_bLayer){
Entity entSel;
if(SelectEntity(_T("\n请选择指定图层上任意图元"), entSel, rbMask) != RTNORM)
return;
PickSet ssDel(SS_FREE);
TCHAR szLayer[256];
TCHAR szLayer2[256];
entSel.GetData(8, szLayer);
for(long j=0;j<len2;j++){
Entity ent = ss[j];
ent.GetData(8, szLayer2);
if(_tcsicmp(szLayer, szLayer2) != 0)
ssDel += ent;
}
ss -= ssDel;
}
}
long len = ss.Length();
for(long i=0;i<len;i++){
Entity ent = ss[i];
if(ent.Is(_T("ATS_TEXT")) && bHasTch){
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbText, pEnt);
if(pEnt){
pEnt->SetHeight(nHeight);
}
OPENOBJ_END();
}
else if(ent.Is(_T("ATS_PIPETEXT")) && bHasDim){
ent.SetData(140, nHeight);
ent.Modify();
}
else if(ent.Is(_T("ATS_PIPEMULTDIM")) && bHasDim){
// ent.SetData(40, nHeight);
// ent.Modify();
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbPipeMultDim, pEnt);
if(pEnt){
pEnt->SetTextHeight(nHeight);
}
OPENOBJ_END();
}
else if(ent.Is(_T("ATS_PIPE")) && bHasDim){
ent.SetData(141, nHeight);
ent.Modify();
}
else if(ent.Is(_T("ATS_ARROW")) && bHasDim){
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbSymbArrow, pEnt);
if(pEnt){
pEnt->SetTextHeight(nHeight);
}
OPENOBJ_END();
}
else if(ent.Is(_T("ATS_MTEXT")) && bHasTch){
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbMText, pEnt);
if(pEnt){
pEnt->SetHeight(nHeight);
}
OPENOBJ_END();
}
else if(ent.Is(_T("TEXT")) && bHasAcad){
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbText, pEnt);
if(pEnt){
if(bHasAcad && !bHasTch && !bHasDim && nHeight > 90)
pEnt->setHeight(nHeight);
else
pEnt->setHeight(nHeight*DocGetPScale());
}
OPENOBJ_END();
}
else if(ent.Is(_T("ATS_VPIPEDIM")) && bHasDim){
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbVPipeDim, pEnt);
if(pEnt){
pEnt->SetTextHeight(nHeight);
}
OPENOBJ_END();
}
else if(ent.Is(_T("ATS_EQUIPDIM2")) && bHasDim){
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbEquipDimNew, pEnt);
if(pEnt){
pEnt->SetTextHeight(nHeight);
}
OPENOBJ_END();
}
else if(ent.Is(_T("ATS_WIREDIM2")) && bHasDim){
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbWireDimNew, pEnt);
if(pEnt){
pEnt->SetTextHeight(nHeight);
}
OPENOBJ_END();
}
else if(ent.Is(_T("ATS_RADIATOR")) && bHasDim){
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbRadiator, pEnt);
if(pEnt){
pEnt->SetTextHeight(nHeight);
}
OPENOBJ_END();
}
else if(ent.Is(_T("ATS_WIREDIM")) && bHasDim){
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TWireDim, pEnt);
if(pEnt){
pEnt->SetTextHeight(nHeight*DocGetPScale());
}
OPENOBJ_END();
}
else if(ent.Is(_T("INSERT")) && bHasDim){
TCHAR szBlkName[256];
ent.GetData(2, szBlkName);
CString csBlkName = szBlkName;
if(csBlkName.Find(_T("$TelecSys$")) > -1)
SetBlkAttrHeight(ent, _T("N"), nHeight);
else
SetBlkAttrHeight(ent, _T("$TEXT$"), nHeight);
}
// else if(ent.Is(_T("ATS_DBHEQUIPMENT")) && bHasDim){
// OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbHvacEquipment, pEnt);
// if(pEnt){
// TDbXDataMap* pXMap = pEnt->GetSpecialtyData();
// if(NULL != pXMap){
// pXMap->SetAt(HDIM_DimTextHeigh, nHeight);
// }
// }
// OPENOBJ_END();
// }
}
}
//************************************************************************************
// 递增文字
//************************************************************************************
extern TARCH_IMPEXP BOOL g_bTextStyleEx;
TTextPosition FindEntText(Entity ent, const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange)
{
TTextPosition posFind;
if(!sSubText || !sSubText[0])
return posFind;
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbEntity, pEnt);
if(pEnt->isKindOf(TDbEntity::desc())) {
TDbEntity *pText=TDbEntity::cast(pEnt);
posFind=pText->FindSubText(sSubText, posStart, pRange);
} else if(pEnt->isKindOf(AcDbText::desc())) {
XPushMemVar<BOOL> vTemp(g_bTextStyleEx, FALSE);
TDbText text;
AcDbText *pText=AcDbText::cast(pEnt);
if(text.ConvertFrom(pText)) {
posFind = text.FindSubText(sSubText, posStart, pRange);
}
}
OPENOBJ_END();
return posFind;
}
void GrdrawRect(XRectAngle &rect)
{
ads_grdraw(rect.GetLowLeft(), rect.GetUpLeft(), 1, 0);
ads_grdraw(rect.GetLowLeft(), rect.GetLowRight(), 1, 0);
ads_grdraw(rect.GetUpRight(), rect.GetLowRight(), 1, 0);
ads_grdraw(rect.GetUpLeft(), rect.GetUpRight(), 1, 0);
}
void GrdrawPoly(XPoly2D &poly)
{
int len = poly.Length();
for(int i=0;i<len;i++)
{
XCurveSegment seg;
poly.Nth(i, seg);
XPoint ptS, ptE;
ads_grdraw(seg.StartPoint(), seg.EndPoint(), 1, 0);
}
}
void PlusTextCmd()
{
Entity entSel;
XPoint ptPick;
CString csText, csLeft, csRight;
while(1){
CString csPompt = _T("\n请选择要递增拷贝的文字图元(同时按CTRL键进行递减拷贝,注意点哪个字符对哪个字符进行递增)<退出>");
if(SelectEntity(csPompt, entSel, ptPick, RBList(RTDXF0, _T("ATS_TEXT,TEXT"), NULL)) != RTNORM)
return;
XPoint ptPickWcs = Ucs2Wcs(ptPick);
XText text2(entSel);
csText = text2.m_csText;
int len = csText.GetLength();
TTextPosition pos;
for(int i=0;i<len;i++){
CString csUnit;
TCHAR cUnit = csText[i];
BYTE byte = (BYTE)cUnit;
csUnit = cUnit;
#if (ADS<17)
if(IsDBCSLeadByte(byte)){//如果是半个汉字,就再读下1个字符
TCHAR cUnit2 = csText[i+1];
csUnit.Format(_T("%c%c"),cUnit,cUnit2);
i++;
}
#endif
TTextRange range;
TTextPosition posFind = FindEntText(entSel, csUnit, pos, &range);
if(!!posFind){
XPoint ptMin, ptMax;
if(range.GetExtend(ptMin, ptMax))
{
int ll = range.m_lstRanges.Length();
for(int n=0; n<range.m_lstRanges.Length(); n++)
{
XPoly2D poly = *range.m_lstRanges[n];
poly.SetElevation(0.0);
int ret = ptPickWcs&poly;
if(ret == PR_INSIDE)
{
// if(ptPick.x < ptMax.x && ptPick.x > ptMin.x && ptPick.y < ptMax.y && ptPick.y > ptMin.y){
csLeft = csText.Left(pos.m_nTextPos);
csRight = csText.Right(len - pos.m_nTextPos);
poly.TransUCS(Groups(0), Groups(1));//Groups(0) wcs, Groups(1) ucs
// XRectAngle rect(ptMin, ptMax);
GrdrawPoly(poly);
break;
}
}
}
}
}
if(csLeft != _T("") || csRight != _T(""))
break;
}
XText text(entSel);
XPoint ptInsert, ptAlignmentPoint, ptOld;
double nHeight = text.m_nHeight;
if(entSel.Is(_T("ATS_TEXT")))
nHeight = nHeight*DocGetPScale();
else{
OPENOBJ_BEGIN(entSel, AcDb::kForRead, AcDbText, pEnt);
if(pEnt){
ptInsert = pEnt->position();
ptAlignmentPoint = pEnt->alignmentPoint();
ptOld = ptAlignmentPoint;
}
OPENOBJ_END();
}
//2007-6-1 支持用户点基点
AcGeMatrix3d matBase;
XPoint ptBase;
if(ads_getpoint(Wcs2Ucs(text.m_ptInsert), _T("\n请点选基点:"), ptBase) == RTNORM)
{
ptBase = Ucs2Wcs(ptBase);
matBase.setToTranslation(AcGeVector3d(text.m_ptInsert[0] - ptBase[0], text.m_ptInsert[1] - ptBase[1], 0));
}
while(1){
SHORT nStateCtrl = GetKeyState(VK_CONTROL);
BOOL bCtrl = (nStateCtrl&256)!=0;
if(bCtrl)
csLeft = PlusString(csLeft, 1, FALSE);
else
csLeft = PlusString(csLeft, 1, TRUE);
csText = csLeft + csRight;
XPoint ptIns;
xg_getvar(_T("VIEWCTR"), ptIns);
ptIns = Ucs2Wcs(ptIns);
TTextEdJig jig(entSel.Is(_T("ATS_TEXT")), ptInsert, text.m_nHeight, csText, text.m_idStyle, text.m_nRotate);
jig.SetPrompt(_T("\n请指定文字的插入点<退出>:"));
jig.m_mat = matBase;
if(!ptOld)
ptOld = ptInsert;
if(entSel.Is(_T("ATS_TEXT")))
jig.SetAlign(text.m_Align);
else{
jig.SetAlign(text.m_vertMode, text.m_horzMode);
jig.SetAlignPoint(ptAlignmentPoint);
}
jig.m_ptRef = ptOld;
jig.SetWHScale(text.m_nScale);
if(jig.DoIt() != RTNORM)
return;
ptIns = jig.GetPickPoint();
ptIns.TransformBy(matBase);
ptOld = ptIns;
XText text2(csText, ptIns, nHeight, text.m_nScale, (const TCHAR*)GetSymbolName(text.m_idStyle), text.m_csLayer);
text2.SetRotate(text.m_nRotate);
if(entSel.Is(_T("ATS_TEXT")))
text2.TgDraw(text.m_Align);
else{
AcGeVector3d vt(ptIns-ptInsert);
XPoint ptAcadTextAlign = ptAlignmentPoint+vt;
text2.m_ptAlign = ptAcadTextAlign;
text2.Draw(text.m_vertMode, text.m_horzMode);
}
}
}
//************************************************************************************
// 修改文字
//************************************************************************************
// 返回: FALSE-空串
// numWidth: 0-无数字;1-数字宽度不固定,否则固定宽度
BOOL StringAnalysis(const TCHAR *src, XString &sPrefix, int *num, int *numWidth)
{
ASSERT(src && num && numWidth);
int nLen = (int)_tcslen(src);
if(!nLen)
return FALSE;
int iNumPos=nLen;
for(int iPos=nLen-1; iPos>=0; iPos--) {
if(!_istdigit(src[iPos]))
break;
else iNumPos=iPos;
}
if(iNumPos==nLen) {
*numWidth=0; //No digit
} else {
if(iNumPos>0) {
XString sTemp;
sTemp=src;
StrCpy(sTemp, src, src+iNumPos);
sPrefix=sTemp;
} else {
sPrefix=_T("");
}
if(iNumPos==nLen-1) {
*numWidth=-1;
} else {
if(src[iNumPos]==_T('0')) {
*numWidth=nLen - (int)_tcslen(sPrefix);
} else {
*numWidth=-1;
}
}
*num=_ttoi(src+iNumPos);
}
return TRUE;
}
void ModifyTextCmd()
{
RBList rbMask = ads_buildlist( -4, _T("<or"), RTDXF0, _T("ATS_TEXT"),
RTDXF0, _T("ATS_MTEXT"),
RTDXF0, _T("ATS_ELEVATION"),
RTDXF0, _T("TEXT"),
RTDXF0, _T("ATS_PIPE"),
RTDXF0, _T("ATS_ARROW"),
RTDXF0, _T("ATS_PIPETEXT"),
RTDXF0, _T("ATS_WIREDIM2"),
RTDXF0, _T("ATS_WIREDIM"), -4, _T("or>"), NULL);
Entity entSel;
while(1){
if(SelectEntity(_T("\n请选择要修改的文字图元(同时按CTRL键进行多选项编辑)<退出>"), entSel, rbMask) != RTNORM)
break;
SHORT nStateCtrl = GetKeyState(VK_CONTROL);
BOOL bCtrl = (nStateCtrl&256)!=0;
if(entSel.Is(_T("ATS_MTEXT")) || entSel.Is(_T("ATS_TEXT")) || bCtrl){
PickSet ss(SS_FREE);
ss += entSel;
ads_sssetfirst(ss, ss);
acDocManager->sendStringToExecute(curDoc(), _T("dxbj "), true, false, false);
break;
}
TCHAR szText[256];
CString csText;
XPoint ptLow1, ptUp1, ptLow, ptUp;
if(entSel.Is(_T("ATS_WIREDIM"))){
OPENOBJ_BEGIN(entSel, AcDb::kForRead, TWireDim, pEnt);
if(pEnt){
csText = pEnt->GetDimContent();
pEnt->GetExtend(ptLow1, ptUp1);
}
OPENOBJ_END();
}
else if(entSel.Is(_T("ATS_PIPE"))){
entSel.GetData(10, ptLow1);
entSel.GetData(301, szText);
double nDn;
entSel.GetData(140, &nDn);
csText.Format(_T("%s%.0f"), szText, nDn);
ptUp1 = ptLow1;
}
else if(entSel.Is(_T("ATS_ARROW"))){
OPENOBJ_BEGIN(entSel, AcDb::kForRead, TDbSymbArrow, pEnt);
if(pEnt){
csText = pEnt->GetText();
}
OPENOBJ_END();
entSel.GetExtend(ptLow1, ptUp1);
}
else if(entSel.Is(_T("ATS_PIPETEXT"))){
entSel.GetData(301, szText);
entSel.GetExtend(ptLow1, ptUp1);
csText = szText;
}
else if(entSel.Is(_T("ATS_ELEVATION"))){
OPENOBJ_BEGIN(entSel, AcDb::kForRead, TDbSymbElevation, pEnt);
if(pEnt){
csText = pEnt->GetText();
}
OPENOBJ_END();
entSel.GetExtend(ptLow1, ptUp1);
}
else if(entSel.Is(_T("ATS_WIREDIM2"))){
OPENOBJ_BEGIN(entSel, AcDb::kForRead, TMutiWireDim, pEnt);
if(pEnt){
if(pEnt->GetIsPredigest()){
csText = pEnt->GetDimContent();
pEnt->GetExtend(ptLow1, ptUp1);
}
else
continue;
}
OPENOBJ_END();
}
else{
entSel.GetExtend(ptLow1, ptUp1);
entSel.GetData(1, szText);
csText = szText;
}
if(!ptLow1 || !ptUp1)
continue;
ptLow.x = ptLow1.x;
ptLow.y = ptUp1.y;
ptLow.z = 0;
ptUp.x = ptUp1.x;
ptUp.y = ptLow1.y;
ptUp.z = 0;
InitSheetHook(TRUE);
CPoint pt1, pt2;
int cvport=0;
VERIFY(xg_getvar(_T("CVPORT"), &cvport)==RTNORM);
acedCoordFromWorldToPixel(cvport, ptLow, pt1);
acedCoordFromWorldToPixel(cvport, ptUp, pt2);
CAcModuleResourceOverride vTmp;
CEdit *pEdit = new CEdit();
int iMargin = 20;
if(pt2.x - pt1.x < 50)
iMargin = 100;
pEdit->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP |WS_BORDER | ES_AUTOHSCROLL | ES_WANTRETURN,
CRect(pt1.x, pt1.y, pt2.x+iMargin, pt1.y + 20), acedGetAcadDwgView(), IDC_USER_SHEET_EDIT);
pEdit->SetWindowText(csText);
int lenText = csText.GetLength();
pEdit->SetSel(0, lenText);
pEdit->SetFocus();
int nKey, ret;
ads_prompt(_T("\n请在编辑框内输入文字<回车键或鼠标右键完成, ESC键退出>"));
while(1){
ret = ads_getint(_T(""), &nKey);
if(ret == RTNONE && g_nKey != 0) {
if(g_nKey == VK_ESCAPE)
break;
if(g_nKey == VK_RETURN || g_nKey == VK_RBUTTON){
CString csTmp;
pEdit->GetWindowText(csTmp);
if(csText != csTmp){
if(entSel.Is(_T("ATS_WIREDIM"))){
OPENOBJ_BEGIN(entSel, AcDb::kForWrite, TWireDim, pEnt);
if(pEnt){
pEnt->SetDimContent(csTmp);
}
OPENOBJ_END();
}
else if(entSel.Is(_T("ATS_WIREDIM2"))){
OPENOBJ_BEGIN(entSel, AcDb::kForWrite, TMutiWireDim, pEnt);
if(pEnt){
if(pEnt->GetIsPredigest()){
pEnt->SetDimContent(csTmp);
}
else
continue;
}
OPENOBJ_END();
}
else if(entSel.Is(_T("ATS_PIPETEXT"))){
entSel.SetData(301, csTmp);
entSel.Modify();
}
else if(entSel.Is(_T("ATS_PIPE"))){
XString xsText;
int num, numWith;
StringAnalysis((const TCHAR*)csTmp, xsText, &num, &numWith);
entSel.SetData(301, (const TCHAR*)xsText);
entSel.SetData(140, (double)num);
entSel.Modify();
}
else if(entSel.Is(_T("ATS_ARROW"))){
OPENOBJ_BEGIN(entSel, AcDb::kForWrite, TDbSymbArrow, pEnt);
if(pEnt){
pEnt->SetText((const TCHAR*)csTmp);
}
OPENOBJ_END();
}
else if(entSel.Is(_T("ATS_ELEVATION"))){
OPENOBJ_BEGIN(entSel, AcDb::kForWrite, TDbSymbElevation, pEnt);
if(pEnt){
pEnt->SetText((const TCHAR*)csTmp);
}
OPENOBJ_END();
}
else{
entSel.SetData(1, csTmp);
entSel.Modify();
}
}
break;
}
}
else if(ret == RTCAN)
break;
}
InitSheetHook(FALSE);
if(pEdit){
pEdit->DestroyWindow();
delete pEdit;
}
else
AfxMessageBox(_T("edit err!"));
}
if(g_nKey != 0)
AfxMessageBox(_T("Hook err!"));
}
//************************************************************************************
// 文字对齐
//************************************************************************************
void GetTDbSymbElevationExtent(TDbSymbElevation *pElev, XPoint &ptLow, XPoint &ptUp)
{
if (pElev != NULL)
{
std::vector<XPoint> data;
AcDbVoidPtrArray arPtr;
pElev->explode(arPtr);
for (int i = 0; i < arPtr.length(); i++)
{
AcDbEntity *pEnt = (AcDbEntity*)(arPtr[i]);
AcDbLine *pLine = AcDbLine::cast(pEnt);
TDbMText *pMText = TDbMText::cast(pEnt);
if (pLine != NULL)
{
AcDbExtents ext;
pLine->getGeomExtents(ext);
data.push_back(Wcs2Ucs(ext.minPoint()));
data.push_back(Wcs2Ucs(ext.maxPoint()));
delete pLine;
}
else if (pMText != NULL)
{
AcDbVoidPtrArray arPtr2;
pMText->explode(arPtr2);
for(int i = 0; i < arPtr2.length(); i++)
{
AcDbEntity *pEnt = (AcDbEntity*)(arPtr2[i]);
AcDbText *pText = AcDbText::cast(pEnt);
if (pText != NULL)
{
AcDbExtents extents;
pText->getGeomExtents(extents);
data.push_back(Wcs2Ucs(extents.minPoint()));
data.push_back(Wcs2Ucs(extents.maxPoint()));
}
}
ReleaseEntSet(arPtr2);
}
}
double xMin, xMax, yMin, yMax;
std::vector<XPoint>::iterator it;
for (it = data.begin(); it != data.end(); it++)
{
if (it == data.begin())
{
xMin = xMax = (*it).x;
yMin = yMax = (*it).y;
}
else
{
if (xMin > (*it).x)
{
xMin = (*it).x;
}
if (xMax < (*it).x)
{
xMax = (*it).x;
}
if (yMin > (*it).y)
{
yMin = (*it).y;
}
if (yMax < (*it).y)
{
yMax = (*it).y;
}
}
}
ptLow.x = xMin;
ptLow.y = yMin;
ptUp.x = xMax;
ptUp.y = yMax;
ptLow = Ucs2Wcs(ptLow);
ptUp = Ucs2Wcs(ptUp);
}
}
//获得实体外包框
void GetExtent(PickSet &ss, std::map<AcDbObjectId, std::vector<XPoint> > &data)
{
for (long i = 0; i < ss.Length(); i++)
{
OPENOBJ_BEGIN(ss[i], AcDb::kForWrite, AcDbEntity, pEnt);
if (pEnt != NULL)
{
TDbText *pTDbText = NULL;
AcDbText *pText = NULL;
TDbSymbElevation *pElev = NULL;
TDbSymbDrawingIndex *pDraw = NULL;
pTDbText = TDbText::cast(pEnt);
pText = AcDbText::cast(pEnt);
pElev = TDbSymbElevation::cast(pEnt);
pDraw = TDbSymbDrawingIndex::cast(pEnt);
XPoint ptLow, ptUp;
if (pTDbText != NULL) // 上华单行文字
{
double dAngle = pTDbText->GetRotation();
pTDbText->SetRotation(0.0);
pTDbText->GetExtents2d(ptLow, ptUp);
pTDbText->SetRotation(dAngle);
}
else if (pText != NULL) // cad单行文字
{
double dAngle = pText->rotation();
pText->setRotation(0);
AcDbExtents extents;
pText->getGeomExtents(extents);
ptLow = extents.minPoint();
ptUp = extents.maxPoint();
pText->setRotation(dAngle);
}
else if (pElev != NULL) // 标高标注
{
ptLow = pElev->GetLocation();
GetTDbSymbElevationExtent(pElev, ptLow, ptUp);
}
else if (pDraw != NULL)
{
double dRadius = pDraw->GetRadius(FALSE);
ptLow = pDraw->GetCenter();
AcGeVector3d vt = AcGeVector3d::kXAxis;
vt.rotateBy(Ucs2Wcs(0.0), AcGeVector3d::kZAxis);
vt.rotateBy(-PI * 3 / 4, AcGeVector3d::kZAxis);
ptLow += vt * sqrt(2 * dRadius * dRadius);
ptUp = ptLow - vt * 2 * sqrt(2 * dRadius * dRadius);
}
AcGeVector3d vtX = AcGeVector3d::kXAxis;
AcGeVector3d vtY = AcGeVector3d::kYAxis;
std::vector<XPoint> vec;
vec.push_back(ptLow + vtY * (ptUp.y - ptLow.y));
vec.push_back(ptLow);
vec.push_back(ptLow + vtX * (ptUp.x - ptLow.x));
vec.push_back(ptUp);
data.insert(std::make_pair(pEnt->objectId(),vec));
}
OPENOBJ_END();
}
}
// 获得实体集中所有实体外包框左下点距直线距离最小的实体ent
// ssRes中保存实体到直线的投影与ent的投影有交集的实体
void GetNearestEnt(Entity entLine, PickSet &ss, Entity &ent, XPoint &ptRes, PickSet &ssRes)
{
//获得实体外包框
std::map<AcDbObjectId, std::vector<XPoint> > data;
GetExtent(ss, data);
// 获得距离直线最近的实体(以实体外包框左下点为准)
std::map<AcDbObjectId, std::vector<XPoint> >::iterator it;
double dDist = 0.0;
AcDbObjectId id;
for (it = data.begin(); it != data.end(); it++)
{
XPoint pt;
XPoint pt1 = (*it).second[1];
if(entLine.Is(_T("LINE")))
{
OPENOBJ_BEGIN(entLine, AcDb::kForRead, AcDbLine, pLine);
if (pLine != NULL)
{
pLine->getClosestPointTo(pt1, pt, Adesk::kTrue);
}
OPENOBJ_END();
}
else
{
OPENOBJ_BEGIN(entLine, AcDb::kForRead, AcDbPolyline, pLine);
if (pLine != NULL)
{
pLine->getClosestPointTo(pt1, pt, Adesk::kTrue);
}
OPENOBJ_END();
}
double dCurDist = pt.Distance2d(pt1);
ads_name name;
AcDbObjectId id2 = (*it).first;
Acad::ErrorStatus st = acdbGetAdsName(name, (*it).first);
if (it == data.begin())
{
dDist = dCurDist;
ent = name;
id = (*it).first;
ptRes = (*it).second[1];
continue;
}
if (dDist > dCurDist)
{
dDist = dCurDist;
ent = name;
id = (*it).first;
ptRes = (*it).second[1];
}
}
// TDbSymbDrawingIndex 实体无需验证和其他实体的投影关系
if (ent.Is(_T("ATS_DRAWINGINDEX")))
{
ssRes += ent;
return;
}
//获得ent外包框四个点到直线的投影点中最长两点组成的直线
XPoint pt1, pt2, pt3, pt4;
it = data.find(id);
pt1 = (*it).second[0];
pt2 = (*it).second[1];
pt3 = (*it).second[2];
pt4 = (*it).second[3];
if(entLine.Is(_T("LINE")))
{
OPENOBJ_BEGIN(entLine, AcDb::kForRead, AcDbLine, pLine);
if (pLine != NULL)
{
pLine->getClosestPointTo(pt1, pt1, Adesk::kTrue);
pLine->getClosestPointTo(pt2, pt2, Adesk::kTrue);
pLine->getClosestPointTo(pt3, pt3, Adesk::kTrue);
pLine->getClosestPointTo(pt4, pt4, Adesk::kTrue);
}
OPENOBJ_END();
}
else
{
OPENOBJ_BEGIN(entLine, AcDb::kForRead, AcDbPolyline, pLine);
if (pLine != NULL)
{
pLine->getClosestPointTo(pt1, pt1, Adesk::kTrue);
pLine->getClosestPointTo(pt2, pt2, Adesk::kTrue);
pLine->getClosestPointTo(pt3, pt3, Adesk::kTrue);
pLine->getClosestPointTo(pt4, pt4, Adesk::kTrue);
}
OPENOBJ_END();
}
std::map<double, std::vector<XPoint> > ptMap;
std::vector<XPoint> vec;
vec.push_back(pt1);
vec.push_back(pt2);
ptMap.insert(std::make_pair(pt1.Distance2d(pt2), vec));
vec[0] = pt1;
vec[1] = pt3;
ptMap.insert(std::make_pair(pt1.Distance2d(pt3), vec));
vec[0] = pt1;
vec[1] = pt4;
ptMap.insert(std::make_pair(pt1.Distance2d(pt4), vec));
vec[0] = pt2;
vec[1] = pt3;
ptMap.insert(std::make_pair(pt2.Distance2d(pt3), vec));
vec[0] = pt2;
vec[1] = pt4;
ptMap.insert(std::make_pair(pt2.Distance2d(pt4), vec));
vec[0] = pt3;
vec[1] = pt4;
ptMap.insert(std::make_pair(pt3.Distance2d(pt4), vec));
std::map<double, std::vector<XPoint> >::iterator it1;
double dLen = -1;
for (it1 = ptMap.begin(); it1 != ptMap.end(); it1++)
{
if (dLen < (*it1).first)
{
pt1 = (*it1).second[0];
pt2 = (*it1).second[1];
dLen = (*it1).first;
}
}
AcDbLine line2(pt1, pt2); // 距离直线最近的实体外包框四个点的投影点构成的最长直线
// 获得实体到直线的投影中与ent有交集的实体存入ssRes中
// 只要实体外包框上四个点有一点的投影在ent外包框四个点投影范围内
// 就判定有交集
for (it = data.begin(); it != data.end(); it++)
{
if (id == (*it).first)
{
continue;
}
for (int i = 0; i < 4; i++)
{
XPoint pt;
XPoint ptTemp = (*it).second[i];
line2.getClosestPointTo(ptTemp, pt, Adesk::kTrue);
if (fabs(pt.Distance2d(pt1) + pt.Distance2d(pt2) - pt1.Distance2d(pt2)) < 1e-3)
{
ads_name name;
acdbGetAdsName(name, (*it).first);
Entity ent2(name);
ssRes += ent2;
break;
}
}
}
ssRes += ent;
}
void TextAlignment()
{
RBList rbMask = ads_buildlist( -4, _T("<or"),
-4, _T("<and"), RTDXF0, _T("TEXT"), -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("ATS_TEXT"), -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("ATS_ELEVATION"), -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("ATS_DRAWINGINDEX"), -4, _T("and>"),
-4, _T("or>"), NULL);
PickSet ss(SS_FREE);
if (SelectEntities(_T("\n请选择要对齐的文字或者符号<退出>:"), ss, rbMask) != RTNORM)
{
return;
}
RBList rbMask2 = ads_buildlist( -4, _T("<or"),
-4, _T("<and"), RTDXF0, _T("LWPOLYLINE"), -4, _T("and>"),
-4, _T("<and"), RTDXF0, _T("LINE"), -4, _T("and>"),
-4, _T("or>"), NULL);
Entity entSel;
bool bDrawLine = false;
int nRet = 0;
nRet = SelectEntity(_T("\n 请选择对齐基准线<绘制对齐基准线>:"), entSel, rbMask2);
if (nRet != RTNORM)
{
XPushVar<int> vOrthoMode(_T("ORTHOMODE"), 1); //f8
XPoint pt1, pt2;
if (acedGetPoint(NULL, _T("\n请指定起点:"), pt1) != RTNORM)
{
return;
}
if (acedGetPoint(pt1, _T("\n请指定终点:"), pt2) != RTNORM)
{
return;
}
pt1 = Ucs2Wcs(pt1);
pt2 = Ucs2Wcs(pt2);
XLine l(pt1, pt2);
l.Make();
entSel.GetLast();
bDrawLine = true;
}
while(ss.Length() != 0)
{
PickSet ss2(SS_FREE);
XPoint ptRes;
Entity ent;
// 获得距离参考线最近的实体ent 以及与其到参考线投影存在交集的实体ss2
GetNearestEnt(entSel, ss, ent, ptRes, ss2);
ss -= ss2;
XPoint pt;
if(entSel.Is(_T("LINE")))
{
OPENOBJ_BEGIN(entSel, AcDb::kForRead, AcDbLine, pLine);
if (pLine != NULL)
{
pLine->getClosestPointTo(ptRes, pt, Adesk::kTrue);
}
OPENOBJ_END();
}
else
{
OPENOBJ_BEGIN(entSel, AcDb::kForRead, AcDbPolyline, pLine);
if (pLine != NULL)
{
pLine->getClosestPointTo(ptRes, pt, Adesk::kTrue);
}
OPENOBJ_END();
}
AcGeVector3d vt = pt - ptRes;
AcGeMatrix3d mat;
mat.setToTranslation(vt);
for (long i = 0; i < ss2.Length(); i++)
{
OPENOBJ_BEGIN(ss2[i], AcDb::kForWrite, AcDbEntity, pEnt);
if (pEnt != NULL)
{
pEnt->transformBy(mat);
}
OPENOBJ_END();
}
}
if (bDrawLine)
{
entSel.Erase();
}
}
//************************************************************************************
// 插入专业文字
//************************************************************************************
void InsertTextCmd()
{
CInsTextDlg dlg(acedGetAcadFrame());
{
CAcModuleResourceOverride vTemp;
dlg.Create(IDD_INSERT_TEXT, acedGetAcadFrame());
}
dlg.ShowWindow(SW_SHOW);
acedGetAcadDwgView()->SetFocus();
XPoint ptText;
int nOsMode=0;
xg_getvar(_T("OSMODE"), &nOsMode);
nOsMode &= ~0x4000;
nOsMode |= OS_INT|OS_NEA;
XPushVar<int> vOsMode(_T("OSMODE"), nOsMode);
XPoint ptOld;
XExplodeDraw::TextAlignment
AlignList[] = { XExplodeDraw::kTopLeft, XExplodeDraw::kTopCenter ,
XExplodeDraw::kTopRight, XExplodeDraw::kMiddleLeft ,
XExplodeDraw::kMiddleCenter, XExplodeDraw::kMiddleRight ,
XExplodeDraw::kBottomLeft, XExplodeDraw::kBottomCenter ,
XExplodeDraw::kBottomRight,};
while(1){
HWND hwnd = dlg.GetSafeHwnd();
if(!dlg.IsWindowVisible()) {//在替换或选取的时候关闭对话框
break;
}
XPoint ptIns;
xg_getvar(_T("VIEWCTR"), ptIns);
ptIns = Ucs2Wcs(ptIns);
dlg.UpdateData(TRUE);
if(dlg.m_iRunMode == 1){//替换文字
Entity entSel;
int ret = SelectEntity(_T("\n请选择要替换的文字图元<文字插入>"), entSel, RBList(RTDXF0, _T("ATS_TEXT,TEXT"), NULL));
if(ret == RTCAN)
break;
else if(ret != RTNORM){
dlg.m_iRunMode = 0;
continue;
}
entSel.SetData(1, dlg.m_csSel);
entSel.Modify();
}
else if(dlg.m_iRunMode == 2){//拾取文字
Entity entSel;
if(SelectEntity(_T("\n请选择要拾取的文字图元<文字插入>"), entSel, RBList(RTDXF0, _T("ATS_TEXT,TEXT"), NULL)) != RTNORM){
dlg.m_iRunMode = 0;
continue;
}
XText text(entSel);
ptOld = text.m_ptInsert;
dlg.m_csHeight.Format(_T("%.1f"), text.m_nHeight);
CString csStyle = (const TCHAR*)GetSymbolName(text.m_idStyle);
dlg.m_csSel = text.m_csText;
dlg.m_iRunMode = 0;
dlg.SetTextStyle(csStyle);
continue;
}
else{
TTextEdJig jig(&dlg, ptIns);
jig.SetKeyword(_T("`"));
jig.SetPrompt(_T("\n请指定文字的插入点<退出>:"));
int nKeyIdx;
if(!!ptOld)
jig.m_ptRef = ptOld;
int ret = jig.DoIt(&nKeyIdx);
if(ret == RTKWORD){
if(nKeyIdx == 0)
continue;
}
else if(ret != RTNORM){
dlg.DestroyWindow();
return;
}
ptIns = jig.GetPickPoint();
ptOld = ptIns;
double nTextHeight2 = _tstof(dlg.m_csHeight)*DocGetPScale();
XText text(dlg.m_csSel, ptIns, nTextHeight2, g_nScaleDim, dlg.m_csTextStyle, LAY_TEXT);
text.SetRotate(Ucs2Wcs(0.0));//支持UCS
text.TgDraw(AlignList[dlg.m_iAlign]);
}
}
dlg.DestroyWindow();
return;
}
CString CInsTextDlg::m_csSel = _T("");
CString CInsTextDlg::m_csType = _T("");
IMPLEMENT_DYNAMIC(CInsTextDlg, CModelessDialog)
CInsTextDlg::CInsTextDlg(CWnd* pParent /*=NULL*/)
: CModelessDialog(CInsTextDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CInsTextDlg)
// m_csSel = _T("");
m_csContent = _T("");
//m_csType = _T("");
m_iAlign = 6;
m_csHeight = _T("");
m_iStyle = 0;
//}}AFX_DATA_INIT
m_csTextStyle = g_csDimStyle;
m_iRunMode = 0;
}
void CInsTextDlg::DoDataExchange(CDataExchange* pDX)
{
CModelessDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CInsTextDlg)
DDX_Control(pDX, IDC_EDIT_SEL, m_edit);
DDX_Control(pDX, IDC_COMBO_TEXTSTYLE, m_comboStyle);
DDX_Control(pDX, IDC_COMBO_TEXTHEIGHT, m_comboHeight);
DDX_Control(pDX, IDC_LIST_CONTENT, m_listContent);
DDX_Control(pDX, IDC_LIST_TYPE, m_listType);
DDX_Text(pDX, IDC_EDIT_SEL, m_csSel);
DDX_LBString(pDX, IDC_LIST_CONTENT, m_csContent);
DDX_LBString(pDX, IDC_LIST_TYPE, m_csType);
DDX_CBIndex(pDX, IDC_COMBO_ALIGN, m_iAlign);
DDX_CBString(pDX, IDC_COMBO_TEXTHEIGHT, m_csHeight);
DDX_CBIndex(pDX, IDC_COMBO_TEXTSTYLE, m_iStyle);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CInsTextDlg, CModelessDialog)
//{{AFX_MSG_MAP(CInsTextDlg)
//ON_MESSAGE(WM_ACAD_KEEPFOCUS,onAcadKeepFocus)
ON_LBN_SELCHANGE(IDC_LIST_TYPE, OnSelchangeListType)
ON_LBN_SELCHANGE(IDC_LIST_CONTENT, OnSelchangeListContent)
ON_WM_CLOSE()
ON_CBN_SELCHANGE(IDC_COMBO_TEXTSTYLE, OnSelchangeComboTextstyle)
ON_BN_CLICKED(IDC_BUTTON_ADD, OnButtonAdd)
ON_BN_CLICKED(IDC_BUTTON_DEL, OnButtonDel)
ON_BN_CLICKED(IDC_BUTTON_REPLACE, OnButtonReplace)
ON_BN_CLICKED(IDC_BUTTON_PICK, OnButtonPick)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CInsTextDlg message handlers
//LONG CInsTextDlg::onAcadKeepFocus(UINT, LONG)
//{
// return FALSE;
void CInsTextDlg::SetTextStyle(const TCHAR* szStyle)
{
CString csStyle = szStyle;
int len = m_comboStyle.GetCount();
for(int i=0;i<len;i++){
CString csTmp;
m_comboStyle.GetLBText(i, csTmp);
if(csTmp == csStyle){
m_csTextStyle = szStyle;
m_comboStyle.SetCurSel(i);
m_iStyle = i;
UpdateData(FALSE);
return;
}
}
}
BOOL CInsTextDlg::OnInitDialog()
{
CModelessDialog::OnInitDialog();
m_lstAll.Reset();
m_lstType.Reset();
CodeBase db;
int Number;
CString csType, csValue, csRemark;
XString fullFile;
if(!FindFile(_T("DataStore.dbf"), fullFile)) {
MessageBox(_T("对不起,没有发现DataStore.dbf文件!"));
return TRUE;
}
XDbfTable *pTable = db.Open(fullFile);
if(!pTable) {
MessageBox(_T("DataStore.dbf文件出错!"));
return TRUE;
}
pTable->MoveFirst();
while(!pTable->IsEOF()) {
GET_FIELD(pTable, _T("TypeNumber"), Number);
GET_FIELD(pTable, _T("TypeName"), csType);
GET_FIELD(pTable, _T("TypeValue"), csValue);
GET_FIELD(pTable, _T("REMARK"), csRemark);
if(Number == 5){
if(m_lstType.Index(csType)<0)
m_lstType.Append(tstrnew(csType));
}
pTable->MoveNext();
}
int iTypeIdx(0);
XSymbolList lstStyle(_T("STYLE"));
for (int m =0; m < lstStyle.Length(); m++) {
m_comboStyle.AddString(lstStyle[m]);
if(_tcsicmp(g_csDimStyle, lstStyle[m]) == 0){
m_iStyle = m;
UpdateData(FALSE);
}
}
for(int i=0;i<m_lstType.Length();i++){
m_listType.AddString(m_lstType[i]);
if(_tcsicmp(m_csType, m_lstType[i]) == 0)
iTypeIdx = i;
}
m_csHeight.Format(_T("%.1f"), g_nDimHeight);
m_comboHeight.SelectString(0, m_csHeight);
m_listType.SetCurSel(iTypeIdx);
OnSelchangeListType();
// OnSelchangeListContent();
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CInsTextDlg::OnSelchangeListType()
{
UpdateData(TRUE);
m_lstAll.Reset();
m_listContent.ResetContent();
CodeBase db;
int Number;
CString csType, csValue;
XString fullFile;
if(!FindFile(_T("DataStore.dbf"), fullFile)) {
MessageBox(_T("对不起,没有发现DataStore.dbf文件!"));
return;
}
XDbfTable *pTable = db.Open(fullFile);
if(!pTable) {
MessageBox(_T("DataStore.dbf文件出错!"));
return;
}
pTable->MoveFirst();
while(!pTable->IsEOF()) {
GET_FIELD(pTable, _T("TypeNumber"), Number);
GET_FIELD(pTable, _T("TypeName"), csType);
GET_FIELD(pTable, _T("TypeValue"), csValue);
if(Number == 5 && csType==m_csType){
if(m_lstAll.Index(csValue)<0)
m_lstAll.Append(tstrnew(csValue));
}
pTable->MoveNext();
}
for(int i=0;i<m_lstAll.Length();i++){
m_listContent.AddString(m_lstAll[i]);
}
m_listContent.SetCurSel(0);
}
void CInsTextDlg::OnSelchangeListContent()
{
UpdateData(TRUE);
m_csSel = m_csContent;
acedGetAcadDwgView()->SetFocus(); //屏幕菜单点取时, 命令焦点没有在图形窗口
UpdateData(FALSE);
}
void CInsTextDlg::PostNcDestroy()
{
CModelessDialog::PostNcDestroy();
}
void CInsTextDlg::OnClose()
{
CModelessDialog::OnClose();
acedPostCommand(_T("\33\33"));
}
void CInsTextDlg::OnChangeEditSel()
{
UpdateData(TRUE);
UpdateData(FALSE);
}
void CInsTextDlg::OnSelchangeComboTextstyle()
{
UpdateData(TRUE);
m_comboStyle.GetLBText(m_iStyle, m_csTextStyle);
}
void CInsTextDlg::OnButtonReplace()
{
if(m_iRunMode == 2)
return;
m_iRunMode = 1;
acedGetAcadDwgView()->SetFocus();
PostCommand(_T("` "), false);
}
void CInsTextDlg::OnButtonPick()
{
if(m_iRunMode == 1)
return;
m_iRunMode = 2;
acedGetAcadDwgView()->SetFocus();
PostCommand(_T("` "), false);
}
void CInsTextDlg::OnButtonAdd()
{
UpdateData(TRUE);
if(m_lstAll.Index(m_csSel) < 0)
m_lstAll.Append(tstrnew(m_csSel));
else
return; //已经存在
m_listContent.ResetContent();
for (int m =0; m < m_lstAll.Length(); m++)
m_listContent.AddString(m_lstAll[m]);
CodeBase db;
XString fullFile;
if(!FindFile(_T("DataStore.dbf"), fullFile)) {
Callme(_T("对不起,没有发现DataStore.dbf文件!"));
return;
}
XDbfTable *pTable = db.Open(fullFile);
if(pTable) {
pTable->AppendBegin();
SET_FIELD(pTable, _T("TypeNumber"), 5);
SET_FIELD(pTable, _T("TypeName"), (const TCHAR*)m_csType);
SET_FIELD(pTable, _T("TypeValue"), (const TCHAR*)m_csSel);
pTable->AppendEnd();
}
}
void CInsTextDlg::OnButtonDel()
{
UpdateData(TRUE);
int sel = m_listContent.GetCurSel();
if(sel < 0)
return;
CString csSel;
m_listContent.GetText(sel, csSel);
m_lstAll.Remove(sel);
m_listContent.ResetContent();
for (int m =0; m < m_lstAll.Length(); m++)
m_listContent.AddString(m_lstAll[m]);
CodeBase db;
XString fullFile;
if(!FindFile(_T("DataStore.dbf"), fullFile)) {
Callme(_T("对不起,没有发现DataStore.dbf文件!"));
return;
}
XDbfTable *pTable = db.Open(fullFile);
int Number;
CString csType, csValue;
if(pTable) {
pTable->MoveFirst();
while(!pTable->IsEOF()) {
GET_FIELD(pTable, _T("TypeNumber"), Number);
GET_FIELD(pTable, _T("TypeName"), csType);
GET_FIELD(pTable, _T("TypeValue"), csValue);
if(csValue == csSel && Number == 5 && csType == m_csType){
pTable->Delete();
return;
}
pTable->MoveNext();
}
}
}
//*******************************************************************************
// TTextEdJig
//*******************************************************************************
XExplodeDraw::TextAlignment TTextEdJig::m_AlignList[] = { XExplodeDraw::kTopLeft, XExplodeDraw::kTopCenter ,
XExplodeDraw::kTopRight, XExplodeDraw::kMiddleLeft ,
XExplodeDraw::kMiddleCenter, XExplodeDraw::kMiddleRight ,
XExplodeDraw::kBottomLeft, XExplodeDraw::kBottomCenter ,
XExplodeDraw::kBottomRight,};
TTextEdJig::TTextEdJig(BOOL bIsTg, XPoint pt, double nHeight, const TCHAR*szText, AcDbObjectId idStyle, double nRotation)
{
m_pDlg = NULL;
m_pText = NULL;
m_pAcadText = NULL;
m_bIsTgText = bIsTg;
if(m_bIsTgText){
m_pText = new TDbText();
m_pText->SetStyleId(idStyle);
m_pText->SetRotation(nRotation);
m_pText->SetHeight(nHeight);
m_pText->SetText(szText);
m_pText->SetLocation(pt);
}
else{
m_pAcadText = new AcDbText();
m_pAcadText->setRotation(nRotation);
m_pAcadText->setHeight(nHeight);
m_pAcadText->setTextString(szText);
m_pAcadText->setTextStyle(idStyle);
m_pAcadText->setPosition(pt);
m_pAcadText->setAlignmentPoint(pt);
}
}
TTextEdJig::TTextEdJig(CInsTextDlg *dlg, XPoint pt)
{
m_pDlg = dlg;
m_pAcadText = NULL;
dlg->UpdateData(TRUE);
AcDbObjectId idTextStyle = GetTextStyleId(dlg->m_csTextStyle);
m_pText = new TDbText();
m_pText->SetStyleId(idTextStyle);
m_pText->SetHeight(_tstof(dlg->m_csHeight));
m_pText->SetText(dlg->m_csSel);
m_pText->SetLocation(pt);
m_pText->SetAlignment(m_AlignList[dlg->m_iAlign]);
}
TTextEdJig::~TTextEdJig()
{
if(m_pText)
delete m_pText;
if(m_pAcadText)
delete m_pAcadText;
}
AcEdJig::DragStatus
TTextEdJig::GetPoint(XPoint &pt)
{
if(!m_ptRef)
return acquirePoint(pt);
else
return acquirePoint(pt, m_ptRef);
}
int TTextEdJig::DoIt(int *keyIndex)
{
int nRet = TSymbEdJig::DoIt(keyIndex);
return nRet;
}
// 更新实体数据
Adesk::Boolean TTextEdJig::update()
{
Adesk::Boolean bRet=Adesk::kTrue;
XPoint ptRes = m_ptResult;
ptRes.TransformBy(m_mat);
if(m_pDlg){
m_pDlg->UpdateData(TRUE);
AcDbObjectId idTextStyle = GetTextStyleId(m_pDlg->m_csTextStyle);
m_pText->SetStyleId(idTextStyle);
m_pText->SetHeight(_tstof(m_pDlg->m_csHeight));
m_pText->SetText(m_pDlg->m_csSel);
m_pText->SetLocation(ptRes);
m_pText->SetRotation(Ucs2Wcs(0.0));//支持UCS
m_pText->SetAlignment(m_AlignList[m_pDlg->m_iAlign]);
}
else{
if(m_pText)
m_pText->SetLocation(ptRes);
if(m_pAcadText){
m_pAcadText->setPosition(ptRes);
AcGeVector3d vt(m_ptResult-m_ptRef);
m_ptAcadAlign+=vt;
m_pAcadText->setAlignmentPoint(m_ptAcadAlign);
}
}
return bRet;
}
AcDbEntity* TTextEdJig::entity() const
{
if(m_pDlg){
return (AcDbEntity *)m_pText;
}
else{
if(m_bIsTgText)
return (AcDbEntity *)m_pText;
else
return (AcDbEntity *)m_pAcadText;
}
return NULL;
}
void TTextEdJig::SetAlign(AcDb::TextVertMode vertMode, AcDb::TextHorzMode horzMode)
{
if(m_pAcadText){
m_pAcadText->setVerticalMode(vertMode);
m_pAcadText->setHorizontalMode(horzMode);
}
}
void TTextEdJig::SetAlign(XExplodeDraw::TextAlignment Align)
{
if(m_pText)
m_pText->SetAlignment(Align);
}
void TTextEdJig::SetAlignPoint(XPoint ptAlignPoint)
{
m_ptAcadAlign = ptAlignPoint;
if(m_pAcadText)
m_pAcadText->setAlignmentPoint(ptAlignPoint);
}
void TTextEdJig::SetWHScale(double nWHScale)
{
if(m_pAcadText)
m_pAcadText->setWidthFactor(nWHScale);
}