// AxisGridSheet.cpp : implementation file // #include "stdafx.h" #include "AxisGridSheet.h" #include "float.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // command void AxisGrid() { CTemporaryResourceOverride vTmp; CAxisGridSheet sheet(acedGetAcadFrame()); sheet.DoModal(); } //////////////////////////////////////////////////////////////////////////////////// // Data And Funtion //extern GEOAPI int DragPickSet(PickSet &ss, XPoint &ptBase); extern TARCH_IMPEXP int g_nRunMode; extern TARCH_IMPEXP double g_dBaseDist; const TCHAR* SZ_SIZES[] = {_T("1500"), _T("1800"), _T("2100"), _T("2400"), _T("2700"), _T("3000"), _T("3300"), _T("3600"), _T("3900") , _T("4200"), _T("4500"), _T("4800"), _T("5400"), _T("6000"), _T("6600"), _T("7500"), _T("8000"), _T("9000")}; const TCHAR* SZ_ANGLES[] = {_T("10"), _T("15"), _T("20"), _T("25"), _T("30"), _T("35"), _T("40"), _T("45"), _T("60"), _T("90"), _T("120"), _T("150")}; int CmpAxisGridPoint(const XPoint *pt1, const XPoint *pt2) { if(fabs(pt1->y - pt2->y) < 1E-6) { if(pt1->x < pt2->x) return -1; else return 1; } else if(pt1->y < pt2->y) return -1; else return 1; } static void Disperse(double nDistBeg, PDList &vtOne, PDList &vtDistSize) { for(int i=0; iIsKindOf(RUNTIME_CLASS(CArcAxisPage))) { CArcAxisPage *pArc = (CArcAxisPage*)pWnd; if(pArc->m_nCenter == 0) { for(int i=0; iIsKindOf(RUNTIME_CLASS(CArcAxisPage))) { CArcAxisPage *pArc = (CArcAxisPage*)pWnd; if(pArc->m_nCenter == 0) { double dTotal = 0.0; for(long i=0; i AXIS_PEC) { MessageBox(_T("总角度不能超过360度!")); return false; } } } return true; } bool TAxisGrid::OnBeforePaste(long i) { CWnd *pWnd = GetParent(); if(pWnd->IsKindOf(RUNTIME_CLASS(CArcAxisPage))) { CArcAxisPage *pArc = (CArcAxisPage*)pWnd; if(pArc->m_nCenter == 0) { int i; double dTotal = 0.0; for(i=0; i AXIS_PEC) { MessageBox(_T("总角度不能超过360度!")); return false; } } } return true; } void TAxisGrid::OnDataChanged() { WDGrid::OnDataChanged(); GetParent()->PostMessage(WM_GRID_MESSAGE, 0, 0); } void TAxisGrid::OnInsertRow(WDGridRow&row) { if(GetColNum() > 1) row[1].SetText(_T("1")); OnDataChanged(); } //////////////////////////////////////////////////////// // TAxisDistAndKind int TAxisDistAndKind::CompareForSort(const TAxisDistAndKind *p1, const TAxisDistAndKind *p2) { double nR1=p1->nDist; double nR2 = p2->nDist; double nDiff=nR1-nR2; if(nDiff > 1.0E-9) return 1; else if(nDiff<-1.0E-9) return -1; return 0; } int TAxisDistAndKind::CompareReal(const TAxisDistAndKind *r1, const void *r2) { double nR1=r1->nDist; double nR2 = *(const double *)r2; double nDiff=nR1-nR2; if(nDiff > 1.0E-9) return 1; else if(nDiff<-1.0E-9) return -1; return 0; } ///////////////////////////////////////////////////////////////////////////// // CAxisBasePage property page IMPLEMENT_DYNAMIC(CAxisBasePage, CAcUiTabChildDialog) CAxisBasePage::CAxisBasePage() : CAcUiTabChildDialog() , m_PreviewDb(true, true) , m_bPreview(true) , m_bEditInput(FALSE) , m_dDisX(0) , m_dDisY(0) , m_dAngle(0) { } void CAxisBasePage::DoDataExchange(CDataExchange* pDX) { CAcUiTabChildDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST_CONST, m_list); DDX_Control(pDX, IDC_EDIT_INPUT, m_editInput); DDX_Control(pDX, IDC_EDIT_ANGLE, m_editAngle); DDX_Control(pDX, IDC_SPIN_ANGLE, m_spinAngle); } BEGIN_MESSAGE_MAP(CAxisBasePage, CAcUiTabChildDialog) ON_LBN_SELCHANGE(IDC_LIST_CONST, OnLbnSelchangeList) ON_BN_CLICKED(IDC_BUTTON_CLEAR, OnBnClickedButtonClear) ON_EN_KILLFOCUS(IDC_EDIT_INPUT, OnEnKillfocusEditInput) ON_CONTROL(WM_EDIT_MESSAGE, IDC_EDIT_INPUT, OnMessageEditInput) ON_MESSAGE(WM_GRID_MESSAGE, OnGridMessage) ON_WM_DESTROY() END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CAxisBasePage message handlers BOOL CAxisBasePage::OnInitDialog() { CAcUiTabChildDialog::OnInitDialog(); InitList(); InitGrid(); if(!InitPreview()) return FALSE; UpdateEditDis(); UpdateEditAngle(); return TRUE; } void CAxisBasePage::OnLbnSelchangeList() { CString szStr; int nSel = m_list.GetCurSel(); m_list.GetText(nSel, szStr); if(!AddToCList(_tstof(szStr), 1)) return; UpdateEditDis(); UpdateGrid(); UpdatePreview(); UpdateEditInput(); m_grid.SetFocus(); } void CAxisBasePage::OnBnClickedButtonClear() { GetSizeDesc().Clear(); UpdateEditDis(); UpdatePreview(); UpdateGrid(); UpdateEditInput(); } void CAxisBasePage::OnEnKillfocusEditInput() { if(m_bEditInput) { m_bEditInput = FALSE; return; } OnMessageEditInput(); } void CAxisBasePage::OnMessageEditInput() { m_bEditInput = TRUE; CString szData; m_editInput.GetWindowText(szData); PDList &vtSize = GetSizeDesc(); for(vtSize.MoveToFirst(); !vtSize.IsOut(); vtSize.MoveToNext()) { if(vtSize.GetCurData()->m_nPosition != -1) vtSize.DelCur(); } TCHAR szWord[1024]=_T(""); int iWord=1; while(CT_strnth(szData, iWord, szWord)) { int nCount=1; double dSize=0.0; TCHAR *pPlus=_tcschr(szWord, _T('*')); if(!pPlus) dSize=_tstof(szWord); else { dSize=_tstof(&pPlus[1]); *pPlus=EOS; nCount=_ttoi(szWord); } if(nCount<1 || dSize<_DIST_SNAP) { MessageBox(_T("请正确键入!")); break; } if(!AddToCList(dSize, nCount)) { UpdateEditInput(); return; } iWord++; } UpdateEditDis(); UpdateGrid(); UpdateEditInput(); UpdatePreview(); } LRESULT CAxisBasePage::OnGridMessage(WPARAM wParam, LPARAM lParam) { PDList &vtCurrent = GetSizeDesc(); for(vtCurrent.MoveToFirst(); !vtCurrent.IsOut(); vtCurrent.MoveToNext()) { if(vtCurrent.GetCurData()->m_nPosition != -1) vtCurrent.DelCur(); } for(long i=0; i &lstCurrent = GetSizeDesc(); for(int i=0; im_nPosition == 0) { WDGridRow *pRow = new WDGridRow(m_grid); (*pRow)[0].SetText(XString(_T("%.0f"), pCAS->m_dSize)); (*pRow)[1].SetText(XString(_T("%d"), pCAS->m_nCount)); m_grid.AppendRow(pRow); } } } void CAxisBasePage::UpdatePreview() { m_bPreview = TRUE; m_PreviewCtrl.clearAll(); m_PreviewCtrl.init(true); AcDbBlockTable *pBlockTab = NULL; if(m_PreviewDb.getSymbolTable(pBlockTab, AcDb::kForWrite)!=Acad::eOk) return; AcDbBlockTableRecord *pBlockTableRecord = new AcDbBlockTableRecord; pBlockTableRecord->setName(_T("*U")); pBlockTab->add(pBlockTableRecord); pBlockTab->close(); if(!DrawEntity(pBlockTableRecord)) { pBlockTableRecord->close(); m_PreviewCtrl.Invalidate(); return; } AcDbExtents extents; GetRecordExtents(pBlockTableRecord, extents); double dWidth = extents.maxPoint().x - extents.minPoint().x; double dHigh = extents.maxPoint().y - extents.minPoint().y; DrawBasePoint(0.03 * dHigh, pBlockTableRecord); AcGePoint3d ptCenter; ptCenter.x = extents.minPoint().x + 0.5 * dWidth; ptCenter.y = extents.minPoint().y + 0.5 * dHigh; AcGePoint3d ptEye(ptCenter.x, ptCenter.y, 1); AcGsView *pView = m_PreviewCtrl.view(); pView->setView(ptEye, ptCenter, AcGeVector3d(0, 1, 0), 1.1*dWidth, 1.1*dHigh); pView->add(pBlockTableRecord, m_PreviewCtrl.model()); pBlockTableRecord->close(); m_PreviewCtrl.Invalidate(); UpdateVisible(); } void CAxisBasePage::UpdateEditInput() { XString szData(2048); for(long i=0; i1) szData << nCount << _T("*"); szData << dSize << _T(" "); } m_editInput.SetWindowText(szData); } void CAxisBasePage::UpdateEditDis() { GetEditDisValue(); CString szDisX, szDisY; szDisX.Format(_T("%.1f"), m_dDisX); szDisX.TrimRight(_T("0")); szDisX.TrimRight(_T(".")); szDisY.Format(_T("%.1f"), m_dDisY); szDisY.TrimRight(_T("0")); szDisY.TrimRight(_T(".")); CAxisGridSheet *pSheet = (CAxisGridSheet*)GetParent(); if(pSheet != NULL) pSheet->UpdateSize(szDisX, szDisY); } void CAxisBasePage::GetRecordExtents(AcDbBlockTableRecord *pBlockTabRecord, AcDbExtents &extents) { AcDbBlockTableRecordIterator *pIterator = NULL; if(Acad::eOk != pBlockTabRecord->newIterator(pIterator)) return; BOOL bInit = TRUE; AcGePoint3d ptMin, ptMax; for(pIterator->start(); !pIterator->done(); pIterator->step()) { AcDbEntity *pEnt = NULL; if(Acad::eOk != pIterator->getEntity(pEnt, AcDb::kForRead)) continue; AcDbExtents ext; if(Acad::eOk == pEnt->getGeomExtents(ext)) { if(bInit) { ptMin = ext.minPoint(); ptMax = ext.maxPoint(); bInit = FALSE; } else { ptMin.x = min(ptMin.x, ext.minPoint().x); ptMin.y = min(ptMin.y, ext.minPoint().y); ptMax.x = max(ptMax.x, ext.maxPoint().x); ptMax.y = max(ptMax.y, ext.maxPoint().y); } } pEnt->close(); } delete pIterator; extents.set(ptMin, ptMax); } void CAxisBasePage::CopyPDList(PDList &source, PDList &dest) { for(source.MoveToFirst(); !source.IsOut(); source.MoveToNext()) { TCountAndSize* pNew = new TCountAndSize(*source.GetCurData()); if(pNew != NULL) dest.AddTail(pNew); } } double CAxisBasePage::TotalDistance(PDList &lstDesc) { double nRes=0.0; for(int i=0; im_nCount * lstDesc[i]->m_dSize; return nRes; } void CAxisBasePage::DrawBasePoint(const double dLength, AcDbBlockTableRecord *&pBlockTabRecord) { XPoint ptSta1 = m_ptIns + XPoint(dLength, dLength, 0); XPoint ptEnd1 = m_ptIns + XPoint(-dLength, -dLength, 0); AcDbLine *pline1 = new AcDbLine(ptSta1, ptEnd1); pBlockTabRecord->appendAcDbEntity(pline1); pline1->close(); XPoint ptSta2 = m_ptIns + XPoint(-dLength, dLength, 0); XPoint ptEnd2 = m_ptIns + XPoint(dLength, -dLength, 0); AcDbLine *pline2 = new AcDbLine(ptSta2, ptEnd2); pBlockTabRecord->appendAcDbEntity(pline2); pline2->close(); } // add by zyc [2012/04/20] 将拾取的标注数据添加到键入编辑框 void CAxisBasePage::AddDataToInputEdit(CArray& arData) { CString sAllData; CString sData; for (int i=0; iGetDlgCtrlID(); // if(nID == IDC_RADIO_UP) // pDC->SetTextColor(acdbGetRGB(2)); // else if(nID == IDC_RADIO_DOWN) // pDC->SetTextColor(acdbGetRGB(1)); // else if(nID == IDC_RADIO_LEFT) // pDC->SetTextColor(acdbGetRGB(4)); // else if(nID == IDC_RADIO_RIGHT) // pDC->SetTextColor(acdbGetRGB(3)); // // return hbr; //} void CRectAxisPage::OnBnClickedRadio() { CDataExchange dx(this, true); DDX_Radio(&dx, IDC_RADIO_UP, m_nRadio); PDList &lstCorre = GetCorreDesc(); ReplaceOffset(lstCorre); m_editOffset.SetWindowText(_T("0")); UpdateVisible(); UpdateGrid(); UpdateEditInput(); } void CRectAxisPage::OnBnClickedButtonBack() { int nIns; double dOffset; GetOffset(GetSizeDesc(), nIns, dOffset); GetSizeDesc().Del(nIns); UpdateEditOffset(); UpdateVisible(); } void CRectAxisPage::OnBnClickedButtonForward() { int nIns; double dOffset; GetOffset(GetSizeDesc(), nIns, dOffset); PDList &lstCorre = GetCorreDesc(); double dDesc = 0.0; for(int i=0; im_nCount; j++) { dDesc += pSize->m_dSize; double dDif = dDesc - dOffset; if(dDif > AXIS_PEC) { if(pSize->m_dSize - dDif > AXIS_PEC) GetSizeDesc().Del(nIns); GetSizeDesc().Insert(nIns+1, new TCountAndSize(pSize->m_dSize, 1, -1)); UpdateEditOffset(); UpdateVisible(); return; } } } } void CRectAxisPage::OnEnChangeEditOffset() { double dOffset = 0.0; CDataExchange dx(this, true); DDX_Text(&dx, IDC_EDIT_OFFSET, dOffset); PDList &lstSize = GetSizeDesc(); for(lstSize.MoveToFirst(); !lstSize.IsOut(); lstSize.MoveToNext()) { if(lstSize.GetCurData()->m_nPosition == -1) lstSize.DelCur(); } PDList &lstCorre = GetCorreDesc(); int nPos = 0; for(int i=0; im_nCount; j++) { double dDesc = dOffset - pSize->m_dSize; if(dDesc > AXIS_PEC) { lstSize.Insert(nPos, new TCountAndSize(pSize->m_dSize, 1, -1)); dOffset -= pSize->m_dSize; nPos++; } else { bBreak = TRUE; break; } } if(bBreak) break; } if(dOffset > AXIS_PEC) lstSize.Insert(nPos, new TCountAndSize(dOffset, 1, -1)); UpdateVisible(); UpdateEditDis(); UpdatePreview(); } void CRectAxisPage::OnBnClickedButtonClear() { m_editOffset.SetWindowText(_T("0")); CAxisBasePage::OnBnClickedButtonClear(); UpdateVisible(); } void CRectAxisPage::OnEnKillfocusEditAngle() { OnMessageEditAngle(); } void CRectAxisPage::OnMessageEditAngle() { CString szAngle; m_editAngle.GetWindowText(szAngle); double dAngle = PI/2 - _tstof(szAngle)*PI/180; dAngle = atan(tan(dAngle)); if(fabs(fabs(dAngle) - PI/2) > AXIS_PEC) m_dAngle = dAngle; UpdateEditAngle(); } void CRectAxisPage::OnEnChangeEditAngle() { CString szAngle; m_editAngle.GetWindowText(szAngle); double dAngle = PI/2 - _tstof(szAngle)*PI/180; dAngle = atan(tan(dAngle)); if(fabs(fabs(dAngle) - PI/2) > AXIS_PEC) m_dAngle = dAngle; UpdatePreview(); } void CRectAxisPage::OnBnClickedButtonPick() { // 拾取尺寸对象,获取尺寸数据 CAxisGridSheet* pSheet = (CAxisGridSheet*)GetParent(); CArray arData; pSheet->PickDimensions(kRect, arData); // 将数据添加到编辑框 AddDataToInputEdit(arData); // 更新 OnEnKillfocusEditInput(); } void CRectAxisPage::InitList() { m_list.ResetContent(); for(int i=0; i &lstSize = GetSizeDesc(); if(!lstSize.IsEmpty() && lstSize[0]->m_nPosition == -1) bBack = TRUE; else bBack = FALSE; int nPos; double dOffset; GetOffset(lstSize, nPos, dOffset); double dDesc = 0.0; PDList &lstCorre = GetCorreDesc(); for(lstCorre.MoveToFirst(); !lstCorre.IsOut(); lstCorre.MoveToNext()) dDesc += lstCorre.GetCurData()->m_dSize * lstCorre.GetCurData()->m_nCount; if(dOffset - dDesc < -AXIS_PEC) bForward = TRUE; else bForward = FALSE; m_buttonForward.EnableWindow(bForward); m_buttonBack.EnableWindow(bBack); m_editOffset.EnableWindow(bForward || bBack); } void CRectAxisPage::ComeBack() { ImportFromFile(); UpdateEditDis(); UpdateGrid(); UpdatePreview(); UpdateEditInput(); UpdateEditAngle(); UpdateEditOffset(); UpdateVisible(); } PDList &CRectAxisPage::GetCorreDesc() { if(m_nRadio==0) return m_lstDown; else if(m_nRadio==1) return m_lstUp; else if(m_nRadio==2) return m_lstRight; else return m_lstLeft; } PDList &CRectAxisPage::GetCurrentDesc() { if(m_nRadio==1) return m_lstDown; else if(m_nRadio==0) return m_lstUp; else if(m_nRadio==3) return m_lstRight; else return m_lstLeft; } void CRectAxisPage::GetOffset(PDList &lstSize, int &nPos, double &dOffset) { nPos = -1; dOffset = 0.0; for(int i=0; im_nPosition == 0) break; nPos = i; dOffset += pSize->m_dSize * pSize->m_nCount; } } void CRectAxisPage::ReplaceOffset(PDList &lstSize) { double dSize = 0.0; for(lstSize.MoveToFirst(); !lstSize.IsOut(); lstSize.MoveToNext()) { TCountAndSize *pSize = lstSize.GetCurData(); if(pSize->m_nPosition == -1) { dSize += pSize->m_dSize; lstSize.DelCur(); } } if(dSize > AXIS_PEC) lstSize.InsertHead(new TCountAndSize(dSize, 1, 0)); } void CRectAxisPage::GetEditDisValue() { m_dDisX = max(TotalDistance(m_lstDown), TotalDistance(m_lstUp)); m_dDisY = max(TotalDistance(m_lstLeft), TotalDistance(m_lstRight)); } int CRectAxisPage::InsertToCSpace() { m_bPreview = FALSE; int iTileMode=0; VERIFY(xg_getvar(_T("TILEMODE"), &iTileMode)==RTNORM); // add by xlc on 071226 int cvport=0; VERIFY(xg_getvar(_T("CVPORT"), &cvport)==RTNORM); PickSet ss(SS_FREE); ss.IncludeBegin(); AcDbBlockTable *pTable = NULL; acdbHostApplicationServices()->workingDatabase() ->getSymbolTable(pTable, AcDb::kForRead); AcDbBlockTableRecord *pBlockTableRecord = NULL; // modify by xlc on 071226 //pTable->getAt((iTileMode==0)?ACDB_PAPER_SPACE:ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite); pTable->getAt((iTileMode==0 && cvport==1)?ACDB_PAPER_SPACE:ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite); pTable->close(); DrawEntity(pBlockTableRecord); pBlockTableRecord->close(); ss.IncludeEnd(); int nRet = DragPickSet(ss, m_ptIns); if(nRet != RTNORM) ss.Delete(); else ExportToFile(); return nRet; } BOOL CRectAxisPage::DrawEntity(AcDbBlockTableRecord *&pBlockTableRecord) { BOOL bRetX = DrawAxis(pBlockTableRecord, 0); BOOL bRetY = DrawAxis(pBlockTableRecord, 1); if(!bRetX && !bRetY) return FALSE; else return TRUE; } BOOL CRectAxisPage::DrawAxis(AcDbBlockTableRecord *&pBlockTableRecord, int nDir) { PDList lstOne, lstAnother; double dDrt, dAxisDir, dAxisLen; double dBaseDist = g_dBaseDist; if(nDir==0) { CopyPDList(m_lstLeft, lstOne); CopyPDList(m_lstRight, lstAnother); if(lstOne.IsEmpty() && lstAnother.IsEmpty()) return FALSE; dAxisLen = GetAxisLenX(); dAxisDir = m_dAngle; dDrt = CT_std_angle(dAxisDir+PI/2); if(m_dAngle < 0) dBaseDist += m_dDisY * fabs(tan(m_dAngle)); } else { CopyPDList(m_lstDown, lstOne); CopyPDList(m_lstUp, lstAnother); if(lstOne.IsEmpty() && lstAnother.IsEmpty()) return FALSE; dAxisLen=GetAxisLenY(); dAxisDir = PI/2.0; dDrt=CT_std_angle(dAxisDir-PI/2.0); if(m_dAngle < 0) dBaseDist += m_dDisX * fabs(tan(m_dAngle)); } ReplaceOffset(lstOne); ReplaceOffset(lstAnother); int nFrontColor=1; if(m_bPreview) nFrontColor = (nDir==1) ? 1 : 3; XPoint pt1, pt2; XPoint ptBase = m_ptIns; ads_polar(ptBase, dAxisDir + PI, dBaseDist, pt1); ads_polar(pt1, dAxisDir, dAxisLen, pt2); ptBase = pt1; AcDbLine *pline = new AcDbLine; if(m_bPreview) { pline->setStartPoint(pt1.AsAcGePoint3d()); pline->setEndPoint(pt2.AsAcGePoint3d()); pline->setColorIndex(nFrontColor); } else { pline->setStartPoint(Ucs2Wcs(pt1).AsAcGePoint3d()); pline->setEndPoint(Ucs2Wcs(pt2).AsAcGePoint3d()); pline->setLayer(InitLayer(LAY_AXIS)); } if(pBlockTableRecord->appendAcDbEntity(pline) == Acad::eOk) pline->close(); else delete pline; PDList lstDistSize; // 下开间 double nDistBeg=0; Disperse(nDistBeg, lstOne, lstDistSize); int nK = (lstAnother.IsEmpty()) ? 3:1; DList lstDistAndKind; for(int n=0; nnKind += nK; else lstDistAndKind.Append(new TAxisDistAndKind(lstDistSize(n), nK)); } lstDistAndKind.QuickSort(TAxisDistAndKind::CompareForSort); if(!lstDistAndKind) return FALSE; lstDistAndKind.Tail()->nKind = 3; //最后一根轴线, 自动贯通 for(n=0; nsetStartPoint(pt1.AsAcGePoint3d()); pline->setEndPoint(pt2.AsAcGePoint3d()); pline->setColorIndex(iColor); } else { pline->setStartPoint(Ucs2Wcs(pt1).AsAcGePoint3d()); pline->setEndPoint(Ucs2Wcs(pt2).AsAcGePoint3d()); pline->setLayer(InitLayer(LAY_AXIS)); } if(pBlockTableRecord->appendAcDbEntity(pline) == Acad::eOk) pline->close(); else delete pline; } return TRUE; } // X方向的轴线 double CRectAxisPage::GetAxisLenX() { double dDisX = (m_dDisX < AXIS_PEC) ? m_dDisY : m_dDisX; double dDisY = (m_dDisY < AXIS_PEC) ? m_dDisX : m_dDisY; double nDistMe = dDisY / cos(m_dAngle) + dDisX * fabs(tan(m_dAngle)); if(m_lstDown.IsEmpty() && m_lstUp.IsEmpty()) { if(!m_bPreview) GetDist(_T("\n单向轴线长度"), nDistMe, RSG_NONEG|RSG_NOZERO); } else nDistMe = dDisX / cos(m_dAngle) + dDisY * fabs(tan(m_dAngle)); nDistMe += g_dBaseDist*2; return nDistMe; } // Y方向的轴线 double CRectAxisPage::GetAxisLenY() { double dDisX = (m_dDisX < AXIS_PEC) ? m_dDisY : m_dDisX; double dDisY = (m_dDisY < AXIS_PEC) ? m_dDisX : m_dDisY; double nDistMe = dDisX / cos(m_dAngle) + dDisY * fabs(tan(m_dAngle)); if(m_lstLeft.IsEmpty() && m_lstRight.IsEmpty()) { if(!m_bPreview) GetDist(_T("\n单向轴线长度"), nDistMe, RSG_NONEG|RSG_NOZERO); } else nDistMe = dDisY / cos(m_dAngle) + dDisX * fabs(tan(m_dAngle)); nDistMe += g_dBaseDist*2; return nDistMe; } BOOL CRectAxisPage::AddToCList(double dSize, int nCount) { TCountAndSize *pCas = new TCountAndSize(dSize, nCount); GetSizeDesc().AddTail(pCas); return TRUE; } PDList & CRectAxisPage::GetSizeDesc() { return GetSizeDesc(m_nRadio); } PDList & CRectAxisPage::GetSizeDesc(int n) { if(n==0) return m_lstUp; else if(n==1) return m_lstDown; else if(n==2) return m_lstLeft; else return m_lstRight; } void CRectAxisPage::ImportFromFile() { XString sFileName(256); GetTempPath(255, sFileName); sFileName << _T("tch.rax"); #if (ADS>15) std:: #endif ifstream in(sFileName); if(!in) return; char szTit[256]=""; in.getline(szTit, 255); if(strcmp(szTit, _AS(s_szFileTitle))!=0) return; m_lstLeft.Clear(); m_lstRight.Clear(); m_lstUp.Clear(); m_lstDown.Clear(); CString sName; while(!(!in)) { char buf[256]=""; in >> buf; XString sContent((LPCTSTR)TString((const char*)buf)); if(!sContent || sContent[0]==_T('[')) { sName = sContent; continue; } if(sName == _T("[Up]")) { int nCount; double dSize; if(_stscanf(sContent, _T("%d*%lf"), &nCount, &dSize) != 2) return; m_lstUp.AddTail(new TCountAndSize(dSize, nCount)); } else if(sName == _T("[Down]")) { int nCount; double dSize; if(_stscanf(sContent, _T("%d*%lf"), &nCount, &dSize) != 2) return; m_lstDown.AddTail(new TCountAndSize(dSize, nCount)); } else if(sName == _T("[Left]")) { int nCount; double dSize; if(_stscanf(sContent, _T("%d*%lf"), &nCount, &dSize) != 2) return; m_lstLeft.AddTail(new TCountAndSize(dSize, nCount)); } else if(sName == _T("[Right]")) { int nCount; double dSize; if(_stscanf(sContent, _T("%d*%lf"), &nCount, &dSize) != 2) return; m_lstRight.AddTail(new TCountAndSize(dSize, nCount)); } else if(sName == _T("[Angle]")) { if(_stscanf(sContent, _T("%lf"), &m_dAngle) != 1) return; } } } void CRectAxisPage::ExportToFile() { ReplaceOffset(GetSizeDesc()); XString sFileName(256); GetTempPath(255, sFileName); sFileName << _T("tch.rax"); #if (ADS>15) std:: #endif ofstream out(sFileName); if(!out) { return; } out << _AS(s_szFileTitle) << "\n"; // 下开间 out << "[Down]\n"; for(int i=0; i=48&&(int)str.GetAt(i)<=57))//0~9之间, continue; else if(str.GetAt(i)=='.') { if(bFloatFlag) { bNumFlag = false; break; } else { bFloatFlag = true; continue; } } else //发现任意其他非法字符出现 { bNumFlag = false; break; } } return bNumFlag; } void CArcAxisPage::OnEnChangeEditRadius() { // [12/6/2007 nsh] CString sRadius; this->GetDlgItemText(IDC_EDIT_RADIUS, sRadius); //modify by xlc on 090602 为空时失去焦点后提示(输入过程允许为空) //if(sRadius == "") //{ // ::AfxMessageBox(_T("请输入一个数值!")); // this->UpdateData(FALSE); //} // add by xly on 100811 解决输入的第一位是小数点的时候崩溃 sRadius.TrimLeft(); sRadius.TrimRight(); if (sRadius.GetLength() > 0) { // 第一位是小数点 if (sRadius.GetAt(0) == _T('.')) { MessageBox(_T("内弧半径请输入一个数值!")); sRadius.Remove( _T('.')); // 更新编辑框 m_editRadius.Clear(); UpdateData(FALSE); } } if (sRadius!=_T("") && IsFloat(sRadius)) { // delete by xly on 100810 内弧半径不能为零的修改,取消这个判断 // modify by xlc on 090525圆弧轴网半径为00时崩溃 /*if (_tstof(sRadius)<_DIST_SNAP) { return; }*/ CDataExchange dx(this, TRUE); DDX_Text(&dx, IDC_EDIT_RADIUS, m_dInRadius); UpdatePreview(); } //else //{ // CString ss="3300"; // this->SetDlgItemText(IDC_EDIT_RADIUS,(LPTSTR)(LPCTSTR)ss); //} // } void CArcAxisPage::OnEnKFEditRadius() { if (GetDlgItem(IDCANCEL) != GetFocus()) { CString sRadius; this->GetDlgItemText(IDC_EDIT_RADIUS,sRadius); // modify by xly on 100811 解决输入负数软件死掉的问题 sRadius.TrimRight(); sRadius.TrimLeft(); // if(sRadius =="") if (sRadius ==_T("") || !IsFloat(sRadius)) { // ::AfxMessageBox(_T("请输入一个数值!")); MessageBox(_T("内弧半径请输入一个数值!")); UpdateData(FALSE); SetFocus(); } } } //-----------------------------------------------------end--------------------------------------------------------- void CArcAxisPage::OnBnClickedButtonInsert() { int nlimit = 4; if(fabs(m_dDisY) < AXIS_PEC) nlimit = 2; if(m_nPtInsert >= nlimit) m_nPtInsert = 0; else m_nPtInsert++; GetCenterPoint(); UpdatePreview(); } void CArcAxisPage::OnBnClickedButtonRadius() { double dRadius = 0; CString szInRadius; m_editRadius.GetWindowText(szInRadius); CAxisGridSheet *pSheet = (CAxisGridSheet*)GetParent(); if(pSheet == NULL) return; if(pSheet->GetInRadius(szInRadius, dRadius)); { m_dInRadius = dRadius; UpdateInRadius(); } } void CArcAxisPage::OnBnClickedButtonCommon() { if(m_bComAxis) { UpdateComonAxis( FALSE ); return; } CAxisGridSheet *pSheet = (CAxisGridSheet*)GetParent(); if(pSheet == NULL || !pSheet->GetComAxisLine()) { UpdateComonAxis( FALSE ); return; } m_nPtInsert = 1; CDataExchange dx(this, FALSE); DDX_Radio(&dx, IDC_RADIO_ANTICLOCKWISE, m_nClockWise); if(m_nCenter == 1) { UpdateGrid(); UpdateEditInput(); } UpdateComonAxis( TRUE ); UpdateEditDis(); UpdateEditAngle(); UpdatePreview(); } void CArcAxisPage::OnBnClickedButtonPick() { // 拾取尺寸对象,获取尺寸数据 CAxisGridSheet* pSheet = (CAxisGridSheet*)GetParent(); CArray arData; if (m_nCenter == 0) // 拾取角度 { pSheet->PickDimensions(kArc, arData); } else // 拾取长度 { pSheet->PickDimensions(kRect, arData); } // 将数据添加到编辑框 AddDataToInputEdit(arData); // 更新 OnEnKillfocusEditInput(); } void CArcAxisPage::InitList() { UpdateList(); } void CArcAxisPage::UpdateList() { m_list.ResetContent(); if(m_nCenter == 0) { for(int i=0; iSetCheck(bComAxis); GetDlgItem(IDC_EDIT_ANGLE)->EnableWindow(!bComAxis); GetDlgItem(IDC_SPIN_ANGLE)->EnableWindow(!bComAxis); GetDlgItem(IDC_BUTTON_INSERT)->EnableWindow(!bComAxis); } void CArcAxisPage::ComeBack() { ImportFromFile(); UpdateEditDis(); UpdateGrid(); UpdatePreview(); UpdateEditInput(); UpdateEditAngle(); UpdateInRadius(); UpdateClockWise(); } void CArcAxisPage::GetEditDisValue() { m_dDisX = TotalDistance(m_lstArc); m_dDisY = TotalDistance(m_lstRadius); } BOOL CArcAxisPage::AddToCList(double dSize, int nCount) { PDList &lstCur = GetSizeDesc(); if(m_nCenter == 0 ) { double dTotal = TotalDistance(lstCur); dTotal += dSize * nCount; if(dTotal -360 > AXIS_PEC) { MessageBox(_T("总角度不能超过360度!")); return FALSE; } } TCountAndSize *pCas = new TCountAndSize(dSize, nCount); GetSizeDesc().AddTail(pCas); return TRUE; } PDList & CArcAxisPage::GetSizeDesc() { return GetSizeDesc(m_nCenter); } PDList & CArcAxisPage::GetSizeDesc(int n) { if(n==0) return m_lstArc; else return m_lstRadius; } void CArcAxisPage::CopyPropertiesFrom(CArcAxisPage *pSource) { m_dDisX = pSource->m_dDisX; m_dDisY = pSource->m_dDisY; m_dAngle = pSource->m_dAngle; m_nClockWise = pSource->m_nClockWise; m_ptIns = pSource->m_ptIns; m_dInRadius = pSource->m_dInRadius; m_lstArc.Clear(); m_lstRadius.Clear(); CopyPDList(pSource->m_lstArc, m_lstArc); CopyPDList(pSource->m_lstRadius, m_lstRadius); } int CArcAxisPage::InsertToCSpace() { m_bPreview = FALSE; int iTileMode=0; VERIFY(xg_getvar(_T("TILEMODE"), &iTileMode)==RTNORM); // add by xlc on 090410 图纸空间激活窗口绘制圆弧轴网 int cvport=0; VERIFY(xg_getvar(_T("CVPORT"), &cvport)==RTNORM); PickSet ss(SS_FREE); ss.IncludeBegin(); AcDbBlockTable *pTable = NULL; acdbHostApplicationServices()->workingDatabase() ->getSymbolTable(pTable, AcDb::kForRead); AcDbBlockTableRecord *pBlockTableRecord = NULL; // modify by xlc on 090410 //pTable->getAt((iTileMode==0)?ACDB_PAPER_SPACE:ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite); pTable->getAt((iTileMode==0 && cvport==1)?ACDB_PAPER_SPACE:ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite); pTable->close(); DrawEntity(pBlockTableRecord); pBlockTableRecord->close(); ss.IncludeEnd(); int nRet = RTNORM; if(!m_bComAxis) { TADSGePoint3d pt(Wcs2Ucs(m_ptIns)); nRet = DragPickSet(ss, pt); if(nRet != RTNORM) ss.Delete(); else ExportToFile(); } else { m_bComAxis = FALSE; ExportToFile(); } return nRet; } BOOL CArcAxisPage::DrawEntity(AcDbBlockTableRecord *&pBlockTabRecord) { GetCenterPoint(); BOOL bArc = DrawAxisArc(pBlockTabRecord); BOOL bLine = DrawAxisLine(pBlockTabRecord); if(m_bPreview) DrawCircleCenter(pBlockTabRecord); if(!bArc && !bLine) return FALSE; else return TRUE; } BOOL CArcAxisPage::DrawAxisArc(AcDbBlockTableRecord *&pBlockTabRecord) { if(m_lstArc.IsEmpty()) return FALSE; double dTotalAngle = m_dDisX; double dStartAng, dEndAng; if(m_nClockWise == 1) { dStartAng=CT_std_angle((m_dAngle-dTotalAngle)*PI/180.0); dEndAng = m_dAngle*PI/180.0; } else { dStartAng = m_dAngle*PI/180.0; dEndAng = CT_std_angle((m_dAngle+dTotalAngle)*PI/180.0); } // [1/14/2008 nsh] //dStartAng=CT_std_angle(dStartAng-1E-15); //dEndAng=CT_std_angle(dEndAng+1E-15); // [2010-4-19 wubo] 圆弧出头长度变为原来的十分之一 //dStartAng=CT_std_angle(dStartAng-_DIST_SNAP/m_dInRadius); //dEndAng=CT_std_angle(dEndAng+_DIST_SNAP/m_dInRadius); // modify by xly on 100810 内弧半径为零时发生崩溃,因为这个计算分母不能为:0_DIST_SNAP/m_dInRadius/10 // 增加一个为零的判断 // dStartAng=CT_std_angle(dStartAng-_DIST_SNAP/m_dInRadius/10); // dEndAng=CT_std_angle(dEndAng+_DIST_SNAP/m_dInRadius/10); if (fabs(m_dInRadius) < _DIST_SNAP) // 半径为0 { dStartAng=CT_std_angle(dStartAng); dEndAng=CT_std_angle(dEndAng); } else // 半径不为0 { dStartAng=CT_std_angle(dStartAng-_DIST_SNAP/m_dInRadius/10); dEndAng=CT_std_angle(dEndAng+_DIST_SNAP/m_dInRadius/10); } if(!m_bPreview) { dStartAng += Ucs2Wcs(0); dEndAng += Ucs2Wcs(0); } int nColor = 3; AcDbObjectId idLayer = InitLayer(LAY_AXIS); BOOL bCircle = (fabs(TotalDistance(m_lstArc)-360) < AXIS_PEC); // 绘制起始弧线 if(m_dInRadius>_DIST_SNAP) { if(bCircle) { AcDbCircle *pCircle = new AcDbCircle(m_ptCenter, AcGeVector3d::kZAxis, m_dInRadius); if(m_bPreview) pCircle->setColorIndex(nColor); else pCircle->setLayer(idLayer); pBlockTabRecord->appendAcDbEntity(pCircle); pCircle->close(); } else { AcDbArc *pArc = new AcDbArc(m_ptCenter, AcGeVector3d::kZAxis, m_dInRadius, dStartAng, dEndAng); if(m_bPreview) pArc->setColorIndex(nColor); else pArc->setLayer(idLayer); pBlockTabRecord->appendAcDbEntity(pArc); pArc->close(); } } PDList lstSizes; Disperse(m_dInRadius, m_lstRadius, lstSizes); for(int i=0; isetColorIndex(nColor); else pCircle->setLayer(idLayer); pBlockTabRecord->appendAcDbEntity(pCircle); pCircle->close(); } else { AcDbArc *pArc = new AcDbArc(m_ptCenter, AcGeVector3d::kZAxis, *lstSizes[i], dStartAng, dEndAng); if(m_bPreview) pArc->setColorIndex(nColor); else pArc->setLayer(idLayer); pBlockTabRecord->appendAcDbEntity(pArc); pArc->close(); } } return TRUE; } BOOL CArcAxisPage::DrawAxisLine(AcDbBlockTableRecord *&pBlockTabRecord) { if(m_lstArc.IsEmpty()) return FALSE; double dTotalRadius=1000.0; if(m_lstRadius.IsEmpty()) { if(!m_bPreview) GetDist(_T("\n单向轴线长度"), dTotalRadius, RSG_NONEG|RSG_NOZERO); else dTotalRadius = 1000.0; } else dTotalRadius = TotalDistance(m_lstRadius); int nColor = 1; AcDbObjectId idLayer = InitLayer(LAY_AXIS); BOOL bCircle = (fabs(TotalDistance(m_lstArc)-360) < AXIS_PEC); double dStartRadius = m_dInRadius - g_dBaseDist; if(dStartRadius < AXIS_PEC) dStartRadius=100; double dEndRadius = m_dInRadius + dTotalRadius + g_dBaseDist; // 绘制起始线 XPoint pt1, pt2; double dStartAng=m_dAngle*PI/180.0; if(!m_bPreview) dStartAng += Ucs2Wcs(0); if(m_bPreview || !m_bComAxis || bCircle) { ads_polar(m_ptCenter, dStartAng, dStartRadius, pt1); ads_polar(m_ptCenter, dStartAng, dEndRadius, pt2); AcDbLine *pline = new AcDbLine(pt1, pt2); if(m_bPreview) pline->setColorIndex(nColor); else pline->setLayer(idLayer); pBlockTabRecord->appendAcDbEntity(pline); pline->close(); } PDList lstAngles; Disperse(0, m_lstArc, lstAngles); int len=lstAngles.GetDataNum(); if(bCircle) len--; for(int i=0; isetColorIndex(nColor); else pline->setLayer(idLayer); pBlockTabRecord->appendAcDbEntity(pline); pline->close(); } return TRUE; } BOOL CArcAxisPage::DrawCircleCenter(AcDbBlockTableRecord *&pBlockTabRecord) { double dWidth = 0.05 * (m_dInRadius + m_dDisY); XPoint ptSta1 = m_ptCenter + XPoint(dWidth, 0, 0); XPoint ptEnd1 = m_ptCenter + XPoint(-dWidth, 0, 0); AcDbLine *pline1 = new AcDbLine(ptSta1, ptEnd1); pline1->setColorIndex(3); pBlockTabRecord->appendAcDbEntity(pline1); pline1->close(); XPoint ptSta2 = m_ptCenter + XPoint(0, dWidth, 0); XPoint ptEnd2 = m_ptCenter + XPoint(0, -dWidth, 0); AcDbLine *pline2 = new AcDbLine(ptSta2, ptEnd2); pline2->setColorIndex(3); pBlockTabRecord->appendAcDbEntity(pline2); pline2->close(); return TRUE; } XPoint CArcAxisPage::GetCenterPoint() { double dTotalAngle = m_dDisX; double dStartAng, dEndAng; if(m_nClockWise == 1) { dStartAng = m_dAngle*PI/180.0; dEndAng = CT_std_angle((m_dAngle-dTotalAngle)*PI/180.0); } else { dStartAng = m_dAngle*PI/180.0; dEndAng = CT_std_angle((m_dAngle+dTotalAngle)*PI/180.0); } dStartAng=CT_std_angle(dStartAng-1E-15); dEndAng=CT_std_angle(dEndAng+1E-15); if(!m_bPreview) { dStartAng += Ucs2Wcs(0); dEndAng += Ucs2Wcs(0); } switch(m_nPtInsert) { case 0: m_ptCenter = m_ptIns; break; case 1: ads_polar(m_ptIns, dStartAng, -m_dInRadius, m_ptCenter); break; case 2: { if(fabs(m_dDisY) > AXIS_PEC) ads_polar(m_ptIns, dStartAng, -(m_dInRadius+m_dDisY), m_ptCenter); else ads_polar(m_ptIns, dEndAng, -m_dInRadius, m_ptCenter); } break; case 3: ads_polar(m_ptIns, dEndAng, -(m_dInRadius+m_dDisY), m_ptCenter); break; case 4: ads_polar(m_ptIns, dEndAng, -m_dInRadius, m_ptCenter); break; default: break; } return m_ptCenter; } void CArcAxisPage::ImportFromFile() { XString sFileName(256); GetTempPath(255, sFileName); sFileName << _T("tch.aax"); #if (ADS>15) std:: #endif ifstream in(sFileName); if(!in) { return; } char szTit[256]=""; in.getline(szTit, 255); if(strcmp(szTit, _AS(s_szFileTitle))!=0) { return; } m_lstArc.Clear(); m_lstRadius.Clear(); in >> m_dInRadius; in >> m_dAngle; in >> m_nClockWise; in >> m_nPtInsert; // 下开间 int i=0; char buf[256]=""; in >> buf; XString sSectionTitle((LPCTSTR)TString((const char*)buf)); if(sSectionTitle!=_T("[Arc]")) { return; } for(i=0; i<2; i++) { PDList &lstDesc=GetSizeDesc(i); while(!(!in)) { char buf1[256]=""; in >> buf1; XString sContent((LPCTSTR)TString((const char*)buf1)); if(!sContent || sContent[0]==_T('[')) break; int nCount; double dSize; if(_stscanf(sContent, _T("%d*%lf"), &nCount, &dSize)!=2) { return; } lstDesc.AddTail(new TCountAndSize(dSize, nCount)); } } } void CArcAxisPage::ExportToFile() { XString sFileName(256); GetTempPath(255, sFileName); sFileName << _T("tch.aax"); #if (ADS>15) std:: #endif ofstream out(sFileName); if(!out) return; out << _AS(s_szFileTitle) << "\n"; out << m_dInRadius << "\n"; out << m_dAngle << "\n"; out << m_nClockWise << "\n"; out << m_nPtInsert << "\n"; // 开间 out << "[Arc]\n"; for(int i=0; i &lstCurrent = GetSizeDesc(); for(int i=0; im_nPosition == 0) { WDGridRow *pRow = new WDGridRow(m_grid); CString sText; // 总位数为7 sText.Format(_T("%.0f"), pCAS->m_dSize); int iIntPartLen = sText.GetLength(); int iDecPartLen = (6 - iIntPartLen >= 0) ? 6 - iIntPartLen : 0; sText.Format(_T("%.*f"), iDecPartLen, pCAS->m_dSize); sText.TrimRight(_T("0")); sText.TrimRight(_T(".")); (*pRow)[0].SetText(sText); (*pRow)[1].SetText(XString(_T("%d"), pCAS->m_nCount)); m_grid.AppendRow(pRow); } } } else { CAxisBasePage::UpdateGrid(); } } // [2010-4-2 wubo] 重载虚函数,使总长度显示3位小数 void CArcAxisPage::UpdateEditDis() { GetEditDisValue(); CString szDisX, szDisY; szDisX.Format(_T("%.3f"), m_dDisX); szDisX.TrimRight(_T("0")); szDisX.TrimRight(_T(".")); szDisY.Format(_T("%.1f"), m_dDisY); szDisY.TrimRight(_T("0")); szDisY.TrimRight(_T(".")); CAxisGridSheet *pSheet = (CAxisGridSheet*)GetParent(); if(pSheet != NULL) pSheet->UpdateSize(szDisX, szDisY); } // [2010-4-2 wubo] 重载虚函数,使轴夹角可为小数,总位数为7 void CArcAxisPage::UpdateEditInput() { CString sText = _T(""); CString sTemp = _T(""); for(long i=0; i= 0) ? 6 - iIntPartLen : 0; sTemp = sText; if(nCount>1) { sText.Format(_T("%s%d*"), sTemp, nCount); } sTemp = sText; sText.Format(_T("%s%.*f"), sTemp, iDecPartLen, dSize); sText.TrimRight(_T("0")); sText.TrimRight(_T(".")); sText += _T(" "); } m_editInput.SetWindowText(sText); } ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // CAxisGridSheet int CAxisGridSheet::s_nPage = 0; IMPLEMENT_DYNAMIC(CAxisGridSheet, CAcUiTabMainDialog) CAxisGridSheet::CAxisGridSheet(CWnd* parent) :CAcUiTabMainDialog(CAxisGridSheet::IDD, parent) { } void CAxisGridSheet::DoDataExchange(CDataExchange* pDX) { CAcUiTabMainDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_TAB, m_tab); DDX_Control(pDX, IDC_STATIC_X, m_staticX); DDX_Control(pDX, IDC_STATIC_Y, m_staticY); } BEGIN_MESSAGE_MAP(CAxisGridSheet, CAcUiTabMainDialog) ON_WM_DESTROY() ON_BN_CLICKED(IDC_BUTTON_COMEBACK, OnBnClickedButtonComeback) ON_NOTIFY(TCN_SELCHANGE, IDC_TAB, OnTcnSelchangeTab) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CAxisGridSheet message handlers BOOL CAxisGridSheet::OnInitDialog() { BOOL bResult = CAcUiTabMainDialog::OnInitDialog(); SetAcadTabPointer(&m_tab); AddTab(0, _T("直线轴网"), CRectAxisPage::IDD, &m_pageRectAxis); AddTab(1, _T("圆弧轴网"), CArcAxisPage::IDD, &m_pageArcAxis); m_tab.SetActiveTab(s_nPage); if(m_tab.GetActiveTab() == 0) { m_staticX.SetWindowText(_T("总开间:")); m_pageRectAxis.UpdateEditDis(); } else { m_staticX.SetWindowText(_T("总夹角:")); m_pageArcAxis.UpdateEditDis(); } return bResult; } void CAxisGridSheet::OnTcnSelchangeTab(NMHDR *pNMHDR, LRESULT *pResult) { if(m_tab.GetActiveTab() == 0) { m_staticX.SetWindowText(_T("总开间:")); m_pageRectAxis.UpdateEditDis(); } else { m_staticX.SetWindowText(_T("总夹角:")); m_pageArcAxis.UpdateEditDis(); } *pResult = 0; } void CAxisGridSheet::OnBnClickedButtonComeback() { if(m_tab.GetActiveTab() == 0) m_pageRectAxis.ComeBack(); else m_pageArcAxis.ComeBack(); } void CAxisGridSheet::OnDestroy() { CAcUiTabMainDialog::OnDestroy(); s_nPage = m_tab.GetActiveTab(); } void CAxisGridSheet::OnOK() { BeginEditorCommand(); int nRet; if(m_tab.GetActiveTab() == 0) nRet = m_pageRectAxis.InsertToCSpace(); else nRet = m_pageArcAxis.InsertToCSpace(); if(nRet == RTCAN) CancelEditorCommand(); else if(nRet==RTNONE) CompleteEditorCommand(); else CAcUiTabMainDialog::OnOK(); } void CAxisGridSheet::UpdateSize(CString szDisX, CString szDisY) { CDataExchange dx(this, FALSE); DDX_Text(&dx, IDC_EDIT_HDIS, szDisX); DDX_Text(&dx, IDC_EDIT_VDIS, szDisY); } BOOL CAxisGridSheet::GetInRadius(const CString &szInRadius, double &dRadius) { BeginEditorCommand(); int nRet = acedGetDist(NULL, XString(_T("\n请输入内弧半径<%s>"), szInRadius), &dRadius); CompleteEditorCommand(); if(nRet == RTNORM) return TRUE; else return FALSE; } BOOL CAxisGridSheet::GetComAxisLine() { BeginEditorCommand(); if(!SelectAxisGrid()) { CompleteEditorCommand(); return FALSE; } CArcAxisPage *pArc = new CArcAxisPage; pArc->CopyPropertiesFrom(&m_pageArcAxis); pArc->m_bPreview = FALSE; pArc->m_nPtInsert = 1; if(pArc->m_lstArc.GetDataNum() == 0) { pArc->m_lstArc.AddTail(new TCountAndSize(30, 3)); pArc->UpdateEditDis(); } XLine line(*m_lstPoint.Head(), *m_lstPoint.Tail()); XPoint ptMid; ptMid = line.MidPoint(); ptMid = Wcs2Ucs(ptMid); double dRotate = line.Direction(); dRotate += Wcs2Ucs(0); m_nQuadrant = 0; PickSet ss(SS_FREE); // add by xlc on 090423 图纸空间弧形轴网共用轴线时无预览 int cvport=0; VERIFY(xg_getvar(_T("CVPORT"), &cvport)==RTNORM); while(1) { int type = 0; resbuf result; if (acedGrRead(13, &type, &result) != RTNORM) { ss.Erase(); delete pArc; CompleteEditorCommand(); return FALSE; } if (type != 5) { ss.Erase(); m_pageArcAxis.CopyPropertiesFrom(pArc); m_pageArcAxis.UpdateGrid(); m_pageArcAxis.UpdateEditInput(); break; } XPoint ptCur = result.resval.rpoint; if(GetQuadrant( ptCur, line, ptMid, dRotate, pArc )) { ss.Erase(); ss.IncludeBegin(); int iTileMode=0; VERIFY(xg_getvar(_T("TILEMODE"), &iTileMode)==RTNORM); AcDbBlockTable *pTable = NULL; acdbHostApplicationServices()->workingDatabase() ->getSymbolTable(pTable, AcDb::kForRead); AcDbBlockTableRecord *pBlockTableRecord = NULL; pTable->getAt((iTileMode==0&&cvport==1)?ACDB_PAPER_SPACE:ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite); pTable->close(); pArc->DrawEntity(pBlockTableRecord); pBlockTableRecord->close(); ss.IncludeEnd(); } } delete pArc; CompleteEditorCommand(); return TRUE; } BOOL CAxisGridSheet::SelectAxisGrid() { Entity ent; RBList rb(RTDXF0, _T("LINE"), 8, LAY_AXIS, NULL); if(ent.FilterSelect(_T("\n请拾取要共用的边界轴线 <返回>:"), rb) != RTNORM) return FALSE; OPENOBJ_BEGIN(ent, AcDb::kForRead, AcDbLine, pAxis); if(!pAxis) return FALSE; PickSet ss(SS_FREE); ss.Get(_T("X"), NULL, NULL, RBList(8, LAY_AXIS, NULL)); m_lstPoint.Reset(); for(long i=0; iintersectWith(pAxis, AcDb::kOnBothOperands, points); OPENOBJ_END(); if(points.length() > 0) m_lstPoint.Append(new XPoint(points[0])); } OPENOBJ_END(); if(m_lstPoint.Length() < 2) return FALSE; m_lstPoint.QuickSort(CmpAxisGridPoint); return TRUE; } int CAxisGridSheet::GetVectorPos( AcGeVector2d vec ) { int nPos = -1; vec = vec.normal(); double dAngle = vec.angle() * 180 / PI; if( dAngle > 0 && dAngle < 90 ) nPos = 1; else if( dAngle > 90 && dAngle < 180 ) nPos = 2; else if( dAngle > 180 && dAngle < 270 ) nPos = 3; else if( dAngle > 270 && dAngle < 360 ) nPos = 4; return nPos; } BOOL CAxisGridSheet::GetQuadrant(const XPoint &point, const XLine &line, const XPoint &ptMid, double dRotate, CArcAxisPage *pArc) { if(pArc == NULL) return FALSE; AcGeVector2d vec = point.AsAcGePoint2d() - ptMid.AsAcGePoint2d(); vec.rotateBy(PI/2 - dRotate); int nPos = GetVectorPos( vec ); if( nPos == 1 || nPos == 2 ) { if( m_nQuadrant != 1 && m_nQuadrant != 2 ) { pArc->m_lstRadius.Clear(); for(int i=0; iDistance2d(*m_lstPoint[i+1]); pArc->m_lstRadius.AddTail(new TCountAndSize(dDis, 1)); } pArc->m_lstRadius.ReverseList(); pArc->m_ptIns = line.EndPoint(); pArc->m_dAngle = dRotate*180/PI + 180; } pArc->m_nClockWise = (nPos == 1) ? 0 : 1; m_nQuadrant = nPos; } else if( nPos == 3 || nPos == 4 ) { if( m_nQuadrant != 3 && m_nQuadrant != 4 ) { pArc->m_lstRadius.Clear(); for(int i=0; iDistance2d(*m_lstPoint[i+1]); pArc->m_lstRadius.AddTail(new TCountAndSize(dDis, 1)); } pArc->m_ptIns = line.StartPoint(); pArc->m_dAngle = dRotate*180/PI; } pArc->m_nClockWise = (nPos == 3) ? 0 : 1; m_nQuadrant = nPos + 2; } return TRUE; } // add by zyc 20120419 拾取标注对象并获得标注数据 int CAxisGridSheet::PickDimensions(CAxisBasePage::EDimType eType, CArray& arData) { BeginEditorCommand(); // 清空初始选择集 g_ssPickFirst.Free(); // 拾取对象 TPickEntSet set; TRBList mask(RTDXF0, _T("ATS_DIMENSION2,DIMENSION"), NULL); int iRet = RTNORM; while(1) { iRet = SelectEntities(_T("\n请选择表示轴网尺寸的标注<返回>:"), set, mask); if (RTNORM != iRet) { CompleteEditorCommand(); return iRet; } // 将选择集保存到链表 AcDbObjectIdArray arObjId; set.AsIdArray(arObjId); std::vector lstOjbId; for (int i=0; i& lstObjId) { std::vector::iterator iter; std::vector lstTemp; lstTemp.assign(lstObjId.begin(), lstObjId.end()); lstObjId.clear(); for (iter = lstTemp.begin(); iter != lstTemp.end(); iter++) { OPENOBJ_BEGIN(*iter, AcDb::kForRead, AcDbEntity, pDim); if (pDim) { // cad角度标注 if (pDim->isKindOf(AcDb3PointAngularDimension::desc()) || pDim->isKindOf(AcDb2LineAngularDimension::desc())) // add by zyc 120611 cad角度标注 { if (CArcAxisPage::kRect == eType) { continue; } lstObjId.push_back(*iter); continue; } // cad对齐标注、转角标注 if (pDim->isKindOf(AcDbAlignedDimension::desc()) || pDim->isKindOf(AcDbRotatedDimension::desc())) { if (CArcAxisPage::kArc == eType) { continue; } lstObjId.push_back(*iter); continue; } // 上华连续标注 if (pDim->isKindOf(TDbDimension2::desc())) { TDbDimension2* pTDim = (TDbDimension2*)pDim; if (NULL != pTDim) { if (pTDim->IsAngular() && !pTDim->IsDimArcLen() && !pTDim->IsDimChord() && CArcAxisPage::kRect==eType) { continue; } else if(!pTDim->IsAngular() && CArcAxisPage::kArc==eType) { continue; } } if (!pTDim->IsDimArcLen() && !pTDim->IsDimChord()) { lstObjId.push_back(*iter); } continue; } } OPENOBJ_END(); } return TRUE; } // add by zyc 20120419 检查标注对象是否共线 BOOL CAxisGridSheet::IsCollinear(CArcAxisPage::EDimType eType, std::vector& vtObjId) { AcGeLine3d lineBase; if (CArcAxisPage::kRect == eType) { // 对线性标注进行共线检查 // 获取第一个标注对象尺寸线所在的直线 OPENOBJ_BEGIN(vtObjId.front(), AcDb::kForRead, AcDbEntity, pDim); if (pDim) { if (pDim->isKindOf(TDbDimension2::desc())) { TDbDimension2* pTDim = (TDbDimension2*)pDim; TGGeCurveSegment seg = pTDim->GetDimCurve(); TGGeLine line = seg.GetLine(); lineBase.set((AcGePoint3d)line.StartPoint(), (AcGePoint3d)line.EndPoint()); } else if(pDim->isKindOf(AcDbAlignedDimension::desc())) { AcDbAlignedDimension* pDimAligned = (AcDbAlignedDimension*)pDim; AcGePoint3d pt1 = pDimAligned->xLine1Point(); AcGePoint3d pt2 = pDimAligned->xLine2Point(); lineBase = AcGeLine3d(pDimAligned->dimLinePoint(), AcGeVector3d(pt1.x-pt2.x, pt1.y-pt2.y, pt1.z-pt2.z)); } else if(pDim->isKindOf(AcDbRotatedDimension::desc())) { AcDbRotatedDimension* pDimRotate = (AcDbRotatedDimension*)pDim; // 获取标注的旋转角 double dAngle = pDimRotate->rotation(); if (dAngle >= PI) { dAngle -= PI; } // 直线的方向向量 AcGeVector3d vtDir; if (dAngle == PI/2) { vtDir.set(0, 1, 0); } else { vtDir.set(1, tan(dAngle), 0); } lineBase = AcGeLine3d(pDimRotate->dimLinePoint(), vtDir); } } OPENOBJ_END(); // 依次判断之后的标注对象是否在先前的直线上 std::vector::iterator iter = vtObjId.begin(); iter++; AcGeLine3d line; for (;iter!=vtObjId.end(); iter++) { OPENOBJ_BEGIN(*iter, AcDb::kForRead, AcDbEntity, pDim); if (pDim) { if (pDim->isKindOf(TDbDimension2::desc())) { TDbDimension2* pTDim = (TDbDimension2*)pDim; // 获取尺寸线所在直线 TGGeCurveSegment seg = pTDim->GetDimCurve(); TGGeLine lineTemp = seg.GetLine(); line.set((AcGePoint3d)lineTemp.StartPoint(), (AcGePoint3d)lineTemp.EndPoint()); // 获取尺寸线上的点 XPoly2D poly; pTDim->GetPolySegOnDimLine(poly); if (Adesk::kTrue != lineBase.isOn((AcGePoint3d)(*poly[0])) || Adesk::kTrue != lineBase.isColinearTo(line)) { return FALSE; } } else if(pDim->isKindOf(AcDbAlignedDimension::desc())) { AcDbAlignedDimension* pDimAligned = (AcDbAlignedDimension*)pDim; // 获取尺寸线所在的直线 AcGePoint3d pt1 = pDimAligned->xLine1Point(); AcGePoint3d pt2 = pDimAligned->xLine2Point(); line = AcGeLine3d(pDimAligned->dimLinePoint(), AcGeVector3d(pt1.x-pt2.x, pt1.y-pt2.y, pt1.z-pt2.z)); if (Adesk::kTrue != lineBase.isOn(pDimAligned->dimLinePoint()) || Adesk::kTrue != lineBase.isColinearTo(line)) { return FALSE; } } else if(pDim->isKindOf(AcDbRotatedDimension::desc())) { AcDbRotatedDimension* pDimRotate = (AcDbRotatedDimension*)pDim; // 获取尺寸线所在的直线 // 获取标注的旋转角 double dAngle = pDimRotate->rotation(); if (dAngle >= PI) { dAngle -= PI; } // 直线的方向向量 AcGeVector3d vtDir; if (dAngle == PI/2) { vtDir.set(0, 1, 0); } else { vtDir.set(1, tan(dAngle), 0); } line = AcGeLine3d(pDimRotate->dimLinePoint(), vtDir); if (Adesk::kTrue != lineBase.isOn(pDimRotate->dimLinePoint()) || Adesk::kTrue != lineBase.isColinearTo(line)) { return FALSE; } } } OPENOBJ_END(); } } else { // 对角度标注进行共线检查 // 获取第一个标注对象的圆心和半径 AcGePoint3d ptCenter; double dRadius = 0; OPENOBJ_BEGIN(vtObjId.front(), AcDb::kForRead, AcDbEntity, pDim); if (pDim) { if (pDim->isKindOf(TDbDimension2::desc())) { TDbDimension2* pTDim = (TDbDimension2*)pDim; XCurveSegment seg = pTDim->GetDimCurve(); TGGeArc arc = seg.GetArc(); ads_point pt; arc.Center(pt); ptCenter = asPnt3d(pt); dRadius = pTDim->GetDimRadius(); } else if(pDim->isKindOf(AcDb3PointAngularDimension::desc())) { AcDb3PointAngularDimension* pDimAngular = (AcDb3PointAngularDimension*)pDim; ptCenter = pDimAngular->centerPoint(); dRadius = ptCenter.distanceTo(pDimAngular->arcPoint()); } // add by zyc 120611 另一种cad角度标注 else if (pDim->isKindOf(AcDb2LineAngularDimension::desc())) { AcDb2LineAngularDimension* pDimAngular = (AcDb2LineAngularDimension*)pDim; AcGeLine3d line1(pDimAngular->xLine1Start(), pDimAngular->xLine1End()); AcGeLine3d line2(pDimAngular->xLine2Start(), pDimAngular->xLine2End()); if (line1.intersectWith(line2, ptCenter) == Adesk::kTrue) { dRadius = ptCenter.distanceTo(pDimAngular->arcPoint()); } } } OPENOBJ_END(); // 依次检查后面的标注对象圆心和半径是否匹配 std::vector::iterator iter = vtObjId.begin(); iter++; for (;iter!=vtObjId.end(); iter++) { OPENOBJ_BEGIN(*iter, AcDb::kForRead, AcDbEntity, pDim); if (pDim) { if (pDim->isKindOf(TDbDimension2::desc())) { TDbDimension2* pTDim = (TDbDimension2*)pDim; XCurveSegment seg = pTDim->GetDimCurve(); TGGeArc arc = seg.GetArc(); ads_point pt; arc.Center(pt); // modify by zyc 120612 浮点与0比较,忘记加fabs取绝对值 if (ptCenter != asPnt3d(pt) || fabs(dRadius-pTDim->GetDimRadius()) > _DIST_SNAP /*dRadius-pTDim->GetDimRadius() > _DIST_SNAP*/) { return FALSE; } } else if(pDim->isKindOf(AcDb3PointAngularDimension::desc())) { AcDb3PointAngularDimension* pDimAngular = (AcDb3PointAngularDimension*)pDim; AcGePoint3d pt = pDimAngular->centerPoint(); // modify by zyc 120612 浮点与0比较,忘记加fabs取绝对值 if (ptCenter != pt || fabs(dRadius - pt.distanceTo(pDimAngular->arcPoint())) > _DIST_SNAP /*dRadius - pt.distanceTo(pDimAngular->arcPoint()) > _DIST_SNAP*/) { return FALSE; } } // add by zyc 120611 另一种cad角度标注 else if (pDim->isKindOf(AcDb2LineAngularDimension::desc())) { AcDb2LineAngularDimension* pDimAngular = (AcDb2LineAngularDimension*)pDim; AcGeLine3d line1(pDimAngular->xLine1Start(), pDimAngular->xLine1End()); AcGeLine3d line2(pDimAngular->xLine2Start(), pDimAngular->xLine2End()); AcGePoint3d pt; double d = 0; line1.intersectWith(line2, pt); AcGePoint3d ptptt = pDimAngular->arcPoint(); double addf = dRadius - pt.distanceTo(pDimAngular->arcPoint()); // modify by zyc 120612 浮点与0比较,忘记加fabs取绝对值 if (ptCenter != pt || fabs(dRadius - pt.distanceTo(pDimAngular->arcPoint())) > _DIST_SNAP /*dRadius - pt.distanceTo(pDimAngular->arcPoint()) > _DIST_SNAP*/) { return FALSE; } } } OPENOBJ_END(); } } return TRUE; } // add by zyc 20120419 根据标注对象所在的位置进行排序,并提取标注对象的数据 BOOL CAxisGridSheet::SortDimensions(CArcAxisPage::EDimType eType, std::vector& vtObjId, CArray& arData) { // 排序 if (vtObjId.size() >= 2) { if (CArcAxisPage::kRect == eType) { std::sort(vtObjId.begin(), vtObjId.end(), SortDimRect); } else { std::sort(vtObjId.begin(), vtObjId.end(), SortDimArc); } } // 提取数据 double dDimData = 0; CString sText; std::vector::iterator iter; for (iter=vtObjId.begin(); iter!=vtObjId.end(); iter++) { OPENOBJ_BEGIN(*iter, AcDb::kForRead, AcDbEntity, pDim); if (pDim) { if (pDim->isKindOf(TDbDimension2::desc())) { TDbDimension2* pTDim = (TDbDimension2*)pDim; double dRotation = pTDim->GetRotation(); bool bInvert = false; // 使标注尺寸总是从左往右,从下往上输出 if (dRotation>PI/2 && dRotation<=PI*3/2) { bInvert = true; } TSubText* pText = NULL; int index; for (int i=0; iGetSegmentNum(); i++) { if (bInvert) { index = pTDim->GetSegmentNum() - i - 1; } else { index = i; } pText = pTDim->GetSubText(index); sText = pText->GetText(); dDimData = _tstof((LPCTSTR)sText); arData.Add(dDimData); } } else { AcDbDimension* pDimCad = (AcDbDimension*)pDim; sText = pDimCad->dimensionText(); if (sText.IsEmpty()) { pDimCad->measurement(dDimData); if (CArcAxisPage::kArc == eType) { dDimData = dDimData * 180.0f / PI; } } else { dDimData = _tstof((LPCTSTR)sText); } arData.Add(dDimData); } } OPENOBJ_END(); } return TRUE; } // add by zyc 20120420 排序函数 bool CAxisGridSheet::SortDimArc(const AcDbObjectId& element1, const AcDbObjectId& element2) { // 获取角度 double dEleAngle1,dEleAngle2; double* pdAngle; const AcDbObjectId* pElement; for (int i=0; i<2; i++) { if (i == 0) { pdAngle = &dEleAngle1; pElement = &element1; } else { pdAngle = &dEleAngle2; pElement = &element2; } OPENOBJ_BEGIN(*pElement, AcDb::kForRead, AcDbEntity, pDim); if (!pDim) { return true; } if (pDim->isKindOf(TDbDimension2::desc())) { *pdAngle = ((TDbDimension2*)pDim)->GetRotation(); } else if (pDim->isKindOf(AcDb3PointAngularDimension::desc())) { AcGePoint3d ptArc = ((AcDb3PointAngularDimension*)pDim)->arcPoint(); AcGePoint3d ptCenter = ((AcDb3PointAngularDimension*)pDim)->centerPoint(); AcGeVector2d vtRadius(ptArc.x-ptCenter.x, ptArc.y-ptCenter.y); *pdAngle = vtRadius.angle(); } // add by zyc 120611 另一种cad角度标注 else if (pDim->isKindOf(AcDb2LineAngularDimension::desc())) { AcDb2LineAngularDimension* pDimAngular = (AcDb2LineAngularDimension*)pDim; AcGePoint3d ptArc = pDimAngular->arcPoint(); AcGePoint3d ptCenter; AcGeLine3d line1(pDimAngular->xLine1Start(), pDimAngular->xLine1End()); AcGeLine3d line2(pDimAngular->xLine2Start(), pDimAngular->xLine2End()); line1.intersectWith(line2, ptCenter); AcGeVector2d vtRadius(ptArc.x-ptCenter.x, ptArc.y-ptCenter.y); *pdAngle = vtRadius.angle(); } OPENOBJ_END(); } // 比较 if (dEleAngle1 > dEleAngle2) { return false; } return true; } // add by zyc 20120420 排序函数 bool CAxisGridSheet::SortDimRect(const AcDbObjectId& element1, const AcDbObjectId& element2) { // 获取尺寸线上的点 AcGePoint3d ptElement1, ptElement2; AcGePoint3d* ptElement; const AcDbObjectId* pElement; for (int i=0; i<2; i++) { if (i == 0) { ptElement = &ptElement1; pElement = &element1; } else { ptElement = &ptElement2; pElement = &element2; } OPENOBJ_BEGIN(*pElement, AcDb::kForRead, AcDbEntity, pDim); if (!pDim) { return true; } if (pDim->isKindOf(TDbDimension2::desc())) { TDbDimension2* pTDim = (TDbDimension2*)pDim; *ptElement = (AcGePoint3d)pTDim->GetLocation(); } else if(pDim->isKindOf(AcDbAlignedDimension::desc())) { AcDbAlignedDimension* pDimAligned = (AcDbAlignedDimension*)pDim; *ptElement = pDimAligned->dimLinePoint(); } else if(pDim->isKindOf(AcDbRotatedDimension::desc())) { AcDbRotatedDimension* pDimRotate = (AcDbRotatedDimension*)pDim; *ptElement = pDimRotate->dimLinePoint(); } OPENOBJ_END(); } // 比较 if (ptElement1.x < ptElement2.x) { return true; } else if (ptElement1.x > ptElement2.x) { return false; } else if (ptElement1.y < ptElement2.y) { return true; } else if (ptElement1.y > ptElement2.y) { return false; } return true; }