177 lines
4.1 KiB
C++
177 lines
4.1 KiB
C++
#include "stdafx.h"
|
|
#include "droptarget.h"
|
|
#include "acdb.h"
|
|
#include "adslib.h"
|
|
#include "rxregsvc.h"
|
|
#include "dbents.h"
|
|
#include "dbsymtb.h"
|
|
#include "acdocman.h"
|
|
#include"BlockDrag.h"
|
|
#include"geassign.h "
|
|
|
|
CMyOverrideDropTarget::CMyOverrideDropTarget(int nType,AcDbObjectId BlockId,int nColor,CString sPattern,double dScale,BOOL bExplode)
|
|
{
|
|
m_nType=nType;
|
|
m_rad = 0;
|
|
m_BlockId=BlockId;
|
|
m_bDrag=FALSE;
|
|
m_nColor=nColor;
|
|
m_sPattern=sPattern;
|
|
m_dScale=dScale;
|
|
m_nIndex=0;
|
|
m_bExplode=bExplode;
|
|
}
|
|
|
|
CMyOverrideDropTarget::~CMyOverrideDropTarget()
|
|
{
|
|
}
|
|
void DrawBlockFun();
|
|
DROPEFFECT CMyOverrideDropTarget::OnDragEnter(CWnd* pWnd, COleDataObject* pDataObject,DWORD dwKeyState, CPoint point)
|
|
{
|
|
return OnDragOver(pWnd, pDataObject, dwKeyState, point);
|
|
}
|
|
|
|
|
|
DROPEFFECT CMyOverrideDropTarget::OnDragOver(CWnd* pWnd, COleDataObject* pDataObject,DWORD dwKeyState, CPoint point)
|
|
{
|
|
return DROPEFFECT_COPY;
|
|
}
|
|
|
|
|
|
void CMyOverrideDropTarget::OnDragLeave(CWnd* pWnd)
|
|
{
|
|
//acutPrintf(_T("dkdkdk"));
|
|
}
|
|
|
|
DROPEFFECT CMyOverrideDropTarget::OnDropEx(CWnd* pWnd, COleDataObject* pDataObject,DROPEFFECT dropDefault, DROPEFFECT dropList, CPoint point)
|
|
{
|
|
return -1; // calls OnDrop();
|
|
}
|
|
void CMyOverrideDropTarget::ColorHatch(int nColor,ads_point pt)
|
|
{
|
|
CString sText;
|
|
AcDbObjectIdArray ExtIds;
|
|
AcDbObjectIdArray DftIds;
|
|
AcDbObjectId ExtId;
|
|
AcDbObjectId DftId;
|
|
|
|
ads_name first;
|
|
ads_name last;
|
|
acedInitGet(0,_T("D S"));
|
|
AcDbObjectId FirstId;
|
|
AcDbObjectId LastId;
|
|
acdbEntLast(first);
|
|
acdbGetObjectId(FirstId,first);
|
|
|
|
|
|
ExtIds.setLogicalLength(0);
|
|
DftIds.setLogicalLength(0);
|
|
|
|
sText.Format(_T("-boundary %0.2f,%0.2f "),pt[0],pt[1]);
|
|
|
|
BaseFuncs::CAD_SendStringToExecute(sText,TRUE);
|
|
BaseFuncs::ClearAcadCmdLine();
|
|
acdbEntLast(last);
|
|
|
|
acdbGetObjectId(LastId,last);
|
|
if(FirstId!=LastId)
|
|
{
|
|
ExtIds.append(LastId);
|
|
acdbEntNext(first,first);
|
|
acdbGetObjectId(FirstId,first);
|
|
if(FirstId!=LastId)
|
|
{
|
|
DftIds.append(FirstId);
|
|
}
|
|
BaseFuncs::makeHatch3(_T("SOLID"),ExtIds,DftIds,nColor);
|
|
BaseFuncs::DeleteEnt(LastId);
|
|
if(DftIds.logicalLength()>0)
|
|
BaseFuncs::DeleteEnt(FirstId);
|
|
}
|
|
}
|
|
|
|
void CMyOverrideDropTarget::patternHatch(CString sPattern,ads_point pt) //填充
|
|
{
|
|
CString sText;
|
|
AcDbObjectIdArray ExtIds;
|
|
AcDbObjectIdArray DftIds;
|
|
AcDbObjectId ExtId;
|
|
AcDbObjectId DftId;
|
|
ads_name first;
|
|
AcDbObjectId FirstId;
|
|
AcDbObjectId LastId;
|
|
acdbEntLast(first);
|
|
acdbGetObjectId(FirstId,first);
|
|
|
|
double dAngle=0.0;
|
|
double dScale=20;
|
|
CString sNew;
|
|
acedInitGet(0,_T("S"));
|
|
//绘边界(D)/
|
|
|
|
ExtIds.setLogicalLength(0);
|
|
DftIds.setLogicalLength(0);
|
|
sText=_T("-bhatch p ") +sPattern;
|
|
|
|
sNew.Format(_T(" %0.2f %0.2f %0.2f,%0.2f "),dScale,dAngle,pt[0],pt[1]);
|
|
sText=sText+sNew;
|
|
BaseFuncs::CAD_SendStringToExecute(sText,TRUE);
|
|
BaseFuncs::ClearAcadCmdLine();
|
|
}
|
|
|
|
|
|
BOOL CMyOverrideDropTarget::OnDrop(CWnd* pWnd, COleDataObject* pDataObject,DROPEFFECT dropEffect, CPoint point)
|
|
{
|
|
if(acDocManagerPtr()->documentCount()<1)
|
|
return TRUE ;
|
|
//modify by hrp
|
|
if(m_bDrag)
|
|
return TRUE;
|
|
m_bDrag=TRUE;
|
|
BOOL fRet=TRUE;
|
|
OnDragLeave(pWnd);
|
|
|
|
CRect rSize;
|
|
acedDwgPoint dwgPt;
|
|
int windnum = acedGetWinNum(point.x, point.y);
|
|
if (windnum == 0)
|
|
return FALSE;
|
|
AcDbObjectId BlfId;
|
|
acedCoordFromPixelToWorld(windnum, point, dwgPt);
|
|
AcDbDatabase *pDb = AcApGetDatabase((CView*)pWnd);
|
|
acDocManager->lockDocument(acDocManager->document(pDb));
|
|
acedGetAcadDwgView()->SetFocus(); //设置CAD焦点
|
|
switch(m_nType)
|
|
{
|
|
case 0:
|
|
BaseFuncs::InsertBlockRef1(m_BlockId,BlfId,asPnt3d(dwgPt),AcGeScale3d(m_dScale,m_dScale,m_dScale),0,TRUE);
|
|
if(m_bExplode)
|
|
{
|
|
AcDbVoidPtrArray voidPtrArr;
|
|
AcDbBlockReference *pBlf=NULL;
|
|
if(acdbOpenObject(pBlf,BlfId,AcDb::kForWrite)==Acad::eOk)
|
|
{
|
|
pBlf->explode(voidPtrArr);
|
|
pBlf->erase();
|
|
pBlf->close();
|
|
pBlf=NULL;
|
|
AcDbObjectId EntId;
|
|
for(int nLen=0;nLen<voidPtrArr.logicalLength();nLen++)
|
|
BaseFuncs::AddEntToDb((AcDbEntity*)voidPtrArr[nLen],EntId);
|
|
}
|
|
}
|
|
break;
|
|
case 1:
|
|
ColorHatch(m_nColor,dwgPt);
|
|
break;
|
|
case 2:
|
|
patternHatch(m_sPattern,dwgPt);
|
|
break;
|
|
}
|
|
|
|
acedGetAcadFrame()->SetActiveWindow();
|
|
acDocManager->unlockDocument(acDocManager->document(pDb));
|
|
return TRUE;
|
|
}
|
|
|
|
|