Files
envi-code/SourceCode/Code2026/Pool3dCmd/CDSTDlg.cpp
T
2026-09-28 15:28:50 +08:00

1330 lines
33 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 "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"))
, m_sMaterial(_T("混凝土"))
{
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);
m_wndModelTree.InsertItem(_T("素砼"),ITEM_ROOT,ITEM_ROOT);
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);
m_ptOrg = m_pBasinCln->GetBasinOrg();//底板中心
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;
dEl += m_poolData.m_dBomThick;//到达内底
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:
m_sPoolSize.Format(_T("内长x内宽:%.2fx%.2f"), m_poolData.m_dData[0], m_poolData.m_dData[1]);
break;
case eCircle:
m_sPoolSize.Format(_T("内半径:%.2f"), m_poolData.m_dData[2] - m_poolData.m_dWallThick);
break;
case eEllispe:
m_sPoolSize.Format(_T("内长轴x内短轴:%.2fx%.2f"), m_poolData.m_dData[2], m_poolData.m_dData[2] * m_poolData.m_dData[3]);
break;
case eUserDef:
case eRightTri:
case eEquilTri:
case eTrape:
case eTriangle:
case eXShape:
m_sPoolSize.Format(_T("异形"));
break;
default:
break;
}
}
}
OPENOBJ_END()
UpdateData(FALSE);
if (m_wndModelTree.GetRootItem() == NULL)
m_wndModelTree.InsertItem(_T("素砼"),ITEM_ROOT,ITEM_ROOT);
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();
if (sName.Find(_T("素砼")) != -1)
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);
}
//直角
void CCDSTDlg::OnBnClickedButton2()
{
CZJSTDlg dlg;
dlg.m_dLen = m_poolData.m_dData[0];
if (IDOK != dlg.DoModal()) return;
CreateRightTriangle(dlg);
acedPostCommand(_T("regen "));
}
//三角
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 "));
}
//矩形
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 "));
}
//梯形
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 "));
}
//自定义
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 "));
}
// 四角
void CCDSTDlg::OnBnClickedButton12()
{
C4JSTDlg dlg;
if (IDOK != dlg.DoModal()) return;
Create4Angle(dlg);
acedPostCommand(_T("regen "));
}
//移动
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 "));
}
//移动复位
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 "));
}
//旋转
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 "));
}
//旋转复位
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 "));
}
// 修改
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 "));
}
// 删除
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;
}
//如果当前有命令在执行中,提示
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)
{
AfxMessageBox(_T("请选择一个素砼!"));
return id;
}
Adesk::IntDbId ii = (Adesk::IntDbId)m_wndModelTree.GetItemData(hItem);
id.setFromOldId(ii);
if (!id.isValid())
{
AfxMessageBox(_T("选择的素砼无效!"));
return id;
}
return id;
}
void CCDSTDlg::DelCurTreeItem()
{
HTREEITEM hRoot = m_wndModelTree.GetRootItem();
HTREEITEM hItem = m_wndModelTree.GetSelectedItem();
if (!hItem || hRoot == hItem)
{
AfxMessageBox(_T("请选择一个素砼!"));
}
m_wndModelTree.DeleteItem(hItem);
m_wndModelTree.Expand(hRoot, TVE_EXPAND);
}
void CCDSTDlg::CreateRightTriangle(CZJSTDlg & dlg)
{
AecDbX3dPartEntity* pPart = new AecDbX3dPartEntity;
pPart->SetName(_T("直角素砼"));
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;
pPart->SetName(_T("矩形素砼"));
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;
pPart->SetName(_T("三角素砼"));
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;
pPart->SetName(_T("梯形素砼"));
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;
pPart->SetName(_T("四角素砼"));
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)
{
// 选PLine线
ads_name ent;
ads_point adsPt;
if (acedEntSel(_T("\n请选择在XOY面上的闭合多段线:"), ent, adsPt) != RTNORM) return;
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())
{
AfxMessageBox(_T("请选择一段闭合多段线!"));
return;
}
pReg = CoreTools::createRegion(pPoly);
if (!pReg)
{
ads_printf(_T("\n创建截面失败!"));
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);
// 通过pReg创建出两个不同坐标系的region 分别是 (X,Z,-Y) (-Y,Z,-X)
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;
pPart->SetName(_T("异形素砼"));
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];
// 将 pXZY minpt 移动到 ptFr
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];
// 将 pXZY maxpt 移动到 ptFr
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];
// 将 pYZX minpt 移动到 ptFr
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];
// 将 pYZX maxpt 移动到 ptFr
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()
}