Commit 75d35e2e authored by allens's avatar allens

Changes from TX Corp for embedded plots, passing a password, and other support

git-svn-id: http://visit.ilight.com/svn/visit/trunk/src@23723 18c085ea-50e0-402c-830e-de6fd14e8384
parent 91ddf116
......@@ -117,7 +117,7 @@ struct ThreadCallbackDataStruct
//
// Static data
//
void (*RemoteProcess::getAuthentication)(const char *, const char *, int) = NULL;
void (*RemoteProcess::getAuthentication)(const char *, const char *, const char *, int) = NULL;
bool (*RemoteProcess::changeUsername)(const std::string &, std::string&) = NULL;
bool RemoteProcess::disablePTY = false;
Connection* (*RemoteProcess::customConnectionCallback)(int,void*) = NULL;
......@@ -1147,8 +1147,8 @@ RemoteProcess::Open(const MachineProfile &profile, int numRead, int numWrite,
// Start making the connections and start listening.
if(!StartMakingConnection(host, numRead, numWrite))
{
debug5 << "StartMakingConnection(" << numRead << ", " << numWrite
<< ") failed. Returning." << endl;
debug5 << "StartMakingConnection(" << host << ", " << numRead
<< ", " << numWrite << ") failed. Returning." << endl;
return false;
}
......@@ -1176,7 +1176,7 @@ RemoteProcess::Open(const MachineProfile &profile, int numRead, int numWrite,
else
{
debug5 << mName << "Calling LaunchRemote" << endl;
LaunchRemote(host, profile.UserName(), commandLine);
LaunchRemote(host, profile.GetPassword(), profile.UserName(), commandLine);
}
childDied[GetProcessId()] = false;
......@@ -2225,7 +2225,7 @@ RemoteProcess::CreateCommandLine(stringVector &args, const MachineProfile &profi
// ****************************************************************************
void
RemoteProcess::LaunchRemote(const std::string &host, const std::string &remoteUserName,
RemoteProcess::LaunchRemote(const std::string &host, const std::string &password, const std::string &remoteUserName,
const stringVector &args)
{
const char *mName = "RemoteProcess::LaunchRemote: ";
......@@ -2306,7 +2306,7 @@ RemoteProcess::LaunchRemote(const std::string &host, const std::string &remoteUs
{
TRY
{
(*getAuthentication)(remoteUserName.c_str(), host.c_str(),
(*getAuthentication)(remoteUserName.c_str(), password.c_str(), host.c_str(),
ptyFileDescriptor);
}
CATCH(ChangeUsernameException)
......@@ -2367,7 +2367,7 @@ RemoteProcess::LaunchRemote(const std::string &host, const std::string &remoteUs
}
//recursively call connection..
LaunchRemote(host, newUserName, args2);
LaunchRemote(host, password, newUserName, args2);
return; //unnecessary
}
else
......@@ -2694,7 +2694,7 @@ RemoteProcess::StrDup(const std::string &str) const
// ****************************************************************************
void
RemoteProcess::SetAuthenticationCallback(void (*callback)(const char *, const char *, int))
RemoteProcess::SetAuthenticationCallback(void (*callback)(const char *, const char *, const char *, int))
{
getAuthentication = callback;
}
......
......@@ -164,7 +164,7 @@ public:
void SetProgressCallback(bool (*)(void *, int), void *);
std::map<int,int> GetPortTunnelMap() { return portTunnelMap; }
static void SetAuthenticationCallback(void (*)(const char *, const char *, int));
static void SetAuthenticationCallback(void (*)(const char *, const char*, const char *, int));
static void SetChangeUserNameCallback(bool (*)(const std::string &,std::string&));
static void DisablePTY();
static void SetCustomConnectionCallback(Connection* (*)(int, void *), void* cbData);
......@@ -181,7 +181,7 @@ protected:
int numRead, int numWrite);
virtual void Launch(const stringVector &);
void LaunchLocal(const stringVector &);
void LaunchRemote(const std::string &host, const std::string &remoteUserName,
void LaunchRemote(const std::string &host, const std::string &password, const std::string &remoteUserName,
const stringVector &);
void KillProcess();
protected:
......@@ -210,7 +210,7 @@ private:
void *progressCallbackData;
std::map<int,int> portTunnelMap;
static void (*getAuthentication)(const char *, const char *, int);
static void (*getAuthentication)(const char *, const char *, const char *, int);
static bool (*changeUsername)(const std::string &, std::string&);
static bool disablePTY;
static Connection* (*customConnectionCallback)(int,void*);
......
......@@ -79,8 +79,7 @@ pty_fork(int &fdm, void (*sigchld_handler)(int), char *slave_name)
char pts_name[20];
if ( (fdm = ptym_open(pts_name)) < 0)
fprintf(stderr,"can't open master pty: %s", pts_name);
fprintf(stderr,"can't open master pty: %s, returned %d\n", pts_name, fdm);
if (slave_name != NULL)
strcpy(slave_name, pts_name); // return name of slave
......
......@@ -40,6 +40,7 @@
#include <RemoteProcess.h>
#include <ExistingRemoteProcess.h>
#include <snprintf.h>
#include <DebugStream.h>
// ****************************************************************************
// Method: RemoteProxyBase::RemoteProxyBase
......@@ -144,12 +145,12 @@ RemoteProxyBase::Create(const MachineProfile &profile,
// Create a remote process object for the remote component.
if(connectCallback == NULL)
{
component = new RemoteProcess(GetVisItString());
component = new RemoteProcess(GetVisItString(profile));
}
else
{
ExistingRemoteProcess *p =
new ExistingRemoteProcess(GetVisItString());
new ExistingRemoteProcess(GetVisItString(profile));
p->SetConnectCallback(connectCallback);
p->SetConnectCallbackData(connectCallbackData);
component = p;
......@@ -394,11 +395,30 @@ void
RemoteProxyBase::AddProfileArguments(const MachineProfile &machine,
bool addParallelArgs)
{
// Add the directory arugment
// For a remote machine, we need to strip all of the extra "-dir" arguments
// so that we can use the directory from the machine profile instead.
if (machine.GetDirectory() != "")
{
//Remove all existing instances of -dir, because they're for the LOCAL machine
for (int i = 0; i < argv.size(); i++) {
if (argv[i] == "-dir") {
// First delete the "-dir"
stringVector::iterator it = argv.erase(argv.begin() + i);
if (it != argv.end()) {
// If we're not at the end of the list, delete the next argument too
argv.erase(it);
}
//Restart at i = 0
i = -1;
}
}
AddArgument("-dir");
AddArgument(machine.GetDirectory());
debug5 <<"MachineProfile directory is NOT empty, so using -dir argument: " <<machine.GetDirectory() <<std::endl;
} else {
debug5 <<"MachineProfile directory was EMPTY, so keeping -dir arguments." <<std::endl;
}
const LaunchProfile *launch = machine.GetActiveLaunchProfile();
......@@ -617,34 +637,45 @@ RemoteProxyBase::Parallel() const
// If we find :/ or :\ in the -dir argument then assume the remote computer
// is a Windows computer and we should handle it a little differently.
//
// Marc Durant, Tue Sep 4 15:02:00 MST 2012
// Added parameter for the machine profile,
// which allows us to more accurately derive
// the path to remote VisIt
// ****************************************************************************
std::string
RemoteProxyBase::GetVisItString() const
{
// The -dir flag means that the visit script is not in our path, so we
// must prepend it to the name of the visit script. Do that check now.
RemoteProxyBase::GetVisItString(const MachineProfile &profile) const
{
std::string visitString = "visit";
for (size_t i = 0 ; i < argv.size() ; ++i)
{
if (argv[i] == "-dir" && (i + 1) < argv.size())
std::string directory = profile.GetDirectory();
if (directory.size() == 0) {
// The -dir flag means that the visit script is not in our path, so we
// must prepend it to the name of the visit script. Do that check now.
for (size_t i = 0 ; i < argv.size() ; ++i)
{
const std::string &dirArg = argv[i + 1];
visitString = dirArg;
// If the dirArg contains these characters then assume the remote path is Windows
if(visitString.find(":\\") != std::string::npos || visitString.find(":/") != std::string::npos)
if (argv[i] == "-dir" && (i + 1) < argv.size())
{
if (dirArg[dirArg.size() - 1] != '/' && dirArg[dirArg.size()-1] != '\\')
visitString += "\\";
visitString += "visit.exe";
directory = argv[i + 1];
break;
}
else
{
if (dirArg[dirArg.size() - 1] != '/')
visitString += "/";
visitString += "bin/visit";
}
++i;
}
}
if (directory.size() > 0) {
visitString = directory;
// If the dirArg contains these characters then assume the remote path is Windows
if (visitString.find(":\\") != std::string::npos || visitString.find(":/") != std::string::npos)
{
if (directory[directory.size() - 1] != '/' && directory[directory.size()-1] != '\\')
visitString += "\\";
visitString += "visit.exe";
}
else
{
if (directory[directory.size() - 1] != '/')
visitString += "/";
visitString += "bin/visit";
}
}
......
......@@ -133,7 +133,7 @@ public:
protected:
void SetupAllRPCs();
virtual void SetupComponentRPCs() = 0;
std::string GetVisItString() const;
std::string GetVisItString(const MachineProfile &profile) const;
virtual void AddExtraArguments();
std::string componentName;
......
......@@ -136,6 +136,7 @@ void MachineProfile::Copy(const MachineProfile &obj)
host = obj.host;
userName = obj.userName;
password = obj.password;
hostAliases = obj.hostAliases;
hostNickname = obj.hostNickname;
directory = obj.directory;
......@@ -341,6 +342,7 @@ MachineProfile::operator == (const MachineProfile &obj) const
// Create the return value
return ((host == obj.host) &&
(userName == obj.userName) &&
(password == obj.password) &&
(hostAliases == obj.hostAliases) &&
(hostNickname == obj.hostNickname) &&
(directory == obj.directory) &&
......@@ -505,6 +507,7 @@ MachineProfile::SelectAll()
{
Select(ID_host, (void *)&host);
Select(ID_userName, (void *)&userName);
Select(ID_password, (void *)&password);
Select(ID_hostAliases, (void *)&hostAliases);
Select(ID_hostNickname, (void *)&hostNickname);
Select(ID_directory, (void *)&directory);
......@@ -827,6 +830,13 @@ MachineProfile::SetUserName(const std::string &userName_)
Select(ID_userName, (void *)&userName);
}
void
MachineProfile::SetPassword(const std::string &password_)
{
password = password_;
Select(ID_password, (void *)&password);
}
void
MachineProfile::SetHostAliases(const std::string &hostAliases_)
{
......@@ -1015,6 +1025,18 @@ MachineProfile::GetUserName()
return userName;
}
const std::string &
MachineProfile::GetPassword() const
{
return password;
}
std::string &
MachineProfile::GetPassword()
{
return password;
}
const std::string &
MachineProfile::GetHostAliases() const
{
......@@ -1187,6 +1209,12 @@ MachineProfile::SelectUserName()
Select(ID_userName, (void *)&userName);
}
void
MachineProfile::SelectPassword()
{
Select(ID_password, (void *)&password);
}
void
MachineProfile::SelectHostAliases()
{
......@@ -1452,6 +1480,7 @@ MachineProfile::GetFieldName(int index) const
{
case ID_host: return "host";
case ID_userName: return "userName";
case ID_password: return "password";
case ID_hostAliases: return "hostAliases";
case ID_hostNickname: return "hostNickname";
case ID_directory: return "directory";
......@@ -1497,6 +1526,7 @@ MachineProfile::GetFieldType(int index) const
{
case ID_host: return FieldType_string;
case ID_userName: return FieldType_string;
case ID_password: return FieldType_string;
case ID_hostAliases: return FieldType_string;
case ID_hostNickname: return FieldType_string;
case ID_directory: return FieldType_string;
......@@ -1542,6 +1572,7 @@ MachineProfile::GetFieldTypeName(int index) const
{
case ID_host: return "string";
case ID_userName: return "string";
case ID_password: return "string";
case ID_hostAliases: return "string";
case ID_hostNickname: return "string";
case ID_directory: return "string";
......@@ -1597,6 +1628,11 @@ MachineProfile::FieldsEqual(int index_, const AttributeGroup *rhs) const
retval = (userName == obj.userName);
}
break;
case ID_password:
{ // new scope
retval = (password == obj.password);
}
break;
case ID_hostAliases:
{ // new scope
retval = (hostAliases == obj.hostAliases);
......
......@@ -96,6 +96,7 @@ public:
virtual void SelectAll();
void SelectHost();
void SelectUserName();
void SelectPassword();
void SelectHostAliases();
void SelectHostNickname();
void SelectDirectory();
......@@ -107,6 +108,7 @@ public:
// Property setting methods
void SetHost(const std::string &host_);
void SetUserName(const std::string &userName_);
void SetPassword(const std::string &password_);
void SetHostAliases(const std::string &hostAliases_);
void SetHostNickname(const std::string &hostNickname_);
void SetDirectory(const std::string &directory_);
......@@ -131,6 +133,8 @@ public:
std::string &GetHost();
const std::string &GetUserName() const;
std::string &GetUserName();
const std::string &GetPassword() const;
std::string &GetPassword();
const std::string &GetHostAliases() const;
std::string &GetHostAliases();
const std::string &GetHostNickname() const;
......@@ -205,6 +209,7 @@ public:
enum {
ID_host = 0,
ID_userName,
ID_password,
ID_hostAliases,
ID_hostNickname,
ID_directory,
......@@ -232,6 +237,7 @@ protected:
private:
std::string host;
std::string userName;
std::string password;
std::string hostAliases;
std::string hostNickname;
std::string directory;
......@@ -256,6 +262,6 @@ private:
static const char *TypeMapFormatString;
static const private_tmfs_t TmfsStruct;
};
#define MACHINEPROFILE_TMFS "sssssbbibs*bsisbbibia*i"
#define MACHINEPROFILE_TMFS "ssssssbbibs*bsisbbibia*i"
#endif
......@@ -11,6 +11,8 @@
<Field name="userName" label="userName" type="string" init="true">
notset
</Field>
<Field name="password" label="password" type="string">
</Field>
<Field name="hostAliases" label="hostAliases" type="string">
</Field>
<Field name="hostNickname" label="hostNickname" type="string">
......
......@@ -103,6 +103,7 @@ void Plot::Init()
databaseName = "notset";
activeOperator = -1;
id = -1;
embeddedPlotId = -1;
beginFrame = -999;
endFrame = 999;
isFromSimulation = false;
......@@ -140,6 +141,7 @@ void Plot::Copy(const Plot &obj)
operatorNames = obj.operatorNames;
activeOperator = obj.activeOperator;
id = obj.id;
embeddedPlotId = obj.embeddedPlotId;
beginFrame = obj.beginFrame;
endFrame = obj.endFrame;
keyframes = obj.keyframes;
......@@ -317,6 +319,7 @@ Plot::operator == (const Plot &obj) const
(operatorNames == obj.operatorNames) &&
(activeOperator == obj.activeOperator) &&
(id == obj.id) &&
(embeddedPlotId == obj.embeddedPlotId) &&
(beginFrame == obj.beginFrame) &&
(endFrame == obj.endFrame) &&
(keyframes == obj.keyframes) &&
......@@ -480,6 +483,7 @@ Plot::SelectAll()
Select(ID_operatorNames, (void *)&operatorNames);
Select(ID_activeOperator, (void *)&activeOperator);
Select(ID_id, (void *)&id);
Select(ID_embeddedPlotId, (void *)&embeddedPlotId);
Select(ID_beginFrame, (void *)&beginFrame);
Select(ID_endFrame, (void *)&endFrame);
Select(ID_keyframes, (void *)&keyframes);
......@@ -578,6 +582,13 @@ Plot::SetId(int id_)
Select(ID_id, (void *)&id);
}
void
Plot::SetEmbeddedPlotId(int embeddedPlotId_)
{
embeddedPlotId = embeddedPlotId_;
Select(ID_embeddedPlotId, (void *)&embeddedPlotId);
}
void
Plot::SetBeginFrame(int beginFrame_)
{
......@@ -740,6 +751,12 @@ Plot::GetId() const
return id;
}
int
Plot::GetEmbeddedPlotId() const
{
return embeddedPlotId;
}
int
Plot::GetBeginFrame() const
{
......@@ -906,6 +923,7 @@ Plot::GetFieldName(int index) const
case ID_operatorNames: return "operatorNames";
case ID_activeOperator: return "activeOperator";
case ID_id: return "id";
case ID_embeddedPlotId: return "embeddedPlotId";
case ID_beginFrame: return "beginFrame";
case ID_endFrame: return "endFrame";
case ID_keyframes: return "keyframes";
......@@ -950,6 +968,7 @@ Plot::GetFieldType(int index) const
case ID_operatorNames: return FieldType_stringVector;
case ID_activeOperator: return FieldType_int;
case ID_id: return FieldType_int;
case ID_embeddedPlotId: return FieldType_int;
case ID_beginFrame: return FieldType_int;
case ID_endFrame: return FieldType_int;
case ID_keyframes: return FieldType_intVector;
......@@ -994,6 +1013,7 @@ Plot::GetFieldTypeName(int index) const
case ID_operatorNames: return "stringVector";
case ID_activeOperator: return "int";
case ID_id: return "int";
case ID_embeddedPlotId: return "int";
case ID_beginFrame: return "int";
case ID_endFrame: return "int";
case ID_keyframes: return "intVector";
......@@ -1088,6 +1108,11 @@ Plot::FieldsEqual(int index_, const AttributeGroup *rhs) const
retval = (id == obj.id);
}
break;
case ID_embeddedPlotId:
{ // new scope
retval = (embeddedPlotId == obj.embeddedPlotId);
}
break;
case ID_beginFrame:
{ // new scope
retval = (beginFrame == obj.beginFrame);
......
......@@ -117,6 +117,7 @@ public:
void SetOperatorNames(const stringVector &operatorNames_);
void SetActiveOperator(int activeOperator_);
void SetId(int id_);
void SetEmbeddedPlotId(int embeddedPlotId_);
void SetBeginFrame(int beginFrame_);
void SetEndFrame(int endFrame_);
void SetKeyframes(const intVector &keyframes_);
......@@ -144,6 +145,7 @@ public:
stringVector &GetOperatorNames();
int GetActiveOperator() const;
int GetId() const;
int GetEmbeddedPlotId() const;
int GetBeginFrame() const;
int GetEndFrame() const;
const intVector &GetKeyframes() const;
......@@ -192,6 +194,7 @@ public:
ID_operatorNames,
ID_activeOperator,
ID_id,
ID_embeddedPlotId,
ID_beginFrame,
ID_endFrame,
ID_keyframes,
......@@ -216,6 +219,7 @@ private:
stringVector operatorNames;
int activeOperator;
int id;
int embeddedPlotId;
int beginFrame;
int endFrame;
intVector keyframes;
......@@ -229,6 +233,6 @@ private:
static const char *TypeMapFormatString;
static const private_tmfs_t TmfsStruct;
};
#define PLOT_TMFS "iisbbbssi*s*iiiii*i*bbss"
#define PLOT_TMFS "iisbbbssi*s*iiiiii*i*bbss"
#endif
......@@ -39,6 +39,9 @@
<Field name="id" label="id" type="int">
-1
</Field>
<Field name="embeddedPlotId" label="embeddedPlotId" type="int">
-1
</Field>
<Field name="beginFrame" label="beginFrame" type="int">
-999
</Field>
......
This diff is collapsed.
......@@ -58,7 +58,7 @@ import java.util.Vector;
public class Plot extends AttributeSubject
{
private static int Plot_numAdditionalAtts = 20;
private static int Plot_numAdditionalAtts = 21;
// Enum values
public final static int STATETYPE_NEWLYCREATED = 0;
......@@ -83,6 +83,7 @@ public class Plot extends AttributeSubject
operatorNames = new Vector();
activeOperator = -1;
id = -1;
embeddedPlotId = -1;
beginFrame = -999;
endFrame = 999;
keyframes = new Vector();
......@@ -109,6 +110,7 @@ public class Plot extends AttributeSubject
operatorNames = new Vector();
activeOperator = -1;
id = -1;
embeddedPlotId = -1;
beginFrame = -999;
endFrame = 999;
keyframes = new Vector();
......@@ -145,6 +147,7 @@ public class Plot extends AttributeSubject
activeOperator = obj.activeOperator;
id = obj.id;
embeddedPlotId = obj.embeddedPlotId;
beginFrame = obj.beginFrame;
endFrame = obj.endFrame;
keyframes = new Vector();
......@@ -230,6 +233,7 @@ public class Plot extends AttributeSubject
operatorNames_equal &&
(activeOperator == obj.activeOperator) &&
(id == obj.id) &&
(embeddedPlotId == obj.embeddedPlotId) &&
(beginFrame == obj.beginFrame) &&
(endFrame == obj.endFrame) &&
keyframes_equal &&
......@@ -313,52 +317,58 @@ public class Plot extends AttributeSubject
Select(11);
}
public void SetEmbeddedPlotId(int embeddedPlotId_)
{
embeddedPlotId = embeddedPlotId_;
Select(12);
}
public void SetBeginFrame(int beginFrame_)
{
beginFrame = beginFrame_;
Select(12);
Select(13);
}
public void SetEndFrame(int endFrame_)
{
endFrame = endFrame_;
Select(13);
Select(14);
}
public void SetKeyframes(Vector keyframes_)
{
keyframes = keyframes_;
Select(14);
Select(15);
}
public void SetDatabaseKeyframes(Vector databaseKeyframes_)
{
databaseKeyframes = databaseKeyframes_;
Select(15);
Select(16);
}
public void SetIsFromSimulation(boolean isFromSimulation_)
{
isFromSimulation = isFromSimulation_;
Select(16);
Select(17);
}
public void SetFollowsTime(boolean followsTime_)
{
followsTime = followsTime_;
Select(17);
Select(18);
}
public void SetDescription(String description_)
{
description = description_;
Select(18);
Select(19);
}
public void SetSelection(String selection_)
{
selection = selection_;
Select(19);
Select(20);
}
// Property getting methods
......@@ -374,6 +384,7 @@ public class Plot extends AttributeSubject
public Vector GetOperatorNames() { return operatorNames; }
public int GetActiveOperator() { return activeOperator; }
public int GetId() { return id; }
public int GetEmbeddedPlotId() { return embeddedPlotId; }
public int GetBeginFrame() { return beginFrame; }
public int GetEndFrame() { return endFrame; }
public Vector GetKeyframes() { return keyframes; }
......@@ -411,20 +422,22 @@ public class Plot extends AttributeSubject
if(WriteSelect(11, buf))
buf.WriteInt(id);
if(WriteSelect(12, buf))
buf.WriteInt(beginFrame);
buf.WriteInt(embeddedPlotId);
if(WriteSelect(13, buf))
buf.WriteInt(endFrame);
buf.WriteInt(beginFrame);
if(WriteSelect(14, buf))
buf.WriteIntVector(keyframes);
buf.WriteInt(endFrame);
if(WriteSelect(15, buf))
buf.WriteIntVector(databaseKeyframes);
buf.WriteIntVector(keyframes);
if(WriteSelect(16, buf))
buf.WriteBool(isFromSimulation);
buf.WriteIntVector(databaseKeyframes);
if(WriteSelect(17, buf))
buf.WriteBool(followsTime);
buf.WriteBool(isFromSimulation);
if(WriteSelect(18, buf))
buf.WriteString(description);
buf.WriteBool(followsTime);
if(WriteSelect(19, buf))
buf.WriteString(description);
if(WriteSelect(20, buf))
buf.WriteString(selection);
}
......@@ -469,27 +482,30 @@ public class Plot extends AttributeSubject
SetId(buf.ReadInt());
break;
case 12:
SetBeginFrame(buf.ReadInt());
SetEmbeddedPlotId(buf.ReadInt());
break;
case 13:
SetEndFrame(buf.ReadInt());
SetBeginFrame(buf.ReadInt());
break;
case 14:
SetKeyframes(buf.ReadIntVector());
SetEndFrame(buf.ReadInt());
break;
case 15:
SetDatabaseKeyframes(buf.ReadIntVector());
SetKeyframes(buf.ReadIntVector());
break;
case 16:
SetIsFromSimulation(buf.ReadBool());
SetDatabaseKeyframes(buf.ReadIntVector());
break;
case 17:
SetFollowsTime(buf.ReadBool());
SetIsFromSimulation(buf.ReadBool());
break;
case 18:
SetDescription(buf.ReadString());
SetFollowsTime(buf.ReadBool());
break;
case 19:
SetDescription(buf.ReadString());
break;
case 20:
SetSelection(buf.ReadString());
break;
}
......@@ -519,6 +535,7 @@ public class Plot extends AttributeSubject
str = str + stringVectorToString("operatorNames", operatorNames, indent) + "\n";
str = str + intToString("activeOperator", activeOperator, indent) + "\n";
str = str + intToString("id", id, indent) + "\n";
str = str + intToString("embeddedPlotId", embeddedPlotId, indent) + "\n";
str = str + intToString("beginFrame", beginFrame, indent) + "\n";
str = str + intToString("endFrame", endFrame, indent) + "\n";
str = str + intVectorToString("keyframes", keyframes, indent) + "\n";
......@@ -544,6 +561,7 @@ public class Plot extends AttributeSubject
private Vector operatorNames; // vector of String objects
private int activeOperator;
private int id;
private int embeddedPlotId;