0029750: Samples - function arrows are not updated by moving a node in FuncDemo qt...
[occt.git] / samples / qt / FuncDemo / src / mainwindow.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
5 **
6 ** This file is part of the examples of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:BSD$
9 ** You may use this file under the terms of the BSD license as follows:
10 **
11 ** "Redistribution and use in source and binary forms, with or without
12 ** modification, are permitted provided that the following conditions are
13 ** met:
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
19 **     distribution.
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.
23 **
24 **
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."
36 **
37 ** $QT_END_LICENSE$
38 **
39 ****************************************************************************/
40
41 #include "mainwindow.h"
42 #include "graphwidget.h"
43 #include "node.h"
44 #include "edge.h"
45
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"
53
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>
61
62 #include <TColStd_MapIteratorOfMapOfInteger.hxx>
63 #include <OSD_Timer.hxx>
64
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>
70
71 #include <TDataStd_Name.hxx>
72 #include <TDataStd_Real.hxx>
73 #include <TDataStd_RealArray.hxx>
74
75 #include <Standard_WarningsDisable.hxx>
76 #include <QtGui>
77 #include <QtGlobal>
78 #if QT_VERSION > QT_VERSION_CHECK(5, 0, 0)
79 #include <QtWidgets>
80 #endif
81 #include <Standard_WarningsRestore.hxx>
82
83 #ifdef __GNUC__
84 #include <unistd.h>
85 #endif
86
87 #ifdef HAVE_Inspector
88 #include <inspector/TInspector_Communicator.hxx>
89 static TInspector_Communicator* MyTCommunicator;
90 #endif
91
92 MainWindow::MainWindow()
93 {
94     graph = new GraphWidget(this);
95     setCentralWidget(graph);
96
97     createActions();
98     createMenus();
99     createToolBars();
100     createStatusBar();
101
102     // Create a new document
103     createDefaultModel1();
104     graph->setNbThreads(4);
105 }
106
107 Handle(AppStd_Application) MainWindow::getApplication()
108 {
109     if (gApplication.IsNull())
110         gApplication = new AppStd_Application();
111     return gApplication;
112 }
113
114 void MainWindow::closeEvent(QCloseEvent *event)
115 {
116     event->accept();
117 }
118
119 void MainWindow::model1()
120 {
121     // Clean the view
122     if (!graph->getDocument().IsNull())
123     {
124         QList<QGraphicsItem*> items = graph->scene()->items();
125         for (int i = 0; i < items.size(); i++)
126         {
127             QGraphicsItem* item = items.at(i);
128             graph->scene()->removeItem(item);
129         }
130     
131         // Close the document
132         getApplication()->Close(graph->getDocument());
133     }
134
135     // Create a new document
136     createDefaultModel1();
137 }
138
139 void MainWindow::model2()
140 {
141     // Clean the view
142     if (!graph->getDocument().IsNull())
143     {
144         QList<QGraphicsItem*> items = graph->scene()->items();
145         for (int i = 0; i < items.size(); i++)
146         {
147             QGraphicsItem* item = items.at(i);
148             graph->scene()->removeItem(item);
149         }
150     
151         // Close the document
152         getApplication()->Close(graph->getDocument());
153     }
154
155     // Create a new document
156     createDefaultModel2();
157 }
158
159 static void prepareFunctions(GraphWidget* graph)
160 {
161     if (!graph->getDocument().IsNull())
162     {
163         TDF_Label L = graph->getDocument()->Main().Root();
164         TDF_ChildIterator itr(L, true);
165         for (; itr.More(); itr.Next())
166         {
167             Handle(TFunction_GraphNode) G;
168             if (itr.Value().FindAttribute(TFunction_GraphNode::GetID(), G))
169             {
170                 G->SetStatus(TFunction_ES_NotExecuted);
171             }
172         }
173     }
174 }
175
176 // Redraw the nodes (change their colour).            
177 void MainWindow::redrawGraph()
178 {
179     QList<QGraphicsItem*> items = graph->scene()->items();
180     for (int i = 0; i < items.size(); i++)
181     {
182         QGraphicsItem* item = items.at(i);
183         item->update();
184     }
185 }
186
187 void MainWindow::compute()
188 {
189     OSD_Timer aTimer;
190     double seconds, CPUTime;
191     int hours, minutes;
192     aTimer.Start();
193
194     int i = 0, nb = 1; // number of repetitions (for test-purpose).
195
196     // Run computation
197     while (i++ < nb)
198     {
199         prepareFunctions(graph);
200         graph->compute();
201
202         while (!graph->isFinished())
203         {
204             // Redraw the nodes (change their colour).            
205             redrawGraph();
206
207             // Process user-events.
208             qApp->processEvents();
209             #ifdef __GNUC__
210                sleep(0.001);
211             #else
212                ::Sleep(100);
213             #endif
214         }
215     }
216
217     aTimer.Show(seconds, minutes, hours, CPUTime);
218     std::cout << "Execution of "<<graph->getNbThreads()<< " threads took          " << hours << " hours, " << minutes << " minutes, " << seconds << " seconds" << std::endl;
219
220     // Redraw the nodes (change their colour).            
221     redrawGraph();
222 }
223
224 void MainWindow::nbThreads()
225 {
226     bool ok;
227     int nb = QInputDialog::getInt(this, tr("Number of threads"), tr("(1 - 4): "),
228                                   graph->getNbThreads(), 1, 4, 1, &ok);
229     if (ok)
230         graph->setNbThreads(nb);
231 }
232
233 #ifdef HAVE_Inspector
234 void MainWindow::startDFBrowser()
235 {
236   Handle(AppStd_Application) anApplication = getApplication();
237   if (!anApplication.IsNull())
238   {
239     if (!MyTCommunicator)
240     {
241       MyTCommunicator = new TInspector_Communicator();
242
243       NCollection_List<Handle(Standard_Transient)> aParameters;
244       aParameters.Append(anApplication);
245
246       MyTCommunicator->RegisterPlugin("TKDFBrowser");
247
248       MyTCommunicator->Init(aParameters);
249       MyTCommunicator->Activate("TKDFBrowser");
250
251     }
252     MyTCommunicator->SetVisible(true);
253   }
254 }
255 #endif
256
257 void MainWindow::about()
258 {
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."));
263 }
264
265 void MainWindow::createActions()
266 {
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()));
270
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()));
274
275     computeAct = new QAction(QIcon("images/new.png"), tr("Compute"), this);
276     computeAct->setStatusTip(tr("Compute"));
277     connect(computeAct, SIGNAL(triggered()), this, SLOT(compute()));
278
279     nbThreadsAct = new QAction(tr("Number of threads"), this);
280     nbThreadsAct->setStatusTip(tr("Number of threads"));
281     connect(nbThreadsAct, SIGNAL(triggered()), this, SLOT(nbThreads()));
282
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()));
287 #endif
288
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()));
293
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()));
297 }
298
299 void MainWindow::createMenus()
300 {
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();
311 #endif
312     computeMenu->addAction(exitAct);
313
314     menuBar()->addSeparator();
315
316     helpMenu = menuBar()->addMenu(tr("&Help"));
317     helpMenu->addAction(aboutAct);
318 }
319
320 void MainWindow::createToolBars()
321 {
322     computeToolBar = addToolBar(tr("Model"));
323     computeToolBar->addAction(model1Act);
324     computeToolBar->addAction(model2Act);
325     computeToolBar->addAction(computeAct);
326 }
327
328 void MainWindow::createStatusBar()
329 {
330     statusBar()->showMessage(tr("Ready"));
331 }
332
333 void MainWindow::createDefaultModel1()
334 {
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);
340
341     // Initialize function drivers
342     TFunction_DriverTable::Get()->AddDriver(SimpleDriver::GetID(), new SimpleDriver());
343
344     // Set a logbook.
345     Handle(TFunction_Logbook) logbook = TFunction_Logbook::Set(mainLabel);
346
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);
355     double time = 2;
356     // 1:
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);
363     // 2:
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);
370     // 3:
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);
378     // 4:
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);
387     // 5:
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);
395     // 6:
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);
403     // 7:
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);
411
412     // Construct the dependencies between functions.
413     TFunction_IFunction::UpdateDependencies(mainLabel);
414
415     // Set the functions 1 and 2 modified
416     iFunc1.GetLogbook()->SetTouched(L1);
417     iFunc2.GetLogbook()->SetTouched(L2);
418
419     // Draw the model
420     graph->createModel(doc);
421 }
422
423 void MainWindow::createDefaultModel2()
424 {
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);
430
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());
438
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);
463
464     // Set a logbook.
465     Handle(TFunction_Logbook) logbook = TFunction_Logbook::Set(mainLabel);
466
467     // Points:
468     // Point 1:
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);
479     // Point 2:
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);
490     // Point 3:
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);
501     // Point 4:
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);
512     // Circles:
513     // Circle 1:
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);
521     // Circle 2:
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);
529     // Circle 3:
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);
537     // Circle 4:
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);
545     // Prisms:
546     // Prism 1:
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);
555     // Prism 2:
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);
564     // Prism 3:
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);
573     // Prism 4:
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);
582     // Cone 1:
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);
594     // Cylinders:
595     // Cylinder 1:
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);
607     // Cylinder 2:
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);
619     // Cylinder 3:
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);
631     // Cylinder 4:
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);
643     // Cylinder 5:
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);
655     // Cylinder 6:
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);
667     // Cylinder 7:
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);
679     // Cylinder 8:
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);
691     // Cone 2:
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);
703     // Shape saver 1:
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
709     int iTag = 1;
710     const TFunction_DoubleMapOfIntegerLabel& all = iFuncShape1.GetAllFunctions();
711     TFunction_DoubleMapIteratorOfDoubleMapOfIntegerLabel itrm(all);
712     for (; itrm.More(); itrm.Next())
713     {
714         TFunction_IFunction iFunc(itrm.Key2());
715         TDF_LabelList res;
716         iFunc.Results(res);
717         TDF_ListIteratorOfLabelList itrl(res);
718         for (; itrl.More(); itrl.Next(), iTag++)
719         {
720             TDF_Reference::Set(Lshape1.FindChild(1).FindChild(iTag), itrl.Value());
721         }
722     }
723
724     // Construct the dependencies between functions.
725     TFunction_IFunction::UpdateDependencies(mainLabel);
726
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);
732
733     // Draw the model
734     graph->createModel(doc);
735
736     //app->SaveAs(doc, "W:\\TestFM\\model2.cbf");
737 }