1029 lines
24 KiB
C++
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);
|
|
}
|
|
}
|