Files
envi-code/SourceCode/Code2026/tg_shs/shs_kerncmd/Layout.cpp
T
2026-09-28 15:28:50 +08:00

532 lines
16 KiB
C++

#include "stdafx.h"
//#include "acestext.h"
//#include "ViewportResize.h"
// TARCH_IMPEXP void DocStatus();
// GEOAPI int XGetCorner(const XPoint &ptCorn1, const TCHAR *pszMsg, XPoint &ptCorn2);
BOOL LockViewport(Entity ent, BOOL bTrue)
{
BOOL bRet=FALSE;
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbViewport, pViewport);
if (pViewport) {
if (bTrue)
pViewport->setLocked();
else
pViewport->setUnlocked();
bRet=TRUE;
}
OPENOBJ_END();
return bRet;
}
// 调整比例:
// 1. 文字 (TEXT)
// 2. 属性标签(ATTDEF)
// 3. 属性 (ATTRIB)
// 4. 图块
// 5. 上华对象
static int AdjustScale(PickSet &ss, ads_real oldScale, ads_real newScale)
{
ads_real scl=newScale/oldScale;
long ssLen=ss.Length();
RBList mask(RTDXF0, _T("TCH_*"), NULL);
for(long ssIndex=0; ssIndex<ssLen; ssIndex++) {
Entity ent=ss[ssIndex];
int nSpace=0;
if (ent.GetData(67, &nSpace)==RTNORM && nSpace==1) // Paper Space entity
continue;
TCHAR blkName[80]=_T("");
if (!(ssIndex%200)) adsout << _T(".");
if (ent.Is(_T("TEXT")) || ent.Is(_T("ATTDEF"))) { //文字
ads_real oldHeight;
ent.GetData(40, &oldHeight);
ent.SetData(40, oldHeight*scl);
ent.Modify();
} else if ((ent.Is(_T("INSERT")) || ent.Is(_T("TCH_BLOCK_INSERT"))) && ent.GetData(2, blkName)==RTNORM) {
TCHAR szLayer[80]=_T("");
ent.GetData(8, szLayer);
if (_tcsicmp(szLayer, LAY_DIM)==0) {
//轴号或房间标注或符号标注1
XPoint ptInsert;
ent.GetData(10, &ptInsert);
XPushVar<int> vOsMode(_T("OSMODE"), 0);
// Zyu modify on 100721,支持64位
//ads_command(RTSTR, _T(".SCALE"), RTENAME, (long *)ent, RTSTR, _T(""),
// RT3DPOINT, &ptInsert, RTREAL, scl, RTNONE);
ads_command(RTSTR, _T(".SCALE"), RTENAME, (TLong_ptr *)ent, RTSTR, _T(""),
RT3DPOINT, &ptInsert, RTREAL, scl, RTNONE);
} else {
//门窗图块或符号标注2
int bAttrib=0;
ent.GetData(66, &bAttrib);
if (bAttrib) {
Entity entAttrib, entTemp=ent;
while(entAttrib.GetNext(entTemp)==RTNORM && entAttrib.Is(_T("ATTRIB"))) {
ads_real nHeight;
entAttrib.GetData(40, &nHeight);
entAttrib.SetData(40, nHeight*scl);
entAttrib.Modify();
entTemp=entAttrib;
entAttrib.FreeGroups();
}
ent.Update();
}
}
} else if (ent.Is(_T("DIMENSION"))) {
//..等待处理
} else if (ent.MatchBase(mask)) {
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbEntity, pEnt);
if (pEnt) {
if (pEnt->isKindOf(TDbDimension2::desc())) {
TDbDimension2 *pDim=TDbDimension2::cast(pEnt);
if (pDim->IsAngular()) {
double nDimDist=pDim->GetDist2DimLine(FALSE);
pDim->SetPScale(newScale);
pDim->SetDist2DimLine(nDimDist, FALSE);
} else {
pDim->SetPScale(newScale);
}
} else if (pEnt->isKindOf(TDbOpening::desc())) {
TDbOpening *pWin=TDbOpening::cast(pEnt);
ASSERT(pWin);
XPoint ptCur=pWin->GetLabelPos();
XPoint ptDef=pWin->GetDefaultLabPos();
if (ptCur==ptDef) {
pWin->SetPScale(newScale);
pWin->SetLabelPos(pWin->GetDefaultLabPos());
} else {
pWin->SetPScale(newScale);
}
} else if (pEnt->isKindOf(TDbCornerWin::desc())) {
TDbCornerWin *pWin=TDbCornerWin::cast(pEnt);
ASSERT(pWin);
if (pWin->GetLabelPos()==pWin->GetDefaultLabPos()) {
pWin->SetPScale(newScale);
pWin->SetLabelPos(pWin->GetDefaultLabPos());
} else {
pWin->SetPScale(newScale);
}
} else if (pEnt->isKindOf(TDbEntity::desc()))
((TDbEntity *)pEnt)->SetPScale(newScale);
else if (pEnt->isKindOf(TDbCurveEntity::desc()))
((TDbCurveEntity *)pEnt)->SetPScale(newScale);
} else {
adsout << _T("\n不能以写的方式打开对象!");
}
OPENOBJ_END();
}
}
return RTNORM;
}
///////////////////////////////////////////////////////
// Command: 调整模型比例
// 由于没有调整字型的默认字的高度, 因此取消本命令
void ChModelScale(double nNewScale, double nOldScale)
{
RBList mask=ads_buildlist(-4, _T("<or"),
RTDXF0, _T("TCH_*,TEXT,DIMENSION"),
-4, _T("<and"),
RTDXF0, _T("INSERT"),
66, 1,
-4, _T("and>"),
-4, _T("or>"),
NULL);
PickSet ssAll(SS_FREE);
if (SelectEntities(_T("\n请选择要改变比例的图元:"), ssAll, mask)!=RTNORM)
return;
if (nOldScale<0.0) {
nOldScale=CFG_PScale;
BOOL bFindScale=FALSE;
long nCount=ssAll.Length();
for(long i=0L; i<nCount; i++) {
Entity ent=ssAll[i];
if (ent.MatchBase(RBList(RTDXF0, _T("TCH_*"),NULL)) && !ent.Is(_T("TCH_BLOCK_INSERT"))) {
double nScl=1.0;
VERIFY(ent.GetData(47, &nScl)==RTNORM);
if (!bFindScale) {
nOldScale=nScl;
bFindScale=TRUE;
break;
}
}
}
if (GetReal(_T("\n请提供原有的出图比例"), nOldScale, RSG_NONEG|RSG_NONEG)==RTCAN)
return;
}
DocSetPScale(nOldScale);
PickSet ssDim(SS_FREE);
ssDim += ssAll;
ssDim.BaseFilter(RBList(RTDXF0, _T("DIMENSION"), NULL));
long lCount=ssDim.Length();
for(long i=0L; i<lCount; i++) {
Entity entDim=ssDim[i];
Entity entNew;
if (ConvertDim(entDim, entNew)) {
ssAll -= entDim;
ssAll += entNew;
}
}
if (DocSetPScale(nNewScale))
xg_setvar(_T("HPSCALE"), nNewScale);
DocStatus();
AdjustScale(ssAll, nOldScale, nNewScale);
}
// Command: 改变比例
void ChScale()
{
int nVport=0, nTileMode=0;
xg_getvar(_T("CVPORT"), &nVport);
xg_getvar(_T("TILEMODE"), &nTileMode);
if (nVport==1) { //图纸空间
Entity ent;
RBList mask(RTDXF0, _T("VIEWPORT"), NULL);
if (SelectEntity(_T("\n选择要改变比例的视口:"), ent, mask)==RTNORM) {
XPoint pt;
ent.GetData(10, &pt);
double nOldScale=pt.z;
int nVpNum=1;
VERIFY(ent.GetData(69, &nVpNum)==RTNORM);
if (nOldScale<1.0E-3) {
MSpace();
xg_setvar(_T("CVPORT"), nVpNum);
double vpHeight, viewSize;
VERIFY(xg_getvar(_T("VIEWSIZE"), &viewSize)==RTNORM);
VERIFY(ent.GetData(41, &vpHeight)==RTNORM);
nOldScale=viewSize/vpHeight;
PSpace();
}
double nNewScale=nOldScale;
if (GetReal(_T("\n请输入新的出图比例"), nNewScale, RSG_NONEG|RSG_NOZERO)==RTCAN)
return;
bool bLock=true;
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbViewport, pViewport);
if (pViewport) {
bLock=pViewport->isLocked();
pViewport->setUnlocked();
pt.z=nNewScale;
VERIFY(pViewport->setCenterPoint(pt)==Acad::eOk);
//ASSERT(fabs(pViewport->elevation()-nNewScale)<1.0E-3);
double nScale=nNewScale/nOldScale;
pViewport->setHeight(pViewport->height()/nScale);
pViewport->setWidth(pViewport->width()/nScale);
}
OPENOBJ_END();
MSpace();
xg_setvar(_T("CVPORT"), nVpNum);
XString sScaleXP(_T("%gXP"), 1.0/nNewScale);
ads_command(RTSTR, _T(".ZOOM"), RTSTR, (const TCHAR *)sScaleXP, RTNONE);
ChModelScale(nNewScale, nOldScale);
ads_command(RTSTR, _T(".ZOOM"), RTSTR, (const TCHAR *)sScaleXP, RTNONE);
PSpace();
LockViewport(ent, TRUE);
}
} else {
if (nTileMode==0) {
adsout << _T("\n在布局状态下,要在图纸空间执行命令!");
return;
}
double nNewScale=CFG_PScale;
if (GetReal(_T("\n请输入新的出图比例1:"), nNewScale, RSG_NOZERO|RSG_NONEG)==RTCAN)
return;
if (nTileMode==0) {
XString sScaleXP(_T("%gXP"), 1.0/nNewScale);
ads_command(RTSTR, _T(".ZOOM"), RTSTR, (const TCHAR *)sScaleXP, RTNONE);
}
ChModelScale(nNewScale, -1.0);
}
}
// 定义布图视口
void MakeLayoutViewport()
{
extern TARCH_IMPEXP int DragMovePickSet(PickSet &ss, const TCHAR *pszPrompt, const XPoint &ptBase, XPoint &ptFinal);
int tilemode=0;
VERIFY(xg_getvar(_T("TILEMODE"), &tilemode)==RTNORM);
if (tilemode==0)
xg_setvar(_T("TILEMODE"), 1);
XPoint ptWcs1, ptWcs2;
if (ads_getpoint(NULL, _T("\n输入待布置的图形的第一个角点<退出>:"), ptWcs1)!=RTNORM)
return;
if (XGetCorner(ptWcs1, _T("\n输入另一个角点<退出>:"), ptWcs2)!=RTNORM)
return;
// 确定模型比例
double nScale=DocGetPScale();
PickSet ssTemp(SS_FREE);
if (ssTemp.Get(_T("C"), ptWcs1, ptWcs2, RBList(RTDXF0, _T("TCH_*"), NULL))==RTNORM) {
ssTemp.BaseExclude(RBList(RTDXF0, _T("TCH_BLOCK_INSERT"), NULL));
if (ssTemp.Length()>0) {
Entity entTemp=ssTemp[0L];
entTemp.GetData(47, &nScale);
}
}
ptWcs1=Ucs2Wcs(ptWcs1);
ptWcs2=Ucs2Wcs(ptWcs2);
XPoint ptCen=ptWcs1+ptWcs2;
ptCen /= 2.0;
XRectAngle box(ptWcs1, ptWcs2);
if (box.Width()<_DIST_SNAP || box.Height()<_DIST_SNAP)
return;
if (GetReal(_T("\n图形的输出比例1:"), nScale, RSG_NONEG|RSG_NOZERO)==RTCAN)
return;
//进入图纸空间
xg_setvar(_T("TILEMODE"), 0);
int cvport=1;
xg_getvar(_T("CVPORT"), &cvport);
if (cvport!=1)
PSpace();
XPoint qt1, qt2;
qt2.x = box.Width()/nScale;
qt2.y = box.Height()/nScale;
//qt1.z = qt2.z = nScale;
InitLayer(LAY_VIEWPORT, TRUE);
XPushVar<int> vTemp(_T("OSMODE"), 0);
XPushVarStr clayer(_T("CLAYER"), LAY_VIEWPORT);
ads_command(RTSTR, _T(".ZOOM"), RTSTR, _T("A"), RTNONE);
ads_command(RTSTR, _T(".MVIEW"), RTPOINT, &qt1, RTPOINT, &qt2, RTNONE);
Entity entLast;
entLast.GetLast();
//entLast.SetData(8, LAY_VIEWPORT);
//entLast.Modify();
MSpace();
//xg_setvar(_T("cmdecho"), 1);
ptCen=Wcs2Ucs(ptCen);
ads_command(RTSTR, _T(".ZOOM"), RTSTR, _T("C"), RT3DPOINT, &ptCen, RTREAL, box.Height(), RTNONE);
//ads_command(RTSTR, _T(".ZOOM"), RTSTR, (const TCHAR *)XString(_T("%gXP"), 1.0/nScale), NULL);
PSpace();
/*
PickSet ss1(SS_FREE);
ss1 += entLast;
DragMovePickSet(ss1, _T("\n视口位置:"), qt1, XPoint());
*/
qt1.z = -nScale;
// Zyu modify on 100721,支持64位
//ads_command(RTSTR, _T(".MOVE"), RTENAME, (long *)entLast, RTSTR, _T(""),
// RT3DPOINT, &qt1, RTSTR, _T("\\"), RTNONE);
ads_command(RTSTR, _T(".MOVE"), RTENAME, (TLong_ptr *)entLast, RTSTR, _T(""),
RT3DPOINT, &qt1, RTSTR, _T("\\"), RTNONE);
OPENOBJ_BEGIN(entLast, AcDb::kForWrite, AcDbViewport, pView);
if (pView) {
pView->setLocked();
}
OPENOBJ_END();
}
void SaveLayoutConfig()
{
int nTileMode=0;
VERIFY(xg_getvar(_T("TILEMODE"), &nTileMode)==RTNORM);
if (nTileMode) {
adsout << _T("\n请在图纸空间使用本命令!");
return;
}
int cvport=1;
VERIFY(xg_getvar(_T("CVPORT"), &cvport)==RTNORM);
if (cvport!=1)
PSpace();
RBList mask(RTDXF0, _T("VIEWPORT"), NULL);
PickSet ss(SS_FREE);
if (ss.Get(_T("X"), NULL, NULL, mask)==RTNORM) {
long lCount=ss.Length();
for(long i=0L; i<lCount; i++) {
Entity ent=ss[i];
XPoint ptCen, ptViewCen;
OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbViewport, pViewport);
if (pViewport) {
ptCen=pViewport->centerPoint();
ptViewCen=pViewport->viewCenter();
double nScale=pViewport->customScale(); //ZOOM XP
double nHeight=pViewport->height();
double nWidth=pViewport->width();
if (!XSymbolTable(_T("APPID"), TCHXD))
ads_regapp(TCHXD);
if (pViewport->upgradeOpen()==Acad::eOk) {
resbuf *rb=ads_buildlist(1001, TCHXD, 1010, &ptCen, 1010, &ptViewCen, 1010, &XPoint(nScale, nHeight, nWidth), NULL);
pViewport->setXData(rb);
ads_relrb(rb);
pViewport->downgradeOpen();
}
}
OPENOBJ_END();
}
}
}
void RestoreLayoutConfig()
{
int nTileMode=0;
VERIFY(xg_getvar(_T("TILEMODE"), &nTileMode)==RTNORM);
if (nTileMode) {
adsout << _T("\n请在图纸空间使用本命令!");
return;
}
int cvport=1;
VERIFY(xg_getvar(_T("CVPORT"), &cvport)==RTNORM);
if (cvport!=1)
PSpace();
RBList mask(RTDXF0, _T("VIEWPORT"), NULL);
PickSet ss(SS_FREE);
if (ss.Get(_T("X"), NULL, NULL, mask)==RTNORM) {
long lCount=ss.Length();
for(long i=0L; i<lCount; i++) {
Entity ent=ss[i];
XPoint ptCen, ptViewCen;
OPENOBJ_BEGIN(ent, AcDb::kForWrite, AcDbViewport, pViewport);
if (pViewport) {
resbuf *rb=pViewport->xData(TCHXD);
RBList rbBuf=rb;
if (rb) rb=rb->rbnext;
if (rb && rb->rbnext && rb->rbnext->rbnext &&
rb->restype==1010 && rb->rbnext->restype==1010 && rb->rbnext->rbnext->restype==1010) {
XPoint ptCen=rb->resval.rpoint;
rb=rb->rbnext;
XPoint ptViewCen=rb->resval.rpoint;
rb=rb->rbnext;
XPoint vtPara=rb->resval.rpoint;
pViewport->setCenterPoint(ptCen);
pViewport->setViewCenter(ptViewCen);
pViewport->setHeight(vtPara.y);
pViewport->setWidth(vtPara.z);
pViewport->setCustomScale(vtPara.x);
}
}
OPENOBJ_END();
}
}
}
void LayoutRotate()
{
extern TARCH_IMPEXP BOOL g_bLayoutRotate;
XPushMemVar<BOOL> vTemp(g_bLayoutRotate, TRUE);
PickSet ss(SS_FREE);
if (SelectEntities(_T("\n选择对象:"), ss, RBList())!=RTNORM)
return;
// [12/19/2007 nsh]
//----------------------begin-----------------------------
/*XPoint ptBase;
double nRotation=0.0;
if (ads_getpoint(NULL, _T("\n旋转基点<退出>:"), ptBase)==RTNORM &&
ads_getangle(ptBase, _T("\n布局转角<0.0>:"), &nRotation)==RTNORM) {
XPushVar<int> osmode(_T("OSMODE"), 0);
ptBase=Ucs2Wcs(ptBase);
ads_command(RTSTR, _T(".ROTATE"), RTPICKS, (long *)ss, RTSTR, _T(""),
RT3DPOINT, &ptBase, RTREAL, nRotation*180/PI, NULL);
}*/
int nRet=0;
XString sKeyword;//关键字
INITGET_BEG(0,_T("A B"));
nRet=ads_getkword(_T("请选择布局旋转方式[基于基点(B)/旋转角度(A)]<基于基点>:"),sKeyword);
INITGET_END();
if (nRet!=RTNORM&&nRet!=RTNONE)
{
return;
}
TCHAR ch=sKeyword[0];
if (nRet == RTNONE)
{
ch = _T('B');
}
switch(ch)
{
case _T('B'):
{//基于基点
XPoint ptBase;
double nRotation=0.0;
if (ads_getpoint(NULL, _T("\n旋转基点<退出>:"), ptBase)==RTNORM &&
ads_getangle(ptBase, _T("\n布局转角<0.0>:"), &nRotation)==RTNORM) {
XPushVar<int> osmode(_T("OSMODE"), 0);
ptBase=Ucs2Wcs(ptBase);
// Zyu modify on 100721,支持64位
//ads_command(RTSTR, _T(".ROTATE"), RTPICKS, (long *)ss, RTSTR, _T(""),
// RT3DPOINT, &ptBase, RTREAL, nRotation*180/PI, RTNONE);
ads_command(RTSTR, _T(".ROTATE"), RTPICKS, (TLong_ptr *)ss, RTSTR, _T(""),
RT3DPOINT, &ptBase, RTREAL, nRotation*180/PI, RTNONE);
}
}
break;
case _T('A'):
{//对对象基于角度旋转
double nRotation=0.0;
int rt=ads_getangle(NULL,_T("\n设置旋转角度<0.0>:"),&nRotation);
if (rt==RTNORM)
{
for(long i=0;i<ss.Length();i++)
{
Entity ent=ss[i];
OPENOBJ_BEGIN(ent, AcDb::kForWrite,AcDbEntity,pEntTemp);
TEntityBase *pTEnt=TEntityBase::Cast(pEntTemp);
if (pTEnt!=NULL)
{
//if (pTEnt->IsLayoutRotated())
//{
pTEnt->SetLayoutRotation(nRotation);//设置旋转的角度
//}
}
else
{
return;
}
OPENOBJ_END();
}
}
else if (rt==RTNONE)
{
for(long i=0;i<ss.Length();i++)
{
Entity ent=ss[i];
OPENOBJ_BEGIN(ent, AcDb::kForWrite,AcDbEntity,pEntTemp);
TEntityBase *pTEnt=TEntityBase::Cast(pEntTemp);
if (pTEnt!=NULL)
{
pTEnt->SetLayoutRotation(nRotation);//设置旋转的角度
}
else
{
return;
}
OPENOBJ_END();
}
}
}
break;
default:
break;
}
//-----------------------end------------------------------
}