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

601 lines
17 KiB
C++

// FortifyColumnDlg.cpp : implementation file
//
#include "stdafx.h"
#include "FortifyColumnDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern int IsPoint2dEqual(XPoint pt1, XPoint pt2);
#define ROUND(x) (fabs(x)-int(fabs(x)) > 0.5 ? (x>0 ? 1 : -1)*(int(fabs(x))+1) : (x>0 ? 1 : -1)*int(fabs(x)))
/////////////////////////////////////////////////////////////////////////////
// CFortifyColumnDlg dialog
IMPLEMENT_DYNAMIC(CFortifyColumnDlg, GlwCAcUiDialog)
CFortifyColumnDlg::CFortifyColumnDlg(CWnd* pParent /*=NULL*/)
: GlwCAcUiDialog(CFortifyColumnDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CFortifyColumnDlg)
m_iA = -1;
m_iD = -1;
m_bM = FALSE;
m_csAC = _T("");
m_csBD = _T("");
//}}AFX_DATA_INIT
m_WallCount=0;
}
CFortifyColumnDlg::CFortifyColumnDlg(const AcDbObjectIdArray &idWallArray,XPoint ptRef1,XPoint ptRef2,XPoint ptRef3,XPoint ptRef4,CWnd* pParent/*=NULL*/)
: GlwCAcUiDialog(CFortifyColumnDlg::IDD, pParent)
{
m_iA = -1;
m_iD = -1;
m_bM = FALSE;
m_csAC = _T("");
m_csBD = _T("");
m_ptRef1=ptRef1; m_ptRef2=ptRef2; m_ptRef3=ptRef3; m_ptRef4=ptRef4;
int len=idWallArray.length();
ASSERT(len>0);
m_idWallArray.setLogicalLength(len);
for (int i=0; i<len; i++) m_idWallArray[i]=idWallArray[i];
m_WallCount=0;
m_ColumnPoly.SetFlag(1);
}
void CFortifyColumnDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFortifyColumnDlg)
DDX_Control(pDX, IDC_COMBO_BD, m_BD);
DDX_Control(pDX, IDC_COMBO_AC, m_AC);
DDX_Radio(pDX, IDC_RADIO_A, m_iA);
DDX_Radio(pDX, IDC_RADIO_D, m_iD);
DDX_Check(pDX, IDC_CHECK_M, m_bM);
DDX_CBString(pDX, IDC_COMBO_AC, m_csAC);
DDX_CBString(pDX, IDC_COMBO_BD, m_csBD);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFortifyColumnDlg, GlwCAcUiDialog)
//{{AFX_MSG_MAP(CFortifyColumnDlg)
ON_BN_CLICKED(IDC_RADIO_A, OnRadioAC)
ON_BN_CLICKED(IDC_RADIO_D, OnRadioBD)
ON_BN_CLICKED(IDC_CHECK_M, OnCheckM)
ON_CBN_KILLFOCUS(IDC_COMBO_AC, OnKillfocusComboAc)
ON_CBN_KILLFOCUS(IDC_COMBO_BD, OnKillfocusComboBd)
ON_BN_CLICKED(IDC_RADIO_B, OnRadioBD)
ON_BN_CLICKED(IDC_RADIO_C, OnRadioAC)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFortifyColumnDlg message handlers
BOOL CFortifyColumnDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
int len=m_idWallArray.length();
for (int i=0;i<len;i++) {
AcDbObjectId id=m_idWallArray[i];
if (id) m_WallCount+=1;
}
if (m_WallCount<3) {
GetDlgItem(IDC_CHECK_M)->EnableWindow(FALSE);
if (m_WallCount<2) {
GetDlgItem(IDC_RADIO_A)->EnableWindow(FALSE);
GetDlgItem(IDC_RADIO_C)->EnableWindow(FALSE);
}
}
double widthList[]={180,200,240,250,300,360,370};
int num=ELEMENTS(widthList);
double maxAC=m_ptRef1.Distance(m_ptRef2),maxBD=m_ptRef1.Distance(m_ptRef4);
for(i=0;i<num;i++) {
CString csItem;
csItem.Format(_T("%d"), AS_INT(widthList[i]));
if ((widthList[i]-maxBD)<1E-3) m_AC.AddString(csItem);
if ((widthList[i]-maxAC)<1E-3) m_BD.AddString(csItem);
}
if (fabs(maxBD-200)<_DIST_SNAP) m_csAC=_T("200");
else if ((240.0-maxBD)>1E-3) m_csAC=_T("180");
else m_csAC=_T("240");
if (fabs(maxAC-200)<_DIST_SNAP) m_csBD=_T("200");
else if ((240.0-maxAC)>1E-3) m_csBD=_T("180");
else m_csBD=_T("240");
if (GetDlgItem(IDC_RADIO_A)->IsWindowEnabled()) m_iA=0; else m_iD=0;
if (GetDlgItem(IDC_CHECK_M)->IsWindowEnabled()) m_bM=TRUE; else m_iD=0;
UpdateData(FALSE);
GetColumnPoly();
HighlightWallColumn();
UpdateImage();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CFortifyColumnDlg::OnRadioAC()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if ((m_bM)&&(m_iD!=-1)) m_iD=-1;
UpdateData(FALSE);
GetColumnPoly();
HighlightWallColumn();
UpdateImage();
}
void CFortifyColumnDlg::OnRadioBD()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if ((m_bM)&&(m_iA!=-1)) m_iA=-1;
UpdateData(FALSE);
GetColumnPoly();
HighlightWallColumn();
UpdateImage();
}
void CFortifyColumnDlg::OnCheckM()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if ((m_bM)&&(m_iA!=-1)&&(m_iD!=-1)) m_iD=-1;
if (!m_bM) {
if (m_iA==-1) m_iA=0;
if (m_iD==-1) m_iD=0;
}
UpdateData(FALSE);
GetColumnPoly();
HighlightWallColumn();
UpdateImage();
}
void CFortifyColumnDlg::OnOK()
{
CDialog::OnOK();
// TODO: Add extra validation here
XPoint ptLoc;
Midpoint(m_ptRef1,m_ptRef3,ptLoc);
TDbColumn *column=new TDbColumn;
column->SetLocation(ptLoc);
column->SetMaterial(TColumnData::kConcrete);
column->SetHeight(CFG_LHeight);
column->SetOutlinePoly(m_ColumnPoly);
column->SetSectionShape(TColumnData::kPoly);
column->SetFortifyColumn(TRUE);
column->SetLayerHatch2d(InitLayer(LAY_HATCH, FALSE));
column->AddToMSpace(TRUE);
}
void CFortifyColumnDlg::OnKillfocusComboAc()
{
// TODO: Add your control notification handler code here
CString s=m_csAC;
UpdateData(TRUE);
if ((_tstof(m_csAC)-m_ptRef1.Distance(m_ptRef4))>1E-3) {
ads_alert(_T("柱子不能超出墙体(A-C)"));
m_AC.SelectString(-1,s);
}
if (m_csAC.IsEmpty()) {
ads_alert(_T("未选定尺寸(A-C)"));
m_AC.SelectString(-1,s);
}
else if (_tstof(m_csAC)<=0) {
ads_alert(_T("尺寸不能为零或负值(A-C)"));
m_AC.SelectString(-1,s);
}
GetColumnPoly();
HighlightWallColumn();
UpdateImage();
}
void CFortifyColumnDlg::OnKillfocusComboBd()
{
// TODO: Add your control notification handler code here
CString s=m_csBD;
UpdateData(TRUE);
if ((_tstof(m_csBD)-m_ptRef1.Distance(m_ptRef2))>1E-3) {
ads_alert(_T("柱子不能超出墙体(B-D)"));
m_BD.SelectString(-1,s);
}
if (m_csBD.IsEmpty()) {
ads_alert(_T("未选定尺寸(B-D)"));
m_BD.SelectString(-1,s);
}
else if (_tstof(m_csBD)<=0) {
ads_alert(_T("尺寸不能为零或负值(B-D)"));
m_BD.SelectString(-1,s);
}
GetColumnPoly();
HighlightWallColumn();
UpdateImage();
}
void CFortifyColumnDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CWnd* pImage=GetDlgItem(IDC_IMAGE);
if (!pImage) return;
CRect rect;
pImage->GetClientRect(rect);
CDC* pDC=pImage->GetDC();
if (!pDC) return;
CRgn rgn;
rgn.CreateRectRgnIndirect(rect);
pDC->SelectClipRgn(&rgn);
pImage->Invalidate();
pImage->UpdateWindow();
CBrush brush(GetAcadBackColor());
pDC->FillRect(rect,&brush);
XPoly2D poly(1);
poly.InsertNodeAt(0,m_ptRef1);
poly.InsertNodeAt(1,m_ptRef2);
poly.InsertNodeAt(2,m_ptRef3);
poly.InsertNodeAt(3,m_ptRef4);
XPoint ptLow,ptUp,ptZero;
poly.GetExtend(ptLow,ptUp);
ptLow.x-=100; ptLow.y-=100; ptUp.x+=100; ptUp.y+=100;
ptZero=ptLow; ptZero.y=ptUp.y;
double nMaxX, nMaxY, nMaxXScl, nMaxYScl;
nMaxX=ptZero.Distance(ptUp); nMaxY=ptZero.Distance(ptLow);
nMaxXScl=rect.Width()/nMaxX; nMaxYScl=rect.Height()/nMaxY;
double Scale=nMaxXScl>nMaxYScl?nMaxYScl:nMaxXScl;
if (nMaxXScl>nMaxYScl) ptZero.x-=(rect.Width()-nMaxX*Scale)/2/Scale;
else ptZero.y+=(rect.Height()-nMaxY*Scale)/2/Scale;
COLORREF c;
int len=m_idWallArray.length();
ASSERT(len>0);
if (m_WallCount>1)
for (int i=0;i<len;i++) {
if (i==0) c=acdbGetRGB(1);
else if (i==1) c=acdbGetRGB(2);
else if (i==2) c=acdbGetRGB(3);
else if (i==3) c=acdbGetRGB(4);
XDbObject objWall(m_idWallArray[i], AcDb::kForRead);
if (!objWall) continue;
TDbWall* pWall=TDbWall::cast(objWall.m_pObject);
if (!pWall) continue;
XCurveSegment lCurve,rCurve;
pWall->GetSideCurve(lCurve,rCurve);
XPoint pt1,pt2;
CPoint p1,p2;
pt1=lCurve.StartPoint(); pt2=lCurve.EndPoint();
p1=ConvertPoint(ptZero,pt1,Scale); p2=ConvertPoint(ptZero,pt2,Scale);
DrawLine(pDC,p1,p2,1,c);
pt1=rCurve.StartPoint(); pt2=rCurve.EndPoint();
p1=ConvertPoint(ptZero,pt1,Scale); p2=ConvertPoint(ptZero,pt2,Scale);
DrawLine(pDC,p1,p2,1,c);
}
else {// single wall case
XDbObject objWall(m_idWallArray[0], AcDb::kForRead);
if (!objWall) return;
TDbWall* pWall=TDbWall::cast(objWall.m_pObject);
if (!pWall) return;
XCurveSegment lCurve,rCurve;
pWall->GetSideCurve(lCurve,rCurve);
XPoint pt1,pt2,pt3,pt4,pt14,pt23;
if (IsPoint2dEqual(lCurve.StartPoint(),lCurve.NearPoint(m_ptRef1))) {
pt1=lCurve.StartPoint(); pt2=rCurve.StartPoint();
pt3=rCurve.EndPoint(); pt4=lCurve.EndPoint();
}
else {
pt1=lCurve.EndPoint(); pt2=rCurve.EndPoint();
pt3=rCurve.StartPoint(); pt4=lCurve.StartPoint();
}
Midpoint(m_ptRef1,m_ptRef4,pt14);
Midpoint(m_ptRef2,m_ptRef3,pt23);
CPoint p1,p2,p3,p4,p14,p23;
p1=ConvertPoint(ptZero,pt1,Scale); p2=ConvertPoint(ptZero,pt2,Scale);
p3=ConvertPoint(ptZero,pt3,Scale); p4=ConvertPoint(ptZero,pt4,Scale);
p14=ConvertPoint(ptZero,pt14,Scale); p23=ConvertPoint(ptZero,pt23,Scale);
c=acdbGetRGB(1); DrawLine(pDC,p1,p14,1,c); DrawLine(pDC,p2,p23,1,c);
c=acdbGetRGB(3); DrawLine(pDC,p3,p23,1,c); DrawLine(pDC,p4,p14,1,c);
}
CString szText;
XPoint ptMid,ptTxt;
CPoint pTxt;
XVector3D v1=m_ptRef1-m_ptRef2,v2=m_ptRef1-m_ptRef4;
((AcGeVector3d &)v1).normalize();
((AcGeVector3d &)v2).normalize();
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextAlign(TA_CENTER|TA_BASELINE);
Midpoint(m_ptRef1,m_ptRef2,ptMid);
ptTxt.x=ptMid.x+v2.x*60; ptTxt.y=ptMid.y+v2.y*60;
pTxt=ConvertPoint(ptZero,ptTxt,Scale);
szText.Format(_T("%c"), _T('a'));
CalTextLocate(pDC, pTxt, rect, szText);
pDC->SetTextColor(acdbGetRGB(1));
pDC->TextOut(pTxt.x, pTxt.y, szText);
Midpoint(m_ptRef2,m_ptRef3,ptMid);
ptTxt.x=ptMid.x-v1.x*60; ptTxt.y=ptMid.y-v1.y*60;
pTxt=ConvertPoint(ptZero,ptTxt,Scale);
szText.Format(_T("%c"), _T('b'));
CalTextLocate(pDC, pTxt, rect, szText);
pDC->SetTextColor(acdbGetRGB(2));
pDC->TextOut(pTxt.x, pTxt.y, szText);
Midpoint(m_ptRef3,m_ptRef4,ptMid);
ptTxt.x=ptMid.x-v2.x*60; ptTxt.y=ptMid.y-v2.y*60;
pTxt=ConvertPoint(ptZero,ptTxt,Scale);
szText.Format(_T("%c"), _T('c'));
CalTextLocate(pDC, pTxt, rect, szText);
pDC->SetTextColor(acdbGetRGB(3));
pDC->TextOut(pTxt.x, pTxt.y, szText);
Midpoint(m_ptRef4,m_ptRef1,ptMid);
ptTxt.x=ptMid.x+v1.x*60; ptTxt.y=ptMid.y+v1.y*60;
pTxt=ConvertPoint(ptZero,ptTxt,Scale);
szText.Format(_T("%c"), _T('d'));
CalTextLocate(pDC, pTxt, rect, szText);
pDC->SetTextColor(acdbGetRGB(4));
pDC->TextOut(pTxt.x, pTxt.y, szText);
XPointList ptList=GetColumnPoint();
XPoint pt1=*ptList[0],pt2=*ptList[1],pt4=*ptList[3];
XVector3D v=pt4-pt1;
((AcGeVector3d &)v).normalize();
len=AS_INT(pt1.Distance(pt4));
for (int i=0;i<len;i++) {
XPoint q1,q2;
q1.x=pt1.x+v.x*i; q1.y=pt1.y+v.y*i;
q2.x=pt2.x+v.x*i; q2.y=pt2.y+v.y*i;
CPoint p1=ConvertPoint(ptZero,q1,Scale),p2=ConvertPoint(ptZero,q2,Scale);
DrawLine(pDC,p1,p2,1,acdbGetRGB(7));
}
pImage->ReleaseDC(pDC);
// Do not call CDialog::OnPaint() for painting messages
}
BOOL CFortifyColumnDlg::IsFullSize() {
if ((fabs(m_ptRef1.Distance(m_ptRef2)-_tstof(m_csBD))<1E-3)&&(fabs(m_ptRef1.Distance(m_ptRef4)-_tstof(m_csAC))<1E-3))
return TRUE;
else
return FALSE;
}
XPointList CFortifyColumnDlg::GetColumnPoint() {
XPoint p1,p2,p3,p4;
if (IsFullSize()) {// column points are the same as ref. points
p1=m_ptRef1; p2=m_ptRef2; p3=m_ptRef3; p4=m_ptRef4;
}
else {// get 4 column points according to sizes and options
double dAC=m_ptRef1.Distance(m_ptRef4),dBD=m_ptRef1.Distance(m_ptRef2);// wall distance
double s12=_tstof(m_csBD),s14=_tstof(m_csAC);// column size
double o12=(dBD-_tstof(m_csBD))/2,o14=(dAC-_tstof(m_csAC))/2;// position offset
XVector3D v12=m_ptRef1-m_ptRef2,v14=m_ptRef1-m_ptRef4;
((AcGeVector3d &)v12).normalize();
((AcGeVector3d &)v14).normalize();
if (!m_bM) {
if (m_iA==0) {
if (m_iD==0) {//A+D
p1=m_ptRef1;
p2.x=p1.x-v12.x*s12; p2.y=p1.y-v12.y*s12;
p4.x=p1.x-v14.x*s14; p4.y=p1.y-v14.y*s14;
p3.x=p4.x-v12.x*s12; p3.y=p4.y-v12.y*s12;
}
else {//A+B
p2=m_ptRef2;
p1.x=p2.x+v12.x*s12; p1.y=p2.y+v12.y*s12;
p3.x=p2.x-v14.x*s14; p3.y=p2.y-v14.y*s14;
p4.x=p3.x+v12.x*s12; p4.y=p3.y+v12.y*s12;
}
}
else if (m_iA==1) {
if (m_iD==0) {//C+D
p4=m_ptRef4;
p3.x=p4.x-v12.x*s12; p3.y=p4.y-v12.y*s12;
p1.x=p4.x+v14.x*s14; p1.y=p4.y+v14.y*s14;
p2.x=p1.x-v12.x*s12; p2.y=p1.y-v12.y*s12;
}
else {//C+B
p3=m_ptRef3;
p4.x=p3.x+v12.x*s12; p4.y=p3.y+v12.y*s12;
p2.x=p3.x+v14.x*s14; p2.y=p3.y+v14.y*s14;
p1.x=p2.x+v12.x*s12; p1.y=p2.y+v12.y*s12;
}
}
else {// single wall case
if (m_iD==0) {//D
p1.x=m_ptRef1.x-v14.x*o14; p1.y=m_ptRef1.y-v14.y*o14;
p4.x=m_ptRef4.x+v14.x*o14; p4.y=m_ptRef4.y+v14.y*o14;
p2.x=p1.x-v12.x*s12; p2.y=p1.y-v12.y*s12;
p3.x=p4.x-v12.x*s12; p3.y=p4.y-v12.y*s12;
}
else {//B
p2.x=m_ptRef2.x-v14.x*o14; p2.y=m_ptRef2.y-v14.y*o14;
p3.x=m_ptRef3.x+v14.x*o14; p3.y=m_ptRef3.y+v14.y*o14;
p1.x=p2.x+v12.x*s12; p1.y=p2.y+v12.y*s12;
p4.x=p3.x+v12.x*s12; p4.y=p3.y+v12.y*s12;
}
}
}
else if (m_iA!=-1) {
if (m_iA==0) {//M+A
p1.x=m_ptRef1.x-v12.x*o12; p1.y=m_ptRef1.y-v12.y*o12;
p2.x=m_ptRef2.x+v12.x*o12; p2.y=m_ptRef2.y+v12.y*o12;
p4.x=p1.x-v14.x*s14; p4.y=p1.y-v14.y*s14;
p3.x=p2.x-v14.x*s14; p3.y=p2.y-v14.y*s14;
}
else {//M+C
p4.x=m_ptRef4.x-v12.x*o12; p4.y=m_ptRef4.y-v12.y*o12;
p3.x=m_ptRef3.x+v12.x*o12; p3.y=m_ptRef3.y+v12.y*o12;
p1.x=p4.x+v14.x*s14; p1.y=p4.y+v14.y*s14;
p2.x=p3.x+v14.x*s14; p2.y=p3.y+v14.y*s14;
}
}
else {
if (m_iD==0) {//M+D
p1.x=m_ptRef1.x-v14.x*o14; p1.y=m_ptRef1.y-v14.y*o14;
p4.x=m_ptRef4.x+v14.x*o14; p4.y=m_ptRef4.y+v14.y*o14;
p2.x=p1.x-v12.x*s12; p2.y=p1.y-v12.y*s12;
p3.x=p4.x-v12.x*s12; p3.y=p4.y-v12.y*s12;
}
else {//M+B
p2.x=m_ptRef2.x-v14.x*o14; p2.y=m_ptRef2.y-v14.y*o14;
p3.x=m_ptRef3.x+v14.x*o14; p3.y=m_ptRef3.y+v14.y*o14;
p1.x=p2.x+v12.x*s12; p1.y=p2.y+v12.y*s12;
p4.x=p3.x+v12.x*s12; p4.y=p3.y+v12.y*s12;
}
}
}
XPointList ptList;
ptList.NewAppend(p1);
ptList.NewAppend(p2);
ptList.NewAppend(p3);
ptList.NewAppend(p4);
return ptList;
}
void CFortifyColumnDlg::GetColumnPoly() {
XPointList ptList;
ptList=GetColumnPoint();
m_ColumnPoly.Reset();
ptList.AsPoly2D(m_ColumnPoly);
}
void CFortifyColumnDlg::HighlightWallColumn() {
ads_redraw(NULL, 0);
XScreenDc dc;
dc.SetColor(7);
XVector3D v=m_ptRef1-m_ptRef4;
((AcGeVector3d &)v).normalize();
XPointList ptList;
ptList=GetColumnPoint();
XPoint p1=*ptList[0],p2=*ptList[1];
int len=AS_INT(_tstof(m_csAC));
for (int i=0;i<len;i++) {
XPoint q1,q2;
q1.x=p1.x-v.x*i; q1.y=p1.y-v.y*i;
q2.x=p2.x-v.x*i; q2.y=p2.y-v.y*i;
XLine l(Wcs2Ucs(q1),Wcs2Ucs(q2)); dc << l;
}
len=m_idWallArray.length();
ASSERT(len>0);
if (m_WallCount>1)
for (int i=0;i<len;i++) {
if (i==0) dc.SetColor(1);
else if (i==1) dc.SetColor(2);
else if (i==2) dc.SetColor(3);
else if (i==3) dc.SetColor(4);
XDbObject objWall(m_idWallArray[i], AcDb::kForRead);
if (!objWall) continue;
TDbWall* pWall=TDbWall::cast(objWall.m_pObject);
if (!pWall) continue;
XCurveSegment lCurve,rCurve;
pWall->GetSideCurve(lCurve,rCurve);
XPoint p1,p2;
double b;
p1=Wcs2Ucs(lCurve.StartPoint()); p2=Wcs2Ucs(lCurve.EndPoint()); b=lCurve.GetBulge();
dc << XCurveSegment(p1,p2,b);
p1=Wcs2Ucs(rCurve.StartPoint()); p2=Wcs2Ucs(rCurve.EndPoint()); b=rCurve.GetBulge();
dc << XCurveSegment(p1,p2,b);
}
else {// single wall case
XDbObject objWall(m_idWallArray[0], AcDb::kForRead);
if (!objWall) return;
TDbWall* pWall=TDbWall::cast(objWall.m_pObject);
if (!pWall) return;
XCurveSegment lCurve,rCurve;
pWall->GetSideCurve(lCurve,rCurve);
XPoint p1,p2,p3,p4,p14,p23;
if (IsPoint2dEqual(lCurve.StartPoint(),lCurve.NearPoint(m_ptRef1))) {
p1=Wcs2Ucs(lCurve.StartPoint()); p2=Wcs2Ucs(rCurve.StartPoint());
p3=Wcs2Ucs(rCurve.EndPoint()); p4=Wcs2Ucs(lCurve.EndPoint());
}
else {
p1=Wcs2Ucs(lCurve.EndPoint()); p2=Wcs2Ucs(rCurve.EndPoint());
p3=Wcs2Ucs(rCurve.StartPoint()); p4=Wcs2Ucs(lCurve.StartPoint());
}
double b1=lCurve.GetBulge(),b2=rCurve.GetBulge();
Midpoint(m_ptRef1,m_ptRef4,p14);
Midpoint(m_ptRef2,m_ptRef3,p23);
dc.SetColor(1);
dc << XCurveSegment(p1,Wcs2Ucs(p14),b1);
dc << XCurveSegment(p2,Wcs2Ucs(p23),b2);
dc.SetColor(3);
dc << XCurveSegment(p3,Wcs2Ucs(p23),b2);
dc << XCurveSegment(p4,Wcs2Ucs(p14),b1);
}
acedUpdateDisplay();
}
void CFortifyColumnDlg::UpdateImage() {
CRect rect;
CWnd* pImage=GetDlgItem(IDC_IMAGE);
if (pImage) {
pImage->GetWindowRect(rect);
ScreenToClient(rect);
InvalidateRect(rect);
}
}
CPoint CFortifyColumnDlg::ConvertPoint(XPoint ptZero, XPoint pt, double Scale)
{
CPoint p;
p.x=ROUND((pt.x-ptZero.x)*Scale);
p.y=ROUND((ptZero.y-pt.y)*Scale);
return p;
}
void CFortifyColumnDlg::CalTextLocate(CDC* pDC, CPoint& pTxt, CRect rect, CString szText)
{
CFont* pFont=GetFont();
CFont* pOldFont=pDC->SelectObject(pFont);
CSize size=pDC->GetTextExtent(szText);
pDC->SelectObject(pOldFont);
if (pTxt.x<0) pTxt.x=0;
if (pTxt.y<0) pTxt.y=0;
if (pTxt.x+size.cx>rect.right) pTxt.x=rect.right-size.cx;
if (pTxt.y+size.cy>rect.bottom) pTxt.y=rect.bottom-size.cy;
}
void CFortifyColumnDlg::DrawLine(CDC* pDC, CPoint pt1, CPoint pt2, int nWidth, COLORREF clr)
{
CPen pen(PS_SOLID, nWidth, clr);
CPen* pOldPen = pDC->SelectObject(&pen);
pDC->MoveTo(pt1);
pDC->LineTo(pt2);
pDC->SelectObject(pOldPen);
}