On 16/01/2014 at 11:42, xxxxxxxx wrote:
User Information:
Cinema 4D Version: 15
Platform: Windows ; Mac ;
Language(s) :
---------
Yannick,
There's some typos in the examples for this class.
infopoint = viewportselect.GetPixelInfoPoint(x, y)
Should be
infopoint = ViewportSelect.GetPixelInfoPoint(x, y)
I'm also having a hard time getting ViewportSelect to work.
It's giving me this error: TypeError: 'c4d.PolygonObject' object is not iterable
ViewportSelect is working fine for me in C++. But not in Python.
Example:
#This is a python script that gets the mouse's position with a radius option for making selections
#The radius helps you to select things without having to be exactly on the thing you're trying to select
#Put the code in a pytag
import c4d
def main() :
obj = op.GetObject() #The object the pytag is on(converted to editable)
radius = 10 #Change the radius value as desired
radSqr = radius * radius
if radSqr < 1.0: return False
msg = c4d.BaseContainer()
while c4d.gui.GetInputState(c4d.BFM_INPUT_MOUSE, c4d.BFM_INPUT_MOUSELEFT, msg) :
if msg[c4d.BFM_INPUT_VALUE] == 0: break
mouse_x = msg[c4d.BFM_INPUT_X]
mouse_y = msg[c4d.BFM_INPUT_Y]
#Get the dimensions of the editor window(this includes the left and top icon borders too)
bd = doc.GetActiveBaseDraw()
dimension = bd.GetFrame()
dimension["cl"], dimension["ct"], dimension["cr"], dimension["cb"]
left = dimension["cl"]
top = dimension["ct"]
right = dimension["cr"]
bottom= dimension["cb"]
eWinWidth = right - left + 1 #The width of the editor window
eWinHeight = bottom - top + 1 #The height of the editor window
#####################################################################################
#This code block sets up the radius around the mouse's current position
#x1 is amount of screen pixels to check towards the left of the mouse
#x2 is amount of screen pixels to check towards the right of the mouse
#y1 is amount of screen pixels to check towards the top of the mouse
#y2 is amount of screen pixels to check towards the bottom of the mouse
#####################################################################################
#Gets the mouseX position - the radius value (but returns 0 if value is less than zero)
x1 = int(c4d.utils.Clamp(0, mouse_x - radius, mouse_x - radius))
#Gets the mouseX position + the radius value (but returns the screen width if value is more than the screen width)
x2 = int(c4d.utils.Clamp(mouse_x + radius, eWinWidth - 1, mouse_x + radius))
#Gets the mouseY position - the radius value (but returns 0 if value is less than zero)
y1 = int(c4d.utils.Clamp(0, mouse_y - radius, mouse_y - radius))
#Gets the mouseY position + the radius value (but returns the screen height if value is more than the screen height)
y2 = int(c4d.utils.Clamp(mouse_y + radius, eWinHeight - 1, mouse_y + radius))
#####################################################################################
vps = c4d.utils.ViewportSelect()
vps.Init(eWinWidth, eWinHeight, bd, obj, c4d.Mpoints, True, c4d.VIEWPORTSELECTFLAGS_0)
#Loop through the pixels in the screen in a matrix like fashion
#By getting the pixels using Rows & Columns using 2 for loops
for x in range(x1, x2) :
for y in range(y1, y2) :
rSqrDist = (x - mouse_x)*(x - mouse_x) + (y - mouse_y)*(y - mouse_y)
if rSqrDist > radSqr: continue
infopoint = vps.GetPixelInfoPoint(x, y)
if infopoint.op == obj:
#This code will select the points on the object if they're within the radius range
bs = c4d.BaseSelect()
bs = obj.GetPointS()
bs.Select(infopoint.i)
Any idea why it works in C++ but not in Python?
My C++ code is almost identical to this Python code. Except that it's used in a tool plugin.
-ScottA