// EditSymbCutDlg.cpp : implementation file // #include "stdafx.h" #include "EditSymbCutDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CEditSymbCutDlg dialog CEditSymbCutDlg::CEditSymbCutDlg(TDbSymbCut* pEntCut,CWnd* pParent) :CModelessDialog(CEditSymbCutDlg::IDD, pParent) { //{{AFX_DATA_INIT(CEditSymbCutDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT pCut=pEntCut; m_bHideLine=pEntCut->IsHideLine(); m_bHideLine2=m_bHideLine; } void CEditSymbCutDlg::DoDataExchange(CDataExchange* pDX) { CModelessDialog::DoDataExchange(pDX); DDX_Check(pDX,IDC_CHECK1,m_bHideLine); //{{AFX_DATA_MAP(CEditSymbCutDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CEditSymbCutDlg, CModelessDialog) //{{AFX_MSG_MAP(CEditSymbCutDlg) ON_BN_CLICKED(IDC_ADDCUT, OnAddcut) ON_BN_CLICKED(IDC_MODCUT, OnModcut) ON_BN_CLICKED(IDC_DECCUT, OnDeccut) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CEditSymbCutDlg message handlers void CEditSymbCutDlg::OnAddcut() { // TODO: Add your control notification handler code here BeginEditorCommand(); if(pCut->upgradeOpen()!=Acad::eOk) { CompleteEditorCommand(); return; } pCut->SetHideLine(false); pCut->downgradeOpen(); ads_point adsPt; while(acedGetPoint(NULL,_T("\n请选取切割线边上一点:"),adsPt)==RTNORM) { XPoint pt=adsPt; XPoly2D poly; poly=pCut->GetOutline(); pt=Ucs2Wcs(pt); int nHitFlag=poly.HitTestOnCurve(pt); if(nHitFlag<0) { int nEdgeFlag=abs(nHitFlag)-1; int oldEdgeType=pCut->GetEdgeType(nEdgeFlag); XCurveSegment curve; if(poly.Nth(nEdgeFlag,curve)==RTNORM) { XPoint ptStart=curve.StartPoint(); XPoint ptEnd=curve.EndPoint(); pCut->upgradeOpen(); if(oldEdgeType<1) { XPoint ptNode; if(pt.Distance(ptStart)InsertNode(nEdgeFlag+1,ptNode); pCut->SetEdgeType(nEdgeFlag,1); } else if(pt.Distance(ptStart)>pt.Distance(ptEnd)) { pt.Mirror(ptEnd,ptNode); pCut->InsertNode(nEdgeFlag+1,ptNode); pCut->SetEdgeType(nEdgeFlag+1,1); } else pCut->SetEdgeType(nEdgeFlag,1); pCut->downgradeOpen(); continue; } ads_real dLen=curve.GetLength(); int nIsNode=0; XPoint node[20]; for(int i=1;iSetEdgeType(nEdgeFlag,oldEdgeType+1); pCut->downgradeOpen(); continue; } else { for(int j=1;jInsertNode(nEdgeFlag+j,node[j]); pCut->SetEdgeType(nEdgeFlag+j-1,1); } pCut->SetEdgeType(nEdgeFlag+oldEdgeType-1,1); } XPoly2D polyNew; polyNew=pCut->GetOutline(); int nHitFlagNew=polyNew.HitTestOnCurve(pt); if(nHitFlagNew<0) { int nEdgeFlagNew=abs(nHitFlagNew)-1; XPoint rupNode; XCurveSegment curveNew; if(polyNew.Nth(nEdgeFlagNew,curveNew)==RTNORM) { XPoint ptStartNew=curveNew.StartPoint(); XPoint ptEndNew=curveNew.EndPoint(); rupNode.x=((ptStartNew.x)+(ptEndNew.x))/2; rupNode.y=((ptStartNew.y)+(ptEndNew.y))/2; rupNode.z=((ptStartNew.z)+(ptEndNew.z))/2; XPoint nodeNew[3]; double lenNew=curveNew.GetLength(); if(pt.Distance(rupNode)<=lenNew/4) { nodeNew[0].x=((pt.x)+(rupNode.x))/2; nodeNew[0].y=((pt.y)+(rupNode.y))/2; nodeNew[0].z=((pt.z)+(rupNode.z))/2; pt.Mirror(nodeNew[0],nodeNew[1]); rupNode.Mirror(nodeNew[0],nodeNew[2]); if(ptEndNew.Distance(nodeNew[1])InsertNode(nEdgeFlagNew+1,nodeNew[1]); pCut->InsertNode(nEdgeFlagNew+1,nodeNew[0]); pCut->SetEdgeType(nEdgeFlagNew+1,1); pCut->InsertNode(nEdgeFlagNew+1,nodeNew[2]); pCut->SetEdgeType(nEdgeFlagNew+1,1); pCut->SetEdgeType(nEdgeFlagNew,0); } else if(ptEndNew.Distance(nodeNew[1])>ptEndNew.Distance(nodeNew[2])) { pCut->InsertNode(nEdgeFlagNew+1,nodeNew[2]); pCut->InsertNode(nEdgeFlagNew+1,nodeNew[0]); pCut->SetEdgeType(nEdgeFlagNew+1,1); pCut->InsertNode(nEdgeFlagNew+1,nodeNew[1]); pCut->SetEdgeType(nEdgeFlagNew+1,1); pCut->SetEdgeType(nEdgeFlagNew,0); } } else if(pt.Distance(ptStartNew)SetEdgeType(nEdgeFlagNew,0); pt.Mirror(ptStartNew,nodeNew[0]); rupNode.Mirror(nodeNew[0],nodeNew[1]); pCut->InsertNode(nEdgeFlagNew+1,nodeNew[0]); pCut->SetEdgeType(nEdgeFlagNew,1); pCut->InsertNode(nEdgeFlagNew+2,nodeNew[1]); pCut->SetEdgeType(nEdgeFlagNew+1,1); } else { pCut->SetEdgeType(nEdgeFlagNew,0); pt.Mirror(ptEndNew,nodeNew[0]); rupNode.Mirror(nodeNew[0],nodeNew[1]); pCut->InsertNode(nEdgeFlagNew+1,nodeNew[0]); pCut->SetEdgeType(nEdgeFlagNew+1,1); pCut->InsertNode(nEdgeFlagNew+1,nodeNew[1]); pCut->SetEdgeType(nEdgeFlagNew+1,1); } } else { pCut->downgradeOpen(); if(m_bHideLine2) { pCut->upgradeOpen(); pCut->SetHideLine(true); pCut->downgradeOpen(); pCut->draw(); acedRedraw(NULL,0); } CompleteEditorCommand(); return; } } else { pCut->downgradeOpen(); continue; } pCut->downgradeOpen(); } else { if(m_bHideLine2) { pCut->upgradeOpen(); pCut->SetHideLine(true); pCut->downgradeOpen(); pCut->draw(); acedRedraw(NULL,0); } CompleteEditorCommand(); return; } } else adsout<<_T("\n请正确点取!"); } if(m_bHideLine2) { pCut->upgradeOpen(); pCut->SetHideLine(true); pCut->downgradeOpen(); pCut->draw(); acedRedraw(NULL,0); } CompleteEditorCommand(); } void CEditSymbCutDlg::OnModcut() { // TODO: Add your control notification handler code here BeginEditorCommand(); if(pCut->upgradeOpen()!=Acad::eOk) { CompleteEditorCommand(); return; } pCut->SetHideLine(false); pCut->downgradeOpen(); int m_nRupNum=1; XPoint pt; while(acedGetPoint(NULL,_T("\n选取切割线的一条边:"),pt)==RTNORM) { XPoly2D poly; poly=pCut->GetOutline(); pt=Ucs2Wcs(pt); int nHitFlag=poly.HitTestOnCurve(pt); if(nHitFlag<0) { adsout << _T("\n折断数目<") << m_nRupNum << _T(">:"); ads_initget(RSG_NOZERO|RSG_NONEG, NULL); if(ads_getint(_T(""), &m_nRupNum)==RTCAN) { if(m_bHideLine2) { pCut->upgradeOpen(); pCut->SetHideLine(true); pCut->downgradeOpen(); pCut->draw(); acedRedraw(NULL,0); } CompleteEditorCommand(); return; } int nEdgeFlag=abs(nHitFlag)-1; pCut->upgradeOpen(); pCut->SetEdgeType(nEdgeFlag,m_nRupNum); pCut->downgradeOpen(); } else adsout<<_T("\n请正确点取!"); } if(m_bHideLine2) { pCut->upgradeOpen(); pCut->SetHideLine(true); pCut->downgradeOpen(); pCut->draw(); acedRedraw(NULL,0); } CompleteEditorCommand(); } void CEditSymbCutDlg::OnDeccut() { BeginEditorCommand(); XPoint pt; while(acedGetPoint(NULL,_T("\n选取切割线的一条边:"),pt)==RTNORM) { XPoly2D poly; poly=pCut->GetOutline(); pt=Ucs2Wcs(pt); int nHitFlag=poly.HitTestOnCurve(pt); if(nHitFlag<0) { int nEdgeFlag=abs(nHitFlag)-1; int oldClipType=pCut->GetEdgeType(nEdgeFlag); if(oldClipType>0) { if(pCut->upgradeOpen()==Acad::eOk) { pCut->SetEdgeType(nEdgeFlag,0); pCut->downgradeOpen(); } } } else adsout<<_T("\n请正确点取!"); } CompleteEditorCommand(); // TODO: Add your control notification handler code here } void CEditSymbCutDlg::OnOK() { // TODO: Add extra validation here CDialog::OnOK(); if(pCut->upgradeOpen()!=Acad::eOk) return; if(((CButton*)GetDlgItem(IDC_OUTCUT))->GetCheck()==1) pCut->SetClipType(XDcClip::kClipOut); else pCut->SetClipType(XDcClip::kClipIn); // Zyu modify on 100726,去掉编译警告 //pCut->SetHideLine(m_bHideLine); pCut->SetHideLine(!!m_bHideLine); pCut->downgradeOpen(); } void CEditSymbCutDlg::OnCancel() { // TODO: Add extra cleanup here CModelessDialog::OnCancel(); } BOOL CEditSymbCutDlg::OnInitDialog() { CModelessDialog::OnInitDialog(); // TODO: Add extra initialization here if(pCut->GetClipType()==XDcClip::kClipOut) { ((CButton*)GetDlgItem(IDC_OUTCUT))->SetCheck(1); } else { ((CButton*)GetDlgItem(IDC_INCUT))->SetCheck(1); } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }