You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
1.3 KiB
C++

#include "StdAfx.h"
#include ".\itemtrimcurve.h"
#include "SigmaDoc.h"
#include "SigmaView.h"
#include ".\itemsolid.h"
CItemTrimCurve::CItemTrimCurve(CSigmaDoc* ppDoc)
: CItemBreakCurve(ppDoc)
{
m_nActionID=ID_EDIT_TOOL_TRIM_CURVE;
this->SetType(ITEM_TRIM_CURVE);
m_bRange=TRUE;
m_bAutoDelete=FALSE;
}
CItemTrimCurve::~CItemTrimCurve(void)
{
}
void CItemTrimCurve::DoLButtonUp(CDC *pDC)
{
ProcessLButtonUp();
CItemBreakCurve::DoLButtonUp(pDC);
}
int CItemTrimCurve::ProcessCurve(CCurveEx* pCurve, COne* pOne, CPoint2D* pPoint)
{
//¼ôÇÐÇúÏß
if(pPoint==NULL) return 0;
CCurveEx* pTrimCurve=(CCurveEx*)pOne->GetValue();
CCrossList list;
pCurve->Cross(*(CCurve*)pTrimCurve, list);
if(list.GetCount()==0) return 0;
SortLocation(list,1);
CCrossPoint cp=CItemSolid::GetNearestCrossPoint(list,*pPoint);
double l=1e100; pTrimCurve->PointDistance(pPoint->x0,pPoint->y0,l);
double zero=1e-300;
if(pTrimCurve->l[pTrimCurve->num-1]>pTrimCurve->l[0])
{
if(l>cp.x[1])
pTrimCurve->GetCurve(pTrimCurve->l[0],cp.x[1]-zero,PointList);
else
pTrimCurve->GetCurve(cp.x[1]-zero,pTrimCurve->l[pTrimCurve->num-1]-zero,PointList);
}
else
{
if(l>cp.x[1])
pTrimCurve->GetCurve(cp.x[1]-zero,pTrimCurve->l[pTrimCurve->num-1]-zero,PointList);
else
pTrimCurve->GetCurve(pTrimCurve->l[0],cp.x[1]-zero,PointList);
}
AddCurve(pOne);
return 1;
}