#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 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(""), -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; iisLocked(); 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 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; icenterPoint(); 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; ixData(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 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 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 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;iIsLayoutRotated()) //{ pTEnt->SetLayoutRotation(nRotation);//设置旋转的角度 //} } else { return; } OPENOBJ_END(); } } else if (rt==RTNONE) { for(long i=0;iSetLayoutRotation(nRotation);//设置旋转的角度 } else { return; } OPENOBJ_END(); } } } break; default: break; } //-----------------------end------------------------------ }