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