316 lines
7.6 KiB
C++
316 lines
7.6 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;
|
|
}
|