0024665: A sample for advanced function mechanism
[occt.git] / samples / qt / FuncDemo / src / mainwindow.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2004-2007 Trolltech ASA. All rights reserved.
4 **
5 ** This file is part of the example classes of the Qt Toolkit.
6 **
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.
12 **
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.
16 **
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.
19 **
20 ****************************************************************************/
21
22 #include <QtGui>
23
24 #include "mainwindow.h"
25 #include "graphwidget.h"
26 #include "node.h"
27 #include "edge.h"
28
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"
36
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>
44
45 #include <TColStd_MapIteratorOfMapOfInteger.hxx>
46 #include <OSD_Timer.hxx>
47
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>
53
54 #include <TDataStd_Name.hxx>
55 #include <TDataStd_Real.hxx>
56 #include <TDataStd_RealArray.hxx>
57
58 MainWindow::MainWindow()
59 {
60     graph = new GraphWidget(this);
61     setCentralWidget(graph);
62
63     createActions();
64     createMenus();
65     createToolBars();
66     createStatusBar();
67
68     // Create a new document
69     createDefaultModel1();
70 }
71
72 Handle(AppStd_Application) MainWindow::getApplication()
73 {
74     if (gApplication.IsNull())
75         gApplication = new AppStd_Application();
76     return gApplication;
77 }
78
79 void MainWindow::closeEvent(QCloseEvent *event)
80 {
81     event->accept();
82 }
83
84 void MainWindow::model1()
85 {
86     // Clean the view
87     if (!graph->getDocument().IsNull())
88     {
89         QList<QGraphicsItem*> items = graph->scene()->items();
90         for (int i = 0; i < items.size(); i++)
91         {
92             QGraphicsItem* item = items.at(i);
93             graph->scene()->removeItem(item);
94         }
95     
96         // Close the document
97         getApplication()->Close(graph->getDocument());
98     }
99
100     // Create a new document
101     createDefaultModel1();
102 }
103
104 void MainWindow::model2()
105 {
106     // Clean the view
107     if (!graph->getDocument().IsNull())
108     {
109         QList<QGraphicsItem*> items = graph->scene()->items();
110         for (int i = 0; i < items.size(); i++)
111         {
112             QGraphicsItem* item = items.at(i);
113             graph->scene()->removeItem(item);
114         }
115     
116         // Close the document
117         getApplication()->Close(graph->getDocument());
118     }
119
120     // Create a new document
121     createDefaultModel2();
122 }
123
124 static void prepareFunctions(GraphWidget* graph)
125 {
126     if (!graph->getDocument().IsNull())
127     {
128         TDF_Label L = graph->getDocument()->Main().Root();
129         TDF_ChildIterator itr(L, true);
130         for (; itr.More(); itr.Next())
131         {
132             Handle(TFunction_GraphNode) G;
133             if (itr.Value().FindAttribute(TFunction_GraphNode::GetID(), G))
134             {
135                 G->SetStatus(TFunction_ES_NotExecuted);
136             }
137         }
138     }
139 }
140
141 // Redraw the nodes (change their colour).            
142 void MainWindow::redrawGraph()
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         item->update();
149     }
150 }
151
152 void MainWindow::compute()
153 {
154     OSD_Timer aTimer;
155     double seconds, CPUTime;
156     int hours, minutes;
157     aTimer.Start();
158
159     int i = 0, nb = 1; // number of repetitions (for test-purpose).
160
161     // Run computation
162     while (i++ < nb)
163     {
164         prepareFunctions(graph);
165         graph->compute();
166
167         while (!graph->isFinished())
168         {
169             // Redraw the nodes (change their colour).            
170             redrawGraph();
171
172             // Process user-events.
173             qApp->processEvents();
174             ::Sleep(100);
175         }
176     }
177
178     aTimer.Show(seconds, minutes, hours, CPUTime);
179     cout << "Execution of "<<graph->getNbThreads()<< " threads took          " << hours << " hours, " << minutes << " minutes, " << seconds << " seconds" << endl;
180
181     // Redraw the nodes (change their colour).            
182     redrawGraph();
183 }
184
185 void MainWindow::nbThreads()
186 {
187     bool ok;
188     int nb = QInputDialog::getInteger(this, tr("Number of threads"), tr("(1 - 4): "), 
189                                       graph->getNbThreads(), 1, 4, 1, &ok);
190     if (ok)
191         graph->setNbThreads(nb);
192 }
193
194 void MainWindow::about()
195 {
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."));
200 }
201
202 void MainWindow::createActions()
203 {
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()));
207
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()));
211
212     computeAct = new QAction(QIcon("images/new.png"), tr("Compute"), this);
213     computeAct->setStatusTip(tr("Compute"));
214     connect(computeAct, SIGNAL(triggered()), this, SLOT(compute()));
215
216     nbThreadsAct = new QAction(tr("Number of threads"), this);
217     nbThreadsAct->setStatusTip(tr("Number of threads"));
218     connect(nbThreadsAct, SIGNAL(triggered()), this, SLOT(nbThreads()));
219
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()));
224
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()));
228 }
229
230 void MainWindow::createMenus()
231 {
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);
240
241     menuBar()->addSeparator();
242
243     helpMenu = menuBar()->addMenu(tr("&Help"));
244     helpMenu->addAction(aboutAct);
245 }
246
247 void MainWindow::createToolBars()
248 {
249     computeToolBar = addToolBar(tr("Model"));
250     computeToolBar->addAction(model1Act);
251     computeToolBar->addAction(model2Act);
252     computeToolBar->addAction(computeAct);
253 }
254
255 void MainWindow::createStatusBar()
256 {
257     statusBar()->showMessage(tr("Ready"));
258 }
259
260 void MainWindow::createDefaultModel1()
261 {
262     Handle(AppStd_Application) app = MainWindow::getApplication();
263     Handle(TDocStd_Document) doc;
264     app->NewDocument("XmlOcaf", doc);
265     TDF_Label mainLabel = doc->Main();
266
267     // Initialize function drivers
268     TFunction_DriverTable::Get()->AddDriver(SimpleDriver::GetID(), new SimpleDriver());
269
270     // Set a logbook.
271     Handle(TFunction_Logbook) logbook = TFunction_Logbook::Set(mainLabel);
272
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);
281     double time = 2;
282     // 1:
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);
289     // 2:
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);
296     // 3:
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);
304     // 4:
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);
313     // 5:
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);
321     // 6:
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);
329     // 7:
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);
337
338     // Construct the dependencies between functions.
339     TFunction_IFunction::UpdateDependencies(mainLabel);
340
341     // Set the functions 1 and 2 modified
342     iFunc1.GetLogbook()->SetTouched(L1);
343     iFunc2.GetLogbook()->SetTouched(L2);
344
345     // Draw the model
346     graph->createModel(doc);
347 }
348
349 void MainWindow::createDefaultModel2()
350 {
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();
356
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());
364
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);
389
390     // Set a logbook.
391     Handle(TFunction_Logbook) logbook = TFunction_Logbook::Set(mainLabel);
392
393     // Points:
394     // Point 1:
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);
405     // Point 2:
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);
416     // Point 3:
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);
427     // Point 4:
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);
438     // Circles:
439     // Circle 1:
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);
447     // Circle 2:
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);
455     // Circle 3:
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);
463     // Circle 4:
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);
471     // Prisms:
472     // Prism 1:
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);
481     // Prism 2:
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);
490     // Prism 3:
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);
499     // Prism 4:
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);
508     // Cone 1:
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);
520     // Cylinders:
521     // Cylinder 1:
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);
533     // Cylinder 2:
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);
545     // Cylinder 3:
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);
557     // Cylinder 4:
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);
569     // Cylinder 5:
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);
581     // Cylinder 6:
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);
593     // Cylinder 7:
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);
605     // Cylinder 8:
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);
617     // Cone 2:
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);
629     // Shape saver 1:
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
635     int iTag = 1;
636     const TFunction_DoubleMapOfIntegerLabel& all = iFuncShape1.GetAllFunctions();
637     TFunction_DoubleMapIteratorOfDoubleMapOfIntegerLabel itrm(all);
638     for (; itrm.More(); itrm.Next())
639     {
640         TFunction_IFunction iFunc(itrm.Key2());
641         TDF_LabelList res;
642         iFunc.Results(res);
643         TDF_ListIteratorOfLabelList itrl(res);
644         for (; itrl.More(); itrl.Next(), iTag++)
645         {
646             TDF_Reference::Set(Lshape1.FindChild(1).FindChild(iTag), itrl.Value());
647         }
648     }
649
650     // Construct the dependencies between functions.
651     TFunction_IFunction::UpdateDependencies(mainLabel);
652
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);
658
659     // Draw the model
660     graph->createModel(doc);
661
662     //app->SaveAs(doc, "W:\\TestFM\\model2.cbf");
663 }