Files
envi-code/SourceCode/Code2026/tg_shs/shs_annotate/EditSymbCutDlg.cpp
T
2026-09-28 15:28:50 +08:00

404 lines
9.1 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
}