4439 lines
107 KiB
C++
4439 lines
107 KiB
C++
#include "stdafx.h"
|
|
#include "AecDbX3dPartEntity.h"
|
|
#include "dbgrip.h"
|
|
#include "AecGripCback.h"
|
|
#include "KTCADUtilityEx.h"
|
|
#include "MFCDbDwgFiler.h"
|
|
#include "AecDbX3dPart.h"
|
|
#include "KTTempTol.h"
|
|
#include "CoreTools.h"
|
|
#include "KTSetting.h"
|
|
#include "KTModelLayoutXData.h"
|
|
#include "AcGiExplodeDraw.h"
|
|
#include "AecDbSlab.h"
|
|
#include "AecDbXDrawPointer.h"
|
|
|
|
extern CString IDCreate();
|
|
extern double PixelToWcs(int nPixel);
|
|
extern BOOL Is2DView();
|
|
extern AcGeVector3d GetUcsZvt();
|
|
extern void PushGripMessage(GripMessage&msg);
|
|
extern AcDbPolyline* FormatPolyline(AcGePoint3d* ppPts,int nCount);
|
|
extern Acad::ErrorStatus AddToModelSpace(AcDbEntity* pEnt, AcDbDatabase* pDb = NULL, bool bClose = true);
|
|
extern void transfromRegion(AcDbRegion *pRegion, const AcGePoint3d &ptOnRegion, const AcGeVector3d &vtNormal, const AcGePoint3d &ptOnPlan);
|
|
extern void transfromCurve(AcDbCurve* pCurve,const AcGePoint3d& ptOnRegion,const AcGeVector3d &vtNormal,const AcGePoint3d &ptOnPlan);
|
|
extern void transfromPoint(AcGePoint3d& ptOn,const AcGeVector3d &vtNormal,const AcGePoint3d &ptOnPlan);
|
|
extern void DLLIMPEXP OrthoProjected3DSolid2(AcDb3dSolid* pSolidClone,const AcGePlane& plan,const AcGePlane& planCut,AcGeMatrix3d& xformPlanToWorld,AcDbVoidPtrArray& arEntPtrs);
|
|
extern void DLLIMPEXP OrthoProjected3DSolid(AcDb3dSolid* pSolidClone,const AcGePlane& plan,AcGeMatrix3d& xformPlanToWorld,AcDbVoidPtrArray& arEntPtrs);
|
|
extern AcGePoint3d MidPoint(const AcGePoint3d& pt1,const AcGePoint3d& pt2);
|
|
extern BOOL DLLIMPEXP GetDimGripOff();
|
|
extern void RegionHatch(AcDbRegion* pRegionT,AcDbVoidPtrArray& arHatchPtrs,LPCTSTR pszPattern);
|
|
extern void FillSolid(AcGePoint3d *pptGe, int nCount, AcDbVoidPtrArray &arHatchPtrs);
|
|
extern DLLIMPEXP void PolylineHatch(AcDbPolyline *pPl, AcDbVoidPtrArray &arHatchPtrs, LPCTSTR pszPattern, const AcGeVector3d &vtZ);
|
|
|
|
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;
|
|
|
|
#define HATCH_LOOP 123
|
|
|
|
Adesk::UInt32 AecDbX3dPartEntity::kCurrentVersionNumber = 2;
|
|
|
|
ACRX_DXF_DEFINE_MEMBERS (AecDbX3dPartEntity, AecDbEntityBase,
|
|
AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
|
|
AcDbProxyEntity::kNoOperation | AcDbProxyEntity::kDisableProxyWarning,
|
|
AEC_X3DPART,
|
|
"AecDbX3dPartEntity"
|
|
"|Product Desc: shanghua earthworm app obj"
|
|
"|Company: shanghua inc"
|
|
"|WEB Address: www.shanghuasoft.com")
|
|
|
|
AecDbX3dPartEntity::AecDbX3dPartEntity(void)
|
|
{
|
|
m_pPart = new AecDbX3dPart;
|
|
m_pGripAppData = new AecGripData[GRIP_MAXNUM];
|
|
GetSpecialtyData()->SetAt(KEY_HIDENO,TRUE);
|
|
}
|
|
|
|
AecDbX3dPartEntity::~AecDbX3dPartEntity(void)
|
|
{
|
|
delete [] m_pGripAppData;
|
|
delete m_pPart;
|
|
}
|
|
|
|
void AecDbX3dPartEntity::AddX3dSolid(AcDbX3dSolid* pXSolid,AcDb::BoolOperType bType/* = AcDb::kBoolUnite*/,bool bSubtractForOwner /*= false*/)
|
|
{
|
|
AssertWriteEnabled();
|
|
|
|
if (bSubtractForOwner)
|
|
{
|
|
m_pPart->AddX3dSolid(pXSolid,bType,true);
|
|
}
|
|
else
|
|
{
|
|
m_pPart->AddX3dSolid(pXSolid,bType);
|
|
}
|
|
}
|
|
|
|
void AecDbX3dPartEntity::RemoveAt(int nIndex,AcDb::BoolOperType bType/* = AcDb::kBoolUnite*/,bool bSubtractForOwner /* = false*/)
|
|
{
|
|
AssertWriteEnabled();
|
|
if (bSubtractForOwner)
|
|
{
|
|
if (nIndex > -1 && nIndex < m_pPart->GetX3dSolidCount(AcDb::kBoolUnite,true))
|
|
{
|
|
m_pPart->RemoveAt(nIndex,bType,true);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (nIndex > -1 && nIndex < m_pPart->GetX3dSolidCount())
|
|
{
|
|
m_pPart->RemoveAt(nIndex,bType);
|
|
}
|
|
}
|
|
}
|
|
|
|
void AecDbX3dPartEntity::RemoveAll3dSolidRec()
|
|
{
|
|
AssertWriteEnabled();
|
|
m_pPart->RemoveAll3dSolidRec();
|
|
}
|
|
|
|
int AecDbX3dPartEntity::GetX3dSolidCount(AcDb::BoolOperType bType /*= AcDb::kBoolUnite*/,bool bSubtractForOwner/* = false*/) const
|
|
{
|
|
assertReadEnabled();
|
|
|
|
if (bSubtractForOwner)
|
|
{
|
|
return m_pPart->GetX3dSolidCount(bType,true);
|
|
}
|
|
return m_pPart->GetX3dSolidCount(bType);
|
|
}
|
|
|
|
bool AecDbX3dPartEntity::Create()
|
|
{
|
|
AssertWriteEnabled();
|
|
|
|
if (m_pPart != NULL)
|
|
{
|
|
return m_pPart->Create();
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void AecDbX3dPartEntity::SetName(LPCTSTR pszName)
|
|
{
|
|
assertWriteEnabled();
|
|
if (m_pPart != NULL)
|
|
{
|
|
m_pPart->SetName(pszName);
|
|
}
|
|
}
|
|
|
|
CString AecDbX3dPartEntity::GetName() const
|
|
{
|
|
assertReadEnabled();
|
|
CString sName;
|
|
if (m_pPart != NULL)
|
|
{
|
|
m_pPart->GetName(sName);
|
|
}
|
|
return sName;
|
|
}
|
|
|
|
LPCTSTR AecDbX3dPartEntity::GetGUID() const
|
|
{
|
|
assertReadEnabled();
|
|
if (m_pPart != NULL)
|
|
{
|
|
return m_pPart->GetGUID();
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
AcDbX3dSolid* AecDbX3dPartEntity::GetX3dSolid(int nIndex,AcDb::BoolOperType bType /*= AcDb::kBoolUnite*/,bool bSubtractForOwner/* = false */) const
|
|
{
|
|
assertReadEnabled();
|
|
|
|
if (bSubtractForOwner)
|
|
{
|
|
if (nIndex > -1 && nIndex < m_pPart->GetX3dSolidCount(bType,true))
|
|
{
|
|
return m_pPart->GetX3dSolid(nIndex,bType);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (nIndex > -1 && nIndex < m_pPart->GetX3dSolidCount(bType))
|
|
{
|
|
return m_pPart->GetX3dSolid(nIndex,bType);
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void AecDbX3dPartEntity::SetOrgPoint(const AcGePoint3d& ptOrg)
|
|
{
|
|
AssertWriteEnabled();
|
|
m_pPart->SetOrgPoint(ptOrg);
|
|
}
|
|
|
|
AcGePoint3d AecDbX3dPartEntity::GetOrgPoint(bool bGetTrans/* = false*/) const
|
|
{
|
|
assertReadEnabled();
|
|
return m_pPart->GetOrgPoint(bGetTrans);
|
|
}
|
|
|
|
void AecDbX3dPartEntity::AddMove(const AcGeVector3d& vtMove)
|
|
{
|
|
AssertWriteEnabled();
|
|
m_pPart->AddMove(vtMove);
|
|
|
|
AcGePoint3d ptPos;
|
|
if ( m_pPart->GetSpecialtyData()->GetAt(KEY_NOPOS,ptPos) )
|
|
{
|
|
ptPos += vtMove;
|
|
m_pPart->GetSpecialtyData()->SetAt(KEY_NOPOS,ptPos);
|
|
}
|
|
}
|
|
|
|
AcGeVector3d AecDbX3dPartEntity::GetMove() const
|
|
{
|
|
assertReadEnabled();
|
|
return m_pPart->GetMove();
|
|
}
|
|
|
|
void AecDbX3dPartEntity::ResetMove()
|
|
{
|
|
AssertWriteEnabled();
|
|
m_pPart->ResetMove();
|
|
}
|
|
|
|
void AecDbX3dPartEntity::AddRotate(int nAxis,double dRotateBy)
|
|
{
|
|
AssertWriteEnabled();
|
|
m_pPart->AddRotate(nAxis,dRotateBy);
|
|
}
|
|
|
|
double AecDbX3dPartEntity::GetRotate(int nAxis) const
|
|
{
|
|
assertReadEnabled();
|
|
return m_pPart->GetRotate(nAxis);
|
|
}
|
|
|
|
void AecDbX3dPartEntity::ResetRotation(int nAxis)
|
|
{
|
|
AssertWriteEnabled();
|
|
m_pPart->ResetRotate(nAxis);
|
|
}
|
|
|
|
AcDb3dSolid* AecDbX3dPartEntity::CreateDraw3dSolid() const
|
|
{
|
|
assertReadEnabled();
|
|
return m_pPart->CreateDraw3dSolid();
|
|
}
|
|
|
|
bool AecDbX3dPartEntity::GetForHouseSubtract(AcDbVoidPtrArray& arSolidPtrs) const
|
|
{
|
|
assertReadEnabled();
|
|
m_pPart->GetForHouseSubtract(arSolidPtrs);
|
|
return true;
|
|
}
|
|
|
|
AecDbObjXDataMap* AecDbX3dPartEntity::GetSpecialtyData(AcDb::OpenMode bMode /*= AcDb::kForWrite*/)
|
|
{
|
|
if (bMode == AcDb::kForWrite)
|
|
{
|
|
if (!isWriteEnabled())
|
|
{
|
|
upgradeOpen();
|
|
}
|
|
assertWriteEnabled();
|
|
}
|
|
else
|
|
{
|
|
assertReadEnabled();
|
|
}
|
|
return m_pPart->GetSpecialtyData();
|
|
}
|
|
|
|
const AecDbObjXDataMap * AecDbX3dPartEntity::GetSpecialtyData() const
|
|
{
|
|
assertReadEnabled();
|
|
return m_pPart->GetSpecialtyData();
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::subExplode(AcDbVoidPtrArray& entitySet) const
|
|
{
|
|
assertReadEnabled();
|
|
|
|
AcDb3dSolid* pSolid = CreateDraw3dSolid();
|
|
if (pSolid != NULL)
|
|
{
|
|
entitySet.append(pSolid);
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
|
|
void AecDbX3dPartEntity::subList() const
|
|
{
|
|
assertReadEnabled();
|
|
AecDbEntityBase::subList();
|
|
acutPrintf(_T("\n装配式簇"));
|
|
m_pPart->List();
|
|
acutPrintf(_T("\n体积:立方"),GetVolume() / 1.e9);
|
|
}
|
|
|
|
bool AecDbX3dPartEntity::GetBimInfoTip(CString& sInfoTip) const
|
|
{
|
|
assertReadEnabled();
|
|
|
|
CString sField,sFmt;
|
|
CString sName = GetName();
|
|
CString sVal;
|
|
|
|
double dVal = 0.0;
|
|
if ( sName.CompareNoCase(_T("开洞")) == 0)
|
|
{
|
|
int nShpae = 0;
|
|
GetSpecialtyData()->GetAt(_T("nShape"),nShpae);//方
|
|
|
|
if (nShpae == eRect)
|
|
{
|
|
sField = _T("矩形洞口\n");
|
|
sInfoTip += sField;
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("m_dL"),dVal);
|
|
MAKEFIELD(_T("长度"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("m_dW"),dVal);
|
|
MAKEFIELD(_T("宽度"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("m_dT"),dVal);
|
|
MAKEFIELD(_T("洞深"),_T("%.2f"),dVal,sInfoTip);
|
|
}
|
|
else if(nShpae == eCircle)
|
|
{
|
|
sField = _T("圆形洞口\n");
|
|
sInfoTip += sField;
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("m_dL"),dVal);
|
|
MAKEFIELD(_T("直径"),_T("%.2f"),2.0 * dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("m_dT"),dVal);
|
|
MAKEFIELD(_T("洞深"),_T("%.2f"),dVal,sInfoTip);
|
|
}
|
|
else
|
|
{
|
|
sField = _T("异形洞口\n");
|
|
sInfoTip += sField;
|
|
|
|
sVal = _T("");
|
|
GetSpecialtyData()->GetAt(_T("Points"),sVal);
|
|
MAKEFIELD(_T("定义"),_T("%s"),sVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dH"),dVal);
|
|
MAKEFIELD(_T("洞深"),_T("%.2f"),dVal,sInfoTip);
|
|
}
|
|
|
|
|
|
MAKEFIELD(_T("洞底标高"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
sVal = _T("");
|
|
GetSpecialtyData()->GetAt(KEY_NO,sVal);
|
|
MAKEFIELD(_T("编号"),_T("%s"),sVal,sInfoTip);
|
|
}
|
|
else if( sName.CompareNoCase(_T("套管")) == 0)
|
|
{
|
|
int nShpae = 0;
|
|
GetSpecialtyData()->GetAt(_T("nShape"), nShpae);//方
|
|
|
|
if (nShpae == eCircle)
|
|
{
|
|
sField = _T("圆形套管\n");
|
|
sInfoTip += sField;
|
|
|
|
CString sPipeType;
|
|
GetSpecialtyData()->GetAt(KEY_PIPETYPE, sPipeType);
|
|
MAKEFIELD(_T("套管类型"), _T("%s"), sPipeType, sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dH"),dVal);
|
|
MAKEFIELD(_T("嵌入长度"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dD"),dVal);
|
|
MAKEFIELD(_T("直径"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dT"),dVal);
|
|
MAKEFIELD(_T("壁厚"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
BOOL bExt = 0;
|
|
GetSpecialtyData()->GetAt(_T("bExt"),bExt);
|
|
if (bExt)
|
|
{
|
|
dVal = 0;
|
|
GetSpecialtyData()->GetAt(_T("dEx1"),dVal);
|
|
MAKEFIELD(_T("延申长度1"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0;
|
|
GetSpecialtyData()->GetAt(_T("dEx2"),dVal);
|
|
MAKEFIELD(_T("延申长度2"),_T("%.2f"),dVal,sInfoTip);
|
|
}
|
|
|
|
CString sTOD;
|
|
if (GetSpecialtyData()->GetAt(PIPE_TOD,sTOD) )
|
|
{
|
|
MAKEFIELD(_T("套管翼环外径"), _T("%s"), sTOD, sInfoTip);
|
|
}
|
|
int nD2 = 0;
|
|
if (GetSpecialtyData()->GetAt(PIPE_YMS, nD2))
|
|
{
|
|
MAKEFIELD(_T("套管翼环数量"), _T("%d"), nD2, sInfoTip);
|
|
}
|
|
}
|
|
else if(nShpae == eRect)
|
|
{
|
|
sField = _T("矩形套管\n");
|
|
sInfoTip += sField;
|
|
|
|
CString sPipeType;
|
|
GetSpecialtyData()->GetAt(KEY_PIPETYPE, sPipeType);
|
|
MAKEFIELD(_T("套管类型"), _T("%s"), sPipeType, sInfoTip);
|
|
|
|
dVal = 0;
|
|
GetSpecialtyData()->GetAt(_T("dH"),dVal);
|
|
MAKEFIELD(_T("套管截面长"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0;
|
|
GetSpecialtyData()->GetAt(_T("dL"),dVal);
|
|
MAKEFIELD(_T("套管截面宽"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dT"),dVal);
|
|
MAKEFIELD(_T("壁厚"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
BOOL bExt = 0;
|
|
GetSpecialtyData()->GetAt(_T("bExt"),bExt);
|
|
if (bExt)
|
|
{
|
|
dVal = 0;
|
|
GetSpecialtyData()->GetAt(_T("dEx1"),dVal);
|
|
MAKEFIELD(_T("延申长度1"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0;
|
|
GetSpecialtyData()->GetAt(_T("dEx2"),dVal);
|
|
MAKEFIELD(_T("延申长度2"),_T("%.2f"),dVal,sInfoTip);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sField = _T("异形套管管\n");
|
|
sInfoTip += sField;
|
|
}
|
|
|
|
CString sTOD;
|
|
if (GetSpecialtyData()->GetAt(PIPE_TOD, sTOD))
|
|
{
|
|
MAKEFIELD(_T("套管翼环外径"), _T("%s"), sTOD, sInfoTip);
|
|
}
|
|
int nD2 = 0;
|
|
if (GetSpecialtyData()->GetAt(PIPE_YMS, nD2))
|
|
{
|
|
MAKEFIELD(_T("套管翼环数量"), _T("%d"), nD2, sInfoTip);
|
|
}
|
|
|
|
sVal = _T("");
|
|
GetSpecialtyData()->GetAt(KEY_MATERIAL,sVal);
|
|
MAKEFIELD(_T("材质"),_T("%s"),sVal,sInfoTip);
|
|
|
|
sVal = _T("");
|
|
GetSpecialtyData()->GetAt(KEY_PIPETYPE,sVal);
|
|
MAKEFIELD(_T("类型"),_T("%s"),sVal,sInfoTip);
|
|
|
|
sVal = _T("");
|
|
GetSpecialtyData()->GetAt(KEY_NO,sVal);
|
|
MAKEFIELD(_T("编号"),_T("%s"),sVal,sInfoTip);
|
|
}
|
|
else if ( sName.Find(_T("井")) != -1)
|
|
{
|
|
if (sName.CompareNoCase(_T("方台井")) == 0)
|
|
{
|
|
sField = _T("方台井\n");
|
|
sInfoTip += sField;
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dL"),dVal);
|
|
MAKEFIELD(_T("进口长"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dW"),dVal);
|
|
MAKEFIELD(_T("进口宽"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dH"),dVal);
|
|
MAKEFIELD(_T("井深"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dL1"),dVal);
|
|
MAKEFIELD(_T("出口长"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dW1"),dVal);
|
|
MAKEFIELD(_T("出口宽"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dt"),dVal);
|
|
MAKEFIELD(_T("井侧壁厚"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dBomt"),dVal);
|
|
MAKEFIELD(_T("井底壁厚"),_T("%.2f"),dVal,sInfoTip);
|
|
}
|
|
else if(sName.CompareNoCase(_T("方圆井")) == 0)
|
|
{
|
|
sField = _T("方圆井\n");
|
|
sInfoTip += sField;
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dL"),dVal);
|
|
MAKEFIELD(_T("进口长"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dW"),dVal);
|
|
MAKEFIELD(_T("进口宽"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dr"),dVal);
|
|
MAKEFIELD(_T("出口直径"),_T("%.2f"),2.0 * dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dH"),dVal);
|
|
MAKEFIELD(_T("井深"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dt"),dVal);
|
|
MAKEFIELD(_T("井侧壁厚"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dBomt"),dVal);
|
|
MAKEFIELD(_T("井底壁厚"),_T("%.2f"),dVal,sInfoTip);
|
|
}
|
|
else if(sName.CompareNoCase(_T("集水坑井")) == 0)
|
|
{
|
|
sField = _T("集水坑井\n");
|
|
sInfoTip += sField;
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dL"),dVal);
|
|
MAKEFIELD(_T("进口长"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dW"),dVal);
|
|
MAKEFIELD(_T("进口宽"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dH"),dVal);
|
|
MAKEFIELD(_T("井深"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
double dBomThick = 0.0,dT = 0.0;
|
|
if (GetSpecialtyData()->GetAt(_T("dSlabThick"),dBomThick))
|
|
{
|
|
GetSpecialtyData()->GetAt(_T("dBomThick"),dT);
|
|
}
|
|
else
|
|
{
|
|
GetSpecialtyData()->GetAt(_T("dBomThick"),dBomThick);
|
|
GetSpecialtyData()->GetAt(_T("dBomThick"),dT);
|
|
}
|
|
MAKEFIELD(_T("底部壁厚"),_T("%.2f"),dT,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
if ( GetSpecialtyData()->GetAt(_T("Ang"),dVal) )
|
|
{
|
|
dVal *= 180.0 / PI;
|
|
}
|
|
MAKEFIELD(_T("加强斜角"),_T("%.2f 度"),dVal,sInfoTip);
|
|
}
|
|
else if (sName.CompareNoCase(_T("圆台井")) == 0)
|
|
{
|
|
sField = _T("圆台井\n");
|
|
sInfoTip += sField;
|
|
|
|
dVal = 0;
|
|
GetSpecialtyData()->GetAt(_T("dR"),dVal);
|
|
MAKEFIELD(_T("进口直径"),_T("%.2f"),2.0 * dVal,sInfoTip);
|
|
|
|
dVal = 0;
|
|
GetSpecialtyData()->GetAt(_T("dr"),dVal);
|
|
MAKEFIELD(_T("出口直径"),_T("%.2f"),2.0 * dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dH"),dVal);
|
|
MAKEFIELD(_T("井深"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dt"),dVal);
|
|
MAKEFIELD(_T("井侧壁厚"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dBomt"),dVal);
|
|
if (dVal < 1.e-2)
|
|
GetSpecialtyData()->GetAt(_T("dt"),dVal);
|
|
MAKEFIELD(_T("井底壁厚"),_T("%.2f"),dVal,sInfoTip);
|
|
}
|
|
else if (sName.CompareNoCase(_T("异形偏心井")) == 0)
|
|
{
|
|
sField = _T("异形偏心井\n");
|
|
sInfoTip += sField;
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dH"),dVal);
|
|
MAKEFIELD(_T("井深"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dThick"),dVal);
|
|
MAKEFIELD(_T("井侧壁厚"),_T("%.2f"),dVal,sInfoTip);
|
|
|
|
dVal = 0.0;
|
|
GetSpecialtyData()->GetAt(_T("dBomThick"),dVal);
|
|
MAKEFIELD(_T("底部壁厚"),_T("%.2f"),dVal,sInfoTip);
|
|
}
|
|
|
|
sVal = _T("");
|
|
GetSpecialtyData()->GetAt(KEY_REM,sVal);
|
|
MAKEFIELD(_T("用途"),_T("%s"),sVal,sInfoTip);
|
|
|
|
sVal = _T("");
|
|
GetSpecialtyData()->GetAt(KEY_NO,sVal);
|
|
MAKEFIELD(_T("编号"),_T("%s"),sVal,sInfoTip);
|
|
}
|
|
else
|
|
{
|
|
sField = _T("装配式簇\n");
|
|
sInfoTip += sField;
|
|
|
|
MAKEFIELD(_T("体积"),_T("%.6f 立方"),GetVolume() / 1.e9,sInfoTip);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::copyFrom(const AcRxObject* pSrc)
|
|
{
|
|
AssertWriteEnabled();
|
|
if (pSrc != NULL)
|
|
{
|
|
AecDbX3dPartEntity* pPartSrc = AecDbX3dPartEntity::cast(pSrc);
|
|
if (pPartSrc != NULL)
|
|
{
|
|
AssertWriteEnabled();
|
|
m_pPart->CopyFrom(pPartSrc->m_pPart);
|
|
|
|
//m_pPart->ResetMove();
|
|
//m_pPart->ResetRotate(X);
|
|
//m_pPart->ResetRotate(Y);
|
|
//m_pPart->ResetRotate(Z);
|
|
|
|
m_drawable2d.copyFrom(pPartSrc->m_drawable2d);
|
|
|
|
AcDbObjectId idBasin;
|
|
GetAt(KEY_ASSOIC, idBasin);
|
|
addPersistentReactor(idBasin);
|
|
}
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::subDeepClone( AcDbObject *pOwnerObject,
|
|
AcDbObject *&pClonedObject,
|
|
AcDbIdMapping &idMap,
|
|
Adesk::Boolean isPrimary /*= Adesk::kTrue*/) const
|
|
{
|
|
// 如果已经克隆过了,就直接返回,避免重复克隆
|
|
AcDbIdPair idPairOpening(id(), AcDbObjectId::kNull, false, isPrimary ? true : false);
|
|
if (idMap.compute(idPairOpening))
|
|
return Acad::eOk;
|
|
|
|
Acad::ErrorStatus es = AecDbEntityBase::subDeepClone(pOwnerObject, pClonedObject, idMap, isPrimary);
|
|
|
|
//AcDbObjectId idBasin;
|
|
//GetAt(KEY_ASSOIC, idBasin);
|
|
|
|
//AcDbEntity *pEnt = NULL;
|
|
//if (Acad::eOk == acdbOpenAcDbEntity(pEnt, idBasin, AcDb::kForWrite))
|
|
//{
|
|
// AecDbXSlab *pBasin = AecDbXSlab::cast(pEnt);
|
|
// if (pBasin != NULL)
|
|
// {
|
|
// if (pClonedObject)
|
|
// pBasin->AppendAssocPart(pClonedObject->objectId());
|
|
// }
|
|
// pEnt->close();
|
|
//}
|
|
|
|
// 与洞口的关联关系再板实体中建立
|
|
|
|
if (!pClonedObject) return es;
|
|
|
|
AecDbX3dPartEntity *pOpening = AecDbX3dPartEntity::cast(pClonedObject);
|
|
if (pOpening)
|
|
pOpening->SetAt(KEY_ASSOIC, AcDbObjectId::kNull);
|
|
return es;
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::subTransformBy(const AcGeMatrix3d& xform)
|
|
{
|
|
AssertWriteEnabled();
|
|
|
|
//再分解移动,目前只支持X,Y 镜像
|
|
AcGePoint3d pt = GetOrgPoint(true);
|
|
AcGePoint3d pt2 = pt;
|
|
pt2.transformBy(xform);
|
|
|
|
AcGeVector3d vtMove = pt2 - pt;
|
|
AddMove(vtMove);
|
|
|
|
m_drawable2d.transformBy(xform);
|
|
|
|
//确认变换后
|
|
//更新三维,发自 AecDbX3dPartEntity 变动消息
|
|
if (objectId().isValid())
|
|
{
|
|
AcDbObjectId idHost;
|
|
m_pPart->GetSpecialtyData()->GetAt(KEY_ASSOIC,idHost);
|
|
|
|
//reset
|
|
GripMessage msg;
|
|
memset(&msg,0,sizeof(GripMessage));
|
|
msg.nSegindex = -1;
|
|
msg.nType = -1;
|
|
msg.pParam = 0;
|
|
msg.nData = -1;
|
|
_tcscpy(msg.szLockId, _T("0"));//锁定id,如果有
|
|
msg.fData = 0;
|
|
msg.nSegindex = 0;
|
|
msg.nSubSegIndex = 0;
|
|
msg.vtOffset.set(0,0,0);
|
|
msg.ptGrip.set(0,0,0);
|
|
|
|
//发送调整通知命令
|
|
msg.nType = eAdjust0;
|
|
msg.nData = 0;
|
|
msg.ptGrip.set(0,0,0);
|
|
msg.idHost = objectId();
|
|
msg.vtOffset = vtMove;
|
|
|
|
Create();
|
|
|
|
if (idHost.isValid())
|
|
{
|
|
PushGripMessage(msg);
|
|
}
|
|
|
|
//补充来自管道夹点的动作
|
|
AssocReCreateDraw();
|
|
}
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::subGetTransformedCopy(const AcGeMatrix3d& xform,AcDbEntity*& ent) const
|
|
{
|
|
assertReadEnabled();
|
|
AcDbEntity *pCloned = (AcDbEntity *)clone();
|
|
|
|
AecDbX3dPartEntity* pXPart = AecDbX3dPartEntity::cast(pCloned);
|
|
if (pXPart != NULL)
|
|
{
|
|
pXPart->ResetMove();
|
|
pXPart->ResetRotation(X);
|
|
pXPart->ResetRotation(Y);
|
|
pXPart->ResetRotation(Z);
|
|
}
|
|
|
|
Acad::ErrorStatus es = pCloned->transformBy(xform);
|
|
if(es == Acad::eOk)
|
|
ent = pCloned;
|
|
else
|
|
DELETE_PTR(pCloned);
|
|
return es;
|
|
}
|
|
|
|
#if ARX>16
|
|
Acad::ErrorStatus AecDbX3dPartEntity::subGetGripPoints( AcDbGripDataPtrArray& grips,
|
|
const double curViewUnitSize,
|
|
const int gripSize,
|
|
const AcGeVector3d& curViewDir,
|
|
const int bitflags) const
|
|
{
|
|
assertReadEnabled();
|
|
|
|
AcGePoint3d pt = m_pPart->GetOrgPoint(true);
|
|
|
|
CString sName;
|
|
m_pPart->GetName(sName);
|
|
|
|
AcDbGripData* pGripData = new AcDbGripData;
|
|
|
|
// 位置 0
|
|
int i = 0;
|
|
memset(&m_pGripAppData[i],0,sizeof(AecGripData));
|
|
m_pGripAppData[i].nIndex = i;
|
|
m_pGripAppData[i].ePos = eMid;
|
|
m_pGripAppData[i].ptGrip = pt;
|
|
m_pGripAppData[i].nColor = kBlue;
|
|
_tcscpy(m_pGripAppData[i].szTip,_T("位置夹点"));
|
|
_tcscpy(m_pGripAppData[i].szID,m_pPart->GetGUID());
|
|
m_pGripAppData[i].pOwner = (AcDbEntity*)this;
|
|
m_pGripAppData[i].idHost = objectId();
|
|
pGripData->setGripPoint(pt);
|
|
pGripData->setAppData((void*)&m_pGripAppData[i]);
|
|
pGripData->setWorldDraw(AecGripCback::WorldDrawfunc);
|
|
pGripData->setToolTipFunc(AecGripCback::GripToolTipFunc);
|
|
grips.append(pGripData);
|
|
|
|
//洞口消息 1
|
|
i += 1;
|
|
if (sName.CompareNoCase(_T("套管")) == 0 ||
|
|
sName.CompareNoCase(_T("开洞")) == 0)
|
|
{
|
|
double dCmd = PixelToWcs(20);
|
|
|
|
pt.x += dCmd;
|
|
pt.y += dCmd;
|
|
|
|
pGripData = new AcDbGripData;
|
|
memset(&m_pGripAppData[i],0,sizeof(AecGripData));
|
|
m_pGripAppData[i].nIndex = i;
|
|
m_pGripAppData[i].ePos = eCommand0;
|
|
m_pGripAppData[i].ptGrip = pt;
|
|
_tcscpy(m_pGripAppData[i].szTip,_T("拉管夹点"));
|
|
_tcscpy(m_pGripAppData[i].szID,m_pPart->GetGUID());
|
|
m_pGripAppData[i].pOwner = (AcDbEntity*)this;
|
|
m_pGripAppData[i].idHost = objectId();
|
|
pGripData->setGripPoint(pt);
|
|
pGripData->setAppData((void*)&m_pGripAppData[i]);
|
|
pGripData->setWorldDraw(AecGripCback::WorldDrawfunc);
|
|
pGripData->setToolTipFunc(AecGripCback::GripToolTipFunc);
|
|
grips.append(pGripData);
|
|
|
|
//洞口编号 2
|
|
i+= 1;
|
|
AcGePoint3d ptPos;
|
|
if (!m_pPart->GetSpecialtyData()->GetAt(KEY_NOPOS,ptPos))
|
|
{
|
|
ptPos = GetOrgPoint();
|
|
}
|
|
ptPos.x -= dCmd;
|
|
ptPos.y -= dCmd;
|
|
|
|
pGripData = new AcDbGripData;
|
|
memset(&m_pGripAppData[i],0,sizeof(AecGripData));
|
|
m_pGripAppData[i].nIndex = i;
|
|
m_pGripAppData[i].ePos = eEnd;
|
|
m_pGripAppData[i].ptGrip = ptPos;
|
|
m_pGripAppData[i].nColor = kBlue;
|
|
_tcscpy(m_pGripAppData[i].szTip,_T("编号夹点"));
|
|
_tcscpy(m_pGripAppData[i].szID,m_pPart->GetGUID());
|
|
m_pGripAppData[i].pOwner = (AcDbEntity*)this;
|
|
m_pGripAppData[i].idHost = objectId();
|
|
pGripData->setGripPoint(ptPos);
|
|
pGripData->setAppData((void*)&m_pGripAppData[i]);
|
|
pGripData->setWorldDraw(AecGripCback::WorldDrawfunc);
|
|
pGripData->setToolTipFunc(AecGripCback::GripToolTipFunc);
|
|
grips.append(pGripData);
|
|
|
|
i += 1;
|
|
|
|
//调用基类加入单击修改
|
|
SubAddHitEditGrip(grips);
|
|
}
|
|
|
|
if (sName.Find(_T("井")) != -1)
|
|
{
|
|
//增加一个修改夹点
|
|
double dCmd = PixelToWcs(20);
|
|
|
|
pt.x += dCmd;
|
|
pt.y += dCmd;
|
|
|
|
pGripData = new AcDbGripData;
|
|
memset(&m_pGripAppData[i],0,sizeof(AecGripData));
|
|
m_pGripAppData[i].nIndex = i;
|
|
m_pGripAppData[i].ePos = eFlag;//eEdit;
|
|
m_pGripAppData[i].ptGrip = pt;
|
|
m_pGripAppData[i].nColor = kGreen;
|
|
_tcscpy(m_pGripAppData[i].szTip,_T("修改夹点"));
|
|
_tcscpy(m_pGripAppData[i].szID,m_pPart->GetGUID());
|
|
m_pGripAppData[i].pOwner = (AcDbEntity*)this;
|
|
m_pGripAppData[i].idHost = objectId();
|
|
pGripData->setGripPoint(pt);
|
|
pGripData->setAppData((void*)&m_pGripAppData[i]);
|
|
pGripData->setWorldDraw(AecGripCback::WorldDrawfunc);
|
|
pGripData->setToolTipFunc(AecGripCback::GripToolTipFunc);
|
|
grips.append(pGripData);
|
|
|
|
//洞口 2
|
|
i+= 1;
|
|
AcGePoint3d ptPos;
|
|
if (!m_pPart->GetSpecialtyData()->GetAt(KEY_NOPOS,ptPos))
|
|
{
|
|
ptPos = GetOrgPoint();
|
|
}
|
|
ptPos.x -= dCmd;
|
|
ptPos.y -= dCmd;
|
|
|
|
pGripData = new AcDbGripData;
|
|
memset(&m_pGripAppData[i],0,sizeof(AecGripData));
|
|
m_pGripAppData[i].nIndex = i;
|
|
m_pGripAppData[i].ePos = eEnd;
|
|
m_pGripAppData[i].ptGrip = ptPos;
|
|
m_pGripAppData[i].nColor = kBlue;
|
|
_tcscpy(m_pGripAppData[i].szTip,_T("编号夹点"));
|
|
_tcscpy(m_pGripAppData[i].szID,m_pPart->GetGUID());
|
|
m_pGripAppData[i].pOwner = (AcDbEntity*)this;
|
|
m_pGripAppData[i].idHost = objectId();
|
|
pGripData->setGripPoint(ptPos);
|
|
pGripData->setAppData((void*)&m_pGripAppData[i]);
|
|
pGripData->setWorldDraw(AecGripCback::WorldDrawfunc);
|
|
pGripData->setToolTipFunc(AecGripCback::GripToolTipFunc);
|
|
grips.append(pGripData);
|
|
}
|
|
|
|
//动态标注
|
|
//直线,半径 标注风格
|
|
if (!grips.isEmpty())
|
|
{
|
|
SubAddDimPoints(grips,curViewDir);
|
|
}
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::SubAddDimPoints(AcDbGripDataPtrArray& grips,const AcGeVector3d& curViewDir) const
|
|
{
|
|
if (GetDimGripOff())
|
|
return Acad::eOk;
|
|
|
|
CString sName;
|
|
sName = GetName();
|
|
|
|
AcGePoint3d ptOrg = m_pPart->GetOrgPoint(true);
|
|
AcGePoint3d ptSta,ptEnd,ptMid;
|
|
int nShpae = 0;
|
|
GetSpecialtyData()->GetAt(_T("nShape"),nShpae);//方
|
|
|
|
AcGeVector3d vtZ(0,0,0);
|
|
AcGeVector3d vtX;
|
|
double dL = 0.0,dW = 0.0,dD = 0.0,dT = 0.0;
|
|
|
|
if ( sName.CompareNoCase(_T("开洞")) == 0)
|
|
{
|
|
|
|
if (nShpae == eRect)
|
|
{
|
|
GetSpecialtyData()->GetAt(_T("m_dL"),dL);//x
|
|
GetSpecialtyData()->GetAt(_T("m_dW"),dW);//z
|
|
GetSpecialtyData()->GetAt(_T("vtDir"),vtZ);
|
|
|
|
vtX = vtZ;
|
|
vtX.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
|
|
vtX.normalize();
|
|
|
|
ptSta = ptOrg;
|
|
ptEnd = ptOrg;
|
|
ptSta.z -= 0.5 * dL;
|
|
ptEnd.z -= 0.5 * dL;
|
|
ptSta -= vtX * 0.5 * dW;
|
|
ptEnd += vtX * 0.5 * dW;
|
|
ptMid = MidPoint(ptSta,ptEnd);
|
|
ptMid.z -= 10.0 * 100.0;
|
|
|
|
//X
|
|
AddDimPoints(grips,curViewDir,ptSta,ptEnd,ptMid,0);
|
|
|
|
ptSta = ptOrg;
|
|
ptEnd = ptOrg;
|
|
ptSta.z += 0.5 * dL;
|
|
ptEnd.z -= 0.5 * dL;
|
|
|
|
ptMid = MidPoint(ptSta,ptEnd);
|
|
ptMid -= vtX * 10.0 * 100.0;
|
|
|
|
//Z
|
|
AddDimPoints(grips,curViewDir,ptSta,ptEnd,ptMid,0);
|
|
}
|
|
else if (nShpae == eCircle)
|
|
{
|
|
GetSpecialtyData()->GetAt(_T("dRad"),dD);
|
|
GetSpecialtyData()->GetAt(_T("vtDir"),vtZ);
|
|
|
|
vtX = vtZ;
|
|
vtX.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
|
|
vtX.normalize();
|
|
|
|
ptSta = ptOrg - vtX * dD;
|
|
ptEnd = ptOrg + vtX * dD;
|
|
ptMid = MidPoint(ptSta,ptEnd);
|
|
ptMid.z += 10.0 * 100.0;
|
|
AddDimPoints(grips,curViewDir,ptSta,ptEnd,ptMid,2,2.0 * dD);
|
|
}
|
|
else
|
|
{
|
|
//异形
|
|
//...
|
|
}
|
|
}
|
|
else if (sName.CompareNoCase(_T("套管")) == 0)
|
|
{
|
|
if (nShpae == eCircle)
|
|
{
|
|
GetSpecialtyData()->GetAt(_T("dD"),dD);
|
|
GetSpecialtyData()->GetAt(_T("dT"),dT);
|
|
GetSpecialtyData()->GetAt(_T("vtDir"),vtZ);
|
|
|
|
vtX = vtZ;
|
|
vtX.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
|
|
vtX.normalize();
|
|
|
|
ptSta = ptOrg;
|
|
ptSta -= vtX * 0.5 * dD;
|
|
ptEnd = ptOrg;
|
|
ptEnd += vtX * 0.5 * dD;
|
|
ptMid = ptOrg;
|
|
ptMid.z += 10.0 * 100.0;
|
|
|
|
AddDimPoints(grips,curViewDir,ptSta,ptEnd,ptMid,4,dD,dT);
|
|
}
|
|
else if (nShpae == eRect)
|
|
{
|
|
GetSpecialtyData()->GetAt(_T("dH"),dL);
|
|
GetSpecialtyData()->GetAt(_T("dL"),dW);
|
|
GetSpecialtyData()->GetAt(_T("dT"),dT);
|
|
GetSpecialtyData()->GetAt(_T("vtDir"),vtZ);
|
|
|
|
vtX = vtZ;
|
|
vtX.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
|
|
vtX.normalize();
|
|
|
|
ptSta = ptOrg;
|
|
ptEnd = ptOrg;
|
|
ptSta.z -= 0.5 * dL;
|
|
ptEnd.z -= 0.5 * dL;
|
|
ptSta -= vtX * 0.5 * dW;
|
|
ptEnd += vtX * 0.5 * dW;
|
|
ptMid = MidPoint(ptSta,ptEnd);
|
|
ptMid.z -= 10.0 * 100.0;
|
|
|
|
//X
|
|
AddDimPoints(grips,curViewDir,ptSta,ptEnd,ptMid,0);
|
|
|
|
ptSta = ptOrg;
|
|
ptEnd = ptOrg;
|
|
ptSta.z += 0.5 * dL;
|
|
ptEnd.z -= 0.5 * dL;
|
|
|
|
ptMid = MidPoint(ptSta,ptEnd);
|
|
ptMid -= vtX * 10.0 * 100.0;
|
|
|
|
//Z
|
|
AddDimPoints(grips,curViewDir,ptSta,ptEnd,ptMid,0);
|
|
}
|
|
else
|
|
{
|
|
//...
|
|
}
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::AddDimPoints(AcDbGripDataPtrArray& grips,const AcGeVector3d& curViewDir,
|
|
const AcGePoint3d& ptSta,const AcGePoint3d& ptEnd,
|
|
const AcGePoint3d& ptMid,int nDimType,double dVal/* = -1.0*/,
|
|
double dt) const
|
|
{
|
|
int i = grips.length();
|
|
if (i >= GRIP_MAXNUM)//多余不显示
|
|
return Acad::eOk;
|
|
|
|
EPosition ePos = eDim0;
|
|
memset(&m_pGripAppData[i],0,sizeof(AecGripData));
|
|
|
|
m_pGripAppData[i].nIndex = i;
|
|
m_pGripAppData[i].ePos = ePos;
|
|
m_pGripAppData[i].nColor = kGreen;
|
|
m_pGripAppData[i].ptGrip = ptMid;
|
|
m_pGripAppData[i].ptDim[0] = ptSta;
|
|
m_pGripAppData[i].ptDim[1] = ptEnd;
|
|
m_pGripAppData[i].nDimType = nDimType;
|
|
|
|
if (dVal > 1.e-3)
|
|
{
|
|
if (nDimType == 1)
|
|
{
|
|
_stprintf(m_pGripAppData[i].szTip,_T("R%.1f"),dVal);
|
|
}
|
|
else if (nDimType == 2)//@100 标注
|
|
{
|
|
_stprintf(m_pGripAppData[i].szTip,_T("Ø%.1f"),dVal);
|
|
}
|
|
else if (nDimType == 3)//角度标注
|
|
{
|
|
_stprintf(m_pGripAppData[i].szTip,_T("%.1f°"),dVal);
|
|
}
|
|
else if (nDimType == 4)//@107x3.5
|
|
{
|
|
_stprintf(m_pGripAppData[i].szTip,_T("Ø%.1fx%.1f"),dVal,dt);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_tcscpy(m_pGripAppData[i].szTip,_T(" "));
|
|
}
|
|
_tcscpy(m_pGripAppData[i].szID,_T(" "));
|
|
m_pGripAppData[i].pOwner = (AcDbEntity*)this;
|
|
|
|
AcDbGripData* pGripData = new AcDbGripData;
|
|
pGripData->setGripPoint(ptMid);
|
|
pGripData->setAppData((void*)&m_pGripAppData[i]);
|
|
pGripData->setWorldDraw(AecGripCback::WorldDrawfunc);
|
|
pGripData->setToolTipFunc(AecGripCback::GripToolTipFunc);
|
|
grips.append(pGripData);
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::subMoveGripPointsAt(const AcDbVoidPtrArray& appData, const AcGeVector3d& offset, const int bitflags)
|
|
{
|
|
if (!appData.isEmpty())
|
|
{
|
|
if (HitOnGripEdit(appData))
|
|
{
|
|
return Acad::eOk;
|
|
}
|
|
|
|
CString sName;
|
|
m_pPart->GetName(sName);
|
|
|
|
AecGripData* pAppData = NULL;
|
|
pAppData = (AecGripData*)appData.first();
|
|
|
|
if (pAppData->nIndex == 0)
|
|
{
|
|
AssertWriteEnabled();
|
|
|
|
AddMove(offset);
|
|
|
|
AcGeMatrix3d xform;
|
|
xform.setToTranslation(offset);
|
|
m_drawable2d.transformBy(xform);
|
|
|
|
AcDbObjectId idHost;
|
|
m_pPart->GetSpecialtyData()->GetAt(KEY_ASSOIC,idHost);
|
|
|
|
//reset
|
|
GripMessage msg;
|
|
memset(&msg,0,sizeof(GripMessage));
|
|
msg.nSegindex = -1;
|
|
msg.nType = -1;
|
|
msg.pParam = 0;
|
|
msg.nData = -1;
|
|
_tcscpy(msg.szLockId, _T("0"));//锁定id,如果有
|
|
msg.fData = 0;
|
|
msg.nSegindex = 0;
|
|
msg.nSubSegIndex = 0;
|
|
msg.vtOffset.set(0,0,0);
|
|
msg.ptGrip.set(0,0,0);
|
|
|
|
//发送调整通知命令
|
|
msg.nType = eAdjust0;
|
|
msg.nData = 0;
|
|
msg.ptGrip = pAppData->ptGrip;
|
|
msg.idHost = idHost;//pAppData->idHost;
|
|
msg.vtOffset = offset;
|
|
|
|
Create();
|
|
|
|
PushGripMessage(msg);
|
|
}
|
|
else
|
|
{
|
|
if (sName.CompareNoCase(_T("套管")) == 0 ||
|
|
sName.CompareNoCase(_T("开洞")) == 0)
|
|
{
|
|
if (pAppData->nIndex < 2 )
|
|
{
|
|
AecInterface inf;
|
|
GripMessage msg;
|
|
memset(&msg,0,sizeof(GripMessage));
|
|
//reset
|
|
msg.nSegindex = -1;
|
|
msg.nType = -1;
|
|
msg.idHost.setNull();
|
|
msg.pParam = 0;
|
|
msg.nData = -1;
|
|
_tcscpy(msg.szLockId, _T("0"));//锁定id,如果有
|
|
msg.fData = 0;
|
|
msg.nSegindex = 0;
|
|
msg.nSubSegIndex = 0;
|
|
msg.vtOffset.set(0,0,0);
|
|
msg.ptGrip.set(0,0,0);
|
|
|
|
//发送绘制管子命令
|
|
msg.nType = eCommand0;
|
|
msg.nData = 0;
|
|
GetInterface(msg.nData,inf);
|
|
|
|
msg.ptGrip = inf.ptPos;
|
|
msg.idHost = pAppData->idHost;
|
|
msg.vtOffset = offset;
|
|
|
|
PushGripMessage(msg);
|
|
|
|
static CString sCmd = _T("PL_wpipeadd ");
|
|
if (!sCmd.IsEmpty())
|
|
{
|
|
acedPostCommand(_T("\x03"));
|
|
acedPostCommand(sCmd);
|
|
}
|
|
}
|
|
else if (pAppData->nIndex == 2)
|
|
{
|
|
AcGePoint3d ptOn;
|
|
if ( !m_pPart->GetSpecialtyData()->GetAt(KEY_NOPOS,ptOn) )
|
|
{
|
|
ptOn = GetOrgPoint();
|
|
}
|
|
ptOn += offset;
|
|
m_pPart->GetSpecialtyData()->SetAt(KEY_NOPOS,ptOn);
|
|
}
|
|
}
|
|
else if (sName.Find(_T("井")) != -1)
|
|
{
|
|
GripMessage msg;
|
|
memset(&msg,0,sizeof(GripMessage));
|
|
//reset
|
|
msg.nSegindex = -1;
|
|
msg.nType = -1;
|
|
msg.idHost.setNull();
|
|
msg.pParam = 0;
|
|
msg.nData = -1;
|
|
_tcscpy(msg.szLockId, _T("0"));//锁定id,如果有
|
|
msg.fData = 0;
|
|
msg.nSegindex = 0;
|
|
msg.nSubSegIndex = 0;
|
|
msg.vtOffset.set(0,0,0);
|
|
msg.ptGrip.set(0,0,0);
|
|
|
|
msg.nType = eFlag;//eEdit;
|
|
msg.nData = 0;
|
|
|
|
msg.ptGrip = pAppData->ptGrip;
|
|
msg.idHost = pAppData->idHost;
|
|
msg.vtOffset = offset;
|
|
|
|
PushGripMessage(msg);
|
|
|
|
static CString sCmd = _T("PL_WellModify ");
|
|
if (!sCmd.IsEmpty())
|
|
{
|
|
acedPostCommand(_T("\x03"));
|
|
acedPostCommand(sCmd);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::subGetStretchPoints(AcGePoint3dArray& stretchPoints) const
|
|
{
|
|
assertReadEnabled();
|
|
|
|
AcGePoint3d pt = m_pPart->GetOrgPoint(true);
|
|
stretchPoints.append(pt);
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::subMoveStretchPointsAt(const AcDbIntArray& indices,const AcGeVector3d& offset)
|
|
{
|
|
AssertWriteEnabled();
|
|
|
|
if (!indices.isEmpty())
|
|
{
|
|
int nIndex = indices.first();
|
|
if (nIndex == 0)
|
|
{
|
|
AddMove(offset);
|
|
|
|
m_pPart->Transformby((AcGeVector3d&)offset);
|
|
m_pPart->Create();
|
|
|
|
AcGeMatrix3d xform;
|
|
xform.setToTranslation(offset);
|
|
m_drawable2d.transformBy(xform);
|
|
|
|
Create();
|
|
|
|
AcGePoint3d ptPos;
|
|
m_pPart->GetSpecialtyData()->GetAt(KEY_NOPOS,ptPos);
|
|
ptPos += offset;
|
|
m_pPart->GetSpecialtyData()->SetAt(KEY_NOPOS,ptPos);
|
|
}
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
|
|
void AecDbX3dPartEntity::GetGripText(int nPos, CString& sText)
|
|
{
|
|
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::subGetOsnapPoints(AcDb::OsnapMode osnapMode,
|
|
INT_PTR gsSelectionMark,
|
|
const AcGePoint3d& pickPoint,
|
|
const AcGePoint3d& lastPoint,
|
|
const AcGeMatrix3d& viewXform,
|
|
AcGePoint3dArray& snapPoints,
|
|
AcDbIntArray& geomIds) const
|
|
{
|
|
assertReadEnabled();
|
|
snapPoints.append(GetOrgPoint(true));
|
|
return m_pPart->getOsnapPoints(osnapMode,gsSelectionMark,pickPoint,lastPoint,viewXform,snapPoints,geomIds);
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::subGetGeomExtents(AcDbExtents& extents) const
|
|
{
|
|
assertReadEnabled();
|
|
|
|
AcDb3dSolid* pSolid = m_pPart->CreateDraw3dSolid();
|
|
if (pSolid != NULL)
|
|
{
|
|
pSolid->getGeomExtents(extents);
|
|
delete pSolid;
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::subIntersectWith( const AcDbEntity* pEnt,
|
|
AcDb::Intersect intType,
|
|
AcGePoint3dArray& points,
|
|
INT_PTR thisGsMarker,
|
|
INT_PTR otherGsMarker) const
|
|
{
|
|
assertReadEnabled();
|
|
|
|
AcDb3dSolid* pSolid = m_pPart->CreateDraw3dSolid();
|
|
if (pSolid != NULL)
|
|
{
|
|
pSolid->intersectWith(pEnt,intType,points,thisGsMarker,otherGsMarker);
|
|
delete pSolid;
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::subIntersectWith( const AcDbEntity* pEnt,
|
|
AcDb::Intersect intType,
|
|
const AcGePlane& projPlane,
|
|
AcGePoint3dArray& points,
|
|
INT_PTR thisGsMarker,
|
|
INT_PTR otherGsMarker) const
|
|
{
|
|
AcDb3dSolid* pSolid = m_pPart->CreateDraw3dSolid();
|
|
if (pSolid != NULL)
|
|
{
|
|
pSolid->intersectWith(pEnt,intType,projPlane,points,thisGsMarker,otherGsMarker);
|
|
delete pSolid;
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
#endif
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::Draw2d(AcGiDraw &dc) const
|
|
{
|
|
assertReadEnabled();
|
|
|
|
if (m_pPart != NULL)
|
|
{
|
|
AcDbObjectId idCur = dc.GetLayerId();
|
|
dc.SetLayer(layerId());
|
|
|
|
if (!Draw2DBuffers(dc))
|
|
{
|
|
AcGePoint3d ptOrg = m_pPart->GetOrgPoint(true);
|
|
|
|
//绘制十字定位,大小
|
|
double dCmd = 50.0;
|
|
|
|
AcGePoint3d ptGe[2];
|
|
ptGe[0] = ptOrg;
|
|
ptGe[0] -= AcGeVector3d::kXAxis * 0.5 * dCmd;
|
|
ptGe[1] = ptGe[0] + dCmd * AcGeVector3d::kXAxis;
|
|
|
|
AcDbLine *pLn = new AcDbLine(ptGe[0], ptGe[1]);
|
|
dc.DrawEntity(pLn);
|
|
Add2DBuffer(pLn);
|
|
|
|
ptGe[0] = ptOrg;
|
|
ptGe[0] -= AcGeVector3d::kYAxis * 0.5 * dCmd;
|
|
ptGe[1] = ptGe[0] + dCmd * AcGeVector3d::kYAxis;
|
|
|
|
pLn = new AcDbLine(ptGe[0], ptGe[1]);
|
|
dc.DrawEntity(pLn);
|
|
Add2DBuffer(pLn);
|
|
|
|
AcDbVoidPtrArray arDraw2d;
|
|
DrawSymbol2d(dc, arDraw2d);
|
|
|
|
Add2DBuffer(arDraw2d);
|
|
}
|
|
|
|
//绘制编号
|
|
CString sLable = GetLabel();
|
|
CString sName = GetName();
|
|
|
|
BOOL bHideNo = FALSE;
|
|
GetSpecialtyData()->GetAt(KEY_HIDENO,bHideNo);
|
|
|
|
sLable.TrimRight(_T(" "));
|
|
if (!sLable.IsEmpty() && !bHideNo )
|
|
{
|
|
DrawLabel(dc,sLable);
|
|
}
|
|
|
|
dc.SetLayer(idCur);
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::DrawSymbol2d(AcGiDraw &dc,AcDbVoidPtrArray& arBuffer2d) const
|
|
{
|
|
AecComplexCurve curEdage;
|
|
m_drawable2d.GetEdage(curEdage);
|
|
|
|
AecComplexCurve curCurve, curLoop;
|
|
for (int i = 0;i < curEdage.length();i++)
|
|
{
|
|
const AecEqui::AecCurveElement &el = curEdage.at(i);
|
|
if (el.gsMark == HATCH_LOOP)
|
|
{
|
|
curLoop.append(el);
|
|
}
|
|
else
|
|
{
|
|
curCurve.append(el);
|
|
}
|
|
}
|
|
|
|
if (curCurve.length() > 0)
|
|
{
|
|
AecComplexCurveDraw drawable2d;
|
|
drawable2d.SetEdage(curCurve);
|
|
drawable2d.Draw2d(dc, dc.GetLayerId(), dc.GetLineTypeId(), dc.GetLineTypeId());
|
|
drawable2d.explode(arBuffer2d, dc.GetLayerId(), dc.GetLineTypeId(), dc.GetLineTypeId());
|
|
}
|
|
|
|
//绘制填充,如人孔等
|
|
if (curLoop.length() > 0)
|
|
{
|
|
AcDbCurve *pCurve = NULL;
|
|
AcDbVoidPtrArray arCurPtrs,arRes;
|
|
for (int i = 0;i < curLoop.length();i++)
|
|
{
|
|
pCurve = curLoop.segat(i);
|
|
if (pCurve != NULL)
|
|
{
|
|
arCurPtrs.append(pCurve);
|
|
}
|
|
}
|
|
|
|
pCurve = KTCADUtilityEx::ConvertBoundCurve(arCurPtrs, arRes);
|
|
AcDbPolyline *pPl = AcDbPolyline::cast(pCurve);
|
|
if (pPl != NULL)
|
|
{
|
|
CString sPattern = _T("SOLID");
|
|
const AecDbObjXDataMap *pXData = GetSpecialtyData();
|
|
if (pXData != NULL)
|
|
{
|
|
pXData->GetAt(KEY_PATTERN, sPattern);
|
|
}
|
|
|
|
arRes.removeAll();
|
|
PolylineHatch(pPl, arRes, sPattern, AcGeVector3d::kZAxis);
|
|
|
|
AcDbEntity *pEnt = NULL;
|
|
for(int i = 0;i < arRes.length();i++)
|
|
{
|
|
pEnt = (AcDbEntity*)arRes.at(i);
|
|
dc.DrawEntity(pEnt);
|
|
}
|
|
arBuffer2d.append(arRes);
|
|
}
|
|
}
|
|
|
|
CString sRxDraw;
|
|
if ( GetSpecialtyData()->GetAt(KEY_DRAW2D,sRxDraw) )
|
|
{
|
|
AecDbXDrawPointer aecDbXDraw(this,sRxDraw);
|
|
aecDbXDraw.Draw2d(dc);
|
|
|
|
AcDbVoidPtrArray arEntPtrs;
|
|
dc.Get2dBuffer(arEntPtrs);
|
|
Add2DBuffer(arEntPtrs);
|
|
}
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
int AecDbX3dPartEntity::GetDraw2dables(Adesk::UInt16 nDrawStyle, AcDbVoidPtrArray& arEntPtrs) const
|
|
{
|
|
assertReadEnabled();
|
|
|
|
if (m_pPart != NULL)
|
|
{
|
|
AcGePoint3d ptOrg = m_pPart->GetOrgPoint(true);
|
|
|
|
//绘制十字定位,大小
|
|
double dCmd = PixelToWcs(3);
|
|
|
|
AecDbObjXDataMap xData;
|
|
const AecDbObjXDataMap* pXData = GetSpecialtyData();
|
|
if (pXData != NULL)
|
|
{
|
|
CString sName = GetName();
|
|
xData.CopyFrom(pXData);
|
|
xData.SetAt(KEY_NAME,sName);
|
|
xData.SetAt(KEY_ORGPT,ptOrg);
|
|
}
|
|
|
|
AcGePoint3d ptGe[2];
|
|
ptGe[0] = ptOrg;
|
|
ptGe[0] -= AcGeVector3d::kXAxis * 0.5 * dCmd;
|
|
ptGe[1] = ptGe[0] + dCmd * AcGeVector3d::kXAxis;
|
|
|
|
AcGeLineSeg3d ln3d(ptGe[0],ptGe[1]);
|
|
AcDbLine* pLn1 = new AcDbLine(ptGe[0],ptGe[1]);
|
|
//xData.Write(pLn1,BIMDATA_APP);
|
|
|
|
int nIndex = arEntPtrs.length();
|
|
arEntPtrs.append(pLn1);
|
|
|
|
ptGe[0] = ptOrg;
|
|
ptGe[0] -= AcGeVector3d::kYAxis * 0.5 * dCmd;
|
|
ptGe[1] = ptGe[0] + dCmd * AcGeVector3d::kYAxis;
|
|
|
|
ln3d.set(ptGe[0],ptGe[1]);
|
|
pLn1 = new AcDbLine(ptGe[0],ptGe[1]);
|
|
//xData.Write(pLn1,BIMDATA_APP);
|
|
arEntPtrs.append(pLn1);
|
|
|
|
AcGiExplodeDraw dc(arEntPtrs);
|
|
DrawSymbol2d(dc, arEntPtrs);
|
|
|
|
//洞口或套管写标高
|
|
AecInterface inf;
|
|
if ( GetInterface(0,inf) )
|
|
{
|
|
if (inf.vtDir.isParallelTo(AcGeVector3d::kZAxis))
|
|
{
|
|
xData.SetAt(KEY_CENEL,inf.ptPos.z);
|
|
}
|
|
else
|
|
{
|
|
if (inf.nSectType == eCircle)
|
|
{
|
|
xData.SetAt(KEY_CENEL,inf.ptPos.z);
|
|
}
|
|
else
|
|
{
|
|
xData.SetAt(KEY_BOTMEL,inf.ptPos.z - 0.5 * inf.dSize2);
|
|
}
|
|
}
|
|
}
|
|
|
|
AcDbEntity* pEnt = NULL;
|
|
for (int ii = nIndex;ii < arEntPtrs.length();ii++)
|
|
{
|
|
pEnt = (AcDbEntity*)arEntPtrs.at(ii);
|
|
pEnt->setLayer(layerId());
|
|
xData.Write(pEnt,BIMDATA_APP);
|
|
}
|
|
|
|
//绘制编号
|
|
CString sLable = GetLabel();
|
|
sLable.TrimRight(_T(" "));
|
|
if (!sLable.IsEmpty())
|
|
{
|
|
AcGiExplodeDraw dc(arEntPtrs);
|
|
DrawLabel(dc,sLable);
|
|
}
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
|
|
#include "HlrCutOption.h"
|
|
void AecDbX3dPartEntity::ProcessHlrResult(const AcArray<AcDbEntity*> &ar
|
|
, const std::map<AcDbEntity*, AcArray<AcDbEntity*>> &preAr
|
|
, AcArray<AcDbEntity *> &output) const
|
|
{
|
|
assertReadEnabled();
|
|
// 补充xdata内的数据
|
|
if (m_pPart == NULL) return;
|
|
if (ar.isEmpty() && preAr.empty()) return;
|
|
|
|
AcGePoint3d ptOrg = m_pPart->GetOrgPoint(true);
|
|
AecDbObjXDataMap xData;
|
|
const AecDbObjXDataMap *pXData = GetSpecialtyData();
|
|
if (pXData != NULL)
|
|
{
|
|
CString sName = GetName();
|
|
xData.CopyFrom(pXData);
|
|
xData.SetAt(KEY_NAME, sName);
|
|
xData.SetAt(KEY_ORGPT, ptOrg);
|
|
}
|
|
|
|
//洞口或套管写标高
|
|
AecInterface inf;
|
|
if (GetInterface(0, inf))
|
|
{
|
|
if (inf.vtDir.isParallelTo(AcGeVector3d::kZAxis))
|
|
{
|
|
xData.SetAt(KEY_CENEL, inf.ptPos.z);
|
|
}
|
|
else
|
|
{
|
|
if (inf.nSectType == eCircle)
|
|
{
|
|
xData.SetAt(KEY_CENEL, inf.ptPos.z);
|
|
}
|
|
else
|
|
{
|
|
xData.SetAt(KEY_BOTMEL, inf.ptPos.z - 0.5 * inf.dSize2);
|
|
}
|
|
}
|
|
}
|
|
|
|
HlrCutOption::ProcessHlrResult(this, FALSE, .0, FALSE, ar, preAr, output, &xData);
|
|
}
|
|
|
|
void AecDbX3dPartEntity::PreprocessForHlr(const AcGePoint3d &ptPlnO
|
|
, const AcGeVector3d &vtPlnN
|
|
, AcArray<AcDbEntity *> &ar) const
|
|
{
|
|
assertReadEnabled();
|
|
if (m_pPart == NULL) return;
|
|
|
|
if (!HlrCutOption::getHlrSTYLE2D_HOLE()) return;
|
|
|
|
// 没有洞口方向,直接走3D
|
|
AcGeVector3d vtZ;
|
|
if (!m_pPart->GetSpecialtyData()->GetAt(_T("vtDir"), vtZ)) return;
|
|
|
|
// 水平剖切 GetDraw2dables,洞口方向 平行剖面,或者垂直剖面
|
|
if (vtPlnN.isParallelTo(AcGeVector3d::kZAxis)
|
|
&& (vtZ.isPerpendicularTo(vtPlnN) || vtZ.isParallelTo(vtZ)))
|
|
{
|
|
AcDbVoidPtrArray arEnts;
|
|
GetDraw2dables(0, arEnts);
|
|
for (int i(0); i < arEnts.length(); ++i)
|
|
{
|
|
ar.append((AcDbEntity *)arEnts[i]);
|
|
}
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::SetLabel(const TCHAR* pszLab)
|
|
{
|
|
assertWriteEnabled();
|
|
|
|
if (pszLab != NULL)
|
|
{
|
|
m_pPart->GetSpecialtyData()->SetAt(KEY_NO,pszLab);
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
|
|
CString AecDbX3dPartEntity::GetLabel() const
|
|
{
|
|
assertReadEnabled();
|
|
|
|
CString sLab;
|
|
m_pPart->GetSpecialtyData()->GetAt(KEY_NO,sLab);
|
|
return sLab;
|
|
}
|
|
|
|
BOOL DLLIMPEXP GetDocScale(double& dPScale)
|
|
{
|
|
//获取初始化数据
|
|
dPScale = 100.0;
|
|
AecDbObjXDataMap xDataMap;
|
|
KTModelLayoutXData::ReSet(xDataMap);
|
|
|
|
if (!KTModelLayoutXData::ReadModelXData(KT_PIPEINIT,xDataMap))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
CString sDocScale = "";
|
|
xDataMap.GetAt(_T("Scale"),sDocScale);
|
|
int nIndex = sDocScale.Find(':',0);
|
|
dPScale = 1.0;
|
|
if (nIndex != -1)
|
|
{
|
|
dPScale = _ttof(sDocScale.Mid(nIndex + 1)) / _ttof(sDocScale.Mid(0,nIndex));
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL DLLIMPEXP GetDimGripOff()
|
|
{
|
|
AecDbObjXDataMap xDataMap;
|
|
KTModelLayoutXData::ReSet(xDataMap);
|
|
|
|
if (!KTModelLayoutXData::ReadModelXData(KT_PIPEINIT,xDataMap))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL bDimGripOff = FALSE;
|
|
xDataMap.GetAt(KEY_DIMGRIPOFF,bDimGripOff);
|
|
|
|
return bDimGripOff;
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::DrawLabel(AcGiDraw &dc,LPCTSTR pszLab) const
|
|
{
|
|
BOOL bHideNo = FALSE;
|
|
m_pPart->GetSpecialtyData()->GetAt(KEY_HIDENO,bHideNo);
|
|
if (bHideNo)
|
|
return Acad::eOk;
|
|
|
|
AcDbObjectId id = acdbCurDwg()->textstyle();
|
|
|
|
AcDbText* pText = new AcDbText;
|
|
pText->setTextStyle(id);
|
|
pText->setLayer(layerId());
|
|
pText->setWidthFactor(0.75);
|
|
double dScale = 100.0;
|
|
GetDocScale(dScale);
|
|
|
|
pText->setHeight(2.5 * dScale);
|
|
pText->setTextString(pszLab);
|
|
|
|
AcGePoint3d ptOn = GetOrgPoint();
|
|
if (!m_pPart->GetSpecialtyData()->GetAt(KEY_NOPOS,ptOn) )
|
|
{
|
|
ptOn = GetOrgPoint();
|
|
}
|
|
|
|
pText->setPosition(ptOn);
|
|
pText->setHorizontalMode(AcDb::kTextCenter);
|
|
pText->setAlignmentPoint(ptOn);
|
|
|
|
dc.DrawEntity(*pText);
|
|
|
|
delete pText;//?
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::Draw3d(AcGiDraw &dc) const
|
|
{
|
|
assertReadEnabled();
|
|
|
|
if (Has3DBuffer())
|
|
{
|
|
AcDbEntity* pEnt = NULL;
|
|
const AcDbVoidPtrArray &ar3D = Get3DBuffer();
|
|
for (int i = 0;i < ar3D.length();i++)
|
|
{
|
|
pEnt = (AcDbEntity*)ar3D.at(i);
|
|
dc.DrawEntity(*pEnt);
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
|
|
AcCmTransparency tr = transparency();
|
|
AcCmTransparency oldTr = dc.SetTransparency(tr);
|
|
|
|
if (m_pPart != NULL)
|
|
{
|
|
if (m_pPart->GetBoolOperFor() == AcDb::kBoolUnite)
|
|
{
|
|
m_pPart->Draw3d(dc);
|
|
m_pPart->DrawInf(dc);
|
|
|
|
AcDb3dSolid* pSolid = m_pPart->CreateDraw3dSolid();
|
|
if (pSolid != NULL)
|
|
{
|
|
Add3DBuffer(pSolid);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//绘制中间一个球体 示意
|
|
AcGePoint3d ptOrg = m_pPart->GetOrgPoint(true);
|
|
AcDbEntity* p3dEnt = dc.DrawSphere(ptOrg,10.0);
|
|
if (p3dEnt != NULL)
|
|
{
|
|
Add3DBuffer(p3dEnt);
|
|
}
|
|
}
|
|
}
|
|
dc.SetTransparency(oldTr);
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::dwgInFields (AcDbDwgFiler* pFiler)
|
|
{
|
|
AssertWriteEnabled();
|
|
|
|
//----- Read parent class information first.
|
|
Acad::ErrorStatus es = Acad::eOk;
|
|
if ( !pFiler->isKindOf(CMFCDbDwgFiler::desc()))
|
|
{
|
|
es = AecDbEntityBase::dwgInFields (pFiler) ;
|
|
if ( es != Acad::eOk )
|
|
return (es) ;
|
|
}
|
|
|
|
//----- Object version number needs to be read first
|
|
Adesk::UInt32 version =0 ;
|
|
if ( (es = pFiler->readUInt32 (&version)) != Acad::eOk )
|
|
return (es) ;
|
|
|
|
if ( version > AecDbX3dPartEntity::kCurrentVersionNumber )
|
|
return (Acad::eMakeMeProxy) ;
|
|
|
|
m_pPart->dwgInFields(pFiler);
|
|
m_pPart->Create();
|
|
|
|
m_drawable2d.dwgInFields(pFiler, version);
|
|
|
|
return (pFiler->filerStatus ());
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::dwgOutFields(AcDbDwgFiler* pFiler) const
|
|
{
|
|
assertReadEnabled();
|
|
|
|
//----- Save parent class information first.
|
|
Acad::ErrorStatus es = Acad::eOk;
|
|
if ( !pFiler->isKindOf(CMFCDbDwgFiler::desc()))
|
|
{
|
|
es = AecDbEntityBase::dwgOutFields (pFiler) ;
|
|
if ( es != Acad::eOk )
|
|
return (es) ;
|
|
}
|
|
|
|
//----- Object version number needs to be saved first
|
|
if ( (es =pFiler->writeUInt32 (AecDbX3dPartEntity::kCurrentVersionNumber)) != Acad::eOk )
|
|
return (es) ;
|
|
|
|
m_pPart->dwgOutFields(pFiler);
|
|
m_drawable2d.dwgOutFields(pFiler, AecDbX3dPartEntity::kCurrentVersionNumber);
|
|
|
|
return (pFiler->filerStatus ());
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::dxfInFields (AcDbDxfFiler* pFiler)
|
|
{
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::dxfOutFields(AcDbDxfFiler* pFiler) const
|
|
{
|
|
return Acad::eOk;
|
|
}
|
|
|
|
void AecDbX3dPartEntity::AssertWriteEnabled(Adesk::Boolean autoUndo, Adesk::Boolean recordModified )
|
|
{
|
|
//if (objectId().isValid())
|
|
{
|
|
Clean3DBuffer();
|
|
//FreeBuffer(0,m_ar2DDrableBufPtrs);
|
|
//FreeBuffer(0,m_ar3DDrableBufPtrs);
|
|
//FreeBuffer(0,m_ar2DDrableBufPtrs2);
|
|
|
|
//m_ar3DDrableBufPtrs.removeAll();
|
|
//m_ar2DDrableBufPtrs.removeAll();
|
|
//m_ar2DDrableBufPtrs2.removeAll();
|
|
|
|
AecDbEntityBase::AssertWriteEnabled(autoUndo, recordModified);
|
|
//assertWriteEnabled();
|
|
}
|
|
}
|
|
|
|
bool AecDbX3dPartEntity::GetInterface(AcArray<AecInterface>& arInfs) const
|
|
{
|
|
assertReadEnabled();
|
|
|
|
CString sName;
|
|
m_pPart->GetName(sName);
|
|
|
|
if (sName.CompareNoCase(_T("开洞")) == 0)
|
|
{
|
|
int nShap = 0;
|
|
m_pPart->GetSpecialtyData()->GetAt(_T("nShape"),nShap);//圆
|
|
if (nShap == (int)eCircle)
|
|
{
|
|
double dH = 0.0,dRad = 0.0,dEl = 0.0;
|
|
m_pPart->GetSpecialtyData()->GetAt(_T("dH"),dH);
|
|
m_pPart->GetSpecialtyData()->GetAt(_T("dRad"),dRad);
|
|
m_pPart->GetSpecialtyData()->GetAt(_T("m_dZ"),dEl);
|
|
AcGePoint3d ptCen = m_pPart->GetOrgPoint(true);
|
|
|
|
AcGeVector3d vtZ;
|
|
m_pPart->GetSpecialtyData()->GetAt(_T("vtDir"),vtZ);
|
|
|
|
AecInterface inf;
|
|
inf.dGasket = 0;
|
|
inf.nSectType = eCircle;
|
|
inf.dSize1 = 2.0 * dRad;//DN
|
|
inf.dSize2 = 2.0 * dRad;//DN
|
|
inf.ptPos = ptCen;
|
|
inf.vtDir = vtZ;
|
|
arInfs.append(inf);
|
|
}
|
|
else if (nShap == (int)eRect)
|
|
{
|
|
double dL = 0.0,dW = 0.0,dH = 0.0;
|
|
m_pPart->GetSpecialtyData()->GetAt(_T("dL"),dL);
|
|
m_pPart->GetSpecialtyData()->GetAt(_T("dW"),dW);
|
|
m_pPart->GetSpecialtyData()->GetAt(_T("dH"),dH);
|
|
|
|
AcGePoint3d ptCen = m_pPart->GetOrgPoint(true);
|
|
|
|
AcGeVector3d vtZ;
|
|
m_pPart->GetSpecialtyData()->GetAt(_T("vtDir"),vtZ);
|
|
|
|
AecInterface inf;
|
|
inf.dGasket = 0;
|
|
inf.nSectType = eRect;
|
|
inf.dSize1 = dL;
|
|
inf.dSize2 = dW;
|
|
inf.ptPos = ptCen;
|
|
inf.vtDir = vtZ;
|
|
arInfs.append(inf);
|
|
}
|
|
}
|
|
else if (sName.CompareNoCase(_T("套管")) == 0)
|
|
{
|
|
int nShap = 0;
|
|
m_pPart->GetSpecialtyData()->GetAt(_T("nShape"),nShap);//圆
|
|
if (nShap == eCircle)
|
|
{
|
|
double dD = 0.0,dT = 0.0;
|
|
AcGeVector3d vtZ;
|
|
m_pPart->GetSpecialtyData()->GetAt(_T("dD"),dD);
|
|
m_pPart->GetSpecialtyData()->GetAt(_T("dT"),dT);
|
|
m_pPart->GetSpecialtyData()->GetAt(_T("vtDir"),vtZ);
|
|
|
|
AcGePoint3d ptCen = m_pPart->GetOrgPoint(true);
|
|
|
|
AecInterface inf;
|
|
inf.dGasket = 0;
|
|
inf.dSize1 = dD;//DN
|
|
inf.dSize2 = dD;//DN
|
|
inf.ptPos = ptCen;
|
|
inf.vtDir = vtZ;
|
|
inf.nSectType = eCircle;
|
|
arInfs.append(inf);
|
|
}
|
|
else if (nShap == eRect)
|
|
{
|
|
double dL = 0.0,dW = 0.0,dT = 0.0;
|
|
AcGeVector3d vtZ;
|
|
|
|
m_pPart->GetSpecialtyData()->GetAt(_T("dH"),dL);
|
|
m_pPart->GetSpecialtyData()->GetAt(_T("dL"),dW);
|
|
m_pPart->GetSpecialtyData()->GetAt(_T("vtDir"),vtZ);
|
|
|
|
AcGePoint3d ptCen = m_pPart->GetOrgPoint(true);
|
|
|
|
AecInterface inf;
|
|
inf.dGasket = 0;
|
|
inf.dSize1 = dL;
|
|
inf.dSize2 = dW;//DN
|
|
inf.ptPos = ptCen;
|
|
inf.vtDir = vtZ;
|
|
inf.nSectType = eRect;
|
|
arInfs.append(inf);
|
|
}
|
|
}
|
|
return !arInfs.isEmpty();
|
|
}
|
|
|
|
bool AecDbX3dPartEntity::GetInterface(int nIndex,AecInterface& inf) const
|
|
{
|
|
assertReadEnabled();
|
|
|
|
AcArray<AecInterface> arInfs;
|
|
GetInterface(arInfs);
|
|
|
|
if (nIndex > -1 && nIndex < arInfs.length())
|
|
{
|
|
inf = arInfs.at(nIndex);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
int AecDbX3dPartEntity::GetInterfaceCount() const
|
|
{
|
|
assertReadEnabled();
|
|
AcArray<AecInterface> arInfs;
|
|
GetInterface(arInfs);
|
|
|
|
return arInfs.length();
|
|
}
|
|
|
|
int AecDbX3dPartEntity::GetActiveInf() const
|
|
{
|
|
assertReadEnabled();
|
|
return -1;
|
|
}
|
|
|
|
void AecDbX3dPartEntity::SetActiveInf(int nIndex)
|
|
{
|
|
|
|
}
|
|
|
|
void AecDbX3dPartEntity::LockInf(int nInf)
|
|
{
|
|
|
|
}
|
|
|
|
bool AecDbX3dPartEntity::TransformAssocInf(int nInf,const AcGeMatrix3d& xform)
|
|
{
|
|
AssertWriteEnabled();
|
|
|
|
//柱子类似 FITTING件没有橡皮拉伸特征,固定整体移动
|
|
transformBy(xform);
|
|
|
|
return true;//继续发消息
|
|
}
|
|
|
|
//盆板添加异形偏心井结构
|
|
bool AecDbX3dPartEntity::SetAsWell(LPCTSTR pszPoint2dsTop,LPCTSTR pszPoint2dsBom,double dH,double dThick,double dBomThick,double dElBom,bool bHasHole/* = false*/)
|
|
{
|
|
if(!bHasHole)//含有洞组合
|
|
{
|
|
AssertWriteEnabled();
|
|
m_pPart->RemoveAll3dSolidRec();
|
|
}
|
|
|
|
//洞口编号默认不显示
|
|
//GetSpecialtyData()->SetAt(KEY_HIDENO,TRUE);
|
|
|
|
//2d
|
|
AcDbPolyline* pPlTop = CoreTools::StringToPolyline(pszPoint2dsTop);
|
|
AcDbPolyline* pPlBom = CoreTools::StringToPolyline(pszPoint2dsBom);
|
|
|
|
if (!pPlTop || !pPlBom)
|
|
{
|
|
DELETE_PTR(pPlTop);
|
|
DELETE_PTR(pPlBom);
|
|
return false;
|
|
}
|
|
|
|
if (pPlTop != NULL && pPlBom != NULL)
|
|
{
|
|
SetDrawable2d(pPlTop);
|
|
SetDrawable2d(pPlBom);
|
|
}
|
|
|
|
//3D
|
|
m_pPart->SetName(_T("异形偏心井"));
|
|
|
|
AcDbX3dSolid* pXSolid = new AcDbX3dSolid;
|
|
pXSolid->CreateLoftReducer(pszPoint2dsTop,pszPoint2dsBom,dElBom - dH,dH,dThick,dBomThick);
|
|
m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite);
|
|
|
|
//2.本体
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
|
|
AcDbExtents ext;
|
|
pPlTop->getGeomExtents(ext);
|
|
AcGePoint3d ptOrg = MidPoint(ext.maxPoint(),ext.minPoint());
|
|
ptOrg.z = dElBom;
|
|
|
|
m_pPart->SetOrgPoint(ptOrg);
|
|
m_pPart->SetAxis(X,AcGeVector3d::kXAxis);
|
|
m_pPart->SetAxis(Y,AcGeVector3d::kYAxis);
|
|
m_pPart->SetAxis(Z,AcGeVector3d::kZAxis);
|
|
|
|
//序列化BIM数据
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("TopScr"),pszPoint2dsTop);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("BomScr"),pszPoint2dsBom);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dH"),dH);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dThick"),dThick);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dBomThick"),dBomThick);
|
|
|
|
m_pPart->Create();
|
|
|
|
return true;
|
|
}
|
|
|
|
//盆板添加波浪井拉伸结构
|
|
bool AecDbX3dPartEntity::SetAsWell(LPCTSTR pszPoint2dsSec,double dExL,const AcGeVector3d& vtDir,bool bHasHole/* = false*/)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
//盆板添加圆台底结构
|
|
bool AecDbX3dPartEntity::SetAsWell(const AcGePoint3d& ptCen,double dR,double dr,double dH,double dt,double dBomt,const AcGeVector2d& vtOffset,bool bHasHole/* = false*/)
|
|
{
|
|
if (!bHasHole)
|
|
{
|
|
AssertWriteEnabled();
|
|
m_pPart->RemoveAll3dSolidRec();
|
|
}
|
|
|
|
//洞口编号默认不显示
|
|
//GetSpecialtyData()->SetAt(KEY_HIDENO,TRUE);
|
|
|
|
m_pPart->SetName(_T("圆台井"));
|
|
|
|
//2D
|
|
SetDrawable2d(ptCen,dR);
|
|
SetDrawable2d(ptCen,dr);
|
|
|
|
//3D
|
|
AcGePoint3d ptOrg = ptCen;
|
|
ptOrg.z -= 0.5 * ( dH + dBomt);
|
|
AcGeVector3d vtZ = -AcGeVector3d::kZAxis;
|
|
|
|
AcDbX3dSolid* pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kCone,ptOrg,vtZ,3,dR+dt,dr+dt,dH + dBomt);//CON R1xR2xH
|
|
m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite);
|
|
|
|
AcGePoint3d ptT = ptOrg;
|
|
ptT.z += dt - 0.5 * dBomt;
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kCone,ptT,vtZ,3,dR,dr,dH);//CON R1xR2xH
|
|
m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract);
|
|
|
|
//2.本体
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
|
|
m_pPart->SetOrgPoint(ptCen);
|
|
m_pPart->SetAxis(X,AcGeVector3d::kXAxis);
|
|
m_pPart->SetAxis(Y,AcGeVector3d::kYAxis);
|
|
m_pPart->SetAxis(Z,AcGeVector3d::kZAxis);
|
|
|
|
//序列化BIM数据
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dR"),dR);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dr"),dr);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dt"),dt);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dBomt"),dBomt);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dH"),dH);
|
|
|
|
m_pPart->Create();
|
|
return true;
|
|
}
|
|
|
|
AcDbPolyline* FormatPolyline(const AcGePoint3d& ptCen,double dL,double dW)
|
|
{
|
|
AcDbPolyline* pPl = new AcDbPolyline;
|
|
|
|
AcGePoint3d ptGe = ptCen;
|
|
ptGe -= AcGeVector3d::kXAxis * 0.5 * dL;
|
|
ptGe += AcGeVector3d::kYAxis * 0.5 * dW;
|
|
|
|
pPl->addVertexAt(0,ptGe.convert2d(AcGePlane::kXYPlane));
|
|
|
|
ptGe += AcGeVector3d::kXAxis * dL;
|
|
pPl->addVertexAt(1,ptGe.convert2d(AcGePlane::kXYPlane));
|
|
|
|
ptGe -= AcGeVector3d::kYAxis * dW;
|
|
pPl->addVertexAt(2,ptGe.convert2d(AcGePlane::kXYPlane));
|
|
|
|
ptGe -= AcGeVector3d::kXAxis * dL;
|
|
pPl->addVertexAt(3,ptGe.convert2d(AcGePlane::kXYPlane));
|
|
|
|
ptGe += AcGeVector3d::kYAxis * dW;
|
|
pPl->addVertexAt(4,ptGe.convert2d(AcGePlane::kXYPlane));
|
|
|
|
pPl->setClosed(Adesk::kTrue);
|
|
return pPl;
|
|
}
|
|
|
|
//方台井
|
|
bool AecDbX3dPartEntity::SetAsWell(const AcGePoint3d& ptCen,double dL,double dW,double dL1,double dW1,double dH,double dt,double dBomThick,const AcGeVector2d& vtOffset,bool bHasHole/* = false*/)
|
|
{
|
|
if (!bHasHole)
|
|
{
|
|
AssertWriteEnabled();
|
|
m_pPart->RemoveAll3dSolidRec();
|
|
}
|
|
|
|
//洞口编号默认不显示
|
|
//GetSpecialtyData()->SetAt(KEY_HIDENO,TRUE);
|
|
|
|
m_pPart->SetName(_T("方台井"));
|
|
|
|
AcDbPolyline* pplTop = NULL,*pplBom = NULL;
|
|
pplTop = FormatPolyline(ptCen,dL,dW);
|
|
pplBom = FormatPolyline(ptCen,dL1,dW1);
|
|
|
|
if (pplBom == NULL || pplTop == NULL)
|
|
return false;
|
|
|
|
CString sTopPts,sBomPts;
|
|
CoreTools::PolylineToString(pplTop,sTopPts,true);
|
|
CoreTools::PolylineToString(pplBom,sBomPts,true);
|
|
|
|
double dElBom = ptCen.z;
|
|
//double dBomThick = dt;
|
|
|
|
//TEST
|
|
//AddToModelSpace(pplTop);
|
|
//AddToModelSpace(pplBom);
|
|
//2D
|
|
SetDrawable2d(pplTop);
|
|
SetDrawable2d(pplBom);
|
|
delete pplBom;
|
|
delete pplTop;
|
|
|
|
//3D
|
|
AcDbX3dSolid* pXSolid = new AcDbX3dSolid;
|
|
pXSolid->CreateLoftReducer(sTopPts,sBomPts,dElBom - dH,dH,dt,dBomThick);
|
|
m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite);
|
|
|
|
//2.本体
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
|
|
AcGePoint3d ptOrg = ptCen;
|
|
|
|
m_pPart->SetOrgPoint(ptOrg);
|
|
m_pPart->SetAxis(X,AcGeVector3d::kXAxis);
|
|
m_pPart->SetAxis(Y,AcGeVector3d::kYAxis);
|
|
m_pPart->SetAxis(Z,AcGeVector3d::kZAxis);
|
|
|
|
//序列化BIM数据
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("TopScr"),sTopPts);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("BomScr"),sBomPts);
|
|
|
|
//序列化BIM数据
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("nShape"),(int)eRect);//方
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dL"),dL);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dW"),dW);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dH"),dH);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dL1"),dL1);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dW1"),dW1);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dt"),dt);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dBomt"),dBomThick);
|
|
|
|
|
|
m_pPart->Create();
|
|
return true;
|
|
}
|
|
|
|
//盆板添加上方下圆结构
|
|
bool AecDbX3dPartEntity::SetAsWell(const AcGePoint3d& ptCen,double dL,double dW,double dr,double dH,double dt,double dBomT,double dXOffset,bool bHasHole/* = false*/)
|
|
{
|
|
if (!bHasHole)
|
|
{
|
|
AssertWriteEnabled();
|
|
m_pPart->RemoveAll3dSolidRec();
|
|
}
|
|
|
|
//洞口编号默认不显示
|
|
//GetSpecialtyData()->SetAt(KEY_HIDENO,TRUE);
|
|
|
|
m_pPart->SetName(_T("方圆井"));
|
|
|
|
//2D
|
|
AcDbPolyline* pPl = FormatPolyline(ptCen,dL,dW);
|
|
if (pPl != NULL)
|
|
{
|
|
SetDrawable2d(pPl);
|
|
delete pPl;
|
|
}
|
|
SetDrawable2d(ptCen,dr,AcGeVector3d::kZAxis);
|
|
|
|
//3D
|
|
AcDbX3dSolid* pXSolid = new AcDbX3dSolid;
|
|
AcGeVector3d vtMove(0,0,1);
|
|
if ( pXSolid->CreateTydf(ptCen,vtMove,dr,dL,dW,dH + dBomT,dXOffset,TRUE) )
|
|
{
|
|
m_pPart->AddX3dSolid(pXSolid);
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
if (pXSolid->CreateTydf(ptCen,vtMove,dr - dt,dL - 2.0 * dt,dW - 2.0 * dt,dH,dXOffset,TRUE) )
|
|
{
|
|
m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract);
|
|
}
|
|
|
|
//2.本体
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
|
|
m_pPart->SetOrgPoint( AcGePoint3d(ptCen.x,ptCen.y,ptCen.z) );
|
|
m_pPart->SetAxis(X,AcGeVector3d::kXAxis);
|
|
m_pPart->SetAxis(Y,AcGeVector3d::kYAxis);
|
|
m_pPart->SetAxis(Z,AcGeVector3d::kZAxis);
|
|
|
|
//序列化BIM数据
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("nShape"),(int)eRect);//方
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dL"),dL);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dW"),dW);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dH"),dH);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dr"),dr);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dt"),dt);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dBomT"),dBomT);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dXOffset"),dXOffset);
|
|
|
|
m_pPart->Create();
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
delete pXSolid;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//集水坑井
|
|
bool AecDbX3dPartEntity::SetAsWell(const AcGePoint3d& ptCen,double dL,double dW,double dH,float dSlabThick,double dBomThick,double dAng,bool bHasHole/* = false*/)
|
|
{
|
|
if (!bHasHole)
|
|
{
|
|
AssertWriteEnabled();
|
|
m_pPart->RemoveAll3dSolidRec();
|
|
}
|
|
|
|
//洞口编号默认不显示
|
|
//GetSpecialtyData()->SetAt(KEY_HIDENO,TRUE);
|
|
|
|
m_pPart->SetName(_T("集水坑井"));
|
|
|
|
double dLX = ( dBomThick + dH * tan(dAng) ) * 2.0 + dL;
|
|
double dLY = ( dBomThick + dH * tan(dAng) ) * 2.0 + dW;
|
|
|
|
double dBLx = dBomThick * 2.0 + dL;
|
|
double dBLy = dBomThick * 2.0 + dW;
|
|
|
|
AcGeVector3d vtZ(0,0,1);
|
|
AcGePoint3d ptNewOrg;
|
|
ptNewOrg.set(ptCen.x,ptCen.y,ptCen.z);
|
|
|
|
//2d
|
|
AcDbPolyline* pPl = FormatPolyline(ptCen,dL,dW);
|
|
if (pPl != NULL)
|
|
{
|
|
SetDrawable2d(pPl);
|
|
delete pPl;
|
|
}
|
|
|
|
//1.为宿主的开孔
|
|
AcDbX3dSolid* pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kBox,ptNewOrg,vtZ,3,dL,dW,dSlabThick);
|
|
m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true);
|
|
|
|
//2.本体
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
|
|
//3.创建四方台
|
|
AcDbPolyline* pplTop = NULL,*pplBom = NULL;
|
|
pplTop = FormatPolyline(ptNewOrg,dLX,dLY);
|
|
|
|
//old
|
|
//pplBom = FormatPolyline(ptNewOrg,dLX - 2.0 * dH,dLY - 2.0 * dH);
|
|
|
|
pplBom = FormatPolyline(ptNewOrg,dBLx,dBLy);
|
|
|
|
if (pplBom == NULL || pplTop == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
CString sTopPts,sBomPts;
|
|
CoreTools::PolylineToString(pplTop,sTopPts,true);
|
|
CoreTools::PolylineToString(pplBom,sBomPts,true);
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
vtZ.set(0,0,-1);
|
|
|
|
ptNewOrg.z -= 0.5 * dSlabThick;//到达池底
|
|
pXSolid->CreateLoftReducer(sTopPts,sBomPts,ptNewOrg.z - dH,dH,0.0,0.0);
|
|
m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite);
|
|
|
|
//4.挖去井口
|
|
pXSolid = new AcDbX3dSolid;
|
|
ptNewOrg.z -= 0.5 * (dH - dBomThick);
|
|
pXSolid->Create(AcDbX3dSolid::kBox,ptNewOrg,vtZ,3,dL,dW,dH - dBomThick);
|
|
m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract);
|
|
|
|
m_pPart->SetOrgPoint( ptCen );
|
|
m_pPart->SetAxis(X,AcGeVector3d::kXAxis);
|
|
m_pPart->SetAxis(Y,AcGeVector3d::kYAxis);
|
|
m_pPart->SetAxis(Z,AcGeVector3d::kZAxis);
|
|
|
|
//序列化BIM数据
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dL"),dL);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dW"),dW);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dH"),dH);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dSlabThick"),dSlabThick);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dBomThick"),dBomThick);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("Ang"),dAng);
|
|
|
|
m_pPart->Create();
|
|
return true;
|
|
}
|
|
|
|
void AecDbX3dPartEntity::ResetLablePoint()
|
|
{
|
|
assertWriteEnabled();
|
|
|
|
AcGePoint3d ptCen;
|
|
ptCen = m_pPart->GetOrgPoint(true);
|
|
|
|
AcGePoint3d ptNewOrg,ptOn;
|
|
ptNewOrg.set(ptCen.x,ptCen.y,ptCen.z);
|
|
|
|
AcGeVector3d vtDir(1,0,0);
|
|
m_pPart->GetSpecialtyData()->GetAt(_T("vtDir"),vtDir);
|
|
|
|
vtDir.normalize();
|
|
vtDir *= 3.5 * 100.0;
|
|
ptOn = ptNewOrg;
|
|
ptOn += vtDir;
|
|
|
|
int nVt = 0;
|
|
if (m_pPart->GetSpecialtyData()->HasKey(KEY_NOPOS,nVt) )
|
|
{
|
|
m_pPart->GetSpecialtyData()->SetAt(KEY_NOPOS,ptOn);
|
|
}
|
|
}
|
|
|
|
//在盆板开洞矩形洞,原始定义位置
|
|
bool AecDbX3dPartEntity::SetAsHole(const AcGePoint3d& ptCen,double dL,double dW,double dH,const AcGeVector3d& vtZ,BOOL bHasNozz/* = FALSE*/)
|
|
{
|
|
AssertWriteEnabled();
|
|
|
|
//洞口编号默认显示
|
|
//GetSpecialtyData()->SetAt(KEY_HIDENO,FALSE);
|
|
|
|
m_pPart->RemoveAll3dSolidRec();
|
|
m_pPart->SetName(_T("开洞"));
|
|
|
|
m_drawable2d.RemoveEdage();
|
|
|
|
AcGePoint3d ptNewOrg,ptOn;
|
|
ptNewOrg.set(ptCen.x,ptCen.y,ptCen.z);
|
|
|
|
AcGeVector3d vtDir = vtZ;
|
|
vtDir.normalize();
|
|
vtDir *= 3.5 * 100.0;
|
|
ptOn = ptNewOrg;
|
|
ptOn += vtDir;
|
|
|
|
if (m_pPart != NULL)
|
|
m_pPart->Transformby(ptOn);
|
|
m_pPart->GetSpecialtyData()->SetAt(KEY_NOPOS,ptOn);
|
|
|
|
BOOL bAsWell = FALSE;
|
|
m_pPart->GetSpecialtyData()->GetAt(KEY_SETASWELL, bAsWell);
|
|
|
|
double dL3 = 1.05 * dH;//放大.05
|
|
int nDir = 0;
|
|
|
|
//2D
|
|
AcGeLine3d lnZ;
|
|
lnZ.set(ptCen,vtZ);
|
|
if ( AcGePlane::kXYPlane.isParallelTo(lnZ) ) //洞水平
|
|
{
|
|
nDir = 0;//墙开洞
|
|
AcGeVector3d vtZV = vtZ;
|
|
vtZV.rotateBy(-PI / 2.0,AcGeVector3d::kZAxis);
|
|
|
|
//左线
|
|
AcGePoint3d ptGe[3],pt0,pt1;
|
|
ptGe[0] = ptCen;
|
|
ptGe[0] -= vtZV * 0.5 * dL;
|
|
ptGe[0] += vtZ * 0.5 * dH;
|
|
ptGe[1] = ptGe[0];
|
|
ptGe[1] -= vtZ * dH;
|
|
SetDrawable2d(ptGe[0],ptGe[1]);
|
|
|
|
//右线
|
|
pt0 = ptGe[0];
|
|
pt1 = ptGe[1];
|
|
ptGe[0] += vtZV * dL;
|
|
ptGe[1] += vtZV * dL;
|
|
SetDrawable2d(ptGe[0],ptGe[1]);
|
|
|
|
//X线
|
|
SetDrawable2d(pt0, ptGe[1],TRUE);
|
|
SetDrawable2d(pt1, ptGe[0],TRUE);
|
|
}
|
|
else if (AcGePlane::kXYPlane.isPerpendicularTo(lnZ))
|
|
{
|
|
nDir = 1;//板开洞
|
|
AecComplexCurve cpcur;
|
|
AecEqui::AecCurveElement el;
|
|
memset(&el,0,sizeof(AecEqui::AecCurveElement));
|
|
|
|
AcDbPolyline* pPl = FormatPolyline(ptCen,dL,dW);
|
|
if (pPl != NULL)
|
|
{
|
|
SetDrawable2d(pPl);
|
|
delete pPl;
|
|
}
|
|
|
|
//< 线
|
|
AcGePoint3d ptGe[5],pt1,pt2;
|
|
ptGe[1] = ptCen;
|
|
ptGe[1] -= AcGeVector3d::kXAxis * 0.5 * dL;
|
|
ptGe[1] += AcGeVector3d::kYAxis * 0.5 * dW;
|
|
|
|
ptGe[0] = ptGe[1];
|
|
ptGe[0] += AcGeVector3d::kXAxis * dL;
|
|
|
|
ptGe[2] = ptGe[1];
|
|
ptGe[2] -= AcGeVector3d::kYAxis * dW;
|
|
|
|
pt1 = ptGe[1];
|
|
pt1.rotateBy(PI / 36.0, AcGeVector3d::kZAxis, ptGe[0]);
|
|
|
|
pt2 = ptGe[1];
|
|
pt2.rotateBy(-PI / 36.0, AcGeVector3d::kZAxis, ptGe[2]);
|
|
|
|
AcGeLine3d ln1(pt1, ptGe[0]);
|
|
AcGeLine3d ln2(pt2, ptGe[2]);
|
|
|
|
pt1 = ptGe[1];
|
|
ln1.intersectWith(ln2, ptGe[1]);
|
|
pt2 = ptGe[1];
|
|
|
|
pPl = FormatPolyline(ptGe,3);
|
|
if (pPl != NULL)
|
|
{
|
|
if (!bAsWell)
|
|
{
|
|
SetDrawable2d(pPl);
|
|
}
|
|
delete pPl;
|
|
|
|
CString sForUse;
|
|
m_pPart->GetSpecialtyData()->GetAt(KEY_FORUSE, sForUse);
|
|
|
|
if (sForUse.Find(_T("人孔")) != -1)
|
|
{
|
|
//人孔填充
|
|
ptGe[1] = pt1;
|
|
ptGe[3] = pt2;
|
|
ptGe[4] = ptGe[0];
|
|
|
|
SetDrawable2d(ptGe, 5,HATCH_LOOP);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//...其他空间方向开孔
|
|
}
|
|
|
|
//1.开孔
|
|
AcDbX3dSolid* pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kBox,ptNewOrg,vtZ,3,dL,dW,dL3);
|
|
m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true);
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolSubtract);
|
|
|
|
m_pPart->SetOrgPoint( AcGePoint3d(ptCen.x,ptCen.y,ptCen.z) );
|
|
m_pPart->SetAxis(X,AcGeVector3d::kXAxis);
|
|
m_pPart->SetAxis(Y,AcGeVector3d::kYAxis);
|
|
m_pPart->SetAxis(Z,AcGeVector3d::kZAxis);
|
|
|
|
//序列化BIM数据
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("nShape"),(int)eRect);//方
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dL"),dL);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dW"),dW);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dH"),dH);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("bHasNozz"),bHasNozz);
|
|
|
|
//统一设置开洞的inf
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("vtDir"),vtZ);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dL"),dL);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dW"),dW);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dT"),dH);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dX"),ptCen.x);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dY"),ptCen.y);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dZ"),ptCen.z);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_nDir"),nDir);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_nH"),1);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_nV"),1);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dHSpace"),0.0);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dVSpace"),0.0);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_bAddHoleCase"),bHasNozz);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_nShape"),(int)eRect);//RECT
|
|
|
|
m_pPart->SetActiveInf(CPoint(0,0));
|
|
m_pPart->Create();
|
|
return true;
|
|
}
|
|
|
|
//盆板圆形洞口,原始定义位置
|
|
bool AecDbX3dPartEntity::SetAsHole(const AcGePoint3d& ptCen,double dRad,double dH,const AcGeVector3d& vtZ,BOOL bHasNozz/* = FALSE*/)
|
|
{
|
|
AssertWriteEnabled();
|
|
|
|
//洞口编号默认显示
|
|
//GetSpecialtyData()->SetAt(KEY_HIDENO,FALSE);
|
|
|
|
m_pPart->RemoveAll3dSolidRec();
|
|
m_pPart->SetName(_T("开洞"));
|
|
|
|
m_drawable2d.RemoveEdage();
|
|
|
|
AcGePoint3d ptNewOrg;
|
|
ptNewOrg.set(ptCen.x,ptCen.y,ptCen.z);
|
|
double dL3 = 1.05 * dH;//斜边放大
|
|
|
|
AcGeVector3d vtDir = vtZ;
|
|
vtDir.normalize();
|
|
vtDir *= 3.5 * 100.0;
|
|
AcGePoint3d ptOn = ptNewOrg;
|
|
ptOn += vtDir;
|
|
|
|
if (m_pPart != NULL)
|
|
m_pPart->Transformby(ptOn);
|
|
m_pPart->GetSpecialtyData()->SetAt(KEY_NOPOS,ptOn);
|
|
|
|
AcGeVector3d vtL = vtZ;
|
|
vtL.normalize();
|
|
//2D
|
|
int nDir = 0;
|
|
AcGeLine3d lnZ;
|
|
lnZ.set(ptCen,vtZ);
|
|
if ( AcGePlane::kXYPlane.isParallelTo(lnZ) ) //洞水平
|
|
{
|
|
nDir = 0;//墙体开洞
|
|
AcGeVector3d vtZV = vtZ;
|
|
vtZV.normalize();
|
|
vtZV.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
|
|
|
|
AcGePoint3d ptGe[2];
|
|
ptGe[0] = ptCen;
|
|
ptGe[0] -= vtZV * dRad;
|
|
ptGe[0] += vtL * 0.5 * dH;
|
|
|
|
ptGe[1] = ptGe[0];
|
|
ptGe[1] -= vtL * dH;
|
|
|
|
SetDrawable2d(ptGe[0],ptGe[1]);
|
|
|
|
ptGe[0] += vtZV * 2.0 * dRad;
|
|
ptGe[1] += vtZV * 2.0 * dRad;
|
|
SetDrawable2d(ptGe[0],ptGe[1]);
|
|
|
|
//中心线
|
|
ptGe[0] = ptCen;
|
|
ptGe[0] += vtL * (0.5 * dH + 2.5);
|
|
ptGe[1] = ptGe[0];
|
|
ptGe[1] -= vtL * (dH + 5.0);
|
|
SetDrawable2d(ptGe[0],ptGe[1]);
|
|
}
|
|
else if (AcGePlane::kXYPlane.isPerpendicularTo(lnZ))
|
|
{
|
|
nDir = 1;//板开洞
|
|
//2d
|
|
SetDrawable2d(ptCen,dRad,vtL);
|
|
|
|
//判断是否是人孔
|
|
CString sForUse;
|
|
m_pPart->GetSpecialtyData()->GetAt(KEY_FORUSE, sForUse);
|
|
|
|
if (sForUse.Find(_T("人孔")) != -1)
|
|
{
|
|
AcGePoint3d ptGe[5];
|
|
|
|
ptGe[0] = ptCen;
|
|
ptGe[0].y += dRad;
|
|
|
|
ptGe[1] = ptCen;
|
|
ptGe[1].x -= dRad;
|
|
|
|
ptGe[2] = ptCen;
|
|
ptGe[2].y -= dRad;
|
|
|
|
ptGe[3] = ptCen;
|
|
ptGe[3].x -= 0.75 * dRad;
|
|
|
|
ptGe[4] = ptGe[0];
|
|
|
|
AecComplexCurve cpcur;
|
|
m_drawable2d.GetEdage(cpcur);
|
|
|
|
AecEqui::AecCurveElement el;
|
|
memset(&el, 0, sizeof(AecEqui::AecCurveElement));
|
|
el.gsMark = HATCH_LOOP;
|
|
|
|
el.ptGe[0] = ptGe[0];
|
|
el.ptGe[1] = ptGe[1];
|
|
el.ptGe[2] = ptGe[2];
|
|
|
|
cpcur.append(el);
|
|
|
|
el.ptGe[0] = ptGe[2];
|
|
el.ptGe[1] = ptGe[3];
|
|
el.ptGe[2] = ptGe[4];
|
|
|
|
cpcur.append(el);
|
|
|
|
m_drawable2d.SetEdage(cpcur);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//...
|
|
}
|
|
|
|
//1.开孔
|
|
AcDbX3dSolid* pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kCylinder,ptNewOrg,vtL,2,dRad,dL3);
|
|
m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true);
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolSubtract);
|
|
m_pPart->Create();
|
|
|
|
m_pPart->SetOrgPoint( AcGePoint3d(ptCen.x,ptCen.y,ptCen.z) );
|
|
m_pPart->SetAxis(X,AcGeVector3d::kXAxis);
|
|
m_pPart->SetAxis(Y,AcGeVector3d::kYAxis);
|
|
m_pPart->SetAxis(Z,AcGeVector3d::kZAxis);
|
|
|
|
//序列化BIM数据
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("nShape"),(int)eCircle);//圆
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dH"),dH);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dRad"),dRad);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("bHasNozz"),bHasNozz);
|
|
|
|
//统一设置开洞的inf
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("vtDir"),vtZ);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dL"),dRad);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dW"),dRad);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dT"),dH);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dX"),ptCen.x);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dY"),ptCen.y);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dZ"),ptCen.z);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_nDir"),nDir);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_nH"),1);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_nV"),1);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dHSpace"),0.0);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dVSpace"),0.0);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_bAddHoleCase"),FALSE);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_nShape"),1);//CIRCLE
|
|
|
|
m_pPart->SetActiveInf(CPoint(0,0));
|
|
m_pPart->Create();
|
|
return true;
|
|
}
|
|
|
|
//盆板异型洞,原始定义位置
|
|
bool AecDbX3dPartEntity::SetAsHole(const AcGePoint3d& ptCen,LPCTSTR pszPoint2dsTop,double dH,const AcGeVector3d& vtZ)
|
|
{
|
|
AssertWriteEnabled();
|
|
|
|
//洞口编号默认显示
|
|
//GetSpecialtyData()->SetAt(KEY_HIDENO,FALSE);
|
|
|
|
m_pPart->RemoveAll3dSolidRec();
|
|
m_pPart->SetName(_T("开洞"));
|
|
|
|
m_drawable2d.RemoveEdage();
|
|
|
|
AcGeVector3d vtDir = vtZ;
|
|
vtDir.normalize();
|
|
vtDir *= 3.5 * 100.0;
|
|
AcGePoint3d ptOn = ptCen;
|
|
ptOn += vtDir;
|
|
|
|
if (m_pPart != NULL)
|
|
m_pPart->Transformby(ptOn);
|
|
m_pPart->GetSpecialtyData()->SetAt(KEY_NOPOS,ptOn);
|
|
|
|
double dL = dH;
|
|
AcGePoint3d ptNewOrg = ptCen;
|
|
int nDir = 0;
|
|
|
|
AcGeLine3d lnZ;
|
|
lnZ.set(ptCen,vtZ);
|
|
if ( AcGePlane::kXYPlane.isParallelTo(lnZ) ) //洞水平
|
|
{
|
|
nDir = 0;
|
|
AcDbPolyline* pPl = CoreTools::StringToPolyline(pszPoint2dsTop);
|
|
if (pPl != NULL)
|
|
{
|
|
AcDbExtents ext;
|
|
pPl->getGeomExtents(ext);
|
|
|
|
dL = ext.maxPoint().x - ext.minPoint().x;
|
|
|
|
nDir = 0;//墙体开洞
|
|
AcGeVector3d vtZV = vtZ;
|
|
vtZV.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
|
|
vtZV.normalize();
|
|
|
|
AcGeVector3d vtZB= vtZ;
|
|
vtZB.normalize();
|
|
|
|
AcGePoint3d ptGe[2];
|
|
ptGe[0] = ptCen;
|
|
ptGe[0] -= vtZV * 0.5 * dL;
|
|
ptGe[0] += vtZB * 0.5 * dH;
|
|
ptGe[1] = ptGe[0];
|
|
ptGe[1] -= vtZ * dH;
|
|
|
|
SetDrawable2d(ptGe[0],ptGe[1]);
|
|
|
|
ptGe[0] += vtZV * dL;
|
|
ptGe[1] += vtZV * dL;
|
|
SetDrawable2d(ptGe[0],ptGe[1]);
|
|
|
|
delete pPl;
|
|
}
|
|
}
|
|
else if (AcGePlane::kXYPlane.isPerpendicularTo(lnZ))
|
|
{
|
|
nDir = 1;
|
|
//2d
|
|
AcDbPolyline* pPl = CoreTools::StringToPolyline(pszPoint2dsTop);
|
|
if (pPl != NULL)
|
|
{
|
|
SetDrawable2d(pPl);
|
|
delete pPl;
|
|
//TEST
|
|
//pPl->setColorIndex(1);
|
|
//CoreTools::AddToModelSpace(pPl);
|
|
}
|
|
else
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
//...
|
|
return false;
|
|
}
|
|
|
|
//1.开孔
|
|
AcDbX3dSolid* pXSolid = new AcDbX3dSolid;
|
|
vtDir.normalize();
|
|
|
|
CString sPoints = pszPoint2dsTop;
|
|
AcDbPolyline* pPl = CoreTools::StringToPolyline(pszPoint2dsTop);
|
|
if (pPl != NULL)
|
|
{
|
|
AcGePlane plan;
|
|
AcDb::Planarity epan;
|
|
pPl->getPlane(plan,epan);
|
|
|
|
AcGePoint3d pClst = plan.closestPointTo(ptNewOrg);
|
|
|
|
AcGeVector3d vt = ptNewOrg - pClst;
|
|
AcGeMatrix3d xform;
|
|
xform.setToTranslation(vt);
|
|
pPl->transformBy(xform);
|
|
|
|
sPoints = _T("");
|
|
CoreTools::PolylineToString(pPl,sPoints);
|
|
|
|
delete pPl;
|
|
}
|
|
|
|
//以中心两方向减
|
|
pXSolid->CreateExtrude(ptNewOrg,vtZ,sPoints,0.5 * dH,0.0);
|
|
m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true);
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolSubtract);
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->CreateExtrude(ptNewOrg,-vtZ,sPoints,0.5 * dH,0.0);
|
|
m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true);
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolSubtract);
|
|
|
|
//TEST
|
|
/*AcDb3dSolid* pSolid = pXSolid->GetDraw3dSolid();
|
|
if (pSolid != NULL)
|
|
{
|
|
pSolid->setColorIndex(1);
|
|
AddToModelSpace(pSolid);
|
|
}*/
|
|
|
|
m_pPart->SetOrgPoint(ptNewOrg);
|
|
m_pPart->SetAxis(X,AcGeVector3d::kXAxis);
|
|
m_pPart->SetAxis(Y,AcGeVector3d::kYAxis);
|
|
m_pPart->SetAxis(Z,AcGeVector3d::kZAxis);
|
|
|
|
//序列化BIM数据
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("nShape"),(int)eUserDef);//自定义
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dH"),dH);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("Points"),pszPoint2dsTop);
|
|
|
|
//统一设置开洞的inf
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("vtDir"),vtZ);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dL"),dL);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dW"),dL);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dT"),dH);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dX"),ptCen.x);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dY"),ptCen.y);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dZ"),ptCen.z);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_nDir"),nDir);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_nH"),1);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_nV"),1);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dHSpace"),0.0);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_dVSpace"),0.0);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_bAddHoleCase"),FALSE);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("m_nShape"),2);//CIRCLE
|
|
|
|
m_pPart->SetActiveInf(CPoint(0,0));
|
|
m_pPart->Create();
|
|
|
|
return true;
|
|
}
|
|
|
|
bool AecDbX3dPartEntity::SetAsPipe(const AcGePoint3d& ptCen,int nShape,double dH,double dW,double dT,double dL,BOOL bLRExt,double dEx1,double dEx2,const AcGeVector3d& vtDir)
|
|
{
|
|
AssertWriteEnabled();
|
|
|
|
m_pPart->RemoveAll3dSolidRec();
|
|
m_pPart->SetName(_T("套管"));
|
|
|
|
//二次修改不可以 Reset
|
|
//复制需要Rest
|
|
//m_pPart->ResetMove();
|
|
//m_pPart->ResetRotate(X);
|
|
//m_pPart->ResetRotate(Y);
|
|
//m_pPart->ResetRotate(Z);
|
|
|
|
m_drawable2d.RemoveEdage();
|
|
|
|
AcGeVector3d vtDirT = vtDir;
|
|
vtDirT.normalize();
|
|
vtDirT *= 3.5 * 100.0;
|
|
AcGePoint3d ptOn = ptCen;
|
|
ptOn += vtDirT;
|
|
|
|
if (m_pPart != NULL)
|
|
m_pPart->Transformby(ptOn);
|
|
m_pPart->GetSpecialtyData()->SetAt(KEY_NOPOS,ptOn);
|
|
|
|
AcDbX3dSolid* pXSolid = NULL;
|
|
if (nShape == 0)//circle
|
|
{
|
|
if (vtDir.isParallelTo(AcGeVector3d::kZAxis))//开口平行Z
|
|
{
|
|
vtDirT.normalize();
|
|
SetDrawable2d(ptCen,0.5 * dH,vtDirT);//Circle
|
|
}
|
|
else//
|
|
{
|
|
AcGeLine3d ln3d;
|
|
ln3d.set(ptCen,vtDir);
|
|
|
|
if (AcGePlane::kXYPlane.isParallelTo(ln3d))//开口平行 XY面
|
|
{
|
|
//双线
|
|
vtDirT.normalize();
|
|
SetDrawable2d(ptCen,0.5 * dH,dL,vtDirT);//-||-
|
|
}
|
|
}
|
|
|
|
vtDirT.normalize();
|
|
|
|
//CYL RxH 为宿主结构准备的solid减
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kCylinder,ptCen,vtDir,2,0.5 * dH,dL);
|
|
m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true);
|
|
|
|
//TEST
|
|
/*
|
|
AcDb3dSolid* pSolid = NULL;
|
|
pSolid = pXSolid->GetDraw3dSolid();
|
|
if ( pSolid != NULL)
|
|
{
|
|
pSolid->setColorIndex(3);
|
|
AddToModelSpace(pSolid);
|
|
}*/
|
|
|
|
//本体
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
|
|
//圆管rxtxH dL管长
|
|
if (bLRExt)
|
|
{
|
|
AcGePoint3d ptCenT = ptCen;
|
|
double dL1 = (0.5 * dL + dEx1);
|
|
ptCenT -= vtDirT * 0.5 * dL1;
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kPipe,ptCenT,vtDir,3,0.5 * dH,dT,dL1);
|
|
m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite);
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
|
|
ptCenT = ptCen;
|
|
double dL2 = (0.5 * dL + dEx2);
|
|
ptCenT += vtDirT * 0.5 * dL2;
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kPipe,ptCenT,vtDir,3,0.5 * dH,dT,dL2);
|
|
m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite);
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
}
|
|
else
|
|
{
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kPipe,ptCen,vtDir,3,0.5 * dH,dT,dL);
|
|
m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite);
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
}
|
|
|
|
m_pPart->SetOrgPoint(ptCen);
|
|
m_pPart->SetAxis(X,AcGeVector3d::kXAxis);
|
|
m_pPart->SetAxis(Y,AcGeVector3d::kYAxis);
|
|
m_pPart->SetAxis(Z,AcGeVector3d::kZAxis);
|
|
|
|
//序列化BIM数据
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("nShape"),(int)eCircle);//自定义
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dH"),dL);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dD"),dH);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dT"),dT);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("bExt"),bLRExt);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dEx1"),dEx1);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dEx2"),dEx2);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("vtDir"),vtDir);
|
|
|
|
m_pPart->Create();
|
|
}
|
|
else//rect
|
|
{
|
|
if (vtDir.isParallelTo(AcGeVector3d::kZAxis))//水平
|
|
{
|
|
AcDbPolyline* pPl = FormatPolyline(ptCen,dW,dH);
|
|
if (pPl != NULL)
|
|
{
|
|
SetDrawable2d(pPl);
|
|
delete pPl;
|
|
}
|
|
}
|
|
else//垂直
|
|
{
|
|
AcGeLine3d ln3d;
|
|
ln3d.set(ptCen,vtDir);
|
|
|
|
if (AcGePlane::kXYPlane.isParallelTo(ln3d))//XY面
|
|
{
|
|
//双线
|
|
vtDirT.normalize();
|
|
SetDrawable2d(ptCen,0.5 * dW,dL,vtDirT);
|
|
}
|
|
}
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kBox,ptCen,vtDir,3,dW,dH,dL);
|
|
m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true);
|
|
|
|
//本体
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
|
|
//BOX LxWxH 为宿主结构准备的solid减
|
|
if (bLRExt)
|
|
{
|
|
AcGePoint3d ptCenT = ptCen;
|
|
double dL1 = (0.5 * dL + dEx1);
|
|
ptCenT -= vtDirT * 0.5 * dL1;
|
|
|
|
//kRectTube
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kRectTube,ptCenT,vtDir,4,dW,dH,dT,dL1);
|
|
m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite);
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
|
|
ptCenT = ptCen;
|
|
double dL2 = (0.5 * dL + dEx2);
|
|
ptCenT += vtDirT * 0.5 * dL2;
|
|
|
|
//kRectTube
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kRectTube,ptCenT,vtDir,4,dW,dH,dT,dL2);
|
|
m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite);
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
}
|
|
else
|
|
{
|
|
//kRectTube
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kRectTube,ptCen,vtDir,4,dW,dH,dT,dL);
|
|
m_pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite);
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
}
|
|
|
|
m_pPart->SetOrgPoint(ptCen);
|
|
m_pPart->SetAxis(X,AcGeVector3d::kXAxis);
|
|
m_pPart->SetAxis(Y,AcGeVector3d::kYAxis);
|
|
m_pPart->SetAxis(Z,AcGeVector3d::kZAxis);
|
|
|
|
//序列化BIM数据
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("nShape"),(int)eRect);//自定义
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dH"),dL);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dL"),dW);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dW"),dH);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dT"),dT);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("bExt"),bLRExt);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dEx1"),dEx1);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dEx2"),dEx2);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("vtDir"),vtDir);
|
|
|
|
m_pPart->Create();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool AecDbX3dPartEntity::SetAsPipe(const AcGePoint3d &ptCen, int nShape, double dH, double dW, double dT, double dL, BOOL bLRExt, double dEx1, double dEx2, const AcGeVector3d &vtDir,const AcGeVector3d& vtWall)
|
|
{
|
|
AssertWriteEnabled();
|
|
|
|
m_pPart->RemoveAll3dSolidRec();
|
|
m_pPart->SetName(_T("套管"));
|
|
|
|
//二次修改不可以 Reset
|
|
//复制需要Rest
|
|
//m_pPart->ResetMove();
|
|
//m_pPart->ResetRotate(X);
|
|
//m_pPart->ResetRotate(Y);
|
|
//m_pPart->ResetRotate(Z);
|
|
|
|
m_drawable2d.RemoveEdage();
|
|
|
|
AcGeVector3d vtDirT = vtDir;
|
|
vtDirT.normalize();
|
|
vtDirT *= 3.5 * 100.0;
|
|
AcGePoint3d ptOn = ptCen;
|
|
ptOn += vtDirT;
|
|
|
|
if (m_pPart != NULL)
|
|
m_pPart->Transformby(ptOn);
|
|
m_pPart->GetSpecialtyData()->SetAt(KEY_NOPOS, ptOn);
|
|
|
|
AcDbX3dSolid *pXSolid = NULL;
|
|
if (nShape == 0)//circle
|
|
{
|
|
if (vtDir.isParallelTo(AcGeVector3d::kZAxis))//开口平行Z
|
|
{
|
|
vtDirT.normalize();
|
|
SetDrawable2d(ptCen, 0.5 * dH, vtDirT);//Circle
|
|
}
|
|
else//
|
|
{
|
|
AcGeLine3d ln3d;
|
|
ln3d.set(ptCen, vtDir);
|
|
|
|
if (AcGePlane::kXYPlane.isParallelTo(ln3d))//开口平行 XY面
|
|
{
|
|
//双线
|
|
vtDirT.normalize();
|
|
SetDrawable2d(ptCen, 0.5 * dH, dL, vtDirT,vtWall);//-||-
|
|
}
|
|
}
|
|
|
|
vtDirT.normalize();
|
|
|
|
//CYL RxH 为宿主结构准备的solid减
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kCylinder, ptCen, vtDir, 2, 0.5 * dH, dL);
|
|
m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolSubtract, true);
|
|
|
|
//TEST
|
|
/*
|
|
AcDb3dSolid* pSolid = NULL;
|
|
pSolid = pXSolid->GetDraw3dSolid();
|
|
if ( pSolid != NULL)
|
|
{
|
|
pSolid->setColorIndex(3);
|
|
AddToModelSpace(pSolid);
|
|
}*/
|
|
|
|
//本体
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
|
|
double dAng = vtDir.angleTo(vtWall);
|
|
double dX = 0.0;
|
|
|
|
KTTempTol tol(1.e-3);
|
|
if (!vtDir.isPerpendicularTo(vtWall))
|
|
{
|
|
dX = fabs(0.5 * dH * tan(dAng));
|
|
}
|
|
|
|
//圆管rxtxH dL管长
|
|
if (bLRExt)
|
|
{
|
|
AcGePoint3d ptCenT = ptCen;
|
|
double dL1 = (0.5 * dL + dEx1 + dX);
|
|
ptCenT -= vtDirT * 0.5 * dL1;
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kPipe, ptCenT, vtDir, 3, 0.5 * dH, dT, dL1);
|
|
m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolUnite);
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
|
|
ptCenT = ptCen;
|
|
double dL2 = (0.5 * dL + dEx2 + dX);
|
|
ptCenT += vtDirT * 0.5 * dL2;
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kPipe, ptCenT, vtDir, 3, 0.5 * dH, dT, dL2);
|
|
m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolUnite);
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
|
|
/*if (!vtDir.isPerpendicularTo(vtWall))
|
|
{
|
|
AcGeVector3d vtY = vtDir.orthoProject(vtWall);
|
|
vtY.normalize();
|
|
|
|
ptCenT = ptCen;
|
|
dL1 = (0.5 * dL);
|
|
ptCenT += vtDirT * 0.5 * dL1;
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kPipe, ptCenT, vtY, 3, 0.5 * dH, dT, dL1);
|
|
AddToModelSpace(pXSolid->GetDraw3dSolid());
|
|
delete pXSolid;
|
|
|
|
//m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolSubtract);
|
|
//m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
|
|
ptCenT = ptCen;
|
|
double dL2 = (0.5 * dL);
|
|
ptCenT -= vtDirT * 0.5 * dL2;
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kPipe, ptCenT, -vtY, 3, 0.5 * dH, dT, dL2);
|
|
AddToModelSpace(pXSolid->GetDraw3dSolid());
|
|
delete pXSolid;
|
|
//m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolSubtract);
|
|
//m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
}*/
|
|
}
|
|
else
|
|
{
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kPipe, ptCen, vtDir, 3, 0.5 * dH, dT, dL + 2.0 * dX);
|
|
m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolUnite);
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
|
|
/*if (!vtDir.isPerpendicularTo(vtWall))
|
|
{
|
|
AcGePoint3d ptCenT = ptCen;
|
|
double dL1 = (0.5 * dL + dX + 3 * dX);
|
|
|
|
AcGeVector3d vtY = vtDir.orthoProject(vtWall);
|
|
vtY.normalize();
|
|
|
|
ptCenT = ptCen;
|
|
ptCenT += vtDirT * 0.5 * dL1;
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kCylinder, ptCenT, vtY, 3, dH, dX);
|
|
//AddToModelSpace(pXSolid->GetDraw3dSolid());
|
|
//delete pXSolid;
|
|
m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolSubtract);
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
|
|
ptCenT = ptCen;
|
|
double dL2 = (0.5 * dL + dX + 3 * dX);
|
|
ptCenT -= vtDirT * 0.5 * dL2;
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kCylinder, ptCenT, -vtY, 3, dH, dX);
|
|
//AddToModelSpace(pXSolid->GetDraw3dSolid());
|
|
//delete pXSolid;
|
|
m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolSubtract);
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
}*/
|
|
}
|
|
|
|
m_pPart->SetOrgPoint(ptCen);
|
|
m_pPart->SetAxis(X, AcGeVector3d::kXAxis);
|
|
m_pPart->SetAxis(Y, AcGeVector3d::kYAxis);
|
|
m_pPart->SetAxis(Z, AcGeVector3d::kZAxis);
|
|
|
|
//序列化BIM数据
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("nShape"), (int)eCircle);//自定义
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dH"), dL);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dD"), dH);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dT"), dT);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("bExt"), bLRExt);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dEx1"), dEx1);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dEx2"), dEx2);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("vtDir"), vtDir);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("vtWall"), vtWall);
|
|
|
|
m_pPart->Create();
|
|
}
|
|
else//rect
|
|
{
|
|
if (vtDir.isParallelTo(AcGeVector3d::kZAxis))//水平
|
|
{
|
|
AcDbPolyline *pPl = FormatPolyline(ptCen, dW, dH);
|
|
if (pPl != NULL)
|
|
{
|
|
SetDrawable2d(pPl);
|
|
delete pPl;
|
|
}
|
|
}
|
|
else//垂直
|
|
{
|
|
AcGeLine3d ln3d;
|
|
ln3d.set(ptCen, vtDir);
|
|
|
|
if (AcGePlane::kXYPlane.isParallelTo(ln3d))//XY面
|
|
{
|
|
//双线
|
|
vtDirT.normalize();
|
|
SetDrawable2d(ptCen, 0.5 * dW, dL, vtDirT,vtWall);
|
|
}
|
|
}
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kBox, ptCen, vtDir, 3, dW, dH, dL);
|
|
m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolSubtract, true);
|
|
|
|
//本体
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
|
|
//BOX LxWxH 为宿主结构准备的solid减
|
|
if (bLRExt)
|
|
{
|
|
AcGePoint3d ptCenT = ptCen;
|
|
double dL1 = (0.5 * dL + dEx1);
|
|
ptCenT -= vtDirT * 0.5 * dL1;
|
|
|
|
//kRectTube
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kRectTube, ptCenT, vtDir, 4, dW, dH, dT, dL1);
|
|
m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolUnite);
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
|
|
ptCenT = ptCen;
|
|
double dL2 = (0.5 * dL + dEx2);
|
|
ptCenT += vtDirT * 0.5 * dL2;
|
|
|
|
//kRectTube
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kRectTube, ptCenT, vtDir, 4, dW, dH, dT, dL2);
|
|
m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolUnite);
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
}
|
|
else
|
|
{
|
|
//kRectTube
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kRectTube, ptCen, vtDir, 4, dW, dH, dT, dL);
|
|
m_pPart->AddX3dSolid(pXSolid, AcDb::kBoolUnite);
|
|
m_pPart->SetBoolOperFor(AcDb::kBoolUnite);
|
|
}
|
|
|
|
m_pPart->SetOrgPoint(ptCen);
|
|
m_pPart->SetAxis(X, AcGeVector3d::kXAxis);
|
|
m_pPart->SetAxis(Y, AcGeVector3d::kYAxis);
|
|
m_pPart->SetAxis(Z, AcGeVector3d::kZAxis);
|
|
|
|
//序列化BIM数据
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("nShape"), (int)eRect);//自定义
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dH"), dL);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dL"), dW);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dW"), dH);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dT"), dT);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("bExt"), bLRExt);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dEx1"), dEx1);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("dEx2"), dEx2);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("vtDir"), vtDir);
|
|
m_pPart->GetSpecialtyData()->SetAt(_T("vtWall"), vtWall);
|
|
|
|
m_pPart->Create();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool AecDbX3dPartEntity::SetAxis(int nIndex, const AcGeVector3d & vtAxis)
|
|
{
|
|
AssertWriteEnabled();
|
|
if (m_pPart)
|
|
return m_pPart->SetAxis(nIndex, vtAxis);
|
|
return true;
|
|
}
|
|
|
|
bool AecDbX3dPartEntity::GetAxis(int nIndex, AcGeVector3d & vtAxis) const
|
|
{
|
|
assertReadEnabled();
|
|
if (m_pPart)
|
|
return m_pPart->GetAxis(nIndex, vtAxis);
|
|
return true;
|
|
}
|
|
|
|
void AecDbX3dPartEntity::SetDrawable2d(const AcDbPolyline* pPl)
|
|
{
|
|
assertWriteEnabled();
|
|
|
|
if (pPl->hasBulges())
|
|
{
|
|
AecComplexCurve cpcur;
|
|
m_drawable2d.GetEdage(cpcur);
|
|
|
|
AecEqui::AecCurveElement el;
|
|
memset(&el,0,sizeof(AecEqui::AecCurveElement));
|
|
|
|
AcDbVoidPtrArray arCurPtrs;
|
|
pPl->explode(arCurPtrs);
|
|
|
|
double dSta = 0.0,dEnd = 0.0;
|
|
AcDbEntity* pEnt = NULL;
|
|
for (int i = 0;i < arCurPtrs.length();i++)
|
|
{
|
|
pEnt = (AcDbEntity*)arCurPtrs.at(i);
|
|
AcDbLine* pLn = AcDbLine::cast(pEnt);
|
|
if (pLn != NULL)
|
|
{
|
|
el.ptGe[0] = pLn->startPoint();
|
|
el.ptGe[1] = pLn->endPoint();
|
|
el.ptGe[2] = pLn->endPoint();
|
|
cpcur.append(el);
|
|
}
|
|
|
|
AcDbArc* pArc = AcDbArc::cast(pEnt);
|
|
if (pArc != NULL)
|
|
{
|
|
pArc->getStartPoint(el.ptGe[0]);
|
|
pArc->getEndPoint(el.ptGe[2]);
|
|
|
|
pArc->getStartParam(dSta);
|
|
pArc->getEndParam(dEnd);
|
|
pArc->getPointAtParam((dSta+dEnd)*0.5,el.ptGe[1]);
|
|
|
|
cpcur.append(el);
|
|
}
|
|
delete pEnt;
|
|
}
|
|
if (!cpcur.isEmpty()) m_drawable2d.SetEdage(cpcur);
|
|
}
|
|
else
|
|
{
|
|
AecComplexCurve cpcur;
|
|
m_drawable2d.GetEdage(cpcur);
|
|
|
|
AecEqui::AecCurveElement el;
|
|
memset(&el,0,sizeof(AecEqui::AecCurveElement));
|
|
|
|
for (int i = 0;i < pPl->numVerts()-1;i++)
|
|
{
|
|
pPl->getPointAt(i,el.ptGe[0]);
|
|
pPl->getPointAt(i+1,el.ptGe[1]);
|
|
|
|
el.ptGe[2] = el.ptGe[1];
|
|
el.bHided = FALSE;
|
|
cpcur.append(el);
|
|
}
|
|
m_drawable2d.SetEdage(cpcur);
|
|
}
|
|
}
|
|
|
|
void AecDbX3dPartEntity::SetDrawable2d(AcGePoint3d* pptGe,int nCount,Adesk::Int32 nGsMark)
|
|
{
|
|
AecComplexCurve cpcur;
|
|
m_drawable2d.GetEdage(cpcur);
|
|
|
|
AecEqui::AecCurveElement el;
|
|
memset(&el, 0, sizeof(AecEqui::AecCurveElement));
|
|
el.gsMark = nGsMark;
|
|
|
|
for (int i = 0;i < nCount - 1;i++)
|
|
{
|
|
el.ptGe[0] = pptGe[i];
|
|
el.ptGe[1] = pptGe[i + 1];
|
|
el.ptGe[2] = pptGe[i + 1];
|
|
cpcur.append(el);
|
|
}
|
|
m_drawable2d.SetEdage(cpcur);
|
|
}
|
|
|
|
void AecDbX3dPartEntity::SetDrawable2d(const AcGePoint3d& ptCen,double dR,const AcGeVector3d& vtZ)
|
|
{
|
|
assertWriteEnabled();
|
|
|
|
AecComplexCurve cpcur;
|
|
m_drawable2d.GetEdage(cpcur);
|
|
|
|
AcGePoint3d ptCenNew = ptCen;
|
|
|
|
if (m_pPart != NULL)
|
|
m_pPart->Transformby(ptCenNew);
|
|
|
|
AecEqui::AecCurveElement el;
|
|
memset(&el,0,sizeof(AecEqui::AecCurveElement));
|
|
|
|
if (vtZ.isParallelTo(AcGeVector3d::kZAxis))//板开洞
|
|
{
|
|
el.ptGe[0] = ptCenNew;
|
|
el.ptGe[0].x += dR;
|
|
|
|
el.ptGe[1] = ptCenNew;
|
|
el.ptGe[1].y += dR;
|
|
|
|
el.ptGe[2] = ptCenNew;
|
|
el.ptGe[2].x -= dR;
|
|
cpcur.append(el);
|
|
|
|
el.ptGe[0] = ptCenNew;
|
|
el.ptGe[0].x -= dR;
|
|
|
|
el.ptGe[1] = ptCenNew;
|
|
el.ptGe[1].y -= dR;
|
|
|
|
el.ptGe[2] = ptCenNew;
|
|
el.ptGe[2].x += dR;
|
|
cpcur.append(el);
|
|
|
|
//增加左右- 线
|
|
m_drawable2d.SetEdage(cpcur);
|
|
}
|
|
else
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
void AecDbX3dPartEntity::SetDrawable2d(const AcGePoint3d& pt1,const AcGePoint3d& pt2,BOOL bDashed)
|
|
{
|
|
assertWriteEnabled();
|
|
|
|
AecComplexCurve cpcur;
|
|
m_drawable2d.GetEdage(cpcur);
|
|
|
|
AecEqui::AecCurveElement el;
|
|
memset(&el,0,sizeof(AecEqui::AecCurveElement));
|
|
|
|
el.ptGe[0] = pt1;el.ptGe[1] = pt2;el.ptGe[2] = pt2;
|
|
|
|
AcGeLine3d ln3d;
|
|
ln3d.set(pt1,pt2);
|
|
if (ln3d.isParallelTo(AcGePlane::kXYPlane))
|
|
{
|
|
el.idSubLty = KTSetting::InitLineStyle(_T("DASHED"));
|
|
}
|
|
|
|
if (m_pPart != NULL)
|
|
{
|
|
m_pPart->Transformby(el.ptGe[0]);
|
|
m_pPart->Transformby(el.ptGe[1]);
|
|
m_pPart->Transformby(el.ptGe[2]);
|
|
}
|
|
if (bDashed)
|
|
{
|
|
el.idSubLty = KTSetting::InitLineStyle(_T("DASHED"));
|
|
}
|
|
cpcur.append(el);
|
|
m_drawable2d.SetEdage(cpcur);
|
|
}
|
|
|
|
//双线
|
|
void AecDbX3dPartEntity::SetDrawable2d(const AcGePoint3d& ptCen,double dR,double dL,const AcGeVector3d& vtDir)
|
|
{
|
|
assertWriteEnabled();
|
|
|
|
AcGePoint3d ptCenNew = ptCen;
|
|
CString sType = _T("");
|
|
if (m_pPart != NULL)
|
|
{
|
|
m_pPart->Transformby(ptCenNew);
|
|
m_pPart->GetSpecialtyData()->GetAt(KEY_PIPETYPE, sType);
|
|
}
|
|
|
|
AcGeLine3d ln3d;
|
|
ln3d.set(ptCenNew,vtDir);
|
|
|
|
if (AcGePlane::kXYPlane.isParallelTo(ln3d))
|
|
{
|
|
// | |
|
|
// -| |-
|
|
// | |
|
|
|
|
AecComplexCurve cpcur;
|
|
m_drawable2d.GetEdage(cpcur);
|
|
|
|
AecEqui::AecCurveElement el;
|
|
memset(&el,0,sizeof(AecEqui::AecCurveElement));
|
|
|
|
AcGeVector3d vtL = vtDir;
|
|
vtL.normalize();
|
|
|
|
AcGeVector3d vtV = vtL;
|
|
vtV.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
|
|
|
|
AcGePoint3d ptS[2], ptE[2];
|
|
|
|
el.ptGe[0] = ptCenNew;
|
|
el.ptGe[0] += vtV * dR;
|
|
el.ptGe[0] -= 0.5 * dL * vtL;
|
|
el.ptGe[1] = el.ptGe[0] + vtL * dL;
|
|
el.ptGe[2] = el.ptGe[1];
|
|
ptS[0] = el.ptGe[0];
|
|
ptE[0] = el.ptGe[2];
|
|
//考虑倾斜延伸到墙体对齐
|
|
cpcur.append(el);
|
|
|
|
el.ptGe[0] -= vtV * 2.0 * dR;
|
|
el.ptGe[1] -= vtV * 2.0 * dR;
|
|
el.ptGe[2] -= vtV * 2.0 * dR;
|
|
ptS[1] = el.ptGe[0];
|
|
ptE[1] = el.ptGe[2];
|
|
//考虑倾斜延伸到墙体对齐
|
|
cpcur.append(el);
|
|
|
|
//增加左右-线
|
|
el.ptGe[0] = ptCenNew;
|
|
el.ptGe[0] += dR * vtV;
|
|
el.ptGe[1] = el.ptGe[0] + vtV * dR;
|
|
el.ptGe[2] = el.ptGe[1];
|
|
el.dWidth = 0.25;
|
|
cpcur.append(el);
|
|
|
|
el.ptGe[0] = ptCenNew;
|
|
el.ptGe[0] -= dR * vtV;
|
|
el.ptGe[1] = el.ptGe[0] - vtV * dR;
|
|
el.ptGe[2] = el.ptGe[1];
|
|
cpcur.append(el);
|
|
|
|
if (sType.Find(_T("柔性")) != -1)
|
|
{
|
|
el.ptGe[0] = ptS[0];
|
|
el.ptGe[1] = el.ptGe[0] + vtV * dR;
|
|
el.ptGe[2] = el.ptGe[1];
|
|
el.dWidth = 0.25;
|
|
cpcur.append(el);
|
|
|
|
el.ptGe[0] = ptE[0];
|
|
el.ptGe[1] = el.ptGe[0] + vtV * dR;
|
|
el.ptGe[2] = el.ptGe[1];
|
|
el.dWidth = 0.25;
|
|
cpcur.append(el);
|
|
|
|
el.ptGe[0] = ptS[1];
|
|
el.ptGe[1] = el.ptGe[0] - vtV * dR;
|
|
el.ptGe[2] = el.ptGe[1];
|
|
el.dWidth = 0.25;
|
|
cpcur.append(el);
|
|
|
|
el.ptGe[0] = ptE[1];
|
|
el.ptGe[1] = el.ptGe[0] - vtV * dR;
|
|
el.ptGe[2] = el.ptGe[1];
|
|
el.dWidth = 0.25;
|
|
cpcur.append(el);
|
|
}
|
|
|
|
m_drawable2d.SetEdage(cpcur);
|
|
}
|
|
}
|
|
|
|
void AecDbX3dPartEntity::SetDrawable2d(const AcGePoint3d &ptCen, double dR, double dL, const AcGeVector3d &vtDir,const AcGeVector3d& vtWall)
|
|
{
|
|
assertWriteEnabled();
|
|
|
|
AcGePoint3d ptCenNew = ptCen;
|
|
CString sType = _T("");
|
|
if (m_pPart != NULL)
|
|
{
|
|
m_pPart->Transformby(ptCenNew);
|
|
m_pPart->GetSpecialtyData()->GetAt(KEY_PIPETYPE,sType);
|
|
}
|
|
|
|
AcGeLine3d ln3d;
|
|
ln3d.set(ptCenNew, vtDir);
|
|
|
|
if (AcGePlane::kXYPlane.isParallelTo(ln3d))
|
|
{
|
|
// | |
|
|
// -| |-
|
|
// | |
|
|
AecComplexCurve cpcur;
|
|
m_drawable2d.GetEdage(cpcur);
|
|
|
|
AecEqui::AecCurveElement el;
|
|
memset(&el, 0, sizeof(AecEqui::AecCurveElement));
|
|
|
|
AcGeVector3d vtL = vtDir;
|
|
vtL.normalize();
|
|
|
|
AcGeVector3d vtV = vtWall;
|
|
vtV.normalize();
|
|
|
|
double dAng = vtV.angleTo(vtL);
|
|
double dRL = dR / sin(dAng);
|
|
|
|
AcGePoint3d ptS[2], ptE[2];
|
|
|
|
// ||
|
|
el.ptGe[0] = ptCenNew;
|
|
el.ptGe[0] += vtV * dRL;
|
|
el.ptGe[0] -= 0.5 * dL * vtL;
|
|
el.ptGe[1] = el.ptGe[0] + vtL * dL;
|
|
el.ptGe[2] = el.ptGe[1];
|
|
ptS[0] = el.ptGe[0];
|
|
ptE[0] = el.ptGe[2];
|
|
|
|
//考虑倾斜延伸到墙体对齐
|
|
cpcur.append(el);
|
|
|
|
el.ptGe[0] -= vtV * 2.0 * dRL;
|
|
el.ptGe[1] -= vtV * 2.0 * dRL;
|
|
el.ptGe[2] -= vtV * 2.0 * dRL;
|
|
|
|
ptS[1] = el.ptGe[0];
|
|
ptE[1] = el.ptGe[2];
|
|
|
|
//考虑倾斜延伸到墙体对齐
|
|
cpcur.append(el);
|
|
|
|
//增加左右-线
|
|
el.ptGe[0] = ptCenNew;
|
|
el.ptGe[0] += dRL * vtV;
|
|
el.ptGe[1] = el.ptGe[0] + vtV * dRL;
|
|
el.ptGe[2] = el.ptGe[1];
|
|
el.dWidth = 0.25;
|
|
cpcur.append(el);
|
|
|
|
el.ptGe[0] = ptCenNew;
|
|
el.ptGe[0] -= dRL * vtV;
|
|
el.ptGe[1] = el.ptGe[0] - vtV * dRL;
|
|
el.ptGe[2] = el.ptGe[1];
|
|
cpcur.append(el);
|
|
|
|
if (sType.Find(_T("柔性")) != -1)
|
|
{
|
|
el.ptGe[0] = ptS[0];
|
|
el.ptGe[1] = el.ptGe[0] + vtV * dRL;
|
|
el.ptGe[2] = el.ptGe[1];
|
|
el.dWidth = 0.25;
|
|
cpcur.append(el);
|
|
|
|
el.ptGe[0] = ptE[0];
|
|
el.ptGe[1] = el.ptGe[0] + vtV * dRL;
|
|
el.ptGe[2] = el.ptGe[1];
|
|
el.dWidth = 0.25;
|
|
cpcur.append(el);
|
|
|
|
el.ptGe[0] = ptS[1];
|
|
el.ptGe[1] = el.ptGe[0] - vtV * dRL;
|
|
el.ptGe[2] = el.ptGe[1];
|
|
el.dWidth = 0.25;
|
|
cpcur.append(el);
|
|
|
|
el.ptGe[0] = ptE[1];
|
|
el.ptGe[1] = el.ptGe[0] - vtV * dRL;
|
|
el.ptGe[2] = el.ptGe[1];
|
|
el.dWidth = 0.25;
|
|
cpcur.append(el);
|
|
}
|
|
|
|
m_drawable2d.SetEdage(cpcur);
|
|
}
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::subErase(Adesk::Boolean erasing)
|
|
{
|
|
if (erasing)
|
|
{
|
|
AssocReCreateDraw();
|
|
}
|
|
return AecDbEntityBase::subErase(erasing);
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::AssocReCreateDraw()
|
|
{
|
|
AcDbObjectId id;
|
|
GetSpecialtyData()->GetAt(KEY_ASSOIC,id);
|
|
|
|
AcDbEntity* pEnt = NULL;
|
|
Acad::ErrorStatus es;
|
|
|
|
if ( Acad::eOk == (es = acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite)))
|
|
{
|
|
AecDbEntityBase* pEntBase = AecDbEntityBase::cast(pEnt);
|
|
if (pEntBase != NULL)
|
|
{
|
|
pEntBase->ReCreateDraw2d();
|
|
pEntBase->ReCreateDraw3d();
|
|
}
|
|
|
|
AecDbCurveBase* pCrvBase = AecDbCurveBase::cast(pEnt);
|
|
if (pCrvBase != NULL)
|
|
{
|
|
pCrvBase->ReCreateDraw2d();
|
|
pCrvBase->ReCreateDraw3d();
|
|
}
|
|
|
|
pEnt->close();
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
|
|
bool AecDbX3dPartEntity::GetPositionGrip(int nIndex, AecGripData *&pGrip) const
|
|
{
|
|
if (nIndex < GRIP_LENGTH && nIndex >= 0)
|
|
{
|
|
pGrip = &m_pGripAppData[nIndex];
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//As Pipe As Hole 实体
|
|
Acad::ErrorStatus AecDbX3dPartEntity::HoleAndPipeExtend(double dThickAdd,const AcGeVector3d& vtAdd)
|
|
{
|
|
AssertWriteEnabled();
|
|
|
|
if (!objectId().isValid())
|
|
{
|
|
return Acad::eOk;
|
|
}
|
|
|
|
AcGeVector3d vtZ2 = vtAdd;
|
|
vtZ2.normalize();
|
|
|
|
CString sName = GetName();
|
|
AcGeVector3d vtZ,vtWall(0,0,0);
|
|
double dThick = 0.0;
|
|
int nShpae = 0;
|
|
GetSpecialtyData()->GetAt(_T("nShape"),nShpae);//方
|
|
|
|
AcGePoint3d ptOrg = m_pPart->GetOrgPoint(false);
|
|
ptOrg += vtAdd;
|
|
|
|
double dL = 0.0,dW = 0.0,dH = 0.0,dT = 0.0;
|
|
CString sNo;
|
|
GetSpecialtyData()->GetAt(KEY_NO,sNo);
|
|
|
|
if (sName.CompareNoCase(_T("开洞")) == 0)
|
|
{
|
|
if (nShpae == eRect)
|
|
{
|
|
GetSpecialtyData()->GetAt(_T("m_dL"),dL);
|
|
GetSpecialtyData()->GetAt(_T("m_dW"),dW);
|
|
GetSpecialtyData()->GetAt(_T("m_dT"),dH);
|
|
GetSpecialtyData()->GetAt(_T("vtDir"),vtZ);
|
|
dThick = dH;
|
|
}
|
|
else if (nShpae == eCircle)
|
|
{
|
|
GetSpecialtyData()->GetAt(_T("m_dL"),dL);
|
|
GetSpecialtyData()->GetAt(_T("m_dW"),dW);
|
|
GetSpecialtyData()->GetAt(_T("m_dT"),dH);
|
|
GetSpecialtyData()->GetAt(_T("vtDir"),vtZ);
|
|
|
|
dL *= 2.0;
|
|
dW *= 2.0;
|
|
dThick = dH;
|
|
}
|
|
else
|
|
{
|
|
//异形洞口
|
|
CString sPoint2dsTop;
|
|
GetSpecialtyData()->GetAt(_T("Points"),sPoint2dsTop);
|
|
|
|
GetSpecialtyData()->GetAt(_T("dH"),dH);
|
|
GetSpecialtyData()->GetAt(_T("vtDir"),vtZ);
|
|
|
|
dThick = dH;
|
|
|
|
AcDbPolyline* pPl = CoreTools::StringToPolyline(sPoint2dsTop);
|
|
if (pPl != NULL)
|
|
{
|
|
AcGeMatrix3d xform;
|
|
|
|
vtZ2 *= 0.5 * dThickAdd;
|
|
xform.setToTranslation(vtZ2);
|
|
pPl->transformBy(xform);
|
|
|
|
sPoint2dsTop = _T("");
|
|
CoreTools::PolylineToString(pPl,sPoint2dsTop);
|
|
|
|
GetSpecialtyData()->SetAt(_T("Points"),sPoint2dsTop);
|
|
|
|
delete pPl;
|
|
//TEST
|
|
/*
|
|
pPl->setColorIndex(1);
|
|
AddToModelSpace(pPl);
|
|
*/
|
|
}
|
|
}
|
|
|
|
if (nShpae == eCircle)//cir
|
|
{
|
|
GetSpecialtyData()->SetAt(KEY_NO,sNo);
|
|
SetAsHole(ptOrg,0.5 * dL,dThick + dThickAdd,vtZ,FALSE);
|
|
}
|
|
else if (nShpae == eRect)//rect
|
|
{
|
|
GetSpecialtyData()->SetAt(KEY_NO,sNo);
|
|
SetAsHole(ptOrg,dL,dW,dThick + dThickAdd,vtZ,FALSE);
|
|
}
|
|
else
|
|
{
|
|
//异形洞口
|
|
CString sPoint2dsTop;
|
|
GetSpecialtyData()->GetAt(_T("Points"),sPoint2dsTop);
|
|
GetSpecialtyData()->SetAt(KEY_NO,sNo);
|
|
SetAsHole(ptOrg,sPoint2dsTop,dThick + dThickAdd,vtZ);
|
|
}
|
|
}
|
|
else if (sName.CompareNoCase(_T("套管")) == 0)
|
|
{
|
|
int nDlgShape = 0;
|
|
BOOL bExt = FALSE;
|
|
double dEx1 = 0;
|
|
double dEx2 = 0;
|
|
|
|
if (nShpae == eCircle)
|
|
{
|
|
GetSpecialtyData()->GetAt(_T("dH"),dL);
|
|
GetSpecialtyData()->GetAt(_T("dD"),dH);
|
|
GetSpecialtyData()->GetAt(_T("dT"),dT);
|
|
GetSpecialtyData()->GetAt(_T("bExt"),bExt);
|
|
GetSpecialtyData()->GetAt(_T("dEx1"),dEx1);
|
|
GetSpecialtyData()->GetAt(_T("dEx2"),dEx2);
|
|
GetSpecialtyData()->GetAt(_T("vtDir"),vtZ);
|
|
GetSpecialtyData()->GetAt(_T("vtWall"), vtWall);
|
|
|
|
nDlgShape = 0;
|
|
dThick = dL;
|
|
}
|
|
else if (nShpae == eRect)
|
|
{
|
|
GetSpecialtyData()->GetAt(_T("dH"),dL);
|
|
GetSpecialtyData()->GetAt(_T("dL"),dW);
|
|
GetSpecialtyData()->GetAt(_T("dW"),dH);
|
|
GetSpecialtyData()->GetAt(_T("dT"),dT);
|
|
GetSpecialtyData()->GetAt(_T("bExt"),bExt);
|
|
GetSpecialtyData()->GetAt(_T("dEx1"),dEx1);
|
|
GetSpecialtyData()->GetAt(_T("dEx2"),dEx2);
|
|
GetSpecialtyData()->GetAt(_T("vtDir"),vtZ);
|
|
GetSpecialtyData()->GetAt(_T("vtWall"), vtWall);
|
|
|
|
nDlgShape = 1;
|
|
dThick = dL;
|
|
}
|
|
else
|
|
{
|
|
//没有异形管
|
|
return Acad::eOk;
|
|
}
|
|
GetSpecialtyData()->SetAt(KEY_NO,sNo);
|
|
|
|
if (vtWall.isZeroLength())
|
|
SetAsPipe(ptOrg,nDlgShape,dH,(nDlgShape==0) ? dH : dW,dT,dThick + dThickAdd,bExt,dEx1,dEx2,vtZ);
|
|
else
|
|
SetAsPipe(ptOrg, nDlgShape, dH, (nDlgShape == 0) ? dH : dW, dT, dThick + dThickAdd, bExt, dEx1, dEx2, vtZ,vtWall);
|
|
}
|
|
else if(sName.Find(_T("井")) != -1)
|
|
{
|
|
//对于井上对齐,所以vtAdd*2
|
|
AddMove(2.0 * vtAdd);
|
|
|
|
AecDbObjXDataMap* pXData = GetSpecialtyData();
|
|
|
|
//重建
|
|
if (sName.CompareNoCase(_T("方台井")) == 0)
|
|
{
|
|
double dL = 0,dW = 0,dH = 0,dA = 0,dB = 0,dT = 0,dSlabThick = 0,dBomThick;
|
|
pXData->GetAt(_T("dL"),dL);
|
|
pXData->GetAt(_T("dW"),dW);
|
|
pXData->GetAt(_T("dH"),dH);
|
|
pXData->GetAt(_T("dL1"),dA);
|
|
pXData->GetAt(_T("dW1"),dB);
|
|
pXData->GetAt(_T("dt"),dT);
|
|
pXData->GetAt(_T("dBomt"),dBomThick);
|
|
if (dBomThick < 1.e-2)
|
|
dBomThick = dT;
|
|
|
|
pXData->GetAt(_T("m_dT"),dSlabThick);
|
|
dSlabThick /= 1.1;
|
|
dSlabThick += dThickAdd;
|
|
|
|
AcGePoint3d ptCen = GetOrgPoint(true);
|
|
ResetMove();
|
|
ptOrg = ptCen;
|
|
ptOrg.z += 0.5 * dSlabThick;//到中心
|
|
|
|
SetAsHole(ptOrg,dL,dW,1.1 * dSlabThick,AcGeVector3d::kZAxis);
|
|
|
|
AcGeVector2d vtOffset(0,0);
|
|
SetAsWell(ptCen,dL,dW,dA,dB,dH,dT,dBomThick,vtOffset,true);
|
|
}
|
|
else if(sName.CompareNoCase(_T("方圆井")) == 0)
|
|
{
|
|
double dL = 0,dW = 0,dH = 0,dT = 0;
|
|
pXData->GetAt(_T("dL"),dL);
|
|
pXData->GetAt(_T("dW"),dW);
|
|
pXData->GetAt(_T("dH"),dH);
|
|
|
|
double dr = 0.0;
|
|
pXData->GetAt(_T("dr"),dr);
|
|
double dD = 2.0 * dr;
|
|
pXData->GetAt(_T("dt"),dT);
|
|
|
|
double dBomT = dT;
|
|
pXData->GetAt(_T("dBomT"),dBomT);
|
|
if (dBomT < 1.e-2)
|
|
dBomT = dT;
|
|
|
|
double dXOffset = 0,dSlabThick = 0;
|
|
pXData->GetAt(_T("dXOffset"),dXOffset);
|
|
|
|
pXData->GetAt(_T("m_dT"),dSlabThick);
|
|
dSlabThick /= 1.1;
|
|
dSlabThick += dThickAdd;
|
|
|
|
AcGePoint3d ptCen = GetOrgPoint(true);
|
|
AcGePoint3d ptOrg = ptCen;
|
|
ptOrg = ptCen;
|
|
ptOrg.z += 0.5 * dSlabThick;//到中心
|
|
|
|
ResetMove();
|
|
SetAsHole(ptOrg,dL,dW,1.2 * dSlabThick,AcGeVector3d::kZAxis);
|
|
|
|
SetAsWell(ptCen,dL,dW,0.5 * dD,dH,dT,dBomT,dXOffset,true);
|
|
}
|
|
else if(sName.CompareNoCase(_T("集水坑井")) == 0)
|
|
{
|
|
double dAng = 22.5,dL = 0,dW = 0,dH = 0;
|
|
pXData->GetAt(_T("dL"),dL);
|
|
pXData->GetAt(_T("dW"),dW);
|
|
pXData->GetAt(_T("dH"),dH);
|
|
|
|
double dBomThick = 0,dT = 0,dAngle = 0;
|
|
if (pXData->GetAt(_T("dSlabThick"),dBomThick))
|
|
{
|
|
pXData->GetAt(_T("dBomThick"),dT);
|
|
}
|
|
else
|
|
{
|
|
pXData->GetAt(_T("dBomThick"),dBomThick);
|
|
pXData->GetAt(_T("dBomThick"),dT);
|
|
}
|
|
|
|
double dSlabThick = 0;
|
|
pXData->GetAt(_T("m_dT"),dSlabThick);
|
|
dSlabThick /= 1.1;
|
|
dSlabThick += dThickAdd;
|
|
|
|
if ( pXData->GetAt(_T("Ang"),dAng) )
|
|
{
|
|
dAng *= 180.0 / PI;
|
|
}
|
|
dAngle = dAng;
|
|
|
|
AcGePoint3d ptCen = GetOrgPoint(true);
|
|
AcGePoint3d ptOrg = ptCen;
|
|
ptOrg.z += 0.5 * dSlabThick;//到中心
|
|
ResetMove();
|
|
SetAsHole(ptOrg,dL,dW,1.1 * dSlabThick,AcGeVector3d::kZAxis);
|
|
|
|
AcGeVector2d vtOffset(0,0);
|
|
dAng = dAngle * PI / 180.0;
|
|
float fSlabThick = (float)(dBomThick);
|
|
SetAsWell(ptCen,dL,dW,dH,fSlabThick,dT,dAng,true);
|
|
}
|
|
else if (sName.CompareNoCase(_T("圆台井")) == 0)
|
|
{
|
|
double dR = 0,dT = 0,dH = 0;
|
|
pXData->GetAt(_T("dR"),dR);
|
|
double dD = dR * 2.0;
|
|
|
|
double dr = 0;
|
|
pXData->GetAt(_T("dr"),dr);
|
|
double dd = dr * 2.0;
|
|
|
|
pXData->GetAt(_T("dt"),dT);
|
|
|
|
double dBomt = dT;
|
|
pXData->GetAt(_T("dBomt"),dBomt);
|
|
pXData->GetAt(_T("dH"),dH);
|
|
|
|
double dSlabThick = 0;
|
|
pXData->GetAt(_T("m_dT"),dSlabThick);
|
|
dSlabThick /= 1.1;
|
|
dSlabThick += dThickAdd;
|
|
|
|
AcGePoint3d ptCen = GetOrgPoint(true);
|
|
ResetMove();
|
|
|
|
AcGePoint3d ptOrg = ptCen;
|
|
ptOrg.z += 0.5 * dSlabThick;//到中心
|
|
|
|
SetAsHole(ptOrg,0.5 * dD,1.1 * dSlabThick,AcGeVector3d::kZAxis);
|
|
|
|
AcGeVector2d vtOffset(0,0);
|
|
SetAsWell(ptCen,0.5 * dD,0.5 * dd,dH,dT,dBomt,vtOffset,true);
|
|
|
|
}
|
|
else if (sName.CompareNoCase(_T("异形偏心井")) == 0)
|
|
{
|
|
CString szPoint2dsTop,szPoint2dsBom;
|
|
pXData->GetAt(_T("TopScr"),szPoint2dsTop);
|
|
pXData->GetAt(_T("BomScr"),szPoint2dsBom);
|
|
|
|
double dSlabThick = 0;
|
|
pXData->GetAt(_T("m_dT"),dSlabThick);
|
|
dSlabThick /= 1.1;
|
|
dSlabThick += dThickAdd;
|
|
|
|
AcGePoint3d ptCen = GetOrgPoint(true);
|
|
ResetMove();
|
|
|
|
AcGePoint3d ptOrg = ptCen;
|
|
ptOrg.z += 0.5 * dSlabThick;//到中心
|
|
|
|
double dH = 0,dThick = 0,dBomThick = 0;
|
|
pXData->GetAt(_T("dH"),dH);
|
|
pXData->GetAt(_T("dThick"),dThick);
|
|
pXData->GetAt(_T("dBomThick"),dBomThick);
|
|
|
|
SetAsHole(ptOrg,szPoint2dsTop,1.1 * dSlabThick,AcGeVector3d::kZAxis);
|
|
|
|
double dElBom = ptOrg.z - 0.5 * dSlabThick;
|
|
AcGeVector2d vtOffset(0,0);
|
|
SetAsWell(szPoint2dsTop,szPoint2dsBom,dH,dThick,dBomThick,dElBom,true);
|
|
}
|
|
else
|
|
{
|
|
//...
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//...
|
|
}
|
|
return Acad::eOk;
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::AdjustHoleAndPipe(double dThickOld,double dThickAdd,int nDir)
|
|
{
|
|
if (!objectId().isValid())
|
|
{
|
|
return Acad::eOk;
|
|
}
|
|
|
|
AcGeVector3d vtZ,vtAdd;
|
|
GetSpecialtyData()->GetAt(_T("vtDir"),vtZ);
|
|
|
|
vtZ.normalize();
|
|
vtAdd = vtZ;
|
|
vtAdd *= 0.5 * dThickAdd;
|
|
|
|
//向心的方向
|
|
if (nDir < 0)
|
|
vtAdd *= nDir;
|
|
|
|
HoleAndPipeExtend(dThickAdd,vtAdd);
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
int AecDbX3dPartEntity::ComparedTo(AecDbEntityBase* pCurOther) const
|
|
{
|
|
assertReadEnabled();
|
|
|
|
AecDbX3dPartEntity* pOther = AecDbX3dPartEntity::cast(pCurOther);
|
|
if (pOther != NULL)
|
|
{
|
|
CString sName = GetName();
|
|
if (sName.CompareNoCase(_T("开洞")) == 0)
|
|
{
|
|
int nShpae1 = 0;
|
|
GetSpecialtyData()->GetAt(_T("nShape"),nShpae1);
|
|
|
|
int nShpae2 = 0;
|
|
GetSpecialtyData()->GetAt(_T("nShape"),nShpae2);
|
|
|
|
if (nShpae1 != nShpae2)
|
|
return 1;
|
|
|
|
double dL = 0.0,dW = 0.0,dH = 0.0;
|
|
if (nShpae1 == eRect)
|
|
{
|
|
GetSpecialtyData()->GetAt(_T("m_dL"),dL);
|
|
GetSpecialtyData()->GetAt(_T("m_dW"),dW);
|
|
GetSpecialtyData()->GetAt(_T("m_dT"),dH);
|
|
}
|
|
else if (nShpae1 == eCircle)
|
|
{
|
|
GetSpecialtyData()->GetAt(_T("m_dL"),dL);
|
|
GetSpecialtyData()->GetAt(_T("m_dW"),dW);
|
|
GetSpecialtyData()->GetAt(_T("m_dT"),dH);
|
|
}
|
|
else
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
double dL2 = 0.0,dW2 = 0.0,dH2 = 0.0;
|
|
if (nShpae1 == eRect)
|
|
{
|
|
pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("m_dL"),dL2);
|
|
pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("m_dW"),dW2);
|
|
pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("m_dT"),dH2);
|
|
}
|
|
else if (nShpae1 == eCircle)
|
|
{
|
|
pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("m_dL"),dL2);
|
|
pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("m_dW"),dW2);
|
|
pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("m_dT"),dH2);
|
|
}
|
|
else
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
AcGePoint3d ptOrg1 = GetOrgPoint(true);
|
|
AcGePoint3d ptOrg2 = pOther->GetOrgPoint(true);
|
|
if (ptOrg1.distanceTo(ptOrg2) > 1.e-1)
|
|
return 1;
|
|
|
|
if ( fabs(dL - dL2) > 1.0)
|
|
return 1;
|
|
|
|
if ( fabs(dW - dW2) > 1.0)
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
else if (sName.CompareNoCase(_T("套管")) == 0)
|
|
{
|
|
int nShpae1 = 0;
|
|
GetSpecialtyData()->GetAt(_T("nShape"),nShpae1);
|
|
|
|
int nShpae2 = 0;
|
|
GetSpecialtyData()->GetAt(_T("nShape"),nShpae2);
|
|
|
|
if (nShpae1 != nShpae2)
|
|
return 1;
|
|
|
|
double dL = 0.0,dW = 0.0,dH = 0.0,dT = 0.0;
|
|
|
|
if (nShpae1 == eCircle)
|
|
{
|
|
GetSpecialtyData()->GetAt(_T("dH"),dL);
|
|
GetSpecialtyData()->GetAt(_T("dD"),dH);
|
|
GetSpecialtyData()->GetAt(_T("dT"),dT);
|
|
}
|
|
else if (nShpae1 == eRect)
|
|
{
|
|
GetSpecialtyData()->GetAt(_T("dH"),dL);
|
|
GetSpecialtyData()->GetAt(_T("dL"),dW);
|
|
GetSpecialtyData()->GetAt(_T("dW"),dH);
|
|
GetSpecialtyData()->GetAt(_T("dT"),dT);
|
|
}
|
|
else
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
double dL2 = 0.0,dW2 = 0.0,dH2 = 0.0,dT2 = 0.0;
|
|
if (nShpae1 == eCircle)
|
|
{
|
|
pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("dH"),dL2);
|
|
pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("dD"),dH2);
|
|
pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("dT"),dT2);
|
|
|
|
if ( fabs(dL - dL2) > 1.0)
|
|
return 1;
|
|
|
|
if ( fabs(dH - dH2) > 1.0)
|
|
return 1;
|
|
|
|
if ( fabs(dT - dT2) > 1.0)
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
else if (nShpae1 == eRect)
|
|
{
|
|
pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("dH"),dL2);
|
|
pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("dL"),dW2);
|
|
pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("dW"),dH2);
|
|
pOther->GetSpecialtyData(AcDb::kForRead)->GetAt(_T("dT"),dT2);
|
|
|
|
if ( fabs(dL - dL2) > 1.0)
|
|
return 1;
|
|
|
|
if ( fabs(dH - dH2) > 1.0)
|
|
return 1;
|
|
|
|
if ( fabs(dT - dT2) > 1.0)
|
|
return 1;
|
|
|
|
if ( fabs(dW - dW2) > 1.0)
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
return -1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//比较体积,素砼 体积较大不考虑
|
|
//double dVol1 = GetVolume();
|
|
//double dVol2 = pOther->GetVolume();
|
|
|
|
//if ( fabs(dVol1 - dVol2) > 1.0)
|
|
// return 1;
|
|
|
|
return 0;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
int AecDbX3dPartEntity::GetSectionDraw(const AcGePoint3d& ptFr,const AcGePoint3d& ptTo,const AcGeVector3d& vtViewDir,const AcGeVector3d& vtTo, AcDbVoidPtrArray& arRegionPtrs) const
|
|
{
|
|
//对于井等
|
|
CString sName;
|
|
sName = GetName();
|
|
|
|
if (sName.Find(_T("洞")) != -1 ||
|
|
sName.Find(_T("管")) != -1)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
AcGeVector3d vtLn = ptTo - ptFr;
|
|
AcGeVector3d vtNorm = vtLn.crossProduct(vtViewDir);
|
|
|
|
AcGePlane plan;
|
|
plan.set(ptFr,vtNorm);
|
|
|
|
AcGeMatrix3d xformPlanToWorld;
|
|
xformPlanToWorld.setToPlaneToWorld(plan);
|
|
xformPlanToWorld.invert();
|
|
|
|
AcDbVoidPtrArray arSolidPtrs;
|
|
AcDb3dSolid* pSolidDraw = CreateDraw3dSolid();
|
|
if (pSolidDraw != NULL)
|
|
{
|
|
arSolidPtrs.append(pSolidDraw);
|
|
}
|
|
|
|
AcDbRegion* pRegionT = NULL;
|
|
AcDb3dSolid* pSolidT = NULL;
|
|
AcDbEntity* pEntT = NULL;
|
|
for (int k = 0;k < arSolidPtrs.length();k++)
|
|
{
|
|
pEntT = (AcDbEntity*)arSolidPtrs.at(k);
|
|
pSolidT = AcDb3dSolid::cast(pEntT);
|
|
if (pSolidT != NULL)
|
|
{
|
|
pRegionT = NULL;
|
|
pSolidT->getSection(plan,pRegionT);
|
|
|
|
if (pRegionT != NULL)
|
|
{
|
|
pRegionT->transformBy(xformPlanToWorld);
|
|
pRegionT->setLayer(pSolidT->layer());
|
|
|
|
AcDbVoidPtrArray arHatchPtrs;
|
|
CString sPattern;
|
|
GetSectionHatchPattern(sPattern);
|
|
RegionHatch(pRegionT,arHatchPtrs,sPattern);
|
|
if (!arHatchPtrs.isEmpty())
|
|
{
|
|
arRegionPtrs.append(arHatchPtrs);
|
|
}
|
|
|
|
//如果是套管标注
|
|
arRegionPtrs.append(pRegionT);
|
|
}
|
|
delete pSolidT;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
SHJson::WValue& AecDbX3dPartEntity::ToJson(bool bExprotGeo) const
|
|
{
|
|
assertReadEnabled();
|
|
using namespace SHJson;
|
|
WValue &v = AecDbEntityBase::ToJson(bExprotGeo);
|
|
|
|
AcDbObjectId ownerid;
|
|
GetSpecialtyData()->GetAt(_T("Assoc"), ownerid);
|
|
addMember(v, _T("__owner__"), ownerid.asOldId());
|
|
addMember(v, _T("__pPart__"), m_pPart->ToJson());
|
|
|
|
return v;
|
|
}
|
|
|
|
bool AecDbX3dPartEntity::ByJson(const SHJson::WValue &v)
|
|
{
|
|
AssertWriteEnabled();
|
|
using namespace SHJson;
|
|
|
|
if (!AecDbEntityBase::ByJson(v)) return false;
|
|
|
|
MCIt it = v.FindMember(_T("__pPart__"));
|
|
if (it == v.MemberEnd()) return false;
|
|
|
|
AecDbX3dPart *pPart = new AecDbX3dPart();
|
|
if (pPart->ByJson(it->value))
|
|
{
|
|
DELETE_PTR(m_pPart);
|
|
m_pPart = pPart;
|
|
}
|
|
else
|
|
{
|
|
DELETE_PTR(pPart);
|
|
return false;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
Acad::ErrorStatus AecDbX3dPartEntity::subWblockClone(AcRxObject * pOwnerObject
|
|
, AcDbObject *& pClonedObject
|
|
, AcDbIdMapping & idMap
|
|
, Adesk::Boolean isPrimary) const
|
|
{
|
|
// 如果已经克隆过了,就直接返回,避免重复克隆
|
|
AcDbIdPair idPairOpening(id(), AcDbObjectId::kNull, false, isPrimary ? true : false);
|
|
if (idMap.compute(idPairOpening))
|
|
return Acad::eOk;
|
|
|
|
Acad::ErrorStatus es = AecDbEntityBase::subWblockClone(pOwnerObject, pClonedObject, idMap, isPrimary);
|
|
|
|
// 与洞口的关联关系再板实体中建立
|
|
|
|
if (!pClonedObject) return es;
|
|
|
|
AecDbX3dPartEntity *pOpening = AecDbX3dPartEntity::cast(pClonedObject);
|
|
if (pOpening)
|
|
pOpening->SetAt(KEY_ASSOIC, AcDbObjectId::kNull);
|
|
return es;
|
|
|
|
return Acad::ErrorStatus();
|
|
} |