319 lines
7.4 KiB
C++
319 lines
7.4 KiB
C++
#include "stdafx.h"
|
|
#include "GLRDDlg.h"
|
|
|
|
#include "AecDbEarthWorm.h"
|
|
#include "KTCADUtilityEx.h"
|
|
#include "AcDbX3dSolid.h"
|
|
#include "AecDbX3dGroup.h"
|
|
#include "axlock.h"
|
|
#include "CCSYDlg.h"
|
|
#include "UITools.h"
|
|
|
|
extern Acad::ErrorStatus AddToModelSpace(AcDbEntity* pEnt,AcDbDatabase* pDb ,bool bClose );
|
|
extern CString IDCreate();
|
|
|
|
|
|
IMPLEMENT_DYNAMIC(CGLRDDlg, CDialog)
|
|
|
|
CGLRDDlg::CGLRDDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CGLRDDlg::IDD, pParent)
|
|
, m_dL(30.0)
|
|
, m_dH(30.0)
|
|
, m_dD1(90)
|
|
, m_dX(20.0)
|
|
, m_dD2(90)
|
|
, m_nPos(0)
|
|
{
|
|
UIDataCache::Read(_T("%d%d%d%d%d%i%s"), _T("CGLRDDlg")
|
|
, &m_dL , &m_dH , &m_dD1 , &m_dD2 , &m_dX
|
|
, &m_nPos
|
|
, &m_sCrossSectionScr);
|
|
}
|
|
|
|
CGLRDDlg::~CGLRDDlg()
|
|
{
|
|
}
|
|
|
|
void CGLRDDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
DDX_Text(pDX, IDC_EDIT1, m_dL);
|
|
DDX_Text(pDX, IDC_EDIT3, m_dH);
|
|
DDX_Text(pDX, IDC_EDIT4, m_dD1);
|
|
DDX_Text(pDX, IDC_EDIT5, m_dX);
|
|
DDX_Text(pDX, IDC_EDIT6, m_dD2);
|
|
DDX_Radio(pDX, IDC_RADIO1, m_nPos);
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CGLRDDlg, CDialog)
|
|
ON_BN_CLICKED(IDOK, &CGLRDDlg::OnBnClickedOk)
|
|
ON_BN_CLICKED(IDC_BUTTON2, &CGLRDDlg::OnBnClickedButton2)
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
BOOL CGLRDDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
UpdateData(FALSE);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CGLRDDlg::OnBnClickedOk()
|
|
{
|
|
UpdateData();
|
|
|
|
//_T("RECT:3900x3600|2900x3600|400x300|EXT:...");//EXT为扩充字段
|
|
AecDbEarthWorm worm;
|
|
worm.SetCrossSectionScr(m_sCrossSectionScr);
|
|
worm.SetChamferInter(100.0);
|
|
|
|
ESection eType = eRect;
|
|
AcGePoint2dArray arDatas;
|
|
eType = worm.ExtractEarthWormScr(arDatas);
|
|
|
|
//外壁厚,内隔壁厚
|
|
double dOutW = 0.0,dIntW = 0.0;
|
|
if (arDatas.length() > 0)
|
|
{
|
|
dOutW = arDatas.last().x;
|
|
dIntW = arDatas.last().y;
|
|
}
|
|
|
|
//总高度
|
|
double dHeight = arDatas.first().y;
|
|
dHeight += 2 * arDatas.last().x;
|
|
|
|
//总宽度
|
|
double dWidth = 0.0;
|
|
for (int i = 0;i < arDatas.length()-1;i++)
|
|
{
|
|
dWidth += arDatas.at(i).x;
|
|
}
|
|
|
|
dWidth += (arDatas.length() - 2) * dIntW;
|
|
dWidth += dOutW * 2.0;
|
|
|
|
if (m_dL - 0.5 < 1.e-3)
|
|
{
|
|
AfxMessageBox(_T("凹口长度太小,至少大于0.5米,请重新输入尺寸!"));
|
|
return;
|
|
}
|
|
|
|
if (m_dD1 < 1.0 || m_dD1 > 90.1)
|
|
{
|
|
AfxMessageBox(_T("凹口柺角角度太小!必须在[1,90] 度之间"));
|
|
return;
|
|
}
|
|
|
|
if (m_dD2 < 1.0 || m_dD2 > 90.1)
|
|
{
|
|
AfxMessageBox(_T("凹口柺角角度太小!必须在[1,90] 度之间"));
|
|
return;
|
|
}
|
|
|
|
double dx1 = m_dH * cos(m_dD1 * PI / 180.0) / sin(m_dD1 * PI / 180.0);
|
|
double dx2 = m_dH * cos(m_dD2 * PI / 180.0) / sin(m_dD2 * PI / 180.0);
|
|
|
|
if ( m_dL - dx1 - dx2 - 1.0 < 1.e-3)
|
|
{
|
|
AfxMessageBox(_T("当前角度下,凹口长度 L 尺寸太小!请重新输入尺寸!"));
|
|
return;
|
|
}
|
|
|
|
if (m_dX < 0.2)
|
|
{
|
|
AfxMessageBox(_T("凹口中心距离左侧距离太小!请重新输入尺寸!"));
|
|
return;
|
|
}
|
|
|
|
if (m_dH - dWidth < 1.e-3)
|
|
{
|
|
CString sError;
|
|
sError.Format(_T("凹口中心偏移尺寸%g不能小于管廊宽度%g 请重新输入尺寸!"),m_dH,dWidth);
|
|
AfxMessageBox(sError);
|
|
return;
|
|
}
|
|
|
|
UIDataCache::Write(_T("%d%d%d%d%d%i%s"), _T("CGLRDDlg")
|
|
, &m_dL , &m_dH , &m_dD1 , &m_dD2 , &m_dX
|
|
, &m_nPos
|
|
, &m_sCrossSectionScr);
|
|
|
|
OnOK();
|
|
}
|
|
|
|
void CGLRDDlg::OnBnClickedButton2()
|
|
{
|
|
CCCSYDlg dlg;
|
|
dlg.SetBmpFileName(_T("glrd.bmp"));
|
|
dlg.DoModal();
|
|
}
|
|
|
|
int CGLRDDlg::GetX3dSolidRecs( AecDbX3dGroup*& pGroup)
|
|
{
|
|
if (pGroup != NULL)
|
|
{
|
|
pGroup->RemoveAll3dSolidRec();
|
|
}
|
|
else
|
|
{
|
|
pGroup = new AecDbX3dGroup;
|
|
}
|
|
|
|
//_T("RECT:3900x3600|2900x3600|400x300|EXT:...");//EXT为扩充字段
|
|
AecDbEarthWorm worm;
|
|
worm.SetCrossSectionScr(m_sCrossSectionScr);
|
|
worm.SetChamferInter(100.0);
|
|
|
|
ESection eType = eRect;
|
|
AcGePoint2dArray arDatas;
|
|
eType = worm.ExtractEarthWormScr(arDatas);
|
|
|
|
//外壁厚,内隔壁厚
|
|
double dOutW = 0.0,dIntW = 0.0;
|
|
if (arDatas.length() > 0)
|
|
{
|
|
dOutW = arDatas.last().x;
|
|
dIntW = arDatas.last().y;
|
|
}
|
|
|
|
//总高度
|
|
double dHeight = arDatas.first().y;
|
|
dHeight += 2 * arDatas.last().x;
|
|
|
|
//总宽度
|
|
double dWidth = 0.0;
|
|
for (int i = 0;i < arDatas.length()-1;i++)
|
|
{
|
|
dWidth += arDatas.at(i).x;
|
|
}
|
|
|
|
dWidth += (arDatas.length() - 2) * dIntW;
|
|
dWidth += dOutW * 2.0;
|
|
|
|
AcGePoint3d ptOrg,ptGe;
|
|
ptOrg.x += m_dX;
|
|
|
|
AcGeVector3d vtX1,vtX2;
|
|
AcGePoint3dArray arPathPts;
|
|
|
|
double dX1 = 0.0;
|
|
switch(m_nPos)
|
|
{
|
|
case 0://水平南向
|
|
case 1://水平北向
|
|
{
|
|
if (m_dD1 - 90.0 < -1.e-3)
|
|
dX1 = dWidth * cos(PI / 2.0 - m_dD1 * PI / 180.0) / sin(PI / 2.0 - m_dD1 * PI / 180.0);
|
|
else
|
|
dX1 = dWidth;
|
|
|
|
ptGe.set(m_dX - 0.5 * dX1,0,0);
|
|
arPathPts.append(ptGe);
|
|
|
|
dX1 = m_dH * cos(m_dD1 * PI / 180.0) / sin(m_dD1 * PI / 180.0);
|
|
ptGe.x += dX1;
|
|
ptGe.y += (m_nPos * 2 - 1) * m_dH;
|
|
|
|
arPathPts.append(ptGe);
|
|
vtX1.set(dX1,(m_nPos * 2 - 1) * m_dH,0.0);
|
|
vtX1.normalize();
|
|
|
|
double da = (180.0 - m_dD1) / 2.0;
|
|
double dX3 = 0.5 * dWidth * cos(da * PI / 180.0) / sin(da * PI / 180.0);
|
|
|
|
double db = (180.0 - m_dD2) / 2.0;
|
|
double dX4 = 0.5 * dWidth * cos(db * PI / 180.0) / sin(db * PI / 180.0);
|
|
|
|
double dX2 = m_dH * cos( m_dD2 * PI / 180.0) / sin(m_dD2 * PI / 180.0);
|
|
|
|
ptGe.x += (dX1 + m_dL - dX1 - dX2 + dX3 + dX4);
|
|
|
|
arPathPts.append(ptGe);
|
|
|
|
ptGe.x += dX2;
|
|
ptGe.y = 0.0;//中心
|
|
|
|
vtX2.set(dX2,(1 - m_nPos * 2) * m_dH,0.0);
|
|
vtX2.normalize();
|
|
|
|
arPathPts.append(ptGe);
|
|
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if ( arPathPts.length() < 4)
|
|
return FALSE;
|
|
|
|
//截断原来的官廊
|
|
AcGePoint3d ptCen;
|
|
Midpoint(arPathPts.at(0),arPathPts.at(3),ptCen);
|
|
|
|
double dL = arPathPts.at(3).distanceTo(arPathPts.at(0));
|
|
AcDbX3dSolid* pXSolid = new AcDbX3dSolid;
|
|
pXSolid->CreateEarthWorm(ptCen,AcGeVector3d::kXAxis,m_sCrossSectionScr,dL,vtX1,vtX2);
|
|
|
|
X3dSolidRec rec;
|
|
|
|
rec.pXSolid = pXSolid;
|
|
rec.bType = AcDb::kBoolSubtract;
|
|
_tcscpy(rec.szLockId,IDCreate());
|
|
pGroup->AddX3dSolidRec(rec);
|
|
|
|
//创建凹 1
|
|
Midpoint(arPathPts.at(0),arPathPts.at(1),ptCen);
|
|
dL = arPathPts.at(1).distanceTo(arPathPts.at(0));
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->CreateEarthWorm(ptCen,vtX1,m_sCrossSectionScr,dL,AcGeVector3d::kXAxis,AcGeVector3d::kXAxis);
|
|
rec.pXSolid = pXSolid;
|
|
rec.bType = AcDb::kBoolUnite;
|
|
_tcscpy(rec.szLockId,IDCreate());
|
|
if (m_nPos > 1)
|
|
{
|
|
pXSolid->AddRotate(PI / 2.0,2);
|
|
}
|
|
pGroup->AddX3dSolidRec(rec);
|
|
|
|
//创建凹 2
|
|
Midpoint(arPathPts.at(1),arPathPts.at(2),ptCen);
|
|
dL = arPathPts.at(1).distanceTo(arPathPts.at(2));
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->CreateEarthWorm(ptCen,AcGeVector3d::kXAxis,m_sCrossSectionScr,dL,vtX1,vtX2);
|
|
rec.pXSolid = pXSolid;
|
|
rec.bType = AcDb::kBoolUnite;
|
|
_tcscpy(rec.szLockId,IDCreate());
|
|
pGroup->AddX3dSolidRec(rec);
|
|
|
|
//创建凹 3
|
|
Midpoint(arPathPts.at(2),arPathPts.at(3),ptCen);
|
|
dL = arPathPts.at(2).distanceTo(arPathPts.at(3));
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->CreateEarthWorm(ptCen,vtX2,m_sCrossSectionScr,dL,AcGeVector3d::kXAxis,AcGeVector3d::kXAxis);
|
|
rec.pXSolid = pXSolid;
|
|
rec.bType = AcDb::kBoolUnite;
|
|
_tcscpy(rec.szLockId,IDCreate());
|
|
pGroup->AddX3dSolidRec(rec);
|
|
|
|
Midpoint(arPathPts.at(0),arPathPts.at(3),ptOrg);
|
|
pGroup->SetOrgPoint( ptOrg );
|
|
pGroup->SetAxis(X,AcGeVector3d::kXAxis);
|
|
pGroup->SetAxis(Y,AcGeVector3d::kYAxis);
|
|
pGroup->SetAxis(Z,AcGeVector3d::kZAxis);
|
|
|
|
//序列化BIM数据
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_dL"),m_dL);
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_dH"),m_dH);
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_dD1"),m_dD1);
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_dD2"),m_dD2);
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_dX"),m_dX);
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_nPos"),m_nPos);
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_sCrossSectionScr"),m_sCrossSectionScr);
|
|
|
|
return TRUE;
|
|
} |