home *** CD-ROM | disk | FTP | other *** search
- /* CMD: ½CreateSphere */
- /* By Brett Evan Hester 13032 Copenhill Rd. Dallas, Tx. 75240-5302 */
- MacrosName = "CreateSphere"
- /* Macro Type: */
- /* CREATES * OBJECTS * LAYER NEEDED * TIME NEEDED * REMEMBERS */
- /* Description: */
-
- Info1A = "!Create Sphere © Information 1 of 2"
- Info1B = ""
- Info1C = "@This macro will create a sphere; using defaults "
- Info1D = "@based on the currently selected and last used "
- Info1E = "@settings. "
- Info1F = ""
- Info1G = "þ The CENTER defaults to that of the selected. "
- Info1H = "þ The RADIUS defaults to that of the selected. "
- Info1I = "¤ Unless the selected has no dimensions. Then it"
- Info1J = "¤ defaults to a radius of -1- or the last used. "
- Info1K = ""
- Info1L = "þ If GLOBE is used, set # of SIDES and SEGMENTS."
- Info1M = " If TESSELATION is used, set LEVEL. "
- Info1N = " If BALL (Custom-Made) is used, set LEVEL. "
-
- Info2A = "!Create Sphere © 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
-
- /* -------------------------------------------------------------------- */
- /* 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
-
- /* -------------------------------------------------------------------- */
- /* Empty Layer Needed */
- CL = CurLayer()
- Empty = EmptyLayers()
- IF (WORDS(Empty) < 1) THEN DO
- CALL Notify(1,"!Sorry!","@Need an empty layer","@for this operaton.")
- CALL Exiting
- END
- EL = WORD(Empty, 1)
-
- /* -------------------------------------------------------------------- */
- /* Default Settings */
- ReqCnt = 0 0 0 ; ReqRad = 1 1 1 ; ReqType = 1
- ReqSides = 16 ; ReqSegs = 8 ; ReqLevel = 2
-
- /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- /* Previous Settings */
-
- PrefsFileName = BEHSettingsSavedTo||MacrosName||".PLUG"
-
- IF (EXISTS(PrefsFileName)) THEN DO
- IF (~OPEN(PrefsFile, PrefsFileName, 'R')) THEN BREAK
- IF (READLN(PrefsFile) ~= MacrosName) THEN BREAK
-
- ReqCnt = READLN(PrefsFile)
- ReqRad = READLN(PrefsFile)
- ReqType = READLN(PrefsFile)
- ReqSides = READLN(PrefsFile)
- ReqSegs = READLN(PrefsFile)
- ReqLevel = READLN(PrefsFile)
-
- CALL CLOSE PrefsFile
- END
-
- /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- /* BKG Layer Settings */
- BL = CurBLayer() ; Box = BoundingBox(BL)
- PARSE var Box N X1 X2 Y1 Y2 Z1 Z2
-
- CX = (X1 / 2) + (X2 / 2)
- CY = (Y1 / 2) + (Y2 / 2)
- CZ = (Z1 / 2) + (Z2 / 2)
-
- RX = (X2 - X1) / 2
- RY = (Y2 - Y1) / 2
- RZ = (Z2 - Z1) / 2
-
- IF CX + CY + CZ ~= 0 THEN ReqCnt = CX CY CZ
- IF RX + RY + RZ ~= 0 THEN ReqRad = RX RY RZ
-
- /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- /* Current Layer Settings */
- Box = BoundingBox()
- PARSE var Box N X1 X2 Y1 Y2 Z1 Z2
-
- CX = (X1 / 2) + (X2 / 2)
- CY = (Y1 / 2) + (Y2 / 2)
- CZ = (Z1 / 2) + (Z2 / 2)
-
- RX = (X2 - X1) / 2
- RY = (Y2 - Y1) / 2
- RZ = (Z2 - Z1) / 2
-
- IF CX + CY + CZ ~= 0 THEN ReqCnt = CX CY CZ
- IF RX + RY + RZ ~= 0 THEN ReqRad = RX RY RZ
-
- /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- /* Selected Settings */
- N = XFrm_Begin()
- CALL End_All()
-
- IF N > 0 THEN DO
-
- CALL Sel_Mode(USER)
- CALL Copy()
- CALL SetLayer(EL)
- CALL Paste()
-
- Box = BoundingBox() ; PARSE var Box N X1 X2 Y1 Y2 Z1 Z2
-
- CX = (X1 / 2) + (X2 / 2)
- CY = (Y1 / 2) + (Y2 / 2)
- CZ = (Z1 / 2) + (Z2 / 2)
-
- RX = (X2 - X1) / 2
- RY = (Y2 - Y1) / 2
- RZ = (Z2 - Z1) / 2
-
- IF CX + CY + CZ ~= 0 THEN ReqCnt = CX CY CZ
- IF RX + RY + RZ ~= 0 THEN ReqRad = RX RY RZ
-
- CALL Cut()
-
- CALL SetLayer(CL)
-
- END
-
- /* -------------------------------------------------------------------- */
- /* For Information Window */
- BEHInfo = 1
- /* For Coming Back to Main Menu after Info Window */
- DO WHILE BEHInfo
-
- /* -------------------------------------------------------------------- */
- /* User Interface */
- CALL Req_Begin("Create Sphere © by Brett Hester")
-
- ReqA = Req_AddControl("Center Point",'V',1)
- ReqB = Req_AddControl("Radius",'V',1)
- ReqC = Req_AddControl("Type",'CH',"· Globe · Tess. · · Ball ")
- ReqD = Req_AddControl("",'V',0)
- CALL Req_AddControl("",'T'," Sides Segments | Level")
- ReqE = Req_AddControl("",'CH', "Information")
-
- CALL Req_SetVal(ReqA, ReqCnt)
- CALL Req_SetVal(ReqB, ReqRad)
- CALL Req_SetVal(ReqC, ReqType)
- CALL Req_SetVal(ReqD, ReqSides ReqSegs ReqLevel)
- CALL Req_SetVal(ReqE, 0)
-
- OKorCancel = Req_Post() ; IF OKorCancel = 0 THEN CALL Exiting
-
- ReqCnt = Req_GetVal(ReqA)
- ReqRad = Req_GetVal(ReqB)
- ReqType = Req_GetVal(ReqC)
- ReqSSL = Req_GetVal(ReqD)
- BEHInfo = Req_GetVal(ReqE)
-
- CALL Req_End()
-
- PARSE var ReqCnt CX CY CZ
- PARSE var ReqRad RX RY RZ
- PARSE var ReqSSL ReqSides ReqSegs ReqLevel
-
- ReqSides = TRUNC(ABS(ReqSides))
- ReqSegs = TRUNC(ABS(ReqSegs))
- ReqLevel = TRUNC(ABS(ReqLevel))
-
- X1 = CX + RX
- X2 = CX - RX
- Y1 = CY + RY
- Y2 = CY - RY
- Z1 = CZ + RZ
- Z2 = CZ - RZ
-
- IF BEHInfo = 1 THEN CALL InformationWindows
-
- /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- /* Verify Input */
- IF RX + RY + RZ = 0 THEN DO
- CALL Notify(1,"!Sorry!","@But the radius must be greater than zero.")
- ReqRad = 1 1 1
- BEHInfo = 1
- END
-
- IF ReqType = 1 THEN DO
- IF ReqSides <= 2 THEN DO
- CALL Notify(1,"!Sorry!","But at least three sides must be chosen.")
- ReqSides = 3
- BEHInfo = 1
- END
- IF ReqSegs <= 1 THEN DO
- CALL Notify(1,"!Sorry!","But at least two segments must be chosen.")
- ReqSegs = 2
- BEHInfo = 1
- END
- END
-
- IF ReqType = 2 THEN DO
- IF ReqLevel >= 6 THEN DO
- CALL Notify(1,"!Sorry!","The spheres detail level must be less than six.")
- ReqLevel = 3
- BEHInfo = 1
- END
- END
-
- END
-
- /* -------------------------------------------------------------------- */
- /* Creation Phase */
- IF ReqType = 1 THEN DO
- CALL MakeBall(RX RY RZ, ReqSides, ReqSegs, CX CY CZ)
- END
-
- IF ReqType = 2 THEN DO
- CALL MakeTesBall(RX RY RZ, ReqLevel, CX CY CZ)
- END
-
- IF ReqType = 3 THEN DO
-
- MCL = (SQRT(5)+1)/2
-
- ScaleX = RX / SQRT(MCL*MCL + 1)
- ScaleY = RY / SQRT(MCL*MCL + 1)
- ScaleZ = RZ / SQRT(MCL*MCL + 1)
-
- CALL SetLayer(EL)
-
- CALL Add_Begin()
-
- CALL Point(0.0, MCL, 1.0)
- CALL Point(0.0, -MCL, 1.0)
- CALL Point(0.0, MCL, -1.0)
- CALL Point(0.0, -MCL, -1.0)
- CALL Point(1.0, 0.0, MCL)
- CALL Point(-1.0, 0.0, MCL)
- CALL Point(1.0, 0.0, -MCL)
- CALL Point(-1.0, 0.0, -MCL)
- CALL Point(MCL, 1.0, 0.0)
- CALL Point(-MCL, 1.0, 0.0)
- CALL Point(MCL, -1.0, 0.0)
- CALL Point(-MCL, -1.0, 0.0)
- CALL Add_Polygon(1 6 5)
- CALL Add_Polygon(1 5 9)
- CALL Add_Polygon(5 11 9)
- CALL Add_Polygon(2 11 5)
- CALL Add_Polygon(2 5 6)
- CALL Add_Polygon(2 6 12)
- CALL Add_Polygon(6 10 12)
- CALL Add_Polygon(1 10 6)
- CALL Add_Polygon(1 3 10)
- CALL Add_Polygon(1 9 3)
- CALL Add_Polygon(2 12 4)
- CALL Add_Polygon(2 4 11)
- CALL Add_Polygon(3 7 8)
- CALL Add_Polygon(3 9 7)
- CALL Add_Polygon(7 9 11)
- CALL Add_Polygon(4 7 11)
- CALL Add_Polygon(4 8 7)
- CALL Add_Polygon(4 12 8)
- CALL Add_Polygon(8 12 10)
- CALL Add_Polygon(3 8 10)
-
- CALL Add_End()
-
- DO i = 1 TO ReqLevel
- CALL SubDivide(FLAT)
- END
-
- N = XFrm_Begin()
- CALL Meter_Begin N, "Spherize Process"
- DO i = 1 to N
- PARSE value XFrm_GetPos(i) with X Y Z .
- DX = X - CX
- DY = Y - CY
- DZ = Z - CZ
- D = SQRT(DX * DX + DY * DY + DZ * DZ)
- IF (D ~= 0) THEN DO
- DRadX = RX / D
- DRadY = RY / D
- DRadZ = RZ / D
-
- X = (DX * DRadX) + CX
- Y = (DY * DRadY) + CY
- Z = (DZ * DRadZ) + CZ
-
- CALL XFrm_SetPos(i, X Y Z)
- END
- CALL Meter_Step
- END
- CALL Meter_END
- CALL XFrm_END
-
- CALL Cut()
- CALL SetLayer(CL)
- CALL Paste()
-
- END
-
- CALL SaveSettings
- CALL Exiting
-
- /* -------------------------------------------------------------------- */
-
- Point:
-
- ARG X,Y,Z
- CALL Add_Point(X*ScaleX+CX Y*ScaleY+CY Z*ScaleZ+CZ)
-
- RETURN
-
- /* -------------------------------------------------------------------- */
- /* Recording Macro Settings */
- SaveSettings:
-
- IF (OPEN(PrefsFile, PrefsFileName, 'W')) THEN DO
- CALL WRITELN(PrefsFile, MacrosName)
-
- CALL WRITELN(PrefsFile, ReqCnt)
- CALL WRITELN(PrefsFile, ReqRad)
- CALL WRITELN(PrefsFile, ReqType)
- CALL WRITELN(PrefsFile, ReqSides)
- CALL WRITELN(PrefsFile, ReqSegs)
- CALL WRITELN(PrefsFile, ReqLevel)
-
- 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)
-
- 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
-