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