605 lines
22 KiB
C++
605 lines
22 KiB
C++
/*
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Description : WayMod.cpp
|
|
//
|
|
// Modification classes
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// inherit from CPA_Modif
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Creation date: 21 jan 1997 Author: J Thénoz
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Modification date: Author:
|
|
//
|
|
//
|
|
//
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
*/
|
|
|
|
//ANNECY Shaitan Nettoyage (12/05/98) {
|
|
/*
|
|
|
|
#include "stdafx.h"
|
|
#include "acp_base.h"
|
|
#include "resource.h"
|
|
#include "incitf.h"
|
|
#include "incgam.h"
|
|
#include "incai.h"
|
|
#include "WpObj.hpp"
|
|
#include "WayObj.hpp"
|
|
#include "LinkObj.hpp"
|
|
#include "WayMod.hpp"
|
|
#include "Inter.hpp"
|
|
#include "WayDia.hpp"
|
|
|
|
|
|
ModifWayInsert::ModifWayInsert (Way* pWay, WayPoint* pInsertWP, WP_tduc_WPIndex stBeforeWP, BOOL bDialog1stRefresh, BOOL pBlock) : CPA_Modif (TYPE_INSERT_WP,"",pBlock)
|
|
{
|
|
m_pWay = pWay;
|
|
m_pWay->GetInterface()->fn_bComputeRealWay (&m_pWay);
|
|
m_pInsertWP = pInsertWP;
|
|
m_stBeforeWP = stBeforeWP;
|
|
m_DialogRefresh=bDialog1stRefresh;
|
|
SetName(CString("Insert ")+CString(m_pInsertWP->GetName())+CString (" into ")+CString (m_pWay->GetName()));
|
|
}
|
|
|
|
BOOL ModifWayInsert::Do (void)
|
|
{
|
|
POSITION lPosWP, lPosLink;
|
|
WayPoint* poWP;
|
|
Link* poLink;
|
|
int iSelect=0;
|
|
|
|
// insert object in the editor list
|
|
if (m_stBeforeWP<m_pWay->GetListWaypoint()->GetCount())
|
|
{
|
|
//----------- link
|
|
if (m_stBeforeWP)
|
|
{
|
|
m_pOldLink = m_pWay->fn_pGetLink (m_stBeforeWP-1);
|
|
m_pOldLink->fn_vSplitLink ( m_pWay, m_pInsertWP, &m_pLinkBefore, &m_pLinkAfter );
|
|
m_pOldLink->fn_vSetRemoveInHierarchy (TRUE);
|
|
m_pLinkBefore->fn_vSetAddInHierarchy (TRUE);
|
|
m_pLinkAfter->fn_vSetAddInHierarchy (TRUE);
|
|
for (poLink=m_pWay->GetListLink()->GetHeadElement(lPosLink), iSelect=1; poLink && iSelect!=m_stBeforeWP; poLink=m_pWay->GetListLink()->GetNextElement(lPosLink), iSelect++);
|
|
if (poLink)
|
|
{
|
|
m_pWay->GetListLink()->SetAt( lPosLink, m_pLinkAfter );
|
|
m_pWay->GetListLink()->InsertBefore( lPosLink, m_pLinkBefore );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_pOldLink=NULL;
|
|
m_pLinkBefore=NULL;
|
|
m_pLinkAfter=(Link*)(m_pWay->fn_pCreateLink (m_pWay->fn_cGetDefaultLink())->GetObject());
|
|
m_pLinkAfter->fn_vSetWaypoints ( m_pInsertWP, m_pWay->GetListWaypoint()->GetHead () );
|
|
m_pWay->GetListLink()->AddHead ( m_pLinkAfter );
|
|
}
|
|
|
|
//------------- waypoint
|
|
for (poWP=m_pWay->GetListWaypoint()->GetHeadElement(lPosWP), iSelect=0; poWP && iSelect!=m_stBeforeWP; poWP=m_pWay->GetListWaypoint()->GetNextElement(lPosWP), iSelect++);
|
|
if (poWP) m_pWay->GetListWaypoint()->InsertBefore(lPosWP,m_pInsertWP);
|
|
}
|
|
else
|
|
{
|
|
//---------- link
|
|
m_pOldLink=NULL;
|
|
m_pLinkAfter=NULL;
|
|
m_pLinkBefore=NULL;
|
|
if (m_pWay->GetListWaypoint()->GetCount())
|
|
{
|
|
m_pLinkBefore = (Link*) (m_pWay->fn_pCreateLink(m_pWay->fn_cGetDefaultLink())->GetObject());
|
|
m_pLinkBefore->fn_vSetWaypoints (m_pWay->GetListWaypoint()->GetTail (), m_pInsertWP);
|
|
m_pLinkBefore->fn_vSetAddInHierarchy (TRUE);
|
|
m_pWay->GetListLink()->AddTail(m_pLinkBefore);
|
|
}
|
|
|
|
//---------- waypoint
|
|
m_pWay->GetListWaypoint()->AddTail(m_pInsertWP);
|
|
iSelect=m_pWay->GetListWaypoint()->GetCount();
|
|
}
|
|
|
|
// insert the WP and the links in the engine structure
|
|
WP_fnv_Way_InsertWayPoint ((WP_tdhWay)(m_pWay->GetStruct()), (WP_tdhWayPoint)(m_pInsertWP->GetStruct()),m_pLinkBefore ? (WP_tdhLink)(m_pLinkBefore->GetStruct()) : NULL, m_pLinkAfter ? (WP_tdhLink)(m_pLinkAfter->GetStruct()) : NULL , m_stBeforeWP);
|
|
|
|
// refresh the dialog if it's open
|
|
if (!m_DialogRefresh) m_DialogRefresh=TRUE;
|
|
else
|
|
if (m_pWay->fn_bIsDialog()) m_pWay->fn_pGetDialog()->fn_vRefreshDialog(iSelect);
|
|
|
|
// refreh the waypoint dialog
|
|
m_pWay->GetInterface()->fn_vRefreshWaypointCoordinate ();
|
|
|
|
// refresh the graphic
|
|
m_pInsertWP->fn_vDraw(FALSE,TRUE);
|
|
m_pWay->fn_vRefresh();
|
|
m_pWay->GetInterface()->fn_vRefreshHierarchyList ();
|
|
|
|
m_pWay->fn_vNotifySave ();
|
|
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL ModifWayInsert::Undo (void)
|
|
{
|
|
POSITION lPosWP, lPosLink;
|
|
WayPoint* poWP;
|
|
Link* poLink;
|
|
int iSelect=0;
|
|
|
|
// delete object in the engine structure
|
|
WP_fnv_Way_DeleteWayPoint ((WP_tdhWay)(m_pWay->GetStruct()), m_stBeforeWP, m_pOldLink ? (WP_tdhLink)m_pOldLink->GetStruct() : NULL );
|
|
|
|
// delete object in the editor list
|
|
for (poWP=m_pWay->GetListWaypoint()->GetHeadElement(lPosWP), iSelect=0; poWP && iSelect!=m_stBeforeWP; poWP=m_pWay->GetListWaypoint()->GetNextElement(lPosWP), iSelect++);
|
|
if (poWP) m_pWay->GetListWaypoint()->RemoveAt(lPosWP);
|
|
|
|
// restore editors links
|
|
if (m_stBeforeWP)
|
|
{
|
|
for (poLink=m_pWay->GetListLink()->GetHeadElement(lPosLink), iSelect=1; poLink && iSelect!=m_stBeforeWP; poLink=m_pWay->GetListLink()->GetNextElement(lPosLink), iSelect++);
|
|
if (m_pOldLink)
|
|
{
|
|
m_pWay->GetListLink()->SetAt( lPosLink, m_pOldLink );
|
|
m_pOldLink->fn_vSetAddInHierarchy (TRUE);
|
|
m_pWay->GetListLink()->GetNextElement(lPosLink);
|
|
}
|
|
m_pLinkBefore->fn_vSetRemoveInHierarchy (TRUE);
|
|
if (m_pLinkAfter) m_pLinkAfter->fn_vSetRemoveInHierarchy (TRUE);
|
|
if (lPosLink) m_pWay->GetListLink()->RemoveAt(lPosLink);
|
|
}
|
|
else
|
|
{
|
|
if (m_pWay->GetListLink()->GetCount()) m_pWay->GetListLink()->RemoveHead ();
|
|
}
|
|
|
|
if (m_pWay->fn_bIsDialog()) m_pWay->fn_pGetDialog()->fn_vRefreshDialog(iSelect);
|
|
|
|
m_pWay->GetInterface()->fn_vRefreshWaypointCoordinate();
|
|
m_pWay->fn_vRefresh();
|
|
m_pWay->GetInterface()->fn_vRefreshHierarchyList ();
|
|
m_pWay->fn_vNotifySave ();
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
ModifWayDelete::ModifWayDelete (Way* pWay, WP_tduc_WPIndex stPosDeleteWP, BOOL pBlock) : CPA_Modif (TYPE_DELETE_WP,"",pBlock)
|
|
{
|
|
m_pWay = pWay;
|
|
m_pWay->GetInterface()->fn_bComputeRealWay (&m_pWay);
|
|
m_stDeletePosWP = stPosDeleteWP;
|
|
m_pDeleteWP=0;
|
|
m_pLink=NULL;
|
|
m_DialogRefresh=!pBlock;
|
|
SetName(CString("Delete ")+CString(m_pWay->fn_pGetWayPoint ((m_stDeletePosWP==WP_fnuc_Way_GetSizeWay ((WP_tdhWay)(pWay->GetEngineStruct()))) ? m_stDeletePosWP-1 : m_stDeletePosWP)->GetName()) + CString (" in ") + CString (m_pWay->GetName()) );
|
|
}
|
|
|
|
|
|
BOOL ModifWayDelete::Do (void)
|
|
{
|
|
POSITION lPosWP, lPosLink;
|
|
POSITION lPosModifyLink;
|
|
WayPoint* poWP;
|
|
Link* poLink;
|
|
int iSelect=0;
|
|
|
|
|
|
// delete object in the editor list
|
|
for (poWP=m_pWay->GetListWaypoint()->GetHeadElement(lPosWP), iSelect=0; poWP && iSelect!=m_stDeletePosWP; poWP=m_pWay->GetListWaypoint()->GetNextElement(lPosWP),iSelect++);
|
|
if (poWP) {
|
|
m_pWay->GetListWaypoint()->RemoveAt(lPosWP); // Ok we have it
|
|
m_pDeleteWP=poWP;
|
|
}
|
|
|
|
// modify links in the editor list
|
|
if (m_stDeletePosWP)
|
|
{
|
|
for (poLink=m_pWay->GetListLink()->GetHeadElement(lPosLink), iSelect=1; poLink && iSelect!=m_stDeletePosWP; poLink=m_pWay->GetListLink()->GetNextElement(lPosLink),iSelect++);
|
|
lPosModifyLink = lPosLink;
|
|
m_pOldLinkBefore=poLink;
|
|
m_pOldLinkAfter=m_pWay->GetListLink()->GetNextElement(lPosLink);
|
|
if (m_pOldLinkBefore && m_pOldLinkAfter)
|
|
{
|
|
m_pLink = m_pOldLinkBefore->fn_pMergeLink (m_pWay, m_pOldLinkAfter);
|
|
m_pLink->fn_vSetAddInHierarchy (TRUE);
|
|
if (m_pOldLinkBefore) m_pOldLinkBefore->fn_vSetRemoveInHierarchy (TRUE);
|
|
if (m_pOldLinkAfter) m_pOldLinkAfter->fn_vSetRemoveInHierarchy (TRUE);
|
|
m_pWay->GetListLink()->SetAt( lPosModifyLink, m_pLink );
|
|
if (m_stDeletePosWP) m_pWay->GetListLink()->RemoveAt(lPosLink);
|
|
}
|
|
else
|
|
{
|
|
m_pLink=NULL;
|
|
if (m_pOldLinkBefore) m_pOldLinkBefore->fn_vSetRemoveInHierarchy (TRUE);
|
|
m_pWay->GetListLink()->RemoveTail ();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_pOldLinkBefore=NULL;
|
|
m_pOldLinkAfter=m_pWay->GetListLink()->GetHeadElement(lPosLink);
|
|
m_pLink = NULL;
|
|
if (m_pWay->GetListLink()->GetCount())
|
|
{
|
|
m_pWay->GetListLink()->GetHead()->fn_vSetRemoveInHierarchy (TRUE);
|
|
m_pWay->GetListLink()->RemoveHead();
|
|
}
|
|
}
|
|
|
|
// delete object in the motor structure
|
|
if (m_pWay->IsWayEmpty()) WP_fnv_Way_Free ((WP_tdhWay)(m_pWay->GetStruct()));
|
|
else WP_fnv_Way_DeleteWayPoint ((WP_tdhWay)(m_pWay->GetStruct()), m_stDeletePosWP, m_pLink ? (WP_tdhLink)m_pLink->GetEngineStruct() : NULL );
|
|
|
|
// refresh the dialog if it's open
|
|
if (m_pWay->fn_bIsDialog()) m_pWay->fn_pGetDialog()->fn_vRefreshDialog(max (iSelect-1,0));
|
|
|
|
// refreh the waypoint dialog
|
|
m_pWay->GetInterface()->fn_vRefreshWaypointCoordinate();
|
|
m_pWay->fn_vRefresh();
|
|
if (m_DialogRefresh) m_pWay->GetInterface()->fn_vRefreshHierarchyList ();
|
|
|
|
|
|
if (m_pWay->IsWayEmpty())
|
|
{
|
|
m_pWay->fn_vNotifyUnSave ();
|
|
m_pWay->fn_vSetRecreate (TRUE);
|
|
if (m_pWay->GetSuperObject()->GetParent())
|
|
{
|
|
Way::GetInterface()->fn_vSetModifDeleteOk (TRUE);
|
|
Way::GetInterface()->GetInterface()->fn_bDeleteObjectInHierarchy (m_pWay->GetSuperObject(), FALSE, FALSE, FALSE, FALSE );
|
|
Way::GetInterface()->fn_vSetModifDeleteOk (FALSE);
|
|
}
|
|
}
|
|
else m_pWay->fn_vNotifySave ();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL ModifWayDelete::Undo (void)
|
|
{
|
|
POSITION lPosWP, lPosLink;
|
|
WayPoint* poWP;
|
|
Link* poLink;
|
|
long lIndex;
|
|
|
|
if (m_pWay->IsWayEmpty())
|
|
{
|
|
Way::GetInterface()->fn_vSetRefreshWay (TRUE);
|
|
if (!m_pWay->GetSuperObject()->GetParent()) Way::GetInterface()->GetInterface()->fn_bInsertObjectInHierarchy (m_pWay->GetSuperObject(), Way::GetInterface()->GetInterface()->GetSpecificInterface()->GetDynamicRoot(), FALSE, FALSE, FALSE );
|
|
Way::GetInterface()->fn_vSetRefreshWay (FALSE);
|
|
}
|
|
|
|
// search the position in the editor list to reinsert and do it
|
|
for (poWP=m_pWay->GetListWaypoint()->GetHeadElement(lPosWP), lIndex=0; poWP && lIndex!=m_stDeletePosWP; poWP=m_pWay->GetListWaypoint()->GetNextElement(lPosWP),lIndex++);
|
|
if (poWP) m_pWay->GetListWaypoint()->InsertBefore(lPosWP,m_pDeleteWP);
|
|
else m_pWay->GetListWaypoint()->AddTail(m_pDeleteWP);
|
|
|
|
if (m_pWay->fn_bIsDialog()) m_pWay->fn_pGetDialog()->fn_vRefreshDialog(lIndex);
|
|
|
|
// set the links editor
|
|
if (m_stDeletePosWP)
|
|
{
|
|
if (m_pLink)
|
|
{
|
|
for (poLink=m_pWay->GetListLink()->GetHeadElement(lPosLink), lIndex=1; poLink && lIndex!=m_stDeletePosWP; poLink=m_pWay->GetListLink()->GetNextElement(lPosLink),lIndex++);
|
|
m_pLink->fn_vSetRemoveInHierarchy (TRUE);
|
|
if (m_pOldLinkBefore)
|
|
{
|
|
m_pOldLinkBefore->fn_vSetAddInHierarchy (TRUE);
|
|
m_pWay->GetListLink()->SetAt( lPosLink, m_pOldLinkBefore );
|
|
}
|
|
if (m_pOldLinkAfter)
|
|
{
|
|
m_pOldLinkAfter->fn_vSetAddInHierarchy (TRUE);
|
|
m_pWay->GetListLink()->InsertAfter( lPosLink, m_pOldLinkAfter );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_pOldLinkBefore->fn_vSetAddInHierarchy (TRUE);
|
|
m_pWay->GetListLink()->AddTail (m_pOldLinkBefore);
|
|
m_pOldLinkBefore->fn_vSetAddInHierarchy (TRUE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_pOldLinkAfter)
|
|
{
|
|
m_pOldLinkAfter->fn_vSetAddInHierarchy (TRUE);
|
|
m_pWay->GetListLink()->AddHead (m_pOldLinkAfter);
|
|
}
|
|
}
|
|
|
|
// reinsert the object in the motor structure
|
|
WP_fnv_Way_InsertWayPoint ((WP_tdhWay)(m_pWay->GetStruct()), (WP_tdhWayPoint)(m_pDeleteWP->GetStruct()), m_pOldLinkBefore ? (WP_tdhLink)(m_pOldLinkBefore->GetEngineStruct()) : NULL, m_pOldLinkAfter ? (WP_tdhLink)(m_pOldLinkAfter->GetEngineStruct()) : NULL, m_stDeletePosWP);
|
|
|
|
m_pWay->fn_vRefresh();
|
|
|
|
// refresh the dialog if it's open
|
|
if (m_pWay->fn_bIsDialog()) m_pWay->fn_pGetDialog()->fn_vRefreshDialog ();
|
|
|
|
// refreh the waypoint dialog
|
|
m_pWay->GetInterface()->fn_vRefreshWaypointCoordinate();
|
|
if (m_DialogRefresh) m_pWay->GetInterface()->fn_vRefreshHierarchyList ();
|
|
m_pWay->fn_vNotifySave ();
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
ModifWayRemove::ModifWayRemove (Way* pWay, WayPoint* pRemoveWP, BOOL pBlock) : CPA_Modif (TYPE_REMOVE_WP,"Remove WP",pBlock)
|
|
{
|
|
m_pWay = pWay;
|
|
m_pWay->GetInterface()->fn_bComputeRealWay (&m_pWay);
|
|
m_pRemoveWP = pRemoveWP;
|
|
m_lNbRemoveWP = 0;
|
|
m_dstRemovePosWP = NULL;
|
|
m_dpoRemoveLinkBefore = NULL;
|
|
m_dpoRemoveLinkAfter = NULL;
|
|
}
|
|
|
|
BOOL ModifWayRemove::Do (void)
|
|
{
|
|
POSITION lPos;
|
|
WayPoint* poWP;
|
|
|
|
// we count the number of waypoint to remove
|
|
m_lNbRemoveWP=0;
|
|
for
|
|
(
|
|
poWP=m_pWay->GetListWaypoint()->GetHeadElement(lPos);
|
|
poWP;
|
|
poWP=m_pWay->GetListWaypoint()->GetNextElement(lPos)
|
|
)
|
|
if (poWP==m_pRemoveWP) m_lNbRemoveWP++;
|
|
|
|
// we allocate the array of position
|
|
m_dstRemovePosWP = new WP_tduc_WPIndex [m_lNbRemoveWP];
|
|
m_dpoRemoveLinkBefore = new Link* [m_lNbRemoveWP];
|
|
m_dpoRemoveLinkAfter = new Link* [m_lNbRemoveWP];
|
|
|
|
long lIndexRemoveWP = 0; // indice in the array
|
|
|
|
for (lIndexRemoveWP=0; lIndexRemoveWP<m_lNbRemoveWP; lIndexRemoveWP++)
|
|
{
|
|
POSITION lPosLinkBefore=0, lPosLinkAfter=0, lPosLink=0;
|
|
|
|
// delete object in the engine structure
|
|
m_dstRemovePosWP[lIndexRemoveWP] = WP_fnuc_Way_PositionWayPoint ((WP_tdhWay)(m_pWay->GetStruct()), (WP_tdhWayPoint)(m_pRemoveWP->GetStruct()));
|
|
m_dpoRemoveLinkBefore[lIndexRemoveWP] = m_pWay->fn_pGetLink (m_dstRemovePosWP[lIndexRemoveWP]-1);
|
|
m_dpoRemoveLinkAfter[lIndexRemoveWP] = m_pWay->fn_pGetLink (m_dstRemovePosWP[lIndexRemoveWP]);
|
|
Link* poLink = NULL;
|
|
if (m_dpoRemoveLinkBefore[lIndexRemoveWP] && m_dpoRemoveLinkAfter[lIndexRemoveWP])
|
|
{
|
|
poLink = m_dpoRemoveLinkBefore[lIndexRemoveWP]->fn_pMergeLink (m_pWay, m_dpoRemoveLinkAfter[lIndexRemoveWP] );
|
|
poLink->fn_vSetAddInHierarchy (TRUE);
|
|
}
|
|
|
|
// delete object in the editor list
|
|
for (poWP=m_pWay->GetListWaypoint()->GetHeadElement(lPos); poWP && poWP!=m_pRemoveWP; poWP=m_pWay->GetListWaypoint()->GetNextElement(lPos) );
|
|
if (poWP==m_pRemoveWP) m_pWay->GetListWaypoint()->RemoveAt(lPos);
|
|
|
|
// replace link in the editor list
|
|
if (m_dstRemovePosWP[lIndexRemoveWP]) lPosLinkBefore=m_pWay->GetListLink()->FindIndex (m_dstRemovePosWP[lIndexRemoveWP]-1);
|
|
lPosLinkAfter = m_pWay->GetListLink()->FindIndex (m_dstRemovePosWP[lIndexRemoveWP]);
|
|
|
|
if (lPosLinkBefore) m_pWay->GetListLink()->RemoveAt (lPosLinkBefore);
|
|
if (lPosLinkAfter) m_pWay->GetListLink()->RemoveAt (lPosLinkAfter);
|
|
|
|
if (m_dstRemovePosWP[lIndexRemoveWP]>=2) lPosLink = m_pWay->GetListLink()->FindIndex (m_dstRemovePosWP[lIndexRemoveWP]-2);
|
|
if (lPosLinkBefore && lPosLinkAfter)
|
|
{
|
|
if (lPosLink) m_pWay->GetListLink()->InsertAfter ( lPosLink, poLink );
|
|
else m_pWay->GetListLink()->AddHead (poLink);
|
|
}
|
|
WP_fnv_Way_DeleteWayPoint ((WP_tdhWay)(m_pWay->GetStruct()), m_dstRemovePosWP[lIndexRemoveWP],poLink ? (WP_tdhLink)(poLink->GetEngineStruct()) : NULL );
|
|
|
|
// Links
|
|
if (m_dpoRemoveLinkBefore[lIndexRemoveWP]) m_dpoRemoveLinkBefore[lIndexRemoveWP]->fn_vSetRemoveInHierarchy (TRUE);
|
|
if (m_dpoRemoveLinkAfter[lIndexRemoveWP]) m_dpoRemoveLinkAfter[lIndexRemoveWP]->fn_vSetRemoveInHierarchy (TRUE);
|
|
}
|
|
|
|
// refreh the waypoint dialog
|
|
m_pWay->GetInterface()->fn_vRefreshWaypointCoordinate();
|
|
|
|
// refresh the dialog if it's open
|
|
if (m_pWay->fn_bIsDialog()) m_pWay->fn_pGetDialog()->fn_vRefreshDialog();
|
|
m_pWay->fn_vRefresh();
|
|
m_pWay->GetInterface()->fn_vRefreshHierarchyList ();
|
|
|
|
if (m_pWay->IsWayEmpty())
|
|
{
|
|
m_pWay->fn_vNotifyUnSave ();
|
|
m_pWay->fn_vSetRecreate (TRUE);
|
|
if (m_pWay->GetSuperObject()->GetParent())
|
|
{
|
|
Way::GetInterface()->fn_vSetModifDeleteOk (TRUE);
|
|
Way::GetInterface()->GetInterface()->fn_bDeleteObjectInHierarchy (m_pWay->GetSuperObject(), FALSE, FALSE, FALSE, FALSE );
|
|
Way::GetInterface()->fn_vSetModifDeleteOk (FALSE);
|
|
}
|
|
}
|
|
else m_pWay->fn_vNotifySave ();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL ModifWayRemove::Undo (void)
|
|
{
|
|
POSITION lPos;
|
|
WayPoint* poWP;
|
|
long lWP;
|
|
long lIndexRemoveWP = 0;
|
|
|
|
if (m_pWay->IsWayEmpty())
|
|
{
|
|
Way::GetInterface()->fn_vSetRefreshWay (TRUE);
|
|
if (!m_pWay->GetSuperObject()->GetParent()) Way::GetInterface()->GetInterface()->fn_bInsertObjectInHierarchy (m_pWay->GetSuperObject(), Way::GetInterface()->GetInterface()->GetSpecificInterface()->GetDynamicRoot(), FALSE, FALSE, FALSE );
|
|
Way::GetInterface()->fn_vSetRefreshWay (FALSE);
|
|
}
|
|
|
|
// reinsert the object in the motor structure
|
|
for (lIndexRemoveWP=m_lNbRemoveWP-1; lIndexRemoveWP>=0; lIndexRemoveWP--)
|
|
{
|
|
WP_fnv_Way_InsertWayPoint ((WP_tdhWay)(m_pWay->GetStruct()), (WP_tdhWayPoint)(m_pRemoveWP->GetStruct()), m_dpoRemoveLinkBefore[lIndexRemoveWP] ? (WP_tdhLink)(m_dpoRemoveLinkBefore[lIndexRemoveWP]->GetEngineStruct()) : NULL, m_dpoRemoveLinkAfter[lIndexRemoveWP] ? (WP_tdhLink)(m_dpoRemoveLinkAfter[lIndexRemoveWP]->GetEngineStruct()) : NULL, m_dstRemovePosWP[lIndexRemoveWP]);
|
|
|
|
// search the position in the editor list to reinsert and do it
|
|
for (poWP=m_pWay->GetListWaypoint()->GetHeadElement(lPos), lWP=0; poWP && lWP!=m_dstRemovePosWP[lIndexRemoveWP]; poWP=m_pWay->GetListWaypoint()->GetNextElement(lPos),lWP++);
|
|
if (poWP) m_pWay->GetListWaypoint()->InsertBefore(lPos,m_pRemoveWP);
|
|
else m_pWay->GetListWaypoint()->AddTail(m_pRemoveWP);
|
|
|
|
// list links
|
|
if (m_dstRemovePosWP[lIndexRemoveWP]<2)
|
|
{
|
|
if (m_dpoRemoveLinkAfter[lIndexRemoveWP] && m_dpoRemoveLinkBefore[lIndexRemoveWP])
|
|
{
|
|
m_pWay->GetListLink()->GetHead()->fn_vSetRemoveInHierarchy (TRUE);
|
|
m_pWay->GetListLink()->RemoveHead ();
|
|
}
|
|
if (m_dpoRemoveLinkAfter[lIndexRemoveWP]) m_pWay->GetListLink()->AddHead (m_dpoRemoveLinkAfter[lIndexRemoveWP]);
|
|
if (m_dpoRemoveLinkBefore[lIndexRemoveWP]) m_pWay->GetListLink()->AddHead (m_dpoRemoveLinkBefore[lIndexRemoveWP]);
|
|
}
|
|
else
|
|
{
|
|
POSITION lPosLastLink = m_pWay->GetListLink()->FindIndex (m_dstRemovePosWP[lIndexRemoveWP]-1);
|
|
if (lPosLastLink)
|
|
{
|
|
m_pWay->GetListLink()->GetAt ( lPosLastLink )->fn_vSetRemoveInHierarchy (TRUE);
|
|
m_pWay->GetListLink()->RemoveAt ( lPosLastLink );
|
|
}
|
|
POSITION lPosInsertLink = m_pWay->GetListLink()->FindIndex ( m_dstRemovePosWP[lIndexRemoveWP]-2 );
|
|
if (m_dpoRemoveLinkBefore[lIndexRemoveWP]) m_pWay->GetListLink()->InsertAfter (lPosInsertLink, m_dpoRemoveLinkBefore[lIndexRemoveWP]);
|
|
m_pWay->GetListLink()->GetNextElement (lPosInsertLink);
|
|
if (m_dpoRemoveLinkAfter[lIndexRemoveWP]) m_pWay->GetListLink()->InsertAfter (lPosInsertLink, m_dpoRemoveLinkAfter[lIndexRemoveWP]);
|
|
}
|
|
|
|
// Links
|
|
if (m_dpoRemoveLinkBefore[lIndexRemoveWP]) m_dpoRemoveLinkBefore[lIndexRemoveWP]->fn_vSetAddInHierarchy (TRUE);
|
|
if (m_dpoRemoveLinkAfter[lIndexRemoveWP]) m_dpoRemoveLinkAfter[lIndexRemoveWP]->fn_vSetAddInHierarchy (TRUE);
|
|
|
|
}
|
|
delete[] m_dstRemovePosWP;
|
|
delete[] m_dpoRemoveLinkBefore;
|
|
delete[] m_dpoRemoveLinkAfter;
|
|
m_dstRemovePosWP=NULL;
|
|
m_dpoRemoveLinkBefore=NULL;
|
|
m_dpoRemoveLinkAfter=NULL;
|
|
if (m_pWay->fn_bIsDialog()) m_pWay->fn_pGetDialog()->fn_vRefreshDialog(lWP);
|
|
|
|
// refreh the waypoint dialog
|
|
m_pWay->GetInterface()->fn_vRefreshWaypointCoordinate();
|
|
|
|
m_pWay->fn_vRefresh();
|
|
m_pWay->GetInterface()->fn_vRefreshHierarchyList ();
|
|
m_pWay->fn_vNotifySave ();
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
// Add a new WP in the net
|
|
ModifWayAddWP::ModifWayAddWP ( Way* poWay, MTH3D_tdstVector* pAbsolutePosition, WP_tduc_WPIndex stBeforeWP, CPA_Interface* pEditor, BOOL pBlock ) : CPA_Modif (TYPE_ADD_NEW_WP,"Add new WP", pBlock )
|
|
{
|
|
m_poWay = poWay;
|
|
m_poWay->GetInterface()->fn_bComputeRealWay (&m_poWay);
|
|
m_pAbsolutePosition = pAbsolutePosition;
|
|
m_pEditor = pEditor;
|
|
m_poWay->GetInterface()->fn_vSetNextInstanceInWay ();
|
|
m_poSuperWP = m_pEditor->GetNewInstance ("Waypoint", "Waypoint");
|
|
|
|
HIE_fn_vSetSuperObjectDrawMask(m_poSuperWP->GetStruct(), C_lTexturedElement);
|
|
|
|
m_pModifInsertWP=NULL;
|
|
m_stPosBeforeWP = stBeforeWP;
|
|
|
|
// compute position of the WayPoint
|
|
POS_tdstCompletePosition InvWorldMatrix;
|
|
POS_fn_vSetIdentityMatrix(&InvWorldMatrix);
|
|
HIE_tdxHandleToSuperObject hSuperWorldEngine = ((DEV_MultiDevice3D *)(m_pEditor->GetMultiDevice()))->GetEngineWorld();
|
|
CPA_SuperObject* poSuperWorldEditor = ((DEV_MultiDevice3D *)(m_pEditor->GetMultiDevice()))->GetWorld()->GetRoot();
|
|
|
|
// set absolute position
|
|
GEO_tdxHandleToMatrix hAbsoluteWorldMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (hSuperWorldEngine);
|
|
GEO_tdxHandleToMatrix hAbsoluteWPMatrix = HIE_fn_hGetSuperObjectGlobalMatrix (m_poSuperWP->GetStruct());
|
|
GEO_tdxHandleToMatrix hRelativeWPMatrix = HIE_fn_hGetSuperObjectMatrix (m_poSuperWP->GetStruct());
|
|
|
|
POS_fn_vSetIdentityMatrix( hAbsoluteWPMatrix ) ;
|
|
|
|
POS_fn_vSetTranslationVector
|
|
(
|
|
hAbsoluteWPMatrix,
|
|
m_pAbsolutePosition
|
|
);
|
|
|
|
// compute relative position
|
|
POS_fn_vInvertIsoMatrix( &InvWorldMatrix, hAbsoluteWorldMatrix );
|
|
|
|
POS_fn_vMulMatrixMatrix
|
|
(
|
|
hRelativeWPMatrix,
|
|
&InvWorldMatrix,
|
|
hAbsoluteWPMatrix
|
|
);
|
|
|
|
// Set the name
|
|
SetName(CString("Add new ")+CString(m_poSuperWP->GetObject()->GetName())+CString(" to ")+CString(m_poWay->GetName()));
|
|
|
|
}
|
|
|
|
BOOL ModifWayAddWP::Do (void)
|
|
{
|
|
CPA_SuperObject* poSuperWorldEditor = ((DEV_MultiDevice3D *)(m_pEditor->GetMultiDevice()))->GetWorld()->GetRoot();
|
|
m_poWay->GetInterface()->GetInterface()->fn_bInsertObjectInHierarchy ( m_poSuperWP, m_poWay->GetInterface()->GetInterface()->GetSpecificInterface()->GetDynamicRoot(),FALSE,FALSE, FALSE );
|
|
|
|
// set the status of the waypoint
|
|
((WayPoint*)(m_poSuperWP->GetObject()))->fn_vSetAlone (FALSE);
|
|
|
|
// Set the engine structure
|
|
((WayPoint*)(m_poSuperWP->GetObject()))->fn_vComputeMotorStructure ();
|
|
|
|
m_pModifInsertWP = new ModifWayInsert (m_poWay, (WayPoint*)(m_poSuperWP->GetObject()), m_stPosBeforeWP );
|
|
m_pModifInsertWP->Do ();
|
|
m_poWay->fn_vNotifySave ();
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL ModifWayAddWP::Undo (void)
|
|
{
|
|
CPA_SuperObject* poSuperWorldEditor = ((DEV_MultiDevice3D *)(m_pEditor->GetMultiDevice()))->GetWorld()->GetRoot();
|
|
|
|
// delete the add waypoint from the hiearchie
|
|
m_pModifInsertWP->Undo ();
|
|
Way::GetInterface()->fn_vSetModifDeleteOk (TRUE);
|
|
m_poWay->GetInterface()->GetInterface()->fn_bDeleteObjectInHierarchy ( m_poSuperWP,FALSE,FALSE, FALSE, FALSE );
|
|
Way::GetInterface()->fn_vSetModifDeleteOk (FALSE);
|
|
delete m_pModifInsertWP;
|
|
m_pModifInsertWP=NULL;
|
|
|
|
|
|
// test jt
|
|
if (m_poWay->IsWayEmpty())
|
|
{
|
|
m_poWay->fn_vNotifyUnSave ();
|
|
m_poWay->fn_vSetRecreate (TRUE);
|
|
if (m_poWay->GetSuperObject()->GetParent())
|
|
{
|
|
Way::GetInterface()->fn_vSetModifDeleteOk (TRUE);
|
|
Way::GetInterface()->GetInterface()->fn_bDeleteObjectInHierarchy (m_poWay->GetSuperObject(), FALSE, FALSE, FALSE, FALSE );
|
|
Way::GetInterface()->fn_vSetModifDeleteOk (FALSE);
|
|
}
|
|
}
|
|
else m_poWay->fn_vNotifySave ();
|
|
|
|
|
|
|
|
m_pEditor->fn_vUpdateAll (E_mc_JustDraw);
|
|
// m_poWay->fn_vNotifySave ();
|
|
return TRUE;
|
|
}
|
|
|
|
*/
|
|
//ENDANNECY Shaitan Nettoyage }
|