439 lines
10 KiB
C++
439 lines
10 KiB
C++
#include "stdafx.h"
|
|
#include "FUKKDlg.h"
|
|
#include "KTCADUtilityEx.h"
|
|
#include "AcDbX3dSolid.h"
|
|
#include "AecDbX3dPart.h"
|
|
#include "UITools.h"
|
|
#include "CCSYDlg.h"
|
|
#include "BimInfoDlg.h"
|
|
|
|
IMPLEMENT_DYNAMIC(CFUKKDlg, CDialog)
|
|
|
|
CFUKKDlg::CFUKKDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CFUKKDlg::IDD, pParent)
|
|
, m_dL(3.0)
|
|
, m_dW(3.0)
|
|
, m_dX(2.0)
|
|
, m_dY(1)
|
|
, m_dZ(3.0)
|
|
, m_nShape(0)
|
|
, m_nDir(0)
|
|
, m_dT(0.4)
|
|
, m_nH(1)
|
|
, m_nV(1)
|
|
, m_dHSpace(0.5)
|
|
, m_dVSpace(0.5)
|
|
, m_bAddHoleCase(TRUE)
|
|
, m_sMaterial(_T("PVC套管"))
|
|
, m_dXX(3.1)
|
|
, m_dYY(3.1)
|
|
, m_dtt(0.1)
|
|
, m_dZZ(0.1)
|
|
, m_bAddHoop(FALSE)
|
|
{
|
|
UIDataCache::Read(_T("%d%d%d%d%d%i%i%d%i%i%i%i"), _T("CFUKKDlg")
|
|
, &m_dL , &m_dW , &m_dX , &m_dY , &m_dZ
|
|
, &m_nShape , &m_nDir
|
|
, &m_dT,&m_nH,&m_nV,&m_dHSpace,&m_dVSpace);
|
|
m_sPoints = _T("");
|
|
m_sPointsIn = _T("");
|
|
|
|
m_dXX = m_dL + 0.1;
|
|
m_dYY = m_dW + 0.1;
|
|
}
|
|
|
|
CFUKKDlg::~CFUKKDlg()
|
|
{
|
|
}
|
|
|
|
void CFUKKDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
DDX_Text(pDX, IDC_EDIT1, m_dL);
|
|
DDX_Text(pDX, IDC_EDIT3, m_dW);
|
|
DDX_Text(pDX, IDC_EDIT4, m_dX);
|
|
DDX_Text(pDX, IDC_EDIT5, m_dY);
|
|
DDX_Text(pDX, IDC_EDIT6, m_dZ);
|
|
DDX_Radio(pDX, IDC_RADIO1, m_nShape);
|
|
DDX_Radio(pDX, IDC_RADIO2, m_nDir);
|
|
DDX_Text(pDX, IDC_EDIT7, m_dT);
|
|
DDX_Text(pDX, IDC_EDIT8, m_nH);
|
|
DDX_Text(pDX, IDC_EDIT9, m_nV);
|
|
DDX_Text(pDX, IDC_EDIT16, m_dHSpace);
|
|
DDX_Text(pDX, IDC_EDIT17, m_dVSpace);
|
|
DDX_Check(pDX, IDC_CHECK3, m_bAddHoleCase);
|
|
DDX_Text(pDX, IDC_EDIT2, m_sMaterial);
|
|
DDX_Text(pDX, IDC_EDIT21, m_dXX);
|
|
DDX_Text(pDX, IDC_EDIT22, m_dYY);
|
|
DDX_Text(pDX, IDC_EDIT25, m_dtt);
|
|
DDX_Text(pDX, IDC_EDIT23, m_dZZ);
|
|
DDX_Check(pDX, IDC_CHECK4, m_bAddHoop);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CFUKKDlg, CDialog)
|
|
ON_BN_CLICKED(IDOK, &CFUKKDlg::OnBnClickedOk)
|
|
ON_BN_CLICKED(IDC_BUTTON75, &CFUKKDlg::OnBnClickedButton75)
|
|
ON_BN_CLICKED(IDC_BUTTON4, &CFUKKDlg::OnBnClickedButton4)
|
|
ON_BN_CLICKED(IDC_BUTTON2, &CFUKKDlg::OnBnClickedButton2)
|
|
END_MESSAGE_MAP()
|
|
|
|
BOOL CFUKKDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
UpdateData(FALSE);
|
|
|
|
CBimInfoDlg::SetDefaultBimInfo(&m_mapBimData,_T("套管"));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CFUKKDlg::OnBnClickedOk()
|
|
{
|
|
UpdateData();
|
|
|
|
if (m_dL < 1.e-3 || m_dW < 1.e-3 )
|
|
{
|
|
AfxMessageBox(_T("开孔尺寸太小!请重新输入参数!"));
|
|
return;
|
|
}
|
|
|
|
if (m_nH < 0)
|
|
{
|
|
AfxMessageBox(_T("水平方向开孔数量至少为一个!"));
|
|
return;
|
|
}
|
|
|
|
if (m_nV < 0)
|
|
{
|
|
AfxMessageBox(_T("垂直方向开孔数量至少为一个!"));
|
|
return;
|
|
}
|
|
|
|
if (m_dHSpace - m_dL < 1.e-3 && m_nH > 1)
|
|
{
|
|
AfxMessageBox(_T("水平间距尺寸必须大于开口长度尺寸或直径!"));
|
|
return;
|
|
}
|
|
|
|
if (m_dVSpace - m_dL < 1.e-3 && m_nV > 1)
|
|
{
|
|
AfxMessageBox(_T("垂直间距尺寸必须大于开口长度尺寸或直径!"));
|
|
return;
|
|
}
|
|
|
|
if (m_bAddHoop)
|
|
{
|
|
if (m_dXX - m_dL < -1.e-6)
|
|
{
|
|
AfxMessageBox(_T("矩形孔加环扣结构长小于洞口L1!请重新输入尺寸!"));
|
|
return;
|
|
}
|
|
if (m_dYY - m_dW < -1.e-6)
|
|
{
|
|
AfxMessageBox(_T("矩形孔加环扣结构宽小于洞口W1!请重新输入尺寸!"));
|
|
return;
|
|
}
|
|
|
|
if (m_dtt < 1.e-3 || m_dZZ < 1.e-3)
|
|
{
|
|
AfxMessageBox(_T("环扣结构垛宽或高度尺寸不合理!请重新输入尺寸!"));
|
|
return;
|
|
}
|
|
}
|
|
|
|
UIDataCache::Write(_T("%d%d%d%d%d%i%i%d%i%i%i%i"), _T("CFUKKDlg")
|
|
, &m_dL , &m_dW , &m_dX , &m_dY , &m_dZ
|
|
, &m_nShape , &m_nDir
|
|
, &m_dT,&m_nH,&m_nV,&m_dHSpace,&m_dVSpace);
|
|
|
|
OnOK();
|
|
}
|
|
|
|
int CFUKKDlg::GetX3dPart(AecDbX3dPart*& pPart)
|
|
{
|
|
if (pPart != NULL)
|
|
{
|
|
pPart->RemoveAll3dSolidRec();
|
|
}
|
|
else
|
|
{
|
|
pPart = new AecDbX3dPart;
|
|
}
|
|
|
|
AcGePoint3d ptOrg,ptNewOrg;
|
|
ptOrg.set(m_dX,m_dY,m_dZ);
|
|
|
|
AcGeVector3d vtZ = AcGeVector3d::kZAxis;
|
|
AcGeVector3d vtStep = AcGeVector3d::kZAxis;
|
|
if (m_nDir > 0)//板开
|
|
{
|
|
vtStep = AcGeVector3d::kYAxis;
|
|
}
|
|
|
|
AcDbX3dSolid* pXSolid = NULL;
|
|
|
|
if (!m_sPoints.IsEmpty() && !m_sPointsIn.IsEmpty())
|
|
{
|
|
if (m_nDir == 0)//墙开
|
|
{
|
|
vtZ = AcGeVector3d::kYAxis;
|
|
}
|
|
|
|
if (m_bAddHoleCase)
|
|
{
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->CreateExtrude(ptOrg,vtZ,m_sPoints,m_dT,0.0);
|
|
pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite,true);
|
|
}
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->CreateExtrude(ptOrg,vtZ,m_sPointsIn,m_dT + 0.01,0.0);//放大一点
|
|
pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true);
|
|
}
|
|
else
|
|
{
|
|
AcGePoint3d ptOrgHoop;
|
|
for (int i = 0;i < m_nH;i++)
|
|
{
|
|
ptNewOrg = ptOrg + i * AcGeVector3d::kXAxis * m_dHSpace;
|
|
|
|
for (int j = 0;j < m_nV;j++)
|
|
{
|
|
if (m_nShape == 0)//方
|
|
{
|
|
//L,W,t,H 长宽,厚度
|
|
|
|
if (m_nDir == 0)//墙开
|
|
{
|
|
vtZ = AcGeVector3d::kYAxis;
|
|
}
|
|
|
|
//套管
|
|
if (m_bAddHoleCase)
|
|
{
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kRectTube,ptNewOrg,vtZ,4,m_dL+0.04,m_dW+0.04,0.02,m_dT);
|
|
pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite,true);
|
|
}
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kBox,ptNewOrg,vtZ,3,m_dL,m_dW,m_dT);
|
|
pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true);
|
|
|
|
if (m_bAddHoop)
|
|
{
|
|
vtZ.normalize();
|
|
ptOrgHoop = ptNewOrg;
|
|
ptOrgHoop += vtZ * 0.5 * m_dT;
|
|
ptOrgHoop += vtZ * 0.5 * m_dZZ;
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kBox,ptOrgHoop,vtZ,3,m_dXX + 2.0 * m_dtt,m_dYY + 2.0 * m_dtt,m_dZZ);
|
|
pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite,true);
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kBox,ptOrgHoop,vtZ,3,m_dXX,m_dYY,m_dZZ);
|
|
pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true);
|
|
}
|
|
|
|
}
|
|
else//园
|
|
{
|
|
if (m_nDir == 0)//墙开
|
|
{
|
|
vtZ = AcGeVector3d::kYAxis;
|
|
}
|
|
|
|
//rxtxH
|
|
if (m_bAddHoleCase)
|
|
{
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kPipe,ptNewOrg,vtZ,3,m_dL / 2.0 + 0.04,0.02,m_dT);//壁厚20
|
|
pPart->AddX3dSolid(pXSolid,AcDb::kBoolUnite,true);
|
|
}
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
pXSolid->Create(AcDbX3dSolid::kCylinder,ptNewOrg,vtZ,2,m_dL * 0.5,m_dT);
|
|
pPart->AddX3dSolid(pXSolid,AcDb::kBoolSubtract,true);
|
|
}
|
|
|
|
ptNewOrg += vtStep * m_dVSpace;
|
|
}
|
|
}
|
|
}
|
|
|
|
pPart->SetOrgPoint( ptOrg );
|
|
pPart->SetAxis(X,AcGeVector3d::kXAxis);
|
|
pPart->SetAxis(Y,AcGeVector3d::kYAxis);
|
|
pPart->SetAxis(Z,AcGeVector3d::kZAxis);
|
|
|
|
//序列化BIM数据
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_dL"),m_dL);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_dW"),m_dW);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_dT"),m_dT);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_dX"),m_dX);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_dY"),m_dY);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_dZ"),m_dZ);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_nDir"),m_nDir);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_dDn"),AS_M2MM(m_dL));
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_nH"),m_nH);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_nV"),m_nV);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_dHSpace"),m_dHSpace);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_dVSpace"),m_dVSpace);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_bAddHoleCase"),m_bAddHoleCase);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_nShape"),m_nShape);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_sMaterial"),m_sMaterial);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_sPoints"),m_sPoints);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_sPointsIn"),m_sPointsIn);
|
|
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_bAddHoop"),m_bAddHoop);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_dXX"),m_dXX);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_dYY"),m_dYY);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_dZZ"),m_dZZ);
|
|
pPart->GetSpecialtyData()->SetAt(_T("m_dtt"),m_dtt);
|
|
pPart->GetSpecialtyData()->SetAt(_T("BIMDATA"),1,m_mapBimData);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CFUKKDlg::OnBnClickedButton75()
|
|
{
|
|
UpdateData();
|
|
|
|
m_sPoints = _T("");
|
|
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请选择闭合pline线:"),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);
|
|
|
|
AcGeVector2d vtMove = ptSta.asVector();
|
|
vtMove.negate();
|
|
|
|
m_sPoints = _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);
|
|
|
|
pt2d += vtMove;
|
|
|
|
//if (arPt2ds.find(pt2d) == -1)
|
|
{
|
|
arPt2ds.append(pt2d);
|
|
|
|
sText.Format(_T("%g,%g@%g,"),pt2d.x,pt2d.y,dBulge);
|
|
m_sPoints += sText;
|
|
}
|
|
}
|
|
|
|
if ( arPt2ds.last().distanceTo(arPt2ds.first()) > 1.e-2)
|
|
{
|
|
pt2d = arPt2ds.first();
|
|
sText.Format(_T("%g,%g@0.0,"),pt2d.x,pt2d.y);
|
|
m_sPoints += sText;
|
|
}
|
|
m_sPoints.TrimRight(_T(","));
|
|
|
|
|
|
AcDbVoidPtrArray arOffPtrs,arOffPtrs2;
|
|
pPl->getOffsetCurves(0.01,arOffPtrs);
|
|
pPl->getOffsetCurves(-0.01,arOffPtrs2);
|
|
|
|
if (arOffPtrs.length() == 1 && arOffPtrs2.length() == 1)
|
|
{
|
|
AcDbEntity* pEntt = (AcDbEntity*)arOffPtrs.at(0);
|
|
AcDbPolyline* pPl2 = AcDbPolyline::cast(pEntt);
|
|
|
|
AcDbEntity* pEntt2 = (AcDbEntity*)arOffPtrs2.at(0);
|
|
AcDbPolyline* pPl22 = AcDbPolyline::cast(pEntt2);
|
|
|
|
if (pPl2 != NULL && pPl22 != NULL)
|
|
{
|
|
double dArea1 = 0.0,dArea2 = 0.0;
|
|
pPl2->getArea(dArea1);
|
|
pPl22->getArea(dArea2);
|
|
|
|
AcDbPolyline* pPlMin = ( fabs(dArea2) - fabs(dArea1) ) < 1.e-10 ? pPl22 : pPl2;
|
|
arPt2ds.removeAll();
|
|
|
|
for (int i = 0;i < pPlMin->numVerts();i++)
|
|
{
|
|
pPlMin->getPointAt(i,pt2d);
|
|
pPlMin->getBulgeAt(i,dBulge);
|
|
|
|
pt2d += vtMove;
|
|
|
|
//if (arPt2ds.find(pt2d) == -1)
|
|
{
|
|
arPt2ds.append(pt2d);
|
|
|
|
sText.Format(_T("%g,%g@%g,"),pt2d.x,pt2d.y,dBulge);
|
|
m_sPointsIn += sText;
|
|
}
|
|
}
|
|
|
|
if ( arPt2ds.last().distanceTo(arPt2ds.first()) > 1.e-2)
|
|
{
|
|
pt2d = arPt2ds.first();
|
|
sText.Format(_T("%g,%g@0.0,"),pt2d.x,pt2d.y);
|
|
m_sPointsIn += sText;
|
|
}
|
|
m_sPointsIn.TrimRight(_T(","));
|
|
|
|
DELETE_PTR(pPl2);
|
|
DELETE_PTR(pPl22);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
acutPrintf(_T("\n选择的实体不是pline线实体!"));
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
|
|
pFrame->EnableWindow(FALSE);
|
|
ShowWindow(SW_SHOW);
|
|
EnableWindow(TRUE);
|
|
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
void CFUKKDlg::OnBnClickedButton4()
|
|
{
|
|
//尺寸示意图
|
|
CCCSYDlg dlg;
|
|
dlg.SetBmpFileName(_T("HOLEHOOP.bmp"));
|
|
dlg.DoModal();
|
|
}
|
|
|
|
void CFUKKDlg::OnBnClickedButton2()
|
|
{
|
|
CBimInfoDlg::ShowBimInfo(&m_mapBimData,_T("套管"));
|
|
}
|