Files
geant4/source/geometry/solids/STEP/src/instmgr.cc
T
2016-06-08 15:09:25 +02:00

410 lines
10 KiB
C++

//
//
// $Id: instmgr.cc,v 1.3 1999/05/21 20:21:09 japost Exp $
// GEANT4 tag $Name: geant4-00-01 $
//
/*
* NIST STEP Editor Class Library
* cleditor/instmgr.cc
* May 1995
* David Sauder
* K. C. Morris
* Development of this software was funded by the United States Government,
* and is not subject to copyright.
*/
/* */
//////////////////////////////////////////////////////////////////////////////
//
// InstMgr member functions
//
//////////////////////////////////////////////////////////////////////////////
#include <STEPentity.h>
#include <instmgr.h>
///////////////////////////////////////////////////////////////////////////////
// debug_level >= 2 => tells when a command is chosen
// debug_level >= 3 => prints values within functions:
///////////////////////////////////////////////////////////////////////////////
static int debug_level = 2;
// if debug_level is greater than this number then
// function names get printed out when executed
//static int PrintFunctionTrace = 2;
// if debug_level is greater than this number then
// values within functions get printed out
//static int PrintValues = 3;
///////////////////////////////////////////////////////////////////////////////
void
InstMgr::PrintSortedFileIds()
{
MgrNode *mn = 0;
int count = InstanceCount();
int i = 0;
for(i = 0; i < count; i++)
{
mn = (MgrNode *)((*sortedMaster)[i]);
G4cout << i << " " << mn->GetFileId() << endl;
}
}
InstMgr::InstMgr()
{
maxFileId = -1;
master = new MgrNodeArray();
sortedMaster = new MgrNodeArraySorted();
}
///////////////////////////////////////////////////////////////////////////////
void InstMgr::ClearInstances()
{
// delete master;
// master = new MgrNodeArray();
master->DeleteEntries();
sortedMaster->ClearEntries();
maxFileId = -1;
}
///////////////////////////////////////////////////////////////////////////////
/**************************************************
description:
returns:
SEVERITY_NULL: if all instances are complete
SEVERITY_INCOMPLETE: if at least one instance is missing a required attribute
SEVERITY_WARNING:
SEVERITY_INPUT_ERROR: if at least one instance can not be fetched
from the instance List.
**************************************************/
enum Severity
InstMgr::VerifyInstances(ErrorDescriptor& err)
{
int errorCount = 0;
char errbuf[BUFSIZ];
int n = InstanceCount();
MgrNode* mn;
STEPentity* se;
enum Severity rval = SEVERITY_NULL;
//for each instance on the List,
//check the MgrNode state.
//if the state is complete then do nothing
//if the state is not complete,
// then check if it is valid
// if it is valid then Increment the warning count,
// and set the rval to SEVERITY_INCOMPLETE
// if it is not valid, then Increment the error count
// and set the rval to
for (int i = 0; i < n; ++i)
{
mn = GetMgrNode(i);
if (!mn)
{
++errorCount;
if (errorCount == 1)
sprintf(errbuf,
"VerifyInstances: Unable to verify the following instances: node %d",
i);
else
sprintf(errbuf,", node %d",i);
err.AppendToDetailMsg(errbuf);
rval = SEVERITY_INPUT_ERROR;
err.GreaterSeverity(SEVERITY_INPUT_ERROR);
continue;
}
if (!mn->MgrNodeListMember(completeSE))
{
se = mn->GetSTEPentity();
if (se->ValidLevel(&err,this,0) < SEVERITY_USERMSG)
{
if (rval > SEVERITY_INCOMPLETE)
rval = SEVERITY_INCOMPLETE;
++errorCount;
if (errorCount == 1)
sprintf(errbuf,
"VerifyInstances: Unable to verify the following instances: #%d",
se->FileId());
else
sprintf(errbuf,", #%d",se->FileId());
err.AppendToDetailMsg(errbuf);
}
}
}
if (errorCount)
{
sprintf(errbuf,
"VerifyInstances: %d invalid instances in List.\n",
errorCount);
err.AppendToUserMsg(errbuf);
err.AppendToDetailMsg(".\n");
err.GreaterSeverity(SEVERITY_INCOMPLETE);
}
return rval;
}
///////////////////////////////////////////////////////////////////////////////
MgrNode *InstMgr::FindFileId(int fileId)
{
int index = sortedMaster->MgrNodeIndex(fileId);
if(index >= 0)
return (MgrNode *)(*sortedMaster)[index];
else
return (MgrNode *)0;
}
///////////////////////////////////////////////////////////////////////////////
// get the index into display List given a STEPentity
// called by see initiated functions
int InstMgr::GetIndex(MgrNode *mn)
{
return mn->ArrayIndex();
}
///////////////////////////////////////////////////////////////////////////////
int InstMgr::GetIndex(STEPentity *se)
{
int fileId = se->FileId();
return sortedMaster->MgrNodeIndex(fileId);
}
///////////////////////////////////////////////////////////////////////////////
int InstMgr::VerifyEntity(int fileId, const char *expectedType)
{
MgrNode *mn = FindFileId(fileId);
if(mn)
{
if(!strcmp(expectedType, mn->GetSTEPentity()->EntityName()))
return 2; // types match
else
return 1; // possible mismatch depending on descendants
}
else
return 0;
}
///////////////////////////////////////////////////////////////////////////////
// Append instance to the List of instances. Checks the file id and
// sets it if 1) it is not set already or 2) it already exists in the List.
MgrNode *InstMgr::Append(STEPentity *se, stateEnum listState)
{
if (debug_level > 3)
G4cout << "#" << se->FileId() << " append node to InstMgr\n";
if ((se -> FileId () == 0) // no id assigned
|| FindFileId (se -> FileId ())) // id already in List
se -> FileId ( NextFileId () );
else if (se->FileId() > MaxFileId()) maxFileId = se->FileId();
MgrNode *mn = new MgrNode(se, listState);
if(listState == noStateSE)
G4cout << "append to InstMgr **ERROR ** node #" << se->FileId() <<
" doesn't have state information\n";
master->Append(mn);
sortedMaster->Insert(mn);
//PrintSortedFileIds();
return mn;
}
///////////////////////////////////////////////////////////////////////////////
void InstMgr::Delete(MgrNode *node)
{
// delete the node from its current state List
node->Remove();
int index;
// get the index of the node in the sorted master array
index = sortedMaster->MgrNodeIndex(node->GetFileId());
// remove the node from the sorted master array
sortedMaster->Remove(index);
// get the index into the master array by ptr arithmetic
index = node->ArrayIndex();
master->Remove(index);
delete node;
}
///////////////////////////////////////////////////////////////////////////////
void InstMgr::Delete(STEPentity *se)
{
Delete (FindFileId (se->FileId()));
}
///////////////////////////////////////////////////////////////////////////////
void InstMgr::ChangeState(MgrNode *node, stateEnum listState)
{
switch(listState){
case completeSE:
if (debug_level > 3)
G4cout << "#" << node->GetSTEPentity()->FileId() <<
" change node to InstMgr's complete List\n";
node->ChangeState(listState);
break;
case incompleteSE:
if (debug_level > 3)
G4cout << "#" << node->GetSTEPentity()->FileId() <<
" change node to InstMgr's incomplete List\n";
node->ChangeState(listState);
break;
case newSE:
if (debug_level > 3)
G4cout << "#" << node->GetSTEPentity()->FileId() <<
" change node to InstMgr's new List\n";
node->ChangeState(listState);
break;
case deleteSE:
if (debug_level > 3)
G4cout << "#" << node->GetSTEPentity()->FileId() <<
" change node to InstMgr's delete List\n";
node->ChangeState(listState);
break;
case noStateSE:
G4cout << "#" << node->GetSTEPentity()->FileId() <<
"ERROR can't change this node state\n";
node->Remove();
break;
}
}
///////////////////////////////////////////////////////////////////////////////
/**************************************************
description:
This function returns an integer value indicating
the number of instances with the given name appearing
on the instance manager.
**************************************************/
int
InstMgr::EntityKeywordCount(const char* name)
{
int count = 0;
MgrNode* node;
STEPentity* se;
int n = InstanceCount();
for (int j = 0; j<n; ++j)
{
node = GetMgrNode(j);
se = node->GetSTEPentity();
if (!strcmp(se->EntityName(),
PrettyTmpName(name)))
++count;
}
return count;
}
///////////////////////////////////////////////////////////////////////////////
STEPentity *
InstMgr::GetSTEPentity(int index)
{
MgrNode *mn = (MgrNode*)(*master)[index];
if(mn)
return mn->GetSTEPentity();
else
return 0;
}
///////////////////////////////////////////////////////////////////////////////
/**************************************************
description:
This function returns the first entity (by index)
on the instance manager, which has the given
entity name. It starts its search at starting_index,
and returns ENTITY_NULL if a match does not occur
before the last index is reached. This function
does not wrap around to search indices before the
starting_index.
**************************************************/
STEPentity*
InstMgr::GetSTEPentity(const char* entityKeyword, int starting_index)
{
// L. Broglia
G4cout<<"Warning ! This function don`t work correctly...";
MgrNode *node;
STEPentity *se;
int count = InstanceCount();
for (int j = starting_index; j<count; ++j)
{
node = GetMgrNode(j);
se = node->GetSTEPentity();
if ( ! strcmp( se->EntityName(),PrettyTmpName(entityKeyword)) )
{
return se;
}
}
return ENTITY_NULL;
}
////////////////////////////////////////////////////////
// L. Broglia : new
int InstMgr::GetIndex(const char* entityKeyword, int starting_index)
{
// L. Broglia
// When the entity is founded, put return index
MgrNode *node;
STEPentity *se;
int count = InstanceCount();
const char* tmpname;
for (int j = starting_index; j<count; ++j)
{
node = GetMgrNode(j);
se = node->GetSTEPentity();
tmpname = se->EntityName();
if ( !strcmp(tmpname, entityKeyword) )
{
return j;
}
}
return 0;
}
///////////////////////////////////////////////////////////////////////////////
void *
InstMgr::GetSEE(int index)
{
MgrNode *mn = (MgrNode*)(*master)[index];
if(mn)
return mn->SEE();
else
return 0;
}