400 lines
8.4 KiB
C++
400 lines
8.4 KiB
C++
#include "stdafx.h"
|
|
#include "LXXDDlg.h"
|
|
#include "AecDb3dRoadAxisLine.h"
|
|
#include "KTCADUtilityEx.h"
|
|
#include "AcDbX3dSolid.h"
|
|
#include "AecDbX3dPart.h"
|
|
#include "axlock.h"
|
|
#include "UITools.h"
|
|
#include "CCSYDlg.h"
|
|
#include "BimInfoDlg.h"
|
|
|
|
static void FreeBuffer(int n, AcDbVoidPtrArray& arEntPtrs)
|
|
{
|
|
AcDbEntity* pEnt = NULL;
|
|
while (arEntPtrs.length() > n)
|
|
{
|
|
pEnt = (AcDbEntity*)arEntPtrs.last();
|
|
DELETE_PTR(pEnt);
|
|
arEntPtrs.removeLast();
|
|
}
|
|
}
|
|
|
|
IMPLEMENT_DYNAMIC(CLXXDDlg, CDialog)
|
|
|
|
CLXXDDlg::CLXXDDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CLXXDDlg::IDD, pParent)
|
|
, m_dH(2.5)
|
|
, m_dW(3.0)
|
|
, m_dT(0.36)
|
|
, m_nShape(0)
|
|
, m_sScript(_T(""))
|
|
, m_dE0(0)
|
|
, m_dE1(4.0)
|
|
, m_nF(10)
|
|
, m_sPoint(_T(""))
|
|
, m_sVtStaCut(_T(""))
|
|
, m_sVtEndCut(_T(""))
|
|
, m_dT2(0.36)
|
|
, m_dT3(0.36)
|
|
{
|
|
UIDataCache::Read(_T("%d%d%d%i%d%d%d%d"), _T("CLXXDDlg")
|
|
, &m_dH , &m_dW , &m_dT
|
|
, &m_nShape,&m_dE0,&m_dE1,&m_dT2,&m_dT3);
|
|
|
|
if (m_dH < 0.01)
|
|
m_dH = 2.5;
|
|
if (m_dW < 0.01)
|
|
m_dW = 4.0;
|
|
if (m_dT < 0.01)
|
|
m_dT = 0.36;
|
|
|
|
m_vtLast.set(0,0,0);
|
|
m_vtNext.set(0,0,0);
|
|
}
|
|
|
|
CLXXDDlg::~CLXXDDlg()
|
|
{
|
|
}
|
|
|
|
void CLXXDDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
DDX_Radio(pDX, IDC_RADIO1, m_nShape);
|
|
DDX_Text(pDX, IDC_EDIT1, m_dH);
|
|
DDX_Text(pDX, IDC_EDIT3, m_dW);
|
|
DDX_Text(pDX, IDC_EDIT5, m_dT);
|
|
DDX_Text(pDX, IDC_EDIT7, m_dE0);
|
|
DDX_Text(pDX, IDC_EDIT8, m_dE1);
|
|
DDX_Text(pDX, IDC_EDIT15, m_nF);
|
|
DDX_Text(pDX, IDC_EDIT6, m_sScript);
|
|
DDX_Text(pDX, IDC_EDIT9, m_sPoint);
|
|
DDX_Text(pDX, IDC_EDIT16, m_sVtStaCut);
|
|
DDX_Text(pDX, IDC_EDIT17, m_sVtEndCut);
|
|
DDX_Text(pDX, IDC_EDIT11, m_dT2);
|
|
DDX_Text(pDX, IDC_EDIT12, m_dT3);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CLXXDDlg, CDialog)
|
|
ON_BN_CLICKED(IDOK, &CLXXDDlg::OnBnClickedOk)
|
|
ON_BN_CLICKED(IDC_BUTTON52, &CLXXDDlg::OnBnClickedButton52)
|
|
ON_BN_CLICKED(IDC_BUTTON53, &CLXXDDlg::OnBnClickedButton53)
|
|
ON_BN_CLICKED(IDC_BUTTON54, &CLXXDDlg::OnBnClickedButton54)
|
|
ON_BN_CLICKED(IDC_BUTTON55, &CLXXDDlg::OnBnClickedButton55)
|
|
ON_BN_CLICKED(IDC_BUTTON1, &CLXXDDlg::OnBnClickedButton1)
|
|
ON_BN_CLICKED(IDC_BUTTON2, &CLXXDDlg::OnBnClickedButton2)
|
|
END_MESSAGE_MAP()
|
|
|
|
BOOL CLXXDDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
UpdateData(FALSE);
|
|
|
|
CBimInfoDlg::SetDefaultBimInfo(&m_mapBimData,_T("螺旋巷"));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CLXXDDlg::OnBnClickedOk()
|
|
{
|
|
UpdateData();
|
|
|
|
if (m_nShape == 1)
|
|
{
|
|
m_dH = m_dW;
|
|
}
|
|
|
|
if (m_dH < 0.1 || m_dW < 0.1)
|
|
{
|
|
AfxMessageBox(_T("通道尺寸太小!请重新输入尺寸!"));
|
|
return;
|
|
}
|
|
|
|
if (m_sScript.IsEmpty())
|
|
{
|
|
AfxMessageBox(_T("请选择螺旋巷道路径!"));
|
|
return;
|
|
}
|
|
|
|
if (m_nF < 10)
|
|
{
|
|
AfxMessageBox(_T("曲面光滑度较小,至少大于10!"));
|
|
return;
|
|
}
|
|
|
|
if (m_sPoint.IsEmpty())
|
|
{
|
|
AfxMessageBox(_T("请选择标高起点!"));
|
|
return;
|
|
}
|
|
|
|
if ( m_sVtStaCut.IsEmpty() )
|
|
{
|
|
AfxMessageBox(_T("选择起点断面线!"));
|
|
return;
|
|
}
|
|
|
|
if ( m_sVtEndCut.IsEmpty() )
|
|
{
|
|
AfxMessageBox(_T("选择终点断面线!"));
|
|
return;
|
|
}
|
|
|
|
if (m_dT < 0.01 || m_dT2 < 0.01 || m_dT3 < 0.01)
|
|
{
|
|
AfxMessageBox(_T("巷道壁厚太小,请检查输入壁厚!"));
|
|
return;
|
|
}
|
|
|
|
UIDataCache::Write(_T("%d%d%d%i%d%d%d%d"), _T("CLXXDDlg")
|
|
, &m_dH , &m_dW , &m_dT
|
|
, &m_nShape,&m_dE0,&m_dE1,&m_dT2,&m_dT3);
|
|
|
|
OnOK();
|
|
}
|
|
|
|
void CLXXDDlg::OnBnClickedButton52()
|
|
{
|
|
UpdateData();
|
|
|
|
EnableWindow(FALSE);
|
|
CWnd* pFrame = acedGetAcadFrame();
|
|
pFrame->EnableWindow(TRUE);
|
|
ShowWindow(SW_HIDE);
|
|
pFrame->SetFocus();
|
|
|
|
AcAxDocLock lock;
|
|
ads_point pt;
|
|
ads_name ent;
|
|
int nRes = acedEntSel(_T("\n请选择螺旋路径平面多义线:"),ent,pt);
|
|
if (nRes == RTNORM)
|
|
{
|
|
AcDbObjectId id;
|
|
acdbGetObjectId(id,ent);
|
|
|
|
CString sText;
|
|
AcDbEntity* pEnt = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
|
|
{
|
|
AcDbPolyline* pPl = AcDbPolyline::cast(pEnt);
|
|
if (pPl != NULL)
|
|
{
|
|
AcGePoint2d ptSta;
|
|
pPl->getPointAt(0,ptSta);
|
|
|
|
m_sScript = _T("");
|
|
double dBulge = 0.0;
|
|
AcGePoint2d pt2d;
|
|
AcGePoint2dArray arPt2ds;
|
|
for (int i = 0;i < pPl->numVerts();i++)
|
|
{
|
|
pPl->getPointAt(i,pt2d);
|
|
pPl->getBulgeAt(i,dBulge);
|
|
|
|
//if (arPt2ds.find(pt2d) == -1)
|
|
{
|
|
arPt2ds.append(pt2d);
|
|
|
|
sText.Format(_T("%g,%g@%g,"),pt2d.x,pt2d.y,dBulge);
|
|
m_sScript += sText;
|
|
}
|
|
}
|
|
m_sScript.TrimRight(_T(","));
|
|
}
|
|
else
|
|
{
|
|
acutPrintf(_T("\n选择的实体不是平面多义线!"));
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
|
|
pFrame->EnableWindow(FALSE);
|
|
ShowWindow(SW_SHOW);
|
|
EnableWindow(TRUE);
|
|
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
void CLXXDDlg::OnBnClickedButton53()
|
|
{
|
|
UpdateData();
|
|
|
|
EnableWindow(FALSE);
|
|
CWnd* pFrame = acedGetAcadFrame();
|
|
pFrame->EnableWindow(TRUE);
|
|
ShowWindow(SW_HIDE);
|
|
pFrame->SetFocus();
|
|
|
|
ads_point pt;
|
|
int nRes = acedGetPoint(NULL,_T("\n选择开始标高的位置点:"),pt);
|
|
if (nRes == RTNORM)
|
|
{
|
|
ads_point pt2;
|
|
acdbUcs2Wcs(pt,pt2,false);
|
|
m_ptSta = asPnt3d(pt2);
|
|
m_ptSta.z = 0.0;
|
|
|
|
m_sPoint.Format(_T("(%g,%g,%g)"),m_ptSta.x,m_ptSta.y,0.0);
|
|
}
|
|
|
|
pFrame->EnableWindow(FALSE);
|
|
ShowWindow(SW_SHOW);
|
|
EnableWindow(TRUE);
|
|
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
|
|
int CLXXDDlg::GetX3dPart( AecDbX3dPart*& pPart)
|
|
{
|
|
if (pPart != NULL)
|
|
{
|
|
pPart->RemoveAll3dSolidRec();
|
|
}
|
|
else
|
|
{
|
|
pPart = new AecDbX3dPart;
|
|
}
|
|
|
|
AcGePoint3d ptOrg;
|
|
ptOrg = m_ptSta;
|
|
|
|
|
|
AcDbX3dSolid* pXSolid = NULL;
|
|
if (m_nShape == 0)//矩形
|
|
{
|
|
//L,W,t,H 长宽,厚度
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->CreatePathExtrude(ptOrg,m_sScript,m_nShape,m_nF,m_dW,m_dH,m_dT,m_dT2,m_dT3,m_dE0,m_dE1,m_vtLast,m_vtNext);
|
|
pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite);
|
|
}
|
|
else//圆形
|
|
{
|
|
//r,t,H
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->CreatePathExtrude(ptOrg,m_sScript,m_nShape,m_nF,m_dW,m_dH,m_dT,m_dT2,m_dT3,m_dE0,m_dE1,m_vtLast,m_vtNext);
|
|
pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite);
|
|
}
|
|
|
|
pPart->SetOrgPoint( ptOrg );
|
|
pPart->SetAxis(X,AcGeVector3d::kXAxis);
|
|
pPart->SetAxis(Y,AcGeVector3d::kYAxis);
|
|
pPart->SetAxis(Z,AcGeVector3d::kZAxis);
|
|
|
|
//序列化BIM数据
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_dH"),m_dH);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_dW"),m_dW);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_dT"),m_dT);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_dT2"),m_dT2);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_dT3"),m_dT3);
|
|
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_nShape"),m_nShape);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_sScript"),m_sScript);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_nF"),m_nF);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_dE0"),m_dE0);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_dE1"),m_dE1);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_sVtStaCut"),m_sVtStaCut);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_sVtEndCut"),m_sVtEndCut);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_vtLast"),m_vtLast);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_vtNext"),m_vtNext);
|
|
pPart->GetSpecialtyData()->SetAt(_T("BIMDATA"),1,m_mapBimData);
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CLXXDDlg::OnBnClickedButton54()
|
|
{
|
|
UpdateData();
|
|
|
|
EnableWindow(FALSE);
|
|
CWnd* pFrame = acedGetAcadFrame();
|
|
pFrame->EnableWindow(TRUE);
|
|
ShowWindow(SW_HIDE);
|
|
pFrame->SetFocus();
|
|
|
|
AcAxDocLock lock;
|
|
ads_point pt;
|
|
ads_name ent;
|
|
int nRes = acedEntSel(_T("\n请选择起点断面直线:"),ent,pt);
|
|
if (nRes == RTNORM)
|
|
{
|
|
AcDbObjectId id;
|
|
acdbGetObjectId(id,ent);
|
|
|
|
AcDbEntity* pEnt = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
|
|
{
|
|
AcDbLine* pLn = AcDbLine::cast(pEnt);
|
|
if (pLn != NULL)
|
|
{
|
|
AcGeVector3d vt = pLn->endPoint() - pLn->startPoint();
|
|
vt.normalize();
|
|
m_vtLast = vt;
|
|
m_sVtStaCut.Format(_T("%g,%g,%g"),vt.x,vt.y,vt.z);
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
|
|
pFrame->EnableWindow(FALSE);
|
|
ShowWindow(SW_SHOW);
|
|
EnableWindow(TRUE);
|
|
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
void CLXXDDlg::OnBnClickedButton55()
|
|
{
|
|
UpdateData();
|
|
|
|
EnableWindow(FALSE);
|
|
CWnd* pFrame = acedGetAcadFrame();
|
|
pFrame->EnableWindow(TRUE);
|
|
ShowWindow(SW_HIDE);
|
|
pFrame->SetFocus();
|
|
|
|
AcAxDocLock lock;
|
|
ads_point pt;
|
|
ads_name ent;
|
|
int nRes = acedEntSel(_T("\n请选择终点断面直线:"),ent,pt);
|
|
if (nRes == RTNORM)
|
|
{
|
|
AcDbObjectId id;
|
|
acdbGetObjectId(id,ent);
|
|
|
|
AcDbEntity* pEnt = NULL;
|
|
if (Acad::eOk == acdbOpenAcDbEntity(pEnt,id,AcDb::kForRead))
|
|
{
|
|
AcDbLine* pLn = AcDbLine::cast(pEnt);
|
|
if (pLn != NULL)
|
|
{
|
|
AcGeVector3d vt = pLn->endPoint() - pLn->startPoint();
|
|
vt.normalize();
|
|
m_vtNext = vt;
|
|
m_sVtEndCut.Format(_T("%g,%g,%g"),vt.x,vt.y,vt.z);
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
|
|
pFrame->EnableWindow(FALSE);
|
|
ShowWindow(SW_SHOW);
|
|
EnableWindow(TRUE);
|
|
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
void CLXXDDlg::OnBnClickedButton1()
|
|
{
|
|
CCCSYDlg dlg;
|
|
dlg.SetBmpFileName(_T("LXXDDlg.bmp"));
|
|
dlg.DoModal();
|
|
}
|
|
|
|
void CLXXDDlg::OnBnClickedButton2()
|
|
{
|
|
CBimInfoDlg::ShowBimInfo(&m_mapBimData,_T("螺旋巷"));
|
|
}
|