244 lines
4.7 KiB
C++
244 lines
4.7 KiB
C++
#include "stdafx.h"
|
|
#include "TJKCDlg.h"
|
|
#include "AecDbX3dGroup.h"
|
|
#include "AecDbX3dPart.h"
|
|
#include "AecDbObjXDataMap.h"
|
|
|
|
extern CString IDCreate();
|
|
|
|
IMPLEMENT_DYNAMIC(CTJKCDlg, CDialog)
|
|
|
|
CTJKCDlg::CTJKCDlg(CWnd* pParent /*=NULL*/)
|
|
: CDialog(CTJKCDlg::IDD, pParent)
|
|
, m_dL(20)
|
|
, m_dW(20)
|
|
, m_dT(0.5)
|
|
, m_sPoints(_T(""))
|
|
{
|
|
}
|
|
|
|
CTJKCDlg::~CTJKCDlg()
|
|
{
|
|
}
|
|
|
|
void CTJKCDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
DDX_Text(pDX, IDC_EDIT1, m_dL);
|
|
DDX_Text(pDX, IDC_EDIT2, m_dW);
|
|
DDX_Text(pDX, IDC_EDIT3, m_dT);
|
|
DDX_Text(pDX, IDC_EDIT4, m_sPoints);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CTJKCDlg, CDialog)
|
|
ON_BN_CLICKED(IDC_BUTTON1, &CTJKCDlg::OnBnClickedButton1)
|
|
ON_BN_CLICKED(IDOK, &CTJKCDlg::OnBnClickedOk)
|
|
END_MESSAGE_MAP()
|
|
|
|
BOOL CTJKCDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
UpdateData(FALSE);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CTJKCDlg::OnBnClickedButton1()
|
|
{
|
|
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(","));
|
|
}
|
|
else
|
|
{
|
|
acutPrintf(_T("\n选择的实体不是pline线实体!"));
|
|
}
|
|
pEnt->close();
|
|
}
|
|
}
|
|
|
|
pFrame->EnableWindow(FALSE);
|
|
ShowWindow(SW_SHOW);
|
|
EnableWindow(TRUE);
|
|
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
void CTJKCDlg::OnBnClickedOk()
|
|
{
|
|
UpdateData();
|
|
|
|
if (m_sPoints.IsEmpty())
|
|
{
|
|
if (m_dL < 1.e-1 || m_dW < 1.e-1 || m_dT < 1.e-1)
|
|
{
|
|
AfxMessageBox(_T("开窗长宽深度数据尺寸太小!"));
|
|
return;
|
|
}
|
|
|
|
AcGePoint3d ptGe[5];
|
|
|
|
ptGe[0].set(0,0,0);
|
|
ptGe[1].set(m_dL,0,0);
|
|
ptGe[2].set(m_dL,m_dW,0);
|
|
ptGe[3].set(0,m_dW,0);
|
|
ptGe[4] = ptGe[0];
|
|
|
|
CString sText;
|
|
for (int i = 0;i < 5;i++)
|
|
{
|
|
sText.Format(_T("%g,%g@%g,"),ptGe[i].x,ptGe[i].y,0.0);
|
|
m_sPoints += sText;
|
|
}
|
|
m_sPoints.TrimRight(_T(","));
|
|
}
|
|
|
|
UpdateData(FALSE);
|
|
|
|
OnOK();
|
|
}
|
|
|
|
int CTJKCDlg::GetX3dPart(AecDbX3dPart*& pGroup)
|
|
{
|
|
if (pGroup != NULL)
|
|
{
|
|
pGroup->RemoveAll3dSolidRec();
|
|
}
|
|
else
|
|
{
|
|
pGroup = new AecDbX3dPart;
|
|
}
|
|
|
|
AcGePoint3d ptOrg;
|
|
ptOrg.set(0,0,0);
|
|
|
|
AcGeVector3d vtZ = AcGeVector3d::kZAxis;
|
|
AcDbX3dSolid* pXSolid = NULL;
|
|
|
|
pXSolid = new AcDbX3dSolid;
|
|
if (!m_sPoints.IsEmpty())
|
|
{
|
|
pXSolid->CreateExtrude(ptOrg,vtZ,m_sPoints,m_dT,0.0);
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
pGroup->AddX3dSolid(pXSolid,AcDb::kBoolUnite);
|
|
|
|
pGroup->SetOrgPoint( ptOrg );
|
|
pGroup->SetAxis(X,AcGeVector3d::kXAxis);
|
|
pGroup->SetAxis(Y,AcGeVector3d::kYAxis);
|
|
pGroup->SetAxis(Z,AcGeVector3d::kZAxis);
|
|
|
|
//序列化BIM数据
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_dL"),m_dL);
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_dW"),m_dW);
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_dT"),m_dT);
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_sPoints"),m_sPoints);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
int CTJKCDlg::GetX3dSolidRecs(AecDbX3dGroup*& pGroup)
|
|
{
|
|
if (pGroup != NULL)
|
|
{
|
|
pGroup->RemoveAll3dSolidRec();
|
|
}
|
|
else
|
|
{
|
|
pGroup = new AecDbX3dGroup;
|
|
}
|
|
|
|
AcGePoint3d ptOrg;
|
|
ptOrg.set(0,0,0);
|
|
|
|
AcGeVector3d vtZ = AcGeVector3d::kZAxis;
|
|
AcDbX3dSolid* pXSolid = NULL;
|
|
|
|
X3dSolidRec rec;
|
|
pXSolid = new AcDbX3dSolid;
|
|
if (!m_sPoints.IsEmpty())
|
|
{
|
|
pXSolid->CreateExtrude(ptOrg,vtZ,m_sPoints,m_dT,0.0);
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
rec.pXSolid = pXSolid;
|
|
rec.bType = AcDb::kBoolUnite;
|
|
_tcscpy(rec.szLockId,IDCreate());
|
|
pGroup->AddX3dSolidRec(rec);
|
|
|
|
pGroup->SetOrgPoint( ptOrg );
|
|
pGroup->SetAxis(X,AcGeVector3d::kXAxis);
|
|
pGroup->SetAxis(Y,AcGeVector3d::kYAxis);
|
|
pGroup->SetAxis(Z,AcGeVector3d::kZAxis);
|
|
|
|
//序列化BIM数据
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_dL"),m_dL);
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_dW"),m_dW);
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_dT"),m_dT);
|
|
pGroup->GetSpecialtyData()->SetAt(_T("m_sPoints"),m_sPoints);
|
|
|
|
return TRUE;
|
|
} |