1622 lines
43 KiB
C++
1622 lines
43 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);
|
|
}
|