211 lines
4.6 KiB
C++
211 lines
4.6 KiB
C++
#include "stdafx.h"
|
|
#define MTOMM 1000.0 //米转化为毫米
|
|
#define MMTOM 0.001 //毫米转化为米
|
|
|
|
|
|
|
|
double PropToDouble(CString sProp);
|
|
void OptionDrawUnit(BOOL bUserSetUnit,double Scale);
|
|
BOOL ControlEnt(AcDbEntity *pEnt,double Scale);
|
|
void DocStatus();
|
|
void UnionScale()
|
|
{
|
|
int nRet=0;
|
|
XString sKeyword;
|
|
double dScale=0;//得到比例
|
|
CString prompt1;
|
|
CString prompt2;
|
|
TCHAR ss;
|
|
if (_UNIT_SCALE==0.001)
|
|
{
|
|
prompt1=_T("\n请选择转换方式[米变毫米(A)/毫米变米(B)/缩放比例(S)] <米变毫米>:");
|
|
}
|
|
else if (_UNIT_SCALE==1.0)
|
|
{
|
|
prompt1=_T("\n请选择转换方式[米变毫米(A)/毫米变米(B)/缩放比例(S)] <毫米变米>:");
|
|
}
|
|
else
|
|
{
|
|
prompt1=_T("\n请选择转换方式[米变毫米(A)/毫米变米(B)/缩放比例(S)] <退出>:");
|
|
}
|
|
INITGET_BEG(0,_T("A B S"));
|
|
nRet=ads_getkword(prompt1,sKeyword);
|
|
INITGET_END();
|
|
|
|
if (nRet==RTCAN)
|
|
{
|
|
return;
|
|
}
|
|
if (nRet !=RTNORM)
|
|
{
|
|
if (_UNIT_SCALE==1.0)
|
|
{
|
|
ss=_T('B');
|
|
}
|
|
else
|
|
{
|
|
ss=_T('A');
|
|
}
|
|
}
|
|
if (sKeyword[0]!=NULL)
|
|
{
|
|
ss=sKeyword[0];
|
|
}
|
|
|
|
switch(ss)
|
|
{
|
|
case _T('A'):
|
|
{//米变毫米单位
|
|
dScale =MTOMM;//初始化缩放比例 (米转化为毫米)
|
|
adsout << _T("\n提示:空选即为全选!");
|
|
PickSet ss(SS_FREE);
|
|
int r=SelectEntities(_T("\n请选择缩放的对象:"),ss, RBList());
|
|
if (r==RTCAN)
|
|
{
|
|
return;
|
|
}
|
|
else if (r!=RTNORM && r!=RTCAN)
|
|
{
|
|
ss.Get(_T("X"), NULL, NULL, RBList());
|
|
}
|
|
int i=ss.Length();
|
|
for(long j=0;j<i;j++)
|
|
{
|
|
Entity ent=ss[j];
|
|
OPENOBJ_BEGIN(ent, AcDb::kForWrite,AcDbEntity,pEntTemp);
|
|
ControlEnt(pEntTemp,dScale);
|
|
OPENOBJ_END();
|
|
}
|
|
OptionDrawUnit(FALSE,dScale);
|
|
if (r!=RTNORM && r!=RTCAN)
|
|
{
|
|
DocStatus();
|
|
}
|
|
// ywb 090825
|
|
// 执行[单位转换]命令"米变毫米"操作后,
|
|
// 对象的所有参数的显示精度从"0.000"自动变成"0"
|
|
AcDbDatabase* pCurDB = acdbHostApplicationServices()->workingDatabase();
|
|
if (pCurDB != NULL)
|
|
{
|
|
Adesk::Int16 iPrec = pCurDB->luprec();
|
|
iPrec = (iPrec > 2 ? iPrec - 3 : 0);
|
|
pCurDB->setLuprec(iPrec);
|
|
}
|
|
}
|
|
break;
|
|
|
|
case _T('B'):
|
|
{//毫米变米单位
|
|
dScale =MMTOM;//初始化缩放比例 (毫米转化为米)
|
|
adsout << _T("\n提示:空选即为全选!");
|
|
PickSet ss(SS_FREE);
|
|
int r=SelectEntities(_T("\n请选择缩放的对象:"),ss, RBList());
|
|
if (r==RTCAN)
|
|
{
|
|
return;
|
|
}
|
|
else if (r!=RTNORM && r!=RTCAN)
|
|
{
|
|
ss.Get(_T("X"), NULL, NULL, RBList());
|
|
}
|
|
int i=ss.Length();
|
|
for(long j=0;j<i;j++)
|
|
{
|
|
Entity ent=ss[j];
|
|
OPENOBJ_BEGIN(ent, AcDb::kForWrite,AcDbEntity,pEntTemp);
|
|
ControlEnt(pEntTemp,dScale);
|
|
OPENOBJ_END();
|
|
}
|
|
OptionDrawUnit(TRUE,dScale);
|
|
if (r!=RTNORM && r!=RTCAN)
|
|
{
|
|
DocStatus();
|
|
}
|
|
// ywb 090825
|
|
// 执行[单位转换]命令"毫米变米"操作后,
|
|
// 对象的所有参数的显示精度从"0"自动变成"0.000"
|
|
AcDbDatabase* pCurDB = acdbHostApplicationServices()->workingDatabase();
|
|
if (pCurDB != NULL)
|
|
{
|
|
Adesk::Int16 iPrec = pCurDB->luprec();
|
|
iPrec += 3;
|
|
pCurDB->setLuprec(iPrec);
|
|
}
|
|
}
|
|
break;
|
|
case _T('S'):
|
|
{//按比例缩放
|
|
int rt;
|
|
if (dScale==0)
|
|
{
|
|
rt=ads_getreal(_T("\n请输入要缩放的比例<退出>:"),&dScale);
|
|
}
|
|
if (rt!=RTNORM)
|
|
{
|
|
return;
|
|
}
|
|
if (dScale==0)
|
|
{
|
|
return;
|
|
}
|
|
PickSet ss(SS_FREE);
|
|
int r=SelectEntities(_T("\n请选择缩放的对象<退出>:"),ss, RBList());
|
|
if (r==RTCAN)
|
|
{
|
|
return;
|
|
}
|
|
else if (r!=RTNORM && r!=RTCAN)
|
|
{
|
|
ss.Get(_T("X"), NULL, NULL, RBList());
|
|
}
|
|
int i=ss.Length();
|
|
for(long j=0;j<i;j++)
|
|
{
|
|
Entity ent=ss[j];
|
|
OPENOBJ_BEGIN(ent, AcDb::kForWrite,AcDbEntity,pEntTemp);
|
|
ControlEnt(pEntTemp,dScale);
|
|
OPENOBJ_END();
|
|
}
|
|
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
acedCommand(RTSTR,_T("zoom"),RTSTR,_T("e"),RTNONE);
|
|
}
|
|
//以下为实体的控制函数,使其能扩大和缩小比例
|
|
//参数说明:
|
|
//pEnt-指向的实体
|
|
//Scale-要缩放的比例因子
|
|
BOOL ControlEnt(AcDbEntity * pEnt,double Scale)
|
|
{
|
|
if (pEnt==NULL)
|
|
return FALSE;
|
|
AcGeMatrix3d mat;
|
|
mat.setToScaling(Scale);
|
|
TEntityBase *pTEnt=TEntityBase::Cast(pEnt);
|
|
if (pTEnt!=NULL)
|
|
{//上华对象
|
|
pTEnt->UnionScale(Scale);
|
|
pTEnt->SetPScale(pTEnt->GetPScale()*Scale);
|
|
}
|
|
else
|
|
{//AutoCAD对象
|
|
pEnt->transformBy(mat);
|
|
}
|
|
return TRUE;
|
|
|
|
}
|
|
void OptionDrawUnit(BOOL bUserSetUnit,double Scale)
|
|
{//改变当前的绘图单位
|
|
//其中变量bUserSetUnit=FALSE为毫米单位,=TRUE为米单位
|
|
if (bUserSetUnit!=g_bMeterUnitDraw)
|
|
{//发生变化了
|
|
double x=DocGetPScale();
|
|
DocSetMeterUnitDraw(bUserSetUnit);
|
|
DocSetPScale(Scale*DocGetPScale());
|
|
}
|
|
else
|
|
DocSetMeterUnitDraw(bUserSetUnit);
|
|
} |