1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
// File: ShapeProcess.cxx
// Created: Mon Aug 21 19:03:02 2000
// Author: Andrey BETENEV
// <abv@doomox.nnov.matra-dtv.fr>
#include <ShapeProcess.ixx>
#include <Standard_ErrorHandler.hxx>
#include <Standard_Failure.hxx>
#include <TCollection_AsciiString.hxx>
#include <TColStd_SequenceOfAsciiString.hxx>
#include <Message_Msg.hxx>
#include <Message_Messenger.hxx>
#include <ShapeProcess_Operator.hxx>
#include <ShapeProcess_DictionaryOfOperator.hxx>
static Handle(ShapeProcess_DictionaryOfOperator) dic;
//=======================================================================
//function : RegisterOperator
//purpose :
//=======================================================================
Standard_Boolean ShapeProcess::RegisterOperator (const Standard_CString name,
const Handle(ShapeProcess_Operator)& op)
{
if ( dic.IsNull() ) dic = new ShapeProcess_DictionaryOfOperator;
if ( dic->HasItem ( name, Standard_True ) ) {
#ifdef DEB
cout << "Warning: operator with name " << name << " is already registered!" << endl;
#endif
return Standard_False;
}
dic->SetItem ( name, op );
return Standard_True;
}
//=======================================================================
//function : FindOperator
//purpose :
//=======================================================================
Standard_Boolean ShapeProcess::FindOperator (const Standard_CString name,
Handle(ShapeProcess_Operator)& op)
{
if ( dic.IsNull() ) dic = new ShapeProcess_DictionaryOfOperator;
if ( ! dic->HasItem ( name, Standard_True ) ) {
#ifdef DEB
cout << "Error: no operator with name " << name << " registered!" << endl;
#endif
return Standard_False;
}
op = dic->Item ( name );
return !op.IsNull();
}
//=======================================================================
//function : Perform
//purpose :
//=======================================================================
Standard_Boolean ShapeProcess::Perform (const Handle(ShapeProcess_Context)& context,
const Standard_CString seq)
{
context->SetScope ( seq );
// get description of the sequence
TCollection_AsciiString sequence;
if ( ! context->GetString ( "exec.op", sequence ) ) {
#ifdef DEB
cout << "Error: ShapeProcess_Performer::Perform: sequence not defined for " << seq << endl;
#endif
context->UnSetScope();
return Standard_False;
}
TColStd_SequenceOfAsciiString sequenceOfOperators;
TCollection_AsciiString oper;
Standard_Integer i;
for ( i=1; ; i++ ) {
oper = sequence.Token ( " \t,;", i );
if ( oper.Length() <=0 ) break;
sequenceOfOperators.Append(oper);
}
// put a message
if ( context->TraceLevel() >=2 ) {
Message_Msg SMSG0 ("Sequence.MSG0"); //Sequence of operators: %s
TCollection_AsciiString Seq;
for ( Standard_Integer i1=1; i1 <= sequenceOfOperators.Length(); i1++ ) {
if (i1 > 1) Seq += ",";
Seq += sequenceOfOperators.Value(i1);
}
SMSG0.Arg (Seq.ToCString());
context->Messenger()->Send (SMSG0, Message_Info);
}
// iterate on operators in the sequence
for (i=1; i<=sequenceOfOperators.Length(); i++) {
oper = sequenceOfOperators.Value(i);
if ( context->TraceLevel() >=2 ) {
Message_Msg SMSG5 ("Sequence.MSG5"); //Operator %d/%d: %s
SMSG5 << i << sequenceOfOperators.Length() << oper.ToCString();
context->Messenger()->Send (SMSG5, Message_Alarm);
}
Handle(ShapeProcess_Operator) op;
if ( ! ShapeProcess::FindOperator ( oper.ToCString(), op ) ) {
if ( context->TraceLevel() >0 ) {
Message_Msg SMSG1 ("Sequence.MSG1"); //Operator %s not found
context->Messenger()->Send (SMSG1 << oper, Message_Alarm);
}
continue;
}
context->SetScope ( oper.ToCString() );
try {
OCC_CATCH_SIGNALS
op->Perform ( context );
}
catch (Standard_Failure) {
Message_Msg SMSG2 ("Sequence.MSG2"); //Operator %s failed with exception %s
SMSG2 << oper << Standard_Failure::Caught()->GetMessageString();
context->Messenger()->Send (SMSG2, Message_Alarm);
}
context->UnSetScope();
}
context->UnSetScope();
return Standard_True;
}
|