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/ActionReverseZItem.cpp

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];
}
}