1 /****************************************************************************
3 ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
6 ** This file is part of the examples of the Qt Toolkit.
8 ** $QT_BEGIN_LICENSE:BSD$
9 ** You may use this file under the terms of the BSD license as follows:
11 ** "Redistribution and use in source and binary forms, with or without
12 ** modification, are permitted provided that the following conditions are
14 ** * Redistributions of source code must retain the above copyright
15 ** notice, this list of conditions and the following disclaimer.
16 ** * Redistributions in binary form must reproduce the above copyright
17 ** notice, this list of conditions and the following disclaimer in
18 ** the documentation and/or other materials provided with the
20 ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
21 ** of its contributors may be used to endorse or promote products derived
22 ** from this software without specific prior written permission.
25 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
39 ****************************************************************************/
41 #include "mainwindow.h"
42 #include "graphwidget.h"
46 #include "SimpleDriver.h"
47 #include "PointDriver.h"
48 #include "CircleDriver.h"
49 #include "PrismDriver.h"
50 #include "ConeDriver.h"
51 #include "CylinderDriver.h"
52 #include "ShapeSaverDriver.h"
54 #include <TDocStd_Document.hxx>
55 #include <TFunction_DriverTable.hxx>
56 #include <TFunction_IFunction.hxx>
57 #include <TFunction_GraphNode.hxx>
58 #include <TFunction_DoubleMapOfIntegerLabel.hxx>
59 #include <TFunction_DoubleMapIteratorOfDoubleMapOfIntegerLabel.hxx>
60 #include <TFunction_Scope.hxx>
62 #include <TColStd_MapIteratorOfMapOfInteger.hxx>
63 #include <OSD_Timer.hxx>
65 #include <TDF_Tool.hxx>
66 #include <TDF_Reference.hxx>
67 #include <TDF_MapIteratorOfLabelMap.hxx>
68 #include <TDF_ListIteratorOfLabelList.hxx>
69 #include <TDF_ChildIterator.hxx>
71 #include <TDataStd_Name.hxx>
72 #include <TDataStd_Real.hxx>
73 #include <TDataStd_RealArray.hxx>
75 #include <Standard_WarningsDisable.hxx>
78 #if QT_VERSION > QT_VERSION_CHECK(5, 0, 0)
81 #include <Standard_WarningsRestore.hxx>
88 #include <inspector/TInspector_Communicator.hxx>
89 static TInspector_Communicator* MyTCommunicator;
92 MainWindow::MainWindow()
94 graph = new GraphWidget(this);
95 setCentralWidget(graph);
102 // Create a new document
103 createDefaultModel1();
104 graph->setNbThreads(4);
107 Handle(AppStd_Application) MainWindow::getApplication()
109 if (gApplication.IsNull())
110 gApplication = new AppStd_Application();
114 void MainWindow::closeEvent(QCloseEvent *event)
119 void MainWindow::model1()
122 if (!graph->getDocument().IsNull())
124 QList<QGraphicsItem*> items = graph->scene()->items();
125 for (int i = 0; i < items.size(); i++)
127 QGraphicsItem* item = items.at(i);
128 graph->scene()->removeItem(item);
131 // Close the document
132 getApplication()->Close(graph->getDocument());
135 // Create a new document
136 createDefaultModel1();
139 void MainWindow::model2()
142 if (!graph->getDocument().IsNull())
144 QList<QGraphicsItem*> items = graph->scene()->items();
145 for (int i = 0; i < items.size(); i++)
147 QGraphicsItem* item = items.at(i);
148 graph->scene()->removeItem(item);
151 // Close the document
152 getApplication()->Close(graph->getDocument());
155 // Create a new document
156 createDefaultModel2();
159 static void prepareFunctions(GraphWidget* graph)
161 if (!graph->getDocument().IsNull())
163 TDF_Label L = graph->getDocument()->Main().Root();
164 TDF_ChildIterator itr(L, true);
165 for (; itr.More(); itr.Next())
167 Handle(TFunction_GraphNode) G;
168 if (itr.Value().FindAttribute(TFunction_GraphNode::GetID(), G))
170 G->SetStatus(TFunction_ES_NotExecuted);
176 // Redraw the nodes (change their colour).
177 void MainWindow::redrawGraph()
179 QList<QGraphicsItem*> items = graph->scene()->items();
180 for (int i = 0; i < items.size(); i++)
182 QGraphicsItem* item = items.at(i);
187 void MainWindow::compute()
190 double seconds, CPUTime;
194 int i = 0, nb = 1; // number of repetitions (for test-purpose).
199 prepareFunctions(graph);
202 while (!graph->isFinished())
204 // Redraw the nodes (change their colour).
207 // Process user-events.
208 qApp->processEvents();
217 aTimer.Show(seconds, minutes, hours, CPUTime);
218 std::cout << "Execution of "<<graph->getNbThreads()<< " threads took " << hours << " hours, " << minutes << " minutes, " << seconds << " seconds" << std::endl;
220 // Redraw the nodes (change their colour).
224 void MainWindow::nbThreads()
227 int nb = QInputDialog::getInt(this, tr("Number of threads"), tr("(1 - 4): "),
228 graph->getNbThreads(), 1, 4, 1, &ok);
230 graph->setNbThreads(nb);
233 #ifdef HAVE_Inspector
234 void MainWindow::startDFBrowser()
236 Handle(AppStd_Application) anApplication = getApplication();
237 if (!anApplication.IsNull())
239 if (!MyTCommunicator)
241 MyTCommunicator = new TInspector_Communicator();
243 NCollection_List<Handle(Standard_Transient)> aParameters;
244 aParameters.Append(anApplication);
246 MyTCommunicator->RegisterPlugin("TKDFBrowser");
248 MyTCommunicator->Init(aParameters);
249 MyTCommunicator->Activate("TKDFBrowser");
252 MyTCommunicator->SetVisible(true);
257 void MainWindow::about()
259 QMessageBox::about(this, tr("Test-application of the advanced Function Mechanism"),
260 tr("The <b>Application</b> runs different models "
261 "in single and multi-threaded modes. "
262 "It shows graphically the result of computation."));
265 void MainWindow::createActions()
267 model1Act = new QAction(QIcon("images/open.png"), tr("Model 1"), this);
268 model1Act->setStatusTip(tr("Model 1"));
269 connect(model1Act, SIGNAL(triggered()), this, SLOT(model1()));
271 model2Act = new QAction(QIcon("images/open.png"), tr("Model 2"), this);
272 model2Act->setStatusTip(tr("Model 2"));
273 connect(model2Act, SIGNAL(triggered()), this, SLOT(model2()));
275 computeAct = new QAction(QIcon("images/new.png"), tr("Compute"), this);
276 computeAct->setStatusTip(tr("Compute"));
277 connect(computeAct, SIGNAL(triggered()), this, SLOT(compute()));
279 nbThreadsAct = new QAction(tr("Number of threads"), this);
280 nbThreadsAct->setStatusTip(tr("Number of threads"));
281 connect(nbThreadsAct, SIGNAL(triggered()), this, SLOT(nbThreads()));
283 #ifdef HAVE_Inspector
284 dfBrowserAct = new QAction(tr("DFBrowser"), this);
285 dfBrowserAct->setStatusTip(tr("OCAF structure presentation"));
286 connect(dfBrowserAct, SIGNAL(triggered()), this, SLOT(startDFBrowser()));
289 exitAct = new QAction(tr("E&xit"), this);
290 exitAct->setShortcut(tr("Ctrl+Q"));
291 exitAct->setStatusTip(tr("Exit the application"));
292 connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));
294 aboutAct = new QAction(tr("&About"), this);
295 aboutAct->setStatusTip(tr("Show the application's About box"));
296 connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));
299 void MainWindow::createMenus()
301 computeMenu = menuBar()->addMenu(tr("&Model"));
302 computeMenu->addAction(model1Act);
303 computeMenu->addAction(model2Act);
304 computeMenu->addSeparator();
305 computeMenu->addAction(computeAct);
306 computeMenu->addAction(nbThreadsAct);
307 computeMenu->addSeparator();
308 #ifdef HAVE_Inspector
309 computeMenu->addAction(dfBrowserAct);
310 computeMenu->addSeparator();
312 computeMenu->addAction(exitAct);
314 menuBar()->addSeparator();
316 helpMenu = menuBar()->addMenu(tr("&Help"));
317 helpMenu->addAction(aboutAct);
320 void MainWindow::createToolBars()
322 computeToolBar = addToolBar(tr("Model"));
323 computeToolBar->addAction(model1Act);
324 computeToolBar->addAction(model2Act);
325 computeToolBar->addAction(computeAct);
328 void MainWindow::createStatusBar()
330 statusBar()->showMessage(tr("Ready"));
333 void MainWindow::createDefaultModel1()
335 Handle(AppStd_Application) app = MainWindow::getApplication();
336 Handle(TDocStd_Document) doc;
337 app->NewDocument("XmlOcaf", doc);
338 TDF_Label mainLabel = doc->Main();
339 mainLabel.ForgetAllAttributes(true);
341 // Initialize function drivers
342 TFunction_DriverTable::Get()->AddDriver(SimpleDriver::GetID(), new SimpleDriver());
345 Handle(TFunction_Logbook) logbook = TFunction_Logbook::Set(mainLabel);
347 // Create a tree of functions
348 TDF_Label L1 = mainLabel.FindChild(1);
349 TDF_Label L2 = mainLabel.FindChild(2);
350 TDF_Label L3 = mainLabel.FindChild(3);
351 TDF_Label L4 = mainLabel.FindChild(4);
352 TDF_Label L5 = mainLabel.FindChild(5);
353 TDF_Label L6 = mainLabel.FindChild(6);
354 TDF_Label L7 = mainLabel.FindChild(7);
357 TFunction_IFunction::NewFunction(L1, SimpleDriver::GetID());
358 TDataStd_Name::Set(L1, "1");
359 TDataStd_Real::Set(L1, time); // Argument
360 TDF_Reference::Set(L1.FindChild(2).FindChild(1), L1); // Result
361 TFunction_IFunction iFunc1(L1);
362 iFunc1.GetGraphNode()->SetStatus(TFunction_ES_NotExecuted);
364 TFunction_IFunction::NewFunction(L2, SimpleDriver::GetID());
365 TDataStd_Name::Set(L2, "2");
366 TDataStd_Real::Set(L2, time); // Argument
367 TDF_Reference::Set(L2.FindChild(2).FindChild(1), L2); // Result
368 TFunction_IFunction iFunc2(L2);
369 iFunc2.GetGraphNode()->SetStatus(TFunction_ES_NotExecuted);
371 TFunction_IFunction::NewFunction(L3, SimpleDriver::GetID());
372 TDataStd_Name::Set(L3, "3");
373 TDataStd_Real::Set(L3, time); // Argument
374 TDF_Reference::Set(L3.FindChild(1).FindChild(1), L1); // Argument: F3 -> F1
375 TDF_Reference::Set(L3.FindChild(2).FindChild(1), L3); // Result
376 TFunction_IFunction iFunc3(L3);
377 iFunc3.GetGraphNode()->SetStatus(TFunction_ES_NotExecuted);
379 TFunction_IFunction::NewFunction(L4, SimpleDriver::GetID());
380 TDataStd_Name::Set(L4, "4");
381 TDataStd_Real::Set(L4, time); // Argument
382 TDF_Reference::Set(L4.FindChild(1).FindChild(1), L2); // Argument F4 -> F2
383 TDF_Reference::Set(L4.FindChild(1).FindChild(2), L3); // Argument F4 -> F3
384 TDF_Reference::Set(L4.FindChild(2).FindChild(1), L4); // Result
385 TFunction_IFunction iFunc4(L4);
386 iFunc4.GetGraphNode()->SetStatus(TFunction_ES_NotExecuted);
388 TFunction_IFunction::NewFunction(L5, SimpleDriver::GetID());
389 TDataStd_Name::Set(L5, "5");
390 TDataStd_Real::Set(L5, time); // Argument
391 TDF_Reference::Set(L5.FindChild(1).FindChild(1), L4); // Argument F5 -> F4
392 TDF_Reference::Set(L5.FindChild(2).FindChild(1), L5); // Result
393 TFunction_IFunction iFunc5(L5);
394 iFunc5.GetGraphNode()->SetStatus(TFunction_ES_NotExecuted);
396 TFunction_IFunction::NewFunction(L6, SimpleDriver::GetID());
397 TDataStd_Name::Set(L6, "6");
398 TDataStd_Real::Set(L6, time); // Argument
399 TDF_Reference::Set(L6.FindChild(1).FindChild(1), L4); // Argument F6 ->F4
400 TDF_Reference::Set(L6.FindChild(2).FindChild(1), L6); // Result
401 TFunction_IFunction iFunc6(L6);
402 iFunc6.GetGraphNode()->SetStatus(TFunction_ES_NotExecuted);
404 TFunction_IFunction::NewFunction(L7, SimpleDriver::GetID());
405 TDataStd_Name::Set(L7, "7");
406 TDataStd_Real::Set(L7, time); // Argument
407 TDF_Reference::Set(L7.FindChild(1).FindChild(1), L4); // Argument F7 -> F4
408 TDF_Reference::Set(L7.FindChild(2).FindChild(1), L7); // Result
409 TFunction_IFunction iFunc7(L7);
410 iFunc7.GetGraphNode()->SetStatus(TFunction_ES_NotExecuted);
412 // Construct the dependencies between functions.
413 TFunction_IFunction::UpdateDependencies(mainLabel);
415 // Set the functions 1 and 2 modified
416 iFunc1.GetLogbook()->SetTouched(L1);
417 iFunc2.GetLogbook()->SetTouched(L2);
420 graph->createModel(doc);
423 void MainWindow::createDefaultModel2()
425 Handle(AppStd_Application) app = MainWindow::getApplication();
426 Handle(TDocStd_Document) doc;
427 app->NewDocument("BinOcaf", doc);
428 TDF_Label mainLabel = doc->Main();
429 mainLabel.ForgetAllAttributes(true);
431 // Initialize function drivers
432 TFunction_DriverTable::Get()->AddDriver(PointDriver::GetID(), new PointDriver());
433 TFunction_DriverTable::Get()->AddDriver(CircleDriver::GetID(), new CircleDriver());
434 TFunction_DriverTable::Get()->AddDriver(PrismDriver::GetID(), new PrismDriver());
435 TFunction_DriverTable::Get()->AddDriver(ConeDriver::GetID(), new ConeDriver());
436 TFunction_DriverTable::Get()->AddDriver(CylinderDriver::GetID(), new CylinderDriver());
437 TFunction_DriverTable::Get()->AddDriver(ShapeSaverDriver::GetID(), new ShapeSaverDriver());
439 // Create a tree of functions
440 TDF_Label Lpoint1 = mainLabel.FindChild(1);
441 TDF_Label Lpoint2 = mainLabel.FindChild(2);
442 TDF_Label Lpoint3 = mainLabel.FindChild(3);
443 TDF_Label Lpoint4 = mainLabel.FindChild(4);
444 TDF_Label Lcircle1 = mainLabel.FindChild(5);
445 TDF_Label Lcircle2 = mainLabel.FindChild(6);
446 TDF_Label Lcircle3 = mainLabel.FindChild(7);
447 TDF_Label Lcircle4 = mainLabel.FindChild(8);
448 TDF_Label Lprism1 = mainLabel.FindChild(9);
449 TDF_Label Lprism2 = mainLabel.FindChild(10);
450 TDF_Label Lprism3 = mainLabel.FindChild(11);
451 TDF_Label Lprism4 = mainLabel.FindChild(12);
452 TDF_Label Lcone1 = mainLabel.FindChild(13);
453 TDF_Label Lcyl1 = mainLabel.FindChild(14);
454 TDF_Label Lcyl2 = mainLabel.FindChild(15);
455 TDF_Label Lcyl3 = mainLabel.FindChild(16);
456 TDF_Label Lcyl4 = mainLabel.FindChild(17);
457 TDF_Label Lcyl5 = mainLabel.FindChild(18);
458 TDF_Label Lcyl6 = mainLabel.FindChild(19);
459 TDF_Label Lcyl7 = mainLabel.FindChild(20);
460 TDF_Label Lcyl8 = mainLabel.FindChild(21);
461 TDF_Label Lcone2 = mainLabel.FindChild(22);
462 TDF_Label Lshape1 = mainLabel.FindChild(23);
465 Handle(TFunction_Logbook) logbook = TFunction_Logbook::Set(mainLabel);
469 TFunction_IFunction::NewFunction(Lpoint1, PointDriver::GetID());
470 TDataStd_Name::Set(Lpoint1, "P1");
471 Handle(TDataStd_RealArray) arr1 = TDataStd_RealArray::Set(Lpoint1, 1, 3);
472 arr1->SetValue(1, -50);
473 arr1->SetValue(2, -50);
474 arr1->SetValue(3, 0);
475 TDF_Reference::Set(Lpoint1.FindChild(1).FindChild(1), Lpoint1); // Argument
476 TDF_Reference::Set(Lpoint1.FindChild(2).FindChild(1), Lpoint1); // Result
477 TFunction_IFunction iFuncPoint1(Lpoint1);
478 iFuncPoint1.SetStatus(TFunction_ES_NotExecuted);
480 TFunction_IFunction::NewFunction(Lpoint2, PointDriver::GetID());
481 TDataStd_Name::Set(Lpoint2, "P2");
482 Handle(TDataStd_RealArray) arr2 = TDataStd_RealArray::Set(Lpoint2, 1, 3);
483 arr2->SetValue(1, 50);
484 arr2->SetValue(2, -50);
485 arr2->SetValue(3, 0);
486 TDF_Reference::Set(Lpoint2.FindChild(1).FindChild(1), Lpoint2); // Argument
487 TDF_Reference::Set(Lpoint2.FindChild(2).FindChild(1), Lpoint2); // Result
488 TFunction_IFunction iFuncPoint2(Lpoint2);
489 iFuncPoint2.SetStatus(TFunction_ES_NotExecuted);
491 TFunction_IFunction::NewFunction(Lpoint3, PointDriver::GetID());
492 TDataStd_Name::Set(Lpoint3, "P3");
493 Handle(TDataStd_RealArray) arr3 = TDataStd_RealArray::Set(Lpoint3, 1, 3);
494 arr3->SetValue(1, 50);
495 arr3->SetValue(2, 50);
496 arr3->SetValue(3, 0);
497 TDF_Reference::Set(Lpoint3.FindChild(1).FindChild(1), Lpoint3); // Argument
498 TDF_Reference::Set(Lpoint3.FindChild(2).FindChild(1), Lpoint3); // Result
499 TFunction_IFunction iFuncPoint3(Lpoint3);
500 iFuncPoint3.SetStatus(TFunction_ES_NotExecuted);
502 TFunction_IFunction::NewFunction(Lpoint4, PointDriver::GetID());
503 TDataStd_Name::Set(Lpoint4, "P4");
504 Handle(TDataStd_RealArray) arr4 = TDataStd_RealArray::Set(Lpoint4, 1, 3);
505 arr4->SetValue(1, -50);
506 arr4->SetValue(2, 50);
507 arr4->SetValue(3, 0);
508 TDF_Reference::Set(Lpoint4.FindChild(1).FindChild(1), Lpoint4); // Argument
509 TDF_Reference::Set(Lpoint4.FindChild(2).FindChild(1), Lpoint4); // Result
510 TFunction_IFunction iFuncPoint4(Lpoint4);
511 iFuncPoint4.SetStatus(TFunction_ES_NotExecuted);
514 TFunction_IFunction::NewFunction(Lcircle1, CircleDriver::GetID());
515 TDataStd_Name::Set(Lcircle1, "C1");
516 TDataStd_Real::Set(Lcircle1, 10);
517 TDF_Reference::Set(Lcircle1.FindChild(1).FindChild(1), Lpoint1); // Argument: point
518 TDF_Reference::Set(Lcircle1.FindChild(2).FindChild(1), Lcircle1); // Result
519 TFunction_IFunction iFuncCircle1(Lcircle1);
520 iFuncCircle1.SetStatus(TFunction_ES_NotExecuted);
522 TFunction_IFunction::NewFunction(Lcircle2, CircleDriver::GetID());
523 TDataStd_Name::Set(Lcircle2, "C2");
524 TDataStd_Real::Set(Lcircle2, 20);
525 TDF_Reference::Set(Lcircle2.FindChild(1).FindChild(1), Lpoint2); // Argument: point
526 TDF_Reference::Set(Lcircle2.FindChild(2).FindChild(1), Lcircle2); // Result
527 TFunction_IFunction iFuncCircle2(Lcircle2);
528 iFuncCircle2.SetStatus(TFunction_ES_NotExecuted);
530 TFunction_IFunction::NewFunction(Lcircle3, CircleDriver::GetID());
531 TDataStd_Name::Set(Lcircle3, "C3");
532 TDataStd_Real::Set(Lcircle3, 30);
533 TDF_Reference::Set(Lcircle3.FindChild(1).FindChild(1), Lpoint3); // Argument: point
534 TDF_Reference::Set(Lcircle3.FindChild(2).FindChild(1), Lcircle3); // Result
535 TFunction_IFunction iFuncCircle3(Lcircle3);
536 iFuncCircle3.SetStatus(TFunction_ES_NotExecuted);
538 TFunction_IFunction::NewFunction(Lcircle4, CircleDriver::GetID());
539 TDataStd_Name::Set(Lcircle4, "C4");
540 TDataStd_Real::Set(Lcircle4, 40);
541 TDF_Reference::Set(Lcircle4.FindChild(1).FindChild(1), Lpoint4); // Argument: point
542 TDF_Reference::Set(Lcircle4.FindChild(2).FindChild(1), Lcircle4); // Result
543 TFunction_IFunction iFuncCircle4(Lcircle4);
544 iFuncCircle4.SetStatus(TFunction_ES_NotExecuted);
547 TFunction_IFunction::NewFunction(Lprism1, PrismDriver::GetID());
548 TDataStd_Name::Set(Lprism1, "Pr1");
549 TDataStd_Real::Set(Lprism1, 30);
550 TDF_Reference::Set(Lprism1.FindChild(1).FindChild(1), Lcircle1); // Argument: point
551 TDF_Reference::Set(Lprism1.FindChild(2).FindChild(1), Lprism1); // Result
552 TDF_Reference::Set(Lprism1.FindChild(2).FindChild(2), Lprism1.FindChild(3)); // Result (top)
553 TFunction_IFunction iFuncPrism1(Lprism1);
554 iFuncPrism1.SetStatus(TFunction_ES_NotExecuted);
556 TFunction_IFunction::NewFunction(Lprism2, PrismDriver::GetID());
557 TDataStd_Name::Set(Lprism2, "Pr2");
558 TDataStd_Real::Set(Lprism2, 30);
559 TDF_Reference::Set(Lprism2.FindChild(1).FindChild(1), Lcircle2); // Argument: point
560 TDF_Reference::Set(Lprism2.FindChild(2).FindChild(1), Lprism2); // Result
561 TDF_Reference::Set(Lprism2.FindChild(2).FindChild(2), Lprism2.FindChild(3)); // Result (top)
562 TFunction_IFunction iFuncPrism2(Lprism2);
563 iFuncPrism2.SetStatus(TFunction_ES_NotExecuted);
565 TFunction_IFunction::NewFunction(Lprism3, PrismDriver::GetID());
566 TDataStd_Name::Set(Lprism3, "Pr3");
567 TDataStd_Real::Set(Lprism3, 30);
568 TDF_Reference::Set(Lprism3.FindChild(1).FindChild(1), Lcircle3); // Argument: point
569 TDF_Reference::Set(Lprism3.FindChild(2).FindChild(1), Lprism3); // Result
570 TDF_Reference::Set(Lprism3.FindChild(2).FindChild(2), Lprism3.FindChild(3)); // Result (top)
571 TFunction_IFunction iFuncPrism3(Lprism3);
572 iFuncPrism3.SetStatus(TFunction_ES_NotExecuted);
574 TFunction_IFunction::NewFunction(Lprism4, PrismDriver::GetID());
575 TDataStd_Name::Set(Lprism4, "Pr4");
576 TDataStd_Real::Set(Lprism4, 30);
577 TDF_Reference::Set(Lprism4.FindChild(1).FindChild(1), Lcircle4); // Argument: point
578 TDF_Reference::Set(Lprism4.FindChild(2).FindChild(1), Lprism4); // Result
579 TDF_Reference::Set(Lprism4.FindChild(2).FindChild(2), Lprism4.FindChild(3)); // Result (top)
580 TFunction_IFunction iFuncPrism4(Lprism4);
581 iFuncPrism4.SetStatus(TFunction_ES_NotExecuted);
583 TFunction_IFunction::NewFunction(Lcone1, ConeDriver::GetID());
584 TDataStd_Name::Set(Lcone1, "Co1");
585 TDataStd_Real::Set(Lcone1, 20);
586 TDF_Reference::Set(Lcone1.FindChild(1).FindChild(1), Lprism1.FindChild(3)); // Argument: top
587 TDF_Reference::Set(Lcone1.FindChild(1).FindChild(2), Lprism2.FindChild(3)); // Argument: top
588 TDF_Reference::Set(Lcone1.FindChild(1).FindChild(3), Lprism3.FindChild(3)); // Argument: top
589 TDF_Reference::Set(Lcone1.FindChild(1).FindChild(4), Lprism4.FindChild(3)); // Argument: top
590 TDF_Reference::Set(Lcone1.FindChild(2).FindChild(1), Lcone1); // Result
591 TDF_Reference::Set(Lcone1.FindChild(2).FindChild(2), Lcone1.FindChild(3)); // Result
592 TFunction_IFunction iFuncCone1(Lcone1);
593 iFuncCone1.SetStatus(TFunction_ES_NotExecuted);
596 TFunction_IFunction::NewFunction(Lcyl1, CylinderDriver::GetID());
597 TDataStd_Name::Set(Lcyl1, "Cyl1");
598 Handle(TDataStd_RealArray) carr1 = TDataStd_RealArray::Set(Lcyl1, 1, 3);
599 carr1->SetValue(1, 10.0);
600 carr1->SetValue(2, 45.0);
601 carr1->SetValue(3, 20.0);
602 TDF_Reference::Set(Lcyl1.FindChild(1).FindChild(1), Lcone1.FindChild(3)); // Argument: top
603 TDF_Reference::Set(Lcyl1.FindChild(2).FindChild(1), Lcyl1); // Result
604 TDF_Reference::Set(Lcyl1.FindChild(2).FindChild(2), Lcyl1.FindChild(3)); // Result
605 TFunction_IFunction iFuncCyl1(Lcyl1);
606 iFuncCyl1.SetStatus(TFunction_ES_NotExecuted);
608 TFunction_IFunction::NewFunction(Lcyl2, CylinderDriver::GetID());
609 TDataStd_Name::Set(Lcyl2, "Cyl2");
610 Handle(TDataStd_RealArray) carr2 = TDataStd_RealArray::Set(Lcyl2, 1, 3);
611 carr2->SetValue(1, 10.0);
612 carr2->SetValue(2, 90.0);
613 carr2->SetValue(3, 20.0);
614 TDF_Reference::Set(Lcyl2.FindChild(1).FindChild(1), Lcone1.FindChild(3)); // Argument: top
615 TDF_Reference::Set(Lcyl2.FindChild(2).FindChild(1), Lcyl2); // Result
616 TDF_Reference::Set(Lcyl2.FindChild(2).FindChild(2), Lcyl2.FindChild(3)); // Result
617 TFunction_IFunction iFuncCyl2(Lcyl2);
618 iFuncCyl2.SetStatus(TFunction_ES_NotExecuted);
620 TFunction_IFunction::NewFunction(Lcyl3, CylinderDriver::GetID());
621 TDataStd_Name::Set(Lcyl3, "Cyl3");
622 Handle(TDataStd_RealArray) carr3 = TDataStd_RealArray::Set(Lcyl3, 1, 3);
623 carr3->SetValue(1, 10.0);
624 carr3->SetValue(2, 135.0);
625 carr3->SetValue(3, 20.0);
626 TDF_Reference::Set(Lcyl3.FindChild(1).FindChild(1), Lcone1.FindChild(3)); // Argument: top
627 TDF_Reference::Set(Lcyl3.FindChild(2).FindChild(1), Lcyl3); // Result
628 TDF_Reference::Set(Lcyl3.FindChild(2).FindChild(2), Lcyl3.FindChild(3)); // Result
629 TFunction_IFunction iFuncCyl3(Lcyl3);
630 iFuncCyl3.SetStatus(TFunction_ES_NotExecuted);
632 TFunction_IFunction::NewFunction(Lcyl4, CylinderDriver::GetID());
633 TDataStd_Name::Set(Lcyl4, "Cyl4");
634 Handle(TDataStd_RealArray) carr4 = TDataStd_RealArray::Set(Lcyl4, 1, 3);
635 carr4->SetValue(1, 10.0);
636 carr4->SetValue(2, 180.0);
637 carr4->SetValue(3, 20.0);
638 TDF_Reference::Set(Lcyl4.FindChild(1).FindChild(1), Lcone1.FindChild(3)); // Argument: top
639 TDF_Reference::Set(Lcyl4.FindChild(2).FindChild(1), Lcyl4); // Result
640 TDF_Reference::Set(Lcyl4.FindChild(2).FindChild(2), Lcyl4.FindChild(3)); // Result
641 TFunction_IFunction iFuncCyl4(Lcyl4);
642 iFuncCyl4.SetStatus(TFunction_ES_NotExecuted);
644 TFunction_IFunction::NewFunction(Lcyl5, CylinderDriver::GetID());
645 TDataStd_Name::Set(Lcyl5, "Cyl5");
646 Handle(TDataStd_RealArray) carr5 = TDataStd_RealArray::Set(Lcyl5, 1, 3);
647 carr5->SetValue(1, 10.0);
648 carr5->SetValue(2, 225.0);
649 carr5->SetValue(3, 20.0);
650 TDF_Reference::Set(Lcyl5.FindChild(1).FindChild(1), Lcone1.FindChild(3)); // Argument: top
651 TDF_Reference::Set(Lcyl5.FindChild(2).FindChild(1), Lcyl5); // Result
652 TDF_Reference::Set(Lcyl5.FindChild(2).FindChild(2), Lcyl5.FindChild(3)); // Result
653 TFunction_IFunction iFuncCyl5(Lcyl5);
654 iFuncCyl5.SetStatus(TFunction_ES_NotExecuted);
656 TFunction_IFunction::NewFunction(Lcyl6, CylinderDriver::GetID());
657 TDataStd_Name::Set(Lcyl6, "Cyl6");
658 Handle(TDataStd_RealArray) carr6 = TDataStd_RealArray::Set(Lcyl6, 1, 3);
659 carr6->SetValue(1, 10.0);
660 carr6->SetValue(2, 270.0);
661 carr6->SetValue(3, 20.0);
662 TDF_Reference::Set(Lcyl6.FindChild(1).FindChild(1), Lcone1.FindChild(3)); // Argument: top
663 TDF_Reference::Set(Lcyl6.FindChild(2).FindChild(1), Lcyl6); // Result
664 TDF_Reference::Set(Lcyl6.FindChild(2).FindChild(2), Lcyl6.FindChild(3)); // Result
665 TFunction_IFunction iFuncCyl6(Lcyl6);
666 iFuncCyl6.SetStatus(TFunction_ES_NotExecuted);
668 TFunction_IFunction::NewFunction(Lcyl7, CylinderDriver::GetID());
669 TDataStd_Name::Set(Lcyl7, "Cyl7");
670 Handle(TDataStd_RealArray) carr7 = TDataStd_RealArray::Set(Lcyl7, 1, 3);
671 carr7->SetValue(1, 10.0);
672 carr7->SetValue(2, 315.0);
673 carr7->SetValue(3, 20.0);
674 TDF_Reference::Set(Lcyl7.FindChild(1).FindChild(1), Lcone1.FindChild(3)); // Argument: top
675 TDF_Reference::Set(Lcyl7.FindChild(2).FindChild(1), Lcyl7); // Result
676 TDF_Reference::Set(Lcyl7.FindChild(2).FindChild(2), Lcyl7.FindChild(3)); // Result
677 TFunction_IFunction iFuncCyl7(Lcyl7);
678 iFuncCyl7.SetStatus(TFunction_ES_NotExecuted);
680 TFunction_IFunction::NewFunction(Lcyl8, CylinderDriver::GetID());
681 TDataStd_Name::Set(Lcyl8, "Cyl8");
682 Handle(TDataStd_RealArray) carr8 = TDataStd_RealArray::Set(Lcyl8, 1, 3);
683 carr8->SetValue(1, 10.0);
684 carr8->SetValue(2, 0.0);
685 carr8->SetValue(3, 20.0);
686 TDF_Reference::Set(Lcyl8.FindChild(1).FindChild(1), Lcone1.FindChild(3)); // Argument: top
687 TDF_Reference::Set(Lcyl8.FindChild(2).FindChild(1), Lcyl8); // Result
688 TDF_Reference::Set(Lcyl8.FindChild(2).FindChild(2), Lcyl8.FindChild(3)); // Result
689 TFunction_IFunction iFuncCyl8(Lcyl8);
690 iFuncCyl8.SetStatus(TFunction_ES_NotExecuted);
692 TFunction_IFunction::NewFunction(Lcone2, ConeDriver::GetID());
693 TDataStd_Name::Set(Lcone2, "Co2");
694 TDataStd_Real::Set(Lcone2, 30);
695 TDF_Reference::Set(Lcone2.FindChild(1).FindChild(1), Lcyl1.FindChild(3)); // Argument: top
696 TDF_Reference::Set(Lcone2.FindChild(1).FindChild(2), Lcyl3.FindChild(3)); // Argument: top
697 TDF_Reference::Set(Lcone2.FindChild(1).FindChild(3), Lcyl5.FindChild(3)); // Argument: top
698 TDF_Reference::Set(Lcone2.FindChild(1).FindChild(4), Lcyl7.FindChild(3)); // Argument: top
699 TDF_Reference::Set(Lcone2.FindChild(2).FindChild(1), Lcone2); // Result
700 TDF_Reference::Set(Lcone2.FindChild(2).FindChild(2), Lcone2.FindChild(3)); // Result
701 TFunction_IFunction iFuncCone2(Lcone2);
702 iFuncCone2.SetStatus(TFunction_ES_NotExecuted);
704 TFunction_IFunction::NewFunction(Lshape1, ShapeSaverDriver::GetID());
705 TDataStd_Name::Set(Lshape1, "Sh");
706 TFunction_IFunction iFuncShape1(Lshape1);
707 iFuncShape1.SetStatus(TFunction_ES_NotExecuted);
708 // Arguments of this functions - results of all functions
710 const TFunction_DoubleMapOfIntegerLabel& all = iFuncShape1.GetAllFunctions();
711 TFunction_DoubleMapIteratorOfDoubleMapOfIntegerLabel itrm(all);
712 for (; itrm.More(); itrm.Next())
714 TFunction_IFunction iFunc(itrm.Key2());
717 TDF_ListIteratorOfLabelList itrl(res);
718 for (; itrl.More(); itrl.Next(), iTag++)
720 TDF_Reference::Set(Lshape1.FindChild(1).FindChild(iTag), itrl.Value());
724 // Construct the dependencies between functions.
725 TFunction_IFunction::UpdateDependencies(mainLabel);
727 // Set the functions 1 .. 4 modified
728 TFunction_IFunction(mainLabel).GetLogbook()->SetTouched(Lpoint1);
729 TFunction_IFunction(mainLabel).GetLogbook()->SetTouched(Lpoint2);
730 TFunction_IFunction(mainLabel).GetLogbook()->SetTouched(Lpoint3);
731 TFunction_IFunction(mainLabel).GetLogbook()->SetTouched(Lpoint4);
734 graph->createModel(doc);
736 //app->SaveAs(doc, "W:\\TestFM\\model2.cbf");