// Copyright (c) 2002 Max-Planck-Institute Saarbruecken (Germany) // All rights reserved. // // This file is part of CGAL (www.cgal.org); you may redistribute it under // the terms of the Q Public License version 1.0. // See the file LICENSE.QPL distributed with CGAL. // // Licensees holding a valid commercial license may use this file in // accordance with the commercial license agreement provided with the software. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // $Source: /CVSROOT/CGAL/Packages/Nef_2/demo/Nef_2/nef_2.C,v $ // $Revision: 1.6.4.1 $ $Date: 2004/12/19 16:07:34 $ // $Name: $ // // Author(s) : Radu Ursu // if QT is not installed, a message will be issued in runtime. #if !defined CGAL_USE_QT #include int main(int, char*) { std::cout << "Sorry, this demo needs QT..."; std::cout << std::endl; return 0; } #elif !defined CGAL_USE_GMP #include int main(int, char*) { std::cout << "Sorry, this demo needs GMP..."; std::cout << std::endl; return 0; } #else #include #include #include #include #include "cgal_types.h" #include "nef_2.h" #include #include #include #include #include "Qt_widget_toolbar.h" #include "nef_2_layers.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include const QString my_title_string("Nef_2 Demo with" " CGAL Qt_widget"); //global flags and variables int current_state; //This class contains a Nef_2 object and a text description class Nef_description{ public: Nef_description(Nef_polyhedron n, QString name_p): N(n), name(name_p){} ~Nef_description(){} Nef_polyhedron N; QString name; }; std::list nef_2_list; bool is_the_first_widget = true; //true only before the creation of //the first widget //This class is a generalisation of QListBox class Nef_2_list_box : public QListBox{ Q_OBJECT public: Nef_2_list_box(QWidget *parent, const char *name): QListBox(parent, name) { setFocusPolicy(QWidget::StrongFocus); } ~Nef_2_list_box(){} protected: void keyPressEvent(QKeyEvent* e){ if ( e->key() == Qt::Key_Delete ) if(isSelected(currentItem())) emit(delete_key(item(currentItem()))); } signals: void delete_key(QListBoxItem *); }; int nef_index; //used to give names to polyhedrons bool has_built_layout; //This widget contains some widgets in a layout class Layout_widget : public QWidget { public: Layout_widget(QWidget *parent = 0, const char *name = 0) : QWidget(parent, name) { QBoxLayout *topLayout = new QVBoxLayout( this, 5 ); QSplitter *top_splitter = new QSplitter(Qt::Vertical, this); topLayout->addWidget(top_splitter); QSplitter *splitter1 = new QSplitter(top_splitter); nef_list1 = new Nef_2_list_box(splitter1, "Nef_list_1"); nef_list2 = new Nef_2_list_box(splitter1, "Nef_list_2"); widget = new CGAL::Qt_widget(top_splitter); }; CGAL::Qt_widget* get_qt_widget(){return widget;} Nef_2_list_box* get_nef_list1(){return nef_list1;} Nef_2_list_box* get_nef_list2(){return nef_list2;} private: CGAL::Qt_widget *widget; Nef_2_list_box *nef_list1, *nef_list2; }; Layout_widget *cwidget; class MyWindow : public QMainWindow { Q_OBJECT public: MyWindow(int w, int h){ cwidget = new Layout_widget(this); widget = cwidget->get_qt_widget(); list1 = cwidget->get_nef_list1(); list2 = cwidget->get_nef_list2(); setCentralWidget(cwidget); if(is_the_first_widget){ Line l1(Point_2(0, 0), Point_2(0, 2)); Nef_polyhedron N1(l1, Nef_polyhedron::INCLUDED); Nef_visible = N1; Line l2(Point_2(0, 0), Point_2(2, 0)); Nef_polyhedron N2(l2, Nef_polyhedron::INCLUDED); Nef_visible2 = N2; insert_in_list(N1, QString("LeftHalf")); insert_in_list(N2, QString("TopHalf")); } else { Nef_visible = Nef_polyhedron(Nef_polyhedron::EMPTY); Nef_visible2 = Nef_polyhedron(Nef_polyhedron::EMPTY); } //create a timer for checking if somthing changed QTimer *timer = new QTimer( this ); connect( timer, SIGNAL(timeout()), this, SLOT(sl_timer_done()) ); timer->start( 200, FALSE ); // file menu QPopupMenu * file = new QPopupMenu( this ); menuBar()->insertItem( "&File", file ); file->insertItem("&New", this, SLOT(sl_new_instance()), CTRL+Key_N); file->insertItem("New &Window", this, SLOT(sl_new_window()), CTRL+Key_W); file->insertSeparator(); file->insertItem("Load Nef_2", this, SLOT(sl_load_nef()), CTRL+Key_L); file->insertItem("Save Nef_2", this, SLOT(sl_save_nef()), CTRL+Key_S); file->insertItem("Load Polygon_2", this, SLOT(sl_load_polygon()), CTRL+Key_O); file->insertSeparator(); file->insertItem("Print", widget, SLOT(print_to_ps()), CTRL+Key_P); file->insertSeparator(); file->insertItem( "&Close", this, SLOT(close()), CTRL+Key_X ); file->insertItem( "&Quit", qApp, SLOT( closeAllWindows() ), CTRL+Key_Q ); // help menu QPopupMenu * help = new QPopupMenu( this ); menuBar()->insertItem( "&Help", help ); help->insertItem("How To", this, SLOT(howto()), Key_F1); help->insertSeparator(); help->insertItem("&About", this, SLOT(sl_about()), CTRL+Key_A ); help->insertItem("About &Qt", this, SLOT(sl_aboutQt()) ); //the standard toolbar stoolbar = new CGAL::Qt_widget_standard_toolbar (widget, this, "ST"); //the new tools toolbar newtoolbar = new Tools_toolbar(widget, this); nef_layer1 = new Qt_layer_nef_blue(Nef_visible); nef_layer2 = new Qt_layer_nef_gray(Nef_visible2); widget->attach(nef_layer1); widget->attach(nef_layer2); //boolean operations toolbar QToolBar *optoolbar = new QToolBar("operations", this, QMainWindow::Right, true,"Operations"); QToolButton *but_intersection = new QToolButton( QPixmap( (const char**)intersection_xpm ), "INTERSECTION", "BOOLEAN OPERATIONS", this, SLOT(sl_intersect()), optoolbar, "intersection"); QToolButton *but_union = new QToolButton( QPixmap( (const char**)union_xpm ), "UNION", "BOOLEAN OPERATIONS", this, SLOT(sl_join()), optoolbar, "union"); QToolButton *but_difference = new QToolButton( QPixmap( (const char**)difference_xpm ), "DIFFERENCE", "BOOLEAN OPERATIONS", this, SLOT(sl_difference()), optoolbar, "difference"); QToolButton *but_symm_difference = new QToolButton( QPixmap( (const char**)symmetric_difference_xpm ), "SYMMETRIC DIFFERENCE", "BOOLEAN OPERATIONS", this, SLOT(sl_symm_difference()), optoolbar, "symm_difference"); QToolButton *but_complement = new QToolButton( QPixmap( (const char**)complement_xpm ), "COMPLEMENT", "BOOLEAN OPERATIONS", this, SLOT(sl_complement()), optoolbar, "complement"); QToolButton *but_interior = new QToolButton( QPixmap( (const char**)interior_xpm ), "INTERIOR", "BOOLEAN OPERATIONS", this, SLOT(sl_interior()), optoolbar, "interior"); QToolButton *but_closure = new QToolButton( QPixmap( (const char**)closure_xpm ), "CLOSURE", "BOOLEAN OPERATIONS", this, SLOT(sl_closure()), optoolbar, "closure"); QToolButton *but_boundary = new QToolButton( QPixmap( (const char**)boundary_xpm ), "BOUNDARY", "BOOLEAN OPERATIONS", this, SLOT(sl_boundary()), optoolbar, "boundary"); QToolButton *but_regularization = new QToolButton( QPixmap( (const char**)regularization_xpm ), "REGULARIZATION", "BOOLEAN OPERATIONS", this, SLOT(sl_regularization()), optoolbar, "regularization"); but_intersection->setOn(true); but_union->setOn(true); but_difference->setOn(true); but_symm_difference->setOn(true); but_complement->setOn(true); but_interior->setOn(true); but_closure->setOn(true); but_boundary->setOn(true); but_regularization->setOn(true); connect(list1, SIGNAL(delete_key(QListBoxItem*)), this, SLOT(sl_list1_delete_key_pressed(QListBoxItem*))); connect(list2, SIGNAL(delete_key(QListBoxItem*)), this, SLOT(sl_list2_delete_key_pressed(QListBoxItem*))); *widget << CGAL::BackgroundColor (CGAL::BLACK); widget->resize(w,h-100); list1->resize(w, 200); list2->resize(w, 200); resize(w, h + 100); widget->set_window(-1, 1, -1, 1); widget->setMouseTracking(TRUE); //connect the widget to the main function that receives the objects connect(widget, SIGNAL(new_cgal_object(CGAL::Object)), this, SLOT(sl_get_new_object(CGAL::Object))); //connect the signals doubleClicked from the lists to the specific slots connect(list1, SIGNAL(clicked(QListBoxItem*)), this, SLOT(sl_list1_selected_item(QListBoxItem*))); connect(list2, SIGNAL(clicked(QListBoxItem*)), this, SLOT(sl_list2_selected_item(QListBoxItem*))); if(is_the_first_widget){ list1->setSelected(0, true); list2->setSelected(1, true); } //application flag stuff old_state = 0; is_the_first_widget = false; has_no_selection_list1 = false; has_no_selection_list2 = false; widget->show(); }; public slots: void sl_new_instance() { widget->lock(); widget->set_window(-1.1, 1.1, -1.1, 1.1); // set the Visible Area to the Interval Nef_polyhedron N_temp(Nef_polyhedron::EMPTY); Nef_visible = N_temp; Nef_visible2 = N_temp; list1->clear(); list2->clear(); nef_2_list.clear(); has_no_selection_list1 = true; has_no_selection_list2 = true; nef_index = 0; widget->unlock(); something_changed(); } void sl_load_nef() { QString s( QFileDialog::getOpenFileName( QString::null, "CGAL files (*.cgal)", this ) ); if ( s.isEmpty() ) return; std::ifstream in(s); CGAL::set_ascii_mode(in); Nef_polyhedron N_temp(Nef_polyhedron::EMPTY); Nef_visible2 = N_temp; in >> Nef_visible; insert_in_list(Nef_visible, "loaded"); list1->setSelected(list1->count()-1, true); list2->clearSelection(); has_no_selection_list1 = false; has_no_selection_list2 = true; something_changed(); } void sl_save_nef() { QString fileName = QFileDialog::getSaveFileName( "nef_2.cgal", "Cgal files (*.cgal)", this ); if ( !fileName.isNull() ) { // got a file name std::ofstream out(fileName); CGAL::set_ascii_mode(out); out << Nef_visible << std::endl; } }//end save_nef() void sl_load_polygon(){ QString s( QFileDialog::getOpenFileName( QString::null, "CGAL files (*.cgal)", this ) ); if ( s.isEmpty() ) return; std::ifstream in(s); CGAL::set_ascii_mode(in); Polygon_2_double poly; in >> poly; Vertex_iterator_double it = poly.vertices_begin(); std::list l_of_p; while(it != poly.vertices_end()){ CGAL::Gmpq p_q_x((*it).x()); CGAL::Gmpq p_q_y((*it).y()); RT wsx = p_q_x.numerator() * p_q_y.denominator(); RT wsy = p_q_y.numerator() * p_q_x.denominator(); RT wsh = p_q_x.denominator() * p_q_y.denominator(); Point_2 p1(wsx, wsy, wsh); l_of_p.push_back(p1); it++; } Nef_polyhedron Nt(l_of_p.begin(), l_of_p.end(), Nef_polyhedron::INCLUDED); Nef_visible = Nt; char tnr[10]; sprintf(tnr, "%d", poly.size()); strcat(tnr, "gon"); insert_in_list(Nt, tnr); list1->setSelected(list1->count()-1, true); widget->set_window(poly.bbox().xmin(), poly.bbox().xmax(), poly.bbox().ymin(), poly.bbox().ymax()); Nef_polyhedron N_temp(Nef_polyhedron::EMPTY); Nef_visible2 = N_temp; list2->clearSelection(); has_no_selection_list1 = false; has_no_selection_list2 = true; something_changed(); } private slots: void sl_get_new_object(CGAL::Object obj) { Cartesian_point_2 p; Cartesian_polygon_2 poly; Cartesian_line_2 line; if(CGAL::assign(p, obj)) { /* CGAL::Quotient wsxq = double_to_quotient(p.x()); CGAL::Quotient wsyq = double_to_quotient(p.y()); RT wsx = wsxq.numerator() * wsyq.denominator(); RT wsy = wsyq.numerator() * wsxq.denominator(); RT wsh = wsxq.denominator() * wsyq.denominator(); */ RT wsx = p.x().numerator() * p.y().denominator(); RT wsy = p.y().numerator() * p.x().denominator(); RT wsh = p.x().denominator() * p.y().denominator(); Point_2 p1(wsx, wsy, wsh); Point_2 pt[1] = {p1}; Nef_polyhedron Nt(pt, pt+1); insert_in_list(Nt, "Point"); Nef_visible = Nt; list1->setSelected(list1->count()-1, true); Nef_visible2 = Nef_polyhedron(Nef_polyhedron::EMPTY); list2->clearSelection(); has_no_selection_list1 = false; has_no_selection_list2 = true; something_changed(); } else if(CGAL::assign(poly, obj)){ Vertex_iterator it = poly.vertices_begin(); std::list l_of_p; while(it != poly.vertices_end()){ //double xp = (*it).x(); //double yp = (*it).y(); //CGAL::Quotient wsxq = double_to_quotient(xp); //CGAL::Quotient wsyq = double_to_quotient(yp); RT wsx = (*it).x().numerator() * (*it).y().denominator(); RT wsy = (*it).y().numerator() * (*it).x().denominator(); RT wsh = (*it).x().denominator() * (*it).y().denominator(); Point_2 p1(wsx, wsy, wsh); l_of_p.push_back(p1); it++; } Nef_polyhedron Nt(l_of_p.begin(), l_of_p.end(), Nef_polyhedron::INCLUDED); Nef_visible = Nt; char tnr[10]; sprintf(tnr, "%d", poly.size()); strcat(tnr, "gon"); insert_in_list(Nt, tnr); list1->setSelected(list1->count()-1, true); Nef_visible2 = Nef_polyhedron(Nef_polyhedron::EMPTY); list2->clearSelection(); has_no_selection_list1 = false; has_no_selection_list2 = true; something_changed(); } else if(CGAL::assign(line, obj)){ /* CGAL::Quotient wsxq = double_to_quotient(line.point(0).x()); CGAL::Quotient wsyq = double_to_quotient(line.point(0).y()); RT wsx = wsxq.numerator() * wsyq.denominator(); RT wsy = wsyq.numerator() * wsxq.denominator(); RT wsh = wsxq.denominator() * wsyq.denominator(); */ RT wsx = line.point(0).x().numerator() * line.point(0).y().denominator(); RT wsy = line.point(0).y().numerator() * line.point(0).x().denominator(); RT wsh = line.point(0).x().denominator() * line.point(0).y().denominator(); Point_2 p1(wsx, wsy, wsh); /* wsxq = double_to_quotient(line.point(1).x()); wsyq = double_to_quotient(line.point(1).y()); wsx = wsxq.numerator() * wsyq.denominator(); wsy = wsyq.numerator() * wsxq.denominator(); wsh = wsxq.denominator() * wsyq.denominator(); */ wsx = line.point(1).x().numerator() * line.point(1).y().denominator(); wsy = line.point(1).y().numerator() * line.point(1).x().denominator(); wsh = line.point(1).x().denominator() * line.point(1).y().denominator(); Point_2 p2(wsx, wsy, wsh); Nef_polyhedron Nt(Line(p1, p2), Nef_polyhedron::INCLUDED); Nef_visible = Nt; insert_in_list(Nt, "HalfSpace"); list1->setSelected(list1->count()-1, true); Nef_visible2 = Nef_polyhedron(Nef_polyhedron::EMPTY); list2->clearSelection(); has_no_selection_list1 = false; has_no_selection_list2 = true; something_changed(); } }; void howto(){ QString home; home = "help/index.html"; CGAL::Qt_help_window *help = new CGAL::Qt_help_window(home, ".", 0, "help viewer"); help->resize(400, 400); help->setCaption("Demo HowTo"); help->show(); } void sl_about() { QMessageBox::about( this, my_title_string, "This is a demo for Nef_2,\n" "Copyright CGAL @2002"); }; void sl_aboutQt() { QMessageBox::aboutQt( this, my_title_string ); } void sl_new_window(){ MyWindow *ed = new MyWindow(500, 500); ed->setCaption("Layer"); ed->stoolbar->clear_history(); ed->widget->set_window(-1.1, 1.1, -1.1, 1.1); ed->show(); something_changed(); } void sl_timer_done() { if(old_state!=current_state){ int temp_index_1 = list1->currentItem(); int temp_index_2 = list2->currentItem(); list1->clear(); list2->clear(); std::list::iterator it = nef_2_list.begin(); while(it!=nef_2_list.end()){ list1->insertItem((*it).name); list2->insertItem((*it).name); it++; } if(!has_no_selection_list1) list1->setSelected(temp_index_1, true); if(!has_no_selection_list2) list2->setSelected(temp_index_2, true); widget->redraw(); old_state = current_state; } } void sl_list1_selected_item(QListBoxItem* item){ if(item){ if(Nef_visible != return_selected_nef(item->text())){ Nef_visible = return_selected_nef(item->text()); has_no_selection_list1 = false; } else { Nef_visible = Nef_polyhedron(Nef_polyhedron::EMPTY); list1->setSelected(item, false); has_no_selection_list1 = true; } widget->redraw(); } } void sl_list2_selected_item(QListBoxItem* item){ if(item){ if(Nef_visible2 != return_selected_nef(item->text())){ Nef_visible2 = return_selected_nef(item->text()); has_no_selection_list2 = false; } else { Nef_visible2 = Nef_polyhedron(Nef_polyhedron::EMPTY); list2->setSelected(item, false); has_no_selection_list2 = true; } widget->redraw(); } } void sl_list1_delete_key_pressed(QListBoxItem* item){ if(item){ int ci = list1->currentItem(); std::list::iterator it = nef_2_list.begin(); for(int i=0; icurrentItem() == ci){ Nef_visible2 = Nef_polyhedron(Nef_polyhedron::EMPTY); has_no_selection_list2 = true; } something_changed(); } } void sl_list2_delete_key_pressed(QListBoxItem* item){ if(item){ int ci = list2->currentItem(); std::list::iterator it = nef_2_list.begin(); for(int i=0; icurrentItem() == ci){ Nef_visible = Nef_polyhedron(Nef_polyhedron::EMPTY); has_no_selection_list1 = true; } something_changed(); } } void sl_intersect(){ if( list1->isSelected(list1->currentItem()) && list2->isSelected(list2->currentItem()) ){ //if there is something selected Nef_polyhedron NT = Nef_visible.intersection(Nef_visible2); QString s = "AND(" + list1->currentText() + ", " + list2->currentText() + ")"; insert_in_list(NT, s); Nef_visible = NT; Nef_visible2 = Nef_polyhedron(Nef_polyhedron::EMPTY); list1->setSelected(list1->count()-1, true); list2->setSelected(list2->currentItem(), false); has_no_selection_list1 = false; has_no_selection_list2 = true; something_changed(); } } void sl_join(){ if( list1->isSelected(list1->currentItem()) && list2->isSelected(list2->currentItem()) ){ //if there is something selected Nef_polyhedron NT = Nef_visible.join(Nef_visible2); QString s = "OR(" + list1->currentText() + ", " + list2->currentText() + ")"; insert_in_list(NT, s); Nef_visible = NT; Nef_visible2 = Nef_polyhedron(Nef_polyhedron::EMPTY); list1->setSelected(list1->count()-1, true); list2->setSelected(list2->currentItem(), false); has_no_selection_list1 = false; has_no_selection_list2 = true; something_changed(); } } void sl_difference(){ if( list1->isSelected(list1->currentItem()) && list2->isSelected(list2->currentItem()) ){ //if there is something selected Nef_polyhedron NT = Nef_visible.difference(Nef_visible2); QString s = "Dif(" + list1->currentText() + ", " + list2->currentText() + ")"; insert_in_list(NT, s); Nef_visible = NT; Nef_visible2 = Nef_polyhedron(Nef_polyhedron::EMPTY); list1->setSelected(list1->count()-1, true); list2->setSelected(list2->currentItem(), false); has_no_selection_list1 = false; has_no_selection_list2 = true; something_changed(); } } void sl_symm_difference(){ if( list1->isSelected(list1->currentItem()) && list2->isSelected(list2->currentItem()) ){ //if there is something selected Nef_polyhedron NT = Nef_visible.symmetric_difference(Nef_visible2); QString s = "SYM_DIF(" + list1->currentText() + ", " + list2->currentText() + ")"; insert_in_list(NT, s); Nef_visible = NT; Nef_visible2 = Nef_polyhedron(Nef_polyhedron::EMPTY); list1->setSelected(list1->count()-1, true); list2->setSelected(list2->currentItem(), false); has_no_selection_list1 = false; has_no_selection_list2 = true; something_changed(); } } void sl_complement(){ if( list1->isSelected(list1->currentItem()) ){ //if there is something from the 1st list selected Nef_polyhedron NT = Nef_visible.complement(); QString s = "COMPLEMENT( " + list1->currentText() + " )"; insert_in_list(NT, s); Nef_visible = NT; Nef_visible2 = Nef_polyhedron(Nef_polyhedron::EMPTY); list1->setSelected(list1->count()-1, true); has_no_selection_list1 = false; has_no_selection_list2 = true; something_changed(); } } void sl_interior(){ if( list1->isSelected(list1->currentItem()) ){ //if there is something from the 1st list selected Nef_polyhedron NT = Nef_visible.interior(); QString s = "INTERIOR( " + list1->currentText() + " )"; insert_in_list(NT, s); Nef_visible = NT; Nef_visible2 = Nef_polyhedron(Nef_polyhedron::EMPTY); list1->setSelected(list1->count()-1, true); has_no_selection_list1 = false; has_no_selection_list2 = true; something_changed(); } } void sl_closure(){ if( list1->isSelected(list1->currentItem()) ){ //if there is something from the 1st list selected Nef_polyhedron NT = Nef_visible.closure(); QString s = "CLOSURE( " + list1->currentText() + " )"; insert_in_list(NT, s); Nef_visible = NT; list1->setSelected(list1->count()-1, true); has_no_selection_list1 = false; has_no_selection_list2 = true; something_changed(); } } void sl_boundary(){ if( list1->isSelected(list1->currentItem()) ){ //if there is something from the 1st list selected Nef_polyhedron NT = Nef_visible.boundary(); QString s = "BOUNDARY( " + list1->currentText() + " )"; insert_in_list(NT, s); Nef_visible = NT; Nef_visible2 = Nef_polyhedron(Nef_polyhedron::EMPTY); list1->setSelected(list1->count()-1, true); has_no_selection_list1 = false; has_no_selection_list2 = true; something_changed(); } } void sl_regularization(){ if( list1->isSelected(list1->currentItem()) ){ //if there is something from the 1st list selected Nef_polyhedron NT = Nef_visible.regularization(); QString s = "REGULARIZATION( " + list1->currentText() + " )"; insert_in_list(NT, s); Nef_visible = NT; Nef_visible2 = Nef_polyhedron(Nef_polyhedron::EMPTY); list1->setSelected(list1->count()-1, true); has_no_selection_list1 = false; has_no_selection_list2 = true; something_changed(); } } private: void insert_in_list(Nef_polyhedron n, QString name) { char tname[300], tnr[5]; sprintf(tnr, "%d", nef_index++); strcpy(tname, "N"); strcat(tname, tnr);strcat(tname, "= "); QString qs_tname(tname); qs_tname += name; Nef_description tempND(n, qs_tname); nef_2_list.push_back(tempND); list1->insertItem(qs_tname); list2->insertItem(qs_tname); } Nef_polyhedron return_selected_nef(QString text){ std::list::const_iterator it = nef_2_list.begin(); while(it != nef_2_list.end()) { if((*it).name == text) return (*it).N; it++; } } void something_changed(){current_state+=2;}; CGAL::Qt_widget *widget; Tools_toolbar *newtoolbar; CGAL::Qt_widget_standard_toolbar *stoolbar; int old_state; //used to refresh the current window Nef_2_list_box *list1, *list2; Qt_layer_nef_blue *nef_layer1; Qt_layer_nef_gray *nef_layer2; Nef_polyhedron Nef_visible; Nef_polyhedron Nef_visible2; bool has_no_selection_list2; bool has_no_selection_list1; }; #include "nef_2.moc" int main(int argc, char **argv) { QApplication app( argc, argv ); has_built_layout = false; current_state = -1; nef_index = 0; MyWindow widget(500,500); // physical window size app.setMainWidget(&widget); widget.setCaption(my_title_string); widget.setMouseTracking(TRUE); #if !defined (__POWERPC__) QPixmap cgal_icon = QPixmap((const char**)demoicon_xpm); widget.setIcon(cgal_icon); #endif widget.show(); return app.exec(); } #endif // CGAL_USE_QT