reman3/Rayman_X/cpa/tempgrp/Owp/src/NtwObj.cpp

1290 lines
36 KiB
C++

//ROMTEAM Networks (Gabriela Dumitrascu 25/02/98)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Description : NtwObj.cpp
//
// Definition of the waypoint editors objects
//
///////////////////////////////////////////////////////////////////////////////////////////////////
// inherit from : CPA_Object
// CPA_EdMot<ACP_tdxHandleOfLink>
///////////////////////////////////////////////////////////////////////////////////////////////////
// Creation date: 1998-03-02 Author: CPA2 Gabriela Dumitrascu
///////////////////////////////////////////////////////////////////////////////////////////////////
// Modification date: Author:
///////////////////////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "acp_base.h"
#include "resource.h"
#include "incdpt.h"
#include "incitf.h"
#include "incgam.h"
#include "incai.h"
#include "WPObj.hpp"
//ANNECY Shaitan Nettoyage (12/05/98) {
/*
#include "WayObj.hpp"
#include "LinkObj.hpp"
*/
//ENDANNECY Shaitan Nettoyage }
#include "Inter.hpp"
#include "WPMod.hpp"
// Shaitan Correction {
#include "WPObj.hpp"
//End Shaitan Correction }
#include "NtwDia.hpp"
#include "NtwObj.hpp"
#include "NtwMod.hpp"
#include "x:\cpa\main\inc\_editid.h"
//--------------------------------------- Script definition
static char* pszGraphAction = "WPGraph";
static char* pszSommetAction = "WPSommet";
//----------------------------------------------- static variables
NtwDia* Graph::ms_poNtwDia;
CPA_List<Graph> Graph::ms_oListOfGraph;
BOOL Graph::ms_bNotifyHeader;
Waypoint_Interface* Graph::ms_poInterface;
DeclareTemplateStatic(WP_tdHandleOfGraph);
void Graph::fn_vSetDialog ( NtwDia* poNtwDia )
{
ms_poNtwDia = poNtwDia;
ms_poNtwDia->fn_vInitDialog ();
}
WP_tdHandleOfGraph fn_hCreate ()
{
WP_tdHandleOfGraph hGraph = WPG_fn_hCreate ("", "");
WPG_fn_vAddGlobalGraph(hGraph);
return hGraph;
// return NULL;
}
void fn_vDestroy(WP_tdHandleOfGraph h)
{
if (M_GetMainApp()->m_bLeavingApplication == TRUE)
return;
WPG_fn_vDestroy(h);
}
void fn_vCopy(WP_tdHandleOfGraph hDst, WP_tdHandleOfGraph hSrc)
{
WPG_fn_vCopy(hDst, hSrc);
}
void Graph::fn_vInitObject (Waypoint_Interface* poInterface)
{
// init Edmot
CPA_EdMot<WP_tdHandleOfGraph>::Init (fn_hCreate, fn_vCopy, fn_vDestroy);
ms_bNotifyHeader=FALSE;
ms_poInterface = poInterface;
}
void Graph::fn_vRefreshGraph (void)
{
fn_pGetDialog()->fn_vRefreshDialog();
}
Graph* Graph::fn_pGetGraph(WP_tdhWayPoint hWP)
{
POSITION lPos;
for (Graph* poGraph = Graph::ms_oListOfGraph.GetHeadElement(lPos); poGraph; poGraph= Graph::ms_oListOfGraph.GetNextElement(lPos))
{
if (poGraph->fn_bHasNode(hWP))
return poGraph;
}
return NULL;
}
// to create a new instance
Graph::Graph(CPA_ObjectDLLBase *p_oDLL, CString csName, BOOL bSave) :
CPA_SaveObject ( p_oDLL, C_szGraphTypeName, E_ss_Responsible )
{
m_bSave=bSave;
m_poSuperObject = NULL;
ms_oListOfGraph.AddTail (this);
// Set the graph reference
char szLevelFileName [256];
char szSectionName [SCR_CV_ui_Cfg_MaxLenName];
fn_zsGetActualLevelFilename (szLevelFileName, "wp");
long lSizePath = strlen(fn_szGetLevelsDataPath());
CString csLevelName = szLevelFileName + lSizePath + 1;
csLevelName += "^";
csLevelName += C_SubSectionIsolateWayPointDescription;
csLevelName += "^";
csLevelName += C_SectionWayPointDescription;
csLevelName += ":";
WPG_fn_vSetReferenceSection(GetEngineStruct(), csLevelName);
// Init the WP_tdHandleOfGraph structure.
// WP_tdHandleOfGraph hGraph = WPG_fn_hCreate((char*)(LPCSTR)csName, (char*)(LPCSTR)csLevelName);
// WPG_fn_vAddGlobalGraph(hGraph);
// SetStruct(hGraph);
csLevelName = szLevelFileName + lSizePath + 1;
// section object
SetSectionData (this) ;
SetCallBackSave (fn_vCallbackSave) ;
SetDataPath (fn_szGetLevelsDataPath());
SCR_fn_v_RdL0_ComputeSectionName ( szSectionName, (char *)(LPCSTR)csLevelName, pszGraphAction, " ");
SetReferencedSectionName (szSectionName);
// name
if ( fn_eRename (csName) != E_mc_None)
SetDefaultValidName();
// Set the graph name
WPG_fn_vSetNameOfGraph(GetEngineStruct(), GetName());
fn_vUpdateSectionName();
SetExistingSection (FALSE);
fn_vNotifySave ();
// add graph to linktable
SCR_tdst_Link_Value *pValue = SCR_fnp_st_Link_SearchValue(WPG_fnp_Graph_GetLinkTable(), (unsigned long) GetEngineStruct());
if (pValue)
{
SCR_fn_v_Link_DeleteEntry(WPG_fnp_Graph_GetLinkTable(), pValue);
}
WPG_fn_vAddGlobalGraph(GetEngineStruct());
// Shaitan Correction {
fn_vInitGraphicConnections();
//End Shaitan Correction }
}
// to load a graph
Graph::Graph ( CPA_ObjectDLLBase *p_oDLL, WP_tdHandleOfGraph hEngineGraph, CString csName, CString csFileName, CString csSectionName ):
CPA_SaveObject ( p_oDLL, C_szGraphTypeName, E_ss_Responsible ),
CPA_EdMot<WP_tdHandleOfGraph>(hEngineGraph)
{
char szSectionName [SCR_CV_ui_Cfg_MaxLenName];
m_bSave=TRUE;
m_poSuperObject = NULL;
ms_oListOfGraph.AddTail (this);
// section object
SetSectionData ( this ) ;
SetCallBackSave ( fn_vCallbackSave ) ;
SetDataPath ( fn_szGetLevelsDataPath() ) ;
SCR_fn_v_RdL0_ComputeSectionName ( szSectionName, (char *)(LPCSTR)csFileName, pszGraphAction, " ");
SetReferencedSectionName (szSectionName);
// name
if (fn_eRename (csName) != E_mc_None)
SetDefaultValidName() ;
fn_vUpdateSectionName() ;
SetExistingSection(TRUE) ;
if (!GetEditor()->GetInterface()->fn_bIsLoadingWorld())
fn_vNotifySave ();
// Shaitan Correction {
fn_vInitGraphicConnections();
//End Shaitan Correction }
}
Graph::Graph( Graph& rGraph):
CPA_SaveObject ( ms_poInterface, C_szGraphTypeName, E_ss_Responsible ),
CPA_EdMot<WP_tdHandleOfGraph>(rGraph)
{
m_poSuperObject = NULL;
m_bSave=rGraph.m_bSave;
ms_oListOfGraph.AddTail (this);
fn_vCopy (GetStruct(), rGraph.GetStruct());
// section object
SetSectionData ( this ) ;
SetCallBackSave ( fn_vCallbackSave ) ;
SetDataPath ( fn_szGetLevelsDataPath() ) ;
SetReferencedSectionName ( rGraph.GetReferencedSectionName() );
// name
if (fn_eRename (rGraph.GetName() ) != E_mc_None)
SetDefaultValidName ( ) ;
fn_vUpdateSectionName ( ) ;
// Set the graph name
WPG_fn_vSetNameOfGraph(GetEngineStruct(), GetName());
fn_vNotifySave ();
// add graph to linktable
WPG_fn_vAddGlobalGraph(GetEngineStruct());
// Shaitan Correction {
fn_vInitGraphicConnections();
//End Shaitan Correction }
}
Graph::~Graph(void)
{
fn_vNotifyUnSave ();
POSITION DeletePos = ms_oListOfGraph.Find(this);
ms_oListOfGraph.RemoveAt(DeletePos);
}
Graph& Graph::operator= (Graph& rGraph)
{
m_bSave = rGraph.m_bSave;
fn_vCopy(GetStruct(), rGraph.GetStruct());
return *this;
}
long Graph::GetDataType (void)
{
return C_ucGraph;
}
tdeMissingCriteria Graph::fn_eCheckUnicity (const CString csNewName)
{
return E_mc_None;
}
WayPoint* Graph::GetWaypoint(WP_tdhWayPoint hWP)
{
CPA_BaseObject* poBaseObject = GetInterface()->GetMainWorld()->fn_p_oFindObjectWithEngine (hWP);
ASSERT ( poBaseObject );
return (WayPoint*)poBaseObject;
}
// Shaitan Correction {
void Graph::fn_vAddNode(WP_tdhWayPoint hWP, BOOL pBlock)
{
WayPoint *pNode;
InsertNode *pModif;
if (fn_bHasNode(hWP))
return;
// get parameters
pNode = GetWaypoint(hWP);
// create modification
pModif = new InsertNode(this, pNode, pBlock);
GetInterface()->GetInterface()->GetMultiDevice()->GetEditManager()->AskFor(pModif);
/* ModifGraph *pModif = new ModifGraph(this, GRAPH_INSERT_NODE);
WPG_fn_lAddWayPointIfNotExists(GetEngineStruct(), hWP, 0L); // BART
pModif->ModifSave();
// GetInterface()->GetInterface()->GetMultiDevice()->GetEditManager()->AskFor(pModif);
*/
}
void Graph::fn_vAddNode(WayPoint *pNode, BOOL pBlock)
{
InsertNode *pModif;
if (fn_bHasNode(pNode->GetStruct()))
return;
// create modification
pModif = new InsertNode(this, pNode, pBlock);
GetInterface()->GetInterface()->GetMultiDevice()->GetEditManager()->AskFor(pModif);
}
BOOL Graph::fn_bRemoveNode(int iNode, BOOL pBlock)
{
WP_tdhWayPoint hWayPoint = fn_hGetWayPointOfNode(iNode);
DeleteNode *pModif;
WayPoint *pNode;
if (!fn_bHasNode(hWayPoint))
return FALSE;
// get parameters
pNode = GetWaypoint(hWayPoint);
// create modification
pModif = new DeleteNode(this, pNode, pBlock);
GetInterface()->GetInterface()->GetMultiDevice()->GetEditManager()->AskFor(pModif);
return TRUE;
/*
ModifGraph *pModif = new ModifGraph(this, GRAPH_DELETE_NODE, bGroup);
int i ;
WP_tdhGraphNode hNode, hNextNode ;
WP_tdhWayPoint hWayPoint = fn_hGetWayPointOfNode(iNode);
LST2_M_DynamicForEachMovingElementOf(&GetEngineStruct()->m_hListOfNode, hNode, hNextNode, i)
{
WPG_fn_lRemoveArcFromWayPoint(GetEngineStruct(), hNode->m_hWayPoint, hWayPoint);
}
BOOL bRet = WPG_fn_lRemoveWayPoint(GetEngineStruct(), hWayPoint) != -1;
pModif->ModifSave();
GetInterface()->GetInterface()->GetMultiDevice()->GetEditManager()->AskFor(pModif);
return bRet;
*/
}
BOOL Graph::fn_bRemoveNode(WayPoint *pNode, BOOL pBlock)
{
DeleteNode *pModif;
if (!fn_bHasNode(pNode->GetStruct()))
return FALSE;
// create modification
pModif = new DeleteNode(this, pNode, pBlock);
GetInterface()->GetInterface()->GetMultiDevice()->GetEditManager()->AskFor(pModif);
return TRUE;
}
//End Shaitan Correction }
WP_tdhWayPoint Graph::fn_hGetWayPointOfNode(int iNode)
{
long lTypeOfWP; //BART
ASSERT(iNode >= 0 && iNode < WPG_fn_lNumberOfWaypointOfGraph(GetEngineStruct()));
return WPG_fn_hGetWaypointOfGraph(GetEngineStruct(), iNode, &lTypeOfWP);
}
int Graph::fn_iGetNodeOfWayPoint(WP_tdhWayPoint hWP)
{
int i;
WP_tdhGraphNode hNode;
LST2_M_DynamicForEachElementOf(&GetEngineStruct()->m_hListOfNode, hNode, i)
{
if (hNode->m_hWayPoint == hWP)
return i;
}
return -1;
}
WP_tdhGraphNode Graph::fn_hGetNode(int iNode)
{
ASSERT(iNode >= 0 && iNode < WPG_fn_lNumberOfWaypointOfGraph(GetEngineStruct()));
int i;
WP_tdhGraphNode hNode;
LST2_M_DynamicGetElementNumber(&GetEngineStruct()->m_hListOfNode, hNode, iNode, i);
return hNode;
}
int Graph::fn_iGetNumberOfArcs(WP_tdhGraphNode hNode)
{
ASSERT(hNode);
return LST2_M_DynamicGetNumberOfElements(&hNode->m_hListOfArc->m_hArc);
}
WP_tdHandleOfArc Graph::fn_hGetArc(WP_tdhGraphNode hNode, int iArc)
{
ASSERT(iArc >= 0 && iArc < fn_iGetNumberOfArcs(hNode));
int i;
WP_tdHandleOfArc hArc;
LST2_M_DynamicGetElementNumber(&hNode->m_hListOfArc->m_hArc, hArc, iArc, i);
return hArc;
}
int Graph::fn_iGetArcOfNode(WP_tdhGraphNode hNode, WP_tdhGraphNode hArcNode)
{
int i;
WP_tdHandleOfArc hArc;
LST2_M_DynamicForEachElementOf(&hNode->m_hListOfArc->m_hArc, hArc, i)
{
if (hArc->m_hNode == hArcNode)
return i;
}
return -1;
}
// Shaitan Correction {
void Graph::fn_vAddArcToNode(WP_tdhGraphNode hNode, WP_tdhGraphNode hArcNode, BOOL pBlock)
{
WayPoint *pSrcNode;
WayPoint *pDstNode;
InsertConnection *pModif;
if (fn_bNodeHasArc(hNode, hArcNode))
return;
// get parameters
pSrcNode = GetWaypoint(hNode->m_hWayPoint);
pDstNode = GetWaypoint(hArcNode->m_hWayPoint);
// create modification
pModif = new InsertConnection(this, pSrcNode, pDstNode, TRUE, pBlock);
GetInterface()->GetInterface()->GetMultiDevice()->GetEditManager()->AskFor(pModif);
/*
if (fn_bNodeHasArc(hNode, hArcNode))
return;
ModifGraph *pModif = new ModifGraph(this, GRAPH_INSERT_ARC);
WPG_fn_vAddArc(hNode, hArcNode, 0, 0);
pModif->ModifSave();
// GetInterface()->GetInterface()->GetMultiDevice()->GetEditManager()->AskFor(pModif);
*/
}
void Graph::fn_vAddArcToNode(WayPoint *pSrcNode, WayPoint *pDstNode, BOOL bUpdate, BOOL pBlock)
{
InsertConnection *pModif;
if (GetGraphicConnection(pSrcNode, pDstNode) != NULL)
return;
// create modification
pModif = new InsertConnection(this, pSrcNode, pDstNode, bUpdate, pBlock);
GetInterface()->GetInterface()->GetMultiDevice()->GetEditManager()->AskFor(pModif);
}
void Graph::fn_vRemoveArcOfNode(WP_tdhGraphNode hNode, int iArc, BOOL pBlock)
{
WayPoint *pSrcNode;
WayPoint *pDstNode;
DeleteConnection *pModif;
// get parameters
pSrcNode = GetWaypoint(hNode->m_hWayPoint);
pDstNode = GetWaypoint(fn_hGetArc(hNode, iArc)->m_hNode->m_hWayPoint);
// create modification
pModif = new DeleteConnection(this, pSrcNode, pDstNode, pBlock);
GetInterface()->GetInterface()->GetMultiDevice()->GetEditManager()->AskFor(pModif);
/*
ModifGraph *pModif = new ModifGraph(this, GRAPH_DELETE_ARC);
WPG_fn_vRemoveArc(hNode, fn_hGetArc(hNode, iArc)->m_hNode);
pModif->ModifSave();
// GetInterface()->GetInterface()->GetMultiDevice()->GetEditManager()->AskFor(pModif);
*/
}
void Graph::fn_vRemoveArcOfNode(WayPoint *pSrcNode, WayPoint *pDstNode, BOOL pBlock)
{
DeleteConnection *pModif;
// create modification
pModif = new DeleteConnection(this, pSrcNode, pDstNode, pBlock);
GetInterface()->GetInterface()->GetMultiDevice()->GetEditManager()->AskFor(pModif);
/*
ModifGraph *pModif = new ModifGraph(this, GRAPH_DELETE_ARC);
WPG_fn_vRemoveArc(hNode, fn_hGetArc(hNode, iArc)->m_hNode);
pModif->ModifSave();
// GetInterface()->GetInterface()->GetMultiDevice()->GetEditManager()->AskFor(pModif);
*/
}
//End Shaitan Correction }
void Graph::fn_vSetDefaultArcWeight(WP_tdhGraphNode hNode, int iArc)
{
WP_tdHandleOfArc hArc = fn_hGetArc(hNode, iArc);
MTH3D_tdstVector m_vertex1, m_vertex2;
WP_fnv_WayPoint_ComputeLocation(hNode->m_hWayPoint, &m_vertex1);
WP_fnv_WayPoint_ComputeLocation(hArc->m_hNode->m_hWayPoint, &m_vertex2);
MTH_tdxReal dx = m_vertex1.xX - m_vertex2.xX;
MTH_tdxReal dy = m_vertex1.xY - m_vertex2.xY;
MTH_tdxReal dz = m_vertex1.xZ - m_vertex2.xZ;
long lDist = (long)sqrt(dx * dx + dy * dy + dz * dz);
WPARC_fn_lSetWeight(hArc, lDist);
}
// Shaitan NewParam {
void Graph::fn_vSetDefaultAllArcsWeight()
{
WP_tdHandleOfArc hArc;
WP_tdhGraphNode hNode;
WayPoint *pSrcNode, *pDstNode;
long lWeight;
int iNode, iArc;
LST2_M_DynamicForEachElementOf(&GetEngineStruct()->m_hListOfNode, hNode, iNode)
{
for (iArc = 0; iArc < fn_iGetNumberOfArcs(hNode); iArc++)
{
hArc = fn_hGetArc(hNode, iArc);
pSrcNode = GetWaypoint(hNode->m_hWayPoint);
pDstNode = GetWaypoint(hArc->m_hNode->m_hWayPoint);
lWeight = fn_lGetDefaultArcWeight(pSrcNode, pDstNode);
SetConnectionWeight(pSrcNode, pDstNode, lWeight);
}
}
// notify
fn_vNotifySave();
}
long Graph::fn_lGetDefaultArcWeight(WayPoint* pSrcNode, WayPoint* pDstNode)
{
MTH3D_tdstVector stVertex1, stVertex2;
MTH_tdxReal dx, dy, dz;
long lDist;
// compute distance
WP_fnv_WayPoint_ComputeLocation(pSrcNode->GetStruct(), &stVertex1);
WP_fnv_WayPoint_ComputeLocation(pDstNode->GetStruct(), &stVertex2);
dx = stVertex1.xX - stVertex2.xX;
dy = stVertex1.xY - stVertex2.xY;
dz = stVertex1.xZ - stVertex2.xZ;
lDist = (long)sqrt(dx * dx + dy * dy + dz * dz);
return lDist;
}
void Graph::fn_vSetAllArcsCapacity(long lCapacity)
{
WP_tdHandleOfArc hArc;
WP_tdhGraphNode hNode;
WayPoint *pSrcNode, *pDstNode;
int iNode, iArc;
LST2_M_DynamicForEachElementOf(&GetEngineStruct()->m_hListOfNode, hNode, iNode)
{
for (iArc = 0; iArc < fn_iGetNumberOfArcs(hNode); iArc++)
{
hArc = fn_hGetArc(hNode, iArc);
pSrcNode = GetWaypoint(hNode->m_hWayPoint);
pDstNode = GetWaypoint(hArc->m_hNode->m_hWayPoint);
SetConnectionCapacity(pSrcNode, pDstNode, lCapacity);
}
}
// notify
fn_vNotifySave();
}
//End Shaitan NewParam }
//-------------------------------------------------------------------
// SAVE
//-------------------------------------------------------------------
void Graph::fn_vNotifySave (void)
{
if (!m_bSave) return;
if (!GetInterface()->fn_bExistWaypointSaveFile() && !ms_bNotifyHeader)
{
char szSectionName [SCR_CV_ui_Cfg_MaxLenName];
// header
SCR_fn_v_SvL1_RegisterNotify ( GetInterface()->fn_csGetWaypointSaveFileName().GetBuffer(256), WayPoint::fn_vCallbackHeader, NULL, SCR_EA_Ntfy_AddSection );
// Isolate section
SCR_fn_v_RdL0_ComputeSectionName
(
szSectionName,
GetInterface()->fn_csGetWaypointSaveFileName().GetBuffer(256),
C_SubSectionIsolateWayPointDescription,
" "
);
SCR_fn_v_SvL1_RegisterNotify ( szSectionName, WayPoint::fn_vCallbackEmptySectionWaypointIsolate, NULL, SCR_EA_Ntfy_AddSection );
// Inway section
SCR_fn_v_RdL0_ComputeSectionName
(
szSectionName,
GetInterface()->fn_csGetWaypointSaveFileName().GetBuffer(256),
C_SubSectionInWayWayPointDescription,
" "
);
SCR_fn_v_SvL1_RegisterNotify ( szSectionName, WayPoint::fn_vCallbackEmptySectionWaypointInWay, NULL, SCR_EA_Ntfy_AddSection );
//Graph section
SCR_fn_v_RdL0_ComputeSectionName
(
szSectionName,
GetInterface()->fn_csGetWaypointSaveFileName().GetBuffer(256),
C_SectionWPGraphDescription,
" "
);
SCR_fn_v_SvL1_RegisterNotify ( szSectionName, Graph::fn_vCallbackEmptySectionWPGraph, NULL, SCR_EA_Ntfy_AddSection );
//WPSommet section
SCR_fn_v_RdL0_ComputeSectionName
(
szSectionName,
GetInterface()->fn_csGetWaypointSaveFileName().GetBuffer(256),
C_SectionWPSommetDescription,
" "
);
SCR_fn_v_SvL1_RegisterNotify ( szSectionName, Graph::fn_vCallbackEmptySectionWPSommet, NULL, SCR_EA_Ntfy_AddSection );
ms_bNotifyHeader=TRUE;
}
CPA_SaveObject::fn_vNotifySave();
}
void Graph::fn_vNotifyUnSave (void)
{
if (m_bSave) CPA_SaveObject::fn_vNotifyUnSave ();
}
void Graph::fn_vNotifyRestore (void)
{
if (m_bSave) CPA_SaveObject::fn_vNotifyRestore ();
}
void Graph::fn_vNotifyRename (void)
{
if (m_bSave) CPA_SaveObject::fn_vNotifyRename ();
}
void Graph::fn_vUpdateReference (CPA_SaveObject *pReferencedObject)
{
if (m_bSave) fn_vUpdateReference (pReferencedObject);
}
// create empty section for WPGraph
void Graph::fn_vCallbackEmptySectionWPGraph ( SCR_tdst_File_Description *p_stFile, char *p_szSectionName, void *_p_vData,SCR_tde_Ntfy_Action _eAction )
{
if (_eAction==SCR_EA_Ntfy_AddSection)
{
char szSectionName [SCR_CV_ui_Cfg_MaxLenName];
strcpy ( szSectionName, C_SectionWPGraphDescription );
strcat ( szSectionName, ":" );
SCR_fn_v_SvL1_ToEndSection (p_stFile);
SCR_M_SvL0_SaveBlankLine (p_stFile);
SCR_M_SvL0_SaveBeginSection ( p_stFile, szSectionName, SCR_CC_C_Cfg_EOL );
SCR_M_SvL0_SaveEndSection ( p_stFile, SCR_CC_C_Cfg_EOL );
}
}
// create empty section for WPSommet
void Graph::fn_vCallbackEmptySectionWPSommet ( SCR_tdst_File_Description *p_stFile, char *p_szSectionName, void *_p_vData,SCR_tde_Ntfy_Action _eAction )
{
if (_eAction==SCR_EA_Ntfy_AddSection)
{
char szSectionName [SCR_CV_ui_Cfg_MaxLenName];
strcpy ( szSectionName, C_SectionWPSommetDescription );
strcat ( szSectionName, ":" );
SCR_fn_v_SvL1_ToEndSection (p_stFile);
SCR_M_SvL0_SaveBlankLine (p_stFile);
SCR_M_SvL0_SaveBeginSection ( p_stFile, szSectionName, SCR_CC_C_Cfg_EOL );
SCR_M_SvL0_SaveEndSection ( p_stFile, SCR_CC_C_Cfg_EOL );
}
}
void Graph::fn_vCallbackSave ( SCR_tdst_File_Description *_p_stFile, char *_p_szSectionName, void *_p_vData,SCR_tde_Ntfy_Action _eAction )
{
fn_pGetDialog()->UpdateData();
Graph* poGraph = (Graph*)_p_vData;
CString ref;
switch (_eAction)
{
case SCR_EA_Ntfy_AddSection :
SCR_fn_v_SvL1_ToEndSection (_p_stFile);
case SCR_EA_Ntfy_ModifySection :
case SCR_EA_Ntfy_RebuildSection :
{
// declaration
WP_tdHandleOfGraph hGraph;
char szSectionName [SCR_CV_ui_Cfg_MaxLenName];
char szObjectName [SCR_CV_ui_Cfg_MaxLenName];
//init
hGraph = (WP_tdHandleOfGraph)(poGraph->GetStruct());
strcpy ( szObjectName, poGraph->GetName() );
SCR_fn_v_RdL0_ComputeSectionName
(
szSectionName,
NULL,
pszGraphAction,
szObjectName
);
SCR_M_SvL0_SaveBeginSection ( _p_stFile, szSectionName, SCR_CC_C_Cfg_NoChar );
SCR_fn_v_SvL0_SaveParameters_MP( _p_stFile, SCR_EF_SvL0_Normal, 1, WPG_fn_szGetReferenceSection( hGraph ));
for(int i = 0; i < poGraph->fn_iGetNumberOfNodes(); i++)
{
WP_tdhGraphNode hNode = poGraph->fn_hGetNode(i);
strcpy ( szObjectName, GetWaypoint(hNode->m_hWayPoint)->GetName());
SCR_fn_v_RdL0_ComputeSectionName
(
szSectionName,
NULL,
pszSommetAction,
szObjectName
);
SCR_g_ui_SvL0_IndentationLevel=1;
long lType;
WPG_fn_hGetWaypointOfGraph(poGraph->GetStruct(), i, &lType);
// Shaitan NewParam {
if (lType !=0)
{
SCR_M_SvL0_SaveBeginSection ( _p_stFile, szSectionName, SCR_CC_C_Cfg_NoChar );
char szType[33];
for (int i = 31, iMask = 1; i >= 0; i--, iMask <<= 1)
szType[i] = (lType & iMask) ? '1' : '0';
szType[32] = '\0';
SCR_fn_v_SvL0_SaveParameters_MP( _p_stFile, SCR_EF_SvL0_Scanf, 1, "%s", szType);
}
else
SCR_M_SvL0_SaveBeginSection ( _p_stFile, szSectionName, SCR_CC_C_Cfg_EOL );
//End Shaitan NewParam }
for(int j = 0; j < poGraph->fn_iGetNumberOfArcs(hNode); j++)
{
WP_tdHandleOfArc hArc = poGraph->fn_hGetArc(hNode,j);
SCR_M_SvL0_SaveEntry( _p_stFile, (char*)(LPCSTR)GetWaypoint(hArc->m_hNode->m_hWayPoint)->GetName(), SCR_CC_C_Cfg_NoChar );
long lWeight = WPARC_fn_lGetWeight(hArc);
char szCapacity[33];
int iCapacity = WPARC_fn_ulGetCapability(hArc);
for (int i = 31, iMask = 1; i >= 0; i--, iMask <<= 1)
szCapacity[i] = (iCapacity & iMask) ? '1' : '0';
szCapacity[32] = '\0';
SCR_fn_v_SvL0_SaveParameters_MP( _p_stFile, SCR_EF_SvL0_Scanf, 2, "%i,%s", lWeight, szCapacity);
}
SCR_M_SvL0_SaveEndSection (_p_stFile, SCR_CC_C_Cfg_EOL);
SCR_g_ui_SvL0_IndentationLevel=0;
}
SCR_M_SvL0_SaveEndSection (_p_stFile, SCR_CC_C_Cfg_EOL);
SCR_g_ui_SvL0_IndentationLevel=0;
poGraph->fn_vSectionSaved ();
} break;
case SCR_EA_Ntfy_DeleteSection :
poGraph->fn_vSectionDeleted ();
break;
}
}
// Shaitan Correction {
/*
Connection::Connection(CPA_EditorBase *p_oEditor, int iGraph, int iNode, int iArc)
: Arrow3D(TRUE, p_oEditor)
{
fn_vDoRename("Connection");
m_iGraph = iGraph;
m_iNode = iNode;
m_iArc = iArc;
}
*/
//End Shaitan Correction }
//ENDROMTEAM Networks (Gabriela Dumitrascu)
// Shaitan Correction {
Connection::Connection(CPA_EditorBase *p_oEditor, Graph *pGraph, WayPoint *pSrcWP, WayPoint *pDstWP, long lCapacity, long lWeight)
: Arrow3D(TRUE, p_oEditor)
{
fn_vDoRename("Connection");
m_pGraph = pGraph;
m_pSrcWP = pSrcWP;
m_pDstWP = pDstWP;
m_lCapacity = lCapacity;
m_lWeight = lWeight;
}
void Graph::fn_vInitGraphicConnections (void)
{
WP_tdHandleOfArc hArc;
WP_tdhGraphNode hSrcNode;
CPA_SuperObject *poArrow;
WayPoint *pSrcNode;
WayPoint *pDstNode;
int iNode, iArc;
for (iNode = 0; iNode < fn_iGetNumberOfNodes(); iNode++)
{
hSrcNode = fn_hGetNode(iNode);
pSrcNode = GetWaypoint(hSrcNode->m_hWayPoint);
for (iArc = 0; iArc < fn_iGetNumberOfArcs(hSrcNode); iArc++)
{
hArc = fn_hGetArc(hSrcNode, iArc);
pDstNode = GetWaypoint(hArc->m_hNode->m_hWayPoint);
poArrow = GetInterface()->fn_pCreateConnectionGraphicObject(this, pSrcNode, pDstNode, WPARC_fn_ulGetCapability(hArc), WPARC_fn_lGetWeight(hArc));
ms_oListOfArrows.AddTail(poArrow);
}
}
}
void Graph::fn_vUpdateConnection (CPA_SuperObject *pConnection, BOOL bUpdate)
{
GEO_tdxHandleToMatrix hLocalMatrix;
POS_tdstCompletePosition stInvertMatrix;
MTH3D_tdstMatrix stRotZMatrix, stRotXMatrix, stScaleMatrix;
MTH3D_tdstVector stVertex1, stVertex2, stVertexZ, stTransVect;
MTH_tdxReal cx, cy, cz, d, dist;
Connection *pLinkObject = (Connection *) pConnection->GetObject();
WayPoint *pSrcWP = pLinkObject->GetSrcWayPoint();
WayPoint *pDstWP = pLinkObject->GetDstWayPoint();
hLocalMatrix = HIE_fn_hGetSuperObjectMatrix (pConnection->GetStruct());
// compute arrow direction
WP_fnv_WayPoint_ComputeLocation((WP_tdhWayPoint)pSrcWP->GetEngineStruct(), &stVertex1);
WP_fnv_WayPoint_ComputeLocation((WP_tdhWayPoint)pDstWP->GetEngineStruct(), &stVertex2);
MTH3D_M_vSubVector( &stVertex2,&stVertex2,&stVertex1 );
dist = MTH3D_M_xNormVector(&stVertex2);
stVertex2.xZ = -stVertex2.xZ;
// compute rotation matrix
MTH3D_M_vNormalizeVector(&stVertex2,&stVertex2);
if ((stVertex2.xX == 0 && stVertex2.xY ==0))
{
stVertex2.xX = 0.01f;
stVertex2.xY = 0.01f;
}
cx = MTH3D_M_xGetXofVector(&stVertex2);
cy = MTH3D_M_xGetYofVector(&stVertex2);
cz = MTH3D_M_xGetZofVector(&stVertex2);
d = (float)sqrt(cx * cx + cy * cy);
MTH3D_M_vSetVectorElements(&stRotZMatrix.stCol_0, cy/d, -cx/d, 0);
MTH3D_M_vSetVectorElements(&stRotZMatrix.stCol_1, cx/d, cy/d, 0);
MTH3D_M_vSetVectorElements(&stRotZMatrix.stCol_2, 0, 0, 1);
MTH3D_M_vSetVectorElements(&stRotXMatrix.stCol_0, 1, 0, 0);
MTH3D_M_vSetVectorElements(&stRotXMatrix.stCol_1, 0, cz, d);
MTH3D_M_vSetVectorElements(&stRotXMatrix.stCol_2, 0, -d, cz);
MTH3D_M_vMulMatrixMatrix(&stRotXMatrix, &stRotZMatrix, &stRotXMatrix);
MTH3D_M_vInverMatrix(&stRotZMatrix, &stRotZMatrix);
MTH3D_M_vMulMatrixMatrix(&stRotXMatrix, &stRotXMatrix, &stRotZMatrix);
MTH3D_M_vSetVectorElements(&stVertexZ, 0, 0, 1);
MTH3D_M_vMulMatrixVector(&stVertexZ, &stRotXMatrix, &stVertexZ);
if (stVertex2.xX * stVertexZ.xX > 0)
MTH3D_M_vMulScalarVector(&stRotXMatrix.stCol_0, -1,&stRotXMatrix.stCol_0);
if (stVertex2.xY * stVertexZ.xY > 0)
MTH3D_M_vMulScalarVector(&stRotXMatrix.stCol_1, -1,&stRotXMatrix.stCol_1);
if (stVertex2.xZ * stVertexZ.xZ >= 0)
MTH3D_M_vMulScalarVector(&stRotXMatrix.stCol_2, -1,&stRotXMatrix.stCol_2);
POS_fn_vSetRotationMatrix(hLocalMatrix , &stRotXMatrix.stCol_0, &stRotXMatrix.stCol_1, &stRotXMatrix.stCol_2);
POS_fn_vNormalizeMatrix(hLocalMatrix);
// Translate arrow to waypoint
MTH3D_M_vSetVectorElements(&stTransVect, stVertex2.xX * dist, stVertex2.xY * dist, -stVertex2.xZ * dist);
POS_fn_vSetTranslationVector(hLocalMatrix, &stTransVect);
// for dynamic WPs : update matrix with WP matrix
POS_fn_vInvertMatrix(&stInvertMatrix, HIE_fn_hGetSuperObjectGlobalMatrix(pSrcWP->GetSuperObject()->GetStruct()));
MTH3D_M_vSetVectorElements(&stVertex1, 0.0f, 0.0f, 0.0f);
POS_fn_vSetTranslationVector(&stInvertMatrix, &stVertex1);
POS_fn_vMulMatrixMatrix(hLocalMatrix, &stInvertMatrix, hLocalMatrix);
POS_fn_vNormalizeMatrix(hLocalMatrix);
// scale the arrow.
MTH3D_M_vSetVectorElements(&stScaleMatrix.stCol_0, 0.3f, 0, 0);
MTH3D_M_vSetVectorElements(&stScaleMatrix.stCol_1, 0, 0.3f, 0);
MTH3D_M_vSetVectorElements(&stScaleMatrix.stCol_2, 0, 0, dist/1.2f);
POS_fn_vSetScaleMatrix(hLocalMatrix , &stScaleMatrix.stCol_0, &stScaleMatrix.stCol_1, &stScaleMatrix.stCol_2);
if (bUpdate)
GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
}
void Graph::fn_vDisplayConnection (CPA_SuperObject *pConnection, BOOL bUpdate)
{
Connection *pLinkObject = (Connection *) pConnection->GetObject();
WayPoint *pSrcWP = pLinkObject->GetSrcWayPoint();
// create the connection arrow
pConnection->SetSuperObjectOwner(pSrcWP->GetSuperObject());
pSrcWP->GetSuperObject()->AddTail(pConnection);
// update position
fn_vUpdateConnection(pConnection, bUpdate);
}
void Graph::fn_vDisplayAllLinks (BOOL bDisplay, BOOL bUpdate)
{
CPA_SuperObject *pConnection;
POSITION pos;
for (pConnection = ms_oListOfArrows.GetHeadElement(pos); pConnection; pConnection = ms_oListOfArrows.GetNextElement(pos))
{
if (bDisplay)
fn_vDisplayConnection(pConnection, FALSE);
else
pConnection->IsolateChild();
}
if (bUpdate)
GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
}
void Graph::fn_vDisplayOutLinks (WayPoint* pSrcNode, BOOL bUpdate)
{
CPA_SuperObject *pConnection;
Connection *pLinkObject;
POSITION pos;
for (pConnection = ms_oListOfArrows.GetHeadElement(pos); pConnection; pConnection = ms_oListOfArrows.GetNextElement(pos))
{
pLinkObject = (Connection *) pConnection->GetObject();
if (pLinkObject->GetSrcWayPoint() == pSrcNode)
fn_vDisplayConnection(pConnection, FALSE);
else
pConnection->IsolateChild();
}
if (bUpdate)
GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
}
void Graph::fn_vDisplayInLinks (WayPoint* pDstNode, BOOL bUpdate)
{
CPA_SuperObject *pConnection;
Connection *pLinkObject;
POSITION pos;
for (pConnection = ms_oListOfArrows.GetHeadElement(pos); pConnection; pConnection = ms_oListOfArrows.GetNextElement(pos))
{
pLinkObject = (Connection *) pConnection->GetObject();
if (pLinkObject->GetDstWayPoint() == pDstNode)
fn_vDisplayConnection(pConnection, FALSE);
else
pConnection->IsolateChild();
}
if (bUpdate)
GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
}
void Graph::fn_vUpdateConnections (WayPoint *pMovedWP, BOOL bUpdate)
{
CPA_SuperObject *pConnection;
Connection *pLinkObject;
POSITION pos;
for (pConnection = ms_oListOfArrows.GetHeadElement(pos); pConnection; pConnection = ms_oListOfArrows.GetNextElement(pos))
{
pLinkObject = (Connection *) pConnection->GetObject();
if ((pLinkObject->GetDstWayPoint() == pMovedWP) || (pLinkObject->GetSrcWayPoint() == pMovedWP))
fn_vUpdateConnection(pConnection, FALSE);
}
if (bUpdate)
GetInterface()->GetInterface()->fn_vUpdateAll (E_mc_JustDraw);
}
void Graph::fn_vAddGraphicConnection (CPA_SuperObject *pConnection)
{
POSITION pos;
pos = ms_oListOfArrows.Find(pConnection);
if (!pos)
ms_oListOfArrows.AddTail(pConnection);
}
void Graph::fn_vRemoveGraphicConnection (CPA_SuperObject *pConnection)
{
POSITION pos;
pos = ms_oListOfArrows.Find(pConnection);
if (pos)
ms_oListOfArrows.RemoveAt(pos);
pConnection->IsolateChild();
}
CPA_SuperObject * Graph::GetGraphicConnection (WayPoint* pSrcNode, WayPoint* pDstNode)
{
CPA_SuperObject *pConnection;
Connection *pLinkObject;
POSITION pos;
for (pConnection = ms_oListOfArrows.GetHeadElement(pos); pConnection; pConnection = ms_oListOfArrows.GetNextElement(pos))
{
pLinkObject = (Connection *) pConnection->GetObject();
if ((pLinkObject->GetDstWayPoint() == pDstNode) && (pLinkObject->GetSrcWayPoint() == pSrcNode))
return pConnection;
}
return NULL;
}
void Graph::GetConnectionsToWaypoint (WayPoint *pNode, int iType, CPA_List<CPA_SuperObject> *pListToFill)
{
CPA_SuperObject *pConnection;
Connection *pLinkObject;
POSITION pos;
if (!pListToFill)
return;
for (pConnection = ms_oListOfArrows.GetHeadElement(pos); pConnection; pConnection = ms_oListOfArrows.GetNextElement(pos))
{
pLinkObject = (Connection *) pConnection->GetObject();
if ((pLinkObject->GetDstWayPoint() == pNode) && (iType <= 0))
pListToFill->AddTail(pConnection);
if ((pLinkObject->GetSrcWayPoint() == pNode) && (iType >= 0))
pListToFill->AddTail(pConnection);
}
}
void Graph::SetConnectionCapacity (WayPoint *pSrcNode, WayPoint *pDstNode, long lCapacity)
{
WP_tdHandleOfArc hArc;
WP_tdhGraphNode hSrcNode, hDstNode;
CPA_SuperObject *pConnection;
Connection *pLinkObject;
int iSrcNode, iDstNode, iArc;
// get corresponding connection
pConnection = GetGraphicConnection(pSrcNode, pDstNode);
if (!pConnection)
return;
pLinkObject = (Connection *) pConnection->GetObject();
// update editor connection
pLinkObject->SetCapacity(lCapacity);
// update engine connection
iSrcNode = fn_iGetNodeOfWayPoint(pSrcNode->GetStruct());
hSrcNode = fn_hGetNode(iSrcNode);
iDstNode = fn_iGetNodeOfWayPoint(pDstNode->GetStruct());
hDstNode = fn_hGetNode(iDstNode);
// register arc parameters
iArc = fn_iGetArcOfNode(hSrcNode, hDstNode);
hArc = fn_hGetArc(hSrcNode, iArc);
WPARC_fn_lSetCapability(hArc, (unsigned long)lCapacity);
// Shaitan NewParam {
// notify
fn_vNotifySave();
//End Shaitan NewParam }
}
void Graph::SetConnectionWeight (WayPoint *pSrcNode, WayPoint *pDstNode, long lWeight)
{
WP_tdHandleOfArc hArc;
WP_tdhGraphNode hSrcNode, hDstNode;
CPA_SuperObject *pConnection;
Connection *pLinkObject;
int iSrcNode, iDstNode, iArc;
// get corresponding connection
pConnection = GetGraphicConnection(pSrcNode, pDstNode);
if (!pConnection)
return;
pLinkObject = (Connection *) pConnection->GetObject();
// update editor connection
pLinkObject->SetWeight(lWeight);
// update engine connection
iSrcNode = fn_iGetNodeOfWayPoint(pSrcNode->GetStruct());
hSrcNode = fn_hGetNode(iSrcNode);
iDstNode = fn_iGetNodeOfWayPoint(pDstNode->GetStruct());
hDstNode = fn_hGetNode(iDstNode);
// register arc parameters
iArc = fn_iGetArcOfNode(hSrcNode, hDstNode);
hArc = fn_hGetArc(hSrcNode, iArc);
WPARC_fn_lSetWeight(hArc, lWeight);
// Shaitan NewParam {
// notify
fn_vNotifySave();
//End Shaitan NewParam }
}
long Graph::GetConnectionCapacity (WayPoint *pSrcNode, WayPoint *pDstNode)
{
CPA_SuperObject *pConnection;
Connection *pLinkObject;
// get corresponding connection
pConnection = GetGraphicConnection(pSrcNode, pDstNode);
pLinkObject = (Connection *) pConnection->GetObject();
// update editor connection
return pLinkObject->GetCapacity();
}
long Graph::GetConnectionWeight (WayPoint *pSrcNode, WayPoint *pDstNode)
{
CPA_SuperObject *pConnection;
Connection *pLinkObject;
// get corresponding connection
pConnection = GetGraphicConnection(pSrcNode, pDstNode);
pLinkObject = (Connection *) pConnection->GetObject();
// update editor connection
return pLinkObject->GetWeight();
}
void Graph::fn_vShowWaypoints (BOOL bShow)
{
WP_tdhGraphNode hNode;
WayPoint *pNode;
int iNode;
for (iNode = 0; iNode < fn_iGetNumberOfNodes(); iNode++)
{
hNode = fn_hGetNode(iNode);
pNode = GetWaypoint(hNode->m_hWayPoint);
if (pNode->GetSuperObject()->GetLocalColor() == E_lc_NoColor)
{
pNode->GetRealGraphic()->SetLocalColor((bShow) ? E_lc_Violet : E_lc_NoColor);
pNode->GetSymbolicalGraphic()->SetLocalColor((bShow) ? E_lc_Violet : E_lc_NoColor);
}
}
}
//End Shaitan Correction }
// Shaitan NewParam {
void Graph::SetNodeType (WayPoint *pSrcNode, long lType)
{
// set engine type
lType = WPG_fn_lChangeTypeOfWP (GetStruct(), pSrcNode->GetStruct(), lType);
// notify the change
fn_vNotifySave ();
}
long Graph::GetNodeType (WayPoint *pSrcNode)
{
WP_tdhWayPoint hWP;
long lType;
int iSrcNode;
// get index of node
iSrcNode = fn_iGetNodeOfWayPoint(pSrcNode->GetStruct());
// get engine type
hWP = WPG_fn_hGetWaypointOfGraph (GetStruct(), iSrcNode, &lType);
return (hWP ? lType : -1);
}
WayPoint * Graph::GetPrevNode (WayPoint *pSrcNode)
{
WP_tdhWayPoint hWP;
int iNode;
iNode = fn_iGetNodeOfWayPoint(pSrcNode->GetStruct());
if (iNode > 0)
{
hWP = fn_hGetWayPointOfNode(iNode - 1);
return GetWaypoint(hWP);
}
else
return NULL;
}
WayPoint * Graph::GetNextNode (WayPoint *pSrcNode)
{
WP_tdhWayPoint hWP;
int iNode;
iNode = fn_iGetNodeOfWayPoint(pSrcNode->GetStruct());
if (iNode < fn_iGetNumberOfNodes() -1 )
{
hWP = fn_hGetWayPointOfNode(iNode + 1);
return GetWaypoint(hWP);
}
else
return NULL;
}
WayPoint * Graph::GetPrevConnection (WayPoint *pSrcNode, WayPoint *pDstNode)
{
WP_tdHandleOfArc hArc;
WP_tdhGraphNode hNode, hArcNode;
int iNode, iArcNode, iArc;
iNode = fn_iGetNodeOfWayPoint(pSrcNode->GetStruct());
hNode = fn_hGetNode(iNode);
if (pDstNode)
{
iArcNode = fn_iGetNodeOfWayPoint(pDstNode->GetStruct());
hArcNode = fn_hGetNode(iArcNode);
iArc = fn_iGetArcOfNode(hNode, hArcNode);
hArc = fn_hGetArc(hNode, iArc);
if (iArc > 0)
{
hArc = fn_hGetArc(hNode, iArc - 1);
return GetWaypoint(hArc->m_hNode->m_hWayPoint);
}
else
return NULL;
}
else
{
if (fn_iGetNumberOfArcs(hNode) > 0)
{
hArc = fn_hGetArc(hNode, fn_iGetNumberOfArcs(hNode) - 1);
return GetWaypoint(hArc->m_hNode->m_hWayPoint);
}
else
return NULL;
}
}
WayPoint * Graph::GetNextConnection (WayPoint *pSrcNode, WayPoint *pDstNode)
{
WP_tdHandleOfArc hArc;
WP_tdhGraphNode hNode, hArcNode;
int iNode, iArcNode, iArc;
iNode = fn_iGetNodeOfWayPoint(pSrcNode->GetStruct());
hNode = fn_hGetNode(iNode);
if (pDstNode)
{
iArcNode = fn_iGetNodeOfWayPoint(pDstNode->GetStruct());
hArcNode = fn_hGetNode(iArcNode);
iArc = fn_iGetArcOfNode(hNode, hArcNode);
hArc = fn_hGetArc(hNode, iArc);
if (iArc < fn_iGetNumberOfArcs(hNode) - 1)
{
hArc = fn_hGetArc(hNode, iArc + 1);
return GetWaypoint(hArc->m_hNode->m_hWayPoint);
}
else
return NULL;
}
else
{
if (fn_iGetNumberOfArcs(hNode) > 0)
{
hArc = fn_hGetArc(hNode, 0);
return GetWaypoint(hArc->m_hNode->m_hWayPoint);
}
else
return NULL;
}
}
//End Shaitan NewParam }