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

Info1A = "!Modify To Cubic ©             Information 1 of 2"
Info1B = ""
Info1C = "@This macro reshapes the current object into that"
Info1D = "@of a cube or cubic based object.                "
Info1E = ""
Info1F = "þ The default CENTER is that of the current obj."
Info1G = "þ The default RADIUS is that of the current obj."
Info1H = "þ Each AXIS defaults to OFF if the obj. is flat "
Info1I = "  on that axis.                                 "
Info1J = "¤ If all are turned on, six sides are flat.     "
Info1K = "¤ If two are turned on, the object is flat on   "
Info1L = "  four of the six sides.                        "
Info1M = "¤ If only one axis is chosen, two out of the six"
Info1N = "  sides are flat.                               "

Info2A = "!Modify To Cubic ©             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"
                                                  /* Add Math Functions */
MATHLIB= "rexxmathlib.library"
IF POS(MATHLIB , SHOW('L')) = 0 THEN
    IF ~ADDLIB(MATHLIB , 0 , -30 , 0) THEN DO
    	CALL Notify(1,"!Can't find "MATHLIB)
		IF VT3DLib THEN CALL REMLIB("LWModelerARexx.port")
		EXIT
	END

/* -------------------------------------------------------------------- */
                                               /* Retrieving Layer Info */
Box = BoundingBox()
PARSE var Box N X1 X2 Y1 Y2 Z1 Z2

IF N = 0 THEN DO
	CALL Notify(1,"!Sorry!","@An object must be present for this macro.")
	CALL Exiting
END

CntX = (X1/2)+(X2/2) ; CntY = (Y1/2)+(Y2/2) ; CntZ = (Z1/2)+(Z2/2)
RadX = (X2-X1)/2     ; RadY = (Y2-Y1)/2     ; RadZ = (Z2-Z1)/2

IF RadX = 0 THEN ReqAxisX = 0 ; ELSE ReqAxisX = 1
IF RadY = 0 THEN ReqAxisY = 0 ; ELSE ReqAxisY = 1
IF RadZ = 0 THEN ReqAxisZ = 0 ; ELSE ReqAxisZ = 1

/* ******************************************************************** */
                                                   /* Main Body Of Code */
CALL MenuRequester
CALL TransformObject
CALL Exiting

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

	CALL Req_Begin("Modify To Cubic ©         by Brett Hester")

	ReqA = Req_AddControl("Center",'V',1)
	ReqB = Req_AddControl("Radius",'V',1)
	ReqC = Req_AddControl("X Axis",'B')
	ReqD = Req_AddControl("Y Axis",'B')
	ReqE = Req_AddControl("Z Axis",'B')
	ReqF = Req_AddControl("",'CH', "Information")

	CALL Req_SetVal(ReqA, CntX CntY CntZ)
	CALL Req_SetVal(ReqB, RadX RadY RadZ)
	CALL Req_SetVal(ReqC, ReqAxisX)
	CALL Req_SetVal(ReqD, ReqAxisY)
	CALL Req_SetVal(ReqE, ReqAxisZ)
	CALL Req_SetVal(ReqF, 0)

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

	ReqCenter = Req_GetVal(ReqA)
	ReqRadius = Req_GetVal(ReqB)
	ReqAxisX = Req_GetVal(ReqC)
	ReqAxisY = Req_GetVal(ReqD)
	ReqAxisZ = Req_GetVal(ReqE)
	BEHInfo = Req_GetVal(ReqF)

	PARSE var ReqCenter CntX CntY CntZ
	PARSE var ReqRadius RadX RadY RadZ

	CALL Req_End()

	IF BEHInfo = 1 THEN CALL InformationWindows

RETURN

/* -------------------------------------------------------------------- */
                                                    /* Transform Object */
TransformObject:

	N = XFrm_Begin()
	CALL Meter_Begin(N, "Modifing To Cubic-Based Shape")
	DO i = 1 to N
		PARSE value XFrm_GetPos(i) with OldX OldY OldZ .

		OldRadX = OldX-CntX ; OldRadY = OldY-CntY ; OldRadZ = OldZ-CntZ

		ScaleX = 0 ; ScaleY = 0 ; ScaleZ = 0

		IF OldRadX ~= 0 THEN ScaleX = ABS(RadX / OldRadX)
		IF OldRadY ~= 0 THEN ScaleY = ABS(RadY / OldRadY)
		IF OldRadZ ~= 0 THEN ScaleZ = ABS(RadZ / OldRadZ)
                                     /* Creating Largest Possible Scale */
		Scale = ScaleX + ScaleY + ScaleZ

          /* Finding which axis would be hit first by the current point */
		IF ScaleX ~= 0 THEN DO
			IF ScaleX < Scale THEN Scale = ScaleX
		END
		IF ScaleY ~= 0 THEN DO
			IF ScaleY < Scale THEN Scale = ScaleY
		END
		IF ScaleZ ~= 0 THEN DO
			IF ScaleZ < Scale THEN Scale = ScaleZ
		END

		NewX = (OldRadX * Scale) + CntX
		NewY = (OldRadY * Scale) + CntY
		NewZ = (OldRadZ * Scale) + CntZ

		IF ReqAxisX = 0 THEN NewX = OldX
		IF ReqAxisY = 0 THEN NewY = OldY
		IF ReqAxisZ = 0 THEN NewZ = OldZ

		CALL XFrm_SetPos(i, NewX NewY NewZ)
		CALL Meter_Step()
	END
	CALL Meter_End()
	CALL XFrm_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
