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

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);
}