756 lines
20 KiB
C++
756 lines
20 KiB
C++
// DarwBalconyDlg.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "DrawBalconyDlg.h"
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
////////////////////////////////////////////////////////////////////////////
|
|
//extern GEOAPI int FindNearestEdge(const XPoly2D &poly, const XPoint &ptEdge);
|
|
extern TARCH_IMPEXP int GetOpenPoly2D(const TCHAR *pMsg, XPoly2D &poly2d, Entity &entRet);
|
|
extern int SearchBalcony(XPoly2D &polyBalc, XPoly2D &polyWall, XPoly2D &polyOutline);
|
|
static int CompareInt(const int *p1, const void *p2)
|
|
{
|
|
if (*p1==*(const int *)p2)
|
|
return 0;
|
|
return 1;
|
|
}
|
|
extern void MakeWallSet(PickSet &ssWalls);
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CDarwBalconyDlg dialog
|
|
////CString CDarwBalconyDlg::m_Lenth=_T("1500");
|
|
////CString CDarwBalconyDlg::m_Railwidth = _T("100");
|
|
////CString CDarwBalconyDlg::m_Railheight = _T("1000");
|
|
////CString CDarwBalconyDlg::m_Elev = _T("-100.0");
|
|
////CString CDarwBalconyDlg::m_Slabthick = _T("100");
|
|
////CString CDarwBalconyDlg::m_Girderthick = _T("100");
|
|
double CDarwBalconyDlg::m_Lenth=1500.0;
|
|
double CDarwBalconyDlg::m_Railwidth = 100.0;
|
|
double CDarwBalconyDlg::m_Railheight = 1000.0;
|
|
double CDarwBalconyDlg::m_Elev = -100.0;
|
|
double CDarwBalconyDlg::m_Slabthick = 100.0;
|
|
double CDarwBalconyDlg::m_Girderthick =100.0;
|
|
BOOL CDarwBalconyDlg::m_bhasGirder = FALSE;
|
|
int CDarwBalconyDlg::m_nSide=OFFSET_LEFT;
|
|
int CDarwBalconyDlg::g_nBalPath=1;
|
|
BOOL SearchWallSide(XPoint ptStart,XPoint ptEnd,//世界坐标系下点
|
|
PickSet &ssWalls,//传入用户选的墙,不能有柱子
|
|
XPoly2D &polyWall);//返回沿墙poly
|
|
/////////////////////////////////////////////////////////
|
|
// [11/15/2007 nsh]
|
|
//临时变量
|
|
static double tLenth=1500.0;
|
|
static double tRailwidth=100.0;
|
|
static double tRailheight=1000.0;
|
|
static double tElev=-100.0;
|
|
static double tSlabthick=100.0;
|
|
static double tGirderthick=100.0;
|
|
//-----------------------------------
|
|
IMPLEMENT_DYNAMIC(CDarwBalconyDlg,CModelessDialog)
|
|
|
|
CDarwBalconyDlg::CDarwBalconyDlg(CWnd* pParent /*=NULL*/)
|
|
: CModelessDialog(CDarwBalconyDlg::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(CDarwBalconyDlg)
|
|
|
|
//}}AFX_DATA_INIT
|
|
m_bUseEsc=TRUE;
|
|
|
|
tbButtm[0].tbID = ID_BUTTON_DENT;
|
|
tbButtm[0].BitmapID = 0;
|
|
tbButtm[0].Style = TBSTYLE_CHECKGROUP;
|
|
|
|
tbButtm[1].tbID = ID_BUTTON_RECT2;
|
|
tbButtm[1].BitmapID = 1;
|
|
tbButtm[1].Style = TBSTYLE_CHECKGROUP;
|
|
|
|
tbButtm[2].tbID = ID_BUTTON_CONCAVE;
|
|
tbButtm[2].BitmapID = 2;
|
|
tbButtm[2].Style = TBSTYLE_CHECKGROUP;
|
|
|
|
tbButtm[3].tbID = ID_BUTTON_EXTEND;
|
|
tbButtm[3].BitmapID = 3;
|
|
tbButtm[3].Style = TBSTYLE_CHECKGROUP;
|
|
|
|
tbButtm[4].tbID = ID_BUTTON_ARBITRARY;
|
|
tbButtm[4].BitmapID = 4;
|
|
tbButtm[4].Style = TBSTYLE_CHECKGROUP;
|
|
|
|
tbButtm[5].tbID = ID_BUTTON_SELECT;
|
|
tbButtm[5].BitmapID = 5;
|
|
tbButtm[5].Style = TBSTYLE_CHECKGROUP;
|
|
|
|
// [11/15/2007 nsh]-----------------------------
|
|
m_Lenth=_AS_SYS_UNIT(tLenth);
|
|
m_Railwidth = _AS_SYS_UNIT(tRailwidth);
|
|
m_Railheight = _AS_SYS_UNIT(tRailheight);
|
|
m_Elev = _AS_SYS_UNIT(tElev);
|
|
m_Slabthick = _AS_SYS_UNIT(tSlabthick);
|
|
m_Girderthick =_AS_SYS_UNIT(tGirderthick);
|
|
|
|
//-----------------------------------------------
|
|
}
|
|
// [11/15/2007 nsh]
|
|
CDarwBalconyDlg::~CDarwBalconyDlg()
|
|
{
|
|
tLenth =_AS_MM(m_Lenth);
|
|
tRailwidth=_AS_MM(m_Railwidth);
|
|
tRailheight=_AS_MM(m_Railheight);
|
|
tElev=_AS_MM(m_Elev);
|
|
tSlabthick=_AS_MM(m_Slabthick);
|
|
tGirderthick=_AS_MM(m_Girderthick);
|
|
}
|
|
//----------------------------------------
|
|
void CDarwBalconyDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CModelessDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CDarwBalconyDlg)
|
|
DDX_Text(pDX, IDC_LENTH, m_Lenth);
|
|
DDX_Text(pDX, IDC_RAILWIDTH, m_Railwidth);
|
|
DDX_Text(pDX, IDC_RAILHEIGHT, m_Railheight);
|
|
DDX_Text(pDX, IDC_ELEV, m_Elev);
|
|
DDX_Text(pDX, IDC_SLABTHICK, m_Slabthick);
|
|
DDX_Text(pDX, IDC_GIRDERTHICK, m_Girderthick);
|
|
DDX_Check(pDX, IDC_CHECK_GIRDER, m_bhasGirder);
|
|
//}}AFX_DATA_MAP
|
|
|
|
if (!pDX->m_bSaveAndValidate)
|
|
{
|
|
m_toolbar.CheckButton(ID_BUTTON_DENT,g_nBalPath==0);
|
|
m_toolbar.CheckButton(ID_BUTTON_RECT2, g_nBalPath==1);
|
|
m_toolbar.CheckButton(ID_BUTTON_CONCAVE, g_nBalPath==2);
|
|
m_toolbar.CheckButton(ID_BUTTON_EXTEND, g_nBalPath==3);
|
|
m_toolbar.CheckButton(ID_BUTTON_ARBITRARY, g_nBalPath==4);
|
|
m_toolbar.CheckButton(ID_BUTTON_SELECT,g_nBalPath==5);
|
|
}
|
|
(GetDlgItem(IDC_LENTH))->EnableWindow(g_nBalPath==0||g_nBalPath==1||g_nBalPath==2||g_nBalPath==3);
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CDarwBalconyDlg, CModelessDialog)
|
|
//{{AFX_MSG_MAP(CDarwBalconyDlg)
|
|
ON_EN_SETFOCUS(IDC_RAILWIDTH, OnSetfocusRailwidth)
|
|
ON_EN_SETFOCUS(IDC_RAILHEIGHT, OnSetfocusRailheight)
|
|
ON_EN_SETFOCUS(IDC_GIRDERTHICK, OnSetfocusGirderthick)
|
|
ON_EN_SETFOCUS(IDC_ELEV, OnSetfocusElev)
|
|
ON_BN_CLICKED(IDC_CHECK_GIRDER, OnCheckGirder)
|
|
ON_EN_SETFOCUS(IDC_SLABTHICK, OnSetfocusSlabthick)
|
|
ON_EN_SETFOCUS(IDC_LENTH,OnSetfocusLength)// [12/11/2007 nsh]
|
|
ON_WM_PAINT()
|
|
ON_WM_CLOSE()
|
|
ON_COMMAND(ID_BUTTON_DENT,OnCommandDent)
|
|
ON_COMMAND(ID_BUTTON_RECT2,OnCommandRect)
|
|
ON_COMMAND(ID_BUTTON_CONCAVE,OnCommandConcave)
|
|
ON_COMMAND(ID_BUTTON_EXTEND,OnCommandExtend)
|
|
ON_COMMAND(ID_BUTTON_ARBITRARY,OnCommandArbitrary)
|
|
ON_COMMAND(ID_BUTTON_SELECT,OnCommandSelect)
|
|
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)
|
|
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)
|
|
|
|
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CDarwBalconyDlg message handlers
|
|
|
|
|
|
BOOL CDarwBalconyDlg::OnInitDialog()
|
|
{
|
|
CModelessDialog::OnInitDialog();
|
|
|
|
// TODO: Add extra initialization here
|
|
CWnd *pWnd =GetDlgItem(IDC_GIRDERTHICK);
|
|
pWnd->EnableWindow(m_bhasGirder);
|
|
(GetDlgItem(IDC_LENTH))->EnableWindow(FALSE);
|
|
OpenSlide(_T("TArch(BalWidth)"));
|
|
CAcModuleResourceOverride vTmp;
|
|
m_toolbar.Create( WS_VISIBLE | WS_CHILD |CCS_BOTTOM| TBSTYLE_TOOLTIPS
|
|
| CCS_ADJUSTABLE ,CRect(0,0,0,0),this, IDR_TOOLBAR_BALCONY1);
|
|
|
|
TBBUTTON *pIndex, *pRTF_Button = new TBBUTTON[6];
|
|
pIndex = pRTF_Button;
|
|
for(long lIndex = 0; lIndex < 6; lIndex++)
|
|
{
|
|
memset(pIndex ,NULL, sizeof(TBBUTTON));
|
|
pIndex->iBitmap= tbButtm[lIndex].BitmapID;
|
|
pIndex->idCommand = tbButtm[lIndex].tbID;
|
|
pIndex->fsStyle = tbButtm[lIndex].Style;
|
|
pIndex->fsState = TBSTATE_ENABLED;
|
|
pIndex++;
|
|
}
|
|
CSize size(16, 15);
|
|
m_toolbar.SetButtonSize(size);
|
|
m_toolbar.AddButtons(6, pRTF_Button);
|
|
delete[] pRTF_Button;
|
|
m_toolbar.SetBitmapSize(size);
|
|
m_toolbar.ModifyStyle(0,TBSTYLE_FLAT);
|
|
m_toolbar.AddBitmap(4, IDR_TOOLBAR_BALCONY1);
|
|
m_toolbar.AutoSize();
|
|
m_wndToolTip.Create(this);
|
|
m_wndToolTip.Activate(true);
|
|
UpdateData(FALSE);
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
void CDarwBalconyDlg::OnClose()
|
|
{
|
|
acedPostCommand(_T("\33"));
|
|
}
|
|
void CDarwBalconyDlg::OpenSlide(XString strFilePath)
|
|
{
|
|
CWnd *pImageBox=GetDlgItem(IDC_SLIDE);
|
|
if (pImageBox)
|
|
{
|
|
CDC *pDC=pImageBox->GetDC();
|
|
CRect rc;
|
|
pImageBox->GetClientRect(&rc);
|
|
m_slideDc.InitDC(pDC, rc, GetAcadBackColor());
|
|
|
|
m_slideDc.PaintSlide(strFilePath);
|
|
m_slideDc.SetDC(NULL);
|
|
pImageBox->ReleaseDC(pDC);
|
|
}
|
|
}
|
|
|
|
void CDarwBalconyDlg::OnSetfocusRailwidth()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
OpenSlide(_T("TArch(BalWidth)"));
|
|
}
|
|
// [12/12/2007 nsh]
|
|
//------------------begin-------------------
|
|
void CDarwBalconyDlg::OnSetfocusLength()
|
|
{
|
|
OpenSlide(_T("TArch(BALength)"));
|
|
}
|
|
//-------------------end--------------------
|
|
void CDarwBalconyDlg::OnSetfocusRailheight()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
OpenSlide(_T("TArch(BalHeight)"));
|
|
}
|
|
|
|
void CDarwBalconyDlg::OnSetfocusGirderthick()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
OpenSlide(_T("TArch(BalGirder)"));
|
|
}
|
|
|
|
void CDarwBalconyDlg::OnSetfocusElev()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
OpenSlide(_T("TArch(BalElev)"));
|
|
}
|
|
|
|
void CDarwBalconyDlg::OnCheckGirder()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
m_bhasGirder = !m_bhasGirder;
|
|
CWnd *pWnd =GetDlgItem(IDC_GIRDERTHICK);
|
|
|
|
if (m_bhasGirder)
|
|
pWnd->EnableWindow(true);
|
|
else
|
|
pWnd->EnableWindow(false);
|
|
OpenSlide(_T("TArch(BalGirder)"));
|
|
}
|
|
|
|
void CDarwBalconyDlg::OnSetfocusSlabthick()
|
|
{
|
|
// TODO: Add your control notification handler code here
|
|
OpenSlide(_T("TArch(BalSlab)"));
|
|
}
|
|
|
|
void CDarwBalconyDlg::OnPaint()
|
|
{
|
|
CPaintDC dc(this); // device context for painting
|
|
|
|
// TODO: Add your message handler code here
|
|
CRect rcClip, rcImage;
|
|
dc.GetClipBox(&rcClip);
|
|
CWnd *pImageBox=GetDlgItem(IDC_SLIDE);
|
|
if (pImageBox)
|
|
{
|
|
pImageBox->GetWindowRect(&rcImage);
|
|
ScreenToClient(&rcImage);
|
|
if (!rcImage.IntersectRect(&rcImage, &rcClip))
|
|
return;
|
|
CDC *pDC=pImageBox->GetDC();
|
|
m_slideDc.SetDC(pDC);
|
|
m_slideDc.Redraw();
|
|
m_slideDc.SetDC(NULL);
|
|
pImageBox->ReleaseDC(pDC);
|
|
}
|
|
// Do not call CModelessDialog::OnPaint() for painting messages
|
|
}
|
|
void CDarwBalconyDlg::OnCommandDent()
|
|
{
|
|
if (g_nBalPath==0)
|
|
return;
|
|
UpdateData(TRUE);
|
|
g_nBalPath=0;
|
|
UpdateData(FALSE);
|
|
|
|
m_bUseEsc=FALSE;
|
|
acedPostCommand(_T("\33"));
|
|
}
|
|
void CDarwBalconyDlg::OnCommandRect()
|
|
{
|
|
if (g_nBalPath==1)
|
|
return;
|
|
UpdateData(TRUE);
|
|
g_nBalPath=1;
|
|
UpdateData(FALSE);
|
|
|
|
m_bUseEsc=FALSE;
|
|
acedPostCommand(_T("\33"));
|
|
}
|
|
void CDarwBalconyDlg::OnCommandConcave()
|
|
{
|
|
if (g_nBalPath==2)
|
|
return;
|
|
UpdateData(TRUE);
|
|
g_nBalPath=2;
|
|
UpdateData(FALSE);
|
|
m_bUseEsc=FALSE;
|
|
acedPostCommand(_T("\33"));
|
|
|
|
}
|
|
void CDarwBalconyDlg::OnCommandExtend()
|
|
{
|
|
if (g_nBalPath==3)
|
|
return;
|
|
UpdateData(TRUE);
|
|
g_nBalPath=3;
|
|
UpdateData(FALSE);
|
|
m_bUseEsc=FALSE;
|
|
acedPostCommand(_T("\33"));
|
|
}
|
|
void CDarwBalconyDlg::OnCommandArbitrary()
|
|
{
|
|
(GetDlgItem(IDC_LENTH))->EnableWindow(FALSE);
|
|
if (g_nBalPath==4)
|
|
return;
|
|
UpdateData(TRUE);
|
|
g_nBalPath=4;
|
|
UpdateData(FALSE);
|
|
m_bUseEsc=FALSE;
|
|
acedPostCommand(_T("\33"));
|
|
}
|
|
void CDarwBalconyDlg::OnCommandSelect()
|
|
{
|
|
(GetDlgItem(IDC_LENTH))->EnableWindow(FALSE);
|
|
if (g_nBalPath==5)
|
|
return;
|
|
UpdateData(TRUE);
|
|
g_nBalPath=5;
|
|
UpdateData(FALSE);
|
|
m_bUseEsc=FALSE;
|
|
acedPostCommand(_T("\33"));
|
|
}
|
|
|
|
void CDarwBalconyDlg::SetToolbarBtState1(int nBalPath)
|
|
{
|
|
m_toolbar.EnableButton(ID_BUTTON_DENT,nBalPath==0);
|
|
m_toolbar.EnableButton(ID_BUTTON_RECT2,nBalPath==1);
|
|
m_toolbar.EnableButton(ID_BUTTON_CONCAVE,nBalPath==2);
|
|
m_toolbar.EnableButton(ID_BUTTON_EXTEND,nBalPath==3);
|
|
m_toolbar.EnableButton(ID_BUTTON_ARBITRARY,nBalPath==4);
|
|
m_toolbar.EnableButton(ID_BUTTON_SELECT,nBalPath==5);
|
|
}
|
|
void CDarwBalconyDlg::SetToolbarBtState2()
|
|
{
|
|
m_toolbar.EnableButton(ID_BUTTON_DENT,TRUE);
|
|
m_toolbar.EnableButton(ID_BUTTON_RECT2,TRUE);
|
|
m_toolbar.EnableButton(ID_BUTTON_CONCAVE,TRUE);
|
|
m_toolbar.EnableButton(ID_BUTTON_EXTEND,TRUE);
|
|
m_toolbar.EnableButton(ID_BUTTON_ARBITRARY,TRUE);
|
|
m_toolbar.EnableButton(ID_BUTTON_SELECT,TRUE);
|
|
}
|
|
void CDarwBalconyDlg::doExtend(XPoint pt)
|
|
{
|
|
XPoint ptStart=pt;
|
|
XPoint ptEnd;
|
|
while(1)
|
|
{
|
|
int nRet1=ads_getpoint(NULL, _T("\n点取墙上另一点<取消>: "), ptEnd);
|
|
if (nRet1==RTNORM)
|
|
{
|
|
PickSet ssEnd(SS_FREE);
|
|
RBList entmask(RTDXF0,_T("TCH_WALL,TCH_CURTAIN_WALL"),NULL);
|
|
ssEnd.Get(ptEnd,entmask);
|
|
if (ssEnd.Length()!=0)
|
|
break;
|
|
}
|
|
else if (nRet1==RTNONE||nRet1==RTCAN)
|
|
return;
|
|
}
|
|
PickSet ssBound(SS_FREE);
|
|
g_ssPickFirst.Free();
|
|
if (SelectEntities(_T("\n请选择邻接的墙(或门窗)<取消>:"), ssBound,
|
|
RBList(RTDXF0, _T("TCH_WALL,TCH_CURTAIN_WALL,TCH_OPENING"), NULL))!=RTNORM)
|
|
return;
|
|
MakeWallSet(ssBound);//add by whl
|
|
UpdateData(TRUE);
|
|
XPoly2D polyWall;
|
|
ptStart=Ucs2Wcs(ptStart);
|
|
ptEnd=Ucs2Wcs(ptEnd);
|
|
if (SearchWallSide(ptStart,ptEnd,//世界坐标系下点
|
|
ssBound,//传入用户选的墙
|
|
|
|
polyWall)//返回沿墙polyWall
|
|
!=TRUE)
|
|
return;
|
|
// 确定起点在起始墙的哪侧,也就是求的poly向那侧偏
|
|
|
|
XPoint pt0=*polyWall[0];
|
|
XPoint pt1=*polyWall[1];
|
|
XDirectionCurve lineWall;
|
|
polyWall.Nth(0,lineWall);
|
|
XCurveSegment cvCenter;
|
|
|
|
PickSet ss(SS_FREE);
|
|
RBList entmask(RTDXF0,_T("TCH_WALL,TCH_CURTAIN_WALL"),NULL);
|
|
ss.Get(Wcs2Ucs(XPoint(pt0[0],pt0[1],pt0[2])),entmask);
|
|
if (ss.Length()==0)
|
|
return ;
|
|
Entity entFirst=ss[0L];//起点的墙
|
|
|
|
//针对起点是几个墙交点的情况
|
|
for(long i=0;i<ss.Length();i++)
|
|
{
|
|
Entity ent=ss[i];
|
|
if (ssBound.IsInclude(ent))
|
|
entFirst=ent;
|
|
}
|
|
|
|
|
|
OPENOBJ_BEGIN(entFirst,AcDb::kForRead,TDbWall,pWall)
|
|
if (pWall==NULL)
|
|
return ;
|
|
else
|
|
{
|
|
lineWall.SetPoints(pWall->StartPoint(),pWall->EndPoint());
|
|
cvCenter=pWall->OffsetGeomCenter();
|
|
}
|
|
OPENOBJ_END()
|
|
cvCenter.SetElevation(0);
|
|
int nRet=2;
|
|
nRet=cvCenter.OnWhichSide(ptStart);
|
|
if (lineWall.GetBulge()>1E-6)
|
|
{
|
|
if (nRet==0)
|
|
m_nSide=OFFSET_LEFT;
|
|
else if (nRet==1)
|
|
m_nSide=OFFSET_RIGHT;
|
|
else
|
|
return;
|
|
}
|
|
else if (lineWall.GetBulge()<-1E-6)
|
|
{
|
|
if (nRet==0)
|
|
m_nSide=OFFSET_RIGHT;
|
|
else if (nRet==1)
|
|
m_nSide=OFFSET_LEFT;
|
|
else
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
XLine line(pt0,pt1);
|
|
XLine line1(lineWall.StartPoint(),lineWall.EndPoint());
|
|
XVector3D vt1(line.EndPoint()-line.StartPoint());
|
|
XVector3D vt2(line1.EndPoint()-line1.StartPoint());
|
|
vt1.Normalize();
|
|
vt2.Normalize();
|
|
double s=vt1&vt2;
|
|
if (s>0)
|
|
{
|
|
if (nRet==0)
|
|
m_nSide=OFFSET_LEFT;
|
|
else if (nRet==1)
|
|
m_nSide=OFFSET_RIGHT;
|
|
else
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
if (nRet==0)
|
|
m_nSide=OFFSET_RIGHT;
|
|
else if (nRet==1)
|
|
m_nSide=OFFSET_LEFT;
|
|
else
|
|
return;
|
|
}
|
|
}
|
|
int nLen=polyWall.Length();
|
|
DList<int> lstEdgeIndex;
|
|
XPoly2D poly(1);
|
|
XPoly2D poly2d;
|
|
if (m_nSide==OFFSET_RIGHT)
|
|
{
|
|
poly2d=polyWall;
|
|
TchSubExport::Offset(m_Lenth,poly2d);// [11/12/2007 nsh]
|
|
}
|
|
else if (m_nSide==OFFSET_LEFT)
|
|
{
|
|
poly2d=polyWall;
|
|
TchSubExport::Offset(-m_Lenth,poly2d);// [11/12/2007 nsh]
|
|
}
|
|
else
|
|
return;
|
|
|
|
poly2d.Reverse();
|
|
|
|
for(long j=0;j<nLen;j++)
|
|
{
|
|
|
|
if (j<nLen-1)
|
|
poly.InsertNodeAt(j,*polyWall[j], polyWall.GetBulge(j));
|
|
|
|
else
|
|
poly.InsertNodeAt(j,*polyWall[j],0.0);
|
|
}
|
|
|
|
for(i=0;i<nLen;i++)
|
|
{
|
|
|
|
if (i<nLen-1)
|
|
poly.InsertNodeAt(i+nLen,*poly2d[i], poly2d.GetBulge(i));
|
|
else
|
|
poly.InsertNodeAt(i+nLen,*poly2d[i],0.0);
|
|
}
|
|
|
|
|
|
poly.Compress(TRUE);
|
|
if (poly.PathArea()>0)//确保逆时针
|
|
poly.Reverse();
|
|
for(int n=0; n<polyWall.TotalSegments(); n++)
|
|
{
|
|
XCurveSegment cvSeg;
|
|
polyWall.Nth(n, cvSeg);
|
|
XPoint ptEdge = cvSeg.MidPoint();
|
|
int nEdge=FindNearestEdge(poly, ptEdge);
|
|
if (nEdge>=0 && !lstEdgeIndex.FindNode(&nEdge, CompareInt))
|
|
{
|
|
lstEdgeIndex.Append(new int(nEdge));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
poly.SetElevation(m_Elev);
|
|
TDbBalcony *pBalcony = new TDbBalcony;
|
|
for(int k=0; k<lstEdgeIndex.Length(); k++)
|
|
pBalcony->SetRailAt(*lstEdgeIndex[k], FALSE);
|
|
pBalcony->SetOutline(poly);
|
|
pBalcony->SetRailWidth(m_Railwidth);
|
|
pBalcony->SetRailHeight(m_Railheight);
|
|
if (m_bhasGirder&&m_Girderthick>=m_Slabthick)
|
|
pBalcony->SetGirderThickness(m_Girderthick);
|
|
else
|
|
pBalcony->SetGirderThickness(m_Slabthick);
|
|
pBalcony->SetSlabThickness(m_Slabthick);
|
|
pBalcony->SetLayerGround3d(InitLayer(LAY_GROUND));
|
|
pBalcony->AddToMSpace(Adesk::kTrue);
|
|
|
|
}
|
|
|
|
void CDarwBalconyDlg::doSelect(Entity& retEnt)
|
|
{
|
|
XPoly2D polyRail;
|
|
XPoly2D poly(1);
|
|
if (retEnt.Is(_T("LINE")) || retEnt.Is(_T("ARC")))
|
|
{
|
|
XCurveSegment cv(retEnt);
|
|
polyRail.Reset();
|
|
cv.AsPoly2D(polyRail);
|
|
}
|
|
else
|
|
{
|
|
XPoly2D poly2d(retEnt);
|
|
if (!!poly2d)
|
|
{
|
|
polyRail=poly2d;
|
|
}
|
|
else
|
|
{
|
|
adsout << _T("\n无效的选择!");
|
|
return;
|
|
}
|
|
}
|
|
|
|
polyRail.Compress();
|
|
DList<int> lstEdgeIndex;
|
|
if (!polyRail.IsClosed())
|
|
{
|
|
XScreenDc dc0;
|
|
XScreenDc dc(1,1);// [12/4/2007 nsh]
|
|
XPoly2D polyTemp(polyRail);
|
|
polyTemp.TransUCS(Groups(0), Groups(1));
|
|
dc0 << polyTemp;
|
|
|
|
XPoly2D polyWall(0);
|
|
if (SearchBalcony(polyRail, polyWall, poly)!=RTNORM)
|
|
{
|
|
ads_redraw(NULL,0);
|
|
return;
|
|
}
|
|
|
|
for(int n=0; n<polyWall.TotalSegments(); n++)
|
|
{
|
|
XCurveSegment cvSeg;
|
|
polyWall.Nth(n, cvSeg);
|
|
XPoint ptEdge = cvSeg.MidPoint();
|
|
int nEdge=FindNearestEdge(poly, ptEdge);
|
|
if (nEdge>=0 && !lstEdgeIndex.FindNode(&nEdge, CompareInt))
|
|
{
|
|
lstEdgeIndex.Append(new int(nEdge));
|
|
XCurveSegment seg;
|
|
poly.Nth(nEdge, seg);
|
|
seg.StartPoint()=Wcs2Ucs(seg.StartPoint());
|
|
seg.EndPoint()=Wcs2Ucs(seg.EndPoint());
|
|
dc << seg;
|
|
|
|
}
|
|
}
|
|
while(1)
|
|
{
|
|
XPushVar<int> tVar(_T("OSMODE"), OS_NEA);
|
|
XPoint ptEdge;
|
|
int nRet=ads_getpoint(NULL, _T("\n请点取接墙的边: "), ptEdge);
|
|
if (nRet==RTNONE)
|
|
break;
|
|
else if (nRet==RTCAN)
|
|
return;
|
|
UpdateData(TRUE);
|
|
ptEdge =Ucs2Wcs(ptEdge);
|
|
int nEdge=FindNearestEdge(poly, ptEdge);
|
|
if (nEdge>=0 && !lstEdgeIndex.FindNode(&nEdge, CompareInt))
|
|
{
|
|
lstEdgeIndex.Append(new int(nEdge));
|
|
XCurveSegment seg;
|
|
poly.Nth(nEdge, seg);
|
|
seg.StartPoint()=Wcs2Ucs(seg.StartPoint());
|
|
seg.EndPoint()=Wcs2Ucs(seg.EndPoint());
|
|
dc << seg;
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
poly=polyRail;
|
|
if (poly.PathArea()>0) //确保逆时针
|
|
poly.Reverse();
|
|
XScreenDc dc(1,1);
|
|
while(1)
|
|
{
|
|
XPushVar<int> tVar(_T("OSMODE"), OS_NEA);
|
|
XPoint ptEdge;
|
|
int nRet=ads_getpoint(NULL, _T("\n请点取接墙的边: "), ptEdge);
|
|
if (nRet==RTNONE)
|
|
break;
|
|
else if (nRet==RTCAN)
|
|
return;
|
|
UpdateData(TRUE);
|
|
ptEdge=Ucs2Wcs(ptEdge);
|
|
int nEdge=FindNearestEdge(poly, ptEdge);
|
|
if (nEdge>=0 && !lstEdgeIndex.FindNode(&nEdge, CompareInt))
|
|
{
|
|
lstEdgeIndex.Append(new int(nEdge));
|
|
XCurveSegment seg;
|
|
poly.Nth(nEdge, seg);
|
|
seg.StartPoint()=Wcs2Ucs(seg.StartPoint());
|
|
seg.EndPoint()=Wcs2Ucs(seg.EndPoint());
|
|
dc << seg;
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
poly.SetElevation(m_Elev);// [11/12/2007 nsh]
|
|
|
|
TDbBalcony *pBalcony = new TDbBalcony;
|
|
pBalcony->SetOutline(poly);
|
|
pBalcony->SetRailWidth(m_Railwidth);// [11/12/2007 nsh]
|
|
pBalcony->SetRailHeight(m_Railheight);// [11/12/2007 nsh]
|
|
if (m_bhasGirder&&m_Girderthick>=m_Slabthick)
|
|
pBalcony->SetGirderThickness(m_Girderthick);// [11/12/2007 nsh]
|
|
else
|
|
pBalcony->SetGirderThickness(m_Slabthick);// [11/12/2007 nsh]
|
|
pBalcony->SetSlabThickness(m_Slabthick);// [11/12/2007 nsh]
|
|
pBalcony->SetLayerGround3d(InitLayer(LAY_GROUND));
|
|
for(int i=0; i<lstEdgeIndex.Length(); i++)
|
|
pBalcony->SetRailAt(*lstEdgeIndex[i], FALSE);
|
|
if (!retEnt)
|
|
;
|
|
else
|
|
retEnt.Erase();
|
|
|
|
pBalcony->AddToMSpace(Adesk::kTrue);
|
|
ads_redraw(NULL,0);
|
|
}
|
|
BOOL CDarwBalconyDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);
|
|
|
|
// if there is a top level routing frame then let it handle the message
|
|
if (GetRoutingFrame() != NULL) return FALSE;
|
|
|
|
// to be thorough we will need to handle UNICODE versions of the message also !!
|
|
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
|
|
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
|
|
//TCHAR szFullText[512];
|
|
CString strTipText;
|
|
UINT nID = (UINT)pNMHDR->idFrom;
|
|
|
|
if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) ||
|
|
pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if (nID != 0) // will be zero on a separator
|
|
{
|
|
{
|
|
CAcModuleResourceOverride vTmp;
|
|
strTipText.LoadString(nID); //=szFullText;
|
|
}
|
|
|
|
#ifndef _UNICODE
|
|
if (pNMHDR->code == TTN_NEEDTEXTA)
|
|
{
|
|
lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText));
|
|
}
|
|
else
|
|
{
|
|
_mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
|
|
}
|
|
#else
|
|
if (pNMHDR->code == TTN_NEEDTEXTA)
|
|
{
|
|
_wcstombsz(pTTTA->szText, strTipText,sizeof(pTTTA->szText));
|
|
}
|
|
else
|
|
{
|
|
lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
|
|
}
|
|
#endif
|
|
|
|
*pResult = 0;
|
|
|
|
// bring the tooltip window above other popup windows
|
|
::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,SWP_NOACTIVATE|
|
|
SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER); return TRUE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|