What’s New¶
Version 1.0.10¶
Changes¶
- default testing engine changes to pytest (from nose)
- remove ply as requirement, as we have pymel.util.external.ply
- utilitytypes: make LazyLoadModule a class, not func
Additions¶
- added support for 2018
- system: add FileReference.nodes(recursive=True) flag
- Adding pm.isModified function (replacement for cmds.file(q=1, modified=1) (thanks, bob-white!)
- Added file reference remove flags (thanks, wesbondie!)
- added mergeNamespaceWithParent and mergeNamespaceWithRoot to FileReference.remove to match docs (thanks mjmvisser!)
- add kwargs support to getClassfication - issue #343 (thanks kartikg3!)
- plugins: add FileTranslator plugin helper base class to pymel.api.plugins
- util.enum: add Enum.itervalues
- maintenance: make stub generation more general-purpose; add cli
- stubs: improvements to PEP484 pyi stub file generation
- tests support pytest now
Bug Fixes¶
- fix for Attribute equality for compound multi attrs
- cmds.file(new=1, type=’mayaAscii’) will crash maya - pm.newFile() will now automatically ignore any type/typ flags to avoid this - issue #346 (thanks bob-white!)
- fix for mesh.numTriangles() raising a TypeErorr - issue #388 (thanks kartikg3!)
- fix for uitypes.Menu.getItemArray exceptions (thanks bob-white!)
- plogging: fix for setting of root logging level (thanks sdalgo!)
- fix to deal with nodes showing up multiple times in inheritance tree from cmds.nodeType (ie, aiSkyDomeLight)
- ipymel now working again with modern versions of IPython
- fix for PyNode becoming invalid if instance is reparented in some situations
- deprecated api-wrapped functions weren’t returning values
- dynamically create PyNodes from nodetypes - fixes issue with some maya node types that can’t get detected on plugin load
- fix for hasParent/hasChild/isParentOf/isChildOf with underworld nodes
- pm.parent will set PyNodes fed in to use the correct instance / parent
- better fix for mayapy segfaults (run maya.standalone.uninitialize)
- factories: some functions using MFloatPoint weren’t doing unit conversion
- some node types that are dag nodes don’t work with MFnDagNode - however, .nodeName() should still work (as that doesn’t need MFnDagNode)
- nodetypes: attempt to deal with crash with instances; get it when you add an instance of an object, and then access the old object; this doesn’t completely solve the issue, but it may be impossible to avoid completely without a patch for the underlying problem from autodesk
- fix for pm.listNamespaces() returning duplicates weed out - issue #380 (thanks mjmvisser!)
- datatypes: fix to deal with new swig-generated setattr in 2018
- factories: fix for fromInternalUnits with ref-casts
- factories: fix for isMayaType, for weird types (ie, TadskAssetInstanceNode_TdependNode, which is a parent of adskMaterial)
- factories: prefer non-deprecated api methods
- startup: fix some hangs on exit in maya 2016.51
- pymel.conf: fix name of fix_linux_mayapy_segfault
- stubs: fix for detection of os.environ
Version 1.0.9¶
Changes¶
- turn fixMayapy2011SegFault on by default, control with config
Additions¶
- added support for 2017
- Added support for PySide2
Bug Fixes¶
- arrays: fix error messages for non-existent axes (issue #369)
- general: remove hard-coded getSetAttrCmds; also fix tests (default is short attr names)
- general: Fix for showNamespaces breaking ls
- general: Mesh*.connected* raises error if list is empty (issue #367)
- general: Fix a bug where parenting to a non-existent node did not raise an error
- language: restore gFilterUIDefaultAttributeFilterList, in prep for autodesk fix
- ui: textField and text lose their type (issue #349)
Version 1.0.8¶
Changes¶
- ui: update promptForFolder to use fileDialog2
- core: don’t abort loading pymel if error adding a plugin command
- system: ensure sceneName always returns Path(‘’) for untitled scenes (this was the described behavior, but it would return e.g. /path/to/untitled.mb under some circumstances)
- system: changed FileInfo to inherit from collections.MutableMapping. This gives it a complete dictionary interface, like OptionVarDict.
- language: added support for namespace-protected MEL procedure calls. (issue #359).
- update ipymel to work with newer ipython versions
Additions¶
- added support for 2016.5
- nodetypes: added ObjectSet.forceElement
- pmcmds: give wrapped commands unique co_name, for better cProfile info
- general: added ability to pass type to addAttr. The type is automatically determined to be a dataType or an attributeType
Bugfixes¶
- general: fix for getMin/Max with multi attr elements
- general: fix listRelatives to make combo of allDescendents, shapes, noIntermediate work
- general: fix for parent(removeObject=True)
- general: fix particle attribute in ParticleComponent.attr(). (issue #350)
- general: fix spaceLocator not returning unique names. (issue #320)
- startup: fix for installation of exit handler in fixMayapy2011SegFault
- uitypes: fix for TextScrollList.selectIndexedItems / selectAll. (issue 110)
- uitypes: fix docs for MainProgressBar
- all: don’t try to UI modules when Maya runs in batch mode
- datatypes: fix for Matrix/TransformationMatrix scale/rotate properties
- nodetypes: fix Shape.getTransform() to return shape node’s transform. (issue #311)
- utils: fix runOverriddenModule() to use os.stat compare in case of Windows OS, where samefile would error. (issue #358).
Version 1.0.7¶
Changes¶
- general: MultiAttrs now support __delitem__
- uitype: use PySide in toQtObject methods if no PyQt
- language: added mel.globals alias for melGlobals
- core: improve API undo callbacks
- system: saveFile resets name if filename is messed up
- system: make loadReference give more informative error if ref not loaded
- system: optimized FileReference.__init__
- system: switched file cmd used by iterReferences for more stable referenceQuery
- docs: improved the look of the docs
- util.arrays: Array objects now explicitly unhashable, added totuple
- utils.path: allow the pattern argument for various methods to take a compiled regular expression pattern.
Additions¶
- added support for 2016
- language: added Env.playbackTimes convenience property for getting/setting all timeline values at once
- allapi: added example usage to SafeApiPtr
- general: added Attribute.iterDescendants
- system: added mode and caseSensitive args to Translator.fromExtension
- nodetypes: added topLevel and descendants kwargs to DependNode.listAttr
- nodetypes: added Camera.isDisplayGateMask method
- nodetypes: added closestPolygon keyword arg to getUVAtPoint
- uitypes: added toPySide* functions for casting maya UI strings to PySide objects
- pymel.conf: added option to source initialPlugins.mel
- pymel.conf: added option to prefer PyQt4 or PySide
- util.arguments: added support for sets, useChangedKeys to compareCascadingDicts
- util.common: added inMaya() func
- stubs: make stub Mel.__getattr__ accept anything
- stubs: added PySide stubs
Bugfixes¶
- system: fixed bug with referenceQuery which occured when editStrings and liveEdits flags are True
- system: fixed bug with ReferenceEdit.remove() where self.rawEditData was referred to as a method instead of a property.
- ipymel: pressing ctrl-c no longer quits maya
- logging: fixed bug preventing logging menus from displaying
Version 1.0.6¶
Non-Backward Compatible Changes¶
- joint.limitSwitchX/Y/Z: now return [bool, bool] when queried, just like the mel command, to indicate whether the limit is on for the min/max
- joint.radius: now returns the float radius, instead of [radius]
Changes¶
- general: addAttr/setEnums now accept strings, lists, or dicts for setting enums
- other: cast NameParser arguments to unicode
- factories: issue deprecation warning for deprecated functions only when they’re actually used
Additions¶
- added support for 2015
- added (functional) namespace method to Attribute, Component
- general: added mute accessors to Attributes
- system: provide ReferenceEdit.rawEditData property for getting faster unparsed access to reference edits
- nodetypes: added stripUnderworld flag to DependNode.nodeName(), and default it to true. This removes the underworld prefix (the node prior to ->) from nodeName().
- ipymel: update for ipython 0.11
- util.arguments: compareCascadingDicts can show which keys have been added (as opposed to just changed)
- system: added workspace.expandName
Bugfixes¶
- general: for the keyframe command, the upper / lower limits substituted in for the “index” flag, when no upper/lower limits were given, are now correct; formerly, the behavior of index=”:” would vary depending on where (in time) the first and last keyframes were
- general: timerange flags (ie, keyframe(time=...), findKeyframe(time=...), etc) now provide correct results when no upper/lower limits given; formerly, the time=”:” would vary depending on if / which objects were selected
- animation: Joint.angleX/Y/Z and Joint.stiffnessX/Y/Z now work
- nodetypes: Container.getParentContainer, Container.getRootTransform, and Character.getClipScheduler now all return None instead of raising a runtime error if no object was found
- system: FileReference.fullNamespace and iterReferences/listReferences with namespaces=1 now handle situations where reference node itself is in a non-root namespace correctly
- general: when instantiating PyNode from an MPlug, to get the PyNode for the node, create from the underlying mobject, not the name (which may not be unique)
- animation: fix for Joint.getAngleX/Y/Z, .getStiffnessX/Y/Z; joint.radius no longer returns list
- mel2py: numerous fixes / tweaks
- system: handle situations where reference node itself is in a non-root namespace
- system: FileReference.nodes fix when reference contains no nodes
- general: duplicate - special-case workaround for duplicating a single underworld node with no children
- general: fix for duplicate + non-unique names
- general: duplicate - workaround for bug introduced in 2014
- nodetypes: fix for getAllParents with underworld nodes
- Upgrade path.py to version 5.0 from github (https://github.com/jaraco/path.py). This fixes an issue with Maya2014, python 2.7.3, and Windows where path().isdir() raised an error.
- general: cmds.group returns unique name in maya > 2014
- fix for virtual classes
- versions: parsing for ‘Preview Release’ format - from Dean Edmonds
Version 1.0.5¶
Non-Backward Compatible Changes¶
- DagNode.isVisible: has a new flag, checkOverride, which is on by default, and considers visibility override settings
- referenceQuery/FileReference.getReferenceEdits: if only one of successfulEdits/failedEdits is given, and it is false, we now assume that the desire is to return the other type (and set that flag to true); formerly, this would result in NO edits being returned
- parent no longer raises an error if setting an object’s parent to it’s current parent; this makes it behave similarly to the mel command, and to DagNode.setParent
- renameFile now automatically sets the ‘type’ if none is supplied (helps avoid renaming a file to ‘foo.ma’, then saving it as ‘mayaBinary’)
- general: 1D components have index() method: can no longer use string.index()
- uitypes: make PyUI.parent return None instead of PyUI(‘’)
Changes¶
- for maya versions >= 2012, creation of “ghost” plugin nodes no longer needed
- general: change to Component to speed up len(PyNode(‘pCube1Shape’).vtx)
- general: parent and DagNode.setParent now share common codebase
- general: when find unknown component type, default to just printing a warning and returning generic Component
- general: demoted raiseLog warning about unknown component type to DEBUG
- general: added uniqueObjExists function
- general: speedup for string representation of complete MeshVertexFace
- general: made listRelatives/listHistory/listConnections have same behavior for None and empty list
- system: clarified doc not about removeReferenceEdits not erroring
- system: FileReference.replaceWith - enable kwargs
- system: renameFile automatically sets type
- system: changed referenceQuery so when only one of successful/failed passed, other flag is opposite value
- language: make catch take args/kwargs
- nodetypes: attrDefaults - use MNodeClass in versions >= 2012, _GhostObjMaker otherwise
- nodetypes: Transform.setRotation now takes args as EulerRotation, Quaternion, or iterable of 3 or 4 elements
- nodetypes: isVisible checks overrideVisibility
- stubs: catch more dict-like-objects; special case exclude for maya.precomp.precompmodule
- stubs: create dummy data objects when safe; better handling of builtins
- stubs: use static code analysis to decide whether to include a child module in a parent module’s namespace
- stubs: better representations for builtin data types
- stubs: get all names in module, better ‘import *‘ detection
- plogging: added raiseLog func/method
- plogging: small tweaks to way default ERRORLEVEL is set, and raiseLog is added onto loggers
- ipymel: make sure stuff imported into global namespace in userSetup.py is available in IPython
Additions¶
- nodetypes: added stripNamespace option to DependNode.name
- general: disconnectAttr - support for disconnecting only certain directions
- general: MeshFace - added numVertices as alias for polygonVertexCount
- general: added DiscreteComponent.totalSize method
- general: added ParticleComponent class
- other: added DependNodeName.nodeName (for compatibility with DagNodeName)
- nodetypes: added DagNode.listComp
- datatypes: added equivalentSpace
- utilitytypes: proxyClass - added module kwarg to control __module__
- system: added FileReference.parent()
- system: listReferences - added loaded/unloaded kwargs
- system: added UndoChunk context manager
- system: Namespace.remove/.clean - added reparentOtherChildren kwarg
- system: added support for regexps to path.listdir/.files/.dirs
- system: added successful/failedEdits flags to FileReference.removeReferenceEdits
- windows: confirmBox - added returnButton kwarg to force return of button label
- plugins: added an example for creating plugin nodes
- util.enum: added Enum.__eq__/__ne__
- py2mel: added include/excludeFlagArgs
- system: added proper hash function for FileReference
Bugfixes¶
- general: fix for potential crashes due to using cached/invalid MFn
- general: fix pm.PyNode(‘pCube1.vtx[*]’)[2] to work like like pm.PyNode(‘pCube1’).vtx[2]
- general: fix for HashableSlice comparison (fixes bug with component indexing)
- general: Component - fixes for complete-component shortcut don’t use with empty meshes don’t use for subd components (including SubdUV) use ffd1LatticeShape.pt[*], not .pt[*][*][*]
- general: SubdEdge - hack to avoid a maya bug which causes crash
- language: MelGlobal.initVar now initializes in mel
- language: remove annoying callback error spam; instead make info available in a log from Callback.printRecentError()
- uitypes: fix for 2012 SP2 issue with objectTypeUI not working for windows with menu bars
- nodetypes: Transform.setRotation - fix for setting with EulerRotation object and non-standard rotation order or unit
- nodetypes: fix for ObjectSet.__len__
- nodetypes: AnimLayer.getAttribute - query dagSetMembers.inputs() to get full/unique path
- nodetypes: fix typo in name of NurbsCurve/Surface.controlVerts (not conrolVerts)
- core: _pluginLoaded - added fix for addPluginPyNodes triggered on reference load (fix for 2012+ only)
- core: fix erroneous ‘could not find callback id’ warnings
- utilitytypes: universalmethod now has doc pulled from original func
- util.conditions: bugfix for __ror__, added __str__
- allapi: toApiObject - low-level fix for Nucleus attributes
- startup: don’t use fixMayapy2011SegFault in >= 2013, seg fault was addressed by Autodesk
- stubs: fixes for objects with multiple aliases in a module
- py2mel: bugfixes, bugfix for excludeFlagArgs
Version 1.0.4¶
Changes¶
- core.uitypes: improved AETemplates to work when created from within a scripted plugin
- tools.mel2py: now output exact same filename as input on Windows
- core.nodetypes: Transform.getRotation - can get as euler or quaternion
- extras: improved reliability of stub files (for pydev, wing, etc)
- core: doing select([], replace=True) should clear selection
- api.allapi: replace toMObjectName with MObjectName
- core: namespace - root option is now False (for backward compatibility)
- core: MeshVertex.setColors - set colors for all verts in MeshVertex
- core: re-implement noIntermediate flag to listRelatives
- plogging: PYMEL_LOGLEVEL env var now sets minimum level for all pymel loggers
- core: use new 2012 pluginInfo flags for getting more command types
- core.windows: PopupError can now raise another exception type
- examples: update customClasses.py example
Additions¶
- util.path: added boolean normcase keyword arg to path.canonicalpath()
- api.plugins: added in classes for all MPxNode classes and methods for querying class / MPx to MPx enum mappings
- api.plugins: added new overridable methods which generate node callbacks: timeChagned, forcedUpdate, nodeAdded, nodeRemoved, preConnectionMade
- versions: added maya2012 hotfix 1,2,3,4
- core: Attribute.setDirty / evaluate
- core: DependNode.rename() now supports pyMel unique flag preserveNamespace
- core: added check to ensure name passed to DependNode.rename() is shortname
- core: implemented DependNode.rename() flags: i.e. ignoreShape can now be used
- core.uitypes: added Layout.findChild() which takes the shortname of a child as a string and returns the PyUI object
Bugfixes¶
- mayautils: fix so recurseMayaScriptPath, when given explicit roots, doesn’t wipe out old paths
- core: fixed bug where __pymelUndoNode was created in non root namespace
- tools.pymelScrollFieldReporter: use mel2py.melparse (issue 247)
- core: fixed FileReference.importContents(removeNamespace=True)
- core: _pluginLoaded callback now correctly triggered by importing
- core: fix promptForPath doesn’t work for mode 1/100 due to testing for the existance of the path.
- core.nodetypes: fix for DependNode.rename(preserveNamespace=True) when node in root namespace
- core.nodetypes: fixed bug with RenderLayer.added/removeAdjustments
- core.nodetypes: fix for DagNode.getAllParents (and test)
- core.nodetypes: fix for DependNode.hasAttr(checkShape=False)
- core.nodetypes: fix for AnimCurve.addKeys (issue 234)
- internal.startup: fix for error message when fail to import maya.cmds.about
- core: fixed addAttr(q=1, dataType=1) so it does not error if non-dynamic attr
- core: pythonToMelCmd - fixed bug when flagInfo[‘args’] was not a class
- core: pythonToMelCmd - fix for flags where numArgs > 1
- maya.utils: formatGuiException - fix for, ie, IOError / OSError
- updated 2012 caches to fix issue 243
Version 1.0.3¶
Changes¶
UI classes that have ‘with’ statement support now set parent back to previous ‘with’ object if there are nested with statements; if not in a nested with statement, resets parent back to UI element’s parent (or more precisely, the first element that is not a rowGroupLayout element)
with OptionMenuGrp() will set parent menu properly
‘Unit’ support for Quaternion objects is now removed (as it doesn’t make any sense)
can now pass in PyNode class objects to functions / methods that expect a mel node class name - ie:
listRelatives(allDescendents=True, type=nt.Joint)
is equivalent to:
listRelatives(allDescendents=True, type=’joint’)
other: NameParser(dagObj) now always gives a DagNodeName even if shortName has no |
Non-Backward Compatible Changes¶
- PyNode(‘*’) - or any other non-unique name - now returns an error use ls(‘*’) if you wish to return a list of possible nodes
- By default, the root pymel logger outputs to sys.__stdout__ now, instead of sys.stderr; can be overriden to another stream in sys (ie, stdout, stderr, __stderr__, __stdout__) by setting the MAYA_SHELL_LOGGER_STREAM environment variable
- skinCluster, tangentConstraint, poleVectorConstraint, and pointOnPolyConstraint commands now return a PyNode when creating, instead of a list with one item
- skinCluster command / node’s methods / flags for querying deformerTools, influence, weightedInfluence now return PyNodes, not strings
- Attribute.elements now returns an empty list instead of None
- general: Attribute.affects/affected return empty list when affects returns None
- setParent returns PyUI / None; menu(itemArray) returns [] for None
- general: make Attribute.elements() return empty list for None
- shape attribute lookup on all child shapes (like mel does)
Additions¶
- Shape.setParent automatically adds –shape flag
- nodetypes: added isVisible
- added MGlobal.display* methods to pymel.core.system namespace
- other: added NameParser.stripGivenNamespace()
- language: OptionVarList has more helpful error message when __setitem__ attempted
- nodetypes: getSiblings can now take kwargs
- Added MainProgressBar context manager
- Added isUsedAsColor method to Attribute class
- Added wrapper for listSets function
- Added method listSets to PyNode class
- Added a folderButtonGrp
- system: added Namespace.move
- system: added Namespace.listNodes
- mel2py: python mel command now translated to pymel.python (ie, maya.cmds.python)
- general: added Attribute.indexMatters
- language: added animStart/EndTime to Env
- system: added in a ‘breadth’-first recursive search mode to iterReferences
- general: added ability to set enum Attributes with string values (issue 35)
- plogging: set logging level with PYMEL_LOGLEVEL env var
- Added isRenderable() method to object set.
- deprecate PyNode.__getitem__
- mayautils: executeDeferred now takes args, like maya.utils.executeDeferred
Bugfixes¶
- py2mel failing with functions that take *args/**kwargs
- eliminated / fixed various ‘warning’ messages on pymel startup
- MayaNodeError / MayaAttributeError not being raised when a node / attribute not found
- some maya cmds were not handling ‘stubFunc’ correctly
- renderLayer.listAdjustments() was not functioning
- MainProgressBar fixed
- language: OptionVarList __init__ no longer raises deprecation warning
- listSets() throws away non-existant ‘defaultCreaseDataSet’ that maya.cmds.listSets() returns
- fix for dealing with maya bug where constraint angle offsets always returned in radians (but set in degrees)
- fixes for incorrect formatting of error strings in some cases
- fixes for unloading of commands/nodetypes when plugins unloaded (and pymel.all was imported first)
- miscellaneous documentation fixes
- fix for mayautils.executeDeferred when invoked with args
- fix for Attribute.getAllParents()
- fix for aliased multi/compound attributes
- fix for Attribute.isSettable with multi/compound attributes
- fix for Attribute.exists with multi/compound attributes
- fix for Attribute.type with multi/compound attributes dynamic attributes
- fix for published container node attributes / aliases
- fixes for plugin callback failing when plugin has uncreate-able nodes
- fixes for multiple iterators of a mutli-attribute not being independent
- fix for MeshVertex.setColor
- fix for MeshVertex.isConnectedTo
- fix for MeshVertex.getColor
- fix for MeshEdge.isConnectedTo
- fix for MeshFace.isConnectedTo
- fix for plogging handling case where various env. variables exist, but are empty
- Fix for Layout.children() Layout.children() now returns empty list if layout has no kids intead of raising error.
- listConnections: fix so rotatePivot always Attribute (not component)
- uitypes: bugfixes to AETemplates. corrected UITemplate to represent an existing uiTemplate if instantiated with the name of an existing template
- nodetypes: fixed a bug where Transform.setScalePivot was internally using MFnTransform.setScalePivotTranslation
- fixed a bug in pythonToMel where python booleans were not converted to integer. this caused the Mel class to not work properly with booleans.
- core.general: fix a bug with sets command where noWarnings was interpreted as a set flag, instead of a boolean flag
- Namespace: fix for getParent()
- general: various attr name fixes (stripping of [-1] indices, etc)
- nameparse: enable parsing of [-1] indices (for attributes)
- nodetypes: enable parsing of [-1] indices (for attributes)
- nodetypes: setParent to current parent no longer errors
- util.enum: fix for repr of EnumDict
- fixes for referenceQuery
- attr.exists() should return False if the node no longer exists
- datatypes: fixed bug to allow Point * FloatMatrix
- general: bugfix for Attribute.attrName
- utilitytypes: EquivalencePairs.get now correctly retrieves value=>key
- nodetypes: fixed setParent(world=1) bug
- uitypes: Fix issues with the popup and with support.
- pm.mel.command translation would fail with no-arg bool flags (like -q, -e)
- language: mel command translation makes no assumptions for unknown commands; None is translated to empty string, not ‘None’
- bugfix for uiTemplate(exists=1)
- general: Attribute.elements() now correctly works with array and element plugs
- fix get/set rotation by using eulerRotation
- startup: changes to fix issues with maya -prompt and plugins loading pymel
- fix for TransformationMatrix.get/setRotation, removed Quaternion units
- datatypes: fixes for EulerRotation
- fix for ui heights for pymelControlPanel
- uitypes: bugfix for with statement parent setting on exit
- mesh: fixes to allow creating component objects for empty meshes (ie, createNode(‘mesh’).vtx)
- mesh: made more num* functions work with empty meshes
- core.general: fix for move with no object
- datatypes: fix for EulerRotation comparison/len
- fix for menu(‘someOptionMenu’)
- FileReference: initialize correctly from a path
- windows: bugfix - informBox wasn’t using ‘ok’ kwarg
- plogging: bugfix for 182 - crash due to creating loggers as iterating over dict
- arrays: fix for dot/outer product error messages (issue 158)
- fix for ‘no useName’ and MfknSkinCluster.setBlendWeights warnings on startup
- Fixed language import in MainProgressBar
- fix for Issue 216: renderLayer.listAdjustments()
- docfix for issue 192
- fix for constraint angle offset query always being in radians
- nodetypes: fix for multi/compound alias attrs
- nodetypes: fixes for published container node attributes / aliases
- general: made attribute iterator independent
- general: fix for isSettable with multi/compound attributes
- general: fix so getAllParents doesn’t return orig object
- general: fix for Attribute.exists with multi/compound attrs
- Attribute.type() now works with multi/compound, dynamic attrs
- fixes for mesh components
Version 1.0.2¶
Changes¶
- rolled back listConnections() change from 1.0.1
commands wrapped to return PyNodes¶
- container()
Additions¶
- added functions for converting strings to PyQt objects: toQtObject(), toQtLayout(), toQtControl(), toQtMenuItem(), toQtWindow()
- added method for converting PyMEL UI objects to PyQt objects: UI.asQtObject()
Bugfixes¶
- fixed a bug where nt.Conditions() created a script condition
Version 1.0.1¶
Changes¶
- listConnections: when destination is shape, always returns shape (not transform)
- select([]) only clears selection if mode is replace
- deprecated Attribute.firstParent()
Additions¶
- mel2py: now does packages/subpackages for recursed mel subdirectories
- added various dict-like methods to OptionVarDict
- added new EnumDict support which Attribute.getEnum returns
- added support to getAttr() / Attribute.get() for getting message attributes, which are returned as DependNodes
- added core.system.saveFile()
- added pymel.versions.is64bit()
- added new directory helpers to mayautils: getMayaAppDir(), getUserPrefsDir(), and getUserScriptsDir()
- added DependNode.longName(), DependNode.shortName(), and DependNode.nodeName() for easy looping through mixed lists of DependNodes and DagNodes
- added FileInfo.__delitem__()
- added DependNode.deleteAttr()
Bugfixes¶
- unloading plugins no longer raises an error
- python AE templates were not being found. fixed.
- fixed a bug in api wrap, where MScriptUtil was not allocating space
- fixed a bug with Transform.setMatrix()
- pymel.versions.installName() is more reliable on 64-bit systems, which were sometimes detecting the installName incorrectly
- Attribute('mytransform.scalePivot') now returns an the scalePivot attribute
- getAttr() / Attribute.get() bugfix with multi-attr
- nodetypes: fixed bug 172 where nested selection sets were raising an error when getting members
- getPanel now always return panels
- uitypes: all panel classes now properly inherit from Panel
- fixed some keywords that had been mistakenly refactored
- core.general: fixed a bug where dependNodes were not returned when duplicated
Version 1.0.0¶
Non-Backward Compatible Changes¶
- pymel no longer has ‘everything’ in namespace - use pymel.all for this
- pymel.core.nodetypes now moved to it’s own namespace
- pymel.mayahook.Version functionality moved to pymel.versions module. to compare versions, instead of Version class, use, for example, pymel.versions.current() >= pymel.versions.v2008
- pymel.mayahook.mayautils.getMayaVersion() / getMayaVersion(extension=True) replaced with pymel.versions.installName()
- pymel.mayahook.mayautils.getMayaVersion(extension=True) replaced with pymel.versions.shortName()
- removed 0_7_compatibility_mode
- removed deprecated and inapplicable string methods from , base of all PyNodes:
- removed Smart Layout Creator in favor of ‘with’ statement support
- DagNode.getParent() no longer accepts keyword arguments
- Renamed UI base class to PyUI
- sceneName() now returns a Path class for an empty string when the scene is untitled. this makes it conform more to cmds.file(q=1, sceneName=1)
- replaced listNamespace with listNamespace_new from 0.9 line
removed deprecated methods¶
- Attribute: __setattr__, size
- Camera: getFov, setFov, getFilmAspect
- Mesh: vertexCount, edgeCount, faceCount, uvcoordCount, triangleCount
- SelectSet: issubset, issuperset, update
- Mesh components: toEdges, toFaces, toVertices
- ProxiUnicode: __contains__, __len__, __mod__, __rmod__, __mul__, __rmod__, __rmul__, expandtabs, translate, decode, encode, splitlines, capitalize, swapcase, title, isalnum, isalpha, isdigit, isspace, istitle, zfill
Features¶
- added support for creation of class-based python Attribute Editor templates, using ui.AETemplate
- added ‘with statement’ compatibility to UI Layout and Menu classes
- added the ability to generate completion files for IDEs like Wing, Eclipse, and Komodo
Tools¶
- ipymel: added colorization to dag command
- py2mel: now works with lambdas and methods. new option to provide a list or dictionary of mel types.
- re-added missing scriptEditor files
- added upgradeScripts, a tool for converting 0.9 scripts to be 1.0 compatible
Changes¶
- moved functions for working with the shell into util.shell
- split out ui classes from core.windows into core.uitypes for lazy loading
- for versions >= 2009, use open/close undo chunks instead of mel hack to ensure that an entire callback can be undone in one go
- improved lsUI()
- moved component types out of nodetypes and into general
- __repr__ for nodetypes, uitypes, and datatypes reflect their location so as not to cause confusion. using short module names nt, ui, and dt.
- caches are now compressed for speed
- allow setting pymel.conf location via environment variable PYMEL_CONF
- DagNode.getBoundingBox() now allows you to specify space
- ensured that the ‘name’ flag for surface and curve operates on shape as well
- changes to allow myCube.vtx[1,3,5]
- commands wrapped by pmcmds that raise a standard TypeError for a non-existent object will now raise a MayaObjectError
- simplified getParent code on Attribute and DagNode to improve function signatures.
- fixed a bug with ls(editable=1)
- fixed a bug with ObjectSets containing DagNodes
- callbacks: extra debug information is printed in tracebacks
commands wrapped to return PyNodes¶
- skinCluster(q=1, geometry=1)
- addAttr(q=1, geometry=1)
- addDynamic()
- addPP()
- constraint()
- animLayer()
- annnotate()
- arclen()
- art3dPaintCtx()
- artAttrCtx()
- modelEditor(q=1,camera=1)
- dimensionShape()
Additions¶
- added TwoWayDict/EquivalencePair to utilitytypes
- added preorder(), postorder(), and``breadth()`` functions in util.arguments, which have more intuitive arguments
- added new Layout class that all layouts inherit from
- added UITemplate class
- added usable __iter__ to workspace dict / file dict objects
- added two tier setup scripts for maya (user/site) just like with python. This new siteSetup.py is intended for studio setup of maya and reserved userSetup.py for user level scripts.
- added a partial replacement maya package with a logger with a shell and gui handler qne changed plogging to use the new default maya logger
- added setAttr/getAttr support for all numeric datatypes, along with tests
- added Transform.getShapes() for returning a list of shapes
- added FileReference comparison operators
- added DependNode.longName(stripNamespace=False,level=0)
- added SkinCluster.setWeights()
- added AnimCurve.addKeys()
- added regex flag to ls command
- added FileInfo.get()
- added util.common.subpackages() function for walking package modules
- added util.conditions.Condition class for creating object-oriented condition testing
- pymel.conf: added a fileLogger
- added Path.canonicalpath() and Path.samepath()
- mel2py: added command-line flags, ability to recurse
added support for attribute aliases¶
- DependNode.attr() now casts aliases to Attributes properly (PyNode already does)
- added DependNode.listAliases()
- added ‘alias’ keyword to DependNode.listAttr()
- added Attribute.setAlias(), Attribute.getAlias()
Bugfixes¶
- fixed instantiation of PyNode from MPlug instance
- fixed a bug where Maya version was incorrectly detected when Maya was installed to a custom location
- fixed bug where wrap of function which took multiple refs all pointed to same MScriptUtil
- fixed wrapping of unsigned ptr api types
- fixed negative comp indices
- mel2py: bugfix with mel2pyStr()
Version 0.9.2¶
Changes and Additions¶
- added support for 2010 and python 2.6
- added basic support for all component types
- added a ‘removeNamespace’ flag to FileReference.importContents()
- added support for open-ended time ranges for command like keyframes (Issue 82)
- enhanced keyframe function: if both valueChange and timeChange are queried, the result will be a list of (time,value) pairs
- added ability to pass a list of types to ls ‘type’ argument, as you can with listRelatives
- added checkLocalArray and checkOtherArray arguments to Attribute.isConnectedTo which will cause the function to also test mulit/array elements
- improved core.language.pythonToMel() reliability on lists
- improved custom virtual class workflow
- added functionality to pymel.tools.py2mel for dynamically creating MEL commands based on python functions/classes
- added a new module pymel.api.plugins for working with api plugins in a more reasonable and automated fashion
- updated eclipse integration documentation
easy_install improvements¶
- setup now copies over a readline library for 2010 OSX using readline.so from toxik which is more compatible
- changed ipymel to be part of the default install instead of an extra package
- fixed interpreter path of ipymel and other executable scripts on OSX
- setup now detects and fixes invalid python installations on Linux which previously caused distutils and thus setup.py to fail
Bugfixes¶
- importFile(), createReference(), loadReference(), and openFile() now return PyNodes when passed returnNewNodes flag (Issue 85)
- fixed rare bug with Vista where platform.system was failing during startup (Issue 87)
- fixed a bug with plugin loading to intelligently handle when callback does not get a name
- fixed optionMenu and optionMenuGrp to return empty lists instead of None
- restored core.other.AttributeName.exists() method
- fixed a bug in 0.7_compatibility_mode
- fixed minor bug in listRelatives()
- fixed a bug where curve command was returning a string instead of a PyNode (Issue 96)
Version 0.9.1¶
Changes and Additions¶
- new feature: virtual subclasses. allows the user to create their own subclasses which are returned by PyNode
- added v2009sp1 and v2009sp1a to Version
- changed MelGlobals.__getitem__ to raise a KeyError on missing global, instead of a typeError
- util.path now supports regular expression filtering in addition to globs.
- moved moduleDir() from util to mayahook since it is explicitly for pymel.
- ensured that all default plugins are loaded when creating the api cache so that we can avoid calculating those each time the plugins are loaded
- added a new errors flag to recurseMayaScriptPath for controlling how to handle directory walking errors: warn or ignore
- moved pwarnings to ensure that pymel.util is completely separated from maya
- adding new sphinx documentation. modifying source docstrings where necessary.
- setParent now allows None arg to specify world parent
- adopted a standard setuptools-compliant package layout, with pymel as a subdirectory of the top level
- forced line numbers on for Mel.eval
- changed ipymel to use $MAYA_LOCATION to find mayapy instead of /usr/bin/env
- changed datatypes examples to demonstrate the necessity to include a namespace
- added groupname, get_groupname, and chgrp to Path class for dealing with unix groups as strings instead of as gid’s
- added alias path.Path for path.path so as to follow PEP8
- added a new option to pymel.conf to allow disabling of mel initialization in standalone mode.
- added ability to set logger verbosity using PYMEL_LOGLEVEL environment variable. great for quick testing.
Bugfixes¶
- fixed a bug in undoInfo()
- fixed a bug that was breaking mel2py
- fixed a bug with logging that was locking it to INFO level. INFO is now the default, but it can be properly changed in pymel.conf
- fixed input casting of datatypes.Time
- bug fixes in error handling within path class
- fixed issue 65: DependencyNode.listAttr() broken
- made sure NameParse objects are stringified before fed to MFnDependencyNode.findPlug()
- added a few more reserved types so as to avoid creating them, which can lead to crashes on some setups
- fixed issue 66 where nodes could be created twice when using PEP8 style class instantiation: pm.Locator
- path.walk* methods now properly prune all directories below those that do not match the supplied patterns
- maya bug workaround: changed pluginLoaded callback to API-based for 2009 and later
- fixed bug in hasAttr()
- removed bug in arrays.dot where incorrect duplicate definition was taking precedence
- fixed bug in PyNode.__ne__() when comparing DagNodes to DependNodes
- fixed Issue 72: cannot select lists of components
- fixed bug with startup on windows (backslashes not escaped)
- fix for Component('pCube1.vtx[3]')
- fix for nurbsCurveCV(‘nurbsCircle1’) failing
- pythonToMel and Mel now properly convert datatypes.Vectors to mel vectors ( <<0,0,0>> ). MelGlobals now returns datatypes.Vectors
- fixed bug with duplicate(addShape=1)
- fixed a bug where selectionSets can’t be selected
- fixed a bug with sets() when it returns lists
- fixed issue 76, where non-unique joint names were returned by pymel.joint and thus were unsuccessfully cast to nodetypes.Joint
- fixed issue 80, regading incorrect association of nodetypes.File with cmds.file.
- fixed a bug in connectAttr() that was preventing connection errors from being raised when the force flag was used