Files
envi-code/SourceCode/Code2026/Pool3dCmd/CDSTDlg.cpp
T

1329 lines
33 KiB
C++
Raw Normal View History

2026-10-04 00:04:20 +08:00
#include "stdafx.h"
2026-09-28 15:28:50 +08:00
#include "StdArx.h"
#include "math.h"
#include "CDSTDlg.h"
#include "ZJSTDlg.h"
#include "AcDbX3dSolid.h"
#include "AecDbX3dPartEntity.h"
#include "KTCadUtility.h"
#include "KTCADUtilityEx.h"
#include "CoreTools.h"
#include "GiDrawUtility.h"
CCDSTDlg *g_pCDSTDlg = NULL;
#ifndef ITEM_ROOT
#define ITEM_ROOT 0
#endif
#ifndef ITEM_ITEM
#define ITEM_ITEM 1
#endif
#ifndef ITEM_ITEMSEL
#define ITEM_ITEMSEL 2
#endif
int g_nSTNo = 1;
IMPLEMENT_DYNAMIC(CCDSTDlg, CDialog)
CCDSTDlg::CCDSTDlg(CWnd* pParent/* = NULL*/)
: CDialog(CCDSTDlg::IDD, pParent)
, m_dMove(.0)
, m_dRotate(.0)
, m_nMoveMode(0)
, m_nRotateMode(0)
, m_sPoolSize(_T(""))
, m_sNo(_T("S-001"))
2026-10-04 00:04:20 +08:00
, m_sMaterial(_T("混凝土"))
2026-09-28 15:28:50 +08:00
{
m_pBasinCln = NULL;
memset(&m_poolData,0,sizeof(PoolData));
m_vtDirX.set(1,0,0);
m_vtDirY.set(0,1,0);
g_nSTNo++;
m_sNo.Format(_T("S-%d"),g_nSTNo);
}
CCDSTDlg::~CCDSTDlg(void)
{
}
void CCDSTDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TREE1, m_wndModelTree);
DDX_Radio(pDX, IDC_RADIO1, m_nMoveMode);
DDX_Radio(pDX, IDC_RADIO4, m_nRotateMode);
DDX_Text(pDX, IDC_EDIT19, m_dMove);
DDV_MinMaxDouble(pDX, IDC_EDIT19, .1, 1000000);
DDX_Text(pDX, IDC_EDIT4, m_dRotate);
DDV_MinMaxDouble(pDX, IDC_EDIT4, .1, 1000000);
DDX_Text(pDX, IDC_EDIT1, m_sPoolSize);
DDX_Text(pDX, IDC_EDIT6, m_sNo);
DDX_CBString(pDX, IDC_COMBO1, m_sMaterial);
}
BEGIN_MESSAGE_MAP(CCDSTDlg, CDialog)
ON_WM_CLOSE()
ON_BN_CLICKED(IDOK, &CCDSTDlg::OnBnClickedOk)
ON_BN_CLICKED(IDCANCEL, &CCDSTDlg::OnBnClickedCancel)
ON_BN_CLICKED(IDC_BUTTON2, &CCDSTDlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON7, &CCDSTDlg::OnBnClickedButton7)
ON_BN_CLICKED(IDC_BUTTON8, &CCDSTDlg::OnBnClickedButton8)
ON_BN_CLICKED(IDC_BUTTON9, &CCDSTDlg::OnBnClickedButton9)
ON_BN_CLICKED(IDC_BUTTON11, &CCDSTDlg::OnBnClickedButton11)
ON_BN_CLICKED(IDC_BUTTON12, &CCDSTDlg::OnBnClickedButton12)
ON_BN_CLICKED(IDC_BUTTON31, &CCDSTDlg::OnBnClickedButton31)
ON_BN_CLICKED(IDC_BUTTON34, &CCDSTDlg::OnBnClickedButton34)
ON_BN_CLICKED(IDC_BUTTON27, &CCDSTDlg::OnBnClickedButton27)
ON_BN_CLICKED(IDC_BUTTON28, &CCDSTDlg::OnBnClickedButton28)
ON_BN_CLICKED(IDC_BUTTON3, &CCDSTDlg::OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON10, &CCDSTDlg::OnBnClickedButton10)
ON_NOTIFY(NM_CLICK, IDC_TREE1, &CCDSTDlg::OnNMClickTree1)
ON_MESSAGE(WM_ACAD_KEEPFOCUS, &CCDSTDlg::onAcadKeepFocus)
END_MESSAGE_MAP()
BOOL CCDSTDlg::OnInitDialog()
{
CDialog::OnInitDialog();
UpdateData(FALSE);
CBitmap bmp;
if (!bmp.LoadBitmap (IDB_BITMAPPRIV))
{
AfxMessageBox(_T ("Can't load bitmap IDB_BITMAPPRIV"));
ASSERT (FALSE);
return FALSE;
}
BITMAP bmpObj;
bmp.GetBitmap (&bmpObj);
UINT nFlags = ILC_COLOR24 | ILC_MASK;
m_Imagelist.Create (16, bmpObj.bmHeight, nFlags, 0, 0);
m_Imagelist.Add (&bmp, RGB (255, 0, 0));
m_wndModelTree.SetImageList(&m_Imagelist,TVSIL_NORMAL);
2026-10-04 00:04:20 +08:00
m_wndModelTree.InsertItem(_T("素砼"),ITEM_ROOT,ITEM_ROOT);
2026-09-28 15:28:50 +08:00
ShowTreeView();
return TRUE;
}
void CCDSTDlg::SetPoolBasin(AecDbXSlab* pBasinCln,const AcDbObjectId& idBasinOld)
{
m_idBasinOld = idBasinOld;
if (pBasinCln != NULL)
{
m_pBasinCln = pBasinCln;
m_pBasinCln->GetBasinSlabData(m_poolData);
2026-10-04 00:04:20 +08:00
m_ptOrg = m_pBasinCln->GetBasinOrg();//底板中心
2026-09-28 15:28:50 +08:00
m_vtDirX = m_pBasinCln->GetBasinXDir();
m_vtDirX.normalize();
m_vtDirY = m_vtDirX;
m_vtDirY.rotateBy(PI / 2.0,AcGeVector3d::kZAxis);
double dEl = m_poolData.m_dBomEl;
2026-10-04 00:04:20 +08:00
dEl += m_poolData.m_dBomThick;//到达内底
2026-09-28 15:28:50 +08:00
m_ptOrg.z = dEl;//
}
OPENOBJ_BEGIN(m_idBasinOld, AcDb::kForRead, AecDbXSlab, pEnt)
{
if (pEnt)
{
ESection es = pEnt->GetBasinShape();
m_ePoolSec = es;
switch (es)
{
case eRect:
2026-10-04 00:04:20 +08:00
m_sPoolSize.Format(_T("内长x内宽:%.2fx%.2f"), m_poolData.m_dData[0], m_poolData.m_dData[1]);
2026-09-28 15:28:50 +08:00
break;
case eCircle:
2026-10-04 00:04:20 +08:00
m_sPoolSize.Format(_T("内半径:%.2f"), m_poolData.m_dData[2] - m_poolData.m_dWallThick);
2026-09-28 15:28:50 +08:00
break;
case eEllispe:
2026-10-04 00:04:20 +08:00
m_sPoolSize.Format(_T("内长轴x内短轴:%.2fx%.2f"), m_poolData.m_dData[2], m_poolData.m_dData[2] * m_poolData.m_dData[3]);
2026-09-28 15:28:50 +08:00
break;
case eUserDef:
case eRightTri:
case eEquilTri:
case eTrape:
case eTriangle:
case eXShape:
2026-10-04 00:04:20 +08:00
m_sPoolSize.Format(_T("异形"));
2026-09-28 15:28:50 +08:00
break;
default:
break;
}
}
}
OPENOBJ_END()
UpdateData(FALSE);
if (m_wndModelTree.GetRootItem() == NULL)
2026-10-04 00:04:20 +08:00
m_wndModelTree.InsertItem(_T("素砼"),ITEM_ROOT,ITEM_ROOT);
2026-09-28 15:28:50 +08:00
ShowTreeView();
}
void CCDSTDlg::ShowTreeView()
{
CString sName;
OPENOBJ_BEGIN(m_idBasinOld, AcDb::kForRead, AecDbXSlab, pPool)
{
if (!pPool) return;
int nCount = pPool->GetAssocPartCount();
AcDbObjectId id(AcDbObjectId::kNull);
for (int i = 0; i < nCount; i++)
{
pPool->GetAssocPart(i, id);
OPENOBJ_BEGIN(id, AcDb::kForRead, AecDbX3dPartEntity, pXPart)
{
if (pXPart)
{
sName = pXPart->GetName();
2026-10-04 00:04:20 +08:00
if (sName.Find(_T("素砼")) != -1)
2026-09-28 15:28:50 +08:00
InsertTreeView(sName, id);
}
}
OPENOBJ_END()
}
}
OPENOBJ_END()
}
void CCDSTDlg::OnBnClickedOk()
{
OnClose();
}
void CCDSTDlg::InsertTreeView(LPCTSTR pszName,AcDbObjectId& id)
{
HTREEITEM hItem = m_wndModelTree.InsertItem(pszName, ITEM_ITEM,ITEM_ITEMSEL, m_wndModelTree.GetRootItem());
if (hItem)
m_wndModelTree.SetItemData(hItem, (DWORD_PTR)id.asOldId());
m_wndModelTree.Expand(m_wndModelTree.GetRootItem(), TVE_EXPAND);
}
2026-10-04 00:04:20 +08:00
//直角
2026-09-28 15:28:50 +08:00
void CCDSTDlg::OnBnClickedButton2()
{
CZJSTDlg dlg;
dlg.m_dLen = m_poolData.m_dData[0];
if (IDOK != dlg.DoModal()) return;
CreateRightTriangle(dlg);
acedPostCommand(_T("regen "));
}
2026-10-04 00:04:20 +08:00
//三角
2026-09-28 15:28:50 +08:00
void CCDSTDlg::OnBnClickedButton7()
{
CSJSTDlg dlg;
dlg.m_dL = (int)(m_poolData.m_dData[0]+0.5);
if (IDOK != dlg.DoModal()) return;
CreateTriangle(dlg);
acedPostCommand(_T("regen "));
}
2026-10-04 00:04:20 +08:00
//矩形
2026-09-28 15:28:50 +08:00
void CCDSTDlg::OnBnClickedButton8()
{
CJXSTDlg dlg;
dlg.m_dW = (int)(m_poolData.m_dData[0] + 0.5);
dlg.m_dL = (int)(m_poolData.m_dData[1] + 0.5);
if (IDOK != dlg.DoModal()) return;
CreateRect(dlg);
acedPostCommand(_T("regen "));
}
2026-10-04 00:04:20 +08:00
//梯形
2026-09-28 15:28:50 +08:00
void CCDSTDlg::OnBnClickedButton9()
{
CTXSTDlg dlg;
dlg.m_dL = (int)(m_poolData.m_dData[0] + 0.5);
if (IDOK != dlg.DoModal()) return;
CreateTrapezoid(dlg);
acedPostCommand(_T("regen "));
}
2026-10-04 00:04:20 +08:00
//自定义
2026-09-28 15:28:50 +08:00
void CCDSTDlg::OnBnClickedButton11()
{
CYXSTDlg dlg;
dlg.m_dL = (int)(m_poolData.m_dData[0] + 0.5);
if (IDOK != dlg.DoModal()) return;
ShowWindow(SW_HIDE);
CreateUserDef(dlg);
ShowWindow(SW_SHOW);
acedPostCommand(_T("regen "));
}
2026-10-04 00:04:20 +08:00
// 四角
2026-09-28 15:28:50 +08:00
void CCDSTDlg::OnBnClickedButton12()
{
C4JSTDlg dlg;
if (IDOK != dlg.DoModal()) return;
Create4Angle(dlg);
acedPostCommand(_T("regen "));
}
2026-10-04 00:04:20 +08:00
//移动
2026-09-28 15:28:50 +08:00
void CCDSTDlg::OnBnClickedButton31()
{
AcAxDocLock lock;
UpdateData(TRUE);
AcGeVector3d vt(AcGeVector3d::kXAxis);
switch (m_nMoveMode)
{
case 0:
vt = AcGeVector3d::kXAxis * m_dMove; break;
case 1:
vt = AcGeVector3d::kYAxis * m_dMove; break;
case 2:
vt = AcGeVector3d::kZAxis * m_dMove; break;
default: break;
}
AcDbObjectId id(GetSelectID());
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbX3dPartEntity, pEnt)
{
if (!pEnt) return;
pEnt->AddMove(vt);
pEnt->Create();
}
OPENOBJ_END()
acedPostCommand(_T("regen "));
}
2026-10-04 00:04:20 +08:00
//移动复位
2026-09-28 15:28:50 +08:00
void CCDSTDlg::OnBnClickedButton34()
{
AcAxDocLock lock;
AcDbObjectId id(GetSelectID());
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbX3dPartEntity, pEnt)
{
if (!pEnt) return;
pEnt->ResetMove();
pEnt->Create();
}
OPENOBJ_END()
acedPostCommand(_T("regen "));
}
2026-10-04 00:04:20 +08:00
//旋转
2026-09-28 15:28:50 +08:00
void CCDSTDlg::OnBnClickedButton27()
{
AcAxDocLock lock;
UpdateData(TRUE);
AcGeVector3d vt(AcGeVector3d::kXAxis);
switch (m_nRotateMode)
{
case 0:
vt = AcGeVector3d::kXAxis; break;
case 1:
vt = AcGeVector3d::kYAxis; break;
case 2:
vt = AcGeVector3d::kZAxis; break;
default: break;
}
AcDbObjectId id(GetSelectID());
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbX3dPartEntity, pEnt)
{
if (!pEnt) return;
pEnt->AddRotate(m_nRotateMode, (m_dRotate * PI )/ 180);
pEnt->SetAxis(m_nRotateMode, vt);
pEnt->Create();
}
OPENOBJ_END()
acedPostCommand(_T("regen "));
}
2026-10-04 00:04:20 +08:00
//旋转复位
2026-09-28 15:28:50 +08:00
void CCDSTDlg::OnBnClickedButton28()
{
AcAxDocLock lock;
UpdateData(TRUE);
AcDbObjectId id(GetSelectID());
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbX3dPartEntity, pEnt)
{
if (!pEnt) return;
pEnt->ResetRotation(m_nRotateMode);
pEnt->Create();
}
OPENOBJ_END()
acedPostCommand(_T("regen "));
}
2026-10-04 00:04:20 +08:00
// 修改
2026-09-28 15:28:50 +08:00
void CCDSTDlg::OnBnClickedButton3()
{
AcAxDocLock lock;
AcDbObjectId id(GetSelectID());
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbX3dPartEntity, pEnt)
{
if (!pEnt) return;
int se;
pEnt->GetSpecialtyData()->GetAt(KEY_SECSHAPE, se);
switch ((ESection)se)
{
case eRightTri:
{
CZJSTDlg dlg;
pEnt->GetSpecialtyData()->GetAt(KEY_X, dlg.m_dX);
pEnt->GetSpecialtyData()->GetAt(KEY_Y, dlg.m_dY);
pEnt->GetSpecialtyData()->GetAt(KEY_L, dlg.m_dLen);
pEnt->GetSpecialtyData()->GetAt(KEY_CLASS, dlg.m_nPos);
if (dlg.DoModal() != IDOK) return;
CreateRightTriangle(dlg);
}
break;
case eRect:
{
CJXSTDlg dlg;
pEnt->GetSpecialtyData()->GetAt(KEY_SIZE1, dlg.m_dW);
pEnt->GetSpecialtyData()->GetAt(KEY_SIZE2, dlg.m_dH);
pEnt->GetSpecialtyData()->GetAt(KEY_SIZE3, dlg.m_dL);
pEnt->GetSpecialtyData()->GetAt(KEY_CLASS, dlg.m_nMode);
if (dlg.DoModal() != IDOK) return;
CreateRect(dlg);
}
break;
case eTriangle:
{
CSJSTDlg dlg;
pEnt->GetSpecialtyData()->GetAt(KEY_SIZE1, dlg.m_dC);
pEnt->GetSpecialtyData()->GetAt(KEY_SIZE2, dlg.m_dH);
pEnt->GetSpecialtyData()->GetAt(KEY_SIZE3, dlg.m_dL);
pEnt->GetSpecialtyData()->GetAt(KEY_CLASS, dlg.m_nMode);
if (dlg.DoModal() != IDOK) return;
CreateTriangle(dlg);
}
break;
case eTrape:
{
CTXSTDlg dlg;
pEnt->GetSpecialtyData()->SetAt(KEY_CLASS, dlg.m_nMode);
pEnt->GetSpecialtyData()->SetAt(KEY_SIZE1, dlg.m_dT);
pEnt->GetSpecialtyData()->SetAt(KEY_SIZE2, dlg.m_dB);
pEnt->GetSpecialtyData()->SetAt(KEY_SIZE3, dlg.m_dH);
pEnt->GetSpecialtyData()->SetAt(KEY_X, dlg.m_dL);
if (dlg.DoModal() != IDOK) return;
CreateTrapezoid(dlg);
}
break;
case eUserDef:
{
CYXSTDlg dlg;
if (dlg.DoModal() != IDOK) return;
CreateUserDef(dlg);
}
break;
default:
{
C4JSTDlg dlg;
if (dlg.DoModal() != IDOK) return;
Create4Angle(dlg);
}
break;
}
RemoveAssocPartForPool(id);
DelCurTreeItem();
pEnt->erase();
}
OPENOBJ_END()
acedPostCommand(_T("regen "));
}
2026-10-04 00:04:20 +08:00
// 删除
2026-09-28 15:28:50 +08:00
void CCDSTDlg::OnBnClickedButton10()
{
AcAxDocLock lock;
AcDbObjectId id(GetSelectID());
OPENOBJ_BEGIN(id, AcDb::kForWrite, AecDbX3dPartEntity, pEnt)
{
if (!pEnt) return;
RemoveAssocPartForPool(id);
pEnt->erase();
DelCurTreeItem();
}
OPENOBJ_END()
acedPostCommand(_T("regen "));
}
void CCDSTDlg::OnNMClickTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
CPoint point,ptcursor;
::GetCursorPos(&point);
ptcursor = point;
m_wndModelTree.ScreenToClient(&point);
UINT uFlags;
HTREEITEM hItem = m_wndModelTree.HitTest(point,&uFlags);
if (hItem == m_hItemCur)
{
return;
}
m_hItemCur = hItem;
ClickTreeItem(hItem);
*pResult = 0;
}
void CCDSTDlg::ClickTreeItem(HTREEITEM hItem)
{
AcDbObjectId id(AcDbObjectId::kNull);
Adesk::IntDbId ii = m_wndModelTree.GetItemData(hItem);
id.setFromOldId(ii);
CKTCadUtility::HighLightEntity(id, TRUE, acDocManager->curDocument());
}
LONG_PTR CCDSTDlg::onAcadKeepFocus(UINT_PTR, LONG_PTR)
{
POINT pt;
::GetCursorPos(&pt);
CRect rect;
GetWindowRect(&rect);
if (!(rect.PtInRect(pt)))
{
return FALSE;
}
2026-10-04 00:04:20 +08:00
//如果当前有命令在执行中,提示
2026-09-28 15:28:50 +08:00
struct resbuf rb;
acedGetVar(_T("CMDNAMES"), &rb);
if (rb.restype == RTSTR && rb.resval.rstring != NULL)
{
if (_tcslen(rb.resval.rstring) > 0)
{
acedPostCommand(_T("\x03"));
}
}
return TRUE;
}
void CCDSTDlg::OnBnClickedCancel()
{
OnClose();
}
void CCDSTDlg::OnClose()
{
ShowWindow(SW_HIDE);
}
AcDbObjectId CCDSTDlg::GetSelectID()
{
AcDbObjectId id(AcDbObjectId::kNull);
HTREEITEM hRoot = m_wndModelTree.GetRootItem();
HTREEITEM hItem(m_hItemCur);
if (!hItem || hRoot == hItem)
{
2026-10-04 00:04:20 +08:00
AfxMessageBox(_T("请选择一个素砼!"));
2026-09-28 15:28:50 +08:00
return id;
}
Adesk::IntDbId ii = (Adesk::IntDbId)m_wndModelTree.GetItemData(hItem);
id.setFromOldId(ii);
if (!id.isValid())
{
2026-10-04 00:04:20 +08:00
AfxMessageBox(_T("选择的素砼无效!"));
2026-09-28 15:28:50 +08:00
return id;
}
return id;
}
void CCDSTDlg::DelCurTreeItem()
{
HTREEITEM hRoot = m_wndModelTree.GetRootItem();
HTREEITEM hItem = m_wndModelTree.GetSelectedItem();
if (!hItem || hRoot == hItem)
{
2026-10-04 00:04:20 +08:00
AfxMessageBox(_T("请选择一个素砼!"));
2026-09-28 15:28:50 +08:00
}
m_wndModelTree.DeleteItem(hItem);
m_wndModelTree.Expand(hRoot, TVE_EXPAND);
}
void CCDSTDlg::CreateRightTriangle(CZJSTDlg & dlg)
{
AecDbX3dPartEntity* pPart = new AecDbX3dPartEntity;
2026-10-04 00:04:20 +08:00
pPart->SetName(_T("直角素砼"));
2026-09-28 15:28:50 +08:00
pPart->GetSpecialtyData()->SetAt(KEY_NO,m_sNo);
pPart->GetSpecialtyData()->SetAt(KEY_SECSHAPE, eRightTri);
pPart->GetSpecialtyData()->SetAt(KEY_CLASS, dlg.m_nPos);
pPart->GetSpecialtyData()->SetAt(KEY_X, dlg.m_dX);
pPart->GetSpecialtyData()->SetAt(KEY_Y, dlg.m_dY);
pPart->GetSpecialtyData()->SetAt(KEY_L, dlg.m_dLen);
pPart->GetSpecialtyData()->SetAt(KEY_MATERIAL,m_sMaterial);
AcDbObjectId id;
AcGePoint3d ptFr(m_ptOrg), ptPoints[4];
AcGeVector3d vtLinePath;
AcDbX3dSolid *pSolid(NULL);
AcDbEntity *pEnt(NULL);
if (dlg.m_nPos == 0 || dlg.m_nPos == 4) // left
{
ptFr = m_ptOrg;
ptFr -= m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr -= m_vtDirY * 0.5 * m_poolData.m_dData[1];
ptPoints[0] = ptFr;
ptPoints[1] = ptPoints[0];
ptPoints[1].z += dlg.m_dY;
ptPoints[2] = ptPoints[0];
ptPoints[2] += dlg.m_dX * m_vtDirX;
vtLinePath = m_vtDirY;
vtLinePath *= dlg.m_nPos == 0 ? dlg.m_dLen : m_poolData.m_dData[1];
pSolid = new AcDbX3dSolid;
pSolid->CreateFenceExtrude(ptFr, ptPoints, 3, vtLinePath, 1.0);
pPart->AddX3dSolid(pSolid);
}
if (dlg.m_nPos == 1 || dlg.m_nPos == 4) // right
{
ptFr = m_ptOrg;
ptFr += m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr -= m_vtDirY * 0.5 * m_poolData.m_dData[1];
ptPoints[0] = ptFr;
ptPoints[1] = ptPoints[0];
ptPoints[1].z += dlg.m_dY;
ptPoints[2] = ptPoints[0];
ptPoints[2] -= dlg.m_dX * m_vtDirX;
vtLinePath = m_vtDirY;
vtLinePath *= dlg.m_nPos == 1 ? dlg.m_dLen : m_poolData.m_dData[1];
pSolid = new AcDbX3dSolid;
pSolid->CreateFenceExtrude(ptFr, ptPoints, 3, vtLinePath, 1.0);
pPart->AddX3dSolid(pSolid);
}
if (dlg.m_nPos == 2 || dlg.m_nPos == 4) // top
{
ptFr = m_ptOrg;
ptFr -= m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr += m_vtDirY * 0.5 * m_poolData.m_dData[1];
ptPoints[0] = ptFr;
ptPoints[1] = ptPoints[0];
ptPoints[1].z += dlg.m_dY;
ptPoints[2] = ptPoints[0];
ptPoints[2] -= dlg.m_dX * m_vtDirY;
vtLinePath = m_vtDirX;
vtLinePath *= dlg.m_nPos == 2 ? dlg.m_dLen : m_poolData.m_dData[0];
pSolid = new AcDbX3dSolid;
pSolid->CreateFenceExtrude(ptFr, ptPoints, 3, vtLinePath, 1.0);
pPart->AddX3dSolid(pSolid);
}
if (dlg.m_nPos == 3 || dlg.m_nPos == 4) // bottom
{
ptFr = m_ptOrg;
ptFr -= m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr -= m_vtDirY * 0.5 * m_poolData.m_dData[1];
ptPoints[0] = ptFr;
ptPoints[1] = ptPoints[0];
ptPoints[1].z += dlg.m_dY;
ptPoints[2] = ptPoints[0];
ptPoints[2] += dlg.m_dX * m_vtDirY;
vtLinePath = m_vtDirX;
vtLinePath *= dlg.m_nPos == 3 ? dlg.m_dLen : m_poolData.m_dData[0];
pSolid = new AcDbX3dSolid;
pSolid->CreateFenceExtrude(ptFr, ptPoints, 3, vtLinePath, 1.0);
pPart->AddX3dSolid(pSolid);
}
pPart->Create();
AcAxDocLock lock;
CKTCadUtility::AddToBlockTableRecord(pPart);
id = pPart->objectId();
pPart->close();
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, m_idBasinOld, AcDb::kForWrite))
{
AecDbXSlab* pBasin = AecDbXSlab::cast(pEnt);
if (pBasin != NULL)
{
pBasin->AppendAssocPart(id);
}
pEnt->close();
}
InsertTreeView(pPart->GetName(), id);
}
void CCDSTDlg::CreateRect(CJXSTDlg & dlg)
{
AecDbX3dPartEntity* pPart = new AecDbX3dPartEntity;
2026-10-04 00:04:20 +08:00
pPart->SetName(_T("矩形素砼"));
2026-09-28 15:28:50 +08:00
pPart->GetSpecialtyData()->SetAt(KEY_NO,m_sNo);
pPart->GetSpecialtyData()->SetAt(KEY_SECSHAPE, eRect);
pPart->GetSpecialtyData()->SetAt(KEY_CLASS, dlg.m_nMode);
pPart->GetSpecialtyData()->SetAt(KEY_SIZE1, dlg.m_dW);
pPart->GetSpecialtyData()->SetAt(KEY_SIZE2, dlg.m_dH);
pPart->GetSpecialtyData()->SetAt(KEY_SIZE3, dlg.m_dL);
pPart->GetSpecialtyData()->SetAt(KEY_MATERIAL,m_sMaterial);
AcDbObjectId id;
AcGePoint3d ptFr(m_ptOrg), ptPoints[4];
AcGeVector3d vtLinePath, vtZ(AcGeVector3d::kZAxis);
AcDbX3dSolid *pSolid(NULL);
AcDbEntity *pEnt(NULL);
if (dlg.m_nMode == 0 || dlg.m_nMode == 4) // left
{
ptFr = m_ptOrg;
ptFr -= m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr -= m_vtDirY * 0.5 * m_poolData.m_dData[1];
ptPoints[0] = ptFr;
ptPoints[1] = ptPoints[0] + vtZ * dlg.m_dH;
ptPoints[2] = ptPoints[1] + m_vtDirX * dlg.m_dW;
ptPoints[3] = ptPoints[2] - vtZ * dlg.m_dH;
vtLinePath = m_vtDirY;
vtLinePath *= dlg.m_nMode == 0 ? dlg.m_dL : m_poolData.m_dData[1];
pSolid = new AcDbX3dSolid;
pSolid->CreateFenceExtrude(ptFr, ptPoints, 4, vtLinePath, 1.0);
pPart->AddX3dSolid(pSolid);
}
if (dlg.m_nMode == 1 || dlg.m_nMode== 4) // right
{
ptFr = m_ptOrg;
ptFr += m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr -= m_vtDirY * 0.5 * m_poolData.m_dData[1];
ptPoints[0] = ptFr;
ptPoints[1] = ptPoints[0] + vtZ * dlg.m_dH;
ptPoints[2] = ptPoints[1] - m_vtDirX * dlg.m_dW;
ptPoints[3] = ptPoints[2] - vtZ * dlg.m_dH;
vtLinePath = m_vtDirY;
vtLinePath *= dlg.m_nMode == 1 ? dlg.m_dL : m_poolData.m_dData[1];
pSolid = new AcDbX3dSolid;
pSolid->CreateFenceExtrude(ptFr, ptPoints, 4, vtLinePath, 1.0);
pPart->AddX3dSolid(pSolid);
}
if (dlg.m_nMode== 2 || dlg.m_nMode== 4) // top
{
ptFr = m_ptOrg;
ptFr -= m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr += m_vtDirY * 0.5 * m_poolData.m_dData[1];
ptPoints[0] = ptFr;
ptPoints[1] = ptPoints[0] + vtZ * dlg.m_dH;
ptPoints[2] = ptPoints[1] - m_vtDirY * dlg.m_dW;
ptPoints[3] = ptPoints[2] - vtZ * dlg.m_dH;
vtLinePath = m_vtDirX;
vtLinePath *= dlg.m_nMode == 2 ? dlg.m_dL : m_poolData.m_dData[0];
pSolid = new AcDbX3dSolid;
pSolid->CreateFenceExtrude(ptFr, ptPoints, 4, vtLinePath, 1.0);
pPart->AddX3dSolid(pSolid);
}
if (dlg.m_nMode== 3 || dlg.m_nMode== 4) // bottom
{
ptFr = m_ptOrg;
ptFr -= m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr -= m_vtDirY * 0.5 * m_poolData.m_dData[1];
ptPoints[0] = ptFr;
ptPoints[1] = ptPoints[0] + vtZ * dlg.m_dH;
ptPoints[2] = ptPoints[1] + m_vtDirY * dlg.m_dW;
ptPoints[3] = ptPoints[2] - vtZ * dlg.m_dH;
vtLinePath = m_vtDirX;
vtLinePath *= dlg.m_nMode == 3 ? dlg.m_dL : m_poolData.m_dData[0];
pSolid = new AcDbX3dSolid;
pSolid->CreateFenceExtrude(ptFr, ptPoints, 4, vtLinePath, 1.0);
pPart->AddX3dSolid(pSolid);
}
pPart->Create();
AcAxDocLock lock;
CKTCadUtility::AddToBlockTableRecord(pPart);
id = pPart->objectId();
pPart->close();
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, m_idBasinOld, AcDb::kForWrite))
{
AecDbXSlab* pBasin = AecDbXSlab::cast(pEnt);
if (pBasin != NULL)
{
pBasin->AppendAssocPart(id);
}
pEnt->close();
}
InsertTreeView(pPart->GetName(), id);
}
void CCDSTDlg::CreateTriangle(CSJSTDlg & dlg)
{
AecDbX3dPartEntity* pPart = new AecDbX3dPartEntity;
2026-10-04 00:04:20 +08:00
pPart->SetName(_T("三角素砼"));
2026-09-28 15:28:50 +08:00
pPart->GetSpecialtyData()->SetAt(KEY_NO,m_sNo);
pPart->GetSpecialtyData()->SetAt(KEY_SECSHAPE, eTriangle);
pPart->GetSpecialtyData()->SetAt(KEY_CLASS, dlg.m_nMode);
pPart->GetSpecialtyData()->SetAt(KEY_SIZE1, dlg.m_dC);
pPart->GetSpecialtyData()->SetAt(KEY_SIZE2, dlg.m_dH);
pPart->GetSpecialtyData()->SetAt(KEY_SIZE3, dlg.m_dL);
pPart->GetSpecialtyData()->SetAt(KEY_MATERIAL,m_sMaterial);
AcDbObjectId id;
AcGePoint3d ptFr(m_ptOrg), ptPoints[4];
AcGeVector3d vtLinePath, vtZ(AcGeVector3d::kZAxis), vtX(m_vtDirX), vtY(m_vtDirY);
AcDbX3dSolid *pSolid(NULL);
AcDbEntity *pEnt(NULL);
double angle = atan(2 * dlg.m_dH / dlg.m_dC);
double a = dlg.m_dH / sin(angle);
AcGeVector3d vt1(vtX), vt2(-vtY);
vt1.rotateBy(angle, -vtY);
vt2.rotateBy(angle, -vtX);
if (dlg.m_nMode == 0 || dlg.m_nMode == 4) // left
{
ptFr = m_ptOrg;
ptFr -= m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr -= m_vtDirY * 0.5 * m_poolData.m_dData[1];
ptPoints[0] = ptFr;
ptPoints[1] = ptPoints[0] + vtX * dlg.m_dC;
ptPoints[2] = ptPoints[0] + vt1 * a;
vtLinePath = m_vtDirY;
vtLinePath *= dlg.m_nMode == 0 ? dlg.m_dL : m_poolData.m_dData[1];
pSolid = new AcDbX3dSolid;
pSolid->CreateFenceExtrude(ptFr, ptPoints, 3, vtLinePath, 1.0);
pPart->AddX3dSolid(pSolid);
}
if (dlg.m_nMode == 1 || dlg.m_nMode == 4) // right
{
ptFr = m_ptOrg;
ptFr += m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr -= m_vtDirY * 0.5 * m_poolData.m_dData[1];
ptPoints[0] = ptFr;
ptPoints[1] = ptPoints[0] - vtX * dlg.m_dC;
ptPoints[2] = ptPoints[1] + vt1 * a;
vtLinePath = m_vtDirY;
vtLinePath *= dlg.m_nMode == 1 ? dlg.m_dL : m_poolData.m_dData[1];
pSolid = new AcDbX3dSolid;
pSolid->CreateFenceExtrude(ptFr, ptPoints, 3, vtLinePath, 1.0);
pPart->AddX3dSolid(pSolid);
}
if (dlg.m_nMode == 2 || dlg.m_nMode == 4) // top
{
ptFr = m_ptOrg;
ptFr -= m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr += m_vtDirY * 0.5 * m_poolData.m_dData[1];
ptPoints[0] = ptFr;
ptPoints[1] = ptPoints[0] - vtY * dlg.m_dC;
ptPoints[2] = ptPoints[0] + vt2 * a;
vtLinePath = m_vtDirX;
vtLinePath *= dlg.m_nMode == 2 ? dlg.m_dL : m_poolData.m_dData[0];
pSolid = new AcDbX3dSolid;
pSolid->CreateFenceExtrude(ptFr, ptPoints, 3, vtLinePath, 1.0);
pPart->AddX3dSolid(pSolid);
}
if (dlg.m_nMode == 3 || dlg.m_nMode == 4) // bottom
{
ptFr = m_ptOrg;
ptFr -= m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr -= m_vtDirY * 0.5 * m_poolData.m_dData[1];
ptPoints[0] = ptFr;
ptPoints[1] = ptPoints[0] + vtY * dlg.m_dC;
ptPoints[2] = ptPoints[1] + vt2 * a;
vtLinePath = m_vtDirX;
vtLinePath *= dlg.m_nMode == 3 ? dlg.m_dL : m_poolData.m_dData[0];
pSolid = new AcDbX3dSolid;
pSolid->CreateFenceExtrude(ptFr, ptPoints, 3, vtLinePath, 1.0);
pPart->AddX3dSolid(pSolid);
}
pPart->Create();
AcAxDocLock lock;
CKTCadUtility::AddToBlockTableRecord(pPart);
id = pPart->objectId();
pPart->close();
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, m_idBasinOld, AcDb::kForWrite))
{
AecDbXSlab* pBasin = AecDbXSlab::cast(pEnt);
if (pBasin != NULL)
{
pBasin->AppendAssocPart(id);
}
pEnt->close();
}
InsertTreeView(pPart->GetName(), id);
}
void CCDSTDlg::CreateTrapezoid(CTXSTDlg & dlg)
{
AecDbX3dPartEntity* pPart = new AecDbX3dPartEntity;
2026-10-04 00:04:20 +08:00
pPart->SetName(_T("梯形素砼"));
2026-09-28 15:28:50 +08:00
pPart->GetSpecialtyData()->SetAt(KEY_NO,m_sNo);
pPart->GetSpecialtyData()->SetAt(KEY_SECSHAPE, eTrape);
pPart->GetSpecialtyData()->SetAt(KEY_CLASS, dlg.m_nMode);
pPart->GetSpecialtyData()->SetAt(KEY_SIZE1, dlg.m_dT);
pPart->GetSpecialtyData()->SetAt(KEY_SIZE2, dlg.m_dB);
pPart->GetSpecialtyData()->SetAt(KEY_SIZE3, dlg.m_dH);
pPart->GetSpecialtyData()->SetAt(KEY_X, dlg.m_dL);
pPart->GetSpecialtyData()->SetAt(KEY_MATERIAL,m_sMaterial);
AcDbObjectId id;
AcGePoint3d ptFr(m_ptOrg), ptPoints[4];
AcGeVector3d vtLinePath, vtZ(AcGeVector3d::kZAxis), vtX(m_vtDirX), vtY(m_vtDirY);
AcDbX3dSolid *pSolid(NULL);
AcDbEntity *pEnt(NULL);
if (dlg.m_nMode == 0 || dlg.m_nMode == 4) // left
{
ptFr = m_ptOrg;
ptFr -= m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr -= m_vtDirY * 0.5 * m_poolData.m_dData[1];
ptPoints[0] = ptFr;
ptPoints[1] = ptPoints[0] + vtZ * dlg.m_dH;
ptPoints[2] = ptPoints[1] + vtX * dlg.m_dT;
ptPoints[3] = ptPoints[0] + vtX * dlg.m_dB;
vtLinePath = m_vtDirY;
vtLinePath *= dlg.m_nMode == 0 ? dlg.m_dL : m_poolData.m_dData[1];
pSolid = new AcDbX3dSolid;
pSolid->CreateFenceExtrude(ptFr, ptPoints, 4, vtLinePath, 1.0);
pPart->AddX3dSolid(pSolid);
}
if (dlg.m_nMode == 1 || dlg.m_nMode == 4) // right
{
ptFr = m_ptOrg;
ptFr += m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr -= m_vtDirY * 0.5 * m_poolData.m_dData[1];
ptPoints[0] = ptFr;
ptPoints[1] = ptPoints[0] + vtZ * dlg.m_dH;
ptPoints[2] = ptPoints[1] - vtX * dlg.m_dT;
ptPoints[3] = ptPoints[0] - vtX * dlg.m_dB;
vtLinePath = m_vtDirY;
vtLinePath *= dlg.m_nMode == 1 ? dlg.m_dL : m_poolData.m_dData[1];
pSolid = new AcDbX3dSolid;
pSolid->CreateFenceExtrude(ptFr, ptPoints, 4, vtLinePath, 1.0);
pPart->AddX3dSolid(pSolid);
}
if (dlg.m_nMode == 2 || dlg.m_nMode == 4) // top
{
ptFr = m_ptOrg;
ptFr -= m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr += m_vtDirY * 0.5 * m_poolData.m_dData[1];
ptPoints[0] = ptFr;
ptPoints[1] = ptPoints[0] + vtZ * dlg.m_dH;
ptPoints[2] = ptPoints[1] - vtY * dlg.m_dT;
ptPoints[3] = ptPoints[0] - vtY * dlg.m_dB;
vtLinePath = m_vtDirX;
vtLinePath *= dlg.m_nMode == 2 ? dlg.m_dL : m_poolData.m_dData[0];
pSolid = new AcDbX3dSolid;
pSolid->CreateFenceExtrude(ptFr, ptPoints, 4, vtLinePath, 1.0);
pPart->AddX3dSolid(pSolid);
}
if (dlg.m_nMode == 3 || dlg.m_nMode == 4) // bottom
{
ptFr = m_ptOrg;
ptFr -= m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr -= m_vtDirY * 0.5 * m_poolData.m_dData[1];
ptPoints[0] = ptFr;
ptPoints[1] = ptPoints[0] + vtZ * dlg.m_dH;
ptPoints[2] = ptPoints[1] + vtY * dlg.m_dT;
ptPoints[3] = ptPoints[0] + vtY * dlg.m_dB;
vtLinePath = m_vtDirX;
vtLinePath *= dlg.m_nMode == 3 ? dlg.m_dL : m_poolData.m_dData[0];
pSolid = new AcDbX3dSolid;
pSolid->CreateFenceExtrude(ptFr, ptPoints, 4, vtLinePath, 1.0);
pPart->AddX3dSolid(pSolid);
}
pPart->Create();
AcAxDocLock lock;
CKTCadUtility::AddToBlockTableRecord(pPart);
id = pPart->objectId();
pPart->close();
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, m_idBasinOld, AcDb::kForWrite))
{
AecDbXSlab* pBasin = AecDbXSlab::cast(pEnt);
if (pBasin != NULL)
{
pBasin->AppendAssocPart(id);
}
pEnt->close();
}
InsertTreeView(pPart->GetName(), id);
}
void CCDSTDlg::Create4Angle(C4JSTDlg & dlg)
{
AecDbX3dPartEntity* pPart = new AecDbX3dPartEntity;
2026-10-04 00:04:20 +08:00
pPart->SetName(_T("四角素砼"));
2026-09-28 15:28:50 +08:00
pPart->GetSpecialtyData()->SetAt(KEY_NO,m_sNo);
pPart->GetSpecialtyData()->SetAt(KEY_SECSHAPE, eXShape);
pPart->GetSpecialtyData()->SetAt(KEY_CLASS, dlg.m_nMode);
pPart->GetSpecialtyData()->SetAt(KEY_SIZE1, dlg.m_dC);
//pPart->GetSpecialtyData()->SetAt(KEY_SIZE2, dlg.m_dL);
pPart->GetSpecialtyData()->SetAt(KEY_MATERIAL,m_sMaterial);
AcDbObjectId id;
AcGePoint3d ptFr(m_ptOrg), ptPoints[4];
AcGeVector3d vt(.5, .5, .5), vtZ(AcGeVector3d::kZAxis), vtX(m_vtDirX), vtY(m_vtDirY);
AcDbX3dSolid *pSolid(NULL);
AcDbEntity *pEnt(NULL);
AcDbRegion *pReg1(NULL), *pReg2(NULL);
AcDbVoidPtrArray curves;
double c(dlg.m_dC);
double a = c / 1.41421;
double b = .5 * c / cos(PI / 6);
double h = sqrt(a * a - b * b);
vt.normalize();
AcGePoint3d pt0, pt1, pt2, pt3;
if (dlg.m_nMode == 0 || dlg.m_nMode == 4) // left down
{
ptFr = m_ptOrg;
ptFr -= m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr -= m_vtDirY * 0.5 * m_poolData.m_dData[1];
pt0 = ptFr;
pt1 = ptFr + vtX * a;
pt2 = ptFr + vtY * a;
pt3 = ptFr + vtZ * a;
pSolid = new AcDbX3dSolid;
pSolid->CreateTriangularPyramid(pt0, pt1, pt2, pt3);
pPart->AddX3dSolid(pSolid);
}
if (dlg.m_nMode == 1 || dlg.m_nMode == 4) // left up
{
ptFr = m_ptOrg;
ptFr -= m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr += m_vtDirY * 0.5 * m_poolData.m_dData[1];
pt0 = ptFr;
pt1 = ptFr + vtX * a;
pt2 = ptFr - vtY * a;
pt3 = ptFr + vtZ * a;
pSolid = new AcDbX3dSolid;
pSolid->CreateTriangularPyramid(pt0, pt1, pt2, pt3);
pPart->AddX3dSolid(pSolid);
}
if (dlg.m_nMode == 2 || dlg.m_nMode == 4) // right down
{
ptFr = m_ptOrg;
ptFr += m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr -= m_vtDirY * 0.5 * m_poolData.m_dData[1];
pt0 = ptFr;
pt1 = ptFr - vtX * a;
pt2 = ptFr + vtY * a;
pt3 = ptFr + vtZ * a;
pSolid = new AcDbX3dSolid;
pSolid->CreateTriangularPyramid(pt0, pt1, pt2, pt3);
pPart->AddX3dSolid(pSolid);
}
if (dlg.m_nMode == 3 || dlg.m_nMode == 4) // right up
{
ptFr = m_ptOrg;
ptFr += m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr += m_vtDirY * 0.5 * m_poolData.m_dData[1];
pt0 = ptFr;
pt1 = ptFr - vtX * a;
pt2 = ptFr - vtY * a;
pt3 = ptFr + vtZ * a;
pSolid = new AcDbX3dSolid;
pSolid->CreateTriangularPyramid(pt0, pt1, pt2, pt3);
pPart->AddX3dSolid(pSolid);
}
pPart->Create();
AcAxDocLock lock;
CKTCadUtility::AddToBlockTableRecord(pPart);
id = pPart->objectId();
pPart->close();
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, m_idBasinOld, AcDb::kForWrite))
{
AecDbXSlab* pBasin = AecDbXSlab::cast(pEnt);
if (pBasin != NULL)
{
pBasin->AppendAssocPart(id);
}
pEnt->close();
}
InsertTreeView(pPart->GetName(), id);
}
void CCDSTDlg::CreateUserDef(CYXSTDlg & dlg)
{
2026-10-04 00:04:20 +08:00
// 选PLine线
2026-09-28 15:28:50 +08:00
ads_name ent;
ads_point adsPt;
2026-10-04 00:04:20 +08:00
if (acedEntSel(_T("\n请选择在XOY面上的闭合多段线:"), ent, adsPt) != RTNORM) return;
2026-09-28 15:28:50 +08:00
AcDbObjectId idPoly(AcDbObjectId::kNull);
acdbGetObjectId(idPoly, ent);
if (!idPoly.isValid()) return;
AcDbRegion *pReg(NULL);
OPENOBJ_BEGIN(idPoly, AcDb::kForRead, AcDbCurve, pPoly)
{
if (!pPoly || !pPoly->isClosed())
{
2026-10-04 00:04:20 +08:00
AfxMessageBox(_T("请选择一段闭合多段线!"));
2026-09-28 15:28:50 +08:00
return;
}
pReg = CoreTools::createRegion(pPoly);
if (!pReg)
{
2026-10-04 00:04:20 +08:00
ads_printf(_T("\n创建截面失败!"));
2026-09-28 15:28:50 +08:00
return;
}
}
OPENOBJ_END()
AcDbExtents ext;
AcGePoint3d ptMaxXZY(AcGePoint3d::kOrigin), ptMaxYZX(AcGePoint3d::kOrigin)
, ptMinXZY(AcGePoint3d::kOrigin), ptMinYZX(AcGePoint3d::kOrigin);
AcDbRegion *pXZY((AcDbRegion*)pReg->clone()), *pYZX((AcDbRegion*)pReg->clone());
DELETE_PTR(pReg);
2026-10-04 00:04:20 +08:00
// 通过pReg创建出两个不同坐标系的region 分别是 (X,Z,-Y) (-Y,Z,-X)
2026-09-28 15:28:50 +08:00
AcGeMatrix3d mat;
mat.setToAlignCoordSys(AcGePoint3d::kOrigin
, AcGeVector3d::kXAxis
, AcGeVector3d::kYAxis
, AcGeVector3d::kZAxis
, AcGePoint3d::kOrigin
, AcGeVector3d::kXAxis
, AcGeVector3d::kZAxis
, -AcGeVector3d::kYAxis);
pXZY->transformBy(mat);
pXZY->getGeomExtents(ext);
ptMaxXZY = ext.maxPoint();
ptMinXZY = ext.minPoint();
mat = AcGeMatrix3d::kIdentity;
mat.setToAlignCoordSys(AcGePoint3d::kOrigin
, AcGeVector3d::kXAxis
, AcGeVector3d::kYAxis
, AcGeVector3d::kZAxis
, AcGePoint3d::kOrigin
, -AcGeVector3d::kYAxis
, AcGeVector3d::kZAxis
, -AcGeVector3d::kXAxis);
pYZX->transformBy(mat);
pYZX->getGeomExtents(ext);
ptMaxYZX.transformBy(mat);
ptMinYZX.transformBy(mat);
AecDbX3dPartEntity* pPart = new AecDbX3dPartEntity;
2026-10-04 00:04:20 +08:00
pPart->SetName(_T("异形素砼"));
2026-09-28 15:28:50 +08:00
pPart->GetSpecialtyData()->SetAt(KEY_NO,m_sNo);
pPart->GetSpecialtyData()->SetAt(KEY_SECSHAPE, eUserDef);
pPart->GetSpecialtyData()->SetAt(KEY_CLASS, dlg.m_nMode);
pPart->GetSpecialtyData()->SetAt(KEY_X, dlg.m_dL);
pPart->GetSpecialtyData()->SetAt(KEY_MATERIAL,m_sMaterial);
AcGePoint3d ptFr(m_ptOrg);
AcGeVector3d vtLinePath, vtZ(AcGeVector3d::kZAxis), vtX(m_vtDirX), vtY(m_vtDirY), vtMove;
AcDbX3dSolid *pSolid(NULL);
if (dlg.m_nMode == 0 || dlg.m_nMode == 4)
{
ptFr = m_ptOrg;
ptFr -= m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr -= m_vtDirY * 0.5 * m_poolData.m_dData[1];
2026-10-04 00:04:20 +08:00
// 将 pXZY minpt 移动到 ptFr
2026-09-28 15:28:50 +08:00
vtMove = ptFr - ptMinXZY;
pXZY->transformBy(vtMove);
vtLinePath = m_vtDirY;
vtLinePath *= dlg.m_nMode == 0 ? dlg.m_dL : m_poolData.m_dData[1];
pSolid = new AcDbX3dSolid;
pSolid->CreateExtrude(pXZY, AcDbLine(ptFr, ptFr + vtLinePath));
pPart->AddX3dSolid(pSolid);
}
if (dlg.m_nMode == 1 || dlg.m_nMode == 4)
{
ptFr = m_ptOrg;
ptFr += m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr -= m_vtDirY * 0.5 * m_poolData.m_dData[1];
2026-10-04 00:04:20 +08:00
// 将 pXZY maxpt 移动到 ptFr
2026-09-28 15:28:50 +08:00
vtMove = ptFr - ptMaxXZY;
pXZY->transformBy(vtMove);
vtLinePath = m_vtDirY;
vtLinePath *= dlg.m_nMode == 1 ? dlg.m_dL : m_poolData.m_dData[1];
pSolid = new AcDbX3dSolid;
pSolid->CreateExtrude(pXZY, AcDbLine(ptFr, ptFr + vtLinePath));
pPart->AddX3dSolid(pSolid);
}
if (dlg.m_nMode == 2 || dlg.m_nMode == 4)
{
ptFr = m_ptOrg;
ptFr -= m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr += m_vtDirY * 0.5 * m_poolData.m_dData[1];
2026-10-04 00:04:20 +08:00
// 将 pYZX minpt 移动到 ptFr
2026-09-28 15:28:50 +08:00
vtMove = ptFr - ptMinYZX;
pYZX->transformBy(vtMove);
vtLinePath = m_vtDirX;
vtLinePath *= dlg.m_nMode == 2 ? dlg.m_dL : m_poolData.m_dData[0];
pSolid = new AcDbX3dSolid;
pSolid->CreateExtrude(pYZX, AcDbLine(ptFr, ptFr + vtLinePath));
pPart->AddX3dSolid(pSolid);
}
if (dlg.m_nMode == 3 || dlg.m_nMode == 4)
{
ptFr = m_ptOrg;
ptFr -= m_vtDirX * 0.5 * m_poolData.m_dData[0];
ptFr -= m_vtDirY * 0.5 * m_poolData.m_dData[1];
2026-10-04 00:04:20 +08:00
// 将 pYZX maxpt 移动到 ptFr
2026-09-28 15:28:50 +08:00
vtMove = ptFr - ptMaxYZX;
pYZX->transformBy(vtMove);
vtLinePath = m_vtDirX;
vtLinePath *= dlg.m_nMode == 3 ? dlg.m_dL : m_poolData.m_dData[0];
pSolid = new AcDbX3dSolid;
pSolid->CreateExtrude(pYZX, AcDbLine(ptFr, ptFr + vtLinePath));
pPart->AddX3dSolid(pSolid);
}
DELETE_PTR(pXZY);
DELETE_PTR(pYZX);
pPart->Create();
AcAxDocLock lock;
CKTCadUtility::AddToBlockTableRecord(pPart);
AcDbObjectId id = pPart->objectId();
pPart->close();
AcDbEntity *pEnt(NULL);
if (Acad::eOk == acdbOpenAcDbEntity(pEnt, m_idBasinOld, AcDb::kForWrite))
{
AecDbXSlab* pBasin = AecDbXSlab::cast(pEnt);
if (pBasin != NULL)
{
pBasin->AppendAssocPart(id);
}
pEnt->close();
}
InsertTreeView(pPart->GetName(), id);
}
void CCDSTDlg::clear()
{
m_pBasinCln = NULL;
memset(&m_poolData,0,sizeof(PoolData));
m_vtDirX.set(1,0,0);
m_vtDirY.set(0,1,0);
m_sPoolSize.Empty();
m_ptOrg = AcGePoint3d::kOrigin;
m_idBasinOld = AcDbObjectId::kNull;
m_hItemCur = NULL;
m_wndModelTree.DeleteAllItems();
m_nMoveMode = 0;
m_nRotateMode = 0;
m_dMove = .0;
m_dRotate = .0;
}
void CCDSTDlg::RemoveAssocPartForPool(AcDbObjectId & idPart)
{
OPENOBJ_BEGIN(m_idBasinOld, AcDb::kForWrite, AecDbXSlab, pPool)
{
if (!pPool) return;
pPool->RemoveAssocPart(idPart);
}
OPENOBJ_END()
}