// 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; iEnableWindow(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;i1E-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;iGetSideCurve(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;iReleaseDC(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;i0); if (m_WallCount>1) for (int i=0;iGetSideCurve(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); }