按"3dbuffer 非空才存、空就不存、读不到就重建"的语义实现第一版: - 块写在 AecDbX3dPartEntity::dwgOutFields **末尾**,读在 dwgInFields 末尾探测 magic 'A3DP'。不写在 AecDbX3dPart 里:part 是嵌在实体流中间的子流 (它后面还有 m_drawable2d),老版本会把块的字节当成后续字段读。 - 读不到 magic / 块不完整 / modeler 恢复失败 → 一律保持 m_bNeedCreate 走重建, 不刷日志、不动 kCurrentVersionNumber(老版本读新图 = 照旧重建)。 - 内存 filer(clone / copyFrom / 剪贴板)不参与,避免拷贝出来的实体夹带用不上的缓存。 - 探测块会让 filer 状态变成 eEndOfFile,所以 dwgInFields 末尾显式 return eOk, 不再 return pFiler->filerStatus()(否则整个实体会被判读取失败)。 - AecDbX3dPart 加两个存盘用访问器:GetDwgCacheSolid()(脏/没建过返回 NULL)、 SetDwgCacheSolid()(接管恢复出来的 solid,顺带丢掉 m_pSolidDraw 让绘制副本重建)。 - cmakelists.txt:AEC_HAS_MODELER_FILER 对中望也放开(ZRX/Z20xx/arxport/inc/dbacis.h 把 acdbModeler* 映射到 zcdbModeler*,ZwDatabase.lib 有这些符号)。 - 开关 AEC_3D_DWG_CACHE:默认关(确认收益前不改存盘结果),=1 打开; AEC_3D_CACHE_TRACE=1 时把每次 read/write 写 %TEMP%\aec_x3d_cache.log。 实测(big1.dwg,R230 Debug): - 开图期探测到 220 个 part 实体,全部 miss(老图,正常回退重建); - 存盘(MOVE+REGEN+QSAVE)后跟踪日志 **0 条 write**,DWG 只多 128 KB: 这 220 个 part 实体在存盘时不是脏的,增量存盘按字节整块拷贝,dwgOutFields 没被调用; - 而 X3dPart::Rebuild 是 1138 次 —— 说明 1248 个 part 里只有 220 个是入库实体, 其余 ~918 个是 AecDbBDPipeBase/AecDbSlab/AecDbWeir/AecDbWell 等绘制期 new 出来的临时 part。 结论(已写进 3d-cache-dwg-verdict.md §8):这一版覆盖面上限 220/1248 ≈ 18%, 而且是"part 自己的流里带缓存"这个方案的天生缺陷;下一步要么挂到**所有者实体** (它们存盘时确实是脏的,写得出去),要么做**图级中央缓存**。等决策后再动。
4634 lines
114 KiB
C++
4634 lines
114 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"
|
||
#include "SectionPerfCounter.h"
|
||
#ifdef AEC_HAS_MODELER_FILER
|
||
#include "dbacis.h"
|
||
#endif
|
||
|
||
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;
|
||
|
||
// ===========================================================================
|
||
// 3D 几何缓存随存盘(modeler filer 通道)
|
||
//
|
||
// 为什么挂在 AecDbX3dPartEntity 这一层:
|
||
// - 3D 几何(AecDbX3dPart::m_pSolid)是布尔运算的结果,重建一次 15 ms 量级;
|
||
// 而把它当 ASM body 存取只要不到 1 ms(实测见 3d-cache-dwg-verdict.md §7)。
|
||
// - AecDbX3dPart 是嵌在实体流**中间**的子流(它后面还有 m_drawable2d),
|
||
// 往里加块会让老版本插件把块的字节当成它后面的字段读(管道那次就这样把 XWall 读崩了)。
|
||
// 而 AecDbX3dPartEntity 的 dwgOutFields 末尾就是本实体流的结尾,老版本读到自己
|
||
// 需要的字段就停,尾部多出来的字节会被忽略(AutoCAD 流按对象定长)。
|
||
// - 不升 kCurrentVersionNumber:老版本读新图 = 读不到块 = 照旧重建。
|
||
//
|
||
// 语义:
|
||
// - 存:part 的几何有效(没被置脏、且建过)才写;没有就写 count=0,等于没存;
|
||
// - 读:读不到 magic(老图/开关关掉)或任何一步失败 → 静默回退重建。
|
||
// ===========================================================================
|
||
namespace
|
||
{
|
||
#ifdef AEC_HAS_MODELER_FILER
|
||
|
||
// 开关:AEC_3D_DWG_CACHE=0 时既不再写块、也不读块(A/B 对照用)
|
||
bool IsX3dDwgCacheEnabled()
|
||
{
|
||
static int s_nOn = -1;
|
||
if (s_nOn < 0)
|
||
{
|
||
const char* psz = ::getenv("AEC_3D_DWG_CACHE");
|
||
s_nOn = (psz != NULL && psz[0] != '0') ? 1 : 0; // default off until the win is proven
|
||
}
|
||
return s_nOn == 1;
|
||
}
|
||
|
||
// 试点跟踪(AEC_3D_CACHE_TRACE=1):确认存盘/开图时这个块的调用情况
|
||
void Trace3DCache(const char* pszFmt, ...)
|
||
{
|
||
static int s_nOn = -1;
|
||
if (s_nOn < 0)
|
||
{
|
||
const char* psz = ::getenv("AEC_3D_CACHE_TRACE");
|
||
s_nOn = (psz != NULL && psz[0] != '0') ? 1 : 0;
|
||
}
|
||
if (s_nOn != 1) return;
|
||
|
||
TCHAR szTmp[MAX_PATH + 1];
|
||
::memset(szTmp, 0, sizeof(szTmp));
|
||
if (::GetTempPath(MAX_PATH, szTmp) == 0) return;
|
||
TCHAR szFile[MAX_PATH + 1];
|
||
::_stprintf_s(szFile, MAX_PATH, _T("%saec_x3d_cache.log"), szTmp);
|
||
FILE* fp = NULL;
|
||
if (_tfopen_s(&fp, szFile, _T("a")) != 0 || fp == NULL) return;
|
||
va_list args;
|
||
va_start(args, pszFmt);
|
||
vfprintf(fp, pszFmt, args);
|
||
va_end(args);
|
||
fputc(10, fp);
|
||
fclose(fp);
|
||
}
|
||
const Adesk::UInt32 kX3dMagic = 0x50443341; // 'A3DP'
|
||
const Adesk::UInt32 kX3dMagicEnd = 0x50443341 ^ 0xFFFFFFFF;
|
||
const Adesk::UInt16 kX3dBlkVer = 1;
|
||
|
||
// 内存 filer(clone / copyFrom / 剪贴板)不参与:它的读取语义与 DWG 流不同,
|
||
// 写进去也只会让拷贝出来的实体带着一份用不上的缓存
|
||
bool IsMemoryFiler(AcDbDwgFiler* pFiler)
|
||
{
|
||
return (pFiler != NULL) && pFiler->isKindOf(CMFCDbDwgFiler::desc());
|
||
}
|
||
|
||
void WriteX3dGeomBlock(AcDbDwgFiler* pFiler, const AecDbX3dPart* pPart)
|
||
{
|
||
if (pFiler == NULL || pPart == NULL)
|
||
return;
|
||
if (IsMemoryFiler(pFiler) || !IsX3dDwgCacheEnabled())
|
||
return;
|
||
|
||
AcDb3dSolid* pSolid = pPart->GetDwgCacheSolid();
|
||
const bool bHasSolid = (pSolid != NULL);
|
||
Trace3DCache("write hasSolid=%d", bHasSolid ? 1 : 0);
|
||
|
||
// 没有几何也写头(count=0):读端才知道"这次真的没缓存",而不是老数据
|
||
pFiler->writeUInt32(kX3dMagic);
|
||
pFiler->writeUInt16(kX3dBlkVer);
|
||
pFiler->writeUInt16(0); // flags 预留
|
||
pFiler->writeUInt32(bHasSolid ? 1 : 0);
|
||
|
||
if (!bHasSolid)
|
||
{
|
||
pFiler->writeUInt32(kX3dMagicEnd);
|
||
return;
|
||
}
|
||
|
||
SectionPerf::Scope perfScope("X3dGeom.write");
|
||
|
||
ENTITY* pAsm = (ENTITY*)pSolid->getLockedASMBody();
|
||
if (pAsm == NULL)
|
||
{
|
||
// 拿不到 body:块已经写了一半,补 0 让读端当"没有缓存"
|
||
pFiler->writeUInt32(0);
|
||
return;
|
||
}
|
||
|
||
AcDbDatabase* pDb = pSolid->database();
|
||
if (pDb == NULL)
|
||
pDb = acdbHostApplicationServices()->workingDatabase();
|
||
|
||
// modelerVersion = -1:跟随 filer 的 DWG 版本,不硬编码
|
||
Acad::ErrorStatus es = acdbModelerSaveEntityToDwgFiler(pFiler, pAsm, pDb, -1);
|
||
pSolid->unlockASMBody();
|
||
|
||
if (es != Acad::eOk)
|
||
{
|
||
pFiler->writeUInt32(0); // 同上:让读端回退
|
||
return;
|
||
}
|
||
|
||
pFiler->writeUInt32(kX3dMagicEnd);
|
||
}
|
||
|
||
// 返回 true = 成功用块里的几何接管了 part
|
||
bool ReadX3dGeomBlock(AcDbDwgFiler* pFiler, AecDbX3dPart* pPart)
|
||
{
|
||
if (pFiler == NULL || pPart == NULL)
|
||
return false;
|
||
if (IsMemoryFiler(pFiler))
|
||
return false;
|
||
|
||
// 老图 / 写端关掉:读到的不是 magic,直接回退(不刷日志)
|
||
Adesk::UInt32 nMagic = 0;
|
||
if (pFiler->readUInt32(&nMagic) != Acad::eOk || nMagic != kX3dMagic)
|
||
{
|
||
SectionPerf::Scope missScope("X3dGeom.miss");
|
||
Trace3DCache("read nomagic");
|
||
return false;
|
||
}
|
||
|
||
Adesk::UInt16 nBlkVer = 0;
|
||
Adesk::UInt16 nFlags = 0;
|
||
Adesk::UInt32 nCount = 0;
|
||
if (pFiler->readUInt16(&nBlkVer) != Acad::eOk || nBlkVer != kX3dBlkVer)
|
||
return false;
|
||
if (pFiler->readUInt16(&nFlags) != Acad::eOk)
|
||
return false;
|
||
if (pFiler->readUInt32(&nCount) != Acad::eOk)
|
||
return false;
|
||
|
||
Trace3DCache("read magic=ok count=%u", (unsigned)nCount);
|
||
if (nCount == 0 || nCount > 4)
|
||
return false; // 没缓存 / 数据不可信
|
||
|
||
ENTITY* pAsm = NULL;
|
||
int nModelerVer = -1;
|
||
if (acdbModelerRestoreEntityFromDwgFiler(pFiler, pAsm, &nModelerVer, kReadStrangerEntityDefault) != Acad::eOk)
|
||
return false;
|
||
|
||
Adesk::UInt32 nEnd = 0;
|
||
if (pFiler->readUInt32(&nEnd) != Acad::eOk || nEnd != kX3dMagicEnd)
|
||
return false; // 半成品块:回退重建
|
||
|
||
if (pAsm == NULL)
|
||
return false;
|
||
|
||
AcDb3dSolid* pSolid = new AcDb3dSolid();
|
||
if (pSolid->setASMBody(pAsm) != Acad::eOk)
|
||
{
|
||
delete pSolid;
|
||
return false;
|
||
}
|
||
|
||
pPart->SetDwgCacheSolid(pSolid);
|
||
|
||
SectionPerf::Scope hitScope("X3dGeom.read.ok");
|
||
return true;
|
||
}
|
||
|
||
#endif // AEC_HAS_MODELER_FILER
|
||
}
|
||
|
||
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);
|
||
//开图时不建布尔结果:dwgInFields 里已置脏,首次绘制或取几何时由 EnsureCreated 重建
|
||
|
||
m_drawable2d.dwgInFields(pFiler, version);
|
||
if (pFiler->filerStatus() != Acad::eOk)
|
||
return (pFiler->filerStatus ());
|
||
|
||
#ifdef AEC_HAS_MODELER_FILER
|
||
// 末尾探测 3D 几何块;读不到就是老图(或开关关掉),part 保持"待重建"
|
||
ReadX3dGeomBlock(pFiler, m_pPart);
|
||
#endif
|
||
|
||
// 注意:不能用 return pFiler->filerStatus()。探测块时 readUInt32 在老图上会
|
||
// 把状态置成 eEndOfFile,那样整个实体都会被判成读取失败。
|
||
return Acad::eOk;
|
||
}
|
||
|
||
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);
|
||
|
||
#ifdef AEC_HAS_MODELER_FILER
|
||
// 3D 几何块:只能在**本实体流末尾**追加(见文件顶部那段说明)
|
||
WriteX3dGeomBlock(pFiler, m_pPart);
|
||
#endif
|
||
|
||
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();
|
||
} |