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

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