Files
envi-code/SourceCode/Code2026/CoreLibrary/AecDbX3dPartEntity.cpp
T
company-desktop 010d91af04 feat: X3dPart 几何块存盘/恢复(env 开关,默认关)+ 中望放开 modeler filer
按"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 自己的流里带缓存"这个方案的天生缺陷;下一步要么挂到**所有者实体**
(它们存盘时确实是脏的,写得出去),要么做**图级中央缓存**。等决策后再动。
2026-10-29 23:51:31 +08:00

4634 lines
114 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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();
}