1 /****************************************************************************
3 ** Copyright (C) 2004-2007 Trolltech ASA. All rights reserved.
5 ** This file is part of the example classes of the Qt Toolkit.
7 ** Licensees holding a valid Qt License Agreement may use this file in
8 ** accordance with the rights, responsibilities and obligations
9 ** contained therein. Please consult your licensing agreement or
10 ** contact sales@trolltech.com if any conditions of this licensing
11 ** agreement are not clear to you.
13 ** Further information about Qt licensing is available at:
14 ** http://www.trolltech.com/products/qt/licensing.html or by
15 ** contacting info@trolltech.com.
17 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
18 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20 ****************************************************************************/
24 #include "mainwindow.h"
25 #include "graphwidget.h"
29 #include "SimpleDriver.h"
30 #include "PointDriver.h"
31 #include "CircleDriver.h"
32 #include "PrismDriver.h"
33 #include "ConeDriver.h"
34 #include "CylinderDriver.h"
35 #include "ShapeSaverDriver.h"
37 #include <TDocStd_Document.hxx>
38 #include <TFunction_DriverTable.hxx>
39 #include <TFunction_IFunction.hxx>
40 #include <TFunction_GraphNode.hxx>
41 #include <TFunction_DoubleMapOfIntegerLabel.hxx>
42 #include <TFunction_DoubleMapIteratorOfDoubleMapOfIntegerLabel.hxx>
43 #include <TFunction_Scope.hxx>
45 #include <TColStd_MapIteratorOfMapOfInteger.hxx>
46 #include <OSD_Timer.hxx>
48 #include <TDF_Tool.hxx>
49 #include <TDF_Reference.hxx>
50 #include <TDF_MapIteratorOfLabelMap.hxx>
51 #include <TDF_ListIteratorOfLabelList.hxx>
52 #include <TDF_ChildIterator.hxx>
54 #include <TDataStd_Name.hxx>
55 #include <TDataStd_Real.hxx>
56 #include <TDataStd_RealArray.hxx>
58 MainWindow::MainWindow()
60 graph = new GraphWidget(this);
61 setCentralWidget(graph);
68 // Create a new document
69 createDefaultModel1();
72 Handle(AppStd_Application) MainWindow::getApplication()
74 if (gApplication.IsNull())
75 gApplication = new AppStd_Application();
79 void MainWindow::closeEvent(QCloseEvent *event)
84 void MainWindow::model1()
87 if (!graph->getDocument().IsNull())
89 QList<QGraphicsItem*> items = graph->scene()->items();
90 for (int i = 0; i < items.size(); i++)
92 QGraphicsItem* item = items.at(i);
93 graph->scene()->removeItem(item);
97 getApplication()->Close(graph->getDocument());
100 // Create a new document
101 createDefaultModel1();
104 void MainWindow::model2()
107 if (!graph->getDocument().IsNull())
109 QList<QGraphicsItem*> items = graph->scene()->items();
110 for (int i = 0; i < items.size(); i++)
112 QGraphicsItem* item = items.at(i);
113 graph->scene()->removeItem(item);
116 // Close the document
117 getApplication()->Close(graph->getDocument());
120 // Create a new document
121 createDefaultModel2();
124 static void prepareFunctions(GraphWidget* graph)
126 if (!graph->getDocument().IsNull())
128 TDF_Label L = graph->getDocument()->Main().Root();
129 TDF_ChildIterator itr(L, true);
130 for (; itr.More(); itr.Next())
132 Handle(TFunction_GraphNode) G;
133 if (itr.Value().FindAttribute(TFunction_GraphNode::GetID(), G))
135 G->SetStatus(TFunction_ES_NotExecuted);
141 // Redraw the nodes (change their colour).
142 void MainWindow::redrawGraph()
144 QList<QGraphicsItem*> items = graph->scene()->items();
145 for (int i = 0; i < items.size(); i++)
147 QGraphicsItem* item = items.at(i);
152 void MainWindow::compute()
155 double seconds, CPUTime;
159 int i = 0, nb = 1; // number of repetitions (for test-purpose).
164 prepareFunctions(graph);
167 while (!graph->isFinished())
169 // Redraw the nodes (change their colour).
172 // Process user-events.
173 qApp->processEvents();
178 aTimer.Show(seconds, minutes, hours, CPUTime);
179 cout << "Execution of "<<graph->getNbThreads()<< " threads took " << hours << " hours, " << minutes << " minutes, " << seconds << " seconds" << endl;
181 // Redraw the nodes (change their colour).
185 void MainWindow::nbThreads()
188 int nb = QInputDialog::getInteger(this, tr("Number of threads"), tr("(1 - 4): "),
189 graph->getNbThreads(), 1, 4, 1, &ok);
191 graph->setNbThreads(nb);
194 void MainWindow::about()
196 QMessageBox::about(this, tr("Test-application of the advanced Function Mechanism"),
197 tr("The <b>Application</b> runs different models "
198 "in single and multi-threaded modes. "
199 "It shows graphically the result of computation."));
202 void MainWindow::createActions()
204 model1Act = new QAction(QIcon("images/open.png"), tr("Model 1"), this);
205 model1Act->setStatusTip(tr("Model 1"));
206 connect(model1Act, SIGNAL(triggered()), this, SLOT(model1()));
208 model2Act = new QAction(QIcon("images/open.png"), tr("Model 2"), this);
209 model2Act->setStatusTip(tr("Model 2"));
210 connect(model2Act, SIGNAL(triggered()), this, SLOT(model2()));
212 computeAct = new QAction(QIcon("images/new.png"), tr("Compute"), this);
213 computeAct->setStatusTip(tr("Compute"));
214 connect(computeAct, SIGNAL(triggered()), this, SLOT(compute()));
216 nbThreadsAct = new QAction(tr("Number of threads"), this);
217 nbThreadsAct->setStatusTip(tr("Number of threads"));
218 connect(nbThreadsAct, SIGNAL(triggered()), this, SLOT(nbThreads()));
220 exitAct = new QAction(tr("E&xit"), this);
221 exitAct->setShortcut(tr("Ctrl+Q"));
222 exitAct->setStatusTip(tr("Exit the application"));
223 connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));
225 aboutAct = new QAction(tr("&About"), this);
226 aboutAct->setStatusTip(tr("Show the application's About box"));
227 connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));
230 void MainWindow::createMenus()
232 computeMenu = menuBar()->addMenu(tr("&Model"));
233 computeMenu->addAction(model1Act);
234 computeMenu->addAction(model2Act);
235 computeMenu->addSeparator();
236 computeMenu->addAction(computeAct);
237 computeMenu->addAction(nbThreadsAct);
238 computeMenu->addSeparator();
239 computeMenu->addAction(exitAct);
241 menuBar()->addSeparator();
243 helpMenu = menuBar()->addMenu(tr("&Help"));
244 helpMenu->addAction(aboutAct);
247 void MainWindow::createToolBars()
249 computeToolBar = addToolBar(tr("Model"));
250 computeToolBar->addAction(model1Act);
251 computeToolBar->addAction(model2Act);
252 computeToolBar->addAction(computeAct);
255 void MainWindow::createStatusBar()
257 statusBar()->showMessage(tr("Ready"));
260 void MainWindow::createDefaultModel1()
262 Handle(AppStd_Application) app = MainWindow::getApplication();
263 Handle(TDocStd_Document) doc;
264 app->NewDocument("XmlOcaf", doc);
265 TDF_Label mainLabel = doc->Main();
267 // Initialize function drivers
268 TFunction_DriverTable::Get()->AddDriver(SimpleDriver::GetID(), new SimpleDriver());
271 Handle(TFunction_Logbook) logbook = TFunction_Logbook::Set(mainLabel);
273 // Create a tree of functions
274 TDF_Label L1 = mainLabel.FindChild(1);
275 TDF_Label L2 = mainLabel.FindChild(2);
276 TDF_Label L3 = mainLabel.FindChild(3);
277 TDF_Label L4 = mainLabel.FindChild(4);
278 TDF_Label L5 = mainLabel.FindChild(5);
279 TDF_Label L6 = mainLabel.FindChild(6);
280 TDF_Label L7 = mainLabel.FindChild(7);
283 TFunction_IFunction::NewFunction(L1, SimpleDriver::GetID());
284 TDataStd_Name::Set(L1, "1");
285 TDataStd_Real::Set(L1, time); // Argument
286 TDF_Reference::Set(L1.FindChild(2).FindChild(1), L1); // Result
287 TFunction_IFunction iFunc1(L1);
288 iFunc1.GetGraphNode()->SetStatus(TFunction_ES_NotExecuted);
290 TFunction_IFunction::NewFunction(L2, SimpleDriver::GetID());
291 TDataStd_Name::Set(L2, "2");
292 TDataStd_Real::Set(L2, time); // Argument
293 TDF_Reference::Set(L2.FindChild(2).FindChild(1), L2); // Result
294 TFunction_IFunction iFunc2(L2);
295 iFunc2.GetGraphNode()->SetStatus(TFunction_ES_NotExecuted);
297 TFunction_IFunction::NewFunction(L3, SimpleDriver::GetID());
298 TDataStd_Name::Set(L3, "3");
299 TDataStd_Real::Set(L3, time); // Argument
300 TDF_Reference::Set(L3.FindChild(1).FindChild(1), L1); // Argument: F3 -> F1
301 TDF_Reference::Set(L3.FindChild(2).FindChild(1), L3); // Result
302 TFunction_IFunction iFunc3(L3);
303 iFunc3.GetGraphNode()->SetStatus(TFunction_ES_NotExecuted);
305 TFunction_IFunction::NewFunction(L4, SimpleDriver::GetID());
306 TDataStd_Name::Set(L4, "4");
307 TDataStd_Real::Set(L4, time); // Argument
308 TDF_Reference::Set(L4.FindChild(1).FindChild(1), L2); // Argument F4 -> F2
309 TDF_Reference::Set(L4.FindChild(1).FindChild(2), L3); // Argument F4 -> F3
310 TDF_Reference::Set(L4.FindChild(2).FindChild(1), L4); // Result
311 TFunction_IFunction iFunc4(L4);
312 iFunc4.GetGraphNode()->SetStatus(TFunction_ES_NotExecuted);
314 TFunction_IFunction::NewFunction(L5, SimpleDriver::GetID());
315 TDataStd_Name::Set(L5, "5");
316 TDataStd_Real::Set(L5, time); // Argument
317 TDF_Reference::Set(L5.FindChild(1).FindChild(1), L4); // Argument F5 -> F4
318 TDF_Reference::Set(L5.FindChild(2).FindChild(1), L5); // Result
319 TFunction_IFunction iFunc5(L5);
320 iFunc5.GetGraphNode()->SetStatus(TFunction_ES_NotExecuted);
322 TFunction_IFunction::NewFunction(L6, SimpleDriver::GetID());
323 TDataStd_Name::Set(L6, "6");
324 TDataStd_Real::Set(L6, time); // Argument
325 TDF_Reference::Set(L6.FindChild(1).FindChild(1), L4); // Argument F6 ->F4
326 TDF_Reference::Set(L6.FindChild(2).FindChild(1), L6); // Result
327 TFunction_IFunction iFunc6(L6);
328 iFunc6.GetGraphNode()->SetStatus(TFunction_ES_NotExecuted);
330 TFunction_IFunction::NewFunction(L7, SimpleDriver::GetID());
331 TDataStd_Name::Set(L7, "7");
332 TDataStd_Real::Set(L7, time); // Argument
333 TDF_Reference::Set(L7.FindChild(1).FindChild(1), L4); // Argument F7 -> F4
334 TDF_Reference::Set(L7.FindChild(2).FindChild(1), L7); // Result
335 TFunction_IFunction iFunc7(L7);
336 iFunc7.GetGraphNode()->SetStatus(TFunction_ES_NotExecuted);
338 // Construct the dependencies between functions.
339 TFunction_IFunction::UpdateDependencies(mainLabel);
341 // Set the functions 1 and 2 modified
342 iFunc1.GetLogbook()->SetTouched(L1);
343 iFunc2.GetLogbook()->SetTouched(L2);
346 graph->createModel(doc);
349 void MainWindow::createDefaultModel2()
351 Handle(AppStd_Application) app = MainWindow::getApplication();
352 Handle(TDocStd_Document) doc;
353 app->NewDocument("BinOcaf", doc);
354 //app->Open("W:\\TestFM\\model2.cbf", doc);
355 TDF_Label mainLabel = doc->Main();
357 // Initialize function drivers
358 TFunction_DriverTable::Get()->AddDriver(PointDriver::GetID(), new PointDriver());
359 TFunction_DriverTable::Get()->AddDriver(CircleDriver::GetID(), new CircleDriver());
360 TFunction_DriverTable::Get()->AddDriver(PrismDriver::GetID(), new PrismDriver());
361 TFunction_DriverTable::Get()->AddDriver(ConeDriver::GetID(), new ConeDriver());
362 TFunction_DriverTable::Get()->AddDriver(CylinderDriver::GetID(), new CylinderDriver());
363 TFunction_DriverTable::Get()->AddDriver(ShapeSaverDriver::GetID(), new ShapeSaverDriver());
365 // Create a tree of functions
366 TDF_Label Lpoint1 = mainLabel.FindChild(1);
367 TDF_Label Lpoint2 = mainLabel.FindChild(2);
368 TDF_Label Lpoint3 = mainLabel.FindChild(3);
369 TDF_Label Lpoint4 = mainLabel.FindChild(4);
370 TDF_Label Lcircle1 = mainLabel.FindChild(5);
371 TDF_Label Lcircle2 = mainLabel.FindChild(6);
372 TDF_Label Lcircle3 = mainLabel.FindChild(7);
373 TDF_Label Lcircle4 = mainLabel.FindChild(8);
374 TDF_Label Lprism1 = mainLabel.FindChild(9);
375 TDF_Label Lprism2 = mainLabel.FindChild(10);
376 TDF_Label Lprism3 = mainLabel.FindChild(11);
377 TDF_Label Lprism4 = mainLabel.FindChild(12);
378 TDF_Label Lcone1 = mainLabel.FindChild(13);
379 TDF_Label Lcyl1 = mainLabel.FindChild(14);
380 TDF_Label Lcyl2 = mainLabel.FindChild(15);
381 TDF_Label Lcyl3 = mainLabel.FindChild(16);
382 TDF_Label Lcyl4 = mainLabel.FindChild(17);
383 TDF_Label Lcyl5 = mainLabel.FindChild(18);
384 TDF_Label Lcyl6 = mainLabel.FindChild(19);
385 TDF_Label Lcyl7 = mainLabel.FindChild(20);
386 TDF_Label Lcyl8 = mainLabel.FindChild(21);
387 TDF_Label Lcone2 = mainLabel.FindChild(22);
388 TDF_Label Lshape1 = mainLabel.FindChild(23);
391 Handle(TFunction_Logbook) logbook = TFunction_Logbook::Set(mainLabel);
395 TFunction_IFunction::NewFunction(Lpoint1, PointDriver::GetID());
396 TDataStd_Name::Set(Lpoint1, "P1");
397 Handle(TDataStd_RealArray) arr1 = TDataStd_RealArray::Set(Lpoint1, 1, 3);
398 arr1->SetValue(1, -50);
399 arr1->SetValue(2, -50);
400 arr1->SetValue(3, 0);
401 TDF_Reference::Set(Lpoint1.FindChild(1).FindChild(1), Lpoint1); // Argument
402 TDF_Reference::Set(Lpoint1.FindChild(2).FindChild(1), Lpoint1); // Result
403 TFunction_IFunction iFuncPoint1(Lpoint1);
404 iFuncPoint1.SetStatus(TFunction_ES_NotExecuted);
406 TFunction_IFunction::NewFunction(Lpoint2, PointDriver::GetID());
407 TDataStd_Name::Set(Lpoint2, "P2");
408 Handle(TDataStd_RealArray) arr2 = TDataStd_RealArray::Set(Lpoint2, 1, 3);
409 arr2->SetValue(1, 50);
410 arr2->SetValue(2, -50);
411 arr2->SetValue(3, 0);
412 TDF_Reference::Set(Lpoint2.FindChild(1).FindChild(1), Lpoint2); // Argument
413 TDF_Reference::Set(Lpoint2.FindChild(2).FindChild(1), Lpoint2); // Result
414 TFunction_IFunction iFuncPoint2(Lpoint2);
415 iFuncPoint2.SetStatus(TFunction_ES_NotExecuted);
417 TFunction_IFunction::NewFunction(Lpoint3, PointDriver::GetID());
418 TDataStd_Name::Set(Lpoint3, "P3");
419 Handle(TDataStd_RealArray) arr3 = TDataStd_RealArray::Set(Lpoint3, 1, 3);
420 arr3->SetValue(1, 50);
421 arr3->SetValue(2, 50);
422 arr3->SetValue(3, 0);
423 TDF_Reference::Set(Lpoint3.FindChild(1).FindChild(1), Lpoint3); // Argument
424 TDF_Reference::Set(Lpoint3.FindChild(2).FindChild(1), Lpoint3); // Result
425 TFunction_IFunction iFuncPoint3(Lpoint3);
426 iFuncPoint3.SetStatus(TFunction_ES_NotExecuted);
428 TFunction_IFunction::NewFunction(Lpoint4, PointDriver::GetID());
429 TDataStd_Name::Set(Lpoint4, "P4");
430 Handle(TDataStd_RealArray) arr4 = TDataStd_RealArray::Set(Lpoint4, 1, 3);
431 arr4->SetValue(1, -50);
432 arr4->SetValue(2, 50);
433 arr4->SetValue(3, 0);
434 TDF_Reference::Set(Lpoint4.FindChild(1).FindChild(1), Lpoint4); // Argument
435 TDF_Reference::Set(Lpoint4.FindChild(2).FindChild(1), Lpoint4); // Result
436 TFunction_IFunction iFuncPoint4(Lpoint4);
437 iFuncPoint4.SetStatus(TFunction_ES_NotExecuted);
440 TFunction_IFunction::NewFunction(Lcircle1, CircleDriver::GetID());
441 TDataStd_Name::Set(Lcircle1, "C1");
442 TDataStd_Real::Set(Lcircle1, 10);
443 TDF_Reference::Set(Lcircle1.FindChild(1).FindChild(1), Lpoint1); // Argument: point
444 TDF_Reference::Set(Lcircle1.FindChild(2).FindChild(1), Lcircle1); // Result
445 TFunction_IFunction iFuncCircle1(Lcircle1);
446 iFuncCircle1.SetStatus(TFunction_ES_NotExecuted);
448 TFunction_IFunction::NewFunction(Lcircle2, CircleDriver::GetID());
449 TDataStd_Name::Set(Lcircle2, "C2");
450 TDataStd_Real::Set(Lcircle2, 20);
451 TDF_Reference::Set(Lcircle2.FindChild(1).FindChild(1), Lpoint2); // Argument: point
452 TDF_Reference::Set(Lcircle2.FindChild(2).FindChild(1), Lcircle2); // Result
453 TFunction_IFunction iFuncCircle2(Lcircle2);
454 iFuncCircle2.SetStatus(TFunction_ES_NotExecuted);
456 TFunction_IFunction::NewFunction(Lcircle3, CircleDriver::GetID());
457 TDataStd_Name::Set(Lcircle3, "C3");
458 TDataStd_Real::Set(Lcircle3, 30);
459 TDF_Reference::Set(Lcircle3.FindChild(1).FindChild(1), Lpoint3); // Argument: point
460 TDF_Reference::Set(Lcircle3.FindChild(2).FindChild(1), Lcircle3); // Result
461 TFunction_IFunction iFuncCircle3(Lcircle3);
462 iFuncCircle3.SetStatus(TFunction_ES_NotExecuted);
464 TFunction_IFunction::NewFunction(Lcircle4, CircleDriver::GetID());
465 TDataStd_Name::Set(Lcircle4, "C4");
466 TDataStd_Real::Set(Lcircle4, 40);
467 TDF_Reference::Set(Lcircle4.FindChild(1).FindChild(1), Lpoint4); // Argument: point
468 TDF_Reference::Set(Lcircle4.FindChild(2).FindChild(1), Lcircle4); // Result
469 TFunction_IFunction iFuncCircle4(Lcircle4);
470 iFuncCircle4.SetStatus(TFunction_ES_NotExecuted);
473 TFunction_IFunction::NewFunction(Lprism1, PrismDriver::GetID());
474 TDataStd_Name::Set(Lprism1, "Pr1");
475 TDataStd_Real::Set(Lprism1, 30);
476 TDF_Reference::Set(Lprism1.FindChild(1).FindChild(1), Lcircle1); // Argument: point
477 TDF_Reference::Set(Lprism1.FindChild(2).FindChild(1), Lprism1); // Result
478 TDF_Reference::Set(Lprism1.FindChild(2).FindChild(2), Lprism1.FindChild(3)); // Result (top)
479 TFunction_IFunction iFuncPrism1(Lprism1);
480 iFuncPrism1.SetStatus(TFunction_ES_NotExecuted);
482 TFunction_IFunction::NewFunction(Lprism2, PrismDriver::GetID());
483 TDataStd_Name::Set(Lprism2, "Pr2");
484 TDataStd_Real::Set(Lprism2, 30);
485 TDF_Reference::Set(Lprism2.FindChild(1).FindChild(1), Lcircle2); // Argument: point
486 TDF_Reference::Set(Lprism2.FindChild(2).FindChild(1), Lprism2); // Result
487 TDF_Reference::Set(Lprism2.FindChild(2).FindChild(2), Lprism2.FindChild(3)); // Result (top)
488 TFunction_IFunction iFuncPrism2(Lprism2);
489 iFuncPrism2.SetStatus(TFunction_ES_NotExecuted);
491 TFunction_IFunction::NewFunction(Lprism3, PrismDriver::GetID());
492 TDataStd_Name::Set(Lprism3, "Pr3");
493 TDataStd_Real::Set(Lprism3, 30);
494 TDF_Reference::Set(Lprism3.FindChild(1).FindChild(1), Lcircle3); // Argument: point
495 TDF_Reference::Set(Lprism3.FindChild(2).FindChild(1), Lprism3); // Result
496 TDF_Reference::Set(Lprism3.FindChild(2).FindChild(2), Lprism3.FindChild(3)); // Result (top)
497 TFunction_IFunction iFuncPrism3(Lprism3);
498 iFuncPrism3.SetStatus(TFunction_ES_NotExecuted);
500 TFunction_IFunction::NewFunction(Lprism4, PrismDriver::GetID());
501 TDataStd_Name::Set(Lprism4, "Pr4");
502 TDataStd_Real::Set(Lprism4, 30);
503 TDF_Reference::Set(Lprism4.FindChild(1).FindChild(1), Lcircle4); // Argument: point
504 TDF_Reference::Set(Lprism4.FindChild(2).FindChild(1), Lprism4); // Result
505 TDF_Reference::Set(Lprism4.FindChild(2).FindChild(2), Lprism4.FindChild(3)); // Result (top)
506 TFunction_IFunction iFuncPrism4(Lprism4);
507 iFuncPrism4.SetStatus(TFunction_ES_NotExecuted);
509 TFunction_IFunction::NewFunction(Lcone1, ConeDriver::GetID());
510 TDataStd_Name::Set(Lcone1, "Co1");
511 TDataStd_Real::Set(Lcone1, 20);
512 TDF_Reference::Set(Lcone1.FindChild(1).FindChild(1), Lprism1.FindChild(3)); // Argument: top
513 TDF_Reference::Set(Lcone1.FindChild(1).FindChild(2), Lprism2.FindChild(3)); // Argument: top
514 TDF_Reference::Set(Lcone1.FindChild(1).FindChild(3), Lprism3.FindChild(3)); // Argument: top
515 TDF_Reference::Set(Lcone1.FindChild(1).FindChild(4), Lprism4.FindChild(3)); // Argument: top
516 TDF_Reference::Set(Lcone1.FindChild(2).FindChild(1), Lcone1); // Result
517 TDF_Reference::Set(Lcone1.FindChild(2).FindChild(2), Lcone1.FindChild(3)); // Result
518 TFunction_IFunction iFuncCone1(Lcone1);
519 iFuncCone1.SetStatus(TFunction_ES_NotExecuted);
522 TFunction_IFunction::NewFunction(Lcyl1, CylinderDriver::GetID());
523 TDataStd_Name::Set(Lcyl1, "Cyl1");
524 Handle(TDataStd_RealArray) carr1 = TDataStd_RealArray::Set(Lcyl1, 1, 3);
525 carr1->SetValue(1, 10.0);
526 carr1->SetValue(2, 45.0);
527 carr1->SetValue(3, 20.0);
528 TDF_Reference::Set(Lcyl1.FindChild(1).FindChild(1), Lcone1.FindChild(3)); // Argument: top
529 TDF_Reference::Set(Lcyl1.FindChild(2).FindChild(1), Lcyl1); // Result
530 TDF_Reference::Set(Lcyl1.FindChild(2).FindChild(2), Lcyl1.FindChild(3)); // Result
531 TFunction_IFunction iFuncCyl1(Lcyl1);
532 iFuncCyl1.SetStatus(TFunction_ES_NotExecuted);
534 TFunction_IFunction::NewFunction(Lcyl2, CylinderDriver::GetID());
535 TDataStd_Name::Set(Lcyl2, "Cyl2");
536 Handle(TDataStd_RealArray) carr2 = TDataStd_RealArray::Set(Lcyl2, 1, 3);
537 carr2->SetValue(1, 10.0);
538 carr2->SetValue(2, 90.0);
539 carr2->SetValue(3, 20.0);
540 TDF_Reference::Set(Lcyl2.FindChild(1).FindChild(1), Lcone1.FindChild(3)); // Argument: top
541 TDF_Reference::Set(Lcyl2.FindChild(2).FindChild(1), Lcyl2); // Result
542 TDF_Reference::Set(Lcyl2.FindChild(2).FindChild(2), Lcyl2.FindChild(3)); // Result
543 TFunction_IFunction iFuncCyl2(Lcyl2);
544 iFuncCyl2.SetStatus(TFunction_ES_NotExecuted);
546 TFunction_IFunction::NewFunction(Lcyl3, CylinderDriver::GetID());
547 TDataStd_Name::Set(Lcyl3, "Cyl3");
548 Handle(TDataStd_RealArray) carr3 = TDataStd_RealArray::Set(Lcyl3, 1, 3);
549 carr3->SetValue(1, 10.0);
550 carr3->SetValue(2, 135.0);
551 carr3->SetValue(3, 20.0);
552 TDF_Reference::Set(Lcyl3.FindChild(1).FindChild(1), Lcone1.FindChild(3)); // Argument: top
553 TDF_Reference::Set(Lcyl3.FindChild(2).FindChild(1), Lcyl3); // Result
554 TDF_Reference::Set(Lcyl3.FindChild(2).FindChild(2), Lcyl3.FindChild(3)); // Result
555 TFunction_IFunction iFuncCyl3(Lcyl3);
556 iFuncCyl3.SetStatus(TFunction_ES_NotExecuted);
558 TFunction_IFunction::NewFunction(Lcyl4, CylinderDriver::GetID());
559 TDataStd_Name::Set(Lcyl4, "Cyl4");
560 Handle(TDataStd_RealArray) carr4 = TDataStd_RealArray::Set(Lcyl4, 1, 3);
561 carr4->SetValue(1, 10.0);
562 carr4->SetValue(2, 180.0);
563 carr4->SetValue(3, 20.0);
564 TDF_Reference::Set(Lcyl4.FindChild(1).FindChild(1), Lcone1.FindChild(3)); // Argument: top
565 TDF_Reference::Set(Lcyl4.FindChild(2).FindChild(1), Lcyl4); // Result
566 TDF_Reference::Set(Lcyl4.FindChild(2).FindChild(2), Lcyl4.FindChild(3)); // Result
567 TFunction_IFunction iFuncCyl4(Lcyl4);
568 iFuncCyl4.SetStatus(TFunction_ES_NotExecuted);
570 TFunction_IFunction::NewFunction(Lcyl5, CylinderDriver::GetID());
571 TDataStd_Name::Set(Lcyl5, "Cyl5");
572 Handle(TDataStd_RealArray) carr5 = TDataStd_RealArray::Set(Lcyl5, 1, 3);
573 carr5->SetValue(1, 10.0);
574 carr5->SetValue(2, 225.0);
575 carr5->SetValue(3, 20.0);
576 TDF_Reference::Set(Lcyl5.FindChild(1).FindChild(1), Lcone1.FindChild(3)); // Argument: top
577 TDF_Reference::Set(Lcyl5.FindChild(2).FindChild(1), Lcyl5); // Result
578 TDF_Reference::Set(Lcyl5.FindChild(2).FindChild(2), Lcyl5.FindChild(3)); // Result
579 TFunction_IFunction iFuncCyl5(Lcyl5);
580 iFuncCyl5.SetStatus(TFunction_ES_NotExecuted);
582 TFunction_IFunction::NewFunction(Lcyl6, CylinderDriver::GetID());
583 TDataStd_Name::Set(Lcyl6, "Cyl6");
584 Handle(TDataStd_RealArray) carr6 = TDataStd_RealArray::Set(Lcyl6, 1, 3);
585 carr6->SetValue(1, 10.0);
586 carr6->SetValue(2, 270.0);
587 carr6->SetValue(3, 20.0);
588 TDF_Reference::Set(Lcyl6.FindChild(1).FindChild(1), Lcone1.FindChild(3)); // Argument: top
589 TDF_Reference::Set(Lcyl6.FindChild(2).FindChild(1), Lcyl6); // Result
590 TDF_Reference::Set(Lcyl6.FindChild(2).FindChild(2), Lcyl6.FindChild(3)); // Result
591 TFunction_IFunction iFuncCyl6(Lcyl6);
592 iFuncCyl6.SetStatus(TFunction_ES_NotExecuted);
594 TFunction_IFunction::NewFunction(Lcyl7, CylinderDriver::GetID());
595 TDataStd_Name::Set(Lcyl7, "Cyl7");
596 Handle(TDataStd_RealArray) carr7 = TDataStd_RealArray::Set(Lcyl7, 1, 3);
597 carr7->SetValue(1, 10.0);
598 carr7->SetValue(2, 315.0);
599 carr7->SetValue(3, 20.0);
600 TDF_Reference::Set(Lcyl7.FindChild(1).FindChild(1), Lcone1.FindChild(3)); // Argument: top
601 TDF_Reference::Set(Lcyl7.FindChild(2).FindChild(1), Lcyl7); // Result
602 TDF_Reference::Set(Lcyl7.FindChild(2).FindChild(2), Lcyl7.FindChild(3)); // Result
603 TFunction_IFunction iFuncCyl7(Lcyl7);
604 iFuncCyl7.SetStatus(TFunction_ES_NotExecuted);
606 TFunction_IFunction::NewFunction(Lcyl8, CylinderDriver::GetID());
607 TDataStd_Name::Set(Lcyl8, "Cyl8");
608 Handle(TDataStd_RealArray) carr8 = TDataStd_RealArray::Set(Lcyl8, 1, 3);
609 carr8->SetValue(1, 10.0);
610 carr8->SetValue(2, 0.0);
611 carr8->SetValue(3, 20.0);
612 TDF_Reference::Set(Lcyl8.FindChild(1).FindChild(1), Lcone1.FindChild(3)); // Argument: top
613 TDF_Reference::Set(Lcyl8.FindChild(2).FindChild(1), Lcyl8); // Result
614 TDF_Reference::Set(Lcyl8.FindChild(2).FindChild(2), Lcyl8.FindChild(3)); // Result
615 TFunction_IFunction iFuncCyl8(Lcyl8);
616 iFuncCyl8.SetStatus(TFunction_ES_NotExecuted);
618 TFunction_IFunction::NewFunction(Lcone2, ConeDriver::GetID());
619 TDataStd_Name::Set(Lcone2, "Co2");
620 TDataStd_Real::Set(Lcone2, 30);
621 TDF_Reference::Set(Lcone2.FindChild(1).FindChild(1), Lcyl1.FindChild(3)); // Argument: top
622 TDF_Reference::Set(Lcone2.FindChild(1).FindChild(2), Lcyl3.FindChild(3)); // Argument: top
623 TDF_Reference::Set(Lcone2.FindChild(1).FindChild(3), Lcyl5.FindChild(3)); // Argument: top
624 TDF_Reference::Set(Lcone2.FindChild(1).FindChild(4), Lcyl7.FindChild(3)); // Argument: top
625 TDF_Reference::Set(Lcone2.FindChild(2).FindChild(1), Lcone2); // Result
626 TDF_Reference::Set(Lcone2.FindChild(2).FindChild(2), Lcone2.FindChild(3)); // Result
627 TFunction_IFunction iFuncCone2(Lcone2);
628 iFuncCone2.SetStatus(TFunction_ES_NotExecuted);
630 TFunction_IFunction::NewFunction(Lshape1, ShapeSaverDriver::GetID());
631 TDataStd_Name::Set(Lshape1, "Sh");
632 TFunction_IFunction iFuncShape1(Lshape1);
633 iFuncShape1.SetStatus(TFunction_ES_NotExecuted);
634 // Arguments of this functions - results of all functions
636 const TFunction_DoubleMapOfIntegerLabel& all = iFuncShape1.GetAllFunctions();
637 TFunction_DoubleMapIteratorOfDoubleMapOfIntegerLabel itrm(all);
638 for (; itrm.More(); itrm.Next())
640 TFunction_IFunction iFunc(itrm.Key2());
643 TDF_ListIteratorOfLabelList itrl(res);
644 for (; itrl.More(); itrl.Next(), iTag++)
646 TDF_Reference::Set(Lshape1.FindChild(1).FindChild(iTag), itrl.Value());
650 // Construct the dependencies between functions.
651 TFunction_IFunction::UpdateDependencies(mainLabel);
653 // Set the functions 1 .. 4 modified
654 TFunction_IFunction(mainLabel).GetLogbook()->SetTouched(Lpoint1);
655 TFunction_IFunction(mainLabel).GetLogbook()->SetTouched(Lpoint2);
656 TFunction_IFunction(mainLabel).GetLogbook()->SetTouched(Lpoint3);
657 TFunction_IFunction(mainLabel).GetLogbook()->SetTouched(Lpoint4);
660 graph->createModel(doc);
662 //app->SaveAs(doc, "W:\\TestFM\\model2.cbf");