317 lines
8.2 KiB
C++
317 lines
8.2 KiB
C++
#include "stdafx.h"
|
|
#include "globalFunc.h"
|
|
#include "TBlockEdJig.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[]=__FILE__;
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
CBlockPreview::CBlockPreview(const TCHAR* szBlkName, XPoint pt, double nScaleX, double nScaleY, double dRadius)
|
|
{
|
|
m_nSacle = nScaleX;
|
|
m_nSacleY = nScaleY;
|
|
m_dRadius = dRadius;
|
|
m_csBlkName = szBlkName;
|
|
m_ptIns = pt;
|
|
m_pBlkRef = new AcDbBlockReference();
|
|
AcDbBlockTable* pBlockTable;
|
|
AcDbObjectId recordId;
|
|
acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);
|
|
#if ARX > 24
|
|
if(Acad::eOk == pBlockTable->getAt(szBlkName, recordId)){
|
|
#else
|
|
if(Acad::eOk == pBlockTable->getAt(szBlkName, recordId, AcDb::kForRead)){
|
|
#endif
|
|
m_pBlkRef->setBlockTableRecord(recordId);
|
|
m_pBlkRef->setPosition(pt);
|
|
m_pBlkRef->setScaleFactors(AcGeScale3d(m_nSacle, m_nSacleY, 1));
|
|
}
|
|
pBlockTable->close();
|
|
|
|
}
|
|
|
|
CBlockPreview::~CBlockPreview()
|
|
{
|
|
if(m_pBlkRef)
|
|
delete m_pBlkRef;
|
|
}
|
|
|
|
Adesk::Boolean CBlockPreview::subWorldDraw(AcGiWorldDraw *pWd)
|
|
{
|
|
if(m_dRadius > 1)
|
|
{
|
|
AcDbCircle cir(m_ptIns, AcGeVector3d::kZAxis, m_dRadius);
|
|
cir.worldDraw(pWd);
|
|
}
|
|
if(m_pBlkRef)
|
|
{
|
|
m_nRotate = g_Option::instance().g_nInsBlkRotate;
|
|
m_pBlkRef->setRotation(GlobalFunc::Ucs2Wcs(m_nRotate));
|
|
|
|
if(m_bReversal)
|
|
m_pBlkRef->setScaleFactors(AcGeScale3d(-m_nSacle, m_nSacleY, 1));
|
|
else
|
|
m_pBlkRef->setScaleFactors(AcGeScale3d(m_nSacle, m_nSacleY, 1));
|
|
|
|
m_pBlkRef->setPosition(m_ptIns);
|
|
m_pBlkRef->worldDraw(pWd);
|
|
}
|
|
return Adesk::kTrue;
|
|
}
|
|
|
|
|
|
//******************************************************************************
|
|
//******************************************************************************
|
|
TBlockEdJig::TBlockEdJig(const TCHAR* szBlkName, XPoint pt, double nScale, bool bUpdatePScale)
|
|
{
|
|
m_nSacle = nScale;
|
|
m_nSacleY = nScale;
|
|
m_pBlkRef = new AcDbBlockReference();
|
|
m_csBlkName = szBlkName;
|
|
AcDbBlockTable* pBlockTable;
|
|
AcDbObjectId recordId;
|
|
acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);
|
|
#if ARX > 24
|
|
if(Acad::eOk == pBlockTable->getAt(szBlkName, recordId)){
|
|
#else
|
|
if(Acad::eOk == pBlockTable->getAt(szBlkName, recordId, AcDb::kForRead)){
|
|
#endif
|
|
m_pBlkRef->setBlockTableRecord(recordId);
|
|
m_pBlkRef->setPosition(pt);
|
|
m_pBlkRef->setScaleFactors(AcGeScale3d(m_nSacle, m_nSacle, 1));
|
|
}
|
|
pBlockTable->close();
|
|
m_bInsCenPt = FALSE;
|
|
m_bReversal = FALSE;
|
|
m_bJigRotate = FALSE;
|
|
m_iQuadrant = -1;
|
|
m_bUpdatePScale = bUpdatePScale;
|
|
}
|
|
|
|
TBlockEdJig::TBlockEdJig(const TCHAR* szBlkName, XPoint pt, double nScaleX, double nScaleY, bool bUpdatePScale)
|
|
{
|
|
m_nSacle = nScaleX;
|
|
m_nSacleY = nScaleY;
|
|
m_pBlkRef = new AcDbBlockReference();
|
|
m_csBlkName = szBlkName;
|
|
AcDbBlockTable* pBlockTable;
|
|
AcDbObjectId recordId;
|
|
acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);
|
|
#if ARX > 24
|
|
if(Acad::eOk == pBlockTable->getAt(szBlkName, recordId)){
|
|
#else
|
|
if(Acad::eOk == pBlockTable->getAt(szBlkName, recordId, AcDb::kForRead)){
|
|
#endif
|
|
m_pBlkRef->setBlockTableRecord(recordId);
|
|
m_pBlkRef->setPosition(pt);
|
|
m_pBlkRef->setScaleFactors(AcGeScale3d(nScaleX, nScaleY, 1));
|
|
}
|
|
pBlockTable->close();
|
|
m_bInsCenPt = FALSE;
|
|
m_bReversal = FALSE;
|
|
m_bJigRotate = FALSE;
|
|
m_iQuadrant = -1;
|
|
m_bUpdatePScale = bUpdatePScale;
|
|
}
|
|
|
|
TBlockEdJig::TBlockEdJig(const TCHAR* szBlkName, XPoint pt, double nScale, AcGeVector3d vectBase, double dDist, bool bUpdatePScale)
|
|
{
|
|
m_iQuadrant = -1;
|
|
m_nSacle = nScale;
|
|
m_nSacleY = nScale;
|
|
m_dDist = dDist;
|
|
m_pBlkRef = new AcDbBlockReference();
|
|
m_ptIns = pt;
|
|
m_csBlkName = szBlkName;
|
|
AcDbBlockTable* pBlockTable;
|
|
AcDbObjectId recordId;
|
|
acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);
|
|
#if ARX > 24
|
|
if(Acad::eOk == pBlockTable->getAt(szBlkName, recordId)){
|
|
#else
|
|
if(Acad::eOk == pBlockTable->getAt(szBlkName, recordId, AcDb::kForRead)){
|
|
#endif
|
|
m_pBlkRef->setBlockTableRecord(recordId);
|
|
m_pBlkRef->setPosition(pt);
|
|
m_pBlkRef->setScaleFactors(AcGeScale3d(m_nSacle, m_nSacle, 1));
|
|
}
|
|
pBlockTable->close();
|
|
m_bInsCenPt = FALSE;
|
|
m_bReversal = FALSE;
|
|
m_bJigRotate = TRUE;
|
|
m_vectBase = vectBase;
|
|
m_vectBase.normalize();
|
|
m_bUpdatePScale = bUpdatePScale;
|
|
}
|
|
|
|
TBlockEdJig::~TBlockEdJig()
|
|
{
|
|
if(m_pBlkRef)
|
|
delete m_pBlkRef;
|
|
}
|
|
|
|
|
|
|
|
AcEdJig::DragStatus
|
|
TBlockEdJig::GetPoint(XPoint &pt)
|
|
{
|
|
if(!m_ptRef)
|
|
return acquirePoint(pt);
|
|
else
|
|
return acquirePoint(pt, m_ptRef);
|
|
}
|
|
|
|
|
|
void TBlockEdJig::SetUpdatePScale(bool bVal)
|
|
{
|
|
m_bUpdatePScale = bVal;
|
|
}
|
|
|
|
int TBlockEdJig::DoIt(int *keyIndex)
|
|
{
|
|
int nRet = TSymbEdJig::DoIt(keyIndex);
|
|
return nRet;
|
|
}
|
|
|
|
// 更新实体数据
|
|
Adesk::Boolean TBlockEdJig::update()
|
|
{
|
|
Adesk::Boolean bRet=Adesk::kTrue;
|
|
if(g_Option::instance().g_csInsBlkName != m_csBlkName){
|
|
m_csBlkName = g_Option::instance().g_csInsBlkName;
|
|
AcDbBlockTable* pBlockTable;
|
|
AcDbObjectId recordId;
|
|
acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);
|
|
#if ARX > 24
|
|
if(Acad::eOk == pBlockTable->getAt(m_csBlkName, recordId)){
|
|
#else
|
|
if(Acad::eOk == pBlockTable->getAt(m_csBlkName, recordId, AcDb::kForRead)){
|
|
#endif
|
|
m_pBlkRef->setBlockTableRecord(recordId);
|
|
}
|
|
pBlockTable->close();
|
|
}
|
|
m_nRotate = g_Option::instance().g_nInsBlkRotate;
|
|
// cet 2017.9.28 add 图块随图纸比例变化
|
|
double dScale = m_nSacle;
|
|
double dScaleY = m_nSacleY;
|
|
if (m_bUpdatePScale)
|
|
{
|
|
dScale *= GlobalFunc::DocGetPScale() / 100;
|
|
dScaleY *= GlobalFunc::DocGetPScale() / 100;
|
|
}
|
|
if(m_bJigRotate){
|
|
AcGeVector3d vectTmp(m_ptResult.x - m_ptIns.x, m_ptResult.y - m_ptIns.y, 0);
|
|
vectTmp.normalize();
|
|
double dAng = m_vectBase.angleTo(vectTmp, AcGeVector3d::kZAxis);
|
|
AcGeVector3d vtRet = vectTmp.orthoProject(m_vectBase);
|
|
vtRet.normalize();
|
|
AcGePoint3d ptNewLoc = m_ptIns;
|
|
ptNewLoc += vtRet*m_dDist;
|
|
m_pBlkRef->setPosition(ptNewLoc);
|
|
m_ptRetIns = ptNewLoc;
|
|
|
|
if(dAng >= 0 && dAng < PI/2){
|
|
m_iQuadrant = 0;
|
|
m_pBlkRef->setRotation(m_nRotate);
|
|
m_pBlkRef->setScaleFactors(AcGeScale3d(dScale, dScaleY, 1));
|
|
}
|
|
else if(dAng >= PI/2 && dAng < PI){
|
|
m_iQuadrant = 1;
|
|
m_pBlkRef->setRotation(m_nRotate);
|
|
m_pBlkRef->setScaleFactors(AcGeScale3d(-dScale, dScaleY, 1));
|
|
}
|
|
else if(dAng >= PI && dAng < PI/2*3){
|
|
m_iQuadrant = 2;
|
|
m_pBlkRef->setScaleFactors(AcGeScale3d(dScale, dScaleY, 1));
|
|
m_pBlkRef->setRotation(m_nRotate - PI);
|
|
}
|
|
else if(dAng >= PI/2*3 && dAng < PI*2){
|
|
m_iQuadrant = 3;
|
|
m_pBlkRef->setScaleFactors(AcGeScale3d(-dScale, dScaleY, 1));
|
|
m_pBlkRef->setRotation(m_nRotate - PI);
|
|
}
|
|
}
|
|
else{
|
|
if(m_bReversal)
|
|
m_pBlkRef->setScaleFactors(AcGeScale3d(-dScale, dScaleY, 1));
|
|
else
|
|
m_pBlkRef->setScaleFactors(AcGeScale3d(dScale, dScaleY, 1));
|
|
if(m_bInsCenPt){
|
|
m_pBlkRef->setPosition(m_ptResult);
|
|
AcDbExtents extents;
|
|
m_pBlkRef->getGeomExtents(extents);
|
|
AcGePoint3d pMax = extents.maxPoint();
|
|
AcGePoint3d pMin = extents.minPoint();
|
|
XPoint ptCen;
|
|
ptCen[0] = (pMax[0] + pMin[0]) / 2;
|
|
ptCen[1] = (pMax[1] + pMin[1]) / 2;
|
|
ptCen[2] = 0;
|
|
m_mat.setToTranslation(AcGeVector3d(m_ptResult[0] - ptCen[0], m_ptResult[1] - ptCen[1], 0));
|
|
}
|
|
m_pBlkRef->setRotation(GlobalFunc::Ucs2Wcs(m_nRotate));
|
|
m_ptIns = m_ptResult;
|
|
m_ptIns.TransformBy(m_mat);
|
|
m_pBlkRef->setPosition(m_ptIns);
|
|
}
|
|
|
|
return bRet;
|
|
}
|
|
|
|
AcDbEntity* TBlockEdJig::entity() const
|
|
{
|
|
return (AcDbEntity *)m_pBlkRef;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
TBlockExJig::TBlockExJig(const TCHAR* szBlkName, XPoint pt, double nScaleX, double nScaleY, double dRadius)
|
|
{
|
|
m_pBlkRef = new CBlockPreview(szBlkName, pt, nScaleX, nScaleY, dRadius);
|
|
|
|
}
|
|
|
|
TBlockExJig::~TBlockExJig()
|
|
{
|
|
if(m_pBlkRef)
|
|
delete m_pBlkRef;
|
|
}
|
|
|
|
|
|
|
|
AcEdJig::DragStatus TBlockExJig::GetPoint(XPoint &pt)
|
|
{
|
|
if(!m_ptRef)
|
|
return acquirePoint(pt);
|
|
else
|
|
return acquirePoint(pt, m_ptRef);
|
|
}
|
|
|
|
|
|
int TBlockExJig::DoIt(int *keyIndex)
|
|
{
|
|
int nRet = TSymbEdJig::DoIt(keyIndex);
|
|
return nRet;
|
|
}
|
|
|
|
// 更新实体数据
|
|
Adesk::Boolean TBlockExJig::update()
|
|
{
|
|
Adesk::Boolean bRet=Adesk::kTrue;
|
|
m_pBlkRef->m_ptIns = m_ptResult;
|
|
|
|
return bRet;
|
|
}
|
|
|
|
AcDbEntity* TBlockExJig::entity() const
|
|
{
|
|
return (AcDbEntity *)m_pBlkRef;
|
|
} |