opennurbs_userdata.h
/* $NoKeywords: $ */
/*
//
// Copyright (c) 1993-2012 Robert McNeel & Associates. All rights reserved.
// OpenNURBS, Rhinoceros, and Rhino3D are registered trademarks of Robert
// McNeel & Associates.
//
// THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
// ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR PURPOSE AND OF
// MERCHANTABILITY ARE HEREBY DISCLAIMED.
//
// For complete openNURBS copyright information see <http://www.opennurbs.org>.
//
////////////////////////////////////////////////////////////////
*/
#if !defined(OPENNURBS_USERDATA_INC_)
#define OPENNURBS_USERDATA_INC_
class ON_CLASS ON_UserData : public ON_Object
{
ON_OBJECT_DECLARE(ON_UserData);
public:
ON_UserData();
ON_UserData(const ON_UserData&);
ON_UserData& operator=(const ON_UserData&);
//////////
// The destructor automatically removes the user data
// from ON_Object::m_userdata_list.
~ON_UserData();
/*
Description:
Tests an object to see if its data members are correctly
initialized.
Parameters:
text_log - [in] if the object is not valid and text_log
is not NULL, then a brief englis description of the
reason the object is not valid is appened to the log.
The information appended to text_log is suitable for
low-level debugging purposes by programmers and is
not intended to be useful as a high level user
interface tool.
Returns:
@untitled table
true object is valid
false object is invalid, uninitialized, etc.
Remarks:
Overrides virtual ON_Object::IsValid
*/
ON_BOOL32 IsValid( ON_TextLog* text_log = NULL ) const;
/*
Description:
Overrides virtual ON_Object::Dump().
Prints class name, description, and uuid.
Parameters:
text_log - [in] Information is sent to this text log.
Remarks:
*/
void Dump( ON_TextLog& text_log ) const;
/*
Description:
Overrides virtual ON_Object::SizeOf().
Returns:
Approximate number of bytes this class uses.
*/
unsigned int SizeOf() const;
////////
// Returns object that owns the user data
ON_Object* Owner() const;
////////
// Used for traversing list of user data attached
// to an object.
ON_UserData* Next() const;
////////
// Returns the class id which is not necessarily the
// same as m_userdata_uuid.
ON_UUID UserDataClassUuid() const;
//////////
// Returns true if the user data is anonymous. This happens
// when the user data class is not defined at the time the
// user data is read from an archive. For example, if a class
// derived from ON_UserData is defined in application A
// but is not defined in application B, then the class can be
// defined when an archive is written by A but not exist when
// an archive is read by B. In this case, the
// user data is not lost, it is just read as ON_UnknownUserData
// by application B. If application B saves the parent
// object in an archive, the unknown user data is resaved in
// a form that can be read by application A.
ON_BOOL32 IsUnknownUserData() const;
/*
Parameters:
description - [out] description of user data shown in
object properties dump.
Returns:
True if user data class is ready.
*/
virtual
ON_BOOL32 GetDescription( ON_wString& description );
/*
Description:
User will persist in binary archives if Archive() returns
true, m_application_uuid is not nil, and the virtual Read()
and Write() are functions are overridden.
Returns:
true if user data should persist in binary archives.
false if the user data should not be save in binary archives.
Remarks:
The default implementation returns false. If you override
ON_UserData::Archive so that it returns true, then your
constructor must set m_application_uuid, you must override
the virtual ON_Object::Read and ON_Object::Write functions and
you must CAREFULLY TEST your code.
ON_UserData requires expert programming and testing skills.
YOU SHOULD READ AND UNDERSTAND EVERY COMMENT IN THIS
HEADER FILE IN BEFORE ATTEMPTING TO USE ON_UserData.
*/
virtual
ON_BOOL32 Archive() const;
/*
Description:
If Transform() return false, then the userdata is destroyed when
its parent object is transformed. The default Transform()
updates m_userdata_xform and returns true.
Carefully read the comments above m_userdata_xform
*/
virtual
ON_BOOL32 Transform( const ON_Xform& );
/*
Description:
This uuid is the value that must be passed to
ON_Object::GetUserData() to retrieve
this piece of user data.
*/
ON_UUID m_userdata_uuid;
/*
Description:
This uuid is used to identify the application that
created this piece of user data. In the case of
Rhino, this is the id of the plug-in that created
the user data. User data with a nil application id
will not be saved in 3dm archives.
*/
ON_UUID m_application_uuid;
////////
// If m_userdata_copycount is 0, user data is not copied when
// object is copied. If > 0, user data is copied and m_copycount
// is incremented when parent object is copied. The user data's
// operator=() is used to copy.
// The default ON_UserData::ON_UserData() constructor sets
// m_userdata_copycount to zero.
unsigned int m_userdata_copycount;
////////
// Updated if user data is attached to a piece of geometry that is
// transformed and the virtual ON_UserData::Transform() is not
// overridden. If you override ON_UserData::Transform() and want
// m_userdata_xform to be updated, then call the
// ON_UserData::Transform() in your override.
// The default constructor sets m_userdata_xform to the identity.
ON_Xform m_userdata_xform;
private: // don't look and don't touch - these may change
friend int ON_BinaryArchive::ReadObject( ON_Object** );
friend bool ON_BinaryArchive::WriteObject( const ON_Object& );
friend bool ON_BinaryArchive::ReadObjectUserData( ON_Object& );
friend bool ON_BinaryArchive::WriteObjectUserData( const ON_Object& );
friend class ON_Object;
ON_Object* m_userdata_owner;
ON_UserData* m_userdata_next;
};
class ON_CLASS ON_UnknownUserData : public ON_UserData
{
ON_OBJECT_DECLARE(ON_UnknownUserData);
// used to hold user data will application class is not loaded
// at time data is read
public:
ON_UnknownUserData();
ON_UnknownUserData(const ON_UnknownUserData&);
~ON_UnknownUserData();
ON_UnknownUserData& operator=(const ON_UnknownUserData&);
// ON_Object overrides
/*
Description:
Tests an object to see if its data members are correctly
initialized.
Parameters:
text_log - [in] if the object is not valid and text_log
is not NULL, then a brief englis description of the
reason the object is not valid is appened to the log.
The information appended to text_log is suitable for
low-level debugging purposes by programmers and is
not intended to be useful as a high level user
interface tool.
Returns:
@untitled table
true object is valid
false object is invalid, uninitialized, etc.
Remarks:
Overrides virtual ON_Object::IsValid
*/
ON_BOOL32 IsValid( ON_TextLog* text_log = NULL ) const;
void Dump( ON_TextLog& ) const;
ON_BOOL32 Write( ON_BinaryArchive& ) const;
ON_BOOL32 Read( ON_BinaryArchive& );
unsigned int SizeOf() const; // return amount of memory used by user data
ON_BOOL32 GetDescription( ON_wString& ); // description of user data
ON_BOOL32 Archive() const;
// Convert unknown user data to actual user data. Useful if
// definition of actual user data is dynamically linked after
// archive containing user data is read.
ON_UserData* Convert() const;
/*
Description:
This is the uuid of the missing class. This uuid
is the 3rd parameter to the ON_OBJECT_IMPLEMENT()
macro of the missing class.
*/
ON_UUID m_unknownclass_uuid;
int m_sizeof_buffer;
void* m_buffer;
// These version numbers are set when unknown user data is read
// from a file record the version of the 3dm archive and the
// version of opennurbs that were used when the plug-in wrote
// the user data.
// This information was added in to V5 opennurbs 200910190.
// For files written with earlier versions of opennurbs, these
// values are set from the archive containing the user data.
// The purpose of this version information is to have it accompany
// unknown user data so that if is is eventually read by the plug-in
// an ON_BinaryArchive with correct version information can be
// passed to the plug-in's reading code. In archives, these values
// are stored in the TCODE_USER_TABLE_RECORD_HEADER chunk.
int m_3dm_version; // 3dm archive version (0,1,2,3,4,5,50,...)
int m_3dm_opennurbs_version; // 0 or YYYYMMDDN
};
class ON_CLASS ON_UserStringList : public ON_UserData
{
ON_OBJECT_DECLARE(ON_UserStringList);
public:
ON_UserStringList();
~ON_UserStringList();
// override virtual ON_Object::Dump function
void Dump( ON_TextLog& text_log ) const;
// override virtual ON_Object::SizeOf function
unsigned int SizeOf() const;
// override virtual ON_Object::DataCRC function
ON__UINT32 DataCRC(ON__UINT32 current_remainder) const;
// override virtual ON_Object::Write function
ON_BOOL32 Write(ON_BinaryArchive& binary_archive) const;
// override virtual ON_Object::Read function
ON_BOOL32 Read(ON_BinaryArchive& binary_archive);
// override virtual ON_UserData::GetDescription function
ON_BOOL32 GetDescription( ON_wString& description );
// override virtual ON_UserData::Archive function
ON_BOOL32 Archive() const;
/*
Description:
Add, replace or remove a user string.
Parameters:
key - [in]
must be a non-empty string. If an entry with the same key
(case insensitive compares are used) exists, the existing
entry is updated.
string_value - [in]
If string_value is empty and an entry with a matching key
exists, the entry is deleted.
Returns:
True if the key is valid.
*/
bool SetUserString( const wchar_t* key, const wchar_t* string_value );
bool GetUserString( const wchar_t* key, ON_wString& string_value ) const;
/*
Description:
Append entries to the user string list
Parameters:
count - [in]
number of element in us[] array
us - [in]
entries to append.
bReplace - [in]
If bReplace is true, then existing entries with the same key are
updated with the new entry's value. If bReplace is false, then
existing entries are not updated.
Returns:
Number of entries added, deleted, or modified.
*/
int SetUserStrings( int count, const ON_UserString* us, bool bReplace );
ON_ClassArray<ON_UserString> m_e;
};
class ON_CLASS ON_UserDataHolder : public ON_Object
{
public:
/*
Description:
Transfers the user data from source_object to "this".
When MoveUserDataFrom() returns source_object will not
have any user data. If "this" had user data when
MoveUserDataFrom() was called, then that user data is
destroyed.
Parameters:
source_object - [in] The "const" is a lie. It is
there because, in practice the source object is frequently
const and const_cast ends up being excessively used.
Returns:
True if source_object had user data that was transfered
to "this". False if source_object had no user data.
In any case, any user data that was on the input "this"
is destroyed.
*/
bool MoveUserDataFrom( const ON_Object& source_object );
/*
Description:
Transfers the user data on "this" to source_object.
When MoveUserDataTo() returns "this" will not have any
user data.
Parameters:
source_object - [in] The "const" is a lie. It is
there because, in practice the source object is generally
const and const_cast ends up being constantly used.
bAppend - [in] if true, existing user data on source_object
is left unchanged. If false, existing user data on source_object
is destroyed, even when there is no user data on "this".
Returns:
True if "this" had user data that was transfered to source_object.
In any case, any user data that was on the input "this"
is destroyed.
*/
bool MoveUserDataTo( const ON_Object& source_object, bool bAppend );
ON_BOOL32 IsValid( ON_TextLog* text_log = NULL ) const;
};
/*
Description:
An ON_DocumentUserStringList object is saved in the list of user
tables. The Rhino SetDocumentText and GetDocumentText
commands use the ON_Object SetUserString, GetUserString,
GetUserStrings, GetUserStringKeys functions on an
ON_DocumentUserStringList class to manage the tag-value pairs of
strings.
*/
class ON_CLASS ON_DocumentUserStringList : public ON_Object
{
ON_OBJECT_DECLARE(ON_DocumentUserStringList);
public:
ON_DocumentUserStringList();
~ON_DocumentUserStringList();
ON_BOOL32 IsValid( ON_TextLog* text_log = NULL ) const;
void Dump( ON_TextLog& ) const;
ON__UINT32 DataCRC(ON__UINT32 current_remainder) const;
ON_BOOL32 Write(ON_BinaryArchive& binary_archive) const;
ON_BOOL32 Read(ON_BinaryArchive& binary_archive);
// Use the
// ON_Object::SetUserString()
// ON_Object::GetUserString()
// ON_Object::GetUserStrings()
// ON_Object::GetUserStringKeys()
// ON_Object::UserStringCount()
// functions to access and modify user string information.
};
#endif
ON_BinaryArchive
Definition: opennurbs_archive.h:732
ON_BinaryArchive::ReadObject
int ReadObject(ON_Object **ppObject)
ON_BinaryArchive::WriteObject
bool WriteObject(const ON_Object *)
ON_BinaryArchive::ReadObjectUserData
bool ReadObjectUserData(ON_Object &object)
ON_BinaryArchive::WriteObjectUserData
bool WriteObjectUserData(const ON_Object &object)
ON_ClassArray< ON_UserString >
ON_DocumentUserStringList
Definition: opennurbs_userdata.h:385
ON_DocumentUserStringList::Read
ON_BOOL32 Read(ON_BinaryArchive &binary_archive)
ON_DocumentUserStringList::Write
ON_BOOL32 Write(ON_BinaryArchive &binary_archive) const
ON_DocumentUserStringList::~ON_DocumentUserStringList
~ON_DocumentUserStringList()
ON_DocumentUserStringList::Dump
void Dump(ON_TextLog &) const
ON_DocumentUserStringList::IsValid
ON_BOOL32 IsValid(ON_TextLog *text_log=NULL) const
ON_DocumentUserStringList::ON_DocumentUserStringList
ON_DocumentUserStringList()
ON_DocumentUserStringList::DataCRC
ON__UINT32 DataCRC(ON__UINT32 current_remainder) const
ON_Object
Definition: opennurbs_object.h:377
ON_TextLog
Definition: opennurbs_textlog.h:23
ON_UUID
Definition: opennurbs_uuid.h:32
ON_UnknownUserData
Definition: opennurbs_userdata.h:192
ON_UnknownUserData::m_sizeof_buffer
int m_sizeof_buffer
Definition: opennurbs_userdata.h:245
ON_UnknownUserData::m_3dm_version
int m_3dm_version
Definition: opennurbs_userdata.h:260
ON_UnknownUserData::GetDescription
ON_BOOL32 GetDescription(ON_wString &)
ON_UnknownUserData::Dump
void Dump(ON_TextLog &) const
ON_UnknownUserData::m_3dm_opennurbs_version
int m_3dm_opennurbs_version
Definition: opennurbs_userdata.h:261
ON_UnknownUserData::Write
ON_BOOL32 Write(ON_BinaryArchive &) const
ON_UnknownUserData::operator=
ON_UnknownUserData & operator=(const ON_UnknownUserData &)
ON_UnknownUserData::Read
ON_BOOL32 Read(ON_BinaryArchive &)
ON_UnknownUserData::ON_UnknownUserData
ON_UnknownUserData(const ON_UnknownUserData &)
ON_UnknownUserData::m_unknownclass_uuid
ON_UUID m_unknownclass_uuid
Definition: opennurbs_userdata.h:244
ON_UnknownUserData::ON_UnknownUserData
ON_UnknownUserData()
ON_UnknownUserData::IsValid
ON_BOOL32 IsValid(ON_TextLog *text_log=NULL) const
ON_UnknownUserData::m_buffer
void * m_buffer
Definition: opennurbs_userdata.h:246
ON_UnknownUserData::Convert
ON_UserData * Convert() const
ON_UnknownUserData::~ON_UnknownUserData
~ON_UnknownUserData()
ON_UnknownUserData::SizeOf
unsigned int SizeOf() const
ON_UnknownUserData::Archive
ON_BOOL32 Archive() const
ON_UserDataHolder
Definition: opennurbs_userdata.h:332
ON_UserDataHolder::IsValid
ON_BOOL32 IsValid(ON_TextLog *text_log=NULL) const
ON_UserDataHolder::MoveUserDataFrom
bool MoveUserDataFrom(const ON_Object &source_object)
ON_UserDataHolder::MoveUserDataTo
bool MoveUserDataTo(const ON_Object &source_object, bool bAppend)
ON_UserData
Definition: opennurbs_userdata.h:21
ON_UserData::Dump
void Dump(ON_TextLog &text_log) const
ON_UserData::Transform
virtual ON_BOOL32 Transform(const ON_Xform &)
ON_UserData::m_application_uuid
ON_UUID m_application_uuid
Definition: opennurbs_userdata.h:161
ON_UserData::m_userdata_xform
ON_Xform m_userdata_xform
Definition: opennurbs_userdata.h:179
ON_UserData::SizeOf
unsigned int SizeOf() const
ON_UserData::Next
ON_UserData * Next() const
ON_UserData::GetDescription
virtual ON_BOOL32 GetDescription(ON_wString &description)
ON_UserData::m_userdata_uuid
ON_UUID m_userdata_uuid
Definition: opennurbs_userdata.h:151
ON_UserData::IsUnknownUserData
ON_BOOL32 IsUnknownUserData() const
ON_UserData::Owner
ON_Object * Owner() const
ON_UserData::m_userdata_copycount
unsigned int m_userdata_copycount
Definition: opennurbs_userdata.h:170
ON_UserData::IsValid
ON_BOOL32 IsValid(ON_TextLog *text_log=NULL) const
ON_UserData::operator=
ON_UserData & operator=(const ON_UserData &)
ON_UserData::ON_UserData
ON_UserData(const ON_UserData &)
ON_UserData::~ON_UserData
~ON_UserData()
ON_UserData::Archive
virtual ON_BOOL32 Archive() const
ON_UserData::ON_UserData
ON_UserData()
ON_UserData::UserDataClassUuid
ON_UUID UserDataClassUuid() const
ON_UserString
Definition: opennurbs_object.h:337
ON_UserStringList
Definition: opennurbs_userdata.h:265
ON_UserStringList::SetUserString
bool SetUserString(const wchar_t *key, const wchar_t *string_value)
ON_UserStringList::ON_UserStringList
ON_UserStringList()
ON_UserStringList::DataCRC
ON__UINT32 DataCRC(ON__UINT32 current_remainder) const
ON_UserStringList::SizeOf
unsigned int SizeOf() const
ON_UserStringList::GetUserString
bool GetUserString(const wchar_t *key, ON_wString &string_value) const
ON_UserStringList::m_e
ON_ClassArray< ON_UserString > m_e
Definition: opennurbs_userdata.h:328
ON_UserStringList::SetUserStrings
int SetUserStrings(int count, const ON_UserString *us, bool bReplace)
ON_UserStringList::Read
ON_BOOL32 Read(ON_BinaryArchive &binary_archive)
ON_UserStringList::Archive
ON_BOOL32 Archive() const
ON_UserStringList::~ON_UserStringList
~ON_UserStringList()
ON_UserStringList::Write
ON_BOOL32 Write(ON_BinaryArchive &binary_archive) const
ON_UserStringList::Dump
void Dump(ON_TextLog &text_log) const
ON_UserStringList::GetDescription
ON_BOOL32 GetDescription(ON_wString &description)
ON_Xform
Definition: opennurbs_xform.h:29
ON_wString
Definition: opennurbs_string.h:701