415 lines
9.6 KiB
C++
415 lines
9.6 KiB
C++
#include "stdafx.h"
|
|
#include "GLYCDlg.h"
|
|
|
|
#include "AecDbEarthWorm.h"
|
|
#include "KTCADUtilityEx.h"
|
|
#include "AcDbX3dSolid.h"
|
|
#include "AecDbX3dGroup.h"
|
|
#include "axlock.h"
|
|
#include "CCSYDlg.h"
|
|
#include "HZGLDlg.h"
|
|
#include "UITools.h"
|
|
|
|
extern Acad::ErrorStatus AddToModelSpace(AcDbEntity* pEnt,AcDbDatabase* pDb ,bool bClose );
|
|
extern CString IDCreate();
|
|
|
|
static void FreeBuffer(AcDbVoidPtrArray& arTextPtrs)
|
|
{
|
|
AcDbEntity* pEnt = NULL;
|
|
while (arTextPtrs.length() > 0)
|
|
{
|
|
pEnt = (AcDbEntity*)arTextPtrs.first();
|
|
arTextPtrs.removeFirst();
|
|
DELETE_PTR(pEnt);
|
|
}
|
|
}
|
|
|
|
IMPLEMENT_DYNAMIC(CGLYCDlg, CDialog)
|
|
|
|
CGLYCDlg::CGLYCDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CGLYCDlg::IDD, pParent)
|
|
, m_dL(15.0)
|
|
, m_dX(10.0)
|
|
, m_sCrossSectionScr1(_T("RECT:3.900x3.600|0.400x0.300"))
|
|
, m_dB(25)
|
|
, m_dC(10)
|
|
, m_dH(4.5)
|
|
, m_nPos(0)
|
|
, m_dG(10)
|
|
, m_dW(5)
|
|
, m_nPos2(0)
|
|
{
|
|
UIDataCache::Read(_T("%d%d%d%d%d%i%d%d"), _T("CGLYCDlg"), &m_dL, &m_dX, &m_dB, &m_dC, &m_dH, &m_nPos, &m_dG, &m_dW);
|
|
}
|
|
|
|
CGLYCDlg::~CGLYCDlg()
|
|
{
|
|
}
|
|
|
|
void CGLYCDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
DDX_Text(pDX, IDC_EDIT2, m_dL);
|
|
DDX_Text(pDX, IDC_EDIT10, m_dX);
|
|
DDX_Text(pDX, IDC_EDIT1, m_sCrossSectionScr1);
|
|
DDX_Text(pDX, IDC_EDIT3, m_dB);
|
|
DDX_Text(pDX, IDC_EDIT4, m_dC);
|
|
DDX_Text(pDX, IDC_EDIT9, m_dH);
|
|
DDX_Radio(pDX, IDC_RADIO1, m_nPos);
|
|
DDX_Text(pDX, IDC_EDIT15, m_dG);
|
|
DDX_Text(pDX, IDC_EDIT16, m_dW);
|
|
DDX_Radio(pDX, IDC_RADIO5, m_nPos2);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CGLYCDlg, CDialog)
|
|
ON_BN_CLICKED(IDC_BUTTON1, &CGLYCDlg::OnBnClickedButton1)
|
|
ON_BN_CLICKED(IDOK, &CGLYCDlg::OnBnClickedOk)
|
|
END_MESSAGE_MAP()
|
|
|
|
BOOL CGLYCDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
// 子类化控件对象
|
|
if (!m_wndViewCtrl.SubclassDlgItem(IDC_STATIC_EW1, this))
|
|
{
|
|
// 错误时,结束对话框
|
|
EndDialog(IDCANCEL);
|
|
return FALSE;
|
|
}
|
|
|
|
ShowEarthWorm();
|
|
|
|
UpdateData(FALSE);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CGLYCDlg::ShowEarthWorm()
|
|
{
|
|
m_wndViewCtrl.clearAll();
|
|
m_wndViewCtrl.init(true);
|
|
m_wndViewCtrl.SetOrbitFlag(OBF_PAN | OBF_ZOOM | OBF_COTE);
|
|
|
|
AecDbEarthWorm worm;
|
|
worm.SetCrossSectionScr(m_sCrossSectionScr);
|
|
worm.SetChamferInter(100.0f);
|
|
|
|
ESection eType = eRect;
|
|
AcGePoint2dArray arDatas;
|
|
eType = worm.ExtractEarthWormScr(arDatas);
|
|
|
|
AcGeLineSeg3d ln;
|
|
AcGePoint3d pt2(1000.0,0,0);
|
|
ln.set(AcGePoint3d::kOrigin,pt2);
|
|
|
|
AcDbRegion* pEWRegion = worm.CreateSectionRegion(ln,eType,arDatas);
|
|
if (pEWRegion != NULL)
|
|
{
|
|
AcDbExtents exts;
|
|
pEWRegion->getGeomExtents(exts);
|
|
|
|
AcGeMatrix3d xform;
|
|
xform.setToScaling(0.95);
|
|
pEWRegion->transformBy(xform);
|
|
|
|
m_wndViewCtrl.InitFromCurrentView2D(exts,true);
|
|
|
|
AcDbVoidPtrArray arr;
|
|
int rooms = worm.CreateSectionRoomRegion(ln, eType, arDatas, arr);
|
|
|
|
AcDbEntity* pEnt = NULL;
|
|
AcDbVoidPtrArray arr2;
|
|
worm.CreateSectionRoomAddition(ln,eType,arr2);
|
|
for (int i = 0; i < arr2.length(); i++)
|
|
{
|
|
pEnt = (AcDbEntity*)arr2.at(i);
|
|
m_wndViewCtrl.Add(pEnt);
|
|
}
|
|
|
|
m_wndViewCtrl.Add(pEWRegion);
|
|
m_wndViewCtrl.view()->invalidate();
|
|
|
|
m_wndViewCtrl.Invalidate();
|
|
m_wndViewCtrl.RedrawWindow();
|
|
}
|
|
|
|
AcArray<ERoom> arRoomsM;
|
|
AcGePoint2d ptSizeM,ptThickM;
|
|
GetEWSize(m_sCrossSectionScr,ptSizeM,ptThickM,arRoomsM);
|
|
|
|
m_dW = 1.0 * ( (int)(1.1 * ptSizeM.x + 0.5) );
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
void CGLYCDlg::OnBnClickedButton1()
|
|
{
|
|
CHZGLDlg dlg;
|
|
dlg.SetCrossSectionScr(m_sCrossSectionScr1);
|
|
int nRes = dlg.DoModal();
|
|
if (nRes == IDOK)
|
|
{
|
|
CString sScr;
|
|
dlg.GetCrossSectionScr(m_sCrossSectionScr1);
|
|
ShowEarthWorm();
|
|
}
|
|
}
|
|
|
|
void CGLYCDlg::OnBnClickedOk()
|
|
{
|
|
UpdateData();
|
|
|
|
if (m_sCrossSectionScr1.IsEmpty())
|
|
{
|
|
AfxMessageBox(_T("请选择引出管廊断面!"));
|
|
return;
|
|
}
|
|
|
|
if (m_dL < 1.0)
|
|
{
|
|
AfxMessageBox(_T("引出尺寸太短,至少大于2米!"));
|
|
return;
|
|
}
|
|
|
|
if (m_dX < 2.0)
|
|
{
|
|
AfxMessageBox(_T("距离左侧尺寸太短,至少大于2米!"));
|
|
return;
|
|
}
|
|
|
|
AcArray<ERoom> arRoomsM;
|
|
AcGePoint2d ptSizeM,ptThickM;
|
|
GetEWSize(m_sCrossSectionScr,ptSizeM,ptThickM,arRoomsM);
|
|
|
|
AcGePoint2d ptSizeN,ptThickN;
|
|
AcArray<ERoom> arRoomsN;
|
|
GetEWSize(m_sCrossSectionScr1,ptSizeN,ptThickN,arRoomsN);
|
|
|
|
if (arRoomsN.length() > arRoomsM.length())
|
|
{
|
|
AfxMessageBox(_T("引出的管廊舱室数不能大于主管廊舱室数!"));
|
|
return;
|
|
}
|
|
|
|
if (m_dW - ptSizeN.x < -1.e-3)
|
|
{
|
|
AfxMessageBox(_T("下沉室宽度不能小于引出管廊宽度!"));
|
|
return;
|
|
}
|
|
|
|
UIDataCache::Write(_T("%d%d%d%d%d%i%d%d"), _T("CGLYCDlg"), &m_dL, &m_dX, &m_dB, &m_dC, &m_dH, &m_nPos, &m_dG, &m_dW);
|
|
|
|
OnOK();
|
|
}
|
|
|
|
void CGLYCDlg::GetEWSize(LPCTSTR pszScr,AcGePoint2d& ptSize,AcGePoint2d& ptThick,AcArray<ERoom>& arRooms)
|
|
{
|
|
//主管廊尺寸
|
|
//_T("RECT:3900x3600|2900x3600|400x300|EXT:...");//EXT为扩充字段
|
|
AecDbEarthWorm worm;
|
|
worm.SetCrossSectionScr(pszScr);
|
|
worm.SetChamferInter(0.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;
|
|
|
|
ptSize.set(dWidth,dHeight);
|
|
ptThick.set(dOutW,dIntW);
|
|
|
|
AcGeLineSeg3d ln(AcGePoint3d::kOrigin,AcGePoint3d(10.0,0.0,0));
|
|
worm.GetSectionRoomsTo(ln,arRooms,ptThick);
|
|
}
|
|
|
|
int CGLYCDlg::GetX3dSolidRecs( AecDbX3dGroup*& pGroup)
|
|
{
|
|
//1
|
|
AcArray<ERoom> arRooms;
|
|
AcGePoint2d ptSize,ptThick;
|
|
GetEWSize(m_sCrossSectionScr,ptSize,ptThick,arRooms);
|
|
|
|
//2
|
|
AcArray<ERoom> arRooms2;
|
|
AcGePoint2d ptSize2,ptThick2;
|
|
GetEWSize(m_sCrossSectionScr1,ptSize2,ptThick2,arRooms2);
|
|
|
|
AcGeVector3d vtOutLet = AcGeVector3d::kYAxis;
|
|
if (m_nPos > 0) vtOutLet = -AcGeVector3d::kYAxis;
|
|
AcGeVector3d vtTB = m_nPos2 == 0 ? -AcGeVector3d::kZAxis : AcGeVector3d::kZAxis;
|
|
|
|
AcGePoint3d ptOrg(m_dX,0,0);
|
|
ptOrg += vtTB * 0.5 * ptSize.y;//廊底
|
|
|
|
if (pGroup != NULL)
|
|
{
|
|
pGroup->RemoveAll3dSolidRec();
|
|
}
|
|
else
|
|
{
|
|
pGroup = new AecDbX3dGroup;
|
|
}
|
|
|
|
double dL = m_dW;
|
|
double dW = ptSize.x;
|
|
double dH = m_dH;
|
|
AcGeVector3d vtZ(0,0,1.0);
|
|
|
|
//BOX房子
|
|
ptOrg += vtTB * 0.5 * dH;
|
|
AcDbX3dSolid* pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kBox,ptOrg,vtZ,3,dL,dW,dH);
|
|
|
|
X3dSolidRec rec;
|
|
|
|
rec.pXSolid = pXSolid;
|
|
rec.bType = AcDb::kBoolUnite;
|
|
_tcscpy(rec.szLockId,IDCreate());
|
|
pGroup->AddX3dSolidRec(rec);
|
|
|
|
//减去厚度
|
|
dL -= 2.0 * ptThick2.x;
|
|
dW -= 2.0 * ptThick2.x;
|
|
dH -= 2.0 * ptThick2.x;
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kBox,ptOrg,vtZ,3,dL,dW,dH);
|
|
|
|
rec.pXSolid = pXSolid;
|
|
rec.bType = AcDb::kBoolSubtract;
|
|
_tcscpy(rec.szLockId,IDCreate());
|
|
pGroup->AddX3dSolidRec(rec);
|
|
|
|
//房顶开口,开口宽度和管廊舱室一致
|
|
AcGePoint3d ptHole = ptOrg;
|
|
if (m_nPos2 == 0)
|
|
ptHole.z += (0.5 * dH + 0.5 * ptThick2.x);
|
|
else
|
|
ptHole.z -= (0.5 * dH + 0.5 * ptThick2.x);
|
|
|
|
ptHole -= vtOutLet * 0.5 * ptSize.x;//到外廊边
|
|
|
|
for (int i = 0;i < arRooms.length();i++)
|
|
{
|
|
ptHole += i == 0 ? vtOutLet * ptThick.x : vtOutLet * ptThick.y;
|
|
|
|
ERoom& room = arRooms.at(i);
|
|
ptHole += vtOutLet * 0.5 * (room.ptGe[0].distanceTo(room.ptGe[1]));
|
|
|
|
dL = room.ptGe[0].distanceTo(room.ptGe[1]);
|
|
dW = dL;
|
|
dH = ptThick.x;
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kBox,ptHole,vtZ,3,dL,dW,dH);
|
|
|
|
rec.pXSolid = pXSolid;
|
|
rec.bType = AcDb::kBoolSubtract;
|
|
_tcscpy(rec.szLockId,IDCreate());
|
|
pGroup->AddX3dSolidRec(rec);
|
|
|
|
ptHole += vtOutLet * 0.5 * (room.ptGe[0].distanceTo(room.ptGe[1]));
|
|
}
|
|
|
|
|
|
//开口
|
|
AcGePoint3d ptCen = ptOrg;
|
|
ptCen += vtOutLet * 0.5 * ptSize.x;//到外边
|
|
ptCen -= vtOutLet * 0.5 * ptThick2.x;//回半厚度
|
|
|
|
dL = ptSize2.x;
|
|
dW = ptThick2.x;
|
|
dH = ptSize2.y - 2.0 * ptThick2.x;
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kBox,ptCen,vtZ,3,dL,dW,dH);
|
|
rec.pXSolid = pXSolid;
|
|
rec.bType = AcDb::kBoolSubtract;
|
|
_tcscpy(rec.szLockId,IDCreate());
|
|
pGroup->AddX3dSolidRec(rec);
|
|
|
|
//直边段,管廊
|
|
vtOutLet.normalize();
|
|
ptOrg += vtOutLet * 0.5 * ptSize.x;
|
|
ptOrg += vtOutLet * 0.5 * m_dC;
|
|
|
|
//下一段方向
|
|
AcGeVector3d vtDir = vtOutLet;
|
|
vtDir.z += m_dG * 0.01;
|
|
vtDir.normalize();
|
|
vtDir *= m_dB;
|
|
dL = vtDir.length();
|
|
vtDir.normalize();
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->CreateEarthWorm(ptOrg,vtOutLet,m_sCrossSectionScr1,m_dC,vtOutLet,vtDir);
|
|
rec.pXSolid = pXSolid;
|
|
rec.bType = AcDb::kBoolUnite;
|
|
_tcscpy(rec.szLockId,IDCreate());
|
|
pGroup->AddX3dSolidRec(rec);
|
|
|
|
//具有坡度的管廊段
|
|
ptOrg += 0.5 * vtOutLet * m_dC;
|
|
|
|
ptOrg += vtDir * 0.5 * m_dB;
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->CreateEarthWorm(ptOrg,vtDir,m_sCrossSectionScr1,dL,vtOutLet,vtOutLet);
|
|
rec.pXSolid = pXSolid;
|
|
rec.bType = AcDb::kBoolUnite;
|
|
_tcscpy(rec.szLockId,IDCreate());
|
|
pGroup->AddX3dSolidRec(rec);
|
|
|
|
//
|
|
ptOrg += vtDir * 0.5 * m_dB;
|
|
ptOrg += vtOutLet * 0.5 * m_dL;
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->CreateEarthWorm(ptOrg,vtOutLet,m_sCrossSectionScr1,m_dL,vtDir,vtOutLet);
|
|
rec.pXSolid = pXSolid;
|
|
rec.bType = AcDb::kBoolUnite;
|
|
_tcscpy(rec.szLockId,IDCreate());
|
|
pGroup->AddX3dSolidRec(rec);
|
|
|
|
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_dX"),m_dX);
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_dB"),m_dB);
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_dC"),m_dC);
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_dH"),m_dH);
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_nPos"),m_nPos);
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_nPos2"),m_nPos2);
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_dG"),m_dG);
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_dW"),m_dW);
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_sCrossSectionScr"),m_sCrossSectionScr);
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_sCrossSectionScr1"),m_sCrossSectionScr1);
|
|
|
|
return TRUE;
|
|
}
|