/* CMD: ½ModifyAlign                                                    */
/* By Brett Evan Hester      13032 Copenhill Rd. Dallas, Tx. 75240-5302 */
	MacrosName = "ModifyAlign"
/* Macro Type:                                                          */
/* MODIFIES    * OBJECTS   * BKG NEEDED   * SELECTED     * REMEMBERS    */
/* Description:                                                         */

Info1A = "!Modify Alignment ©            Information 1 of 2"
Info1B = ""
Info1C = "@This macro moves the current layer, in reference"
Info1D = "@to a background layer.  If a background is not  "
Info1E = "@available, coords. 0, 0, 0 are used as a base.  "
Info1F = ""
Info1G = "þ ... EDGE: aligns that edge of the object with "
Info1H = "  the selected counterpart in the background.   "
Info1I = "þ CENTER: aligns the center point of the object "
Info1J = "  to the position selected in the background.   "
Info1K = 'þ "X" is for no movement on the selected axis.  '
Info1L = ""
Info1M = "þ DISPLAY RESULTS will show the amount the obj. "
Info1N = "  was moved in accordance with the selected.    "

Info2A = "!Modify Alignment ©            Information 2 of 2"
Info2B = "@               Plug-Ins and Go! ©               "
Info2C = "                           Hester and associates"
Info2D = "                           13032 Copenhill Road "
Info2E = "                           Dallas, Texas 75240  "
Info2F = "@Special Thanks to:                              "
Info2G = "Arnie Cachelin  Henry Ribron    Mark J. Holland "
Info2H = "J. Phil Kelso   Terry Wester    Steven K. Simms "
Info2I = "Kevin DeRita    Greg Glaser     William S. Hawes"
Info2J = "NewTek ©        Commodore ©     INOVAtronics ©  "
Info2K = ""
Info2L = "@This macro represents a lot of time & hard work."
Info2M = "@Encourage people to create new ones and not kill"
Info2N = "@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 */
ReqCLX = 2 ; ReqCLY = 2 ; ReqCLZ = 2
ReqBLX = 2 ; ReqBLY = 2 ; ReqBLZ = 2

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

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

	PARSE value READLN(PrefsFile) with ReqCLX ReqCLY ReqCLZ .
	PARSE value READLN(PrefsFile) with ReqBLX ReqBLY ReqBLZ .

	CALL CLOSE PrefsFile
END

/* -------------------------------------------------------------------- */
                                            /* Info on Current Layer(s) */
CL = CurLayer()
CLBox = BoundingBox(CL)
PARSE var CLBox CLN CLX1 CLX2 CLY1 CLY2 CLZ1 CLZ2
                                          /* Current Layer Center Point */
CLCX = (CLX1 / 2) + (CLX2 / 2)
CLCY = (CLY1 / 2) + (CLY2 / 2)
CLCZ = (CLZ1 / 2) + (CLZ2 / 2)
                                            /* Current Layer Total Size */
CLTX = CLX2 - CLX1
CLTY = CLY2 - CLY1
CLTZ = CLZ2 - CLZ1

/* -------------------------------------------------------------------- */
                                         /* Info on Background Layer(s) */
BL = CurBLayer()
BLBox = BoundingBox(BL)
PARSE var BLBox BLN BLX1 BLX2 BLY1 BLY2 BLZ1 BLZ2
                                          /* Current Layer Center Point */
BLCX = (BLX1 / 2) + (BLX2 / 2)
BLCY = (BLY1 / 2) + (BLY2 / 2)
BLCZ = (BLZ1 / 2) + (BLZ2 / 2)
                                            /* Current Layer Total Size */
BLTX = BLX2 - BLX1
BLTY = BLY2 - BLY1
BLTZ = BLZ2 - BLZ1

/* ******************************************************************** */
                                                   /* Main Body of Code */
CALL MenuRequester
CALL SaveSettings
CALL Calculations
IF BEHInfo = 2 THEN CALL DisplayResults
CALL Move(PosX PosY PosZ)
CALL Exiting

/* ******************************************************************** */
                                                      /* User Interface */
MenuRequester:

	CALL Req_Begin("Modify Alignment ©   by Brett Hester")

	CALL Req_AddControl("þ","T","Align Current Layer's:")
	ReqA = Req_AddControl("X","CH","Left Edge Center RightEdge X")
	ReqB = Req_AddControl("Y","CH","LowerEdge Center UpperEdge X")
	ReqC = Req_AddControl("Z","CH","FrontEdge Center Back Edge X")
	CALL Req_AddControl("þ","T","With Background Layer's:")
	ReqD = Req_AddControl("X","CH","Left Edge Center RightEdge")
	ReqE = Req_AddControl("Y","CH","LowerEdge Center UpperEdge")
	ReqF = Req_AddControl("Z","CH","FrontEdge Center Back Edge")
	CALL Req_AddControl("","T","|¼ Negative -      + Positive ½|","")
	BEHInfo = Req_AddControl("",'CH',"Information Display Results")

	CALL Req_SetVal(ReqA, ReqCLX)
	CALL Req_SetVal(ReqB, ReqCLY)
	CALL Req_SetVal(ReqC, ReqCLZ)
	CALL Req_SetVal(ReqD, ReqBLX)
	CALL Req_SetVal(ReqE, ReqBLY)
	CALL Req_SetVal(ReqF, ReqBLZ)
	CALL Req_SetVal(BEHInfo, 0)

	OKorCancel = Req_Post() ; IF OKorCancel = 0 THEN CALL Exiting

	ReqCLX = Req_GetVal(ReqA)
	ReqCLY = Req_GetVal(ReqB)
	ReqCLZ = Req_GetVal(ReqC)
	ReqBLX = Req_GetVal(ReqD)
	ReqBLY = Req_GetVal(ReqE)
	ReqBLZ = Req_GetVal(ReqF)
	BEHInfo = Req_GetVal(BEHInfo)

	CALL Req_End()

	IF BEHInfo = 1 THEN CALL InformationWindows

RETURN

/* -------------------------------------------------------------------- */
                                                        /* Calculations */
Calculations:

	IF ReqBLX = 1 THEN XOffset = BLX1
	IF ReqBLX = 2 THEN XOffset = BLCX
	IF ReqBLX = 3 THEN XOffset = BLX2

	IF ReqBLY = 1 THEN YOffset = BLY1
	IF ReqBLY = 2 THEN YOffset = BLCY
	IF ReqBLY = 3 THEN YOffset = BLY2

	IF ReqBLZ = 1 THEN ZOffset = BLZ1
	IF ReqBLZ = 2 THEN ZOffset = BLCZ
	IF ReqBLZ = 3 THEN ZOffset = BLZ2

	IF ReqCLX = 1 THEN PosX = XOffset - CLX1
	IF ReqCLX = 2 THEN PosX = XOffset - CLCX
	IF ReqCLX = 3 THEN PosX = XOffset - CLX2
	IF ReqCLX = 4 THEN PosX = 0

	IF ReqCLY = 1 THEN PosY = YOffset - CLY1
	IF ReqCLY = 2 THEN PosY = YOffset - CLCY
	IF ReqCLY = 3 THEN PosY = YOffset - CLY2
	IF ReqCLY = 4 THEN PosY = 0

	IF ReqCLZ = 1 THEN PosZ = ZOffset - CLZ1
	IF ReqCLZ = 2 THEN PosZ = ZOffset - CLCZ
	IF ReqCLZ = 3 THEN PosZ = ZOffset - CLZ2
	IF ReqCLZ = 4 THEN PosZ = 0

RETURN

/* -------------------------------------------------------------------- */
                                                     /* Display Results */
DisplayResults:

	Length = 0
	IF LENGTH(PosX) > Length THEN Length = LENGTH(PosX)
	IF LENGTH(PosY) > Length THEN Length = LENGTH(PosY)
	IF LENGTH(PosZ) > Length THEN Length = LENGTH(PosZ)
	PosX = LEFT(PosX,LENGTH)
	PosY = LEFT(PosY,LENGTH)
	PosZ = LEFT(PosZ,LENGTH)
	Spacer = LEFT("",LENGTH)

	IF ReqCLX = 1 THEN DisplayCLX = "LEFT  EDGE"
	IF ReqCLX = 2 THEN DisplayCLX = "  CENTER  "
	IF ReqCLX = 3 THEN DisplayCLX = "RIGHT EDGE"
	IF ReqBLX = 1 THEN DisplayBLX = "LEFT  EDGE"
	IF ReqBLX = 2 THEN DisplayBLX = "  CENTER  "
	IF ReqBLX = 3 THEN DisplayBLX = "RIGHT EDGE"

	IF ReqCLY = 1 THEN DisplayCLY = "LOWER EDGE"
	IF ReqCLY = 2 THEN DisplayCLY = "  CENTER  "
	IF ReqCLY = 3 THEN DisplayCLY = "UPPER EDGE"
	IF ReqBLY = 1 THEN DisplayBLY = "LOWER EDGE"
	IF ReqBLY = 2 THEN DisplayBLY = "  CENTER  "
	IF ReqBLY = 3 THEN DisplayBLY = "UPPER EDGE"

	IF ReqCLZ = 1 THEN DisplayCLZ = "FRONT EDGE"
	IF ReqCLZ = 2 THEN DisplayCLZ = "  CENTER  "
	IF ReqCLZ = 3 THEN DisplayCLZ = "BACK  EDGE"
	IF ReqBLZ = 1 THEN DisplayBLZ = "FRONT EDGE"
	IF ReqBLZ = 2 THEN DisplayBLZ = "  CENTER  "
	IF ReqBLZ = 3 THEN DisplayBLZ = "BACK  EDGE"

	ReqC = ""; ReqD = ""; ReqE = ""; ReqF = ""; ReqG = ""; ReqH = ""

	ReqA = "!Modify Alignment ©   by Brett Evan Hester 214-233-5493"
	ReqB = ""
	IF ReqCLX ~= 4 THEN DO
		ReqC = "Aligning the            w/BKG's            ; Move X ="||Spacer
		ReqD = "@             "||DisplayCLX||"         "||DisplayBLX||"           "||PosX
	END
	IF ReqCLY ~= 4 THEN DO
		ReqE = "Aligning the            w/BKG's            ; Move Y ="||Spacer
		ReqF = "@             "||DisplayCLY||"         "||DisplayBLY||"           "||PosY
	END
	IF ReqCLZ ~= 4 THEN DO
		ReqG = "Aligning the            w/BKG's            ; Move Z ="||Spacer
		ReqH = "@             "||DisplayCLZ||"         "||DisplayBLZ||"           "||PosZ
	END
	ReqI = ""

	OKorCancel = Notify(2, ReqA, ReqB, ReqC, ReqD, ReqE, ReqF, ReqG, ReqH, ReqI)
	IF OKorCancel = 0 THEN CALL Exiting

RETURN

/* -------------------------------------------------------------------- */
                                            /* Recording Macro Settings */
SaveSettings:

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

		CALL WRITELN(PrefsFile, ReqCLX ReqCLY ReqCLZ)
		CALL WRITELN(PrefsFile, ReqBLX ReqBLY ReqBLZ)

		CALL CLOSE PrefsFile
	END

RETURN

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

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

RETURN

/* -------------------------------------------------------------------- */
                                                 /* Information Windows */
InformationWindows:

	OKorCancel = Notify(2, Info1A, Info1B, Info1C, Info1D, Info1E, Info1F, Info1G, Info1H, Info1I, Info1J, Info1K, Info1L, Info1M, Info1N)
	IF OKorCancel = 1 THEN CALL Notify(1, Info2A, Info2B, Info2C, Info2D, Info2E, Info2F, Info2G, Info2H, Info2I, Info2J, Info2K, Info2L, Info2M, Info2N)
	CALL MenuRequester

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
