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

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