summaryrefslogtreecommitdiffstats
path: root/kpovmodeler/pm2dcontrolpoint.h
blob: 40b26d855461478a29aef018bbc675c35a0a636d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
//-*-C++-*-
/*
**************************************************************************
                                 description
                             --------------------
    copyright            : (C) 2000-2001 by Andreas Zehender
    email                : zehender@kde.org
**************************************************************************

**************************************************************************
*                                                                        *
*  This program is free software; you can redistribute it and/or modify  *
*  it under the terms of the GNU General Public License as published by  *
*  the Free Software Foundation; either version 2 of the License, or     *
*  (at your option) any later version.                                   *
*                                                                        *
**************************************************************************/

#ifndef PM2DCONTROLPOINT_H
#define PM2DCONTROLPOINT_H

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif


#include "pmcontrolpoint.h"
#include <tqptrlist.h>

/**
 * Class for free moveable control points
 */
class PM2DControlPoint : public PMControlPoint
{
public:
   /**
    * Type enum
    */
   enum CPType { PM2DXY, PM2DYX, PM2DXZ, PM2DZX, PM2DYZ, PM2DZY };
   /**
    * Creates a PM2DControlPoint with id. Point has to be a 2D vector.
    */
   PM2DControlPoint( const PMVector& point, CPType type,
                     int id, const TQString& description );
   /**
    * Deletes the PM2DControlPoint
    */
   virtual ~PM2DControlPoint( ) { };
   
   /** */
   virtual PMVector position( ) const { return to3D( m_point ); }
   /**
    * Sets the 2d coordinates of the control point
    */
   void setPoint( const PMVector& newPoint ) { m_point = newPoint; }
   /**
    * 2d coordinates of the control point
    */
   PMVector point( ) const { return m_point; }
   /** */
   virtual void snapToGrid( );
   /**
    * Returns the third coordinate
    */
   double thirdCoordinate( ) const { return m_thirdCoordinate; }
   /**
    * Sets the third coordinate
    */
   void setThirdCoordinate( double d ) { m_thirdCoordinate = d; }
   /**
    * Returns the 2d scale
    */
   double scale( ) const { return m_scale; }
   /**
    * Sets the scale
    */
   void setScale( double s ) { m_scale = s; }
   
   /**
    * Sets the base point.
    *
    * If a base point is set, an extra line is shown between
    * the base point and this control point.
    */
   void setBasePoint( PM2DControlPoint* p );
   /**
    * Returns the base point
    */
   PM2DControlPoint* basePoint( ) const { return m_pBasePoint; }
   /**
    * This method is used by the lathe object to link
    * the control points in the xy and xz plane. These points are
    * synchronized if both are selected.
    */
   void setLatheLink( PM2DControlPoint* p ) { m_pLatheLink = p; }
   /**
    * Returns the linked control point for lathe points
    */
   PM2DControlPoint* latheLink( ) const { return m_pLatheLink; }

   /** */
   virtual bool hasExtraLine( ) const { return m_pBasePoint; }
   /** */
   virtual PMVector extraLineStart( ) const { return position( ); }
   /** */
   virtual PMVector extraLineEnd( ) const
   {
      if( m_pBasePoint )
         return m_pBasePoint->position( );
      return PMVector( 0, 0, 0 );
   }

protected:
   /** */
   virtual void graphicalChangeStarted( );
   /** */
   virtual void graphicalChange( const PMVector& startPoint,
                                 const PMVector& viewNormal,
                                 const PMVector& endPoint );
private:
   PMVector to2D( const PMVector& v ) const;
   PMVector to3D( const PMVector& v ) const;
   void addLinkedPoint( PM2DControlPoint* p );
   void removeLinkedPoint( PM2DControlPoint* p );
   
   PMVector m_point, m_originalPoint, m_original2DPoint;
   CPType m_type;
   double m_thirdCoordinate;
   double m_scale;
   PM2DControlPoint* m_pBasePoint;
   TQPtrList<PM2DControlPoint> m_linkedPoints;
   PM2DControlPoint* m_pLatheLink;
};

#endif