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.
131 lines
2.4 KiB
C++
131 lines
2.4 KiB
C++
#include "stdafx.h"
|
|
#include "ActionReverseZItem.h"
|
|
#include "SigmaView.h"
|
|
#include "Util.h"
|
|
#include "Visitor.h"
|
|
|
|
CActionReverseZItem::CActionReverseZItem()
|
|
: CActionItem(nullptr, 0)
|
|
{
|
|
}
|
|
|
|
CActionReverseZItem::CActionReverseZItem(CSigmaDoc* ppDoc, UINT actionType, const CPositionList &elements)
|
|
: CActionItem(ppDoc, actionType)
|
|
{
|
|
CListAddRange(m_elements, elements);
|
|
}
|
|
|
|
void CActionReverseZItem::Undo()
|
|
{
|
|
Reverse();
|
|
}
|
|
|
|
void CActionReverseZItem::Redo()
|
|
{
|
|
Reverse();
|
|
}
|
|
|
|
void CActionReverseZItem::Do()
|
|
{
|
|
Reverse();
|
|
}
|
|
|
|
void CActionReverseZItem::accept(CActionVisitor& visitor)
|
|
{
|
|
visitor.visit(*this);
|
|
}
|
|
|
|
void CActionReverseZItem::Reverse()
|
|
{
|
|
CPtrList* value = GetDoc()->GetDraw()->GetValueList();
|
|
|
|
for (POSITION pos = m_elements.GetHeadPosition(); pos != nullptr; m_elements.GetNext(pos))
|
|
{
|
|
POSITION pt = m_elements.GetAt(pos);
|
|
COne* pOne = (COne*)value->GetAt(pt);
|
|
if (pOne->GetType() == DOUBLEFOX_CURVE)
|
|
{
|
|
ReverseCurve((CCurveEx *)(pOne->GetValue()));
|
|
}
|
|
else if (pOne->GetType() == DOUBLEFOX_MESH)
|
|
{
|
|
ReverseMesh((CMesh*)pOne->GetValue());
|
|
}
|
|
}
|
|
}
|
|
|
|
void CActionReverseZItem::ReverseMesh(CMesh* pMesh)
|
|
{
|
|
|
|
ReverseDfg(pMesh);
|
|
|
|
ReverseColorBase(pMesh);
|
|
|
|
ReverseColorRuler(pMesh);
|
|
|
|
UpdateMesh(pMesh);
|
|
}
|
|
|
|
void CActionReverseZItem::UpdateMesh(CMesh* pMesh)
|
|
{
|
|
pMesh->CreateColor();
|
|
pMesh->UpdateColorRuler();
|
|
pMesh->GetBitmap();
|
|
}
|
|
|
|
void CActionReverseZItem::ReverseColorRuler(CMesh* pMesh)
|
|
{
|
|
CColorRuler* pRuler = pMesh->m_pRuler;
|
|
pRuler->zmin = -pRuler->zmax;
|
|
pRuler->zmax = -pRuler->zmin;
|
|
}
|
|
|
|
void CActionReverseZItem::ReverseColorBase(CMesh* pMesh)
|
|
{
|
|
double zmin = 0, zmax = 0;
|
|
|
|
CColorBase& color = pMesh->color;
|
|
color.GetZRange(zmin, zmax);
|
|
color.SetZRange(-zmax, -zmin);
|
|
|
|
for (int i = 0; i < color.sizeColor(); i++)
|
|
{
|
|
CColorItem& item = color.GetColorItem(i);
|
|
item.z = -item.z;
|
|
}
|
|
|
|
color.Reversal();
|
|
}
|
|
|
|
void CActionReverseZItem::ReverseDfg(CMesh* pMesh)
|
|
{
|
|
double zmin = 0, zmax = 0;
|
|
pMesh->GetM(zmin, zmax);
|
|
pMesh->SetM(-zmax, -zmin);
|
|
|
|
NContour::CDimension3D* pDfg = pMesh->GetDfg();
|
|
|
|
int nIndexZ = (pMesh->GetMeshType() == MESH_FXY && pDfg->n >= 3) ? pMesh->m_nFxyIndexZ : 0;
|
|
|
|
long numx = 0, numy = 0;
|
|
pMesh->GetNumber(numx, numy);
|
|
|
|
#pragma omp parallel for
|
|
for (long i = 0; i < numx; i++)
|
|
{
|
|
for (long j = 0; j < numy; j++)
|
|
{
|
|
double z = pDfg->Value(i, j, nIndexZ);
|
|
pDfg->SetValue(i, j, -z);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CActionReverseZItem::ReverseCurve(CCurveEx *pCurve)
|
|
{
|
|
for (int i = 0; i < pCurve->num; i++)
|
|
{
|
|
pCurve->z[i] = -pCurve->z[i];
|
|
}
|
|
}
|