Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

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;
}