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

1029 lines
24 KiB
C++

#include "stdafx.h"
#include "TJBZJCDlg.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 );
void DLLIMPEXP ConnectEarthWorm(AecDbEarthWorm* pWorm1,AecDbEarthWorm* pWorm2);
extern AcGePoint3d MidPoint(AcGePoint3d& pt1,AcGePoint3d& pt2);
extern CString IDCreate();
IMPLEMENT_DYNAMIC(CTJBZJCDlg, CDialog)
CTJBZJCDlg::CTJBZJCDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTJBZJCDlg::IDD, pParent)
, m_dP1(37.5)
, m_dP2(0.06)
, m_dP3(0.08)
, m_dP4(10.0)
, m_dP5(0.0)
, m_dP6(0.06)
, m_dMinSize(33.6)
, m_nLayers(2)
, m_dGr(-1.0)
, m_dX(20.0)
, m_bOnlyBrige(TRUE)
, m_dDownbyGr(-4.0)
, m_dP4R(0)
, m_b90Style(FALSE)
{
UIDataCache::Read(_T("%d%d%d%d%d%d%d%i%d%s%d%i%d"), _T("CTJBZJCDlg")
, &m_dP1 , &m_dP2 , &m_dP3 , &m_dP4 , &m_dP5 , &m_dP6 , &m_dMinSize
, &m_nLayers
, &m_dGr
, &m_sCrossSectionScr
, &m_dX
, &m_bOnlyBrige
, &m_dDownbyGr);
m_dEWL = 80.0f;//80m
m_pGLBJXDataMap = NULL;
m_dP4R = 0.0;
}
CTJBZJCDlg::~CTJBZJCDlg()
{
}
void CTJBZJCDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT7, m_dP1);
DDX_Text(pDX, IDC_EDIT4, m_dP2);
DDX_Text(pDX, IDC_EDIT3, m_dP3);
DDX_Text(pDX, IDC_EDIT5, m_dP4);
DDX_Text(pDX, IDC_EDIT6, m_dP5);
DDX_Text(pDX, IDC_EDIT1, m_dP6);
DDX_Text(pDX, IDC_EDIT2, m_dMinSize);
DDX_Text(pDX, IDC_EDIT8, m_nLayers);
DDX_Text(pDX, IDC_EDIT9, m_dGr);
DDX_Text(pDX, IDC_EDIT28, m_dX);
DDX_Check(pDX, IDC_CHECK1, m_bOnlyBrige);
DDX_Text(pDX, IDC_EDIT14, m_dDownbyGr);
DDX_Text(pDX, IDC_EDIT15, m_dP4R);
DDX_Check(pDX, IDC_CHECK2, m_b90Style);
}
BEGIN_MESSAGE_MAP(CTJBZJCDlg, CDialog)
ON_BN_CLICKED(IDOK, &CTJBZJCDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_BUTTON1, &CTJBZJCDlg::OnBnClickedButton1)
ON_EN_CHANGE(IDC_EDIT14, &CTJBZJCDlg::OnEnChangeEdit14)
ON_EN_CHANGE(IDC_EDIT9, &CTJBZJCDlg::OnEnChangeEdit9)
ON_EN_CHANGE(IDC_EDIT5, &CTJBZJCDlg::OnEnChangeEdit5)
END_MESSAGE_MAP()
BOOL CTJBZJCDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//仅仅倒虹
m_bOnlyBrige = TRUE;
m_dP5 = 0.0;
//-----------------
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;
//初步估算
m_dMinSize = 1.0 * ( (int) ( dWidth * 1.1 + 0.5) );
m_dP1 = 1.0 * ( (int) ( m_dMinSize * 1.5 + 0.5) );
m_dGr = m_dDownbyGr / (m_dP4 + m_dP5) * 100.0; //取百分比,如2.5%
if (m_dP4R < 0.1)//对称结构
m_dP4R = m_dP4;
UpdateData(FALSE);
return TRUE;
}
void CTJBZJCDlg::OnBnClickedOk()
{
UpdateData();
/*if (m_dP1 < m_dMinSize)
{
CString err(_T(""));
err.Format(_T("P1 不能小于 %.2f"), m_dMinSize);
AfxMessageBox(err);
return;
}*/
if (m_nLayers < 1)
{
AfxMessageBox(_T("结构层数至少一层!"));
return;
}
UIDataCache::Write(_T("%d%d%d%d%d%d%d%i%d%s%d%i%d"), _T("CTJBZJCDlg")
, &m_dP1 , &m_dP2 , &m_dP3 , &m_dP4 , &m_dP5 , &m_dP6 , &m_dMinSize
, &m_nLayers
, &m_dGr
, &m_sCrossSectionScr
, &m_dX
, &m_bOnlyBrige
, &m_dDownbyGr);
OnOK();
}
//尺寸示意
void CTJBZJCDlg::OnBnClickedButton1()
{
//尺寸示意图
CCCSYDlg dlg;
dlg.SetBmpFileName(_T("BZJC.bmp"));
dlg.DoModal();
}
int CTJBZJCDlg::GetX3dSolidRecs( AecDbX3dGroup*& pGroup,int nDir)
{
//_T("RECT:3900x3600|2900x3600|400x300|EXT:...");//EXT为扩充字段
AecDbEarthWorm worm;
worm.SetCrossSectionScr(m_sCrossSectionScr);
worm.SetChamferInter(100.0);
AcGePoint2dArray arDatas;
ESection eSecType = worm.ExtractEarthWormScr(arDatas);
double dWidth = 0.0,dHeight = 0.0;
//外壁厚,内隔壁厚
double dOutW = 0.0,dIntW = 0.0;
if (eSecType == eRect)
{
if (arDatas.length() > 0)
{
dOutW = arDatas.last().x;
dIntW = arDatas.last().y;
}
//总高度
dHeight = arDatas.first().y;
dHeight += 2 * arDatas.last().x;
//总宽度
for (int i = 0;i < arDatas.length()-1;i++)
{
dWidth += arDatas.at(i).x;
}
dWidth += (arDatas.length() - 2) * dIntW;
dWidth += dOutW * 2.0;
}
//底部壁厚增加
double dBomAdd = worm.GetBomThickAdd();
//组
if (pGroup != NULL)
{
pGroup->RemoveAll3dSolidRec();
}
else
{
pGroup = new AecDbX3dGroup;
}
AcGeVector3d vtDirX = nDir == 0 ? AcGeVector3d::kXAxis : -AcGeVector3d::kYAxis;
AcGeVector3d vtDirY = nDir == 0 ? AcGeVector3d::kYAxis : AcGeVector3d::kXAxis;
AcGePoint3d ptGe[9],ptOrg;
//定位中心
if ( nDir == 0)
{
ptOrg.set(0,0,-dHeight * 0.5);
}
else
{
ptOrg.set(0,0.5 * m_dEWL,-dHeight * 0.5);
}
//ptOrg.set(m_dX,0,-dHeight * 0.5);
ptOrg += m_dX * vtDirX;
//ptOrg.x += m_dP4;
ptOrg += m_dP4 * vtDirX;
//ptOrg.x += m_dP5;
ptOrg += m_dP5 * vtDirX;
//ptOrg.x += 0.5 * m_dP1;//中心
ptOrg += 0.5 * m_dP1 * vtDirX;
//底部八边形结构平板的点
ptGe[0] = ptOrg;
//ptGe[0].x -= 0.5 * m_dP1;
ptGe[0] -= 0.5 * m_dP1 * vtDirX;
//ptGe[0].y -= 0.5 * dWidth;
ptGe[0] -= 0.5 * dWidth * vtDirY;
ptGe[1] = ptOrg;
//ptGe[1].x -= 0.5 * dWidth;
ptGe[1] -= 0.5 * dWidth * vtDirX;
//ptGe[1].y -= 0.5 * m_dP1;
ptGe[1] -= 0.5 * m_dP1 * vtDirY;
ptGe[2] = ptGe[1];
//ptGe[2].x += dWidth;
ptGe[2] += dWidth * vtDirX;
ptGe[3] = ptGe[0];
//ptGe[3].x += m_dP1;
ptGe[3] += m_dP1 * vtDirX;
ptGe[4] = ptGe[3];
//ptGe[4].y += dWidth;
ptGe[4] += dWidth * vtDirY;
ptGe[5] = ptGe[2];
//ptGe[5].y += m_dP1;
ptGe[5] += m_dP1 * vtDirY;
ptGe[6] = ptGe[1];
//ptGe[6].y += m_dP1;
ptGe[6] += m_dP1 * vtDirY;
ptGe[7] = ptGe[0];
//ptGe[7].y += dWidth;
ptGe[7] += dWidth * vtDirY;
ptGe[8] = ptGe[0];
CString sPoints,sText;
for (int i = 0;i < 9;i++)
{
sText.Format(_T("%g,%g,"),ptGe[i].x,ptGe[i].y);
sPoints += sText;
}
sPoints.TrimRight(_T(','));
//先计算创建底部平板
AcDbPolyline pl;
for (int i = 0;i < 9;i++)
{
pl.addVertexAt(i,AcGePoint2d(ptGe[i].x,ptGe[i].y));
}
pl.setNormal(AcGeVector3d::kZAxis);
pl.setClosed(Adesk::kTrue);
int nOutSet = 0;
AcGePoint2d ptGeO[12];
AcDbVoidPtrArray arPlPtrs;
pl.getOffsetCurves(m_dP5,arPlPtrs);
pl.getOffsetCurves(-m_dP5,arPlPtrs);
if (arPlPtrs.length() == 2)
{
AcDbPolyline* pL1 = (AcDbPolyline* )arPlPtrs.first();
AcDbPolyline* pL2 = (AcDbPolyline* )arPlPtrs.last();
double dAr1 = 0.0,dAr2 = 0.0;
pL1->getArea(dAr1);pL2->getArea(dAr2);
if (dAr1 > dAr2)
{
for(int j = 0;j < pL1->numVerts();j++)
{
pL1->getPointAt(j,ptGeO[j]);
}
ptGeO[j] = ptGeO[0];
nOutSet = pL1->numVerts() + 1;
}
else
{
for(int j = 0;j < pL2->numVerts();j++)
{
pL2->getPointAt(j,ptGeO[j]);
}
ptGeO[j] = ptGeO[0];
nOutSet = pL2->numVerts();
}
DELETE_PTR(pL1);
DELETE_PTR(pL2);
}
else
{
return FALSE;
}
AcGeVector3d vtZ = AcGeVector3d::kZAxis;
AcDbX3dSolid* pXSolid = NULL;
X3dSolidRec rec;
AcGePoint3d ptCen = ptOrg;
//AcGeVector3d vtLast(1.0,0,0.01 * m_dGr
AcGeVector3d vtLast(m_dP4,0,m_dDownbyGr);
vtLast.normalize();
if (nDir == Y)
{
//vtLast.set(0,-1.0,0.01 * m_dGr
vtLast.set(0,-m_dP4,m_dDownbyGr);
vtLast.normalize();
}
//AcGeVector3d vtNext(1.0,0,-0.01 * m_dGr);
AcGeVector3d vtNext(m_dP4,0,-m_dDownbyGr);
vtNext.normalize();
if (nDir == Y)
{
//vtNext.set(0,-1.0,-0.01 * m_dGr
vtNext.set(0,-m_dP4,-m_dDownbyGr);
vtNext.normalize();
}
AcGeVector3d vtNextR(m_dP4R,0,-m_dDownbyGr);
if (nDir == Y)
{
//vtNext.set(0,-1.0,-0.01 * m_dGr
vtNextR.set(0,-m_dP4R,-m_dDownbyGr);
vtNextR.normalize();
}
vtNextR.normalize();
//截断原来的官廊
//double dL = m_dP1 + 2.0 * m_dP4 + 2.0 * m_dP5;
double dL = m_dP1 +m_dP4 + m_dP4R + 2.0 * m_dP5;
ptCen.z = 0.0;
AcGePoint3d ptCenNew = ptCen;//非对称结构
ptCenNew += 0.5 * (m_dP4R - m_dP4) * vtDirX;
//_T("RECT:3900x3600|2900x3600|400x300|EXT:...");//EXT为扩充字段
CString sCrossSectionScr = m_sCrossSectionScr;
pXSolid = new AcDbX3dSolid;
if (m_b90Style)
{
pXSolid->CreateEarthWorm(ptCenNew,vtDirX,sCrossSectionScr,dL,vtDirX,vtDirX);//船结构
}
else
{
pXSolid->CreateEarthWorm(ptCenNew,vtDirX,sCrossSectionScr,dL,vtLast,vtNextR);//ptCen对称结构
}
rec.pXSolid = pXSolid;
rec.bType = AcDb::kBoolSubtract;
_tcscpy(rec.szLockId,IDCreate());
pGroup->AddX3dSolidRec(rec);
//八字结构
if (!m_bOnlyBrige)//旧版本结构!!作废
{
/*ptCen = ptOrg;
//ptCen.z += m_dGr * m_dP4 * 0.01;//下降坡度
ptCen.z += m_dDownbyGr;
vtZ = AcGeVector3d::kZAxis;
for (int i = 0;i < m_nLayers;i++)
{
pXSolid = new AcDbX3dSolid;
pXSolid->CreateExtrude(ptCen,vtZ,sPoints,dHeight,dIntW);
rec.pXSolid = pXSolid;
rec.bType = AcDb::kBoolUnite;
_tcscpy(rec.szLockId,IDCreate());
pGroup->AddX3dSolidRec(rec);
ptCen.z += dHeight;
}
//创建每层地板
ptCen = ptOrg;
//ptCen.z += m_dGr * m_dP4 * 0.01;
ptCen.z += m_dDownbyGr;
ptCen.z -= dOutW;
sPoints = _T("");
for (int i = 0;i < nOutSet;i++)
{
sText.Format(_T("%g,%g,"),ptGeO[i].x,ptGeO[i].y);
sPoints += sText;
}
sPoints.TrimRight(_T(','));
pXSolid = new AcDbX3dSolid;
pXSolid->CreateExtrude(ptCen,vtZ,sPoints,dOutW,0.0);
rec.pXSolid = pXSolid;
rec.bType = AcDb::kBoolUnite;
_tcscpy(rec.szLockId,IDCreate());
rec.pXSolid->SetGSMarkerID(2000);
pGroup->AddX3dSolidRec(rec);
//创建柱子
double dH = m_nLayers * dHeight + 2 * m_dP6;
for (int j = 0;j < 8;j++)
{
ptCen = ptGe[j];
ptCen.z -= m_dP6;
ptCen.z += 0.5 * dH;
//ptCen.z += m_dGr * m_dP4 * 0.01;
ptCen.z += m_dDownbyGr;
pXSolid = new AcDbX3dSolid;
pXSolid->Create(AcDbX3dSolid::kBox,ptCen,vtZ,3,m_dP6,m_dP6,dH);
rec.pXSolid = pXSolid;
rec.bType = AcDb::kBoolUnite;
_tcscpy(rec.szLockId,IDCreate());
rec.pXSolid->SetGSMarkerID(2000);
pGroup->AddX3dSolidRec(rec);
}
//梁
for (int j = 0;j < 9;j++)
{
ptGe[j].z += m_nLayers * dHeight + 0.5 * m_dP6;
//ptGe[j].z += m_dGr * m_dP4 * 0.01;
ptGe[j].z += m_dDownbyGr;
}
Midpoint(ptGe[0],ptGe[3],ptCen);
pXSolid = new AcDbX3dSolid;
pXSolid->Create(AcDbX3dSolid::kBox,ptCen,vtZ,3,m_dP1,m_dP3,m_dP3);
rec.pXSolid = pXSolid;
rec.bType = AcDb::kBoolUnite;
_tcscpy(rec.szLockId,IDCreate());
rec.pXSolid->SetGSMarkerID(2000);
pGroup->AddX3dSolidRec(rec);
Midpoint(ptGe[7],ptGe[4],ptCen);
pXSolid = new AcDbX3dSolid;
pXSolid->Create(AcDbX3dSolid::kBox,ptCen,vtZ,3,m_dP1,m_dP3,m_dP3);
rec.pXSolid = pXSolid;
rec.bType = AcDb::kBoolUnite;
_tcscpy(rec.szLockId,IDCreate());
rec.pXSolid->SetGSMarkerID(2000);
pGroup->AddX3dSolidRec(rec);
Midpoint(ptGe[1],ptGe[6],ptCen);
pXSolid = new AcDbX3dSolid;
pXSolid->Create(AcDbX3dSolid::kBox,ptCen,vtZ,3,m_dP3,m_dP1,m_dP3);
rec.pXSolid = pXSolid;
rec.bType = AcDb::kBoolUnite;
_tcscpy(rec.szLockId,IDCreate());
rec.pXSolid->SetGSMarkerID(2000);
pGroup->AddX3dSolidRec(rec);
Midpoint(ptGe[2],ptGe[5],ptCen);
pXSolid = new AcDbX3dSolid;
pXSolid->Create(AcDbX3dSolid::kBox,ptCen,vtZ,3,m_dP3,m_dP1,m_dP3);
rec.pXSolid = pXSolid;
rec.bType = AcDb::kBoolUnite;
_tcscpy(rec.szLockId,IDCreate());
rec.pXSolid->SetGSMarkerID(2000);
pGroup->AddX3dSolidRec(rec);
//创建两边直边段,为一整段
ptOrg.z += dHeight * 0.5;//恢复中心
ptCen = ptOrg;
//ptCen.z += m_dGr * m_dP4 * 0.01;
ptCen.z += m_dDownbyGr;
pXSolid = new AcDbX3dSolid;
pXSolid->Create(AcDbX3dSolid::kBox,ptCen,vtZ,3,2.0 * m_dP5 + m_dP1,dWidth,dHeight);
rec.pXSolid = pXSolid;
rec.bType = AcDb::kBoolSubtract;
_tcscpy(rec.szLockId,IDCreate());
pGroup->AddX3dSolidRec(rec);
pXSolid = new AcDbX3dSolid;
pXSolid->CreateEarthWorm(ptCen,vtDirX,m_sCrossSectionScr,2.0 * m_dP5 + m_dP1,vtLast,vtNext);
rec.pXSolid = pXSolid;
rec.bType = AcDb::kBoolUnite;
rec.pXSolid->SetGSMarkerID(2000);
_tcscpy(rec.szLockId,IDCreate());
pGroup->AddX3dSolidRec(rec);*/
}
else//新倒虹结构
{
//创建两边直边段,为一整段
ptOrg.z += dHeight * 0.5;//恢复中心
ptCen = ptOrg;
//ptCen.z += m_dGr * m_dP4 * 0.01;
ptCen.z += m_dDownbyGr;
//中间水平管廊段
pXSolid = new AcDbX3dSolid;
pXSolid->CreateEarthWorm(ptCen,vtDirX,m_sCrossSectionScr,2.0 * m_dP5 + m_dP1,m_b90Style ? vtDirX : vtLast,m_b90Style ? vtDirX : vtNextR);
rec.pXSolid = pXSolid;
rec.bType = AcDb::kBoolUnite;
_tcscpy(rec.szLockId,IDCreate());
rec.pXSolid->SetGSMarkerID(2000);
pGroup->AddX3dSolidRec(rec);
}
//两边创建坡度段
//1.左侧
ptCen = ptOrg;
ptCen.z = 0.0;
//ptCen.x -= 0.5 * m_dP1;
ptCen -= 0.5 * m_dP1 * vtDirX;
//ptCen.x -= m_dP5;
ptCen -= m_dP5 * vtDirX;
//ptCen.x -= 0.5 * m_dP4;
ptCen -= 0.5 * m_dP4 * vtDirX;
vtZ = vtDirX;
//vtZ.x = 100.0;
//vtZ[nDir] = 100.0;
vtZ[nDir] = m_dP4;
//vtZ.z = m_dGr;//坡度
vtZ.z = m_dDownbyGr;
vtZ.normalize();
ptCen.z += 0.5 * m_dDownbyGr;//m_dP4 * m_dGr * 0.01;
// H / L = G
double dH2 = m_dDownbyGr;//m_dP4 * m_dGr * 0.01;
double dP4L = sqrt(m_dP4 * m_dP4 + dH2 * dH2);
if (m_b90Style)
{
ptCen = ptOrg;
ptCen.z = 0.0;
ptCen -= 0.5 * m_dP1 * vtDirX;
ptCen.z += 0.5 * m_dDownbyGr;
CreateEarthWormCone(pGroup,ptCen,vtDirX,vtDirY,nDir,dWidth,dHeight + fabs(m_dDownbyGr),0,m_dP4,dOutW,dIntW,dBomAdd,arDatas);
}
else
{
pXSolid = new AcDbX3dSolid;
pXSolid->CreateEarthWorm(ptCen,vtLast,m_sCrossSectionScr,dP4L,vtDirX,vtDirX);
rec.pXSolid = pXSolid;
rec.bType = AcDb::kBoolUnite;
_tcscpy(rec.szLockId,IDCreate());
rec.pXSolid->SetGSMarkerID(2000);
pGroup->AddX3dSolidRec(rec);
}
//2.右侧
ptCen = ptOrg;
ptCen.z = 0.0;
//ptCen.x += 0.5 * m_dP1;
ptCen += 0.5 * m_dP1 * vtDirX;
//ptCen.x += m_dP5;
ptCen += m_dP5 * vtDirX;
//ptCen.x += 0.5 * m_dP4;
ptCen += 0.5 * m_dP4R * vtDirX;//==m_dP4对称结构
vtZ = vtDirX;
//vtZ.x = 100.0;
vtZ[nDir] = 100.0;
double dGrR = m_dGr;
dGrR = m_dDownbyGr / (m_dP4R + m_dP5) * 100.0; //取百分比,如2.5%;
vtZ.z = -1.0 * dGrR;//原m_dGr对称结构;//坡度
vtZ.normalize();
ptCen.z += 0.5 * m_dDownbyGr;//m_dP4 * m_dGr * 0.01;
double dP4LR = sqrt(m_dP4R * m_dP4R + dH2 * dH2);//直角三角形斜边长L == dP4L对称结构
//vtNextR == vtNext对称结构
if (m_b90Style)
{
ptCen = ptOrg;
ptCen.z = 0.0;
ptCen += 0.5* m_dP1 * vtDirX;
ptCen.z += 0.5 * m_dDownbyGr;
CreateEarthWormCone(pGroup,ptCen,vtDirX,vtDirY,nDir,dWidth,dHeight + fabs(m_dDownbyGr),1,m_dP4R,dOutW,dIntW,dBomAdd,arDatas);
}
else
{
pXSolid = new AcDbX3dSolid;
pXSolid->CreateEarthWorm(ptCen,vtNextR,m_sCrossSectionScr,dP4LR,vtDirX,vtDirX);
rec.pXSolid = pXSolid;
rec.bType = AcDb::kBoolUnite;
_tcscpy(rec.szLockId,IDCreate());
rec.pXSolid->SetGSMarkerID(2000);
pGroup->AddX3dSolidRec(rec);
}
//设置坐标
ptOrg.z += -dHeight * 0.5;//恢复中心到底中心
ptOrg.z += m_dDownbyGr;//到顶部
pGroup->SetOrgPoint( ptOrg );
pGroup->SetAxis(X,AcGeVector3d::kXAxis);
pGroup->SetAxis(Y,AcGeVector3d::kYAxis);
pGroup->SetAxis(Z,AcGeVector3d::kZAxis);
//序列化BIM数据
pGroup->GetSpecialtyData()->SetAt(_T("m_dP1"),m_dP1);
pGroup->GetSpecialtyData()->SetAt(_T("m_dP2"),m_dP2);
pGroup->GetSpecialtyData()->SetAt(_T("m_dP3"),m_dP3);
pGroup->GetSpecialtyData()->SetAt(_T("m_dP4"),m_dP4);
pGroup->GetSpecialtyData()->SetAt(_T("m_b90Style"),m_b90Style);
pGroup->GetSpecialtyData()->SetAt(_T("m_dP4R"),m_dP4R);
pGroup->GetSpecialtyData()->SetAt(_T("m_dP5"),m_dP5);
pGroup->GetSpecialtyData()->SetAt(_T("m_dP6"),m_dP6);
pGroup->GetSpecialtyData()->SetAt(_T("m_dMinSize"),m_dMinSize);
pGroup->GetSpecialtyData()->SetAt(_T("m_nLayers"),m_nLayers);
pGroup->GetSpecialtyData()->SetAt(_T("m_dGr"),m_dGr);
pGroup->GetSpecialtyData()->SetAt(_T("m_dDownbyGr"),m_dDownbyGr);
pGroup->GetSpecialtyData()->SetAt(_T("m_dX"),m_dX);
pGroup->GetSpecialtyData()->SetAt(_T("nDir"),nDir);
pGroup->GetSpecialtyData()->SetAt(_T("dL"),dL);
pGroup->GetSpecialtyData()->SetAt(_T("m_dEWL"),m_dEWL);
pGroup->GetSpecialtyData()->SetAt(_T("m_bOnlyBrige"),m_bOnlyBrige);
pGroup->GetSpecialtyData()->SetAt(_T("m_sCrossSectionScr"),m_sCrossSectionScr);
return TRUE;
}
AcDbX3dSolid* CTJBZJCDlg::CreateEarthWormConeImp(const AcGePoint3d& ptCen,int nDir,double dW,double dLH,int nPos,double dLen)
{
AcGeVector3d vtZ = AcGeVector3d::kZAxis;
double dGr = m_dDownbyGr / dLen * 100.0;
double dAng = PI / 2.0 - atan(fabs(dGr * 0.01));
AcDbX3dSolid* pXSolid = new AcDbX3dSolid;
if (nPos == 0)//左边
{
vtZ = AcGeVector3d::kZAxis;
pXSolid->Create(AcDbX3dSolid::kWPyramid,ptCen,vtZ,5,dLH,dW,dLen,dAng,PI / 2.0);
if (nDir == 0)
{
pXSolid->AddRotate(-PI/2.0,Y);
}
else
{
pXSolid->AddRotate(-PI/2.0,X);
pXSolid->AddRotate(-PI/2.0,Y);
}
}
else//右边
{
vtZ = -AcGeVector3d::kZAxis;
pXSolid->Create(AcDbX3dSolid::kWPyramid,ptCen,vtZ,5,dLH,dW,dLen,PI / 2.0,dAng);
if (nDir == 0)
{
pXSolid->AddRotate(-PI/2.0,Y);
}
else
{
pXSolid->AddRotate(PI/2.0,X);
pXSolid->AddRotate(-PI/2.0,Y);
}
}
return pXSolid;
}
void CTJBZJCDlg::CreateEarthWormCone(AecDbX3dGroup* pGroup,const AcGePoint3d& ptCen,AcGeVector3d& vtDirX,AcGeVector3d& vtDirY,int nDir,double dW,double dLH,int nPos,double dLen,double dOutW,double dIntW,double dBomAdd,const AcGePoint2dArray& arDatas)
{
AcDbX3dSolid* pXSolid = CreateEarthWormConeImp(ptCen,nDir,dW,dLH,nPos,dLen);
if (pXSolid != NULL)
{
X3dSolidRec rec;
rec.pXSolid = pXSolid;
rec.bType = AcDb::kBoolUnite;
_tcscpy(rec.szLockId,IDCreate());
rec.pXSolid->SetGSMarkerID(2000);
pGroup->AddX3dSolidRec(rec);
}
double dGr = m_dDownbyGr / dLen * 100.0;
double dAng = atan(fabs(dGr * 0.01));
double dLHSub = dOutW + dOutW * tan(dAng) + dOutW / cos(dAng);
AcGePoint3d ptCen2 = ptCen;
dLH -= (dLHSub + dBomAdd );
dW -= 2.0 * dOutW;
dLen -= dOutW;
if (nPos == 0)//左边
{
ptCen2 -= vtDirX * dOutW;
}
else//右边
{
ptCen2 += vtDirX * dOutW;
}
pXSolid = CreateEarthWormConeImp(ptCen2,nDir,dW,dLH,nPos,dLen);
if (pXSolid != NULL)
{
X3dSolidRec rec;
rec.pXSolid = pXSolid;
rec.bType = AcDb::kBoolSubtract;
_tcscpy(rec.szLockId,IDCreate());
rec.pXSolid->SetGSMarkerID(2000);
pGroup->AddX3dSolidRec(rec);
}
//内部墙体
//总宽度
ptCen2 += vtDirY * 0.5 * dW;
double dRoomW = 0.0;
for (int i = 0;i < arDatas.length()-1;i++)
{
dRoomW = arDatas.at(i).x;
ptCen2 -= vtDirY * dRoomW;
ptCen2 -= vtDirY * 0.5 * dIntW;
pXSolid = CreateEarthWormConeImp(ptCen2,nDir,dIntW,dLH,nPos,dLen);
if (pXSolid != NULL)
{
X3dSolidRec rec;
rec.pXSolid = pXSolid;
rec.bType = AcDb::kBoolUnite;
_tcscpy(rec.szLockId,IDCreate());
rec.pXSolid->SetGSMarkerID(2000+i);
pGroup->AddX3dSolidRec(rec);
}
ptCen2 -= vtDirY * 0.5 * dIntW;
}
//打开纵向舱室门
ptCen2 = ptCen;
ptCen2 += vtDirY * 0.5 * dW;
ptCen2.z += 0.5 * m_dDownbyGr;
dLH += (dLHSub + dBomAdd );
dLH -= 2.0 * dOutW;
dLH -= dBomAdd;
ptCen2.z += dBomAdd;
double dRoomH = dLH;
dRoomH -= fabs(m_dDownbyGr);
if (nPos == 0)//左边
{
ptCen2 -= vtDirX * 0.5 * dOutW;
}
else//右边
{
ptCen2 += vtDirX * 0.5 * dOutW;
}
for (int i = 0;i < arDatas.length()-1;i++)
{
dRoomW = arDatas.at(i).x;
ptCen2 -= 0.5 * vtDirY * dRoomW;//室中心
pXSolid = new AcDbX3dSolid;
pXSolid->Create(AcDbX3dSolid::kBox,ptCen2,AcGeVector3d::kZAxis,3,dRoomW,dOutW,dRoomH);
if (nDir == 0)
{
pXSolid->AddRotate(-PI/2.0,Z);
}
X3dSolidRec rec;
rec.pXSolid = pXSolid;
rec.bType = AcDb::kBoolSubtract;
_tcscpy(rec.szLockId,IDCreate());
rec.pXSolid->SetGSMarkerID(2000+i);
pGroup->AddX3dSolidRec(rec);
ptCen2 -= 0.5 * vtDirY * dRoomW;//
ptCen2 -= vtDirY * dIntW;//到室内侧
}
}
BOOL CTJBZJCDlg::GetRainbowCurve(AcGePoint3dArray& arPts,int nDir)
{
//_T("RECT:3900x3600|2900x3600|400x300|EXT:...");//EXT为扩充字段
AecDbEarthWorm worm;
worm.SetCrossSectionScr(m_sCrossSectionScr);
worm.SetChamferInter(100.0);
AcGePoint3d pt1,pt2,pt3,pt4;
AcGePoint2dArray arDatas;
ESection eSecType = worm.ExtractEarthWormScr(arDatas);
double dWidth = 0.0,dHeight = 0.0;
//外壁厚,内隔壁厚
double dOutW = 0.0,dIntW = 0.0;
if (eSecType == eRect)
{
if (arDatas.length() > 0)
{
dOutW = arDatas.last().x;
dIntW = arDatas.last().y;
}
//总高度
dHeight = arDatas.first().y;
dHeight += 2 * arDatas.last().x;
//总宽度
for (int i = 0;i < arDatas.length()-1;i++)
{
dWidth += arDatas.at(i).x;
}
dWidth += (arDatas.length() - 2) * dIntW;
dWidth += dOutW * 2.0;
}
AcGeVector3d vtDirX = nDir == 0 ? AcGeVector3d::kXAxis : -AcGeVector3d::kYAxis;
AcGeVector3d vtDirY = nDir == 0 ? AcGeVector3d::kYAxis : AcGeVector3d::kXAxis;
AcGePoint3d ptGe[9],ptOrg;
//定位中心
if ( nDir == 0)
{
ptOrg.set(0,0,-dHeight * 0.5);
}
else
{
ptOrg.set(0,0.5 * m_dEWL,-dHeight * 0.5);
}
//主管廊开始底中心点
arPts.append(ptOrg);
//ptOrg.set(m_dX,0,-dHeight * 0.5);
ptOrg += m_dX * vtDirX;
arPts.append(ptOrg);
//ptOrg.x += m_dP4;
ptOrg += m_dP4 * vtDirX;
//ptOrg.x += m_dP5;
ptOrg += m_dP5 * vtDirX;
//ptOrg.x += 0.5 * m_dP1;//中心
ptOrg += 0.5 * m_dP1 * vtDirX;
if (m_bOnlyBrige)//倒虹结构
{
pt1 = ptOrg;
pt1 -= 0.5 * m_dP1 * vtDirX;
pt1.z += m_dDownbyGr;
arPts.append(pt1);
pt2 = ptOrg;
pt2 += 0.5 * m_dP1 * vtDirX;
pt2.z += m_dDownbyGr;
arPts.append(pt2);
pt3 = ptOrg;
pt3 += 0.5 * m_dP1 * vtDirX;
pt3 += m_dP4R * vtDirX;//m_dP4对称结构
arPts.append(pt3);
pt4 = arPts.first();
pt4 += m_dEWL * vtDirX;
arPts.append(pt4);
}
return m_bOnlyBrige;
}
int CTJBZJCDlg::GetX3dSolidRecsForYGL( AecDbX3dGroup*& pGroup)
{
GetX3dSolidRecs(pGroup,Y);
int nDir = 0;
double dL = 0.0;
AecDbObjXDataMap rcXDataMap;
rcXDataMap.SetAt(_T("m_dP1"),m_dP1);
rcXDataMap.SetAt(_T("m_dP2"),m_dP2);
rcXDataMap.SetAt(_T("m_dP3"),m_dP3);
rcXDataMap.SetAt(_T("m_dP4"),m_dP4);
rcXDataMap.SetAt(_T("m_dP4R"),m_dP4R);
rcXDataMap.SetAt(_T("m_b90Style"),m_b90Style);
rcXDataMap.SetAt(_T("m_dP5"),m_dP5);
rcXDataMap.SetAt(_T("m_dP6"),m_dP6);
rcXDataMap.SetAt(_T("m_dMinSize"),m_dMinSize);
rcXDataMap.SetAt(_T("m_nLayers"),m_nLayers);
rcXDataMap.SetAt(_T("m_dGr"),m_dGr);
rcXDataMap.SetAt(_T("m_dDownbyGr"),m_dDownbyGr);
rcXDataMap.SetAt(_T("m_dX"),m_dX);
rcXDataMap.SetAt(_T("nDir"),nDir);
rcXDataMap.SetAt(_T("dL"),dL);
rcXDataMap.SetAt(_T("m_dEWL"),m_dEWL);
rcXDataMap.SetAt(_T("m_bOnlyBrige"),m_bOnlyBrige);
rcXDataMap.SetAt(_T("m_sCrossSectionScr"),m_sCrossSectionScr);
pGroup->GetSpecialtyData()->SetAt(_T("CTJBZJCDlg"),0,rcXDataMap);
return 0;
}
void CTJBZJCDlg::SetReloadTJBZJC(AecDbObjXDataMap* pXDataMap)
{
m_pGLBJXDataMap = pXDataMap;
}
void CTJBZJCDlg::ReloadFromXDataMap()
{
if (m_pGLBJXDataMap != NULL)
{
AecDbObjXDataMap rcXDataMap;
m_pGLBJXDataMap->SetAt(_T("CTJBZJCDlg"),0,rcXDataMap);
int nDir = 0;
double dL = 0.0;
rcXDataMap.GetAt(_T("m_dP1"),m_dP1);
rcXDataMap.GetAt(_T("m_dP2"),m_dP2);
rcXDataMap.GetAt(_T("m_dP3"),m_dP3);
rcXDataMap.GetAt(_T("m_dP4"),m_dP4);
rcXDataMap.GetAt(_T("m_dP4R"),m_dP4R);
rcXDataMap.GetAt(_T("m_b90Style"),m_b90Style);
rcXDataMap.GetAt(_T("m_dP5"),m_dP5);
rcXDataMap.GetAt(_T("m_dP6"),m_dP6);
rcXDataMap.GetAt(_T("m_dMinSize"),m_dMinSize);
rcXDataMap.GetAt(_T("m_nLayers"),m_nLayers);
rcXDataMap.GetAt(_T("m_dGr"),m_dGr);
rcXDataMap.GetAt(_T("m_dDownbyGr"),m_dDownbyGr);
rcXDataMap.GetAt(_T("m_dX"),m_dX);
rcXDataMap.GetAt(_T("nDir"),nDir);
rcXDataMap.GetAt(_T("dL"),dL);
rcXDataMap.GetAt(_T("m_dEWL"),m_dEWL);
rcXDataMap.GetAt(_T("m_bOnlyBrige"),m_bOnlyBrige);
rcXDataMap.GetAt(_T("m_sCrossSectionScr"),m_sCrossSectionScr);
if (::IsWindow(m_hWnd))
UpdateData(FALSE);
}
}
void CTJBZJCDlg::OnEnChangeEdit14()
{
UpdateData();
//计算坡度
if (m_dP4 > 1.e-3)
{
m_dGr = m_dDownbyGr / m_dP4 * 100.0; //取百分比,如2.5%
UpdateData(FALSE);
}
}
void CTJBZJCDlg::OnEnChangeEdit9()
{
UpdateData();
m_dDownbyGr = m_dP4 * m_dGr / 100.0;
UpdateData(FALSE);
}
void CTJBZJCDlg::OnEnChangeEdit5()
{
UpdateData();
//计算坡度
if (m_dP4 > 1.e-3)
{
m_dGr = m_dDownbyGr / m_dP4 * 100.0;//取百分比,如2.5%
UpdateData(FALSE);
}
}