Version: 9.16.0
StudyNodes.cxx
Go to the documentation of this file.
1// Copyright (C) 2006-2026 CEA, EDF
2//
3// This library is free software; you can redistribute it and/or
4// modify it under the terms of the GNU Lesser General Public
5// License as published by the Free Software Foundation; either
6// version 2.1 of the License, or (at your option) any later version.
7//
8// This library is distributed in the hope that it will be useful,
9// but WITHOUT ANY WARRANTY; without even the implied warranty of
10// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11// Lesser General Public License for more details.
12//
13// You should have received a copy of the GNU Lesser General Public
14// License along with this library; if not, write to the Free Software
15// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16//
17// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18//
19
20#include "RuntimeSALOME.hxx"
21#include "StudyNodes.hxx"
22#include "StudyPorts.hxx"
23#include "Visitor.hxx"
24#include "TypeCode.hxx"
25#include "SalomeProc.hxx"
26
27#include "Basics_Utils.hxx"
28#include "SALOME_KernelServices.hxx"
29#include "SALOMEDS.hh"
30#include "SALOMEDS_Attributes.hh"
31
32#include <iostream>
33#include <sstream>
34#include <string>
35#include <list>
36#include <stdlib.h>
37
38//#define _DEVDEBUG_
39#include "YacsTrace.hxx"
40
41namespace YACS
42{
43namespace ENGINE
44{
45
46const char StudyInNode::IMPL_NAME[]="XML";
47
48StudyInNode::StudyInNode(const std::string& name)
49 : DataNode(name)
50{
52}
53
55 : DataNode(other, father)
56{
57}
58
59Node *StudyInNode::simpleClone(ComposedNode *father, bool editionOnly) const
60{
61 return new StudyInNode(*this,father);
62}
63
64OutputPort* StudyInNode::createOutputPort(const std::string& outputPortName, TypeCode* type)
65{
66 return new OutputStudyPort(outputPortName, this, type);
67}
68
69void StudyInNode::setData(OutputPort* port, const std::string& data)
70{
71 OutputStudyPort *outp = dynamic_cast<OutputStudyPort *>(port);
72 outp->setData(data);
73}
74
76{
77 DEBTRACE("+++++++ StudyInNode::execute +++++++++++");
78
79 std::list<OutputPort *>::const_iterator iter;
80 for(iter = _setOfOutputPort.begin(); iter != _setOfOutputPort.end(); iter++)
81 {
82 OutputStudyPort *outp = dynamic_cast<OutputStudyPort *>(*iter);
83 try
84 {
85 outp->getDataFromStudy();
86 }
87 catch(Exception& e)
88 {
90 throw;
91 }
92 }
93 DEBTRACE("+++++++ end StudyInNode::execute +++++++++++" );
94}
95
97{
98 DEBTRACE("StudyInNode::checkBasicConsistency");
99 if (! _setOfInputPort.empty())
100 {
101 std::string what = "StudyNode ";
102 what += getName();
103 what += " only accepts OutputStudyPort, no InputPort";
104 throw Exception(what);
105 }
106
107 std::list<OutputPort *>::const_iterator iter;
108 for(iter=_setOfOutputPort.begin();iter!=_setOfOutputPort.end();iter++)
109 {
110 OutputStudyPort *inp = dynamic_cast<OutputStudyPort*>(*iter);
111 if (!inp)
112 {
113 std::string what("Output port: ");
114 what += (*iter)->getName();
115 what += " is not an OutputStudyPort. StudyNode ";
116 what += getName();
117 what += " only accepts OutputStudyPorts";
118 throw Exception(what);
119 }
120
121 std::string data = inp->getData();
122 DEBTRACE(data);
123 if (data.empty())
124 {
125 std::string what("OutputStudyPort: ");
126 what += (*iter)->getName();
127 what += " is not initialised";
128 throw Exception(what);
129 }
130 }
131}
132
134{
135 visitor->visitStudyInNode(this);
136}
137
138const char StudyOutNode::IMPL_NAME[]="XML";
139
140StudyOutNode::StudyOutNode(const std::string& name)
141 : DataNode(name)
142{
144}
145
147 : DataNode(other, father)
148{
149}
150
151Node *StudyOutNode::simpleClone(ComposedNode *father, bool editionOnly) const
152{
153 return new StudyOutNode(*this,father);
154}
155
156InputPort* StudyOutNode::createInputPort(const std::string& inputPortName, TypeCode* type)
157{
158 return new InputStudyPort(inputPortName, this, type);
159}
160
161void StudyOutNode::setData(InputPort* port, const std::string& data)
162{
163 InputStudyPort *inp = dynamic_cast<InputStudyPort *>(port);
164 inp->setData(data);
165}
166
167/*
168SALOMEDS::SObject_ptr findOrCreateSoWithName(SALOMEDS::StudyBuilder_ptr builder,
169 SALOMEDS::SObject_ptr sobj, const std::string& name)
170{
171 SALOMEDS::ChildIterator_var anIterator= KERNEL::getStudyServant()->NewChildIterator(sobj);
172 SALOMEDS::GenericAttribute_var anAttr;
173 SALOMEDS::AttributeName_var namAttr ;
174 SALOMEDS::SObject_var result=SALOMEDS::SObject::_nil();
175
176 for (; anIterator->More(); anIterator->Next())
177 {
178 SALOMEDS::SObject_var anObj=anIterator->Value();
179 if(anObj->FindAttribute(anAttr, "AttributeName"))
180 {
181 namAttr = SALOMEDS::AttributeName::_narrow( anAttr );
182 CORBA::String_var value=namAttr->Value();
183 if(name == (const char*)value)
184 {
185 result=anObj;
186 break;
187 }
188 }
189 }
190 if(CORBA::is_nil(result))
191 {
192 //create it
193 result = builder->NewObject( sobj );
194 anAttr=builder->FindOrCreateAttribute(result,"AttributeName");
195 namAttr = SALOMEDS::AttributeName::_narrow( anAttr );
196 namAttr->SetValue(name.c_str());
197 }
198 return result._retn();
199}
200*/
201
203{
204 DEBTRACE("+++++++ StudyOutNode::execute +++++++++++");
205
206 SALOMEDS::StudyBuilder_var aBuilder =KERNEL::getStudyServant()->NewBuilder() ;
207 if(CORBA::is_nil(aBuilder))
208 {
209 _errorDetails="Execution problem: can not create StudyBuilder";
211 }
212
213 SALOMEDS::GenericAttribute_var aGAttr;
214 SALOMEDS::SObject_var aSO ;
215 SALOMEDS::AttributeName_var anAttr ;
216 SALOMEDS::AttributeIOR_var iorAttr ;
217
218 std::list<InputPort *>::const_iterator iter;
219 for(iter = _setOfInputPort.begin(); iter != _setOfInputPort.end(); iter++)
220 {
221 InputStudyPort *inp = dynamic_cast<InputStudyPort *>(*iter);
222 inp->putDataInStudy(aBuilder);
223 }
224
225 // save in file if ref is given
226 if(_ref != "")
227 {
228 KERNEL::getStudyServant()->SaveAs(Kernel_Utils::decode_s( _ref ), false, false);
229 }
230 DEBTRACE("+++++++ end StudyOutNode::execute +++++++++++" );
231}
232
234{
235 DEBTRACE("StudyOutNode::checkBasicConsistency");
236 if (! _setOfOutputPort.empty())
237 {
238 std::string what = "StudyNode ";
239 what += getName();
240 what += " only accepts InputStudyPort, no OutputPort";
241 throw Exception(what);
242 }
243
244 std::list<InputPort *>::const_iterator iter;
245 for(iter=_setOfInputPort.begin();iter!=_setOfInputPort.end();iter++)
246 {
247 InputStudyPort *inp = dynamic_cast<InputStudyPort*>(*iter);
248 if (!inp)
249 {
250 std::string what("Input port: ");
251 what += (*iter)->getName();
252 what += " is not an InputStudyPort. StudyNode ";
253 what += getName();
254 what += " only accepts InputStudyPorts";
255 throw Exception(what);
256 }
258
259 std::string data = inp->getData();
260 DEBTRACE(data);
261 if (data.empty())
262 {
263 std::string what("InputStudyPort: ");
264 what += (*iter)->getName();
265 what += " is not initialised";
266 throw Exception(what);
267 }
268 }
269
270}
271
273{
274 visitor->visitStudyOutNode(this);
275}
276
277} //end namespace ENGINE
278} //end namespace YACS
#define DEBTRACE(msg)
Definition: YacsTrace.hxx:31
Base class for all composed nodes.
Class for data parameters specification.
Definition: DataNode.hxx:38
std::list< InputPort * > _setOfInputPort
std::list< OutputPort * > _setOfOutputPort
Base class for Input Ports.
Definition: InputPort.hxx:44
virtual void checkBasicConsistency() const
Check basically that this port has one chance to be specified on time. It's a necessary condition not...
Definition: InputPort.cxx:148
Class for Study input Ports.
Definition: StudyPorts.hxx:51
virtual void putDataInStudy(SALOMEDS::StudyBuilder_var aBuilder)
Definition: StudyPorts.cxx:346
void setData(const std::string &data)
Definition: StudyPorts.cxx:294
Base class for all nodes.
Definition: Node.hxx:70
const std::string & getName() const
Definition: Node.hxx:125
std::string _implementation
Definition: Node.hxx:97
std::string _errorDetails
Definition: Node.hxx:93
Class for Study output Ports.
Definition: StudyPorts.hxx:33
void setData(const std::string &data)
Definition: StudyPorts.cxx:71
static const char IMPL_NAME[]
Definition: StudyNodes.hxx:44
virtual void execute()
Definition: StudyNodes.cxx:75
virtual OutputPort * createOutputPort(const std::string &outputPortName, TypeCode *type)
Definition: StudyNodes.cxx:64
virtual void setData(OutputPort *port, const std::string &data)
Definition: StudyNodes.cxx:69
Node * simpleClone(ComposedNode *father, bool editionOnly) const
Definition: StudyNodes.cxx:59
StudyInNode(const std::string &name)
Definition: StudyNodes.cxx:48
virtual void accept(Visitor *visitor)
Definition: StudyNodes.cxx:133
virtual void checkBasicConsistency() const
Definition: StudyNodes.cxx:96
static const char IMPL_NAME[]
Definition: StudyNodes.hxx:60
StudyOutNode(const std::string &name)
Definition: StudyNodes.cxx:140
virtual void setData(InputPort *port, const std::string &data)
Definition: StudyNodes.cxx:161
Node * simpleClone(ComposedNode *father, bool editionOnly) const
Definition: StudyNodes.cxx:151
virtual void checkBasicConsistency() const
Definition: StudyNodes.cxx:233
virtual void accept(Visitor *visitor)
Definition: StudyNodes.cxx:272
virtual InputPort * createInputPort(const std::string &inputPortName, TypeCode *type)
Definition: StudyNodes.cxx:156
Base class for all type objects.
Definition: TypeCode.hxx:68
virtual void visitStudyOutNode(DataNode *node)=0
virtual void visitStudyInNode(DataNode *node)=0
const char * what(void) const noexcept
Definition: Exception.cxx:50