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