404 lines
9.2 KiB
C++
404 lines
9.2 KiB
C++
// 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)<pt.Distance(ptEnd))
|
|
{
|
|
pt.Mirror(ptStart,ptNode);
|
|
pCut->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;i<oldEdgeType;i++)
|
|
{
|
|
double dRadius=(dLen/(oldEdgeType*2))*(2*i);
|
|
XCircle cir(ptStart,dRadius);
|
|
XPoint pt1,pt2;
|
|
int ptNum=curve.Intersection(&cir,pt1,pt2);
|
|
if(ptNum==1)
|
|
{
|
|
node[i]=pt1;
|
|
if(pt==node[i])
|
|
nIsNode=1;
|
|
}
|
|
}
|
|
|
|
|
|
if(nIsNode==1)
|
|
{
|
|
pCut->SetEdgeType(nEdgeFlag,oldEdgeType+1);
|
|
pCut->downgradeOpen();
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
|
|
for(int j=1;j<oldEdgeType;j++)
|
|
{
|
|
pCut->InsertNode(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])<ptEndNew.Distance(nodeNew[2]))
|
|
{
|
|
pCut->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)<lenNew/4)
|
|
{
|
|
pCut->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
|
|
}
|