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

316 lines
7.7 KiB
C++

#include"stdafx.h"
#include"BlockDrag.h"
#include"dbents.h "
#include"geassign.h "
#include"math.h"
#include "tkcsdlg.h"
extern CTkcsDlg *g_TkcsDlg;
void Showtkcsdlg(BOOL bShow)
{
if(g_TkcsDlg==NULL)
{
g_TkcsDlg=new CTkcsDlg ;
g_TkcsDlg->Create(IDD_TKCSDLG);
}
if(bShow)
g_TkcsDlg->ShowWindow(SW_NORMAL);
else
g_TkcsDlg->ShowWindow(SW_HIDE);
}
#define DELTASCALE 0.2 //设置距离更新的最小差值
#define DELTAANGLE 0.2 //设置角度更新的最小差值
AcEdBlockDrag::AcEdBlockDrag( AcDbObjectId BlockId,double dScale ,double dAngle,AcGeVector3d vt )
{
m_dAngle=dAngle;
m_BlockId=BlockId;
m_dScale=dScale;
bMove=TRUE; //移动
m_bJd=FALSE; //旋转
m_bRotaton=FALSE; //缩放
pBref=NULL; //块引用对象
m_bAppend=FALSE;
m_vt=vt;
m_bBound=FALSE;
}
void AcEdBlockDrag::doIt()
{
if(m_BlockId==NULL)
return;
BOOL bHasAttribute=FALSE;
AcDbObjectId CurveId;
double dDeltaDist=20;
AcDbObjectId BlfId;
AcDbExtents ex;
pBref=new AcDbBlockReference(m_ptBase,m_BlockId);
pBref->getGeomExtents(ex);
/*acutPrintf(_T("\n%0.2f,%0.2f"),ex.maxPoint().x-ex.minPoint().x,
ex.maxPoint().y-ex.minPoint().y);*/
g_TkcsDlg->setUnitLength(ex.maxPoint().x-ex.minPoint().x,
ex.maxPoint().y-ex.minPoint().y,
ex.maxPoint().z-ex.minPoint().z);
// g_TkcsDlg->UpdateDataAll();
struct resbuf to,from;
from.restype=RTSHORT;
from.resval.rint=1;
to.restype=RTSHORT;
to.resval.rint=0;
AcGeVector3d normal(0.0,0.0,1.0);
acedTrans(&(normal.x),&from,&to,Adesk::kTrue,&(normal.x));
pBref->setNormal(normal);
while(1)
{
setDispPrompt(_T("\n指定插入点或 [转90(A)/左右(S)/上下(D)/转角(R)/外框(E)/改基点(T)]:"));
double dScale=m_dScale;
double dAngle=m_dAngle;
AcEdJig::DragStatus stat=drag();
if(stat==AcEdJig::kNormal) //插入
{
m_objId=append();
m_bAppend=TRUE;
AcDbObjectId _id(pBref->objectId());
BaseFuncs::InsertBlockRef1(m_BlockId,_id,m_ptBase,
AcGeScale3d(_ttof(g_TkcsDlg->m_strScaleX),_ttof(g_TkcsDlg->m_strScaleY),_ttof(g_TkcsDlg->m_strScaleZ))
,_ttof(g_TkcsDlg->m_strAngle)*PI/180.0,FALSE);
break;
}
else if(stat==AcEdJig::kKW1)// 旋转
{
// stat=drag();
if(stat==AcEdJig::kCancel)
{
delete pBref;
break;
}
m_bJd=FALSE;
bMove=TRUE;
}
else if(stat==AcEdJig::kKW2)//所放
{
if(stat==AcEdJig::kCancel)
{
delete pBref;
break;
}
}
else if(stat==AcEdJig::kKW3) // 上下
{
continue;
}
else if(stat==AcEdJig::kKW4)
{
m_vt=AcGeVector3d(0,0,0);
if(acedGetPoint(NULL,_T("\n指定第一点:"),asDblArray(m_pt1))!=RTNORM)
{
delete pBref;
return;
}
m_pt2=m_pt1;
bMove=FALSE;
m_bBound=TRUE;
setDispPrompt(_T("\n指定第二点"));
stat=drag();
m_bBound=FALSE;
bMove=TRUE;
if(stat==AcEdJig::kNormal)
{
g_TkcsDlg->m_strScaleX.Format(_T("%0.3f"),fabs(m_pt1.x-m_pt2.x)/g_TkcsDlg->m_dUnitLengthX);
g_TkcsDlg->m_strScaleY.Format(_T("%0.3f"),fabs(m_pt1.y-m_pt2.y)/g_TkcsDlg->m_dUnitLengthY);
g_TkcsDlg->m_strLengthX.Format(_T("%0.3f"),fabs(m_pt1.x-m_pt2.x));
g_TkcsDlg->m_strLengthY.Format(_T("%0.3f"),fabs(m_pt1.y-m_pt2.y));
g_TkcsDlg->UpdateDataAll();
}
}
else if(stat==AcEdJig::kKW5)// 旋转
{
stat=drag();
if(stat==AcEdJig::kCancel)
{
delete pBref;
break;
}
else if(stat==AcEdJig::kOther)
m_dAngle=dAngle;
m_bRotaton=FALSE;
m_bJd=FALSE;
bMove=TRUE;
}
else if(stat==AcEdJig::kKW6) // 基点
{
BaseFuncs::CDistOsMode osmode(16383);
AcDbObjectId objId=append();
m_bAppend=TRUE;
if(acedGetPoint(NULL,_T("\n指定对基点:"),asDblArray(m_ptJd))!=RTNORM)
{
BaseFuncs::DeleteEnt(objId);
return;
}
BaseFuncs::DeleteEnt(objId);
m_vt=m_ptBase-m_ptJd;
return;
}
else
{
acutPrintf(_T("\n取消了快插入操作"));
delete pBref;
break;
}
}
}
AcEdJig::DragStatus AcEdBlockDrag::sampler()
{
double dAngle;
AcGePoint3d ptBase;
CString sFormat;
sFormat.Format(_T("\n指定缩放比例(%0.1f):"),m_dScale);
setKeywordList(_T("A S D E R T")); //设置关键字
DragStatus stat;
setUserInputControls((UserInputControls)(AcEdJig::kAccept3dCoordinates
|AcEdJig::kNoNegativeResponseAccepted
|AcEdJig::kNullResponseAccepted
// |AcEdJig::kNoZeroResponseAccepted
));
if(bMove) //默认移动
{
stat=acquirePoint(ptBase);
switch(stat)
{
case AcEdJig::kNormal:
if(m_ptBase.distanceTo(ptBase+m_vt)<0.2)
return AcEdJig::kNoChange;
m_ptBase=ptBase+m_vt;
break;
case AcEdJig::kKW1://旋转
{
double dAngle=_ttof(g_TkcsDlg->m_strAngle);
dAngle+=90;
if(dAngle>=360.0)dAngle-=360;
g_TkcsDlg->m_strAngle.Format(_T("%0.3f"),dAngle);
g_TkcsDlg->UpdateData(FALSE);
}
break;
case AcEdJig::kKW2:
{
double dAngle=_ttof(g_TkcsDlg->m_strAngle);
if(dAngle>=0&&dAngle<180)
dAngle=180-dAngle;
else
dAngle=540-dAngle;
if(dAngle>=360.0)dAngle-=360;
g_TkcsDlg->m_strAngle.Format(_T("%0.3f"),dAngle);
if(g_TkcsDlg->m_nType==0)
g_TkcsDlg->m_strLengthY.Format(_T("%0.3f"),-_ttof(g_TkcsDlg->m_strLengthY));
else
g_TkcsDlg->m_strScaleY.Format(_T("%0.3f"),-_ttof(g_TkcsDlg->m_strScaleY));
g_TkcsDlg->UpdateData(FALSE);
g_TkcsDlg->UpdateDataAll();
}
break;
case AcEdJig::kKW3:
{
double dAngle=_ttof(g_TkcsDlg->m_strAngle);
if(dAngle>0.0)
dAngle=360-dAngle;
g_TkcsDlg->m_strAngle.Format(_T("%0.3f"),dAngle);
if(g_TkcsDlg->m_nType==0)
g_TkcsDlg->m_strLengthY.Format(_T("%0.3f"),-_ttof(g_TkcsDlg->m_strLengthY));
else
g_TkcsDlg->m_strScaleY.Format(_T("%0.3f"),-_ttof(g_TkcsDlg->m_strScaleY));
g_TkcsDlg->UpdateData(FALSE);
g_TkcsDlg->UpdateDataAll();
}
break;
case AcEdJig::kKW4:
break;
case AcEdJig::kKW5:
setDispPrompt(_T("\n指定旋转角度"));
bMove=FALSE;
m_bRotaton=TRUE;
break;
case AcEdJig::kKW6:
{
setDispPrompt(_T("\n指定基点"));
bMove=FALSE;
m_bJd=TRUE;
}
break;
case AcEdJig::kKW7:
break;
}
}
else if(m_bJd) //缩放
{
stat=acquirePoint(ptBase);
if(stat==AcEdJig::kNormal)
if(m_ptJd==ptBase)
return AcEdJig::kNoChange;
m_ptJd=ptBase;
}
else if(m_bRotaton) // 旋转
{
stat=acquireAngle(dAngle,m_ptBase);
if(stat==AcEdJig::kNormal)
{
if(fabs(dAngle-m_dAngle)<0.01)
return AcEdJig::kNoChange;
m_dAngle=dAngle;
g_TkcsDlg->m_strAngle.Format(_T("%0.3f"),dAngle*180.0/PI);
g_TkcsDlg->UpdateData(FALSE);
}
}
else if(m_bBound)
{
stat=acquirePoint(ptBase,m_pt2);
if(ptBase.distanceTo(m_pt2)<0.2||stat!=AcEdJig::kNormal)
return AcEdJig::kNoChange;
m_pt2=ptBase;
}
return stat;
}
Adesk::Boolean AcEdBlockDrag::update()
{
if(m_bJd)
return Adesk::kTrue;
pBref->setPosition(m_ptBase);
pBref->setRotation(_ttof(g_TkcsDlg->m_strAngle)/180.0*PI);
if(!m_bBound)
{
// acutPrintf(_T("\n%s,%s"),g_TkcsDlg->m_strScaleX,g_TkcsDlg->m_strScaleY);
pBref->setScaleFactors(AcGeScale3d(_ttof(g_TkcsDlg->m_strScaleX),_ttof(g_TkcsDlg->m_strScaleY),_ttof(g_TkcsDlg->m_strScaleZ)));
}
else
{
AcGeMatrix3d mat;
AcDbExtents ex;
AcGePoint3d ptMin;
double dScaleX=1.0;
if(fabs(g_TkcsDlg->m_dUnitLengthX)>0.001)
dScaleX=fabs(m_pt2.x-m_pt1.x)/g_TkcsDlg->m_dUnitLengthX;
double dScaleY=1.0;
if(fabs(g_TkcsDlg->m_dUnitLengthY)>0.001)
dScaleY=fabs(m_pt2.y-m_pt1.y)/g_TkcsDlg->m_dUnitLengthY;
// acutPrintf(_T("\n%0.2f,%0.2f,%0.2f"),dScale
pBref->setScaleFactors(AcGeScale3d(dScaleX,dScaleY,1.0));
pBref->getGeomExtents(ex);
ptMin.x=min(m_pt2.x,m_pt1.x);
ptMin.y=min(m_pt2.y,m_pt1.y);
mat.setToTranslation(ptMin-ex.minPoint());
pBref->transformBy(mat);
}
// pBref->transformBy(mat);
return Adesk::kTrue;
}
AcDbEntity *AcEdBlockDrag::entity() const
{
return pBref;
}