示例#1
0
//-------------------------------------
bool BatchFile::Process()
{
   static const char lEndOfRecord = '#';
   static const int lLineLength = 256;

  bool   lOK = true;

///  ARTHUR - commented due to string stream incompatability
//	 Jtk - uncommented to bring back batch file functionality.
//   type cast the strings to (char*) which appeared to solve 
//	 the string stream incompatibility
   //attempt to open input file
   
  ifstream   lInFile( mInFileName.c_str(), ios::in );
   if( ! lInFile.is_open() )
   {
      AfxMessageBox( "Unable to open batch input file." );
      return   false;
   }

   //make sure this is a batch file
   string   lLine;//( lLineLength, "", ' ' );
   lInFile >> lLine;
   //lInFile.getline( (char*)lLine, lLineLength, lEndOfRecord );
   
 // JTK - Removed simplying setting lCommandName = lLine appears to work
 /*  strstream   lCore;
   lCore << lLine << endl;*/
   string   lCommandName;//( 20, "", ' ' );
// JTK - Removed because strstream no longer exists   
//   lCore >> (char*)lCommandName;
   lCommandName = lLine;		// added because of the removal of strstream
   // allow no space so we don't break peoples' workarounds
   if(lCommandName != "3DSSPPBATCHFILE#") {
	if(mCommands.find(lCommandName) == mCommands.end() ||
		mCommands[lCommandName] != bch3DSSPPBatchFile) {
			AfxMessageBox("Batch file header missing. \nFile must begin with '3DSSPPBATCHFILE #'.");
			lInFile.close();
			return false;
	}
	
		// make sure there's a # next
		lInFile >> lLine;
		if(lLine != "#") {
			AfxMessageBox("Batch file header missing. \nFile must begin with '3DSSPPBATCHFILE #'.");
			lInFile.close();
			return false;
		}
   }
   //cMapType::iterator   lIt = mCommands.find( lCommandName );
/*
   if(lIt != mCommands.end()) //match found
   {
      switch((*lIt).second)
      {
         case bch3DSSPPBatchFile :
         {
            //Header found as first command. OK to proceed.
            break;
         }
         default:
         {
            AfxMessageBox( "Batch file header missing. \nFile must begin with '3DSSPPBATCHFILE #'." );
            lInFile.close();
            return false;
         }
      }
   }
   else //match not found
   {
      AfxMessageBox( "3DSSPP batch file header missing. This is not a valid 3DSSPP batch file." );
	  lInFile.close();     
	  return false;      
   }*/
   
   //attempt to open export file
   
   fstream lExportFile(mExportFileName.c_str(), ios::in | ios::out | ios::trunc | ios::ate ); 
   if(!lExportFile.is_open())
   {
      AfxMessageBox( "Unable to open batch export file." );
      lInFile.close();
      return false;
   }
   
   //attempt to open log file
   
   ofstream lLogFile(mLogFileName.c_str()); 
   if(!lLogFile.is_open())
   {
      AfxMessageBox("Unable to open batch log file.");
      lInFile.close();
      lExportFile.close();
      return false;
   }

   // prepare the progress dialog

   mProgressDialog.Create(IDD_BATCHFILE);
   mProgressDialog.ShowWindow(SW_SHOWNORMAL);
   
   // repeatedly get and decode lines

   int lRecordNumber = 1;
   bool lFirstCommand = true;
   
   while(lInFile.peek() != EOF)
   {
      //Get line

      string   lLine;//( lLineLength, "", ' ' );
      //lInFile.getline( (char*)lLine, lLineLength, lEndOfRecord );
	  lInFile >> lLine;
      
      //strstream   lCore;
      //lCore << lLine << ends;
      
      //Get the command name

      //String   lCommandName( 20, "", ' ' );
      //lCore >> (char*)lCommandName;
	  string lCommandName = lLine;
      
      cMapType::iterator   lIt = mCommands.find( lCommandName );
      
      if( lIt != mCommands.end() ) //match found
      {
         switch( (*lIt).second )
         {
            case bchDescription :
            {
               TaskDescription   lTaskDescription;
               lInFile >> lTaskDescription;
               if( lTaskDescription.Error() )
               {
                  LogError( lLogFile, lRecordNumber, "TaskDescription", (char*)lTaskDescription.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
                  mDocPtr->SetDescription( lTaskDescription );
                  //NOTE: Task description does not trigger automatic export.
               }
               break;
            }
            
            case bchAnthropomentry :
			{
                Anthropometry   lAnthropometry;
			    lInFile >> lAnthropometry;
                if( lAnthropometry.Error() ) {
                    LogError( lLogFile, lRecordNumber, "Anthropometry", (char*)lAnthropometry.LastErrorMessage() );
                    lOK = false;
                } else {
                    mDocPtr->setAnthropometry( lAnthropometry );
					mDocPtr->MakeDirtyAndUpdateViews(true);
                    if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
                }
               break;
            }
            
            case bchJointAngles :
            {
     //          JointAngles lJointAngles;
     //          lInFile >> lJointAngles;
			  // if(! lJointAngles.Validate() ) 
     //          {
     //             LogError( lLogFile, lRecordNumber, "JointAngles", lJointAngles.getLastError().c_str() );
     //             lOK = false;
     //          }
     //          else
     //          {
					//// make the frame a keyframe if it is currently unset
					//// TODO make keyframe as long as it is not a keyframe?
					//if(mDocPtr->getFrameType() == FT_Unset) {
					//	mDocPtr->setFrameType(FT_Keyframe);
					//}

					//// Put the joint angles and clear the undoing queue
     //               mDocPtr->clearUndoHistory();
     //               mDocPtr->GetSkeleton()->SetAngles(lJointAngles);
					//mDocPtr->MakeDirtyAndUpdateViews(true);

					//if (mAutoExport)
					//	mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND);
     //          }
     //          break;
				AfxMessageBox(_T("JOI not supported in 7.00 and later version."), MB_OK | MB_ICONSTOP);
            }

			case bchJointAnglesWithLegs :
			{
				//no longer needed in 7.0.0

				//JointAngles lJointAngles;
				//// don't user operator when we're reading in with the leg angles
				//// we should actually get rid of the operator then, or have a better
				//// versioning system
				////lInFile >> lJointAngles;
				//lJointAngles.ReadBatchFileWithLegs(lInFile);
				//if(! lJointAngles.Validate() )
				//{
				//	LogError(lLogFile, lRecordNumber, "JointAngles", lJointAngles.getLastError().c_str());
				//	lOK = false;
				//}
				//else
				//{
				//	// make the frame a keyframe if it is currently unset
				//	// TODO make keyframe as long as it is not a keyframe?
				//	if(mDocPtr->getFrameType() == FT_Unset) {
				//		mDocPtr->setFrameType(FT_Keyframe);
				//	}

				//	// Put the joint angles and clear the undoing queue
				//	mDocPtr->clearUndoHistory();
				//	mDocPtr->GetSkeleton()->SetAngles(lJointAngles);
				//	mDocPtr->MakeDirtyAndUpdateViews(true);

				//	if(mAutoExport)
				//		mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND);
				//}
				//break;
				AfxMessageBox(_T("JO6 not supported in 7.00 and later version."), MB_OK | MB_ICONSTOP);
			}

			case bchJointAnglesAll :
			{
				JointAngles lJointAngles;
				// don't user operator when we're reading in with the leg angles
				// we should actually get rid of the operator then, or have a better
				// versioning system
				//lInFile >> lJointAngles;
				lJointAngles.ReadBatchFileAll(lInFile);
				/*if(! lJointAngles.Validate() )
				{
					LogError(lLogFile, lRecordNumber, "JointAngles", lJointAngles.getLastError().c_str());
					lOK = false;
				}
				else*/
				{
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}

					// Put the joint angles and clear the undoing queue
					mDocPtr->clearUndoHistory();
					mDocPtr->GetSkeleton()->SetAngles(lJointAngles);
					mDocPtr->MakeDirtyAndUpdateViews(true);

					if(mAutoExport)
						mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND);
				}
				break;
			}
            
            case bchHandLoads :
            {
               HandLoads   lHandLoads;
               lInFile >> lHandLoads;
               if(lHandLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "HandLoads", (char*)lHandLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {

				   mDocPtr->GetSkeleton()->setExtForce(JT_LHAND, lHandLoads.GetLForceVector());
				   mDocPtr->GetSkeleton()->setExtForce(JT_RHAND, lHandLoads.GetRForceVector());

					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }
			// for hand component load
			case bchLeftHandComponentLoad :
            {
               HandLoads   lHandLoads;
               lInFile >> lHandLoads;
               if(lHandLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "HandComponentLoads", (char*)lHandLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   Vector3 leftForceVec;
				   leftForceVec[0] = lHandLoads.LeftMagnitude();
				   leftForceVec[1] = lHandLoads.LeftVerticalAngle();
				   leftForceVec[2] = lHandLoads.LeftHorizontalAngle();
				   Vector3 leftTorqueVec;
				   leftTorqueVec[0] = lHandLoads.RightMagnitude();
				   leftTorqueVec[1] = lHandLoads.RightVerticalAngle();
				   leftTorqueVec[2] = lHandLoads.RightHorizontalAngle();
				   mDocPtr->GetSkeleton()->setExtForce(JT_LHAND, leftForceVec);
				   mDocPtr->GetSkeleton()->setExtTorque(JT_LHAND, leftTorqueVec);

					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }
			case bchRightHandComponentLoad :
            {
               HandLoads   lHandLoads;
               lInFile >> lHandLoads;
               if(lHandLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "HandComponentLoads", (char*)lHandLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   Vector3 rightForceVec;
				   rightForceVec[0] = lHandLoads.LeftMagnitude();
				   rightForceVec[1] = lHandLoads.LeftVerticalAngle();
				   rightForceVec[2] = lHandLoads.LeftHorizontalAngle();
				   Vector3 rightTorqueVec;
				   rightTorqueVec[0] = lHandLoads.RightMagnitude();
				   rightTorqueVec[1] = lHandLoads.RightVerticalAngle();
				   rightTorqueVec[2] = lHandLoads.RightHorizontalAngle();
				   mDocPtr->GetSkeleton()->setExtForce(JT_RHAND, rightForceVec);
				   mDocPtr->GetSkeleton()->setExtTorque(JT_RHAND, rightTorqueVec);

					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			//for multi-joint load
			case bchexternala:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[0],lJointLoads.GetForceVector());
						skel.setExtTorque(order[0],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternalb:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[1],lJointLoads.GetForceVector());
						skel.setExtTorque(order[1],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternalc:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[2],lJointLoads.GetForceVector());
						skel.setExtTorque(order[2],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternald:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[3],lJointLoads.GetForceVector());
						skel.setExtTorque(order[3],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternale:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[4],lJointLoads.GetForceVector());
						skel.setExtTorque(order[4],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternalf:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[5],lJointLoads.GetForceVector());
						skel.setExtTorque(order[5],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternalg:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[6],lJointLoads.GetForceVector());
						skel.setExtTorque(order[6],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternalh:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[7],lJointLoads.GetForceVector());
						skel.setExtTorque(order[7],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternali:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[8],lJointLoads.GetForceVector());
						skel.setExtTorque(order[8],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternalj:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[9],lJointLoads.GetForceVector());
						skel.setExtTorque(order[9],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternalk:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[11] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[10],lJointLoads.GetForceVector());
						skel.setExtTorque(order[10],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternall:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[14] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
                               JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE, JT_RWRIST, JT_LWRIST,JT_TRAGION};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[11],lJointLoads.GetForceVector());
						skel.setExtTorque(order[11],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchexternalm:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[14] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
					   JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE, JT_RWRIST, JT_LWRIST, JT_TRAGION};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[12],lJointLoads.GetForceVector());
						skel.setExtTorque(order[12],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }
			case bchexternaln:
            {
               HandLoads   lJointLoads;
               lInFile >> lJointLoads;
               if(lJointLoads.Error()) 
               {
                  LogError( lLogFile, lRecordNumber, "JointLoads", (char*)lJointLoads.LastErrorMessage() );
                  lOK = false;
               }
               else
               {
				   const JointID order[14] = {JT_RELBOW,JT_RSHOULDER,JT_LELBOW,JT_LSHOULDER,JT_L5S1_TEMP,
					   JT_RHIP,JT_RKNEE,JT_RANKLE,JT_LHIP,JT_LKNEE,JT_LANKLE, JT_RWRIST, JT_LWRIST, JT_TRAGION};

					// make group undo event
					int left = Get_App_Ptr()->Get_Document_Ptr()->LeftSelect();
					int right = Get_App_Ptr()->Get_Document_Ptr()->RightSelect();
					GroupEvent* groupEvent = new GroupEvent(left, right);

					for(int frame = left; frame <= right; frame++) {
						//Skeleton &skel = *Get_App_Ptr()->Get_Document_Ptr()->GetSkeleton();
						Skeleton& skel = *Get_App_Ptr()->Get_Document_Ptr()->getSkeletonAtFrame(frame);
								 
						skel.setExtForce(order[13],lJointLoads.GetForceVector());
						skel.setExtTorque(order[13],lJointLoads.GetTorqueVector());
					}
					// make the frame a keyframe if it is currently unset
					// TODO make keyframe as long as it is not a keyframe?
					if(mDocPtr->getFrameType() == FT_Unset) {
						mDocPtr->setFrameType(FT_Keyframe);
					}
					mDocPtr->MakeDirtyAndUpdateViews(true);

				  if( mAutoExport ) mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND); 
               }
               break;
            }

			case bchSupport : 
			{
				Support_s tempsupport;
				InputAuxiliary inputcheck; //input checking class
				string temp; //temp string for the input
				int feetSupport, position; //temp int value for enum to support read
				lInFile >> temp; 
				if (!inputcheck.isInteger(temp) | !inputcheck.CheckRange(inputcheck.StringtoInt(temp), 0,3))
				{
					LogError(lLogFile, lRecordNumber, "Support Selection", string("The input feetsupport must be an integer from 0 to 3 \n"));
					lOK = false;
					break;
				}
				feetSupport = inputcheck.StringtoInt(temp);
				lInFile >> temp; 
				if (!inputcheck.isInteger(temp) | !inputcheck.CheckRange(inputcheck.StringtoInt(temp), 0,1))
				{
					LogError(lLogFile, lRecordNumber, "Support Selection", string("The input position must be an integer from 0 to 1 \n"));
					lOK = false;
					break;
				}
				position = (bool)inputcheck.StringtoInt(temp);
				lInFile >> temp; 
				if (!inputcheck.isInteger(temp) | !inputcheck.CheckRange(inputcheck.StringtoInt(temp), 0,1))
				{
					LogError(lLogFile, lRecordNumber, "Support Selection", string("The input frontSeatPanSuppor must be an integer from 0 to 1 \n"));
					lOK = false;
					break;
				}
				tempsupport.frontSeatPanSupport = (bool)inputcheck.StringtoInt(temp);
				lInFile >> temp; 
				if (!inputcheck.isInteger(temp) | !inputcheck.CheckRange(inputcheck.StringtoInt(temp), 0,1))
				{
					LogError(lLogFile, lRecordNumber, "Support Selection", string("The input seatHasBackRest must be an integer from 0 to 1 \n"));
					lOK = false;
					break;
				}
				tempsupport.seatHasBackRest = (bool)inputcheck.StringtoInt(temp);
				
				lInFile >> temp; 
				if (!inputcheck.isDouble(temp) | !inputcheck.CheckLowBound(inputcheck.StringtoDouble(temp), 19.05))
				{
					LogError(lLogFile, lRecordNumber, "Support Selection", string("The input backRestCenterHeight must be a number and it is bigger than 19.05 \n"));
					lOK = false;
					break;
				}
				tempsupport.backRestCenterHeight = inputcheck.StringtoDouble(temp);

				lInFile >> temp; 
				if (!inputcheck.isInteger(temp) | !inputcheck.CheckRange(inputcheck.StringtoInt(temp), -360,360))
				{
					LogError(lLogFile, lRecordNumber, "Support Selection", string("The input additionalPelvicTilt must be an integer from -360 to 360 \n"));
					lOK = false;
					break;
				}
				tempsupport.additionalPelvicTilt = inputcheck.StringtoInt(temp);

				tempsupport.feetSupport = FeetSupport_e(feetSupport);
				tempsupport.position = Position_e(position);

				//The following two line is due to the coodinate changing. 
				tempsupport.additionalPelvicTilt = tempsupport.additionalPelvicTilt;
				tempsupport.displayAdditionalPelvicTilt = tempsupport.additionalPelvicTilt;

				if(lInFile.fail()) {
					LogError(lLogFile, lRecordNumber, "Support Selection", string("Support Selection parameters must be FeetSupport, Position, FrontSeatPanSupport,seatHasBackRest, backRestCenterHeight. additionalPelvicTilt, displayAdditionalPelvicTilt \n"));
					lOK = false;
				}
				else if (position && (feetSupport ==1|feetSupport ==2)){
					LogError(lLogFile, lRecordNumber, "Support Selection", string("Two feet must be both on or not on the ground if seated \n"));
					lOK = false;
				}
				else if (!position && (feetSupport == 3)){
					LogError(lLogFile, lRecordNumber, "Support Selection", string("Either or both feet needs to be on the ground if standing \n"));
					lOK = false;
				}
				else if (tempsupport.frontSeatPanSupport && (feetSupport !=3)){
					LogError(lLogFile, lRecordNumber, "Support Selection", string("No frontPan is allowed \n"));
					lOK = false;
				}

				else {

					mDocPtr->setSupport(tempsupport);
					mDocPtr->MakeDirtyAndUpdateViews(true); 
				}
				break;
				
			}
            case bchComment :
            {
               //do nothing
               break;
            }
            
            case bchExport :
            {
               mDocPtr->DoExportSummary(lExportFile, DM_COMMA, FM_APPEND);  
               break;
            }
            
            case bchAutoExport :
            {
               int   lAutoExport;
               lInFile >> lAutoExport;
               if( ! lInFile.fail() )
               {
				   if (lAutoExport)
					   mAutoExport = true;
				   else 
					   mAutoExport = false;
                  
               }
               else
               {
                  string   lMsg( "Value not 0 (false) or 1 (true)." );
                  LogError( lLogFile, lRecordNumber, "AutoExport", lMsg );
                  lOK = false;                  
               }
               break;
            }
			
			case bchPause :
			{
				int pauseTime;
				string temp; //temp string for the input
				lInFile >> temp;
				InputAuxiliary inputcheck; //input checking class
				if (!inputcheck.isInteger(temp))
				{	
					LogError(lLogFile, lRecordNumber, "Pause", string("Must enter a positive integer number of milliseconds to pause, or 0 to be prompted to resume"));
					lOK = false;
					break;
				}
				pauseTime = inputcheck.StringtoInt(temp);

				if( ! lInFile.fail() && pauseTime >= 0) {
					//mDocPtr->RedrawViews();
					mDocPtr->UpdateViews();
					if(pauseTime == 0) {
						AfxMessageBox("Batch file processing paused. Press OK to continue", MB_OK);
					} else {
						Sleep(pauseTime);
					}
				} else {
					LogError( lLogFile, lRecordNumber, "Pause", string("Must enter a positive integer number of milliseconds to pause, or 0 to be prompted to resume"));
					lOK = false;
				}
				break;
			}

			case bchFrameChange:
			{
				string firstParam;
				lInFile >> firstParam;
				if(lInFile.fail()) {
					LogError(lLogFile, lRecordNumber, "Frame", string("Frame command parameters must be + <num> | - <num> | FIRST | LAST | <num>"));
					lOK = false;
				} else {
					// Go to first frame
					if(firstParam == "FIRST") {
						mDocPtr->setCurrentFrame(0);
					} else
					// Go to last frame
					if(firstParam == "LAST") {
						mDocPtr->setCurrentFrame(mDocPtr->getLastFrame());
					} else
					// Advance a number of frames
					if(firstParam == "+") {
						// read number of frames
						int numFrames;
						lInFile >> numFrames;
						if(lInFile.fail()) {
							LogError(lLogFile, lRecordNumber, "Frame", string("Frame command parameters must be + <num> | - <num> | FIRST | LAST | <num>"));
							lOK = false;
						} else {
							mDocPtr->setCurrentFrame(mDocPtr->getCurrentFrame() + numFrames);
						}
					} else
					// Rewind a number of frames
					if(firstParam == "-") {
						// read number of frames
						int numFrames;
						lInFile >> numFrames;
						if(lInFile.fail()) {
							LogError(lLogFile, lRecordNumber, "Frame", string("Frame command parameters must be + <num> | - <num> | FIRST | LAST | <num>"));
							lOK = false;
						} else {
							mDocPtr->setCurrentFrame(mDocPtr->getCurrentFrame() - numFrames);
						}
					} else {
						// Go to numbered frame
						int frameNumber = atoi(firstParam.c_str());
						mDocPtr->setCurrentFrame(frameNumber);
					}
				}
				// update views after frame change
				mDocPtr->UpdateViews();
				break;
			}