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

188 lines
4.1 KiB
C++

#include "stdafx.h"
#include "PQPJDlg.h"
#include "AecDbEarthWorm.h"
#include "KTCADUtilityEx.h"
#include "AcDbX3dSolid.h"
#include "AecDbX3dGroup.h"
#include "axlock.h"
#include "UITools.h"
extern Acad::ErrorStatus AddToModelSpace(AcDbEntity* pEnt,AcDbDatabase* pDb ,bool bClose );
extern CString IDCreate();
IMPLEMENT_DYNAMIC(CPQPJDlg, CDialog)
CPQPJDlg::CPQPJDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPQPJDlg::IDD, pParent)
, m_dL1(10.0)
, m_dGr(6.0)
, m_dL3(65.0)
, m_dLen(20.0)
, m_nPos(1)
{
UIDataCache::Read(_T("%s%d%d%d%d"), _T("CPQPJDlg")
, &m_sCrossSectionScr
, &m_dL1 , &m_dGr , &m_dL3 , &m_dLen);
}
CPQPJDlg::~CPQPJDlg()
{
}
void CPQPJDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_dL1);
DDX_Text(pDX, IDC_EDIT3, m_dGr);
DDX_Text(pDX, IDC_EDIT34, m_dL3);
DDX_Radio(pDX, IDC_RADIO1, m_nPos);
}
BEGIN_MESSAGE_MAP(CPQPJDlg, CDialog)
ON_BN_CLICKED(IDOK, &CPQPJDlg::OnBnClickedOk)
END_MESSAGE_MAP()
BOOL CPQPJDlg::OnInitDialog()
{
CDialog::OnInitDialog();
UpdateData(FALSE);
return TRUE;
}
void CPQPJDlg::OnBnClickedOk()
{
UpdateData();
if (m_dL1 < 1.0 )
{
AfxMessageBox(_T("坡起段长度太小!至少大于管廊总宽!"));
return;
}
if ( fabs(m_dGr) < 1.e-10)
{
AfxMessageBox(_T("坡度没有变化!请输入坡度!"));
return;
}
if (m_dL3 - m_dLen > 1.e-3 || m_dL3 < -1.e-10)
{
AfxMessageBox(_T("坡度段在主管廊外部!距离左侧距离输入不正确!"));
return;
}
UIDataCache::Write(_T("%s%d%d%d%d"), _T("CPQPJDlg")
, &m_sCrossSectionScr
, &m_dL1 , &m_dGr , &m_dL3 , &m_dLen);
OnOK();
}
int CPQPJDlg::GetX3dSolidRecs( AecDbX3dGroup*& pGroup)
{
//_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);
if (pGroup != NULL)
{
pGroup->RemoveAll3dSolidRec();
}
else
{
pGroup = new AecDbX3dGroup;
}
AcDbX3dSolid* pXSolid = NULL;
AcGeVector3d vtZ = AcGeVector3d::kXAxis;
vtZ.x = 100.0;
vtZ.z = m_dGr;//坡度
X3dSolidRec rec;
AcGePoint3d ptOrg(0,0,0);
switch(m_nPos)
{
case 0:
{
ptOrg.x = m_dL3;
ptOrg.x -= 0.5 * m_dL3;
//从主管廊上减去一部分
pXSolid = new AcDbX3dSolid;
pXSolid->CreateEarthWorm(ptOrg,AcGeVector3d::kXAxis,m_sCrossSectionScr,m_dL3,AcGeVector3d::kXAxis,vtZ);
rec.pXSolid = pXSolid;
rec.bType = AcDb::kBoolSubtract;
_tcscpy(rec.szLockId,IDCreate());
pGroup->AddX3dSolidRec(rec);
//破段
vtZ.normalize();
ptOrg.x = m_dL3;
ptOrg -= vtZ * m_dL1 * 0.5;
pXSolid = new AcDbX3dSolid;
pXSolid->CreateEarthWorm(ptOrg,vtZ,m_sCrossSectionScr,m_dL1,vtZ,AcGeVector3d::kXAxis);//前后X轴
rec.pXSolid = pXSolid;
rec.bType = AcDb::kBoolUnite;
_tcscpy(rec.szLockId,IDCreate());
pGroup->AddX3dSolidRec(rec);
break;
}
case 1:
{
ptOrg.x = m_dL3;//距离左侧
ptOrg.x += 0.5 * (m_dLen - m_dL3);
//从主管廊上减去一部分
pXSolid = new AcDbX3dSolid;
pXSolid->CreateEarthWorm(ptOrg,AcGeVector3d::kXAxis,m_sCrossSectionScr,m_dLen - m_dL3,AcGeVector3d::kXAxis,vtZ);
rec.pXSolid = pXSolid;
rec.bType = AcDb::kBoolSubtract;
_tcscpy(rec.szLockId,IDCreate());
pGroup->AddX3dSolidRec(rec);
//破段
vtZ.normalize();
ptOrg.x -= 0.5 * (m_dLen - m_dL3);
ptOrg += vtZ * m_dL1 * 0.5;
pXSolid = new AcDbX3dSolid;
pXSolid->CreateEarthWorm(ptOrg,vtZ,m_sCrossSectionScr,m_dL1,vtZ,vtZ);//前后X轴
rec.pXSolid = pXSolid;
rec.bType = AcDb::kBoolUnite;
_tcscpy(rec.szLockId,IDCreate());
pGroup->AddX3dSolidRec(rec);
break;
}
default:
break;
}
pGroup->SetOrgPoint( ptOrg );
pGroup->SetAxis(X,AcGeVector3d::kXAxis);
pGroup->SetAxis(Y,AcGeVector3d::kYAxis);
pGroup->SetAxis(Z,AcGeVector3d::kZAxis);
//序列化BIM数据
pGroup->GetSpecialtyData()->SetAt(_T("m_dL1"),m_dL1);
pGroup->GetSpecialtyData()->SetAt(_T("m_dGr"),m_dGr);
pGroup->GetSpecialtyData()->SetAt(_T("m_dL3"),m_dL3);
pGroup->GetSpecialtyData()->SetAt(_T("m_dLen"),m_dLen);
pGroup->GetSpecialtyData()->SetAt(_T("m_sCrossSectionScr"),m_sCrossSectionScr);
pGroup->GetSpecialtyData()->SetAt(_T("m_nPos"),m_nPos);
return 0;
}