/* CMD: ½MotionToCurve                                                  */
/* By Brett Evan Hester      13032 Copenhill Rd. Dallas, Tx. 75240-5302 */
	MacrosName = "MotionToCurve"
/* Macro Type:                                                          */
/* CREATES     * MOTIONS   * OBJECTS      * REMEMBERS                   */
/* Description:                                                         */

/*        "Motion To Curve ©                               "            */
/*        "This macro loads a motion file and makes a curve"            */
/*        "in modeler.                                     "            */

/*        "Special Thanks to:                              "            */
/*        "Arnie Cachelin  Henry Ribron    Mark J. Holland "            */
/*        "J. Phil Kelso   Terry Wester    Steven K. Simms "            */
/*        "Kevin DeRita    Greg Glaser     William S. Hawes"            */
/*        "NewTek ©        Commodore ©     INOVAtronics ©  "            */

/*        "This macro represents a lot of time & hard work."            */
/*        "Encourage people to create new ones and not kill"            */
/*        "that possibility by stealing those that are out."            */

/* -------------------------------------------------------------------- */
                                     /* Start Error Detection (See End) */
SIGNAL ON ERROR
SIGNAL ON SYNTAX
                                                   /* Address LightWave */
VT3DLib = ADDLIB("LWModelerARexx.port",0)
ADDRESS "LWModelerARexx.port"

/* -------------------------------------------------------------------- */
                                    /* Reading Global Macro Preferences */
BEHDefaultFilePath = "Sys:"
BEHSettingsSavedTo = "T:"
BEHSpeechAndSound = "1"

IF (EXISTS("S:PlugInPrefs")) THEN DO
	IF (~OPEN(PlugInPrefs, "S:PlugInPrefs", 'R')) THEN BREAK
	IF (READLN(PlugInPrefs) ~= "PlugInPrefs") THEN BREAK
	BEHDefaultFilePath = READLN(PlugInPrefs)
	BEHSettingsSavedTo = READLN(PlugInPrefs)
	BEHSpeechAndSound = READLN(PlugInPrefs)
	CALL CLOSE PlugInPrefs
END

/* -------------------------------------------------------------------- */
                                            /* Recalling Macro Settings */
FilePath = "Motions"
FileName = ""

PrefsFileName = BEHSettingsSavedTo||MacrosName||".PLUG"

IF (EXISTS(PrefsFileName)) THEN DO
	IF (~OPEN(PrefsFile, PrefsFileName, 'R')) THEN BREAK
	IF (READLN(PrefsFile) ~= MacrosName) THEN BREAK

	FilePath = READLN(PrefsFile)
	FileName = READLN(PrefsFile)

	CALL CLOSE PrefsFile
END

/* ******************************************************************** */
                                                   /* Main Body Of Code */
CALL FileRequester
CALL SaveSettings
CALL ReadMotion
CALL CreateCurve
CALL Exiting

/* ******************************************************************** */
                                                      /* File Requester */
FileRequester:

	FileReq = GetFileName("-- Load Motion --", FilePath, FileName)
	IF FileReq = "(none)" THEN CALL Exiting

	CALL ExtractName
	CALL VerifyFile

RETURN

/* -------------------------------------------------------------------- */
                                               /* Extract Name and Path */
ExtractName:

	FileReqLength = LENGTH(FileReq)
	FileDivider = LASTPOS("/",FileReq)
	IF FileDivider = 0 THEN FileDivider = LASTPOS(":",FileReq)
	FileNameLength = FileReqLength - FileDivider

	FilePath = STRIP(LEFT(FileReq, FileDivider),"T","/")
	FileName = RIGHT(FileReq, FileNameLength)

RETURN

/* -------------------------------------------------------------------- */
                                                         /* Verify File */
VerifyFile:

	IF (~OPEN(ReadMeFile, FileReq, 'R')) THEN DO
		CALL Notify(1,"!Sorry!",'@Unable to load "'||FileReq||'"')
		CALL FileRequester
	END

	IF UPPER(READLN(ReadMeFile)) ~= "LWMO" THEN DO
		CALL Notify(1,"!Sorry!",'@File "'||FileReq||'"',"not recognized as being a motion file.")
		CALL CLOSE(ReadMeFile)
		CALL FileRequester
	END

RETURN

/* -------------------------------------------------------------------- */
                                                 /* Reading Motion File */
ReadMotion:

	CALL READLN(ReadMeFile)                                  /* Magic #  */
	CALL READLN(ReadMeFile)                                  /* Channels */
	NumOfKeys = READLN(ReadMeFile)                           /* # Keys   */

	DO i=1 TO NumOfKeys
		Key.i = READLN(ReadMeFile)                         /* XYZ HPB WHD */
		CALL READLN(ReadMeFile)                            /* Key, Spline */
	END

	CALL CLOSE(ReadMeFile)

RETURN

/* -------------------------------------------------------------------- */
                                                      /* Creating Curve */
CreateCurve:

	CALL Add_Begin()
	PointList = ""

	DO i=1 TO NumOfKeys
		PARSE var Key.i PX PY PZ .
		CALL Add_Point(PX PY PZ)
		PointList = PointList i
	END

	CALL Add_Curve(PointList)
	CALL Add_End()

RETURN

/* -------------------------------------------------------------------- */
                                               /* Saving Macro Settings */
SaveSettings:

	IF (OPEN(PrefsFile, PrefsFileName, 'W')) THEN DO
		CALL WRITELN(PrefsFile, MacrosName)

		CALL WRITELN(PrefsFile, FilePath)
		CALL WRITELN(PrefsFile, FileName)

		CALL CLOSE PrefsFile
	END

RETURN

/* -------------------------------------------------------------------- */
                                                              /* Ending */
Exiting:

	IF (VT3DLib) THEN CALL REMLIB("LWModelerARexx.port")
	EXIT

RETURN

/* -------------------------------------------------------------------- */
                                                      /* Error Handling */
SYNTAX:
ERROR:

	ErrCode = RC
	ErrLine = SIGL
	ErrInfo = ERRORTEXT(ErrCode)

	Err1 = "!Sorry!"
	Err2 = "An Error has been detected"
	Err3 = "@þ Macro -            "
	Err4 = "@þ Line Number -      "
	Err5 = "@þ Error Code -       "
	Err6 = "@þ Error Description -"
	Err7 = "@¤ Please Inform -    "
	Err8 = '  "Error Notice"     '
	Err9 = "  13032 Copenhill Rd."
	Err10 = "  Dallas, TX. 75240  "

	Call Notify(1,Err1,Err2,Err3,MacrosName,Err4,ErrLine,Err5,ErrCode,Err6,ErrInfo,Err7,Err8,Err9,Err10)

/* -------------------------------------------------------------------- */
                                             /* Advanced Error Handling */
	CALL SETCLIP("ErrorMacro",MacrosName)
	CALL SETCLIP("ErrorLine",ErrLine)
	CALL SETCLIP("ErrorCode",ErrCode)
	CALL SETCLIP("ErrorDesc",ErrInfo)

	PARSE SOURCE TempA TempB ErrFile TempC TempD TempE

	CALL SETCLIP("ErrorFile",ErrFile)

/* -------------------------------------------------------------------- */

	IF (VT3DLib) THEN CALL REMLIB("LWModelerARexx.port")
	EXIT
