1330 lines
33 KiB
C++
1330 lines
33 KiB
C++
#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()
|
||
}
|