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

1539 lines
32 KiB
C++

#include "stdafx.h"
#include "AecDbX3dPart.h"
#include "AcDbX3dSolid.h"
#include "CoreTools.h"
#include "KTSetting.h"
#include "geometry2json.h"
extern CString IDCreate();
extern double PixelToWcs(int nPixel);
Adesk::UInt32 AecDbX3dPart::kCurrentVersionNumber = 1;
static const Adesk::UInt16 kColorByBlock = 0;
static const Adesk::UInt16 kRed = 1;
static const Adesk::UInt16 kYellow = 2;
static const Adesk::UInt16 kGreen = 3;
static const Adesk::UInt16 kCyan = 4;
static const Adesk::UInt16 kBlue = 5;
static const Adesk::UInt16 kMagenta = 6;
static const Adesk::UInt16 kWhite = 7;
static const Adesk::UInt16 kColorByLayer = 256;
static void FreeBuffer(int n,AcDbVoidPtrArray& arEntPtrs)
{
AcDbEntity* pEnt = NULL;
while(arEntPtrs.length() > n )
{
pEnt = (AcDbEntity*)arEntPtrs.last();
if (pEnt != NULL)
{
pEnt->erase();
pEnt->close();
arEntPtrs.removeLast();
DELETE_PTR(pEnt);
}
}
}
AecDbX3dPart::AecDbX3dPart(void)
{
m_vtMove.set(0,0,0);
memset(m_dAxisRotats,0,sizeof(double) * MAX_AXISROTATS);
for (int i = 0;i < MAX_AXISROTATS;i++)
{
m_arVtAxis.append(AcGeVector3d::kIdentity);
}
m_nBoolOper = 0;
m_pSolidDraw = NULL;
m_pSolid = NULL;
m_sName = _T("");
m_sGUID = IDCreate();
m_bActive = false;
m_nPeelOff = -1;
m_ptActiveInf.x = -1;
m_ptActiveInf.y = -1;
}
AecDbX3dPart::AecDbX3dPart(const AecDbX3dPart& pPart)
{
m_pSolidDraw = NULL;
m_pSolid = NULL;
m_sName = pPart.m_sName;
m_sGUID = pPart.m_sGUID;
m_nBoolOper = pPart.m_nBoolOper; //
AcDbX3dSolid* pXSolid = NULL;
AcDbX3dSolid* pXSolidNew = NULL;
for (int i = 0;i < pPart.m_arX3DSolidPtrsUnite.length();i++)
{
pXSolid = (AcDbX3dSolid*)pPart.m_arX3DSolidPtrsUnite.at(i);
pXSolidNew = new AcDbX3dSolid(*pXSolid);
pXSolidNew->ReCreate();
m_arX3DSolidPtrsUnite.append(pXSolidNew);
}
for (int i = 0;i < pPart.m_arX3DSolidPtrsSubtr.length();i++)
{
pXSolid = (AcDbX3dSolid*)pPart.m_arX3DSolidPtrsSubtr.at(i);
pXSolidNew = new AcDbX3dSolid(*pXSolid);
pXSolidNew->ReCreate();
m_arX3DSolidPtrsSubtr.append(pXSolidNew);
}
for (int i = 0;i < pPart.m_arX3DSolidPtrsSubtrForHouse.length();i++)
{
pXSolid = (AcDbX3dSolid*)pPart.m_arX3DSolidPtrsSubtrForHouse.at(i);
pXSolidNew = new AcDbX3dSolid(*pXSolid);
pXSolidNew->ReCreate();
m_arX3DSolidPtrsSubtrForHouse.append(pXSolidNew);
}
//先旋转,后移动
m_vtMove = pPart.m_vtMove; //总移动
m_ptOrg = pPart.m_ptOrg; //原点
m_arVtAxis.append(pPart.m_arVtAxis); //轴向
memcpy(m_dAxisRotats,pPart.m_dAxisRotats,MAX_AXISROTATS * sizeof(double));
m_mapXData.CopyFrom(&pPart.m_mapXData);
//显示,临时
m_ptActiveInf = pPart.m_ptActiveInf;
m_bActive = pPart.m_bActive;
m_nPeelOff = pPart.m_nPeelOff;
}
AecDbX3dPart::~AecDbX3dPart(void)
{
AcDbX3dSolid* pXSolid = NULL;
for (int i = 0;i < m_arX3DSolidPtrsUnite.length();i++)
{
pXSolid = (AcDbX3dSolid*)m_arX3DSolidPtrsUnite.at(i);
DELETE_PTR(pXSolid);
}
for (int i = 0;i < m_arX3DSolidPtrsSubtr.length();i++)
{
pXSolid = (AcDbX3dSolid*)m_arX3DSolidPtrsSubtr.at(i);
DELETE_PTR(pXSolid);
}
if (m_pSolid != NULL)
DELETE_PTR(m_pSolid);
if (m_pSolidDraw != NULL)
DELETE_PTR(m_pSolidDraw);
}
void AecDbX3dPart::SetName(LPCTSTR pszName)
{
m_sName = pszName;
}
void AecDbX3dPart::GetName(CString& sName) const
{
sName = m_sName;
}
LPCTSTR AecDbX3dPart::GetGUID() const
{
return (LPCTSTR)m_sGUID;
}
void AecDbX3dPart::ReCreateGUID()
{
m_sGUID = IDCreate();
}
void AecDbX3dPart::AddX3dSolid(AcDbX3dSolid* pXSolid,AcDb::BoolOperType bType /*AcDb::kBoolUnite*/,bool bForHouseSub /*= false*/)
{
if (bType == AcDb::kBoolUnite)
{
m_arX3DSolidPtrsUnite.append(pXSolid);
}
else
{
if (bForHouseSub)
{
m_arX3DSolidPtrsSubtrForHouse.append(pXSolid);
}
else
{
m_arX3DSolidPtrsSubtr.append(pXSolid);
}
}
}
void AecDbX3dPart::SetOrgPoint(const AcGePoint3d& ptOrg)
{
m_ptOrg = ptOrg;
}
AcGePoint3d AecDbX3dPart::GetOrgPoint(bool bByTransform/* = false*/) const
{
if (bByTransform)
{
//然后整体变换
//先旋转
//再移动
AcGePoint3d ptOrg = m_ptOrg;
//if (m_arVtAxis.length() <= MAX_AXISROTATS)
{
//先旋转
AcGeMatrix3d xRote;
for (int i = 0;i < m_arVtAxis.length();i++)
{
if (fabs(m_dAxisRotats[i]) > 1.e-10)
{
xRote.setToRotation(m_dAxisRotats[i],m_arVtAxis.at(i),ptOrg);
ptOrg.transformBy(xRote);
}
}
}
ptOrg += m_vtMove;
return ptOrg;
}
return m_ptOrg;
}
int AecDbX3dPart::GetActiveInf() const
{
CPoint ptPos,ptRW;
if ( GetActiveInf(ptPos))
{
GetInterfaceCount(ptRW);
int nPos = ptPos.x * ptRW.y + ptPos.y;
return nPos;
}
return -1;
}
void AecDbX3dPart::SetActiveInf(int nIndex)
{
CString sName;
GetName(sName);
if (sName.CompareNoCase(_T("剖切")) == 0)
{
int nDir = 0;
GetSpecialtyData()->GetAt(_T("Dir"),nDir);
if (nDir == 0)
nDir = 1;
else if (nDir == 1)
nDir = 0;
GetSpecialtyData()->SetAt(_T("Dir"),nDir);
return;
}
CPoint ptRW,ptPos;
if ( GetInterfaceCount(ptRW) )
{
ptPos.x = nIndex / ptRW.y;
ptPos.y = nIndex - ptPos.x * ptRW.y;
m_ptActiveInf = ptPos;
}
}
bool AecDbX3dPart::GetInterface(int nIndex,AecInterface& inf) const
{
CPoint ptRW,ptPos;
if ( GetInterfaceCount(ptRW) )
{
ptPos.x = nIndex / ptRW.y;
ptPos.y = nIndex - ptPos.x * ptRW.y;
return GetInterface(ptPos.x,ptPos.y,inf);
}
return false;
}
bool AecDbX3dPart::GetInterface(int nRow,int nCol,AecInterface& inf) const
{
CString sName;
GetName(sName);
if (sName.CompareNoCase(_T("开洞")) != 0)
{
return false;
}
//来自CFUKKDlg 和 CFUKKDlg::GetX3dPart 函数
double dlg_m_dL;
double dlg_m_dW;
double dlg_m_dX;
double dlg_m_dY;
double dlg_m_dZ;
int dlg_m_nShape;
int dlg_m_nDir;
double dlg_m_dT;
int dlg_m_nH;
int dlg_m_nV;
double dlg_m_dHSpace;
double dlg_m_dVSpace;
BOOL dlg_m_bAddHoleCase;
GetSpecialtyData()->GetAt(_T("m_dL"),dlg_m_dL);
GetSpecialtyData()->GetAt(_T("m_dW"),dlg_m_dW);
GetSpecialtyData()->GetAt(_T("m_dT"),dlg_m_dT);
GetSpecialtyData()->GetAt(_T("m_dX"),dlg_m_dX);
GetSpecialtyData()->GetAt(_T("m_dY"),dlg_m_dY);
GetSpecialtyData()->GetAt(_T("m_dZ"),dlg_m_dZ);
GetSpecialtyData()->GetAt(_T("m_nDir"),dlg_m_nDir);
GetSpecialtyData()->GetAt(_T("m_nH"),dlg_m_nH);
GetSpecialtyData()->GetAt(_T("m_nV"),dlg_m_nV);
GetSpecialtyData()->GetAt(_T("m_dHSpace"),dlg_m_dHSpace);
GetSpecialtyData()->GetAt(_T("m_dVSpace"),dlg_m_dVSpace);
GetSpecialtyData()->GetAt(_T("m_bAddHoleCase"),dlg_m_bAddHoleCase);
GetSpecialtyData()->GetAt(_T("m_nShape"),dlg_m_nShape);
AcGePoint3d ptOrg,ptNewOrg;
ptOrg.set(dlg_m_dX,dlg_m_dY,dlg_m_dZ);
//ptOrg = GetOrgPoint();
AcGeVector3d vtZ = AcGeVector3d::kZAxis;
AcGeVector3d vtStep = AcGeVector3d::kZAxis;
if (dlg_m_nDir > 0)//板开
{
vtStep = AcGeVector3d::kYAxis;
}
AcDbX3dSolid* pXSolid = NULL;
for (int i = 0;i < dlg_m_nH;i++)
{
ptNewOrg = ptOrg + i * AcGeVector3d::kXAxis * dlg_m_dHSpace;
for (int j = 0;j < dlg_m_nV;j++)
{
if (dlg_m_nShape == 0)//方
{
//L,W,t,H 长宽,厚度
if (dlg_m_nDir == 0)//墙开
{
vtZ = AcGeVector3d::kYAxis;
}
//套管
//if (dlg_m_bAddHoleCase)
{
if ( nCol == i && nRow == j)
{
inf.dSize1 = dlg_m_dL;
inf.dSize2 = dlg_m_dW;
inf.ptPos = ptNewOrg - vtZ * 0.5 * dlg_m_dT;
inf.vtDir = vtZ;
Transformby(inf.ptPos);
Transformby(inf.vtDir);
return true;
}
}
}
else//园
{
if (dlg_m_nDir == 0)//墙开
{
vtZ = AcGeVector3d::kYAxis;
}
//rxtxH
//if (dlg_m_bAddHoleCase)
{
if ( nCol == i && nRow == j)
{
inf.dSize1 = dlg_m_dL;
inf.dSize2 = dlg_m_dL;
inf.ptPos = ptNewOrg - vtZ * 0.5 * dlg_m_dT;
inf.vtDir = vtZ;
Transformby(inf.ptPos);
Transformby(inf.vtDir);
return true;
}
}
}
ptNewOrg += vtStep * dlg_m_dVSpace;
}
}
return false;
}
bool AecDbX3dPart::GetInterfaceCount(CPoint& ptRC) const
{
CString sName;
GetName(sName);
if (sName.CompareNoCase(_T("开洞")) != 0)
{
return false;
}
int dlg_m_nH;
int dlg_m_nV;
GetSpecialtyData()->GetAt(_T("m_nH"),dlg_m_nH);
GetSpecialtyData()->GetAt(_T("m_nV"),dlg_m_nV);
ptRC.x = dlg_m_nV;
ptRC.y = dlg_m_nH;
return true;
}
bool AecDbX3dPart::GetSlicePlan(AcGePlane& plan) const
{
CString sName;
GetName(sName);
if (sName.CompareNoCase(_T("剖切")) == 0)
{
int nPlan = 0;
GetSpecialtyData()->GetAt(_T("m_nPlan"),nPlan);
int nDir = 0;
GetSpecialtyData()->GetAt(_T("Dir"),nDir);
AcGePoint3d ptOrg = GetOrgPoint();
Transformby(ptOrg);
switch(nPlan)
{
case 0://xz
{
if (nDir == 0)
plan.set(ptOrg,AcGeVector3d::kYAxis);
else
plan.set(ptOrg,-AcGeVector3d::kYAxis);
break;
}
case 1://yz
{
if (nDir == 0)
plan.set(ptOrg,AcGeVector3d::kXAxis);
else
plan.set(ptOrg,-AcGeVector3d::kXAxis);
break;
}
case 2://xy
{
if (nDir == 0)
plan.set(ptOrg,AcGeVector3d::kZAxis);
else
plan.set(ptOrg,-AcGeVector3d::kZAxis);
break;
}
default:
break;
}
return true;
}
return false;
}
bool AecDbX3dPart::SetActiveInf(const CPoint& ptRC)
{
CString sName;
GetName(sName);
if (sName.CompareNoCase(_T("开洞")) != 0)
{
return false;
}
if (ptRC.x >= -1 && ptRC.y >= -1)
{
m_ptActiveInf = ptRC;
}
return false;
}
bool AecDbX3dPart::GetActiveInf(CPoint& ptRC) const
{
CString sName;
GetName(sName);
if (sName.CompareNoCase(_T("开洞")) != 0)
{
return false;
}
ptRC = m_ptActiveInf;
return true;
}
void AecDbX3dPart::RemoveAll3dSolidRec()
{
AcDbX3dSolid* pXSolid = NULL;
for (int i = 0;i < m_arX3DSolidPtrsUnite.length();i++)
{
pXSolid = (AcDbX3dSolid*)m_arX3DSolidPtrsUnite.at(i);
DELETE_PTR(pXSolid);
}
m_arX3DSolidPtrsUnite.removeAll();
for (int i = 0;i < m_arX3DSolidPtrsSubtr.length();i++)
{
pXSolid = (AcDbX3dSolid*)m_arX3DSolidPtrsSubtr.at(i);
DELETE_PTR(pXSolid);
}
m_arX3DSolidPtrsSubtr.removeAll();
for (int i = 0;i < m_arX3DSolidPtrsSubtrForHouse.length();i++)
{
pXSolid = (AcDbX3dSolid*)m_arX3DSolidPtrsSubtrForHouse.at(i);
DELETE_PTR(pXSolid);
}
m_arX3DSolidPtrsSubtrForHouse.removeAll();
//recreate
if (m_pSolid != NULL)
DELETE_PTR(m_pSolid);
if (m_pSolidDraw != NULL)
DELETE_PTR(m_pSolidDraw);
//保持用户的位置
//ResetMove();
//ResetRotate(-1);
}
void AecDbX3dPart::RemoveAt(int nIndex,AcDb::BoolOperType bType/* = AcDb::kBoolUnite*/,bool bForHouseSub/* = false*/)
{
AcDbX3dSolid* pXSolid = NULL;
if (bForHouseSub)
{
if (nIndex > -1 && nIndex < m_arX3DSolidPtrsSubtrForHouse.length())
{
pXSolid = (AcDbX3dSolid*)m_arX3DSolidPtrsSubtrForHouse.at(nIndex);
m_arX3DSolidPtrsSubtrForHouse.removeAt(nIndex);
delete pXSolid;
}
return;
}
if (bType == AcDb::kBoolUnite)
{
if (nIndex > -1 && nIndex < m_arX3DSolidPtrsUnite.length())
{
pXSolid = (AcDbX3dSolid*)m_arX3DSolidPtrsUnite.at(nIndex);
m_arX3DSolidPtrsUnite.removeAt(nIndex);
delete pXSolid;
}
}
else
{
if (nIndex > -1 && nIndex < m_arX3DSolidPtrsSubtr.length())
{
pXSolid = (AcDbX3dSolid*)m_arX3DSolidPtrsSubtr.at(nIndex);
m_arX3DSolidPtrsSubtr.removeAt(nIndex);
delete pXSolid;
}
}
//recreate
if (m_pSolid != NULL)
DELETE_PTR(m_pSolid);
if (m_pSolidDraw != NULL)
DELETE_PTR(m_pSolidDraw);
}
int AecDbX3dPart::GetX3dSolidCount(AcDb::BoolOperType bType/* = AcDb::kBoolUnite*/,bool bForHouseSub/* = false*/) const
{
if (bForHouseSub)
{
return m_arX3DSolidPtrsSubtrForHouse.length();
}
else
{
if (bType == AcDb::kBoolUnite)
{
return m_arX3DSolidPtrsUnite.length();
}
else
{
return m_arX3DSolidPtrsSubtr.length();
}
}
return 0;
}
AcDbX3dSolid* AecDbX3dPart::GetX3dSolid(int nIndex,AcDb::BoolOperType bType/* = AcDb::kBoolUnite*/) const
{
AcDbX3dSolid* pX3dSolid = NULL;
if (bType == AcDb::kBoolUnite)
{
if (nIndex > -1 && nIndex < m_arX3DSolidPtrsUnite.length())
{
pX3dSolid = (AcDbX3dSolid* )m_arX3DSolidPtrsUnite.at(nIndex);
}
}
else
{
pX3dSolid = (AcDbX3dSolid* )m_arX3DSolidPtrsSubtr.at(nIndex);
}
return pX3dSolid;
}
bool AecDbX3dPart::SetAxis(int nIndex,const AcGeVector3d& vtAxis)
{
if (nIndex >= 0 && nIndex < MAX_AXISROTATS)
{
m_arVtAxis.setAt(nIndex,vtAxis);
return true;
}
return false;
}
bool AecDbX3dPart::GetAxis(int nIndex,AcGeVector3d& vtAxis) const
{
if (nIndex >= 0 && nIndex < m_arVtAxis.length())
{
vtAxis = m_arVtAxis.at(nIndex);
return true;
}
return false;
}
void AecDbX3dPart::SetHideShow( )
{
bool bHide = IsHide();
SetHide(!bHide);
}
void AecDbX3dPart::SetHide(bool bHide)
{
m_mapXData.SetAt(_T("Hide"),bHide ? 1 : 0);
}
bool AecDbX3dPart::IsHide() const
{
int nVal = 0;
if ( m_mapXData.GetAt(_T("Hide"),nVal) )
{
return nVal > 0 ? true : false;
}
return false;
}
void AecDbX3dPart::PeelOffTheSkin(int nPos)
{
m_nPeelOff = nPos;
if (m_pSolidDraw != NULL)
DELETE_PTR(m_pSolidDraw);
if (m_pSolid != NULL)
DELETE_PTR(m_pSolid);
}
bool AecDbX3dPart::IsPeelOffTheSkin() const
{
return m_nPeelOff > -1 ? true : false;
}
void AecDbX3dPart::SetActive(bool bActive)
{
m_bActive = bActive;
}
void AecDbX3dPart::AddMove(const AcGeVector3d& vtMove)
{
m_vtMove += vtMove;
if (m_pSolidDraw != NULL)
DELETE_PTR(m_pSolidDraw);
if (m_pSolid != NULL)
DELETE_PTR(m_pSolid);
}
void AecDbX3dPart::AddMove(const AcGeMatrix3d& xMirror)
{
m_vtMove += xMirror.translation();
if (m_pSolidDraw != NULL)
DELETE_PTR(m_pSolidDraw);
if (m_pSolid != NULL)
DELETE_PTR(m_pSolid);
}
AcGeVector3d AecDbX3dPart::GetMove() const
{
return m_vtMove;
}
void AecDbX3dPart::ResetMove()
{
m_vtMove = AcGeVector3d::kIdentity;
if (m_pSolidDraw != NULL)
DELETE_PTR(m_pSolidDraw);
if (m_pSolid != NULL)
DELETE_PTR(m_pSolid);
}
void AecDbX3dPart::AddRotate(int nAxisIndex,double dRot)
{
if (nAxisIndex >= 0 && nAxisIndex <= MAX_AXISROTATS )
{
m_dAxisRotats[nAxisIndex] += dRot;
if (m_pSolidDraw != NULL)
DELETE_PTR(m_pSolidDraw);
if (m_pSolid != NULL)
DELETE_PTR(m_pSolid);
}
}
double AecDbX3dPart::GetRotate(int nAxisIndex) const
{
if (nAxisIndex >= 0 && nAxisIndex <= MAX_AXISROTATS )
{
return m_dAxisRotats[nAxisIndex];
}
return 0.0;
}
void AecDbX3dPart::ResetRotate(int nAxisIndex)
{
if (nAxisIndex >= 0 && nAxisIndex < MAX_AXISROTATS)
{
m_dAxisRotats[nAxisIndex] = 0.0;
if (m_pSolidDraw != NULL)
DELETE_PTR(m_pSolidDraw);
if (m_pSolid != NULL)
DELETE_PTR(m_pSolid);
}
if (nAxisIndex == -1)
{
memset(m_dAxisRotats,0,sizeof(double) * MAX_AXISROTATS);
if (m_pSolidDraw != NULL)
DELETE_PTR(m_pSolidDraw);
if (m_pSolid != NULL)
DELETE_PTR(m_pSolid);
}
}
void AecDbX3dPart::Transformby(AcGePoint3d& pt) const
{
pt += m_vtMove;
AcGePoint3d ptOrg = m_ptOrg;
ptOrg += m_vtMove;
if (m_arVtAxis.length() <= MAX_AXISROTATS)
{
//先旋转
AcGeMatrix3d xRote;
for (int i = 0;i < m_arVtAxis.length();i++)
{
if (fabs(m_dAxisRotats[i]) > 1.e-10)
{
xRote.setToRotation(m_dAxisRotats[i],m_arVtAxis.at(i),ptOrg);
pt.transformBy(xRote);
}
}
}
}
void AecDbX3dPart::Transformby(AcGeVector3d& vt) const
{
AcGeMatrix3d xform;
AcGeVector3d vtAxis;
for (int i = 0;i < m_arVtAxis.length();i++)
{
vtAxis = m_arVtAxis.at(i);
if ( !vtAxis.isZeroLength() && fabs(m_dAxisRotats[i]) > 1.e-10)
{
xform.setToIdentity();
xform.setToRotation(m_dAxisRotats[i],vtAxis,m_ptOrg);
vt.transformBy(xform);
}
}
}
void AecDbX3dPart::SetBoolOperFor(int nOper)
{
m_nBoolOper = nOper;
}
int AecDbX3dPart::GetBoolOperFor() const
{
return m_nBoolOper;
}
AecDbObjXDataMap* AecDbX3dPart::GetSpecialtyData()
{
return &m_mapXData;
}
const AecDbObjXDataMap* AecDbX3dPart::GetSpecialtyData() const
{
return &m_mapXData;
}
bool AecDbX3dPart::Create()
{
if (m_pSolid != NULL)
DELETE_PTR(m_pSolid);
int nVt;
if (GetSpecialtyData()->HasKey(_T("DTYG_TYPE"), nVt))
{ // 说明是单体异构
BOOL bHide(FALSE);
if (GetSpecialtyData()->GetAt(_T("Hide"), bHide))
{
if (bHide) return true;
}
}
Acad::ErrorStatus es;
AcDbX3dSolid* pXSolid = NULL;
//先unite
for (int i = 0;i < m_arX3DSolidPtrsUnite.length();i++)
{
pXSolid = (AcDbX3dSolid*)m_arX3DSolidPtrsUnite.at(i);
AcDb3dSolid* pSolid = pXSolid->GetDraw3dSolid();
if (pSolid == NULL)
continue;
if (m_pSolid == NULL)
{
m_pSolid = pSolid;
}
else
{
if ( Acad::eOk == (es = m_pSolid->booleanOper(AcDb::kBoolUnite,pSolid) ) )
{
}
else
{
DELETE_PTR(pSolid);
}
}
}
if (m_pSolid == NULL)
return false;
//然后 subtract
for (int i = 0;i < m_arX3DSolidPtrsSubtr.length();i++)
{
pXSolid = (AcDbX3dSolid*)m_arX3DSolidPtrsSubtr.at(i);
AcDb3dSolid* pSolid = pXSolid->GetDraw3dSolid();
if (pSolid != NULL)
{
if ( Acad::eOk == (es = m_pSolid->booleanOper(AcDb::kBoolSubtract,pSolid) ) )
{
}
else
{
DELETE_PTR(pSolid);
}
}
}
//然后整体变换
//先旋转
//再移动
AcGePoint3d ptOrg = m_ptOrg;
//if (m_arVtAxis.length() <= MAX_AXISROTATS)
{
//先旋转
AcGeMatrix3d xRote;
for (int i = 0;i < m_arVtAxis.length();i++)
{
if (fabs(m_dAxisRotats[i]) > 1.e-10)
{
xRote.setToIdentity();
xRote.setToRotation(m_dAxisRotats[i],m_arVtAxis.at(i),ptOrg);
m_pSolid->transformBy(xRote);
}
}
}
ptOrg += m_vtMove;
AcGeMatrix3d xMove;
xMove.setToTranslation(m_vtMove);
m_pSolid->transformBy(xMove);
if (m_bActive)
{
m_pSolid->setColorIndex(ColorIndex::kMagenta);
}
else
{
int nVt;
if (GetSpecialtyData()->HasKey(_T("DTYG_TYPE"), nVt))
{ // 说明是单体异构
CString s;
if (GetSpecialtyData()->GetAt(_T("user1"), s))
{
std::vector<CString> vec;
CoreTools::SplitString(s, _T(':'), vec);
if (vec.size() == 2)
{
int clr = TypeConvert::s2i(vec[1]);
m_pSolid->setColorIndex(clr);
}
}
}
}
m_mapXData.Write(m_pSolid,_T("BIMDATA"));
return true;
}
int AecDbX3dPart::GetForHouseSubtract(AcDbVoidPtrArray& arSolidPtrs) const
{
AcDbX3dSolid* pXSolid = NULL;
AcGePoint3d ptOrg = m_ptOrg;
ptOrg += m_vtMove;
AcGeMatrix3d xMove;
xMove.setToTranslation(m_vtMove);
for (int i = 0;i < m_arX3DSolidPtrsSubtrForHouse.length();i++)
{
pXSolid = (AcDbX3dSolid*)m_arX3DSolidPtrsSubtrForHouse.at(i);
AcDb3dSolid* pSolid = pXSolid->GetDraw3dSolid();
if (pSolid != NULL)
{
if (m_arVtAxis.length() <= MAX_AXISROTATS)
{
//先旋转
AcGeMatrix3d xRote;
for (int i = 0;i < m_arVtAxis.length();i++)
{
if (fabs(m_dAxisRotats[i]) > 1.e-10)
{
xRote.setToRotation(m_dAxisRotats[i],m_arVtAxis.at(i),m_ptOrg);
pSolid->transformBy(xRote);
}
}
}
pSolid->transformBy(xMove);
arSolidPtrs.append(pSolid);
}
}
return arSolidPtrs.length();
}
AcDb3dSolid* AecDbX3dPart::CreateDraw3dSolid() const
{
AcDb3dSolid* pDraw = NULL;
if (m_pSolid != NULL)
{
int nVt;
pDraw = (AcDb3dSolid*)m_pSolid->clone();
AcDbObjectId ltid(KTSetting::InitLineStyle(_T("CENTER")));
if (GetSpecialtyData()->HasKey(_T("DTYG_TYPE"), nVt))
{
AecDbObjXDataMap map;
map.SetAt(_T("IS_DTYG"), _T("1"));
map.Write(pDraw, _T("DTYG"));
if (GetBoolOperFor() == AcDb::kBoolSubtract && ltid.isValid())
pDraw->setLinetype(ltid);
}
}
return pDraw;
}
Acad::ErrorStatus AecDbX3dPart::Draw2d(AcGiDraw &dc) const
{
//投影
if (m_pSolidDraw != NULL)
{
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbX3dPart::Draw3d(AcGiDraw &dc) const
{
if (m_pSolidDraw == NULL)
{
m_pSolidDraw = CreateDraw3dSolid();
}
if (m_pSolidDraw != NULL)
{
if (m_bActive )
m_pSolidDraw->setColorIndex(kMagenta);
if (!IsHide())
{
AcGiCommonDraw *pCommDraw = dc.GetCommonDraw();
if (pCommDraw != NULL)
{
AcCmTransparency tr = pCommDraw->subEntityTraits().transparency();
m_pSolidDraw->setTransparency(tr);
}
dc.DrawEntity(*m_pSolidDraw);
}
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbX3dPart::DrawAxis(AcGiDraw &dc) const
{
Draw3d(dc);
AcGePoint3d ptOrg = m_ptOrg;
ptOrg += m_vtMove;
AcGeVector3d vtDir;
for (int i = 0;i < m_arVtAxis.length();i++)
{
vtDir = m_arVtAxis.at(i);
if (vtDir.isZeroLength())
continue;
vtDir.normalize();
Adesk::Int16 nCr = dc.GetColor();
if (i == 0)
dc.SetColor(1);//red
else if (i == 1)
dc.SetColor(3);//gree
else if (i == 2)
dc.SetColor(5);//blue
else
dc.SetColor(i+1);
vtDir.normalize();
vtDir *= PixelToWcs(20);
//clinder
AcGePoint3d ptGeFr = ptOrg;
AcGePoint3d ptGeTo = ptGeFr + vtDir;
AcDbEntity* p3d = dc.DrawCone(ptGeFr,PixelToWcs(1),ptGeTo,PixelToWcs(1));
if (p3d != NULL)
{
}
//arrow
ptGeFr = ptGeTo;
vtDir.normalize();
ptGeTo += vtDir * PixelToWcs(15);
p3d = dc.DrawCone(ptGeFr,PixelToWcs(5),ptGeTo,1.e-3);
if (p3d != NULL)
{
}
dc.SetColor(nCr);
}
DrawInf(dc);
return Acad::eOk;
}
Acad::ErrorStatus AecDbX3dPart::DrawInf(AcGiDraw &dc) const
{
if (m_ptActiveInf.x > -1 && m_ptActiveInf.y > -1)
{
AecInterface inf;
if ( GetInterface(m_ptActiveInf.x,m_ptActiveInf.y,inf) )
{
AcGeVector3d vtDir = inf.vtDir;
vtDir.normalize();
Adesk::Int16 nCr = dc.GetColor();
dc.SetColor(kYellow);//red
vtDir.normalize();
vtDir *= PixelToWcs(30);
double dlg_m_dT = 0.0;
GetSpecialtyData()->GetAt(_T("m_dT"),dlg_m_dT);
//clinder
inf.ptPos += inf.vtDir * dlg_m_dT;
AcGePoint3d ptGeFr = inf.ptPos;
AcGePoint3d ptGeTo = ptGeFr + vtDir;
AcDbEntity* p3d = dc.DrawCone(ptGeFr,PixelToWcs(1),ptGeTo,PixelToWcs(1));
if (p3d != NULL)
{
}
//arrow
ptGeFr = ptGeTo;
vtDir.normalize();
ptGeTo += vtDir * PixelToWcs(15);
p3d = dc.DrawCone(ptGeFr,PixelToWcs(5),ptGeTo,1.e-3);
if (p3d != NULL)
{
}
dc.SetColor(nCr);
}
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbX3dPart::getOsnapPoints( AcDb::OsnapMode osnapMode,
INT_PTR gsSelectionMark,
const AcGePoint3d& pickPoint,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray& snapPoints,
AcDbIntArray& geomIds) const
{
if (m_pSolidDraw != NULL)
{
m_pSolidDraw->getOsnapPoints(osnapMode,gsSelectionMark,pickPoint,lastPoint,viewXform,snapPoints,geomIds);
}
return Acad::eOk;
}
Acad::ErrorStatus AecDbX3dPart::dwgInFields (AcDbDwgFiler* pFiler)
{
Acad::ErrorStatus es;
Adesk::UInt32 version =0 ;
if ( (es =pFiler->readUInt32 (&version)) != Acad::eOk )
return (es) ;
if ( version > AecDbX3dPart::kCurrentVersionNumber )
return (Acad::eMakeMeProxy) ;
TCHAR* pszTemp = NULL;
pFiler->readString(&pszTemp);
if (pszTemp != NULL)
{
m_sName = pszTemp;
acutDelString(pszTemp);
}
pszTemp = NULL;
pFiler->readString(&pszTemp);
if (pszTemp != NULL)
{
m_sGUID = pszTemp;
acutDelString(pszTemp);
}
Adesk::Int32 nVal = 0;
pFiler->readInt32(&nVal);
m_nBoolOper = nVal;
//1
Adesk::Int32 nLen = 0;
pFiler->readInt32(&nLen);
RemoveAll3dSolidRec();
AcDbX3dSolid* pXSolid = NULL;
for (int i = 0;i < nLen;i++)
{
pXSolid = new AcDbX3dSolid;
pXSolid->dwgInFields(pFiler);
m_arX3DSolidPtrsUnite.append(pXSolid);
}
//2
nLen = 0;
pFiler->readInt32(&nLen);
for (int i = 0;i < nLen;i++)
{
pXSolid = new AcDbX3dSolid;
pXSolid->dwgInFields(pFiler);
m_arX3DSolidPtrsSubtr.append(pXSolid);
}
//3
pFiler->readInt32(&nLen);
for (int i = 0;i < nLen;i++)
{
pXSolid = new AcDbX3dSolid;
pXSolid->dwgInFields(pFiler);
m_arX3DSolidPtrsSubtrForHouse.append(pXSolid);
}
pFiler->readVector3d(&m_vtMove);
pFiler->readPoint3d(&m_ptOrg);
pFiler->readInt32(&nLen);
m_arVtAxis.removeAll();
AcGeVector3d vt;
for (int i = 0;i < nLen;i++)
{
pFiler->readVector3d(&vt);
m_arVtAxis.append(vt);
}
pFiler->readBytes(m_dAxisRotats,sizeof(double) * MAX_AXISROTATS);
m_mapXData.dwgInFields(pFiler);
return Acad::eOk;
}
Acad::ErrorStatus AecDbX3dPart::dwgOutFields(AcDbDwgFiler* pFiler) const
{
Acad::ErrorStatus es;
//----- Object version number needs to be saved first
if ( (es = pFiler->writeUInt32 (AecDbX3dPart::kCurrentVersionNumber)) != Acad::eOk )
return (es);
pFiler->writeString((LPCTSTR)m_sName);
pFiler->writeString((LPCTSTR)m_sGUID);
pFiler->writeInt32(m_nBoolOper);
//1
Adesk::Int32 nLen = m_arX3DSolidPtrsUnite.length();
pFiler->writeInt32(nLen);
AcDbX3dSolid* pXSolid = NULL;
for (int i = 0;i < nLen;i++)
{
pXSolid = (AcDbX3dSolid*)m_arX3DSolidPtrsUnite.at(i);
pXSolid->dwgOutFields(pFiler);
}
//2
nLen = m_arX3DSolidPtrsSubtr.length();
pFiler->writeInt32(nLen);
for (int i = 0;i < nLen;i++)
{
pXSolid = (AcDbX3dSolid*)m_arX3DSolidPtrsSubtr.at(i);
pXSolid->dwgOutFields(pFiler);
}
//3
nLen = m_arX3DSolidPtrsSubtrForHouse.length();
pFiler->writeInt32(nLen);
for (int i = 0;i < nLen;i++)
{
pXSolid = (AcDbX3dSolid*)m_arX3DSolidPtrsSubtrForHouse.at(i);
pXSolid->dwgOutFields(pFiler);
}
pFiler->writeVector3d(m_vtMove);
pFiler->writePoint3d(m_ptOrg);
nLen = m_arVtAxis.length();
pFiler->writeInt32(nLen);
for (int i = 0;i < nLen;i++)
{
pFiler->writeVector3d(m_arVtAxis.at(i));
}
pFiler->writeBytes(m_dAxisRotats,sizeof(double) * MAX_AXISROTATS);
m_mapXData.dwgOutFields(pFiler);
return Acad::eOk;
}
Acad::ErrorStatus AecDbX3dPart::CopyFrom(AecDbX3dPart* pSrcPart)
{
if (pSrcPart == NULL)
return Acad::eInvalidInput;
AecDbX3dPart& pPart = *pSrcPart;
m_pSolidDraw = NULL;
m_pSolid = NULL;
m_sName = pPart.m_sName;
m_sGUID = pPart.m_sGUID;
m_nBoolOper = pPart.m_nBoolOper; //
RemoveAll3dSolidRec();
AcDbX3dSolid* pXSolid = NULL;
AcDbX3dSolid* pXSolidNew = NULL;
for (int i = 0;i < pPart.m_arX3DSolidPtrsUnite.length();i++)
{
pXSolid = (AcDbX3dSolid*)pPart.m_arX3DSolidPtrsUnite.at(i);
pXSolidNew = new AcDbX3dSolid(*pXSolid);
pXSolidNew->ReCreate();
m_arX3DSolidPtrsUnite.append(pXSolidNew);
}
for (int i = 0;i < pPart.m_arX3DSolidPtrsSubtr.length();i++)
{
pXSolid = (AcDbX3dSolid*)pPart.m_arX3DSolidPtrsSubtr.at(i);
pXSolidNew = new AcDbX3dSolid(*pXSolid);
pXSolidNew->ReCreate();
m_arX3DSolidPtrsSubtr.append(pXSolidNew);
}
for (int i = 0;i < pPart.m_arX3DSolidPtrsSubtrForHouse.length();i++)
{
pXSolid = (AcDbX3dSolid*)pPart.m_arX3DSolidPtrsSubtrForHouse.at(i);
pXSolidNew = new AcDbX3dSolid(*pXSolid);
pXSolidNew->ReCreate();
m_arX3DSolidPtrsSubtrForHouse.append(pXSolidNew);
}
//先旋转,后移动
m_vtMove = pPart.m_vtMove; //总移动
m_ptOrg = pPart.m_ptOrg; //原点
m_arVtAxis.append(pPart.m_arVtAxis); //轴向
memcpy(m_dAxisRotats,pPart.m_dAxisRotats,MAX_AXISROTATS * sizeof(double));
m_mapXData.CopyFrom(&pPart.m_mapXData);
//显示,临时
m_ptActiveInf = pPart.m_ptActiveInf;
m_bActive = pPart.m_bActive;
m_nPeelOff = pPart.m_nPeelOff;
return Acad::eOk;
}
void AecDbX3dPart::List() const
{
acutPrintf(_T("\n名称: %s"),m_sName);
acutPrintf(_T("\n唯一标识: %s"),m_sGUID);
acutPrintf(_T("\n装配类型: %d"),m_nBoolOper);
acutPrintf(_T("\n并元素个数: %d"),m_arX3DSolidPtrsUnite.length());
acutPrintf(_T("\n减元素个数: %d"),m_arX3DSolidPtrsSubtr.length());
acutPrintf(_T("\nBIM信息:"));
acutPrintf(_T("\nOrg:%g,%g,%g"),m_ptOrg.x,m_ptOrg.y,m_ptOrg.z);
acutPrintf(_T("\nMove:%g,%g,%g"),m_vtMove.x,m_vtMove.y,m_vtMove.z);
for (int i = 0;i < MAX_AXISROTATS;i++)
{
if (i < m_arVtAxis.length())
{
if (m_arVtAxis.at(i).isZeroLength())
{
break;
}
acutPrintf(_T("\nRotat:%g"),m_dAxisRotats[i]);
acutPrintf(_T("\nAxis:%g,%g,%g"),m_arVtAxis.at(i).x,m_arVtAxis.at(i).y,m_arVtAxis.at(i).z);
}
}
m_mapXData.List();
}
SHJson::WValue& AecDbX3dPart::ToJson() const
{
using namespace SHJson;
/*
//序列化
CString m_sName;
CString m_sGUID;
Adesk::Int32 m_nBoolOper; //
AcDbVoidPtrArray m_arX3DSolidPtrsUnite;
AcDbVoidPtrArray m_arX3DSolidPtrsSubtr;
AcDbVoidPtrArray m_arX3DSolidPtrsSubtrForHouse;
//先旋转,后移动
AcGeVector3d m_vtMove; //总移动
AcGePoint3d m_ptOrg; //原点
AcGeVector3dArray m_arVtAxis; //轴向
double m_dAxisRotats[MAX_AXISROTATS];//最多10个轴向旋转
AecDbObjXDataMap m_mapXData; //BIM数据
*/
WValue &v(m_json), tmp;
v.SetObject();
addMember(v, _T("__class__"), _T("AecDbX3dPart"));
addMember(v, _T("__sName__"), m_sName);
addMember(v, _T("__sGUID__"), m_sGUID);
addMember(v, _T("__nBoolOper__"), m_nBoolOper);
addMember(v, _T("__vtMove__"), GEO2JSON::vector(m_vtMove).ToJson());
addMember(v, _T("__ptOrg__"), GEO2JSON::point(m_ptOrg).ToJson());
// 轴向
WValue jAr;
jAr.SetArray();
for (int i = 0; i < m_arVtAxis.length(); ++i)
{
pushBack(jAr, GEO2JSON::vector(m_arVtAxis[i]).ToJson());
}
addMember(v, _T("__arVtAxis__"), jAr);
// 旋转量
jAr.SetNull();
jAr.SetArray();
for (int i = 0; i < MAX_AXISROTATS; ++i)
{
pushBack(jAr, m_dAxisRotats[i]);
}
addMember(v, _T("__dAxisRotats__"), jAr);
// UnitePart
jAr.SetNull();
jAr.SetArray();
for (int i = 0; i < m_arX3DSolidPtrsUnite.length(); ++i)
{
AcDbX3dSolid *pSolid((AcDbX3dSolid*)m_arX3DSolidPtrsUnite[i]);
pushBack(jAr, pSolid->ToJson());
}
addMember(v, _T("__arX3DSolidPtrsUnite__"), jAr);
// SubtrPart
jAr.SetNull();
jAr.SetArray();
for (int i = 0; i < m_arX3DSolidPtrsSubtr.length(); ++i)
{
AcDbX3dSolid *pSolid((AcDbX3dSolid*)m_arX3DSolidPtrsSubtr[i]);
pushBack(jAr, pSolid->ToJson());
}
addMember(v, _T("__arX3DSolidPtrsSubtr__"), jAr);
// SubtrForHouse
jAr.SetNull();
jAr.SetArray();
for (int i = 0; i < m_arX3DSolidPtrsSubtrForHouse.length(); ++i)
{
AcDbX3dSolid *pSolid((AcDbX3dSolid*)m_arX3DSolidPtrsSubtrForHouse[i]);
pushBack(jAr, pSolid->ToJson());
}
addMember(v, _T("__arX3DSolidPtrsSubtrForHouse__"), jAr);
// xdata
addMember(v, _T("__xdata__"), m_mapXData.ToJson());
return v;
}
bool AecDbX3dPart::ByJson(const SHJson::WValue &v)
{
MCIt it = v.FindMember(_T("__sName__"));
if (it == v.MemberEnd()) return false;
m_sName = it->value.GetString();
it = v.FindMember(_T("__sGUID__"));
if (it == v.MemberEnd()) return false;
m_sGUID = it->value.GetString();
it = v.FindMember(_T("__nBooloper__"));
if (it == v.MemberEnd()) return false;
m_nBoolOper = it->value.GetInt();
it = v.FindMember(_T("__vtMove__"));
if (it == v.MemberEnd()) return false;
m_vtMove = GEO2JSON::vector(it->value).asVec3d();
it = v.FindMember(_T("__ptOrg"));
if (it == v.MemberEnd()) return false;
m_ptOrg = GEO2JSON::point(it->value).asPnt3d();
it = v.FindMember(_T("__arVtAxis__"));
if (it == v.MemberEnd()) return false;
if (!it->value.IsArray()) return false;
for (VCIt i = it->value.Begin(); i != it->value.End(); ++i)
{
m_arVtAxis.append(GEO2JSON::vector(it->value).asVec3d());
}
it = v.FindMember(_T("__dAxisRotats__"));
if (it == v.MemberEnd()) return false;
if (!it->value.IsArray()) return false;
int j(0);
for (VCIt i = it->value.Begin(); i != it->value.End(); ++i, ++j)
{
m_dAxisRotats[j] = i->GetDouble();
}
it = v.FindMember(_T("__arX3DSolidPtrsUnite__"));
if (it == v.MemberEnd()) return false;
if (!it->value.IsArray()) return false;
for (VCIt i = it->value.Begin(); i != it->value.End(); ++i)
{
AcDbX3dSolid *pSolid = new AcDbX3dSolid();
if (pSolid->ByJson(it->value))
{
m_arX3DSolidPtrsUnite.append(pSolid);
}
else
{
DELETE_PTR(pSolid);
}
}
it = v.FindMember(_T("__arX3DSolidPtrsSubtr__"));
if (it == v.MemberEnd()) return false;
if (!it->value.IsArray()) return false;
for (VCIt i = it->value.Begin(); i != it->value.End(); ++i)
{
AcDbX3dSolid *pSolid = new AcDbX3dSolid();
if (pSolid->ByJson(it->value))
{
m_arX3DSolidPtrsSubtr.append(pSolid);
}
else
{
DELETE_PTR(pSolid);
}
}
it = v.FindMember(_T("__arX3DSolidPtrsSubtrForHouse__"));
if (it == v.MemberEnd()) return false;
if (!it->value.IsArray()) return false;
for (VCIt i = it->value.Begin(); i != it->value.End(); ++i)
{
AcDbX3dSolid *pSolid = new AcDbX3dSolid();
if (pSolid->ByJson(it->value))
{
m_arX3DSolidPtrsSubtrForHouse.append(pSolid);
}
else
{
DELETE_PTR(pSolid);
}
}
it = v.FindMember(_T("__xdata__"));
if (it == v.MemberEnd()) return false;
if (!m_mapXData.ByJson(v)) return false;
return true;
}
void AecDbX3dPart::getBimDatas(SH_BIM_BLOCK &data)
{
const AecDbObjXDataMap *pDataMap = GetSpecialtyData();
if (!pDataMap) return;
CoreTools::getBimDatas(*pDataMap, data);
}
void AecDbX3dPart::setBimDatas(const SH_BIM_BLOCK &data)
{
AecDbObjXDataMap *pDataMap = GetSpecialtyData();
if (!pDataMap) return;
CoreTools::setBimDatas(*pDataMap, data);
}