/*************************************************************************** * Copyright (c) 2011 Joe Dowsett * * * * This file is part of the FreeCAD CAx development system. * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Library General Public * * License as published by the Free Software Foundation; either * * version 2 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Library General Public License for more details. * * * * You should have received a copy of the GNU Library General Public * * License along with this library; see the file COPYING.LIB. If not, * * write to the Free Software Foundation, Inc., 59 Temple Place, * * Suite 330, Boston, MA 02111-1307, USA * * * ***************************************************************************/ #ifndef GUI_TASKVIEW_TASKORTHOVIEWS_H #define GUI_TASKVIEW_TASKORTHOVIEWS_H #include #include #include "ui_TaskOrthoViews.h" #include #include #include #include #include class Ui_TaskOrthoViews; namespace DrawingGui { class orthoview { public: orthoview(App::Document * parent, App::DocumentObject * part, App::DocumentObject * page, Base::BoundBox3d * partbox); ~orthoview(); void set_data(int r_x, int r_y); void set_projection(gp_Ax2 cs); void setPos(float = 0, float = 0); void setScale(float newscale); float getScale(); void deleteme(); void hidden(bool); void smooth(bool); App::DocumentObject* getViewPart() { return this_view; } private: void calcCentre(); public: // these aren't used by orthoView, but just informational, hence public bool ortho; // orthonometric? or axonometric bool auto_scale; // scale for axonometric has not been manually changed? int rel_x, rel_y; // relative position of this view bool away, tri; // binary parameters for axonometric view int axo; // 0 / 1 / 2 = iso / di / tri metric gp_Dir up, right; // directions prior to rotations (ie, what was used to orientate the projection) private: App::Document * parent_doc; Drawing::FeatureViewPart * this_view; std::string myname; float x, y; // 2D projection coords of bbox centre relative to origin float cx, cy, cz; // coords of bbox centre in 3D space float pageX, pageY; // required coords of centre of bbox projection on page float scale; // scale of projection gp_Dir X_dir, Y_dir, Z_dir; // directions of projection, X_dir makes x on page, Y_dir is y on page, Z_dir is out of page }; class OrthoViews { public: OrthoViews(App::Document*, const char * pagename, const char * partname); ~OrthoViews(); void set_primary(gp_Dir facing, gp_Dir right); void add_view(int rel_x, int rel_y); void del_view(int rel_x, int rel_y); void del_all(); void set_projection(int proj); void set_hidden(bool state); void set_smooth(bool state); void set_Axo(int rel_x, int rel_y, gp_Dir up, gp_Dir right, bool away = false, int axo = 0, bool tri = false); void set_Axo(int rel_x, int rel_y); void set_Axo_scale(int rel_x, int rel_y, float axo_scale); void set_Ortho(int rel_x, int rel_y); int is_Ortho(int rel_x, int rel_y); bool get_Axo(int rel_x, int rel_y, int & axo, gp_Dir & up, gp_Dir & right, bool & away, bool & tri, float & axo_scale); void auto_dims(bool setting); void set_configs(float configs[5]); void get_configs(float configs[5]); private: void set_orientation(int index); void load_page(); // get page / titleblock dims from template void choose_page(); // determine correct portion of page to use to avoid interference with title block void set_all_orientations(); // update orientations of all views following change in primary view void calc_layout_size(); // what's the real world size of chosen layout, excluding spaces void calc_offsets(); void set_views(); void calc_scale(); void process_views(); int index(int rel_x, int rel_y); void slotDeletedObject(const App::DocumentObject& Obj); void slotDeletedDocument(const App::Document& Obj); private: std::vector views; Base::BoundBox3d bbox; App::Document * parent_doc; App::DocumentObject * part; App::DocumentObject * page; int large[4]; // arrays containing page size info [margin_x, margin_y, size_x, size_y] = [x1, y1, x2-x1, y2-y1] int small_h[4], small_v[4]; // page size avoiding title block, using maximum horizontal / vertical space int * page_dims; // points to one of above arrays for which set of page dimensions to use int block[4]; // title block info [corner x, corner y, width, height], eg [-1, 1, w, h] is in top left corner bool title; int * horiz, * vert; // points to min or max r_x / r_y depending upon which corner title block is in int rotate_coeff; // 1st (= -1) or 3rd (= 1) angle int min_r_x, max_r_x; // extreme relative positions of views int min_r_y, max_r_y; // " " " float width, height, depth; // of non-scaled primary view float layout_width, layout_height; // of non-scaled layout without spaces float gap_x, gap_y, min_space; // required spacing between views float offset_x, offset_y; // coords of centre of upper left view float scale; int num_gaps_x, num_gaps_y; // how many gaps between views/edges? = num of views in given direction + 1 gp_Ax2 primary; // coord system of primary view bool hidden, smooth; bool autodims; boost::BOOST_SIGNALS_NAMESPACE::scoped_connection connectDocumentDeletedObject; boost::BOOST_SIGNALS_NAMESPACE::scoped_connection connectApplicationDeletedDocument; }; class TaskOrthoViews : public QWidget//: public Gui::TaskView::TaskBox { Q_OBJECT public: TaskOrthoViews(QWidget *parent = 0); ~TaskOrthoViews(); bool user_input(); void clean_up(); protected Q_SLOTS: void ShowContextMenu(const QPoint & pos); void setPrimary(int dir); void cb_toggled(bool toggle); void projectionChanged(int index); void hidden(int i); void smooth(int i); void toggle_auto(int i); void data_entered(const QString & text); void change_axo(int p = 3); void axo_button(); void axo_scale(const QString & text); void text_return(); protected: void changeEvent(QEvent * e); private: void setup_axo_tab(); void set_configs(); private: //class Private; Ui_TaskOrthoViews * ui; OrthoViews * orthos; QCheckBox * c_boxes[5][5]; // matrix of pointers to gui checkboxes QLineEdit * inputs[5]; // pointers to manual position/scale boxes float data[5]; // scale, x_pos, y_pos, horiz, vert int axo_r_x, axo_r_y; // relative position of axo view currently being edited bool txt_return; // flag to show if return was pressed while editing a text box; }; ////////////////////////////////////////////////////////////// /// simulation dialog for the TaskView class TaskDlgOrthoViews : public Gui::TaskView::TaskDialog { Q_OBJECT public: TaskDlgOrthoViews(); ~TaskDlgOrthoViews(); public: void open(); bool accept(); bool reject(); void clicked(int); private: TaskOrthoViews * widget; Gui::TaskView::TaskBox* taskbox; }; } //namespace DrawingGui #endif // GUI_TASKVIEW_OrthoViews_H