PeriDyno 1.2.1
Loading...
Searching...
No Matches
WtNodeWidget.cpp
Go to the documentation of this file.
1#include "WtNodeWidget.h"
2
3#include "Node.h"
4#include "NodePort.h"
5
6//#include "Format.h"
7
8#include "FInstance.h"
9#include "Field.h"
10
11WtNodeWidget::WtNodeWidget(std::shared_ptr<Node> base)
12{
13 mNode = base;
14 if (mNode != nullptr)
15 {
16 //initialize in node ports
17 auto inputs = mNode->getImportNodes();
18 auto input_num = inputs.size();
19
20 mNodeInport.resize(input_num);
21 for (int i = 0; i < inputs.size(); i++)
22 {
23 mNodeInport[i] = std::make_shared<WtImportNode>(inputs[i]);
24 }
25
26 //initialize out node ports
27 mNodeExport = std::make_shared<WtExportNode>(base);
28
29 int output_fnum = getOutputFields().size();
30 mFieldExport.resize(output_fnum);
31 auto fOutputs = getOutputFields();
32 for (int i = 0; i < fOutputs.size(); i++)
33 {
34 mFieldExport[i] = std::make_shared<WtFieldData>(fOutputs[i]);
35 }
36
37 //initialize in ports
38 int input_fnum = getInputFields().size();
39 mFieldInport.resize(input_fnum);
40 auto fInputs = getInputFields();
41 for (int i = 0; i < fInputs.size(); i++)
42 {
43 mFieldInport[i] = std::make_shared<WtFieldData>(fInputs[i]);;
44 }
45 }
46}
47
49
50unsigned int WtNodeWidget::nPorts(PortType portType) const
51{
52 unsigned int result;
53
54 if (portType == PortType::In)
55 {
56 result = (unsigned int)mNode->getImportNodes().size() + mFieldInport.size();
57 }
58 else
59 {
60 result = 1 + mFieldExport.size();
61 }
62
63 return result;
64}
65
67{
68 switch (portType)
69 {
70 case PortType::In:
71 if (portIndex < mNodeInport.size()) {
72 //TODO: return more accurate description
73 return NodeDataType{ "port", "port", PortShape::Bullet };
74 }
75 else {
76 auto& inputFields = this->getInputFields();
77 std::string str = inputFields[portIndex - mNodeInport.size()]->getClassName();
78
79 return NodeDataType{ str.c_str(), str.c_str(), PortShape::Point };
80 }
81 break;
82
83 case PortType::Out:
84 if (portIndex == 0) {
85 //TODO: return more accurate description
86 return NodeDataType{ "port", "port", PortShape::Bullet };
87 }
88 else {
89 auto& outputFields = this->getOutputFields();
90
91 std::string str = outputFields[portIndex - 1]->getClassName();
92
93 return NodeDataType{ str.c_str(), str.c_str(), PortShape::Point };
94 }
95
96 break;
97
98 case PortType::None:
99 break;
100 }
101
102 return NodeDataType{ "port", "port", PortShape::Point };
103}
104
105std::shared_ptr<WtNodeData> WtNodeWidget::outData(PortIndex port)
106{
107 return port == 0 ? std::static_pointer_cast<WtNodeData>(mNodeExport) : std::static_pointer_cast<WtNodeData>(mFieldExport[port - 1]);
108}
109
110std::string WtNodeWidget::caption() const
111{
112 return mNode->caption();
113}
114
115std::string WtNodeWidget::name() const
116{
117 return mNode->caption();
118 //return mNode->getClassInfo()->getClassName();
119}
120
121std::string WtNodeWidget::nodeTips() const
122{
123 return mNode->description();
124}
125
127{
128 (void)portType;; (void)portIndex;;
129 return true;
130}
131
132std::string WtNodeWidget::portCaption(PortType portType, PortIndex portIndex) const
133{
134 switch (portType)
135 {
136 case PortType::In:
137 if (portIndex < mNodeInport.size()) {
138 return mNode->getImportNodes()[portIndex]->getPortName();
139 }
140 else {
141 auto& inputFields = this->getInputFields();
142
143 return inputFields[portIndex - mNodeInport.size()]->getObjectName();
144 }
145 break;
146
147 case PortType::Out:
148 if (portIndex == 0) {
149 //return dyno::FormatBlockPortName(mNode->getClassInfo()->getClassName());
150 return "";
151 }
152 else {
153 auto& outputFields = this->getOutputFields();
154
155 return outputFields[portIndex - 1]->getObjectName();
156 }
157 break;
158
159 case PortType::None:
160 break;
161 }
162}
163
164std::string WtNodeWidget::portTips(PortType portType, PortIndex portIndex) const
165{
166 std::string tip;
167
168 auto nodeTip = [&](Node* node) -> std::string {
169 return node->getClassInfo()->getClassName();
170 };
171
172 auto fieldTip = [&](FBase* f) -> std::string {
173 tip += "Class: " + f->getClassName() + "\n";
174 tip += "Template: " + f->getTemplateName() + "\n";
175
176 return tip;
177 };
178
179 switch (portType)
180 {
181 case PortType::In:
182 if (portIndex < mNodeInport.size()) {
183 return mNode->getImportNodes()[portIndex]->getPortName();
184 }
185 else {
186 auto& inputFields = this->getInputFields();
187 return fieldTip(inputFields[portIndex - mNodeInport.size()]);
188 }
189 break;
190
191 case PortType::Out:
192 if (portIndex == 0) {
193 return nodeTip(mNode.get());
194 }
195 else {
196 auto& outputFields = this->getOutputFields();
197 return fieldTip(outputFields[portIndex - 1]);
198 }
199
200 break;
201
202 case PortType::None:
203 break;
204 }
205}
206
207void WtNodeWidget::setInData(std::shared_ptr<WtNodeData> data, PortIndex portIndex)
208{
209 if (!mEditingEnabled)
210 return;
211
212 if (portIndex < mNodeInport.size())
213 {
214 auto node_port = std::dynamic_pointer_cast<WtExportNode>(data);
215
216 if (node_port != nullptr)
217 {
218 auto nd = node_port->getNode();
219
220 if (node_port->connectionType() == CntType::Break)
221 {
222 //mNodeInport[portIndex]->getNodePort()->removeNode(nd.get());
223 nd->disconnect(mNodeInport[portIndex]->getNodePort());
224
225 //TODO: recover the connection state, use a more elegant way in the future
226 data->setConnectionType(CntType::Link);
227 }
228 else
229 {
230 //mNodeInport[portIndex]->getNodePort()->addNode(nd.get());
231 nd->connect(mNodeInport[portIndex]->getNodePort());
232 }
233 }
234 }
235 else
236 {
237 auto fieldData = std::dynamic_pointer_cast<WtFieldData>(data);
238
239 if (fieldData != nullptr)
240 {
241 auto field = fieldData->getField();
242
243 if (fieldData->connectionType() == CntType::Break)
244 {
245 field->disconnect(mFieldInport[portIndex - mNodeInport.size()]->getField());
246 fieldData->setConnectionType(CntType::Link);
247 }
248 else
249 {
250 field->connect(mFieldInport[portIndex - mNodeInport.size()]->getField());
251 }
252 }
253 }
254
255 updateModule();
256}
257
258bool WtNodeWidget::tryInData(PortIndex portIndex, std::shared_ptr<WtNodeData> nodeData)
259{
260 if (!mEditingEnabled)
261 return false;
262
263 if (portIndex < mNodeInport.size())
264 {
265 try
266 {
267 auto nodeExp = std::dynamic_pointer_cast<WtExportNode>(nodeData);
268
269 if (nodeExp == nullptr)
270 return false;
271
272 auto nodeInp = mNodeInport[portIndex];
273
274 return nodeInp->getNodePort()->isKindOf(nodeExp->getNode().get());;
275 }
276 catch (std::bad_cast)
277 {
278 return false;
279 }
280 }
281 else
282 {
283 try
284 {
285 auto fieldExp = std::dynamic_pointer_cast<WtFieldData>(nodeData);
286 if (fieldExp == nullptr)
287 return false;
288
289 auto fieldInp = mFieldInport[portIndex - mNodeInport.size()];
290
291 if (fieldInp->getField()->getClassName() == fieldExp->getField()->getClassName())
292 {
293 std::string className = fieldInp->getField()->getClassName();
294 if (className == dyno::InstanceBase::className())
295 {
296 dyno::InstanceBase* instIn = dynamic_cast<dyno::InstanceBase*>(fieldInp->getField());
297 dyno::InstanceBase* instOut = dynamic_cast<dyno::InstanceBase*>(fieldExp->getField());
298
299 if (instIn != nullptr && instOut != nullptr)
300 return instIn->canBeConnectedBy(instOut);
301
302 return false;
303 }
304 else
305 return fieldInp->getField()->getTemplateName() == fieldExp->getField()->getTemplateName();
306 }
307 else
308 {
309 return false;
310 }
311 }
312 catch (std::bad_cast)
313 {
314 return false;
315 }
316 }
317}
318
323
325{
326 if (portIndex < mNodeInport.size())
327 {
328 auto portType = mNodeInport[portIndex]->getNodePort()->getPortType();
329
331 }
332 else
333 {
335 }
336}
337
338std::shared_ptr<Node> WtNodeWidget::getNode()
339{
340 return mNode;
341}
342
344{
346}
347
352
353std::vector<FBase*>& WtNodeWidget::getOutputFields() const
354{
355 return mNode->getOutputFields();
356}
357
358std::vector<FBase*>& WtNodeWidget::getInputFields() const
359{
360 return mNode->getInputFields();
361}
362
364{
365 mEditingEnabled = true;
366}
367
369{
370 mEditingEnabled = false;
371}
int PortIndex
PortType
NodeValidationState
bool portCaptionVisible(PortType portType, PortIndex portIndex) const override
It is possible to hide port caption in GUI.
std::string portTips(PortType portType, PortIndex portIndex) const override
std::vector< FBase * > & getInputFields() const
void enableEditing()
When enabled, the scenegraph can be updated as long as the corresponding GUI is updated.
unsigned int nPorts(PortType portType) const override
std::shared_ptr< Node > mNode
OutFieldPtr mFieldExport
bool mEditingEnabled
std::string name() const override
Name makes this model unique.
virtual ~WtNodeWidget()
void disableEditing()
When disabled, the scenegraph can not be affected by the corresponding GUI.
std::shared_ptr< Node > getNode()
ExportNodePtr mNodeExport
WtNodeDataModel::ConnectionPolicy portInConnectionPolicy(PortIndex portIndex) const override
std::string modelValidationError
std::shared_ptr< WtNodeData > outData(PortIndex port) override
std::string caption() const override
std::string nodeTips() const override
NodeValidationState modelValidationState
ImportNodePtr mNodeInport
std::string portCaption(PortType portType, PortIndex portIndex) const override
Port caption is used in GUI to label individual ports.
virtual void updateModule()
NodeDataType dataType(PortType portType, PortIndex portIndex) const override
InFieldPtr mFieldInport
WtNodeWidget(std::shared_ptr< Node > base=nullptr)
bool tryInData(PortIndex portIndex, std::shared_ptr< WtNodeData > nodeData) override
To test whether nodaData can be set as the input data for portIndex.
std::string validationMessage() const override
NodeValidationState validationState() const override
std::vector< FBase * > & getOutputFields() const
void setInData(std::shared_ptr< WtNodeData > data, PortIndex portIndex) override
Triggers the algorithm.
virtual bool canBeConnectedBy(InstanceBase *ins)=0
static const std::string className()
Definition FInstance.h:40
@ Single
Definition NodePort.h:28