Hi Charles, Operator access from python is ugly at the moment, its like that room you didn't get time to tidy up before the guests (read users) arrive ;-) Since we didn't keep the door shut you can see the ugly internals. At the moment I spend more time on basic problems (except on weekends)
replies to some of your questions inline. On Sun, Mar 21, 2010 at 6:34 PM, Charles Wardlaw <cward...@marchentertainment.com> wrote: > Hi again Campbell, > >> Operators are tools and not api functions, the idea is that operators >> manipulate the context so python can be used to create macro's >> What an operator would return isnt always clear, for instance if you >> link in objects, would it contain a list of every object, scene and >> text blocked linked?? > > Perhaps. Or if you link in a scene, then the scene would be returned by > itself and would be traversable like bpy.data.scenes. > > I don't know that linking is a good example-- linking in / appending objects > of different types should, I think, have different returns. Linking in a > group for character rig linking, for instance, should return a list like the > following: > > [ 'FINISHED', group, armature1, armature2, ... armatureN, mesh1, mesh2, ... > meshN ] > > That way scripts could go in and add proxies automatically to all armature > objects that have been linked in. > > I think that returns should be opened up to discussion, to see how people > would expect things to work. Linking aside, I would like to see any add() > function return a handle for the added data. So that something like: > > ob = bpy.object.addObject(name="Foo") > ob.data = bpy.armature.addArmature(name="Bar") > > would work. I'd get rid of all the 'FINISHED' returns since it's just as > easy to check for a NoneType return, or an empty tuple. This makes sense if we deal with operators as if their main purpose is for python API access, A while ago we did talk bout ways operators might receive and return 'selection groups', Id still like to allow something like this but dont have time at the moment. >> however in some cases its really obvious that you would want to run an >> operator and get a return value, in these cases we should probably >> make RNA function calls for these operators (internally they can use >> the same C functions). >> There are also quite a few cases where the operators should be removed >> and only have API calls only. Things like "Move Modifier Up" IMHO are >> not useful as operators. >> But then we need to see how rna function calls can be done from the UI :S. > > Heh that's a question beyond me. :) Although maybe it'd be nice to provide a > function that registers a new operator based on a function and some arguments > -- something similar to how the partial() stuff works in Python. > > The main thing is to make the API easy and intuitive for real coders, but > also simple enough to understand for more casual users so that they can copy > and paste from the script log to make their macros. > > At the moment I can copy and paste from the script log, but nothing in the > commands there show how to rename objects or how to get at data. Something > as simple as modifying this call: > > bpy.ops.mesh.primitive_cube_add(view_align=False, enter_editmode=False, > location=(-0.586031, -0.0568311, 7.21605), rotation=(0, 0, 0), layer=(False, > True, False, False, False, False, False, False, False, False, False, False, > False, False, False, False, False, False, False, False, False, False, False, > False, True, False, False, False, False, False, False, False)) > > to something more readable, stripping out default value passings: > > bpy.ops.mesh.primitive_cube_add(name="MyMesh", view_align=False, > enter_editmode=False, location=(-0.586031, -0.0568311, 7.21605)) > > would make life easier on casual scripters. Now they know exactly how to > change the name just by looking at the code, and they don't get overwhelmed > looking at a really long list of things that are irrelevant. Incidentally if > a location is passed, operators should bypass the 3D cursor. Or perhaps the > functions should have a standard way of specifying at-cursor placements: > > bpy.ops.mesh.primitive_cube_add(location=(-0.586031, -0.0568311, 7.21605)) # > ignore the cursor > bpy.ops.mesh.primitive_cube_add(placement ='CURSOR') # place at cursor, > ignore location kwarg > > In this case the default could be placement='WORLD'. Then when commands show > in the script log, users would see that the location type is being modified > since the UI always places things at the cursor: > > bpy.ops.mesh.primitive_cube_add(name="MyMesh", view_align=False, > enter_editmode=False, placement='CURSOR') > > Sure, you want users to read the manual and learn how to search for the > functions they want, but there are users out there who will surprise you with > what they can do with simple copy and pastes. So far operators have been created from a user standpoint, so you get odd results when converting an operator into a python function call. Agree with some of your suggestions above however not all. Operators are a way for python to access user tools, not just a python api for all blender functionality. So why should you be able to give the name of a new object? (as an example), you dont get an option to enter a name as a user so why should python? Python just has to do what the user would do and rename after bpy.ops.mesh.primitive_cube_add(....) bpy.context.object.name = "MyMesh" Not saying a name argument is bad per se, just that it doesnt always make sense to add arguments when the data api can also modify these values after. >> We could try to make operators behave more like API functions but this >> is not a small task and not what operators were originally designed to >> do. so I think its out of the scope of 2.5 tool refactor. > > And maybe that's not the way to go. I mean, it's easy enough to have > functions with different kinds of returns, but I understand that it would go > against the original design. > > At the same time, there could be easier methods for common tasks. What those > functions need to be are anyone's guess at the moment; I'll keep notes as I > go, as should all python coders working with the Alphas. > >> Different developers wrote operators, mostly to get blender working >> again and not having read how all other operators work. When you try >> use operators from python you end up finding many problems like this. > > Ahh okay, no worries. Moving forwards it would be nice to make names agree > with each other, too. Things like bpy.ops.mesh.primitive_circle_add > bpy.ops.armature.bone_primitive_add should match. (Although I think that the > names should be shortened to addCircle and addBone respectively.) On a > personal note with regards to naming, it'd be *awesome* if the underscores > were thrown out for camelCase. Not going to get into an argument over this one, wasn't my decision but Id say we'll stick to underscores. >> for data creation and removal though we accept that operators are not >> ideal and there are existing functions for this >> # Example >> arm = bpy.data.armatures.new("MyArmature") >> obj = bpy.data.objects.new("MyObject", arm) >> scene = bpy.context.scene >> scene.objects.link(obj) > > Ahh cool, thanks for that. > > One last question: is there any particular reason why at this point objects > require edit mode on the script side? I know there's an update that's > triggered on change from edit to object modes, but to me it seems like extra > steps (not unlike how you have to leave edit mode to apply a modifier -- if > it's smart enough to tell you that, it should be smart enough to toggle edit > mode for you ^_^). Id need to see the script, it could be a bug, badly written operator, or you might run an operator that requires editmode. AFAIK automatic mode switching isn't planed. > ~ C > > PS: Thanks for fixing the help() function. > > _______________________________________________ > Bf-committers mailing list > Bf-committers@blender.org > http://lists.blender.org/mailman/listinfo/bf-committers > -- - Campbell _______________________________________________ Bf-committers mailing list Bf-committers@blender.org http://lists.blender.org/mailman/listinfo/bf-committers