Skip to content

Instantly share code, notes, and snippets.

@nrichards
Created February 23, 2012 17:28
Show Gist options
  • Save nrichards/1893921 to your computer and use it in GitHub Desktop.
Save nrichards/1893921 to your computer and use it in GitHub Desktop.
LightWave Python - Radial Move - Auto-converted
# Radial_Move_Converted.py
# Modeler plugin
# Based entirely upon Radial_Move.ls by:
# FaLogFx http://forums.newtek.com/showthread.php?t=123806
# aka Michael Andersson micke@bmck.se
#
# Converter http://www.lucidgears.com:21134/
# Forum http://forums.newtek.com/showthread.php?t=126039
#
# WARNING: Some or all of this may be wrong! This is a learning exercise created by a newbie!
#
#
# -*- Mode: Python -*-
# -*- coding: ascii -*-
import os, sys, math
import lwsdk
__author__ = "Nick Richards"
__copyright__ = "Free"
__version__ = "0.1"
__maintainer__ = "You"
__email__ = "ncr100 on Newtek forums"
__status__ = "Uncomfortable"
__lwver__ = "11"
class Radial_Move_Converted(lwsdk.ICommandSequence):
def __init__(self, context):
super(Radial_Move_Converted, self).__init__()
self._c0 = None
self._c1 = None
self._c2 = None
self._c3 = None
self._c4 = None
self._c5 = None
self._cAuto = None
self._myDone = None
self._orgPos = None
self._undoCounter = None
def main(self):
self._undoCounter = 0
undogroupbegin()
selmode(USER)
pntCount=pointcount()
self._undoCounter = 1 + self._undoCounter #nick self._undoCounter++
editbegin()
i=1
while i<=pntCount:
self._orgPos[i]=pointinfo(points[i])
i += 1
editend()
undogroupend()
self.resetPoints()
self._myDone=False
dist=recall("DARM_Dist", 0)
centX=recall("DARM_CentX", 0)
centY=recall("DARM_CentY", 0)
centZ=recall("DARM_CentZ", 0)
plan=recall("DARM_Plane",1)
meth=recall("DARM_Method", 1)
ui = lwsdk.LWPanels()
panel = ui.create("Radial Move v1.1")
self._c0 = panel.dist_ctl("Distance")
self._c0.set_float()
ctlsep() # <-- no direct Panels conversion available
self._c1 = panel.dist_ctl("Center X")
self._c1.set_float()
self._c2 = panel.dist_ctl("Center Y")
self._c2.set_float()
self._c3 = panel.dist_ctl("Center Z")
self._c3.set_float()
self._cAuto = panel.bool_ctl("Auto Center")
self._cAuto.set_int(0) #nick (1 if else 0)
self._cAuto.set_event(self.autocenter)
ctlactive(self._cAuto, "self.toggleActive", self._c1,self._c2,self._c3)
ctlsep() # <-- no direct Panels conversion available
self._c4 = ctlchoice("Work Plane",plan,["XY","XZ","YZ","XYZ"],False) # <-- no direct Panels conversion available
ctlsep() # <-- no direct Panels conversion available
self._c5 = ctlpopup("Method", meth, ["True radial", "Equal on all axis"]) # <-- no direct Panels conversion available
self.makeIt(0)
self._c0.set_event(self.makeIt)
self._c1.set_event(self.makeIt)
self._c2.set_event(self.makeIt)
self._c3.set_event(self.makeIt)
self._c4.set_event(self.makeIt)
self._c5.set_event(self.makeIt)
panel.size_to_layout(5, 5)
if panel.open(lwsdk.PANF_BLOCKING | lwsdk.PANF_RESIZE) == 0:
ui.destroy(panel)
return lwsdk.AFUNC_OK
self.resetPoints()
return
ui.destroy(panel)
def toggleActive(self, value):
if value==1:
return False
else:
return True
def autocenter(self, value):
if value==1:
self.resetPoints()
selmode(USER)
pntCount=pointcount()
self._undoCounter = 1 + self._undoCounter #nick self._undoCounter++
editbegin()
a=lwsdk.Vector(0, 0, 0)
pInfo=pointinfo(points[1])
xlo=pInfo.x
ylo=pInfo.y
zlo=pInfo.z
xhi=pInfo.x
yhi=pInfo.y
zhi=pInfo.z
bboxlo=lwsdk.Vector(0, 0, 0)
bboxhi=lwsdk.Vector(0, 0, 0)
i=1
while i<=pntCount:
pInfo=pointinfo(points[i])
a=a + pInfo
if pInfo.x<xlo:
xlo=pInfo.x
if pInfo.y<ylo:
ylo=pInfo.y
if pInfo.z<zlo:
zlo=pInfo.z
if pInfo.x>xhi:
xhi=pInfo.x
if pInfo.y>yhi:
yhi=pInfo.y
if pInfo.z>zhi:
zhi=pInfo.z
i += 1
bboxlo=lwsdk.Vector(xlo, ylo, zlo)
bboxhi=lwsdk.Vector(xhi, yhi, zhi)
pntsCenter=(bboxlo+bboxhi)/2
editend()
self._undoCounter = 1 + self._undoCounter #nick self._undoCounter++
setvalue(self._c1, pntsCenter.x)
setvalue(self._c2, pntsCenter.y)
setvalue(self._c3, pntsCenter.z)
else:
pntsCenter=lwsdk.Vector(0, 0, 0)
def makeIt(self, value):
if self._myDone==True:
self.resetPoints()
self._undoCounter = 1 + self._undoCounter #nick self._undoCounter++
dist=self._c0.get_int() # <-- UPDATE control call to the correct value-type method
plane=self._c4.get_int() # <-- UPDATE control call to the correct value-type method
method=self._c5.get_int() # <-- UPDATE control call to the correct value-type method
centerX=self._c1.get_int() # <-- UPDATE control call to the correct value-type method
centerY=self._c2.get_int() # <-- UPDATE control call to the correct value-type method
centerZ=self._c3.get_int() # <-- UPDATE control call to the correct value-type method
undogroupbegin()
selmode(USER)
pntCount=pointcount()
if pntCount<=0:
lwsdk.LWMessageFuncs().error("No points to work with!")
return
editbegin()
i=1
while i<=pntCount:
pInfo=pointinfo(points[i])
distX=pInfo.x-centerX
distY=pInfo.y-centerY
distZ=pInfo.z-centerZ
hypoXY=math.sqrt((distX*distX) + (distY * distY))
hypoXZ=math.sqrt((distX*distX) + (distZ * distZ))
hypoYZ=math.sqrt((distY*distY) + (distZ * distZ))
hypoXYZ=math.sqrt((distX*distX) + (distY * distY) + (distZ * distZ))
if method==1:
if plane==1:
if hypoXY!=0:
delX=distX/hypoXY
delY=distY/hypoXY
delZ=0
else:
delX=0
delY=0
delZ=0
elif plane==2:
if hypoXZ!=0:
delX=distX/hypoXZ
delY=0
delZ=distZ/hypoXZ
else:
delX=0
delY=0
delZ=0
elif plane==3:
if hypoYZ!=0:
delX=0
delY=distY/hypoYZ
delZ=distZ/hypoYZ
else:
delX=0
delY=0
delZ=0
elif plane==4:
if hypoXYZ!=0:
delX=distX/hypoXYZ
delY=distY/hypoXYZ
delZ=distZ/hypoXYZ
else:
delX=0
delY=0
delZ=0
pointmove(points[i],lwsdk.Vector(pInfo.x + delX*dist, pInfo.y + delY*dist, pInfo.z + delZ*dist))
elif method==2:
movementX = pInfo.x != centerX if dist else 0 #nick centerX?dist:0
movementX = pInfo.x < centerX if -movementX else movementX #nick centerX ? -movementX : movementX
movementY = pInfo.y != centerY if dist else 0 #nick centerY?dist:0
movementY = pInfo.y < centerY if -movementY else movementY #nick centerY ? -movementY : movementY
movementZ = pInfo.z != centerZ if dist else 0 #nick centerZ?dist:0
movementZ = pInfo.z < centerZ if -movementZ else movementZ #nick centerZ ? -movementZ : movementZ
if plane==1:
movementZ=0
elif plane==2:
movementY=0
elif plane==3:
movementX=0
elif plane==4:
pass
pointmove(points[i], lwsdk.Vector(pInfo.x + movementX, pInfo.y + movementY, pInfo.z + movementZ))
i += 1
editend()
undogroupend()
store("DARM_Dist", dist)
store("DARM_CentX", centerX)
store("DARM_CentY", centerY)
store("DARM_CentZ", centerZ)
store("DARM_Plane",plane)
store("DARM_Method", method)
self._myDone=True
def resetPoints(self):
selmode(USER)
pntCount=pointcount()
self._undoCounter = 1 + self._undoCounter #nick self._undoCounter++
i=0
while i<self._undoCounter:
undo()
i += 1
self._undoCounter=0
ServerTagInfo = [
( "Python Radial_Move_Converted", lwsdk.SRVTAG_USERNAME | lwsdk.LANGID_USENGLISH ),
( "Radial_Move_Converted", lwsdk.SRVTAG_BUTTONNAME | lwsdk.LANGID_USENGLISH ),
( "Utilities/Python", lwsdk.SRVTAG_MENU | lwsdk.LANGID_USENGLISH )
]
ServerRecord = { lwsdk.CommandSequenceFactory("LW_PyRadial_Move_Converted", Radial_Move_Converted) : ServerTagInfo }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment