1 /* $NoKeywords: $ */
2 /*
3 //
4 // Copyright (c) 1993-2012 Robert McNeel & Associates. All rights reserved.
5 // OpenNURBS, Rhinoceros, and Rhino3D are registered trademarks of Robert
6 // McNeel & Associates.
7 //
8 // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
9 // ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR PURPOSE AND OF
10 // MERCHANTABILITY ARE HEREBY DISCLAIMED.
11 //
12 // For complete openNURBS copyright information see <http://www.opennurbs.org>.
13 //
14 ////////////////////////////////////////////////////////////////
15 */
16 
17 #if !defined(ON_OBJECT_HISTORY_INC_)
18 #define ON_OBJECT_HISTORY_INC_
19 
20 #if defined(ON_DLL_TEMPLATE)
21 // This stuff is here because of a limitation in the way Microsoft
22 // handles templates and DLLs.  See Microsoft's knowledge base
23 // article ID Q168958 for details.
24 #pragma warning( push )
25 #pragma warning( disable : 4231 )
26 ON_DLL_TEMPLATE template class ON_CLASS ON_SimpleArray< class ON_Value* >;
27 #pragma warning( pop )
28 #endif
29 
30 class ON_CLASS ON_CurveProxyHistory
31 {
32 public:
33   // Used to save information needed to create an ON_CurveProxy
34   // reference in history records.
35   ON_CurveProxyHistory();
36   ~ON_CurveProxyHistory();
37 
38   ON_ObjRef m_curve_ref;                // from ON_CurveProxy.m_real_curve
39   bool      m_bReversed;                // from ON_CurveProxy.m_bReversed
40   ON_Interval m_full_real_curve_domain; // from ON_CurveProxy.m_real_curve.Domain()
41   ON_Interval m_sub_real_curve_domain;  // from ON_CurveProxy.m_real_curve_domain
42   ON_Interval m_proxy_curve_domain;     // from ON_CurveProxy.m_this_domain
43 
44   void Destroy();
45   bool Write( ON_BinaryArchive& ) const;
46   bool Read( ON_BinaryArchive& );
47   void Dump( ON_TextLog& ) const;
48 
49 private:
50   ON__UINT8 m_reserved[64];
51 };
52 
53 #if defined(ON_DLL_TEMPLATE)
54 // This stuff is here because of a limitation in the way Microsoft
55 // handles templates and DLLs.  See Microsoft's knowledge base
56 // article ID Q168958 for details.
57 #pragma warning( push )
58 #pragma warning( disable : 4231 )
59 ON_DLL_TEMPLATE template class ON_CLASS ON_ClassArray<ON_CurveProxyHistory>;
60 #pragma warning( pop )
61 #endif
62 
63 class ON_CLASS ON_PolyEdgeHistory
64 {
65 public:
66   // Used to save information needed to create an CRhinoPolyEdge
67   // reference in history records.
68   ON_PolyEdgeHistory();
69   ~ON_PolyEdgeHistory();
70 
71   void Destroy();
72   bool Write( ON_BinaryArchive& ) const;
73   bool Read( ON_BinaryArchive& );
74   void Dump( ON_TextLog& ) const;
75 
76   ON_ClassArray< ON_CurveProxyHistory > m_segment;
77   ON_SimpleArray<double> m_t;
78   int m_evaluation_mode;
79 private:
80   ON__UINT8 m_reserved[64];
81 };
82 
83 class ON_CLASS ON_HistoryRecord : public ON_Object
84 {
85   ON_OBJECT_DECLARE(ON_HistoryRecord);
86 public:
87   ON_HistoryRecord();
88   ~ON_HistoryRecord();
89 
90   // The copy constructor and operator= create duplicates
91   // of the linked list of ON_Value classes.
92   ON_HistoryRecord(const ON_HistoryRecord& src);
93   ON_HistoryRecord& operator=(const ON_HistoryRecord& src);
94 
95   // virtual ON_Object::IsValid override
96   ON_BOOL32 IsValid( ON_TextLog* text_log = NULL ) const;
97   // virtual ON_Object::Dump override
98   void Dump( ON_TextLog& ) const;
99   // virtual ON_Object::Write override
100   ON_BOOL32 Write(ON_BinaryArchive& binary_archive) const;
101   // virtual ON_Object::Read override
102   ON_BOOL32 Read(ON_BinaryArchive& binary_archive);
103   // virtual
104   ON_UUID ModelObjectId() const;
105 
106   //////////
107   // If history becomes invalid, call Destroy()
108   void Destroy();
109 
110   void DestroyValue( int value_id );
111 
112   /*
113   Description:
114     For setting values.
115   Parameters:
116     value_id - [in]
117       If there a value with the same input
118       id exists, the old value is replaced.
119     count - [in]
120       Number of values
121     b - [in]
122       array of count bools
123     i - [in]
124       array of count ints
125     x - [in]
126       array of count doubles
127     p - [in]
128       array of count 3d points
129     v - [in]
130       array of count 3d vectors
131     xform - [in]
132       array of count xforms
133     c - [in]
134       array of count colors
135     or - [in]
136       array of count object references
137     g - [in]
138       array of count geometry pointers
139     u - [in]
140       array of uuids
141     s - [in]
142       string
143   */
144   bool SetBoolValue(     int value_id, bool b);
145   bool SetIntValue(      int value_id, int i);
146   bool SetDoubleValue(   int value_id, double x);
147   bool SetPointValue(    int value_id, ON_3dPoint p);
148   bool SetVectorValue(   int value_id, ON_3dVector v);
149   bool SetXformValue(    int value_id, ON_Xform xform);
150   bool SetColorValue(    int value_id, ON_Color c);
151   bool SetObjRefValue(   int value_id, const ON_ObjRef& oref);
152   bool SetPointOnObjectValue( int value_id, const ON_ObjRef& oref, ON_3dPoint point );
153   bool SetUuidValue(     int value_id, ON_UUID uuid );
154   bool SetStringValue(   int value_id, const wchar_t* s );
155   bool SetGeometryValue( int value_id, ON_Geometry* g);
156   bool SetPolyEdgeValue( int value_id, const ON_PolyEdgeHistory& polyedge );
157 
158   /*
159   Description:
160     For setting values.
161   Parameters:
162     value_id - [in]
163       If there a value with the same input
164       id exists, the old value is replaced.
165     count - [in]
166       Number of values
167     b - [in]
168       array of count bools
169     i - [in]
170       array of count ints
171     x - [in]
172       array of count doubles
173     P - [in]
174       array of count 3d points
175     V - [in]
176       array of count 3d vectors
177     xform - [in]
178       array of count xforms
179     c - [in]
180       array of count colors
181     or - [in]
182       array of count object references
183     g - [in]
184       array of count geometry pointers
185     u - [in]
186       array of uuids
187     s - [in]
188       array of strings
189   */
190   bool SetBoolValues(     int value_id, int count, const bool* b);
191   bool SetIntValues(      int value_id, int count, const int* i);
192   bool SetDoubleValues(   int value_id, int count, const double* x);
193   bool SetPointValues(    int value_id, int count, const ON_3dPoint* P);
194   bool SetVectorValues(   int value_id, int count, const ON_3dVector* V);
195   bool SetXformValues(    int value_id, int count, const ON_Xform* xform);
196   bool SetColorValues(    int value_id, int count, const ON_Color* c);
197   bool SetObjRefValues(   int value_id, int count, const ON_ObjRef* oref);
198   bool SetUuidValues(     int value_id, int count, const ON_UUID* u );
199   bool SetStringValues(   int value_id, int count, const wchar_t* const* s );
200   bool SetStringValues(   int value_id, const ON_ClassArray<ON_wString>& s );
201   bool SetGeometryValues( int value_id, const ON_SimpleArray<ON_Geometry*> a);
202   bool SetPolyEdgeValues( int value_id, int count, const ON_PolyEdgeHistory* a );
203 
204   /*
205   Description:
206     For retrieving values.
207   */
208   bool GetStringValue( int value_id, ON_wString& str ) const;
209   bool GetBoolValue( int value_id, bool* b ) const;
210   bool GetIntValue( int value_id, int* i ) const;
211   bool GetDoubleValue( int value_id, double* number ) const;
212   bool GetPointValue( int value_id, ON_3dPoint& point ) const;
213   bool GetVectorValue( int value_id, ON_3dVector& point ) const;
214   bool GetXformValue( int value_id, ON_Xform& point ) const;
215   bool GetColorValue( int value_id, ON_Color* color ) const;
216   bool GetObjRefValue( int value_id, ON_ObjRef& oref ) const;
217   bool GetPointOnObjectValue( int value_id, ON_ObjRef& oref ) const;
218   bool GetCurveValue( int value_id, const ON_Curve*& ) const;
219   bool GetSurfaceValue( int value_id, const ON_Surface*& ) const;
220   bool GetBrepValue( int value_id, const ON_Brep*& ) const;
221   bool GetMeshValue( int value_id, const ON_Mesh*& ) const;
222   bool GetGeometryValue( int value_id, const ON_Geometry*& ) const;
223   bool GetUuidValue( int value_id, ON_UUID* uuid ) const;
224   bool GetPolyEdgeValue( int value_id, const ON_PolyEdgeHistory*& polyedge ) const;
225 
226   int GetStringValues( int value_id, ON_ClassArray<ON_wString>& string ) const;
227   int GetBoolValues( int value_id, ON_SimpleArray<bool>& ) const;
228   int GetIntValues( int value_id, ON_SimpleArray<int>& ) const;
229   int GetDoubleValues( int value_id, ON_SimpleArray<double>& ) const;
230   int GetPointValues( int value_id, ON_SimpleArray<ON_3dPoint>& ) const;
231   int GetVectorValues( int value_id, ON_SimpleArray<ON_3dVector>& ) const;
232   int GetXformValues( int value_id, ON_SimpleArray<ON_Xform>& ) const;
233   int GetColorValues( int value_id, ON_SimpleArray<ON_Color>& ) const;
234   int GetObjRefValues( int value_id, ON_ClassArray<ON_ObjRef>& objects ) const;
235   int GetGeometryValues( int value_id, ON_SimpleArray<const ON_Geometry*>& ) const;
236   int GetUuidValues( int value_id, ON_SimpleArray<ON_UUID>& ) const;
237   int GetPolyEdgeValues( int value_id, ON_SimpleArray<const ON_PolyEdgeHistory*>& ) const;
238 
239   /*
240   Desccription:
241     Determine if object is an antecedent (input) in this
242     history record.
243   Parameters:
244     object_uuid - [in]
245   Returns:
246     Returns true if object_uuid is the id of an input
247     object.
248   */
249   bool IsAntecedent( ON_UUID object_uuid ) const;
250 
251 
252   /*
253   Description:
254     Print a list of the values in text_log.
255   Parameters:
256     text_log - [in]
257   Returns:
258     Number of values listed.
259   */
260   int ValueReport( ON_TextLog& text_log ) const;
261 
262   // CRhinoCommand::CommandId() value of the command that
263   // created this history record.  Each time the command
264   // is run, it can create a history record.
265   ON_UUID m_command_id;
266 
267   // A YYYYMMDDn version number that gets updated when
268   // a command changes.  This version is checked so that
269   // new versions of a command's ReplayHistory don't
270   // attempt to use information saved in old files.
271   int m_version;
272 
273   enum RECORD_TYPE
274   {
275     history_parameters = 0, // parameters for UpdateHistory
276     feature_parameters = 1, // parameters for a feature
277     force_32bit_record_type = 0xFFFFFFFF
278   };
279 
280   RECORD_TYPE m_record_type;
281 
282   /*
283   Description:
284     Convert integer into an ON_HistoryRecord::RECORD_TYPE.
285   Parameters:
286     i - [in]
287   Returns:
288     ON_HistoryRecord::RECORD_TYPE enum with same value as i.
289   */
290   static
291   RECORD_TYPE RecordType(int i);
292 
293   // Each history record has a unique id that is assigned
294   // when the record is added to Rhino's history record table.
295   ON_UUID m_record_id;
296 
297   // List of object id values of antecedent objects that
298   // are referenced in the list of input events in m_value[].
299   // These were the command's "input" objects.
300   ON_UuidList m_antecedents;
301 
302   // List of object id values of descendant objects that
303   // were created.  These were the command's "output" objects
304   ON_UuidList m_descendants;
305 
306   // Information needed to update the descendant objects
307   // when an antecedent object is modified.
308   ON_SimpleArray< class ON_Value* > m_value;
309 
310   /*
311   Description:
312     This tool is used in rare situations when the object ids
313     stored in the uuid list need to be remapped.
314   Parameters:
315     uuid_remap - [in]
316       Is it critical that uuid_remap[] be sorted with respect
317       to ON_UuidPair::CompareFirstUuid.
318   */
319   void RemapObjectIds( const ON_SimpleArray<ON_UuidPair>& uuid_remap );
320 
321 private:
322   bool m_bValuesSorted;
323   ON_Value* FindValueHelper( int, int, bool ) const;
324   void CopyHelper( const ON_HistoryRecord&);
325 };
326 
327 
328 #endif
329