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.
kev/Drawer/Module/GeoSigmaDraw/ItemCurveProcess.cpp

1967 lines
45 KiB
C++

1 month ago
#include "StdAfx.h"
#include ".\itemcurveprocess.h"
#include "SigmaDoc.h"
#include "SigmaView.h"
#include ".\itemlinkcurve.h"
#include ".\actionembellishitem.h"
#include ".\actionmodifieditem.h"
#include ".\actionbackupitem.h"
#include "ActionListItem.h"
#include "ActionComboItem.h"
#include ".\actionchangelayeritem.h"
#include "TinyXml/tinyxml.h"
#include "Util.h"
#include "../SSBase/VoronoiMap/PolygonOperation.h"
//#define USINGZ
#include "keyholing.h"
CItemCurveProcess::CItemCurveProcess(CSigmaDoc * ppDoc)
: CItemFocusRect(ppDoc)
, m_idea(0)
, name(_T(""))
, m_pColor(NULL)
, a(10)
, decimal(8)
, m_bIsE(FALSE)
, m_bIsLog(false)
, m_selSmooth(1)
, m_bIsDelete(TRUE)
, m_processResult(0)
{
SetUpdatePropertyGridState(FALSE);
this->SetType(ITEM_CURVE_PROCESS);
cycle=30;
swing=10;
dnum=20;
m_bDeleteSourveCurve=FALSE;
m_dCurveOffset=10;
m_dStep=200;
m_nMode=0;
m_error=0;
m_bInteger=TRUE;
}
CItemCurveProcess::~CItemCurveProcess(void)
{
if(m_pColor)delete m_pColor;
m_pColor=NULL;
}
void CItemCurveProcess::DoLButtonUp(CDC *pDC)
{
CSigmaDoc * pDoc = GetDoc();
int c=0;
BOOL bEnableDefaultTool=TRUE;
switch(m_idea)
{
case CURVE_FITTING:
c=FittingCurve();
break;
case CURVE_NULL_EMBELLISH:
c=SetNullEmbellish();
break;
case CURVE_SET_EMBELLISH:
c=SetEmbellish();
break;
case CURVE_CONTOUR:
c=CurveContour();
break;
case CURVE_AUTO_LOCATION:
c=AutoLocation();
break;
case CURVE_REVERSAL:
c=Reversal();
bEnableDefaultTool=FALSE;
break;
case CURVE_SET_NAME:
c=SetName();
break;
case CURVE_NAME_TO_Z:
c=NameToZ();
break;
case CURVE_Z_TO_NAME:
c=ZToName();
break;
case CURVE_LAYER_TO_NAME:
c=LayerToName();
break;
case CURVE_NAME_LOG:
c=NameLog();
break;
case CURVE_NAME_EXPONENTIAL:
c=NameExponential();
break;
case CURVE_NAME_IS_NULL:
//c=FindNameIsNull();
break;
case CURVE_ANY_NAME:
c=AnyName();
if(c==0)
pDoc->Invalidate(GetPos());
break;
case ARC_TO_CURVE:
//c=ArcToCurve();
break;
case CURVE_SMOOTH:
c=CurveSmooth();
break;
case CURVE_TO_WAVE:
c=ToWave();
break;
case CURVE_OFFSET:
c=CurveOffset();
break;
case CURVE_NODE_ENCRYPT:
c=NodeEncrypt();
break;
case CURVE_REDUNDANT:
c=ToRedundant();
break;
case CURVE_CLOSE:
c=CloseCurve();
bEnableDefaultTool=FALSE;
break;
case CURVE_SURFACE_Z:
c = SetZFromSurface();
break;
}
m_processResult = c;
if(c>0)
{
//pDoc->Modified();
//pDoc->Invalidate();
}
//if(bEnableDefaultTool)
//pDoc->EnableDefaultTool();
}
bool CItemCurveProcess::NodeEncrypt(int mode, double step, bool bRounding, CPositionList & selectionSet)
{
CRect8 rect = this->GetRect();
if (selectionSet.IsEmpty())
return false;
CActionListItem* pAction = new CActionListItem(GetDoc(), ID_PROCESS_CURVE_ENCRYPT);
int count = 0;
POSITION pos, pt;
COne* pOne;
CCurveEx* pCurve;
pos = selectionSet.GetHeadPosition();
BOOL bR = bRounding ? TRUE : FALSE;
while (pos)
{
pt = selectionSet.GetNext(pos);
pOne = m_pDoc->GetDraw()->GetAt(pt);
if (pOne->GetType() != DOUBLEFOX_CURVE)
continue;
pCurve = (CCurveEx*)pOne->GetValue();
CActionModifiedItem* pModifiedItem = new CActionModifiedItem(GetDoc(), IDS_STRING_CURVE);
pModifiedItem->BackupOldItem(pt, pOne);
pCurve->GetLocation();
pCurve->EncryptNode(mode, step, bR);
pModifiedItem->BackupNewItem();
pAction->AddTailItem(pModifiedItem);
count++;
m_pDoc->Modified();
}
if (count > 0)
GetDoc()->SetActionItem(pAction);
else
delete pAction;
return count != 0;
}
int CItemCurveProcess::PolygonConnect(CPositionList& selections, CString& layerName, bool deleteOriginalCurves)
{
if (selections.IsEmpty())
return false;
vector<CPolyline*> srcVec;
int count = 0;
POSITION pos, pt;
COne* pOne;
CCurveEx* pCurve;
/// ʹ<><CAB9>Clippers2<73><32><EFBFBD><EFBFBD>
Paths64 subjects;
int pathCount = selections.GetCount();
subjects.reserve(pathCount);
CPositionList removeElements;
pos = selections.GetHeadPosition();
while (pos) {
pt = selections.GetNext(pos);
pOne = m_pDoc->GetDraw()->GetAt(pt);
if (pOne->GetType() != DOUBLEFOX_CURVE)
continue;
pCurve = (CCurveEx*)pOne->GetValue();
if (pCurve->num < 3) {
continue;
}
removeElements.AddTail(pt);
Path64 pathTmp;
int nNum = pCurve->num;
pathTmp.reserve(nNum);
for (int i = 0; i < nNum; i++)
{
Point64 pt64 = toPoint64(pCurve->x[i], pCurve->y[i]); //, pCurve->z[i]
pathTmp.push_back(Point64(pt64.x, pt64.y));//, pCurve->z[i]
}
subjects.push_back(pathTmp);
}
PolyTree64 polytree;
Clipper64 c64;
c64.AddSubject(subjects);
c64.Execute(ClipType::Union, FillRule::EvenOdd, polytree);
// <20><><EFBFBD>Ⱥϲ<C8BA><CFB2><EFBFBD><E0BDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
Paths64 solutionMerge;
if (!KeyHole(polytree, solutionMerge)) return false;
Path64 pathConn64 = ConnectPolygons(solutionMerge);
Path64 pathResult64 = TrimCollinear(pathConn64);
PathD pathResult = fromPolygon64(pathConn64);
PathsD solution;
solution.emplace_back(pathResult);
CList<POSITION, POSITION> addList;
CLayer* pLayerResult = GetDoc()->GetDraw()->FindAddLayer(layerName);
for (size_t i = 0; i < solution.size(); ++i)
{
int nSize = solution[i].size();
CPointList PointList;
for (int j= 0; j < nSize; j++)
{
dfPoint point;
point.x0 = solution[i][j].x;
point.y0 = solution[i][j].y;
//point.z0 = solution[i][j].z;
PointList.AddTail(point);
}
dfPoint ptTail;
ptTail.x0 = solution[i][0].x;
ptTail.y0 = solution[i][0].y;
PointList.AddTail(ptTail);
CCurveEx* pCurveNew = new CCurveEx;
pCurveNew->SetName("");
pCurveNew->SetPoints(PointList, 2);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pos = GetDoc()->GetDraw()->AddElement(pCurveNew, DOUBLEFOX_CURVE);
addList.AddTail(pos);
}
///////////////
//pos = selections.GetHeadPosition();
//while (pos)
//{
// pt = selections.GetNext(pos);
// pOne = m_pDoc->GetDraw()->GetAt(pt);
// if (pOne->GetType() != DOUBLEFOX_CURVE)
// continue;
// pCurve = (CCurveEx*)pOne->GetValue();
// if (pCurve->num < 3) {
// continue;
// }
// CPolyline* pLineNew = new CPolyline();
// for (int i = 0; i < pCurve->num; i++)
// {
// pLineNew->AddPoint(pCurve->x[i], pCurve->y[i], pCurve->z[i]);
// }
// srcVec.push_back(pLineNew);
//}
//vector<CPolyline*> dstVec;
//CPolygonOperation::DigHoles(srcVec, dstVec);
//CLayer* pLayerNew = GetDoc()->GetDraw()->FindAddLayer(layerName);
////pAction->AddAddItem(pNewOne);
//for (auto polyLine : dstVec) {
// int numPl = polyLine->GetLength();
// CPointList PointList;
// for (int i = 0; i < numPl; i++)
// {
// dfPoint point;
// point.x0 = polyLine->GetPoint(i).x0;
// point.y0 = polyLine->GetPoint(i).y0;
// point.z0 = polyLine->GetPoint(i).z0;
// PointList.AddTail(point);
// }
// CCurveEx* pCurveNew = new CCurveEx;
// pCurveNew->SetName(polyLine->GetName());
// pCurveNew->SetPoints(PointList, 2);
// //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// pos = GetDoc()->GetDraw()->AddElement(pCurveNew, DOUBLEFOX_CURVE);
// addList.AddTail(pos);
//}
int nCount = addList.GetCount();
if (nCount > 0) {
CActionListItem* pItem = new CActionListItem(GetDoc(), ID_EDIT_TOOL_CONNECT_CURVE);
pItem->AddAddItem(addList);
if (deleteOriginalCurves)
{
pItem->AddDeleteItem(removeElements);
}
GetDoc()->SetActionItem(pItem);
}
return nCount;
}
bool CItemCurveProcess::ToRedundant(double tolerance, CPositionList & selectSet)
{
if (tolerance < 0)
return false;
if (selectSet.IsEmpty())
return false;
CActionListItem* pAction = new CActionListItem(GetDoc(), ID_PROCESS_CURVE_REDUNDANT);
int count = 0;
POSITION pos, pt;
COne* pOne;
CCurveEx* pCurve;
pos = selectSet.GetHeadPosition();
while (pos)
{
pt = selectSet.GetNext(pos);
pOne = m_pDoc->GetDraw()->GetAt(pt);
if (pOne->GetType() != DOUBLEFOX_CURVE)
continue;
pCurve = (CCurveEx*)pOne->GetValue();
CActionModifiedItem* pModifiedItem = new CActionModifiedItem(GetDoc(), IDS_STRING_CURVE);
pModifiedItem->BackupOldItem(pt, pOne);
CCurveEx* pc = new CCurveEx;
*pc = *pCurve;
CCurveRedundant cr(*pc);
cr.Execute(tolerance);
cr.GetRedundantCurve(*pCurve);
if (pCurve->bAutoLocation)
pCurve->GetLocation();
delete pc;
pModifiedItem->BackupNewItem();
pAction->AddTailItem(pModifiedItem);
count++;
m_pDoc->Modified();
}
if (count > 0)
GetDoc()->SetActionItem(pAction);
else
delete pAction;
return count !=0 ;
}
//<2F><EFBFBD><E2BBAC><EFBFBD><EFBFBD>
//mode 0--B<><42><EFBFBD><EFBFBD> 1--<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CItemCurveProcess::SmoothCurve(int mode, double step, CPositionList & selecctionSet)
{
if (selecctionSet.IsEmpty())
return false;
if (mode != 0 && mode != 1)
return false;
CActionListItem* pAction = new CActionListItem(GetDoc(), ID_PROCESS_CURVE_SMOOTH);
CPointList bp;
int count = 0;
POSITION pos, pt;
COne* pOne;
CCurveEx* pCurve;
pos = selecctionSet.GetHeadPosition();
while (pos)
{
pt = selecctionSet.GetNext(pos);
pOne = m_pDoc->GetDraw()->GetAt(pt);
if (pOne->GetType() != DOUBLEFOX_CURVE)
continue;
pCurve = (CCurveEx*)pOne->GetValue();
CActionModifiedItem* pModifiedItem = new CActionModifiedItem(GetDoc(), IDS_STRING_CURVE);
pModifiedItem->BackupOldItem(pt, pOne);
switch (mode)
{
default:
case 1:
pCurve->CurveToBezier(bp, step, FALSE);
break;
case 0:
pCurve->CurveToSpline(bp, step, FALSE);
break;
}
pCurve->SetPoints(bp, pCurve->nPoint, pCurve->bAutoLocation);
bp.RemoveAll();
count++;
pModifiedItem->BackupNewItem();
pAction->AddTailItem(pModifiedItem);
}
if (count > 0)
GetDoc()->SetActionItem(pAction);
else
delete pAction;
return count != 0;
}
int CItemCurveProcess::SetProcessIdea(int nIdea)
{
if (nIdea < 1 || nIdea > 23)
return -1;
m_idea=nIdea;
return 1;
}
int CItemCurveProcess::SetNullEmbellish(void)
{
CSigmaDoc * pDoc=GetDoc();
CRect8 rect=this->GetRect();
CList<POSITION,POSITION> select;
pDoc->GetDraw()->IsInRange(rect,select);
if(select.IsEmpty()) return 0;
int count=0;
POSITION pos,pt;
COne* pOne;
CCurveEx* pCurve;
//Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD>Redo/Undo
CActionComboItem *pAction= new CActionComboItem(pDoc, IDS_GI_EMBELLISH_SELF);
pos=select.GetHeadPosition();
while(pos)
{
pt=select.GetNext(pos);
pOne=pDoc->GetDraw()->GetAt(pt);
if(pOne->GetType()!=DOUBLEFOX_CURVE)continue;
//for undo/redo
CActionEmbellishItem* pActionItem=new CActionEmbellishItem(pDoc, 0, pOne);
pActionItem->SetOldHowToView(pOne); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(pOne->HowToViewCurve!=NULL)
{
delete pOne->HowToViewCurve;
pOne->HowToViewCurve=NULL;
}
//<2F><><EFBFBD><EFBFBD>ԭʼ<D4AD><CABC><EFBFBD><EFBFBD>
pOne->color=0;
pCurve=(CCurveEx*)pOne->GetValue();
pCurve->width=0;
pCurve->m_type=0;
pCurve->VirtualType.Clear();
pActionItem->SetNewHowToView(pOne);
pAction->AddAction(pActionItem);
count++;
}
if (count > 0)
{
m_pDoc->Modified();
pDoc->SetActionItem(pAction);
}
else
{
delete pAction;
}
return count;
}
int CItemCurveProcess::SetEmbellish(void)
{
/*
CXTPResizePropertySheet sheet(IDS_STRING_PANE_PROPERTIES, GetView());
sheet.m_psh.dwFlags |= PSH_NOAPPLYNOW;
CDFDrawProDoc* pDoc=GetDoc();
CEmbellishPage page;
//page.SetUnit(pDoc->GetDraw()->GetUnit());
page.SetUnitMode(GetUnitMode().m_unit, GetUnitMode().m_dScaleFactor, GetUnitMode().m_nMode);
sheet.AddPage(&page);
if(sheet.DoModal()!=IDOK) return 0;
if(page.GetHowToViewCurve()==NULL) return 0;
*/
CSigmaDoc * pDoc = GetDoc();
CRect8 rect=this->GetRect();
CList<POSITION,POSITION> select;
pDoc->GetDraw()->IsInRange(rect,select);
if(select.IsEmpty()) return 0;
int count=0;
POSITION pos,pt;
COne* pOne;
//Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD>Redo/Undo
CActionComboItem *pAction= new CActionComboItem(pDoc, IDS_GI_EMBELLISH_SELF);
pos=select.GetHeadPosition();
while(pos)
{
pt=select.GetNext(pos);
pOne=pDoc->GetDraw()->GetAt(pt);
if(pOne->GetType()!=DOUBLEFOX_CURVE)continue;
////for undo/redo
CActionEmbellishItem* pActionItem=new CActionEmbellishItem(pDoc, 0, pOne);
pActionItem->SetOldHowToView(pOne); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(pOne->HowToViewCurve)
delete pOne->HowToViewCurve;
pOne->HowToViewCurve=new CHowToViewCurve();
*pOne->HowToViewCurve=m_CurveStyle;
pActionItem->SetNewHowToView(pOne); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pAction->AddAction(pActionItem);
count++;
}
if (count > 0)
{
m_pDoc->Modified();
pDoc->SetActionItem(pAction);
}
else
{
delete pAction;
}
return count;
}
int CItemCurveProcess::AutoLocation(void)
{
CSigmaDoc * pDoc = GetDoc();
CRect8 rect=this->GetRect();
CList<POSITION,POSITION> select;
pDoc->GetDraw()->IsInRange(rect,select);
if(select.IsEmpty()) return 0;
//for redo/undo
CActionBackupItem* pAction=new CActionBackupItem(pDoc, ID_OPERATION_CURVE_LOCATION);
int count=0;
POSITION pos,pt;
COne* pOne;
CCurveEx* pCurve;
pos=select.GetHeadPosition();
while(pos)
{
pt=select.GetNext(pos);
pOne=pDoc->GetDraw()->GetAt(pt);
if(pOne->GetType()!=DOUBLEFOX_CURVE)continue;
pCurve=(CCurveEx*)pOne->GetValue();
if(pCurve->bAutoLocation) continue;
pAction->Backup(pOne);
pCurve->bAutoLocation=TRUE;
if(pCurve->nPoint>3)pCurve->nPoint=3;
pCurve->GetLocation();
count++;
}
if (count > 0)
{
pAction->BackupNew();
pDoc->SetActionItem(pAction);
}
else delete pAction;
return count;
}
int CItemCurveProcess::Reversal(void)
{
CSigmaDoc * pDoc = GetDoc();
CRect8 rect=this->GetRect();
CList<POSITION,POSITION> select;
pDoc->GetDraw()->IsInRange(rect,select);
if(select.IsEmpty()) return 0;
//for redo/undo
pDoc->SetActionItem(new CActionCurveReversalItem(pDoc, ID_OPERATION_CURVE_REVERSAL, select));
pDoc->Modified();
int count=0;
POSITION pos,pt;
COne* pOne;
CCurveEx* pCurve;
pos=select.GetHeadPosition();
while(pos)
{
pt=select.GetNext(pos);
pOne=pDoc->GetDraw()->GetAt(pt);
if(pOne->GetType()!=DOUBLEFOX_CURVE)continue;
pCurve=(CCurveEx*)pOne->GetValue();
pCurve->Reversal();
if(pCurve->bAutoLocation)
pCurve->GetLocation();
count ++;
}
return count;
}
//#include "DrawModelColor\colorsheet.h"
int CItemCurveProcess::CurveContour(void)
{
return 0;
/*
CSigmaDoc * pDoc = GetDoc();
CColorSheet sheet("Color", GetView());
if(m_pColor==NULL) m_pColor=new CColorBase;
sheet.SetColor(m_pColor);
sheet.SetWizardMode();
if(sheet.DoModal()!=ID_WIZFINISH)
// if(!m_pColor->CreateWizard(GetView(),0))
return 0;
CRect8 rect=this->GetRect();
CList<POSITION,POSITION> select;
pDoc->GetDraw()->IsInRange(rect,select);
if(select.IsEmpty()) return 0;
CActionListItem* pAction=new CActionListItem(pDoc, ID_OPERATION_CURVE_CONTOUR);
COLORREF col=0;
int count=0;
POSITION pos,pt;
COne* pOne;
double value;
pos=select.GetHeadPosition();
while(pos)
{
pt=select.GetNext(pos);
pOne=pDoc->GetDraw()->GetAt(pt);
if(pOne->GetType()!=DOUBLEFOX_CURVE)continue;
value=atof(((CCurveEx*)pOne->GetValue())->GetName());
col=m_pColor->GetColor(value);
if(col == pOne->color) continue;
pAction->AddChangeColorItem(pt, pOne->color, col); //for redo/undo
pOne->color=col;
count++;
}
if(count>0) pDoc->SetActionItem(pAction);
else delete pAction;
return count;
*/
}
int CItemCurveProcess::SetName(void)
{
return 0;
/*
CPropertiesSheet sheet(IDS_STRING_CURVE,GetView(),0,FALSE);
sheet.SetItem(this);
if(sheet.DoModal()!=IDOK) return 0;
CDFDrawProDoc* pDoc=GetDoc();
CRect8 rect=this->GetRect();
CList<POSITION,POSITION> select;
pDoc->GetDraw()->IsInRange(rect,select);
if(select.IsEmpty()) return 0;
CActionListItem* pAction=new CActionListItem(pDoc, ID_OPERATION_CURVE_CONTOUR);
CCurveEx* pCurve;
int count=0;
POSITION pos,pt;
COne* pOne;
pos=select.GetHeadPosition();
while(pos)
{
pt=select.GetNext(pos);
pOne=pDoc->GetDraw()->GetAt(pt);
if(pOne->GetType()!=DOUBLEFOX_CURVE)continue;
pCurve=(CCurveEx*)pOne->GetValue();
pAction->AddChangeNameItem(pt, pCurve->GetName(), name);
pCurve->SetName(name);
count++;
}
if(count>0) pDoc->SetActionItem(pAction);
else delete pAction;
return count;
*/
}
int CItemCurveProcess::NameToZ(void)
{
CSigmaDoc * pDoc = GetDoc();
CRect8 rect = this->GetRect();
CList<POSITION, POSITION> select;
pDoc->GetDraw()->IsInRange(rect, select);
if (select.IsEmpty()) return 0;
//for redo/undo
CActionBackupItem* pAction = new CActionBackupItem(pDoc, ID_OPERATION_CURVE_NAMETOZ);
int count = 0, i;
double z;
POSITION pos, pt;
COne* pOne;
CCurveEx* pCurve;
pos = select.GetHeadPosition();
while (pos)
{
pt = select.GetNext(pos);
pOne = pDoc->GetDraw()->GetAt(pt);
if (pOne->GetType() != DOUBLEFOX_CURVE)continue;
pCurve = (CCurveEx*)pOne->GetValue();
z = atof(pCurve->GetName());
pAction->Backup(pOne);
for (i = 0; i < pCurve->num; i++)
pCurve->z[i] = z;
if (pCurve->nPoint < 3)pCurve->nPoint = 3;
count++;
}
if (count > 0)
{
pAction->BackupNew();
pDoc->SetActionItem(pAction);
pDoc->Modified();
}
else
delete pAction;
return count;
}
int CItemCurveProcess::SetZFromSurface(void)
{
CSigmaDoc * pDoc=GetDoc();
CRect8 rect=this->GetRect();
CList<POSITION,POSITION> select;
pDoc->GetDraw()->IsInRange(rect,select);
if(select.IsEmpty()) return 0;
POSITION pos = GetDoc()->GetDraw()->FindFirstElement(DOUBLEFOX_MESH);
if (pos == NULL) {
return 0;
}
CMesh* pMesh = (CMesh*)GetDoc()->GetDraw()->GetAtValue(pos);
//for redo/undo
CActionBackupItem* pAction=new CActionBackupItem(pDoc, ID_PROCESS_SURFACE_LINEVALUE);
int count = 0;
COne* pOne;
POSITION pt;
CPointList dp;
dfPoint point;
double dx, dy;
pMesh->GetDelt(dx, dy);
CRect8 range = pMesh->GetRect();
CCurveEx *pCurve;
pos = select.GetHeadPosition();
while (pos)
{
pt = select.GetNext(pos);
pOne = GetDoc()->GetDraw()->GetAt(pt);
if (pOne->GetType() != DOUBLEFOX_CURVE) continue;
pCurve = (CCurveEx*)pOne->GetValue();
if (!pCurve->IsInRange(range)) continue;
pAction->Backup(pt);
//switch (m_nLineValueMode)
//{
//case 0://<2F><><EFBFBD><EFBFBD>Դ<EFBFBD>ڵ<EFBFBD>
for (int i = 0; i < pCurve->num; i++)
{
if (!range.PtInRect(pCurve->x[i], pCurve->y[i]))continue;
pCurve->z[i] = pMesh->GetValue(pCurve->x[i], pCurve->y[i]);
if (pCurve->nPoint < 3)
{
pCurve->nPoint = 3;
}
}
// break;
//case 1://<2F><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>²<EFBFBD>ֵ
// if (m_dLineValueStep < 1e-10)
// m_dLineValueStep = min(dx, dy);
// pCurve->GetPoint(0, point);
// if (range.PtInRect(point.x0, point.y0))
// point.z0 = pMesh->GetValue(point.x0, point.y0);
// dp.AddTail(point);
// {
// int si = 1;
// int i = 0;
// double l0 = pCurve->l[0] + m_dLineValueStep;
// double lmax = pCurve->l[pCurve->num - 1];
// if (pCurve->l[0] > pCurve->l[pCurve->num - 1])
// {
// l0 = pCurve->l[pCurve->num - 1] + m_dLineValueStep;
// lmax = pCurve->l[0];
// si = -1;
// i = pCurve->num - 2;
// }
// while (l0 < lmax)
// {
// if (l0 > pCurve->l[i])
// {
// pCurve->GetPoint(i, point);
// if (range.PtInRect(point.x0, point.y0))
// point.z0 = pMesh->GetValue(point.x0, point.y0);
// dp.AddTail(point);
// i += si;
// }
// point.l = l0;
// pCurve->GetCoordinate(point.l, point.x0, point.y0, point.z0);
// if (range.PtInRect(point.x0, point.y0))
// point.z0 = pMesh->GetValue(point.x0, point.y0);
// dp.AddTail(point);
// l0 += m_dLineValueStep;
// }
// }
// pCurve->GetPoint(pCurve->num - 1, point);
// if (range.PtInRect(point.x0, point.y0))
// point.z0 = pMesh->GetValue(point.x0, point.y0);
// dp.AddTail(point);
// if (pCurve->nPoint < 3) pCurve->nPoint = 3;
// pCurve->SetPoints(dp, pCurve->nPoint, pCurve->bAutoLocation);
// dp.RemoveAll();
// break;
//}
count++;
}
if (count > 0)
{
//GetDoc()->SetModifiedFlag();
pAction->BackupNew();
GetDoc()->SetActionItem(pAction);
}
else
delete pAction;
return count;
}
int CItemCurveProcess::ZToName(void)
{
CSigmaDoc * pDoc=GetDoc();
CRect8 rect=this->GetRect();
CList<POSITION,POSITION> select;
pDoc->GetDraw()->IsInRange(rect,select);
if(select.IsEmpty()) return 0;
CActionListItem* pAction=new CActionListItem(pDoc, ID_OPERATION_CURVE_ZTONAME);
int count=0;
CString name;
POSITION pos,pt;
COne* pOne;
CCurveEx* pCurve;
pos=select.GetHeadPosition();
while(pos)
{
pt=select.GetNext(pos);
pOne=pDoc->GetDraw()->GetAt(pt);
if(pOne->GetType()!=DOUBLEFOX_CURVE)continue;
pCurve=(CCurveEx*)pOne->GetValue();
std::unique_ptr<CActionModifiedItem> pModifiedItem = std::make_unique<CActionModifiedItem>(GetDoc(), 0);
pModifiedItem->BackupOldItem(pt, pOne);
::AfxGetPublicFunction()->FloatToString(name,pCurve->z[0]);
pCurve->SetName(name);
pModifiedItem->BackupNewItem();
pAction->AddTailItem(pModifiedItem.release());
count++;
}
if (count > 0)
{
pDoc->SetActionItem(pAction);
pDoc->Modified();
}
else
delete pAction;
return count;
}
int NItem::CItemCurveProcess::LayerToName(void)
{
CSigmaDoc * pDoc = GetDoc();
CRect8 rect=this->GetRect();
CList<POSITION,POSITION> select;
pDoc->GetDraw()->IsInRange(rect,select);
if(select.IsEmpty()) return 0;
//for redo/undo
//CActionListItem* pAction=new CActionListItem(pDoc, ID_OPERATION_CURVE_LAYER_TO_NAME);
//
int count=0;
CString name;
POSITION pos,pt;
COne* pOne;
CLayerName ln;
CCurveEx* pCurve;
pos=select.GetHeadPosition();
while(pos)
{
pt=select.GetNext(pos);
pOne=pDoc->GetDraw()->GetAt(pt);
if(pOne->GetType()!=DOUBLEFOX_CURVE)continue;
pCurve=(CCurveEx*)pOne->GetValue();
ln.SetPathName(pOne->m_pLayer->GetPathName());
name=ln.GetTailPathName();
//pAction->AddChangeNameItem(pt, pCurve->GetName(), name);
pCurve->SetName(name);
count++;
}
//if(count>0) pDoc->SetActionItem(pAction);
//else delete pAction;
return count;
}
int CItemCurveProcess::NameLog(void)
{
return 0;
/*
CPropertiesSheet sheet(IDS_STRING_CURVE,GetView(),0,FALSE);
sheet.SetItem(this);
if(sheet.DoModal()!=IDOK) return 0;
if(!(a>1e-300 && a!=1.0) && m_bIsE==FALSE) return 0;
CDFDrawProDoc* pDoc=GetDoc();
CRect8 rect=this->GetRect();
CList<POSITION,POSITION> select;
pDoc->GetDraw()->IsInRange(rect,select);
if(select.IsEmpty()) return 0;
//for redo/undo
CActionListItem* pAction=new CActionListItem(pDoc, ID_OPERATION_CURVE_NAME_LOG);
CCurveEx* pCurve;
int count=0;
POSITION pos,pt;
COne* pOne;
double b;
CString name;
pos=select.GetHeadPosition();
while(pos)
{
pt=select.GetNext(pos);
pOne=pDoc->GetDraw()->GetAt(pt);
if(pOne->GetType()!=DOUBLEFOX_CURVE)continue;
pCurve=(CCurveEx*)pOne->GetValue();
b=atof(pCurve->GetName());
if(fabs(b)<1e-100) continue;
if(m_bIsE)//Ϊ<><CEAA>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD>
b=log(b);
else
b=log(b)/log(a);
if(decimal==0) name.Format("%.0lf",b);
else ::AfxGetPublicFunction()->FloatToString(name,b,decimal);
pAction->AddChangeNameItem(pt, pCurve->GetName(), name);
pCurve->SetName(name);
count++;
}
if(count>0) pDoc->SetActionItem(pAction);
else delete pAction;
return count;
*/
}
int CItemCurveProcess::NameExponential(void)
{
return 0;
/*
CPropertiesSheet sheet(IDS_STRING_CURVE,GetView(),0,FALSE);
sheet.SetItem(this);
if(sheet.DoModal()!=IDOK) return 0;
if(!(a>1e-300 && a!=1.0) && m_bIsE==FALSE) return 0;
CDFDrawProDoc* pDoc=GetDoc();
CRect8 rect=this->GetRect();
CList<POSITION,POSITION> select;
pDoc->GetDraw()->IsInRange(rect,select);
if(select.IsEmpty()) return 0;
//for redo/undo
CActionListItem* pAction=new CActionListItem(pDoc, ID_OPERATION_CURVE_NAME_EXPONENTIAL);
CCurveEx* pCurve;
int count=0;
POSITION pos,pt;
COne* pOne;
double b;
CString name;
pos=select.GetHeadPosition();
while(pos)
{
pt=select.GetNext(pos);
pOne=pDoc->GetDraw()->GetAt(pt);
if(pOne->GetType()!=DOUBLEFOX_CURVE)continue;
pCurve=(CCurveEx*)pOne->GetValue();
b=atof(pCurve->GetName());
if(fabs(b)<1e-100) continue;
if(m_bIsE)//Ϊ<><CEAA>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD>
b=exp(b);
else
b=pow(a,b);
if(decimal==0) name.Format("%.0lf",b);
else ::AfxGetPublicFunction()->FloatToString(name,b,decimal);
pAction->AddChangeNameItem(pt, pCurve->GetName(), name);
pCurve->SetName(name);
count++;
}
if(count>0) pDoc->SetActionItem(pAction);
else delete pAction;
return count;
*/
}
struct CItemCruveProcessItem
{
CItemCruveProcessItem() = default;
CItemCruveProcessItem(uint64_t id, const CString &name, POSITION position)
{
this->id = id;
this->name = name;
this->position = position;
}
uint64_t id = 0;
CString name;
POSITION position;
};
static std::string ConvertCurvesOfEmptyNameToXML(const std::vector<CItemCruveProcessItem> & items);
std::string CItemCurveProcess::FindNameIsNull(CPositionList & selectionSet)
{
if (selectionSet.IsEmpty())
return "";
int count = 0;
int sel = 0;
POSITION pos, pt;
COne* pOne;
//CString type, txt;
//type.LoadString(IDS_STRING_CURVE);
pos = selectionSet.GetHeadPosition();
std::vector<CItemCruveProcessItem> curveItemArray;
CString numberStr;
while (pos)
{
pt = selectionSet.GetNext(pos);
pOne = m_pDoc->GetDraw()->GetAt(pt);
if (pOne->GetType() != DOUBLEFOX_CURVE)
continue;
if (((CCurveEx*)pOne->GetValue())->name != NULL)
continue;
curveItemArray.emplace_back(count + 1, pOne->GetLayer()->GetPathName(), pt);
count++;
}
return ConvertCurvesOfEmptyNameToXML(curveItemArray);
/*
CMainFrame* pmf = (CMainFrame*)GetDoc()->GetMainFrame();
ASSERT(pmf);
pmf->ShowPane(COMMAND_BAR_RESULT_LIST);
CListCtrl* pList=pmf->GetResultListCtrl();
ASSERT(pList);
pmf->m_pPaneResultList->InitList();
CDFDrawProDoc* pDoc=GetDoc();
CRect8 rect=this->GetRect();
CList<POSITION,POSITION> select;
pDoc->GetDraw()->IsInRange(rect,select);
if(select.IsEmpty()) return 0;
int count=0,sel;
POSITION pos,pt;
COne* pOne;
CString type,txt;
type.LoadString(IDS_STRING_CURVE);
pos=select.GetHeadPosition();
while(pos)
{
pt=select.GetNext(pos);
pOne=pDoc->GetDraw()->GetAt(pt);
if(pOne->GetType()!=DOUBLEFOX_CURVE)continue;
if(((CCurveEx*)pOne->GetValue())->name!=NULL)continue;
txt.Format("%ld",count+1);
sel=pList->InsertItem(count,txt);
pList->SetItemText(sel,2,type);
pList->SetItemText(sel,3,pOne->GetLayer()->GetPathName());
pList->SetItemData(sel,(DWORD)pOne);
count++;
}
return count;
*/
}
int CItemCurveProcess::AnyName(void)
{
return 0;
/*
CPropertySheet sheet(IDS_STRING_PANE_PROPERTIES, GetView());
sheet.m_psh.dwFlags |= PSH_NOAPPLYNOW;
CDFDrawProDoc* pDoc=GetDoc();
CEmbellishPage page;
//page.SetUnit(pDoc->GetDraw()->GetUnit());
page.SetUnitMode(GetUnitMode().m_unit, GetUnitMode().m_dScaleFactor, GetUnitMode().m_nMode);
sheet.AddPage(&page);
CHowToViewCurve* pHowToViewCurve=new CHowToViewCurve;
pHowToViewCurve->Add(new CCurveInNameAny());
page.SetHowToViewCurve(pHowToViewCurve);
delete pHowToViewCurve;
if(sheet.DoModal()!=IDOK) return 0;
if(page.GetHowToViewCurve()==NULL) return 0;
ASSERT(GetPos());
CRect8 rect=this->GetRect();
CPositionList select;
pDoc->GetDraw()->IsInRange(rect,select);
if(select.IsEmpty()) return 0;
CCurveEx* pCurve=(CCurveEx*)pDoc->GetDraw()->GetAtValue(GetPos());
CCurveEx* pcn;
CCurveInNameAny* pany;
int i,j;
for(i=0; i<page.GetHowToViewCurve()->GetCount(); ++i)
{
if(page.GetHowToViewCurve()->GetAt(i)->GetType()!=CurveInNameAny)continue;
j=i;
break;
}
CCrossPoint cp;
POSITION ts;
CCrossList xy;
int count=0;
POSITION pos,pt;
COne* pOne;
pos=select.GetHeadPosition();
while(pos)
{
pt=select.GetNext(pos);
if(pt==GetPos())continue;
pOne=pDoc->GetDraw()->GetAt(pt);
if(pOne->GetType()!=DOUBLEFOX_CURVE)continue;
pcn=(CCurveEx*)pOne->GetValue();
pcn->Cross(*(CCurve*)pCurve,xy);
if(xy.IsEmpty()) continue;
if(pOne->HowToViewCurve==NULL)
pOne->HowToViewCurve=new CHowToViewCurve;
*pOne->HowToViewCurve=*page.GetHowToViewCurve();
pany=(CCurveInNameAny*)pOne->HowToViewCurve->GetAt(j);
pany->m_nameNum=(int)xy.GetCount();
pany->l0=new double[pany->m_nameNum];
ts=xy.GetHeadPosition();
for(i=0;i<pany->m_nameNum;i++)
{
cp=xy.GetNext(ts);
pany->l0[i]=cp.x[0];
}
xy.RemoveAll();
count++;
}
return count;
*/
}
POSITION CItemCurveProcess::SelectOneCurve(UINT nFlags, CPoint point)
{
CSigmaDoc* pDoc=GetDoc();
CPoint2D rp=GetDC()->GetReal(point);
POSITION pos=NULL;
//if(pDoc->IsMoveSelect() && pDoc->MoveSelect!=NULL)
// pos=pDoc->MoveSelect;
//else
pos=pDoc->GetSelectedItem(rp);
if(pos==NULL)
{
::AfxMessageBox(IDS_STRING_NOT_ELEMENT);
return NULL;
}
else if(pDoc->GetDraw()->GetElementType(pos)!=DOUBLEFOX_CURVE)
{
::AfxMessageBox(IDS_STRING_IS_NOT_CURVE);
return NULL;
}
return pos;
}
void CItemCurveProcess::OnLButtonDown(CDC *pDC, UINT nFlags, CPoint point, int vk)
{
m_processResult = 0;
if(m_idea==CURVE_ANY_NAME && GetPos()==NULL)
{
position=SelectOneCurve(nFlags,point);
if(GetPos())OnDraw(GetDC());
}
else
CItemFocusRect::OnLButtonDown(pDC, nFlags,point, vk);
}
void CItemCurveProcess::OnRButtonDown(UINT nFlags, CPoint point)
{
m_processResult = 0;
switch(m_idea)
{
case CURVE_REVERSAL:
case CURVE_CLOSE:
//GetDoc()->EnableDefaultTool();
break;
default:
break;
}
}
BOOL CItemCurveProcess::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
return TRUE;
/*
if(m_idea==CURVE_ANY_NAME && GetPos()==NULL)
{
CSigmaDoc * pDoc = GetDoc();
pDoc->GetCursor().SetCursor(CursorSelectItem);
return pDoc->GetCursor().SetCursor();
}
return CItemFocusRect::OnSetCursor(pWnd,nHitTest,message);
*/
}
void CItemCurveProcess::OnDraw(CXyDC* pDC)
{
if(GetPos()==NULL) return;
CSigmaDoc * pDoc=GetDoc();
CCurveEx* pCurve=(CCurveEx*)pDoc->GetDraw()->GetAtValue(GetPos());
CItemLinkCurve item(pDoc);
item.Draw(pDC,pCurve,RGB(255,0,0));
}
int CItemCurveProcess::CurveSmooth(void)
{
return 0;
/*
CString str;
str.LoadString(IDS_GI_CURVE_PROCESS_SMOOTH_HEAD);
int i=str.Find("\n");
if(i>0) str=str.Left(i);
CPropertiesSheet sheet(str,GetView(),0,FALSE);
sheet.SetItem(this);
if(sheet.DoModal()!=IDOK) return 0;
CDFDrawProDoc* pDoc=GetDoc();
CRect8 rect=this->GetRect();
CPositionList select;
pDoc->GetDraw()->IsInRange(rect,select);
if(select.IsEmpty()) return 0;
CActionListItem* pAction=new CActionListItem(pDoc, ID_PROCESS_CURVE_SMOOTH);
CPointList bp;
int count=0;
POSITION pos,pt;
COne* pOne;
CCurveEx* pCurve;
pos=select.GetHeadPosition();
while(pos)
{
pt=select.GetNext(pos);
pOne=pDoc->GetDraw()->GetAt(pt);
if(pOne->GetType()!=DOUBLEFOX_CURVE)continue;
pCurve=(CCurveEx*)pOne->GetValue();
pAction->AddModifiedItem(pt, pOne);
switch(m_selSmooth)
{
default:
case 1:
pCurve->CurveToBezier(bp, a, FALSE);
break;
case 0:
pCurve->CurveToSpline(bp, a, FALSE);
break;
}
pCurve->SetPoints(bp, pCurve->nPoint, pCurve->bAutoLocation);
bp.RemoveAll();
count++;
}
if(count>0) pDoc->SetActionItem(pAction);
else delete pAction;
return count;
*/
}
int NItem::CItemCurveProcess::ToWave(void)
{
return 0;
/*
CString str;
str.LoadString(ID_PROCESS_CURVE_TO_WAVE);
int i=str.Find("\n");
if(i>0) str=str.Left(i);
CPropertiesSheet sheet(str,GetView(),0,FALSE);
sheet.SetItem(this);
if(sheet.DoModal()!=IDOK) return 0;
CDFDrawProDoc* pDoc=GetDoc();
CRect8 rect=this->GetRect();
CList<POSITION,POSITION> select;
pDoc->GetDraw()->IsInRange(rect,select);
if(select.IsEmpty()) return 0;
CActionListItem* pAction=new CActionListItem(pDoc, ID_PROCESS_CURVE_TO_WAVE);
CPointList bp;
int count=0;
POSITION pos,pt;
COne* pOne;
COne* pNewOne;
CCurveEx* pCurve;
pos=select.GetHeadPosition();
while(pos)
{
pt=select.GetNext(pos);
pOne=pDoc->GetDraw()->GetAt(pt);
if(pOne->GetType()!=DOUBLEFOX_CURVE)continue;
pCurve=(CCurveEx*)pOne->GetValue();
if(m_bDeleteSourveCurve)
{
if(pCurve->CurveToWave(bp, cycle, swing, dnum)>0)
{
pAction->AddModifiedItem(pt, pOne);
pCurve->SetPoints(bp, pCurve->nPoint, pCurve->bAutoLocation);
bp.RemoveAll();
count++;
}
}
else
{
pNewOne=new COne;
*pNewOne=*pOne;
pCurve=(CCurveEx*)pNewOne->GetValue();
if(pCurve->CurveToWave(bp, cycle, swing, dnum)>0)
{
pCurve->SetPoints(bp, pCurve->nPoint, pCurve->bAutoLocation);
pDoc->AddElement(pNewOne);
pAction->AddAddItem(pNewOne);
bp.RemoveAll();
count++;
}
}
}
if(count>0) pDoc->SetActionItem(pAction);
else delete pAction;
return count;
*/
}
int NItem::CItemCurveProcess::CurveOffset(void)
{
return 0;
/*
CString str;
str.LoadString(ID_PROCESS_CURVE_OFFSET);
int i=str.Find("\n");
if(i>0) str=str.Left(i);
CPropertiesSheet sheet(str,GetView(),0,FALSE);
sheet.SetItem(this);
if(sheet.DoModal()!=IDOK) return 0;
CDFDrawProDoc* pDoc=GetDoc();
CRect8 rect=this->GetRect();
CList<POSITION,POSITION> select;
pDoc->GetDraw()->IsInRange(rect,select);
if(select.IsEmpty()) return 0;
CActionListItem* pAction=new CActionListItem(pDoc, ID_PROCESS_CURVE_OFFSET);
CPointList bp;
int count=0;
POSITION pos,pt;
COne* pNewOne;
COne* pOne;
CCurveEx* pCurve;
pos=select.GetHeadPosition();
while(pos)
{
pt=select.GetNext(pos);
pOne=pDoc->GetDraw()->GetAt(pt);
if(pOne->GetType()!=DOUBLEFOX_CURVE)continue;
pCurve=(CCurveEx*)pOne->GetValue();
if(m_bDeleteSourveCurve)
{
pAction->AddModifiedItem(pt, pOne);
(*(CCurve*)pCurve) += m_dCurveOffset;
}
else
{
pNewOne=new COne;
*pNewOne=*pOne;
(*(CCurve*)pNewOne->GetValue()) += m_dCurveOffset;
pDoc->AddElement(pNewOne);
pAction->AddAddItem(pNewOne);
}
count++;
}
if(count>0) pDoc->SetActionItem(pAction);
else delete pAction;
return count;
*/
}
int NItem::CItemCurveProcess::NodeEncrypt(void)
{
return 0;
/*
CString str;
str.LoadString(ID_PROCESS_CURVE_ENCRYPT);
int i=str.Find("\n");
if(i>0) str=str.Left(i);
CPropertiesSheet sheet(str,GetView(),0,FALSE);
sheet.SetItem(this);
if(sheet.DoModal()!=IDOK) return 0;
CDFDrawProDoc* pDoc=GetDoc();
CRect8 rect=this->GetRect();
CList<POSITION,POSITION> select;
pDoc->GetDraw()->IsInRange(rect,select);
if(select.IsEmpty()) return 0;
CActionListItem* pAction=new CActionListItem(pDoc, ID_PROCESS_CURVE_ENCRYPT);
int count=0;
POSITION pos,pt;
COne* pOne;
CCurveEx* pCurve;
pos=select.GetHeadPosition();
while(pos)
{
pt=select.GetNext(pos);
pOne=pDoc->GetDraw()->GetAt(pt);
if(pOne->GetType()!=DOUBLEFOX_CURVE)continue;
pCurve=(CCurveEx*)pOne->GetValue();
pAction->AddModifiedItem(pt, pOne);
pCurve->EncryptNode(m_nMode, m_dStep, m_bInteger);
count++;
}
if(count>0) pDoc->SetActionItem(pAction);
else delete pAction;
return count;
*/
}
int NItem::CItemCurveProcess::ToRedundant(void)
{
return 0;
/*
CString str;
str.LoadString(ID_PROCESS_CURVE_REDUNDANT);
int i=str.Find("\n");
if(i>0) str=str.Left(i);
CPropertiesSheet sheet(str,GetView(),0,FALSE);
sheet.SetItem(this);
if(sheet.DoModal()!=IDOK) return 0;
CDFDrawProDoc* pDoc=GetDoc();
CRect8 rect=this->GetRect();
CList<POSITION,POSITION> select;
pDoc->GetDraw()->IsInRange(rect,select);
if(select.IsEmpty()) return 0;
CActionListItem* pAction=new CActionListItem(pDoc, ID_PROCESS_CURVE_REDUNDANT);
int count=0;
POSITION pos,pt;
COne* pOne;
CCurveEx* pCurve;
pos=select.GetHeadPosition();
while(pos)
{
pt=select.GetNext(pos);
pOne=pDoc->GetDraw()->GetAt(pt);
if(pOne->GetType()!=DOUBLEFOX_CURVE)continue;
pCurve=(CCurveEx*)pOne->GetValue();
pAction->AddModifiedItem(pt, pOne);
CCurveEx* pc=new CCurveEx;
*pc=*pCurve;
CCurveRedundant cr(*pc);
cr.Execute(m_error);
cr.GetRedundantCurve(*pCurve);
if(pCurve->bAutoLocation)
pCurve->GetLocation();
delete pc;
count++;
}
if(count>0) pDoc->SetActionItem(pAction);
else delete pAction;
return count;
*/
}
void NItem::CItemCurveProcess::SetCurveStyle(CHowToViewCurve& curveStyle)
{
this->m_CurveStyle = curveStyle;
}
int CItemCurveProcess::ArcToCurve(CPositionList & select, double step)
{
CSigmaDoc * pDoc = GetDoc();
CRect8 rect = this->GetRect();
//CPositionList select;
//pDoc->GetDraw()->IsInRange(rect,select);
//if(select.IsEmpty()) return 0;
//for redo/undo
CActionBackupItem* pAction = new CActionBackupItem(pDoc, ID_PROCESS_ARC_TO_CURVE);
COne* pOne;
// COne *pOneOther;
CArc* parc;
CEllipse* pEll;
CCurveEx* pc;
int c = 0;
POSITION pos, pt;
pos = select.GetHeadPosition();
while (pos)
{
pt = select.GetNext(pos);
pOne = pDoc->GetDraw()->GetAt(pt);
switch (pOne->GetType())
{
default:
continue;
case DOUBLEFOX_ARC:
pAction->Backup(pOne);
parc = (CArc*)pOne->GetValue();
pc = new CCurveEx;
parc->GetCurve(a);
*pc = *parc->GetCurve();
break;
case DOUBLEFOX_CIRCLE:
case DOUBLEFOX_ELLIPSE:
pAction->Backup(pOne);
pEll = (CEllipse*)pOne->GetValue();
pc = pEll->ToCurve(a);
break;
case DOUBLEFOX_CRECT:
pAction->Backup(pOne);
pc = new CCurveEx;
((CCurveRect*)pOne->GetValue())->GetCurve(*pc);
break;
}
//<2F><><EFBFBD>ݣ<EFBFBD>Ϊ<EFBFBD><CEAA>redo undo
//pOneOther=new COne;
//*pOneOther=*pOne;
//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
pOne->ClearValue();
pOne->SetValue(pc, DOUBLEFOX_CURVE);
c++;
}
if (c > 0)
{
pAction->BackupNew();
pDoc->SetActionItem(pAction);
pDoc->Modified();
}
else
delete pAction;
return c;
}
void NItem::CItemCurveProcess::SetCurveName(CString curveName, CPositionList & selectionSet)
{
CSigmaDoc * pDoc = GetDoc();
CActionListItem* pAction = new CActionListItem(pDoc, ID_OPERATION_CURVE_CONTOUR);
CCurveEx* pCurve;
int count = 0;
POSITION pos, pt;
COne* pOne;
pos = selectionSet.GetHeadPosition();
while (pos)
{
pt = selectionSet.GetNext(pos);
pOne = pDoc->GetDraw()->GetAt(pt);
if (pOne->GetType() != DOUBLEFOX_CURVE)
continue;
pCurve = (CCurveEx*)pOne->GetValue();
pAction->AddChangeNameItem(pt, pCurve->GetName(), curveName);
pCurve->SetName(curveName);
count++;
}
if (count > 0)
pDoc->SetActionItem(pAction);
else
delete pAction;
//return count;
}
int NItem::CItemCurveProcess::CloseCurve(void)
{
CSigmaDoc * pDoc = GetDoc();
CRect8 rect=this->GetRect();
CPositionList select;
pDoc->GetDraw()->IsInRange(rect,select);
if(select.IsEmpty()) return 0;
//for redo/undo
CActionBackupItem* pAction=new CActionBackupItem(pDoc, ID_OPERATION_CURVE_CLOSE);
int count=0;
POSITION pos,pt;
COne* pOne;
CCurveEx* pCurve;
pos=select.GetHeadPosition();
while(pos)
{
pt=select.GetNext(pos);
pOne=pDoc->GetDraw()->GetAt(pt);
if(pOne->GetType()!=DOUBLEFOX_CURVE) continue;
pAction->Backup(pOne);
pCurve=(CCurveEx*)pOne->GetValue();
if(!pCurve->EnableClose(TRUE)) //<2F><><EFBFBD>ò<EFBFBD><C3B2>ɹ<EFBFBD>ʱ<EFBFBD><CAB1>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
pAction->RemoveBackupTail();
}
else
{
if (pCurve->bAutoLocation)
{
pCurve->GetLocation();
}
count++;
}
}
if (count > 0)
{
pAction->BackupNew();
pDoc->SetActionItem(pAction);
pDoc->Modified();
}
else
delete pAction;
return count;
}
int NItem::CItemCurveProcess::AutoLinkCurve(double maxError /*= 1E-5*/, bool onlySameName)
{
double dMaxError = maxError == 0 ? 0.0001 : maxError;
int count=0;
CClassList* pClassList= GetDoc()->GetDraw()->GetClassList();
CLayerList* pLayerList;
CLayer* pLayer;
CPositionList select;
double num=pClassList->GetLayerCount();
CActionListItem* pAction=new CActionListItem(GetDoc(), ID_PROCESS_CURVE_AUTO_LINK);
POSITION pos, pt;
pos=pClassList->GetHeadPosition();
while(pos)
{
pLayerList=pClassList->GetNext(pos);
pt=pLayerList->GetHeadPosition();
while(pt)
{
pLayer=pLayerList->GetNext(pt);
select.RemoveAll();
CXyElementFilter filter;
filter.addLayer(pLayer->GetName(), true)
.addType(DOUBLEFOX_CURVE)
.setIncludeHidden(false)
.setIncludeNotEditable(false);
if(GetDoc()->GetDraw()->GetElement(filter, select)<1) continue;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD>߱<EFBFBD><DFB1><EFBFBD><EFBFBD><EFBFBD>ͬһ<CDAC><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD>
while(1)
{
if(select.GetCount()<=1) break;
int n=GetNextLinkCurve(select, pAction, dMaxError, onlySameName);
count+=n;
}
}
}
if(count>0) GetDoc()->SetActionItem(pAction);
else delete pAction;
return count;
}
int NItem::CItemCurveProcess::GetNextLinkCurve(CPositionList& select, void* pActionList, double maxError, bool onlySameName)
{
if(select.GetCount()<=1) return 0;
CActionListItem* pAction=(CActionListItem*)pActionList;
POSITION pos, posBak, posHead, posNext;
CPointList bp;
dfPoint head, tail;
int sel; //1(head,head),2(head,tail),3(tail,head),4(tail,tail)
double dis, dis_tail;
CCurveEx* pCurve;
int total=0;
int count=0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD>
CSigmaDoc* pDoc=GetDoc();
posHead=select.GetHead();
COne* pHeadOne=pDoc->GetDraw()->GetAt(posHead);
CCurveEx* pHeadCurve=(CCurveEx*)pHeadOne->GetValue();
select.RemoveHead(); //ȥ<><C8A5><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(::AfxGetPublicFunction()->IsCurveSolid(pHeadCurve->m_type)) return 0;
pHeadCurve->GetPoint(bp);
head=bp.GetHead();
tail=bp.GetTail();
CString strCurveName = pHeadCurve->GetName();
while(1)
{
count=0;
pos=select.GetHeadPosition();
while(pos)
{
posBak=pos;
posNext=select.GetNext(pos);
pCurve=(CCurveEx*)pDoc->GetDraw()->GetAtValue(posNext);
if(::AfxGetPublicFunction()->IsCurveSolid(pCurve->m_type)) continue;
if (onlySameName)
{
CString strCurveNameNext = pCurve->GetName();
if (strCurveNameNext != strCurveName) {
continue;
}
}
sel=1;
dis=::AfxGetPublicFunction()->Distance2(head.x0, head.y0, pCurve->x[0], pCurve->y[0]);
dis_tail=::AfxGetPublicFunction()->Distance2(head.x0, head.y0, pCurve->x[pCurve->num-1], pCurve->y[pCurve->num-1]);
if(dis>dis_tail) {sel=2; dis=dis_tail;}
dis_tail=::AfxGetPublicFunction()->Distance2(tail.x0, tail.y0, pCurve->x[0], pCurve->y[0]);
if(dis>dis_tail) {sel=3; dis=dis_tail;}
dis_tail=::AfxGetPublicFunction()->Distance2(tail.x0, tail.y0, pCurve->x[pCurve->num-1], pCurve->y[pCurve->num-1]);
if(dis>dis_tail) {sel=4; dis=dis_tail;}
dis=sqrt(dis);
if(dis> maxError) continue;
switch(sel)
{
case 1://head,head
pCurve->GetPoint(bp, FALSE, TRUE);
break;
case 2://head,tail
pCurve->GetPoint(bp, TRUE, TRUE);
break;
case 3://tail,head
pCurve->GetPoint(bp, FALSE, FALSE);
break;
case 4://tail,tail
pCurve->GetPoint(bp, TRUE, FALSE);
break;
}
pAction->AddDeleteItem(posNext);
count++;
select.RemoveAt(posBak);
head=bp.GetHead();
tail=bp.GetTail();
}
if(count==0) break;
total+=count;
}
if(total==0) return 0;
pAction->AddDeleteItem(posHead);
total++;
pCurve=new CCurveEx;
*pCurve=*pHeadCurve;
pCurve->SetPoints(bp, 2);
COne* pNewOne=new COne;
pNewOne->CloneOtherParameter(*pHeadOne);
pNewOne->value=pCurve;
pos=pDoc->GetDraw()->InsertElementBefore(posHead, pNewOne);
pAction->AddAddItem(pNewOne);
total++;
return total;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɢ<EFBFBD><C9A2><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int NItem::CItemCurveProcess::FittingCurve(void)
{
CSigmaDoc * pDoc=GetDoc();
CRect8 rect=this->GetRect();
CPositionList select;
pDoc->GetDraw()->IsInRange(rect,select);
if(select.IsEmpty()) return 0;
CPointList bp;
dfPoint point;
CPointNameEx* pp;
POSITION pos,pt;
COne* pOne;
pos=select.GetHeadPosition();
while(pos)
{
pt=select.GetNext(pos);
pOne=pDoc->GetDraw()->GetAt(pt);
if( pOne->GetType()!=DOUBLEFOX_POINT && pOne->GetType() != DOUBLEFOX_XYZ)
continue;
pp=(CPointNameEx*)pOne->GetValue();
point.x0 = pp->x0;
point.y0 = pp->y0;
bp.AddTail(point);
}
if(bp.GetCount()<=1) return 0;
CCurveEx* pCurve = new CCurveEx;
pCurve->SetPoints(bp, 2);
if(pCurve->num>2)
{
::AfxGetBaseFunction()->SortCoordinate(pCurve->x, pCurve->y, pCurve->num);
pCurve->GetLocation();
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pos=pDoc->GetDraw()->AddElement(pCurve, DOUBLEFOX_CURVE);
if(pos) pDoc->Invalidate(pos);
pDoc->Modified();
//Redo/Undo surport
pOne=pDoc->GetDraw()->GetAt(pos);
GetView()->ActionAdd(pOne, ID_PROCESS_CURVE_FITTING);
return 1;
}
static void AddCurvesElement(TiXmlElement *rootElement, uint64_t id, const CString & pathName, POSITION position)
{
CString name, txt;
TiXmlElement *itemElement = new TiXmlElement("Item");
rootElement->LinkEndChild(itemElement);
TiXmlElement *idElement = new TiXmlElement("ID");
TiXmlElement *nameElement = new TiXmlElement("Name");
TiXmlElement *typeElement = new TiXmlElement("Type");
TiXmlElement *layerElement = new TiXmlElement("Layer");
TiXmlElement *symbolElement = new TiXmlElement("Symbol");
TiXmlElement *lengthElement = new TiXmlElement("RealLength");
TiXmlElement *areaElement = new TiXmlElement("Area");
TiXmlElement *azimuthElement = new TiXmlElement("Azimuth");
TiXmlElement *positionElement = new TiXmlElement("Position");
TiXmlElement *xElement = new TiXmlElement("X");
TiXmlElement *yElement = new TiXmlElement("Y");
TiXmlElement *zElement = new TiXmlElement("Z");
itemElement->LinkEndChild(idElement);
//TiXmlElement *zElement = new TiXmlElement("Z");
itemElement->LinkEndChild(idElement);
itemElement->LinkEndChild(nameElement);
itemElement->LinkEndChild(typeElement);
itemElement->LinkEndChild(layerElement);
itemElement->LinkEndChild(symbolElement);
itemElement->LinkEndChild(lengthElement);
itemElement->LinkEndChild(areaElement);
itemElement->LinkEndChild(azimuthElement);
itemElement->LinkEndChild(positionElement);
itemElement->LinkEndChild(xElement);
itemElement->LinkEndChild(yElement);
itemElement->LinkEndChild(zElement);
TiXmlText *idValue = new TiXmlText(std::to_string(id).c_str());
idElement->LinkEndChild(idValue);
TiXmlText *layerValue = new TiXmlText(pathName);
layerElement->LinkEndChild(layerValue);
positionElement->LinkEndChild(new TiXmlText(std::to_string((uint64_t)position).c_str()));
TiXmlText * typeValue = new TiXmlText("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
typeElement->LinkEndChild(typeValue);
}
//<2F><><EFBFBD><EFBFBD>xml<6D>ַ<EFBFBD><D6B7><EFBFBD>
static std::string ConvertCurvesOfEmptyNameToXML(const std::vector<CItemCruveProcessItem> & items)
{
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>XML<4D><4C><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TiXmlDocument *xmlDocument = new TiXmlDocument();
TiXmlDeclaration * decl = new TiXmlDeclaration("1.0", "UTF-8", "");
xmlDocument->LinkEndChild(decl);
// <20><>Ԫ<EFBFBD>ء<EFBFBD>
TiXmlElement *rootElement = new TiXmlElement("ROOT");
xmlDocument->LinkEndChild(rootElement);
size_t count = items.size();
for (const auto &item : items)
{
AddCurvesElement(rootElement, item.id, item.name, item.position);
}
TiXmlPrinter printer;
string xmlstr;
xmlDocument->Accept(&printer);
xmlstr = printer.CStr();
return std::string(printer.CStr());
}