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

322 lines
8.2 KiB
C++

// TBlockEdJig.cpp: implementation of the TBlockEdJig class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "tapi.h"
#include "TBlockEdJig.h"
#include "twtdef.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 ADS > 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_nInsBlkRotate;
m_pBlkRef->setRotation(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 ADS > 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 ADS > 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 ADS > 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_csInsBlkName != m_csBlkName){
m_csBlkName = g_csInsBlkName;
AcDbBlockTable* pBlockTable;
AcDbObjectId recordId;
acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);
#if ADS > 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_nInsBlkRotate;
// cet 2017.9.28 add 图块随图纸比例变化
double dScale = m_nSacle;
double dScaleY = m_nSacleY;
if (m_bUpdatePScale)
{
dScale *= DocGetPScale() / 100;
dScaleY *= 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(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;
}