Hello
I'm Enrique
Summary
Full-stack software engineer and designer.
Nerding out about design, tech, real estate, housing, and cities.
Living in Zürich, Switzerland.
Say hi. Write me an email or dm me on Twitter.


BITCrashManagerDelegate Protocol Reference
| Conforms to | NSObject |
| Declared in | BITCrashManagerDelegate.h |
Overview
The BITCrashManagerDelegate
formal protocol defines methods further configuring
the behaviour of BITCrashManager
.
Tasks
Additional meta data
Alert
-
– crashManagerWillShowSubmitCrashReportAlert:
-
– crashManagerWillCancelSendingCrashReport:
-
– crashManagerWillSendCrashReportsAlways:
Networking
Instance Methods
applicationLogForCrashManager:
Return any log string based data the crash report being processed should contain
- (NSString *)applicationLogForCrashManager:(BITCrashManager *)crashManager
Parameters
- crashManager
The
BITCrashManager
instance invoking this delegate
Declared In
BITCrashManagerDelegate.h
crashManager:didFailWithError:
Invoked after sending crash reports failed
- (void)crashManager:(BITCrashManager *)crashManager didFailWithError:(NSError *)error
Parameters
- crashManager
The
BITCrashManager
instance invoking this delegate
- error
The error returned from the NSURLConnection call or
kBITCrashErrorDomain
with reason of typeBITCrashErrorReason
.
Declared In
BITCrashManagerDelegate.h
crashManagerDidFinishSendingCrashReport:
Invoked after sending crash reports succeeded
- (void)crashManagerDidFinishSendingCrashReport:(BITCrashManager *)crashManager
Parameters
- crashManager
The
BITCrashManager
instance invoking this delegate
Declared In
BITCrashManagerDelegate.h
crashManagerWillCancelSendingCrashReport:
Invoked after the user did choose NOT to send a crash in the alert
- (void)crashManagerWillCancelSendingCrashReport:(BITCrashManager *)crashManager
Parameters
- crashManager
The
BITCrashManager
instance invoking this delegate
Declared In
BITCrashManagerDelegate.h
crashManagerWillSendCrashReport:
Invoked right before sending crash reports will start
- (void)crashManagerWillSendCrashReport:(BITCrashManager *)crashManager
Parameters
- crashManager
The
BITCrashManager
instance invoking this delegate
Declared In
BITCrashManagerDelegate.h
crashManagerWillSendCrashReportsAlways:
Invoked after the user did choose to send crashes always in the alert
- (void)crashManagerWillSendCrashReportsAlways:(BITCrashManager *)crashManager
Parameters
- crashManager
The
BITCrashManager
instance invoking this delegate
Declared In
BITCrashManagerDelegate.h
crashManagerWillShowSubmitCrashReportAlert:
Invoked before the user is asked to send a crash report, so you can do additional actions. E.g. to make sure not to ask the user for an app rating :)
- (void)crashManagerWillShowSubmitCrashReportAlert:(BITCrashManager *)crashManager
Parameters
- crashManager
The
BITCrashManager
instance invoking this delegate
Declared In
BITCrashManagerDelegate.h
userEmailForCrashManager:
Return the users email address that should be send along each crash report (Deprecated: Please use BITHockeyManagerDelegate userEmailForHockeyManager:componentManager:
instead)
- (NSString *)userEmailForCrashManager:(BITCrashManager *)crashManager
Parameters
- crashManager
The
BITCrashManager
instance invoking this delegate
Discussion
Warning: When returning a non nil value, crash reports are not anonymous any more and the alerts will not show the “anonymous” word!
Declared In
BITCrashManagerDelegate.h
userNameForCrashManager:
Return the user name or userid that should be send along each crash report (Deprecated: Please use BITHockeyManagerDelegate userNameForHockeyManager:componentManager:
instead)
- (NSString *)userNameForCrashManager:(BITCrashManager *)crashManager
Parameters
- crashManager
The
BITCrashManager
instance invoking this delegate
Discussion
Warning: When returning a non nil value, crash reports are not anonymous any more and the alerts will not show the “anonymous” word!
Declared In
BITCrashManagerDelegate.h


Pro_Pack : optimiser¶
ProPack optimiser module manages the health of assets and your Maya scene via a complex Health object system. The HealthValidation class runs tests that are bound to it, formatted such that each test returns a HealthTestObject. These objects contain both the results of the test, what failed, what passed and where ever possible they also have a fix method bound to them.
This is a crucial part of the ProPack systems for clients, dealing not just with overall optimisation methods and cleanups, but also a complex health runner setup.
The key to all of the testing systems are HealthTestObjects formatted in a specific manner and passed into the HealthValidation class to run and collate.
Each test makes and returns an instance of a HealthTestObject and is self contained, they can be run standalone without the HealthValidation class to test specific things, or grouped into a bigger set of tests, for example to health check a rig prior to releasing to an animator.
>>> # import statement for the module via the r9pro decompiler >>> from Red9.pro_pack import r9pro >>> r9popt = r9pro.r9import('r9popt')>>> def simple_example_test(expected=False): ... ''' ... This is an example of how to write correctly formatted Health tests ... for the Validation systems based on simply matching a predictable input result. ... This is how all the Maya environment tests are built in the ProPack ... ... In simple tests like this we can just compare the results with the expected data ... such that HealthObject.results_returned==HealthObject.results_expected ... ... :param expected: status of the test expected ... ''' ... # we make a fresh instance of a HealthTestObject, this is crucial ... HealthObject = r9popt.HealthTestObject(name='simple_example_test') ... ... # set the internal results_expected to that arg passed in ... HealthObject.results_expected = expected ... ... # bind a fix method if you have one written ... # HealthObject.fix_method=maya_timeUnits_fix ... ... # run the actual test and push it's result to the HealthObject ... HealthObject.results_returned = cmds.about(q=True, batch=True) ... ... # do the simple compare by calling the set_byCompare func ... # this sets the status internally and sets the test as having been run ... HealthObject.set_byCompare() ... ... # we ALWAYS have to return the HealthObject ... return HealthObject>>> def custom_example_test(expected): ... ''' ... more complex test, most of the time we don't know what exactly ... is in the scene before we run the test so the above example is useless. ... In this example we're constructing the test and managing the results ... directly ... ... :param expected: a list of nodes we expect to be present ... ''' ... # as above, take an instance of the HealthObject and set the initial vars ... HealthObject=r9popt.HealthTestObject(name='custom_example') ... HealthObject.results_expected=expected ... ... for node in expected: ... # run our test ... if not cmds.objExists(node): ... # test failed so we add the failed nodes to the results_failed list ... HealthObject.results_failed_nodes.append(node) ... # we can also set the log info, displayed when we get the overall status ... HealthObject.log_message+='failed node : "%s" : Missing in Scene' % node ... else: ... # test passed so add the passed nodes to the results ... HealthObject.results_passed_nodes.append(node) ... # if we have failed nodes then the test failed and we need to set it's status as such ... # by default the HealthObject is set as failed ... if not HealthObject.results_failed_nodes: ... HealthObject.set_passed() ... # return the HealthObject ... return HealthObjectWhen we put this together with the HealthValidation system we get a very powerful way of checking data inside Maya. In Pro for clients this is also bound to the fileOpen callback, allowing us to test the scene after load against a given project template.
>>> class Client_SceneOpen_HealthValidation(r9popt.HealthValidation): >>> def __init__(self, *args, **kwargs): ... # Tests to run, note this is a list of tuples where the second ... # arg is the expected result if specified ... self.tests=[(r9popt.maya_sceneUnits_test, {'expected':'centimeter'}), # Maya environment units ... (r9popt.maya_timeUnits_test, {'expected':'ntsc'}), # Maya environment fps 'ntsc' 30fps ... (r9popt.maya_upAxis_test, {'expected':'y'})] # Maya environment world axis Y-up >>> >>> test=Client_SceneOpen_HealthValidation() >>> test.run_health() >>> >>> test.getStatus() # pass or fail? >>> print test.prettyPrintStatus() # note this is formatted as a string for output to file >>> test.writeStatus(filepath) # output the test results to file >>> >>> # fix anything that failed >>> test.run_fix_methods()You could of course just take an instance of the default HealthValidataion object and fill up the internal tests list but it’s often easier to have a bespoke class to test a specific set of data
>>> test=r9popt.HealthValidation() >>> test.tests=[(r9popt.maya_sceneUnits_test, {'expected':'centimeter'}), ... (r9popt.maya_timeUnits_test, {'expected':'ntsc'}), ... (r9popt.maya_upAxis_test, {'expected':'y'})] >>> test.run_health()
Note that the new Project management by default switches on an internal SceneOpen callback in Maya that triggers the r9popt.SceneOpen_HealthValidation() to be run. This can be turned Off by unchecking the health_run_open_callback checkbox in the ProjectManager > Edit mode.
Optmizer module for dealing with the health of a scene
Main Classes
OptimizerUI () |
|
OptimizeScene () |
The OptimizeScene class is responsible for wind optimization of the current Maya Scene. |
HealthTestObject (name) |
HealthTestObject is a base class object that should be managed and returned by all of the Health Test functions. |
HealthValidation (*args, **kwargs) |
This is the main Health Test system for all of ProPack and Red9’s internal publisher system. |
SceneOpen_HealthValidation (*args, **kwargs) |
Health systems to validate the Scene status against the internal PROJECT_DATA object thats bound to the systems at boot. |
All_Available_Tests (*args, **kws) |
Collection class - this will build up the internal tests to include ALL currently instanced and found test functions but at the same time will disable the main run buttons in the HealthManager as these are NOT designed to be run as a full test set, just a collection of individual tests |
SRC_Export_HealthValidations ([src_node]) |
RED9 PRODUCTION RIG ONLY : Health systems to validate an SRC Prior to Exporting it in the RigManager |
SKL_HealthValidations ([rootJnt]) |
RED9 PRODUCTION RIG : Health systems to validate a Skeleton Prior to Rig Build. |
BlendShapes_HealthValidation (*args, **kwargs) |
Base test to validate the health of all Blendshapes in the scene. |
SceneGeo_HealthValidation (*args, **kwargs) |
Base test to validate the health of all geometry in the scene. |
MRIG_External_HealthValidations ([mRig]) |
Health systems to validate the status of a connected mRig |
-
optimizer_ui
()¶
-
class
OptimizeScene
¶ Bases:
object
The OptimizeScene class is responsible for wind optimization of the current Maya Scene.
when initializing the class we expose a number of internal options to allow you to tailor how the optimize_full system deals with your scene
by default we maintain the following node types when running this:
- shapeEditorManager
- poseInterpolatorManager
- sequenceManager
- displayLayerManager
- audio (nodeTypes)
- controllers (nodeTypes)
- r9MetaNodes
- hiknodes
- shaders
- ngskin nodes
-
optimize_base
(pre_post=True, *args)¶ Base Maya Optimizer’s with a few extra cleanups thrown in for good measure
-
optimize_full
(runBase=True, *args)¶ Optimize by exporting all DagObjects to a temp file then importing the data and running a base optimize on the remaining data.
Parameters: runBase – do we run the base optimiser func first? - ..note ::
- any additional nodes you need to retain during the process, such as non-dag nodes like Audio Nodes need to be handling either by adding a selection method and adding that in the self.get_retained_funcs list, OR adding to the initial self.nodes_to_retain list
-
get_nodes_to_retain
()¶ nodes to include in the rootNode list that gets exported during the optimize_full function call. This is so that we can add in additional non DAG nodes such as audio nodes into the temp export to ensure everything we want to retain is kept.
-
delete_format_output
(func)¶ simple decorator to format the return prints, a fix method should return a list of nodes / data that it’s fixed and this decorator prints that status out after the fix method has been run.
-
get_heathtest_from_cls
(cls)¶ get the tests bound to a HealthValidation Object
-
get_healthTests
(inc_loose=False)¶ get all tests that we deem to be valid HealthTests. We first find any subclasses of the base HealthValidation class, then we use that to find all modules that may contain health tests. From that we inspect all methods in the module, matching them for a ‘_test’ in the name and extracting all args and docstrs
Parameters: inc_loose – do we also scan for any loose tests within found modules containing HealthValidation subclasses? these tests may be within validation subclasses but we scan as loose to include all available tests. This is used withing the ‘All_Available_Tests’ collection subclass mainly Return dict: full data dump for later processing
-
class
HealthTestObject
(name)¶ Bases:
object
HealthTestObject is a base class object that should be managed and returned by all of the Health Test functions. It’s an encapsulated status object for a particular test method, holding results from the test and fix methods.
>>> test=opt.maya_timeUnits_test(expected='ntscf') >>> test.print_status >>> test.run_fix_method()
Internal Vars of note:
- self.fix_method = None : fix function for this test object
- self.results_failed_nodes = [] : nodes deemed to have failed the test, where appropriate
- self.results_passed_nodes = [] : nodes that passed the test
- self.results_returned = None : results used to compare against if the results_expected var was given
- self.results_expected = None : if specified this is the result expected from the test method.
- self.log_message = ‘’ : during the tests we generally fill this with useful info for the print feedbacks
- self.additional_pp_status_details : (str) additional data that gets appended to the prettyPrintStatus() data returned by the HealthValidation class. This is only meant to be a short note such as the timeUnit test which has the expected fps in this val
-
run_fix_method
()¶ If this test object has already run and has a fix method bound, and the test failed then run the fix method.
-
has_run
¶ has this HealthObject been run as part of a test
-
selectFailedNodes
()¶
-
print_status
(detailed=True, indepth=True, verbose=True)¶ print a status report for this HealthTestObject
-
status
¶ wrapper for the status of the object, if the test passed, failed or threw a warning. This also compares any results_expected with the data from the test so we can compare against an expected set of data.
Note
Test.status=’PASSED’ if either the test.set_passed() has been run internally, or if self.results_expected == self.results_returned. This allows for simple matching of default data such as Maya environment calls etc. For more complex status checking I’d recommend doing that inside your test function and setting the status there using the set_passed etc.
-
set_byCompare
()¶ automatically set the status based on comparing the results_expected==results_returned This is generally for simple test methods where you can guarantee the results are consistent.
-
set_by_failed
()¶ automatically set failed if there are failed results in the test object
-
set_failed
()¶ set test as failed, note this also sets the has_run flag to True
-
set_passed
()¶ set test as passed, note this also sets the has_run flag to True
-
set_warning
()¶ set test as passed, note this also sets the has_run flag to True
-
set_corrupt
()¶ set test as passed, note this also sets the has_run flag to True
-
failed
¶
-
passed
¶
-
warning
¶
-
corrupted
¶
-
class
HealthValidation
(*args, **kwargs)¶ Bases:
object
This is the main Health Test system for all of ProPack and Red9’s internal publisher system. The idea is that you bind individual test to the class to run, each test returns a HealthTestObject which means we can easily collate data and fix issues via the run_fix_methods
In Pro for clients this is also bound to the fileOpen callback, allowing us to test the scene after load against a given project template.
See examples in the API docs above
key internal vars:
- self.iscollection : False by default, this marks this set of tests as a collection, one not designed to be run as an entire test, just a collection of individual tests
- self.customfuncs : a separate binding of a given custom function, used internally to bind a specific set of random modifications for individual client needs
-
HealthResultObjects_ordered
¶ ordered list of result objects
-
status
¶
-
bindTests
(testdata=[], filepath=None)¶ bind a custom set of tests from an external config list, tests are specified as a list of tuples where the first value is the function, the second is a list of kws to pass into the function, usually expectedResult etc. If there are no kws to pass just set that to None
Parameters: - testdata – [] list of tuples as above
- filepath – path to a json file with the tests setup and correctly formatted
-
loadTests
(filepath)¶ load in tests from a file for ease
Parameters: filepath – filepath to take the tests from . Not currently implemented
-
run_health
(verbose=True, detailed=False)¶ run the given set of test objects
Parameters: - verbose – run the printouts or run it silently
- detailed – turn on all the detailed results feedback in the printouts
-
run_fix_methods
()¶ run all fix methods bound to those HealthTestObjects that failed
-
run_customFuncs
()¶ run any custom functions bound to this test setup
-
getFailedTests
(asDict=False)¶ for each healthObject validate it’s status and return those HealthTestObjects that failed and or threw a warning or error
Parameters: asDict – either return a straight list of failed HeallthTestObjects or a dict where the key is the test name
-
getStatus
(asDict=False, verbose=False)¶ for each healthObject validate it’s status and return the overall result
Parameters: - asDict – If False (default) return the overall status of all the tests as a bool, if True return a dict where the keys are the status and value is a list of tests matching that status
- verbose – if true print all the results out, else just return the status itself
-
prettyPrintStatus
(overview=True, detailed=False, passed=True, indepth=True)¶ Simple formatter to make sense of the results in a manner that can be either printed to screen or out to file. It’s worth testing the flags here as there is a LOT of formatting possible to tweak the results into a format that contains just the base data, or all the comples fails etc
Parameters: - overview – just print / return the overview of each test status - no results data
- detailed – turn on the detailed results in the feedback data
- passed – include passed tests in the detailed data
- indepth – expand the detailed results to include all the health results data
-
writeStatus
(filepath=None, indepth=False)¶ write a detailed log out to a given filepath
Parameters: - filepath – filepath for the log file
- indepth – expand the detailed results to include all the health results data
-
class
SceneOpen_HealthValidation
(*args, **kwargs)¶ Bases:
Red9.pro_pack.core.optimiser.HealthValidation
Health systems to validate the Scene status against the internal PROJECT_DATA object thats bound to the systems at boot. This is the .r9project file that controls the Maya environment and many of the internal systems for clients
-
class
SRCHealthValidations
(src_node=None)¶ Bases:
Red9.pro_pack.core.optimiser.HealthValidation
RED9 PRODUCTION RIG ONLY : Health systems to validate an SRC Prior to saving it and then binding to a Rig
This is a base level test only, the actual SRC validation run by the internal publisher is WAY more aggresive!
Parameters: src_node – a Meta SRC_Extension mNode checks for:
- invalid references
- unused display layers
- constraint interpTypes (expects 2 = average)
- removes ALL namespaces
- invalid MetaData
- SRC rig controllers have keys
- SRC skeleton hasKeys
- SRC skeleton rotate tolerances
-
class
SRC_Export_HealthValidations
(src_node=None)¶ Bases:
Red9.pro_pack.core.optimiser.HealthValidation
RED9 PRODUCTION RIG ONLY : Health systems to validate an SRC Prior to Exporting it in the RigManager
This is a destructive set of tests when run with the fix method so make sure to save the scene out prior to running this.
Parameters: src_node – a Meta SRC_Extension mNode, if passed in we use that, else we find the first instance of a “Pro_MetaRig_SRC” mNode checks to ensure:
- no audio nodes
- file is referenced
- invalid references
- unused display layers
- removes ALL namespaces
- invalid MetaData
- SRC skeleton has no keys
- SRC skeleton hierarchy has no Non-Joint nodes in it
- SRC skeleton has no incoming connections to any attr
- Export Skeleton is parented to world
- meshes connected to renderMeshes and renderMeshes_head are parented under ‘|models’
- blend target channels have no incoming connections
-
class
SKL_HealthValidations
(rootJnt=None)¶ Bases:
Red9.pro_pack.core.optimiser.HealthValidation
RED9 PRODUCTION RIG : Health systems to validate a Skeleton Prior to Rig Build. Skeleton is found using the get_root_jnt() func so is a wide call to find the most appropriate skeleton to process, unless passed directly in of course
checks to ensure:
- no invalid references
- removes ALL namespaces
- no invalid MetaData
- Skeleton has no keys
- Skeleton hierarchy has no Non-Joint nodes in it
- Skeleton has no incoming connections to any attr
- Skeleton has all the draw options reset
- Skeleton has invereScale wires correct
- Skeleton is at zero rotate on all jnts
- Skeleton is at BPose (internal BPose from Red9 Systems)
-
class
SceneStripper
(src_node=None)¶ Bases:
Red9.pro_pack.core.optimiser.HealthValidation
Base Scene Clean to strip back any bloated history, usually used as a compound in the HealthManager for quick access to these key optimisations
Removes:
- Unknown Plug-in Dependencies
- ALL namespaces
- ALL audio files
- unused display layers
- invalid MetaData
- invalid references
- turtle nodes
-
class
BlendShapes_HealthValidation
(*args, **kwargs)¶ Bases:
Red9.pro_pack.core.optimiser.HealthValidation
Base test to validate the health of all Blendshapes in the scene.
This will:
- Test for missing indexes and pad to fix if found - this by-passes fbx issues on export!
- Test that all original target geo is in the scene and if not, it will re-generate it
- Test that all target geo in the scene is named as per the blendshape target channel and rename if not
-
class
All_Available_Tests
(*args, **kws)¶ Bases:
Red9.pro_pack.core.optimiser.HealthValidation
Collection class - this will build up the internal tests to include ALL currently instanced and found test functions but at the same time will disable the main run buttons in the HealthManager as these are NOT designed to be run as a full test set, just a collection of individual tests
-
class
SceneGeo_HealthValidation
(*args, **kwargs)¶ Bases:
Red9.pro_pack.core.optimiser.HealthValidation
Base test to validate the health of all geometry in the scene.
This will:
- Test for missing geometry!
- Test that all geometry in the scene is named as expected
-
class
MRIG_External_HealthValidations
(mRig=None)¶ Bases:
Red9.pro_pack.core.optimiser.HealthValidation
Health systems to validate the status of a connected mRig
This is the base level Rig Systems Health, testing some of the core structures in the wiring of an external mRig system
-
get_metaRigs
()¶ generic mrig call for all base tests
-
get_root_jnt
()¶ generic call for all tests dealing with skeleton roots. This finds the first instance of a mRig then calls the internal mrig.get_root_jnt() That in turn finds the rootJnt from the exportSkeletonRoot wire, either on the mRig or the connected exportTag. If the mrig returned is inherited from the MetaHIKCharacterNode thne we assume that the “Reference” wire in the HIK definition is connected and we use that. If non of the mrig funcs return a skeleton then we regress to find the first root level skeleton in the scene.
Remember that the return from the getMetaRigs() is always in favour of the most influential: ‘Pro_MetaRig’ or ‘Pro_MetaRig_FacialUI’ or ‘Pro_MetaRig_SRC’ or ‘MetaRig’
-
maya_timeUnits_test
(expected='ntsc')¶ Maya Units: timeUnit is as expected
-
maya_timeUnits_fix
(HealthObject)¶ TODO: this should adjust the exportLoop timings also
-
maya_sceneUnits_test
(expected='centimeter')¶ Maya Units: sceneUnits are es expected
-
maya_sceneUnits_fix
(HealthObject)¶
-
maya_upAxis_test
(expected='y')¶ Maya Units: upAxis is as expected
-
maya_upAxis_fix
(HealthObject)¶ fix the upAxis to the expected result
-
maya_evalManager_test
(expected='off')¶ Maya Eval Manager: off, parallel or serial (serial should never be run in production only for debugging)
-
maya_evalManager_fix
(HealthObject)¶ fix the evalManager graph to the expected result
-
maya_timerange_test
(expected=(0, 1))¶ Maya Timeranges: are the current playback timeranges as expected (used mainly when setting the rigs up)
-
maya_timerange_fix
(HealthObject)¶ fix the timeranges as expected
-
maya_version_required_test
(expected=2019.0)¶ Maya Target Version: make sure that the target version of Maya matches the given, this is a float so 2015.0, 2016.0, 2016.5…. Uses the r9Setup.mayaVersion() call to get the data
-
maya_version_lowest_base_test
(expected=2019.0)¶ Maya Target Lowest Base: make sure that the target version of Maya is equal, or above the given, this is a float so 2015.0, 2016.0, 2016.5…. Uses the r9Setup.mayaVersion() call to get the data
-
maya_version_highest_base_test
(expected=2019.0)¶ Maya Target Lowest Base: make sure that the target version of Maya is equal, or above the given, this is a float so 2015.0, 2016.0, 2016.5…. Uses the r9Setup.mayaVersion() call to get the data
-
nodes_exist_test
(expected=[])¶ check in the Maya scene for a pre-existing set of nodes
-
meta_nodes_get
(*args)¶ simple get for all metaNodes in the scene, this only returns the dag paths NOT instantiated mNode
-
meta_nodes_invalid_test
(expected=False)¶ test for metaNodes in the scene which are deemed inValid by their own internal mNode.isValid() call. Usually if they have no connections to other nodes. Failed Results built : HealthObject.results_failed_nodes : [mRig,…]
Parameters: expected – NA - unused
-
meta_nodes_invalid_fix
(*args, **kwargs)¶ find all inValid metaNodes by deleting them via their internal mNode.delete() call This fix method is bound in such a way that it will run the test method internally if not already run.
-
mRigs_haveKeys_test
(expected=False, mRigs=[])¶ test to check if all mRigs in the scene have existing keys or not Failed Results built : HealthObject.results_failed_nodes : [mRig,…]
Parameters: - expected – if we’re expecting keys or not
- mRigs – specific mRig metaNodes only if passed
-
mRigs_haveKeys_fix
(*args, **kwargs)¶ remove all keys found and reset / zeropose the rig This fix method is bound in such a way that it will run the test method internally if not already run.
-
mRigs_zeroPose_test
(expected=None, mRigs=[])¶ test to check if all mRigs in the scene have existing zeroPoses Failed Results built : HealthObject.results_failed_nodes : [mRig,…]
Parameters: - expected – NA - unused
- mRigs – specific mRig metaNodes only if passed
-
mRigs_zeroPose_fix
(*args, **kwargs)¶ add a ZeroPose to the Rig in it’s current state This fix method is bound in such a way that it will run the test method internally if not already run.
-
mRigs_attrMap_test
(expected=None, mRigs=[])¶ test to check if all mRigs in the scene have existing attrMaps Failed Results built : HealthObject.results_failed_nodes : [mRig,…]
Parameters: - expected – NA - unused
- mRigs – specific mRig metaNodes only if passed
-
mRigs_attrMap_fix
(*args, **kwargs)¶ add a ZeroPose to the Rig in it’s current state This fix method is bound in such a way that it will run the test method internally if not already run.
-
mRigs_renderMeshes_hooked_test
(expected=1, mRigs=[])¶ test to check if all mRigs in the scene have existing renderMeshes hooked up or at least the expected number or above. This wire is used by the PoseSaver to create the PosePointCloud visual mesh reference Failed Results built : HealthObject.results_failed_nodes : [mRig,…]
Parameters: - expected – minimum number of expected meshes hooked up
- mRigs – specific mRig metaNodes only if passed
-
mRigs_renderMeshes_head_hooked
(expected=1, mRigs=[], group='main')¶ test to check is all mRigs in the scene have existing renderMeshes_head hooked up or at least the expected number or above. This wire is used by the PoseSaver to create the PosePointCloud visual mesh reference Failed Results built : HealthObject.results_failed_nodes : [mRig,…]
Parameters: - expected – minimum number of expected meshes hooked up
- mRigs – specific mRig metaNodes only if passed
-
mRigs_renderMeshes_static_head_hooked
(expected=1, mRigs=[], group='main')¶ test to check is all mRigs in the scene have existing renderMeshes_static_head hooked up or at least the expected number or above. This wire is used by the PoseSaver to create the PosePointCloud visual mesh reference Failed Results built : HealthObject.results_failed_nodes : [mRig,…]
Parameters: - expected – minimum number of expected meshes hooked up
- mRigs – specific mRig metaNodes only if passed
-
mRigs_meshes_rootparent_test
(expected='|models', mRigs=[])¶ << SRC Export bindpose Test >>
check that all renderMeshes and renderMeshes_head nodes are parented under a single group (expected=’models’) in the root of the Maya scene. If not the fix will create the root folder and re-parent all meshes into it, it will not clean up previous groups or folders as it’s designed primarily as a pre-export SRC test
-
mRigs_meshes_rootparent_fix
(*args, **kwargs)¶ fix the naming and parenting of the renderMesh parent node if found
-
mRigs_meshes_draw_reset_test
(mRigs=[], forced=False)¶ << SRC Export bindpose Test >>
check that all renderMeshes and renderMeshes_head nodes have all their draw overrides and visibilities set to default
this tests for: * jnt.visibility = 1 * jnt.lodVisibility = 1 * jnt.overrideEnabled = 0 * jnt.overrideDisplayType = 0
If not the fix will force disconnect (if set to force) and rest the values
-
mRigs_meshes_draw_reset_fix
(*args, **kwargs)¶ reset the draw overrides for the failed renderMeshes
-
mRigs_exportSkeletonRoot_test
(expected=None, mRigs=[])¶ test to check if all mRigs in the scene have existing exportSkeletonRoot hooked up this wire is used by the PoseSaver to generate the skeletonData block Failed Results built : HealthObject.results_failed_nodes : [mRig,…]
Parameters: - expected – NA - unused
- mRigs – specific mRig metaNodes only if passed
-
mRigs_mirrorIndexClashes_test
(expected=None, mRigs=[])¶ test to check for any clashing mirrorIndexes on mRigs Failed Results built : HealthObject.results_failed_nodes : [(mRig, node),…]
Parameters: - expected – NA - unused
- mRigs – specific mRig metaNodes only if passed
-
mRigs_mirrorIndexMissing_test
(expected=None, mRigs=[])¶ test to check that all controllers wired to the rigs have mirrorIndexes assigned Failed Results built : HealthObject.results_failed_nodes : [(mRig, node),…]
Parameters: - expected – NA - unused
- mRigs – specific mRig metaNodes only if passed
-
mRigs_unwired_ctrls_test
(expected=None, mRigs=[], searchPattern=[])¶ test to check that all child nurbsCurves, with optional name matching, under the mrig.ctrl_main of the mRig are wired to the systems. This is a WARNING only as it’s a very general test but useful for debugging everything Failed Results built : HealthObject.results_failed_nodes : [(mRig, node),…]
Parameters: - expected – NA - unused
- mRigs – specific mRig metaNodes only if passed
- searchPatetrn – if given this is used in the search to find nurbsCurves with given naming conventions
This is a Warning failure only
-
mRigs_characterset_test
(expected=True, mRigs=[], emptyset='')¶ check to see if all the mRig controllers attributes that are exposed are wired to a valid characterSet
Parameters: emptyset – if given this is the name of any new chSet created for a rig, else we default to ‘character’
-
mRigs_characterset_fix
(*args, **kwargs)¶ fix character set membership for the failed mRig node attrs
Note
this now looks at each mRigs characterSet, if it already has membership to a characterSet then all fails will be added to that chSet.
-
mRigs_timecode_attrs_test
(expected=True, mRigs=[])¶ check to see if the mRig has timecode attrs propagated to it
-
mRigs_timecode_attrs_fix
(*args, **kwargs)¶ add production TimeCode attrs to CTRL_Main if not found
-
mRigs_timecode_valid_test
(expected=True, mRigs=[])¶ check to see if the mRig timecode attrs are valid, particularly the SampleRate which doesn’t handle zero values!
-
mRigs_timecode_valid_fix
(*args, **kwargs)¶ try and fix issues in the timecode attrs
-
mRigs_pickertemplate_test
(expected=True, mRigs=[], templatefile='', force=False)¶ generic MetaRig also supported with this test check to see if the mRig has a valid Pro Picker template
This is a Warning failure only
Parameters: - expected – if we were expecting a picker or not
- mRigs – given mRigs to test, if None then we find all instances of mRigs in the scene
- templatefile – template file to use in the fix method if not already found
- force – if force and template file given then the test if failed by default allowing the fix to force update any template already loaded on the mRig
-
mRigs_pickertemplate_fix
(*args, **kwargs)¶ add the Picker Template to mRig if not found
-
mRigs_filterssettings_test
(expected=True, mRigs=[], templatefile='Red9_DevRig.cfg', sync_to_template=True)¶ generic MetaRig also supported with this test check to see if the mRig has a filterSettings config bound to it internally
This is a Warning failure only
Parameters: - expected – if we were expecting a settings or not
- mRigs – given mRigs to test, if None then we find all instances of mRigs in the scene
- templatefile – template file to use in the fix method if not already found
- sync_to_template – if True (default) we force sync mrig.settings to the given template data, else we just check if the rig has settings and if so ignore the template. In this case we’re only using the template arg if the mrig.settings are blank
-
mRigs_filterssettings_fix
(*args, **kwargs)¶ bind the given filterSettings preset config file internally to the mRig
-
mRigs_isHistoricallyInteresting_shape_test
(expected=0, mRigs=[])¶ test all controllers in the rig and check the status of all of their child shapes isHistoricallyinteresting attr
Parameters: - expected – value we’re expecting for the isHistoricallyInteresting attr, default=0 which means hide it, 2 would restore the nodes
- mRigs – specific mRigs else we process all found in the scene
-
mRigs_isHistoricallyInteresting_shape_fix
(*args, **kwargs)¶ reset the isHistoricallyInteresting attr to the expected value
-
mRigs_isHistoricallyInteresting_utility_test
(expected=0, mRigs=[], version=None)¶ ceck the controllers history nodes and hide all utility nodes via the node.isHistoricallyInteresting attr. This means in the ChannelBox we should have no Output nodes other than base blendshapes, skinclusers, networks and character sets etc.
Parameters: - expected – value we’re expecting for the isHistoricallyInteresting attr, default=0 which means hide it, 2 would restore the nodes
- mRigs – specific mRigs else we process all found in the scene
- version – if given this is the internal mRig.version that we have to be above or equal to in order to process. This internally prevents us running this on older rigs that haven’t been tested against this
-
mRigs_isHistoricallyInteresting_utility_fix
(*args, **kwargs)¶ reset the isHistoricallyInteresting attr to the expected value
-
mRigs_are_referenced_test
(expected=True, mRigs=[])¶ check that all mRigs in the scene are referenced (or not) depending on the expected flag
Parameters: - expected – if True we return a fail if there are none reference mRigs in the scene
- mRigs – specific mRigs else we process all found in the scene
-
mRigs_geo_display_attr_test
(expected=None)¶ test to see if main control has geo_display attr and check that render meshes overrideDisplayType are connected to main control.geo_display
-
mRigs_geo_display_attr_fix
(HealthObject)¶ add geo_display Att to main ctrl if do not exist and connect render meshes to control.geo_display attr
Check exportTag setups - NOT run in the publisher, Internals has a more aggressive set of tests! This is a Warning failure only
Add the base character Export tag if not found, if the root wasn’t connected then hook it up to the mRig.skeletonRoot jnt from the publisher
-
mRigs_export_blendattrs_cast_test
(expected=True, mRigs=None, range=1)¶ Check exportTag setups - check ONLY VALID if we have renderMeshes wired.
- Validate that if any of the renderMeshes have blendshapes, that the target attrs of the blends are cast over to the exportRoot jnt. By propagating the root jnt with matching attrs and wiring those to the blendshape output we ensure that the data will be picked up on engine export.
- Also validate that is we’re casting we also add the override_attr_binduserattrs to the rootJoint to allow these userDefined attr through the fbx export process
-
mRigs_export_blendattrs_cast_fix
(*args, **kwargs)¶ Ensure we cast all target channels for all blendshapes associated with the renderMeshes over to connected attrs on the exportRoot jnt. This ensure
-
exportTag_bpose_test
(expected=True, expTags=[])¶ Check exportTag setups - this makes sure we only have 1 joint stamped with the ‘bpose’ attr used by the relative export output to reset the skeleton to bpose.
This is a Warning failure only
-
exportLoopNode_framerate_test
(expected=True, loops=[])¶ generic ExportLoopNode check to make sure that framerate changes are reflected in the export ranges
Parameters: - expected – this gets filled by the currentFramerate
- loops – given exportLoops to test, if None then we find all instances of ExportLoopNodes in the scene
-
exportLoopNode_framerate_fix
(*args, **kwargs)¶ Bind the given filterSettings preset config file internally to the mRig
-
exportNames_valid_test
(expected=True, root='', bases=[])¶ check that the given hierarchy doesn’t have names which will clash with any dag or non-dag node in the scene, be those utility nodes or layers. If you have clashes then when the hierarchy is duplicated those clashing node will be appended numerically. This happens when you duplicate a referenced hierarchy back into root space, the created nodes can’t clash with existing nodes in root space.
Parameters: - root – the root of the hierarchy we want to check
- bases – [] if given this is the root level ndoes we’re checking against (optimization for export)
-
get_scene_geo_data
(filepath=None, write=False, selected=False)¶ Get a scene geometry info with data about all the geometries in the scene, number of vertex, edges, faces, names & transforms if write set to true it will write a .sgfi file in the same location and name of the maya file
Parameters: - filepath – optional filepath of the scene geometry info file
- write – bool to enable or disable write functionality
-
scene_geo_vertex_position_change_test
(expected=None, filepath='')¶ this test compares the vertex positions of mesh geometry in the scene against pre-saved sgfi file
Parameters: filepath – filepath of the sgfi file we’re going to test against
-
scene_geo_vertex_position_change_select
(HealthObject)¶ select all vertices that changed positions
-
scene_geo_history_test
(expected=None, filepath='')¶ this test compares the names of mesh geometry in the scene against pre-saved sgfi file, first querying the file geometries in the scene and then trying to match using vertex counts
Parameters: filepath – filepath of the sgfi file we’re going to test against
-
scene_geo_history_fix
(HealthObject)¶ delete the history on the failed nodes
-
scene_geo_rename_selected_test
(expected=None, filepath='')¶ this test compares the names of mesh geometry in the scene against pre-saved sgfi file, first querying the file geometries in the scene and then tries to match using components counts to match names
Parameters: filepath – filepath of the sgfi file we’re going to test against
-
scene_geo_rename_test
(expected=None, filepath='', selected=False)¶ this test compares the names of mesh geometry in the scene against pre-saved sgfi file, first querying the file geometries in the scene and then tries to match using components counts to match names
Parameters: filepath – filepath of the sgfi file we’re going to test against
-
scene_geo_rename_fix
(HealthObject)¶ Rename failed nodes
-
scene_geo_freeze_transforms_test
(expected=None, filepath='')¶ Parameters: - expected –
- filepath –
-
scene_geo_freeze_transforms_fix
(HealthObject)¶ freeze transform on the failed nodes
-
initial_shading_group_locked_test
(expected=None, *args)¶ Scene Health General Issue:
Test to see if the initialShadingGroup is unlocked as it should be. We’ve had files from clients where this has been locked and that prevents even the most simple objects, such as polyCube from being created!
The fix will unlock the initialShadingGroup
-
initial_shading_group_locked_fix
(*args, **kwargs)¶ runs : cmds.lockNode(‘initialShadingGroup’, l=False, lu=False)
-
outliner_select_cmd_reset_test
(expected=None, *args)¶ Scene Health General Issue:
Test to see if the outLinerEditor selectCommand has been changed and to reset to default when fixed. We’ve had a number of different issues that show when you select nodes in the outliner such as:
Outliner Error : Cannot find procedure “look” Outliner Error : Cannot find procedure “pass”
The fix will reset the select command : maya.mel.eval(‘outlinerEditor -edit -selectCommand “” “outlinerPanel1”;’)
-
outliner_select_cmd_reset_fix
(HealthObject=None)¶ runs : maya.mel.eval(‘outlinerEditor -edit -selectCommand “” “outlinerPanel1”;’)
-
class
Skin_HealthValidations
(shapes=[], ui=None)¶ Bases:
Red9.pro_pack.core.optimiser.HealthValidation
Compound for testing SkinCluster integrity
checks to ensure:
- Maximum amount of influence joints per vertex are respected
- weight values are properly normalize in each vertex
-
skin_maximum_influences_test
(shapes=[], ui=None)¶ Test the maximum skin joints influence on mesh or meshes, it uses the skinCluster.maxInfluences attribute to determinate how many joints are allow to influence each vertex in the mesh
Parameters: - shapes – list of shape string names or list of tuples if require to test specific vertex on a shape
- ui – object of type R9sknUI
>>> r9popt.skin_maximum_influences_test(shapes=[|pat_to|ShapeA, |pat_to|ShapeB]) Test all vertex of ShapeA and ShapeB >>> r9popt.skin_maximum_influences_test(shapes=[(|pat_to|ShapeA, [0,13,22,50])]) Test vertex 0,13,22,50 of ShapeA
-
skin_maximum_influences_fix
(HealthObject)¶ Fix function bound to skin_maximum_influences_test function
Parameters: HealthObject – HealthObject from skin_maximum_influences_test function
-
skin_values_test
(shapes=[], ui=None)¶ Test the skin values on mesh or meshes, to determinate values that are not normalize to 1.0
Parameters: - shapes – list of shape string names or list of tuples if require to test specific vertex on a shape
- ui – object of type R9sknUI
>>> r9popt.skin_values_test(shapes=[|pat_to|ShapeA, |pat_to|ShapeB]) Test all vertex of ShapeA and ShapeB >>> r9popt.skin_values_test(shapes=[(|pat_to|ShapeA, [0,13,22,50])]) Test vertex 0,13,22,50 of ShapeA
-
skin_values_test_fix
(HealthObject)¶
-
skin_influenced_by_test
(expected=None, skins=[])¶ Test to check for any meshes / skinClusters that have more than influences than the expected This ONLY tests skinClusters attached to mesh objects
Parameters: - expected – maximum number of skin weights per vert for all skinClusters found or passed
- skins – list of specific skins to test if you want to test only specific skins
-
skin_method_test
(expected='dq', skins=[])¶ Test to check the skinMethod used by all skinClusters matches the expected either dq or linear. This ONLY tests skinClusters attached to mesh objects
Parameters: - expected – ‘linear’,’dq’ or ‘blended’ skinning methods, relates to 0=linear, 1=dq, 2=weightBlended
- skins – list of specific skins to test if you want to test only specific skins
-
skin_method_fix
(*args, **kwargs)¶ set the skinning method on the failed nodes appropriately
-
skinned_joints_at_zero_rotate
(expected='True', skins=[])¶ Test to check that all joints that are part of a skinCluster have zero_rotates. This ONLY tests skinClusters attached to mesh objects
Parameters: - expected – True - all joints have zero rotates
- skins – list of specific skins to test if you want to test only specific skins
-
skeleton_rotate_tolerance_test
(rootJnt=None, tolerance=0.001, searchPattern=[], fk=False)¶ Test to check that all joints under a given rootJnt have a rotation value under the given tolerance. This is used when binding a rig-up to ensure that we get no additional gimbal introduced via a rig system etc.
Running the fix method will zero the rotate values
Parameters: - rootJnt – root joint for the test, if not passed we use the first instance of mRig.skeletonRoot
- tolerance – maximum allowed rotate in any axis for the joints
- searchPattern – regex arg passed so we can do simple testing for strings and ignore matches.
- fk – when dealing with an mRig this option switches the rig into FK mode before the test, due to the nature of IK joints will move slightly regardless, so testing in FK ensures at the base level all jnts are zero’d
-
skeleton_rotate_tolerance_fix
(*args, **kwargs)¶ set all failed joints to zero
-
skeleton_at_bpose_test
(rootJnt=None, fk=False, longname=True)¶ Test to check that all joints under a given rootJnt match that skeleton’s internal ‘bpose’ as stamped onto it through the Red9 ProPack RigManager
Running the fix method will load the ‘bpose’ data from the internal skeleton attr
Parameters: - rootJnt – root joint for the test, if not passed we use the first instance of mRig.skeletonRoot
- fk – when dealing with an mRig this option switches the rig into FK mode before the test, due to the nature of IK joints will move slightly regardless, so testing in FK ensures at the base level all jnts are zero’d
- longname – if True, default, we validate the dag path complete, else we use short name matching only
-
skeleton_at_bpose_fix
(*args, **kwargs)¶ set all failed joints to zero
-
skeleton_has_keys_test
(rootJnt=None, searchPattern=[], expected=False)¶ Test to check that all joints under a given rootJnt have no animation keys set on them. If no rootJnt is passed then we try and inspect the mRig or SrcExt / exportTag nodes
Running the fix method will delete all keys from the skeleton
Parameters: - rootJnt – root joint for the test, if not passed we use the first instance of mRig.skeletonRoot
- searchPattern – regex arg passed so we can do simple testing for strings and ignore matches.
-
skeleton_has_keys_fix
(*args, **kwargs)¶ delete all found animCurves on the failed joints
-
skeleton_clean_hierarchy_test
(rootJnt=None, expected=['camera'], *args)¶ << SRC Export bindpose Test >>
Test to check that a skeletal hierarchy has no other nodetypes under it
Running the fix method will delete all none joints in the hierarchy
Parameters: - rootJnt – root joint for the test, if not passed we use the first instance of mRig.skeletonRoot
- expected – [] if given these are additional nodetypes that are allowed into the hierarchy default = [‘camera’] so that joints and cameras will be allowed to pass through
-
skeleton_clean_hierarchy_fix
(*args, **kwargs)¶ delete all found NONE joint type nodes in the hierarchy
-
skeleton_has_connections_test
(rootJnt=None, expected=True, inc_user_defined=True, skip_metahooks=True)¶ << SRC Export bindpose Test >>
Test that no joints in a skelatal hierarchy have any connections to any of the base transform attrs and are free to be hooked up if required
Running the fix method will disconnect all connections
Parameters: - rootJnt – root joint for the test, if not passed we use the first instance of mRig.skeletonRoot
- skip_metahooks – if True(default) and the connected node via a userDefined attr is a metaNode then retain it
Parma inc_user_defined: if True we include all userDefined attrs in the search
-
skeleton_has_connections_fix
(*args, **kwargs)¶ delete all found NONE joint type nodes in the hierarchy
-
skeleton_parented_world_test
(rootJnt=None, expected=True)¶ Test to check that a skeleton is in root parent space Running the fix method will parent the root joint to the world
Parameters: rootJnt – root joint for the test, if not passed we use the first instance of mRig.skeletonRoot
-
skeleton_parented_world_fix
(*args, **kwargs)¶ delete all found NONE joint type nodes in the hierarchy
-
skeleton_unique_names_test
(rootJnt=None)¶ check that all joints in a given skeleton have unique short names results_failed={shortname:(longname1, longname2, …)}
Parameters: rootJnt – root of the skeleton to test if not passed we use the mRig networks
-
skeleton_draw_reset_test
(rootJnt=None, searchPattern=[], expected=False, forced=False)¶ Test to verify the draw states of all joints in a skeleton, this tests for:
- jnt.visibility = 1
- jnt.lodVisibility = 1
- jnt.overrideEnabled = 0
- jnt.overrideDisplayType = 0
- jnt.drawStyle = 0
- jnt.drawLabel = 0
- jnt.displayLocalAxis = 0
- jnt.displayHandle = 0
if any of the following settings aren’t met the jnt fails. This is to return the entire skeleton back to default draw states prior to the Red9 Puppet build as that needs full control over these over-rides during the build process
Running the fix method will reset the attrs back to default
Parameters: - rootJnt – root joint for the test, if not passed we use the first instance of mRig.skeletonRoot
- searchPattern – regex arg passed so we can do simple testing for strings and ignore matches.
- forced – if True the fix method will break any connections to the attrs above to force the value to be set
-
skeleton_draw_reset_fix
(*args, **kwargs)¶ reset all the jnts overrides and visibility back to default
-
skeleton_pose_compare_test
(expected=True, filepath='', rootjnt='', src_rootjnt='', savebase=False, skip_attrs=[], longname=True, **kws)¶ this test compares the given skeleton with a pre-saved r9Pose file, comparing the joint hierarchy, joint naming, transforms and orients to validate one skeleton against another
Parameters: - expected – default key but unused here
- filepath – filepath of the pose file we’re going to test against
- rootjnt – the root joint of the skeleton we want to test against the given pose file
- savebase – when setting up this test we need a pose file to test against, this allows us to run it prior to testing and save the pose to the filepath rather than running the actual test
- src_rootjnt – source skeleton to compare against if the filepath wasn’t given
- skip_attrs – a list of attrs we want to skip from the compare
- longname – if True (default, we validate the dag path complete, else we use short name matching only
- **kws –
passed directly to the r9Pose.PoseCompare object initialization
-
skeleton_bindPose_test
(expected=1, skeleton_roots=[])¶ check if we have multiple bindPoses in the scene, if they all relate to the same skeleton hierarchy we fail the test. Conversely if we have multiple skeletons in the scene we also bail the test
Parameters: - expected – max number of bindPoses any skeleton root can have, default = 1
- skeleton_roots – if given we only test the given skeletons hierarchy for bindPoses, else we find all bindPose nodes and all associated skeleton hierarchies, and test them all for multiple bindPoses
-
skeleton_bindPose_fix
(HealthObject)¶ if the test failed this deletes all current bindPoses on the failed skeleton roots then creates a single new one
-
skeletal_inverseScales_hooked_test
(rootJnt=None, *args)¶ Check if all joints have the required wire from their parent jnt into inversaeScale for some reason in production this wire was getting culled
Parameters: rootJnt – if given we only test this hierarchy, else we check all joints in the scene
-
skeletal_inverseScales_hooked_fix
(*args, **kwargs)¶ Reconnect the wire from parentJnt.scale to childJnt.inverseScale
-
blends_have_targetGeo_test
(expected=True, blends=[], meshcheck=True, forcefix=True)¶ test that any blendshapes in the scene have respective original target meshes wired up to the blend node
Parameters: - expected – whether the targets should or shouldn’t be in the scene. If they’re found and expected=False then the fix method will now try and delete them.
- blends – specific blendShape nodes to test against, default=[]
- meshcheck – only check blends associated to polymeshes, default=True
- forcefix – if True then the fix will try and force the re-build, managing any current connections to the blend targets, disconnecting as needed and restoring afterwards. Ideally this should NOT be needed, but if your rig has multiple connections that are hard to track then this should by-pass the issues
-
blends_have_targetGeo_fix
(*args, **kwargs)¶ try and regenerate the original blends targets and hook them back to the blendShape node for editing or for export requirements
Note
if the “blends_have_targetGeo_test” has the “forcefix” flag set then the fix code will try and manage any current connections and deformer states as well as all current wires to the blendshape node targets themselves. This is a hard core force fix but does restore all connections afterwards. If the targets are un-wired then that’s ideal but the code will cope if not
-
blends_targetGeo_name_test
(expected=True, blends=[], meshcheck=True)¶ test that any blendshapes in the scene have respective original target meshes that are named as per the target attrs driving them this its crucial for some game engine exporters
Parameters: - expected – hard set to True, we wouldn’t run the test unless we expected it to be so.
- blends – specific blendShape nodes to test against, default=[]
-
blends_targetGeo_name_fix
(HealthObject)¶ try and rename any failed target meshes back to the name of the target on the blendshape they’re connected too
-
blends_target_count_test
(expected=100)¶ test that any blendshapes in the scene have less than a given number of blendTargets
-
blends_target_missing_indexes_test
(expected=False, autofix=False)¶ test for empty indexes on blend nodes which will corrupt any fbx output This is designed to warning you of possible issues that may arise further down the line when outputting FBX blendshape data to Unreal
Parameters: autofix – if True we turn on the brute force fix method which will insert a copy of the base mesh into the empty index slots, therefore by-passing the FBX export issue
-
blends_target_missing_indexes_fix
(*args, **kwargs)¶ brute force fix by adding in a duplicated base mesh padder shape wired as a new target for the missing index, there by fixing the FBX export issue for Unreal etc.
-
blends_target_driven_test
(expected=False)¶ test connections to all blendshape nodes target channels and fail if they’re connected. The fix will delete the connections
-
blends_target_driven_fix
(HealthObject)¶ disconnect any of the blend targets that have incoming connections and reset their value to 0
-
mesh_compare_generate
(mesh, filepath=None)¶ safe consistent method to generate the test mesh to use in the compare call
-
mesh_compare_against_OBJ_test
(expected, mesh, opendiff=False)¶ compare a given mesh against an expected OBJ file generated by the “mesh_compare_generate” func above and passed in as a path. This is useful when building complex facial systems so you can validate that your mesh returns to the actual master Mesh delivered by clients. Sometimes simply turning off the skinCluster envelope is not enough re-assurance that the mesh matches.
Parameters: - expected – in this case a path to an obj file that we’re going to validate the given mesh against
- mesh – mesh to compare against in scene
- opendiff – if True open diffMerge and show the difference in the file structure
Note
This requires Diffmerge.exe, you can download from https://sourcegear.com/diffmerge/. Once downloaded drop it here Red9/packages/diffMerge.exe
-
mesh_frozen_xforms_test
(expected=None)¶ test mainly for riggers, check that all meshes have frozen, zero transforms
-
mesh_frozen_xforms_fix
(*args, **kwargs)¶ fix method : freeze the failed meshes transforms
-
mesh_original_shape_cleanup_test
()¶ this will delete all non required original geo from the scene, often left behind when you duplicate meshes
-
mesh_original_shape_cleanup_fix
(*args, **kwargs)¶ fix method : delete redundant OriginalShape nodes
-
mesh_integrity_test
(meshes)¶ InProgress : test given mesh for ZeroArea polys and polys with No UVs
-
mesh_integrity_fix
(self, HealthObject)¶
-
texture_path_isValid_test
(expected=True)¶ test if all file nodes have valid texture paths
TODO: return r9File objects so we can automatically do the p4sync if needed??
-
texture_path_isValid_fix
(HealthObject)¶ if we have an asset control like P4 try and run a file sync
-
texture_path_under_rootfolder_test
(expected='')¶ test to see if the texture paths for all file nodes are under the correct rootfolder path
Parameters: expected – rootpath to test against
-
texture_path_under_rootfolder_fix
(HealthObject)¶ repath the textures if they aren’t in a subfolder from the basefile
-
shape_node_names_test
(nodes=None, expected='True')¶ Test to check that shape names under transforms are named accordingly
Parameters: - expected – True - all joints have zero rotates
- nodes – list of specific nodes to test if you want to test only specific shapes
-
shape_node_names_test_fix
(*args, **kwargs)¶ fix shapeNode names based on transform parent names
-
character_set_arrays
(chset=None, filepath=None, insert_buffers=True)¶ CharacterSet debugging for placeholder list orders. This returns a dic containing {‘linearValues’:[], ‘angularValues’:[], ‘unitlessValues’:[]} where each key is a list of tuples [(index, plug, node, attr), (……
Parameters: - chset – if given inspect this chSet, else use the character set in the scene
- filepath – optional, if given save the data out to a json file
- insert_buffers – if True and the chSet has had objects removed leaving empty indexes then add buffer data to pad the arrays, ensuring we deal with such data
Note
the nodes are always stored without namespaces for consistency. If on load the node is still under a namespace then the load code will deal with it as long as there’s only 1 node with the same name across all namespaces in the scene
TODO: store the data via the metaWires rather than dagpath/node??
-
character_set_compare
(chset=None, filepath='')¶ compare the contents of the current chSet in the scene with that given from filepath
Parameters: - chset – if given inspect this chSet, else use the character set in the scene
- filepath – filepath for the stored out chSet to compare against. This must be written out by the character_set_arrays() func above
Returns: list of fails as a dict {‘linearValues’:[], ‘angularValues’:[], ‘unitlessValues’:[], ‘additionalPlugs’:[]}
-
character_set_recreate
(filepath, force=False, allow_multiple=False, allow_padding=True)¶ from a given chSet json file, rebuild the character set from scratch
Parameters: - filepath – re-create a character set from scratch using the given file, generated by the character_set_arrays() func
- force – if True and the scene already has a character set then we delete that before rebuilding
- allow_multiple – if True we don’t try and delete current character sets, instead we just create a new one named “character”
-
character_set_compare_test
(expected=True, filepath=None, chset=None)¶ test to compare the current character set in the scene with the given characterSet file. If filepath isn’t given then we check for the existance of a ‘_character.chset’ file in the same directory as the current Maya scene (assuming it’s a rig file / build directory)
Parameters: - filepath – compare against the given filepath
- chset – compare against a specific chset, used generally if there are more than 1 chSet in the scene
-
character_set_compare_fix
(HealthObject)¶ fix method : attempt to remake the character set
-
character_set_reconnect_test
(mrig=None, refnode=None, filepath=None, clean_edits=True, match_stored=False)¶ test to see if the chSet has been removed from an mrig which this animation file was using to connect all the data. If the chSet has been removed it must either be stored to file OR bound to the mRig.mNode via the chset_bkg attr as it’s this previous state of the character set that we use to reconnect the missing data
Parameters: - mrig – if given we test against this, else we find the first instance from getMetaRigs()
- refnode – specific refNode we want to process, else we use the refNode which contains the mRig node
- filepath – file to a chSet file saved by the character_set_arrays() test function
- clean_edits – run a remove failedEdits edits after the fix has run
- match_stored – extract and match the chSet index mapping via either a pre-stored chset file or a chset_bkg attrs pickled onto the mRig, both must have been generated by character_set_arrays()
-
character_set_removal_fix
(*args, **kwargs)¶ reconnect the failed chSet animcurve edits
-
nodeTypes_present_test
(expected=0, nodeType='audio')¶ test for the presence of a specific nodeType in the scene
Parameters: - expected – int=0, number of nodes of this nodeType in the scene that’s acceptable
- nodeType – Maya nodeTyoe to scan for, default=audio
-
nodeTypes_present_fix
(*args, **kwargs)¶
-
constraints_interpType_test
(expected=[2, 0])¶ test all orient and parent constraints and validate their interpType is set as expected. This by default is set to a list [2,0], allowing noflip and shortest to pass and all other interTypes to fail. The first var in the expected list is then used as the default which fails will get set too
Parameters: expected – [2, 0] where 0=’noflip’, 1=’average’, 2=’shortest’, note that is this is given as a list then the first arg is the default that failed interTypes will get set too.
-
constraints_interpType_fix
(*args, **kwargs)¶
-
displayLayers_test
(expected=[])¶ test to see if displayLayers are present and if they should be or not
Parameters: expected – [] list of layers expected to be present, any others would fail the test Note
if a layer is connected to the layerManager in Id[0] slot index then it’s treated as the defaultLayer and UNEDITABLE. This has happened a few times with assets in 2018
-
displayLayers_fix
(*args, **kwargs)¶ remove all displayLayers that failed the test
-
animLayers_test
(expected=[])¶ test to see if animLayers are present and if they should be or not
Parameters: expected – [] list of layers expected to be present, any others would fail the test Note
if a layer is connected to the layerManager in Id[0] slot index then it’s treated as the defaultLayer and UNEDITABLE. This has happened a few times with assets in 2018
-
animLayers_fix
(*args, **kwargs)¶ remove all animlayers that failed the test
-
references_found_test
(*args)¶ test for .ma / .mb references in the scene, the fix method will import and remove those references
-
references_found_fix
(*args, **kwargs)¶ remove all loaded references in the scene
-
reference_nodes_invalid_test
(*args)¶ test / return a list of reference nodes in the scene that have no file pointer and are therefore currently invalid
-
reference_nodes_invalid_fix
(*args, **kwargs)¶ remove any references that come back as invalid
-
namespaces_found_test
(expected=[])¶ test for the existence of namespaces in the scene
Parameters: expected – [] list of namespaces that are valid TODO: this needs to be fixed and kept in order so that we can deal with nested namespaces correctly
-
namespaces_found_fix
(*args, **kwargs)¶ remove any references that come back as invalid. For this process we try and shift the failed namespaces into the root “:” space before removing the then empty namespace
-
unknownPlugins_test
(expected=True)¶ test to find unknown/dead plug-in nodes in the scene and remove them These are nodes from other plug-ins
good reference: https://mayastation.typepad.com/maya-station/2015/04/how-to-prevent-maya-writing-a-requires-command-for-a-plug-in.html
-
unknownPlugins_fix
(*args, **kwargs)¶ fix method : delete all old plugins
-
unknownScriptNode_test
(expected=True)¶ test to find unknown scriptNodes nodes in the scene and remove them
-
unknownScriptNode_fix
(*args, **kwargs)¶ fix method : delete all old plugins
-
unknownScriptNode_MALWARE_test
(expected=False)¶ test to find a Specific MALWARE by searching for know entries in:
- scriptNodes
- scriptJobs
- userSetup text : both userSetup.mel and userSetup.py in maya/scripts and maya/20**/scripts
- files generated by Malware known to be suspicious
Tests for:
Malware : May 2020 : “fuck_All_U” : the one we found which triggered the initial Autodesk scare https://gist.github.com/OriginalAdric/acbe902c89064e8300f2bc475a953e05Malware : Sept 2020 : “breed_gene”, “vaccine_gene” : reported on TA : https://tech-artists.org/t/another-maya-malware-in-the-wild/12970
-
unknownScriptNode_MALWARE_fix
(*args, **kwargs)¶ fix method : delete the Malware found
-
turtle_nodes_present_test
(expected=False)¶ test for the presence of BLOODY Turtle Nodes
-
turtle_nodes_present_fix
(HealthObject)¶
-
audio_nodes_get
()¶
-
audio_nodes_delete
(*args, **kwargs)¶
-
shader_nodes_get
(used=True)¶ return all shaders in the scene
-
ngskin_nodes_get
()¶
-
ngskin_nodes_delete
(*args, **kwargs)¶
-
ngskin_node_test
(expected=True)¶ test to find ngSkin nodes in the scene and remove them
-
ngskin_node_fix
(*args, **kwargs)¶ fix method : delete all ngskin nodes
-
turtle_nodes_get
()¶ Return Turtle nodes in the scene
-
turtle_nodes_delete
(*args, **kwargs)¶ Remove Turtle nodes from the scene, note that from Maya 2017 we have a specific call in the ilrUserInterface.mel for this that doens’t cause a user prompt so we’re hooking to that
-
hik_nodes_valid_get
(*args)¶ return any HIK nodes in the scene


Legendary Fish locations in Red Dead Redemption 2
Legendary fish locations are hard to find in Red Dead Redemption 2, so we've put this guide together with a legendary fish map to each one.
by Kevin TuckerLegendary fish locations (often referred to as legendary fish RDR2) are not easy to spot in Red Dead Redemption 2. With so many bodies of water both big and small, players could wander endlessly and not find them all. In this guide, we'll help you find all the legendary fish your horse can carry.
Legendary fish locations in Red Dead Redemption 2
Before catching any sort of legendary fish, players will need to have met the stranger named Jeremy Gill and opened up the quest called A Fisher of Fish. This is accomplished over at Gill Landing, New Hanover, on the north shore of the Flat Iron Lake. Mr. Gill will give players a legendary fish map so they can track down each fish, but that map isn't very specific. We've included the locations of each legendary fish with their own map.
Catching Legendary Fish in Red Dead Redemption 2 requires the use of three specific lures: the Special Lake Lure, the Special River Lure, and the Special Swamp Lure. Simply put, players will not catch any legendary fish without these lures. Fortunately, they aren't too hard to find: after players meet Gill, the Special Lures can be purchased for $20 each at the bait shop in New Hanover, in the area known as Bayou Nwa, around the middle of Lake Lagras.
Any of the three special lures can be used to catch any of the legendary fish. However, using the right lure stands a greater chance of catching a legendary fish, or of catching one more quickly. The correct lure for each fish type can be found alongside the fish's location in the listings below. In the off chance that players dropping by this guide haven't yet unlocked the activity, be sure to stop by our guide to learn how to start fishing in Red Dead Redemption 2.
Legendary Bluegill
The Legendary Bluegill can be caught on the eastern side of the Flat Iron Lake, due west of the city of Rhodes, between the shore and the barrier islands. Use the Special Lake Lure.
Return to table of contents.
Legendary Bullhead Catfish
The Legendary Bullhead Catfish can be found swimming through the western inlet of Sisika Penitentiary island, on the far eastern side of the in-game map. Use the Special River Lure.
Return to table of contents.
Legendary Chain Pickerel
The Legendary Chain Pickerel finds its home in the Dakota River, and can be caught near the bend just northwest of Flatneck Station in The Heartlands. Use the Special River Lure.
Return to table of contents.
Legendary Largemouth Bass
The Legendary Largemouth Bass hangs out in the New Austin region of the San Luis River, not too far away from Armadillo, on shore west and slightly south of Lake Don Julio. Use the Special Lake Lure.
Return to table of contents.
Legendary Large Sturgeon
The Legendary Large Sturgeon can be found where the Kamassa River opens out into the Lannaheche River, west of Saint Denis in southern Lemoyne. Use the Special River Lure.
Return to table of contents.
Legendary Longnose Gar
The Legendary Longnose Gar is located in Lake Lagras, east of the Kamassa River in the Lemoyne's Bluewater Marsh area. Use the Special Swamp Lure.
Return to table of contents.
Legendary Muskie
The Legendary Muskie is located in the Lannaheche River on the east end of New Hanover, in the waters just outside the Van Horn Trading Post. Use the Special River Lure.
Return to table of contents.
Legendary Perch
The Legendary Perch can be found in New Hanover, southwest of Annesburg, in the Elysian Pool off the Kamassa River. Use the Special Lake Lure.
Return to table of contents.
Legendary Redfin Pickerel
The Legendary Redfin Pickerel can be found toward the eastern end of New Austin, in the Lower Montana River inlet known as Stillwater Creek, due east of MacFarlane's Ranch. Use the Special Lake Lure.
Return to table of contents.
Legendary Rock Bass
The Legendary Rock Bass is located on the western border of West Elizabeth, at the end of the Lower Montana river in the Aurora Basin. Use the Special Lake Lure.
Return to table of contents.
Legendary Smallmouth Bass
The Legendary Smallmouth Bass can be found near the western edge of West Elizabeth, in the lake known as Owanjila, toward the northern end of the Upper Montana River. Use the Special Lake Lure.
Return to table of contents.
Legendary Sockeye Salmon
The Legendary Sockeye Salmon is located in western Ambarino, just past the point where the Beartooth Beck empties into Lake Isabella, due west of Barrow Lagoon. Use the Special Lake Lure.
Return to table of contents.
Legendary Steelhead Trout
The Legendary Steelhead Trout is located in the northeast corner of the in-game map, just past the Brandywine Drop area of the Kamassa River. Use the Special River Lure.
Return to table of contents.
Legendary Catfish
There's a good reason why we've listed the Legendary Catfish outside of the standard alphabetical order: it's because players can't actually catch one until they've caught and mailed off all 13 other fish. Once they have, Jeremy will send an invite to the hero asking to meet up at his fishing hut. Once arrived, the duo will make a trip to Rio Bravo where they'll be able to catch the Legendary Catfish.
Return to table of contents.
With the help of our legendary fish map for each species, anglers shouldn't have any trouble finding each legendary fish in the game. With that out of the way, it's time to start tracking down each of the Red Dead Redemption 2 legendary animal locations. The action doesn't stop there, of course — stop by our Red Dead Redemption 2 walkthrough and guide to brush up on all the biggest details of Rockstar Games' latest open-world release.


How Michigan-Michigan State evolved into college football's nastiest sibling rivalry
by Bill BenderThe FOX Sports film "Divided We Stand: Michigan vs. Michigan State" premieres this Thursday at 11 p.m. ET on FS1 — and it will take an in-depth look at the football and men's basketball rivalry between the Mitten State schools.
On the football side, it's difficult to find a nastier rivalry in the last decade. Better rivalries? Sure. Nastier? There aren't too many.
WEEK 12 PICKS: Straight up | Against the spread
This rivalry has taken on an increasingly nasty tone since Michigan State's Eddie Brown grabbed Desmond Howard at the goal line on a 2-point conversion attempt in 1990. That increased tenfold with the arrival of Michigan State coach Mark Dantonio in 2007. The Spartans have an 8-4 record since in a rivalry previously dominated by the Wolverines, and that relationship will be explored in that documentary.
Here are the incidents that have inflamed the Michigan-Michigan State football rivalry:
'Little brother' is born
Michigan rallied to beat Michigan State 28-24 in Mark Dantonio's first season with the Spartans, and Michigan running back Mike Hart made the analogy that Michigan State was like a "little brother getting exciting playing basketball."
Dantonio had a pointed response where he said, "Pride comes before the fall" and asked if Hart had a "little brother."
And we're off.
Skywriting 101
Talk about petty. Michigan athletics paid for a plane to put a skywriting that said "Go Blue" above Spartan Stadium before a game against Bowling Green in 2011. Michigan athletic director Dave Brandon initially denied he instructed the planes to fly above the stadium in East Lansing, Mich.
Ultimately, the move backfired.
Gholston's dirty plays
The Spartans won the next four meetings in the rivalry from 2008-11, but it turned ugly in a 28-14 victory in 2011 when defensive end William Gholston pulled Michigan quarterback Denard Robinson by the facemask and punched Wolverines tackle Taylor Lewan. Gholston was suspended for a game for his actions.
'Little sister' is born
Michigan State dominated Michigan in 2013 by way of a 29-6 victory. The Spartans sacked Michigan quarterback Devin Gardner seven times and limited the Wolverines to minus-48 rushing yards. Michigan did not score a touchdown, and it turned up the heat on coach Brady Hoke — whose teams made it worse the following season. Toward the end of the game, Michigan State fans chanted, "Little Sister!" at the Wolverines.
StakeGate
The Wolverines returned to Spartan Stadium the following season as part of a scheduling quirk, and Michigan linebacker Joe Bolden drove a stake into the ground at midfield before the game. Dantonio explained the decision to tack on an extra touchdown in the final minutes in a 35-11 victory afterward.
Michigan shoved Hoke out the door soon after and hired Jim Harbaugh.
Miracle at Michigan (Part 2)
Harbaugh and the Wolverines appeared to have a victory in hand at Michigan Stadium. But on the last play, punter Blake O'Neill muffed the snap, and Jalen Watts-Jackson returned it for a touchdown in a stunning 27-23 victory. Michigan State would use that victory to advance to the College Football Playoff.
The "Surrender Cobra" Michigan fan meme was born and lives on today.
Social media warfare
Michigan beat Michigan State in 2016, and Harbaugh added more fuel after calling out Dantonio for his comments about "focusing on beating Michigan" in the offseason:
It was the first example of social media warfare between the coaches, but it worked out in Michigan State's favor here. The Spartans won 14-10 in the 2017 matchup with the help of a driving rainfall.
That set up the 2018 matchup — and there were more fireworks.
Devin Bush and the Spartans' logo
Before the 2018 matchup Michigan-Michigan State game, the Spartans' players lined up and walked across the field with arms linked while Michigan players were still warming up — including linebacker Devin Bush.
Bush took exception and scuffed the Spartans' logo with his cleats afterward.
Michigan beat Michigan State 21-7, but the controversy wasn't over. Michigan defensive end Chase Winovich dropped a "little brother" after the game.
Dantonio and Harbaugh traded barbs about Michigan State's intent afterward, and whether or not it was "BS." Dantonio, Harbaugh and Bush were reprimanded by the Big Ten, and Michigan State was fined $10,000.
What's next?
Will there be more this week? Let Michigan's Ambry Thomas queue it up for you.
Dantonio backed that up, via MLive.com.
"If you don't like confrontation, this probably isn't a good game to go to, because it's just the way it is," Dantonio said. "It's just natural."
It really is, and it's never over.


michael-h.dk
Multimedia Designer and Web Developer
Multimedia Designer and Web Developer
The browser have a buildt in a native speech recognition function, and it is that we use in this experiment.
All data stays on your computer, and you have no risk using this application.


--- layout: post status: publish published: true title: Standby/Resume Quickly in Vista author: display_name: Tomas Restrepo login: tomasr email<EMAIL_ADDRESS>url: http://winterdom.com/ author_login: tomasr author_email<EMAIL_ADDRESS>author_url: http://winterdom.com/ wordpress_id: 127 wordpress_url: http://winterdom.com/2007/02/standbyresumequicklyinvista date: '2007-02-23 05:05:18 +0000' date_gmt: '2007-02-23 05:05:18 +0000' categories: - Vista tags: [] comments: [] ---
Raymond Chen recently pointed to this article on analyzing performance problems when entering standby mode and resuming in Vista. Besides the complete crippling of Windows Explorer, standby and hibernation have been the two most significant issues I've had with Vista, so I decided to give this a try and see if I could find out what was going on.
My basic problem is not that standby or hibernation fail to work. I've been pretty lucky here and both work fairly flawlesly. The problem is, they take a boatload of time. For example, entering standby mode usually takes around 20 seconds, which is totally unacceptable. Entering hibernation (which is a feature I've always loved since the Win2K days) is even worse, taking about 5 minutes, which is 2-3x the time it used to take in WinXP (on the exact same machine, with 2 GB or RAM).
I have no idea what causes or what to do about the hibernation issue, but using the technique described in the article pointed by Raymond I was able to discover what seems to be some of the culprits:
Is this stuff interesting? Yes, very much so. Can I do anything about it? Sure doesn't look like it. Closing stuff like Outlook or the Virtual PC image I keep almost 100% of the time open and running sure doesn't seem useful. After all, if I close them, I end up with all useful stuff closed, so I might as well just shut down the machine, instead!


Bug 1681043 N[Core:Audio/Video: Playback]mozilla::PDMFactory::Supported blocks the main thread when creating the first content process during startup
Bug 1351248 R[Core:DOM: UI Events & Focus Handling]Can't tab into or out of fieldset with overflow auto
Bug 1684723 R[Core:GFX: Color Management]Make transform functions take a & instead of *const.
Bug 1684797 R[Core:GFX: Color Management]Don't enable qcms c_bindings feature by default.
Bug 1684638 R[Core:Graphics]WebGLShaderValidator.cpp: do not use 'else' after 'return'
Bug 1684726 R[Core:Layout: Text and Fonts]Intermittent text-transform/all-upper.html == text-transform/all-upper-ref.html | image comparison, max difference: 255, number of differing pixels: 17192
Bug 1684719 R[Firefox:General]Remove unintentionally added .orig files
###########
Changes to 9 bugs - 8 fixed.


This is a two hour course aimed towards anyone who needs training in CPR, Choking and Anaphylaxis. Suitable for administrative and clinical staff in General Practise.
Course Content
Assess an incident and explain rationale for checking danger
Demonstrate how to open an airway and check for breathing
Demonstrate the importance of sending for help
Demonstrate how to deal with an unconscious casualty
Demonstrate the recovery positon
Demonstrate how to perform Cardio Pulmonary Resuscitation (CPR) on a non-breathing casualty (Adult, Child and Infant)
Demonstrate how to deal with a choking casualty (Adult, Child and Infant)
Anaphylaxis Training
Automated External Defibrillation (AED) training
Price
Individual attending your location : £20
Course at your venue for group of 12 candidates: £130
(Please contact us to arrange a suitable date)
Please contact for more information on prices for small or larger groups
Course Dates 2017 & Location
Thursday 25th May 12.30 - 14.30
Thursday 22nd June 12.30 - 14.30
Thursday 27th July 12.30 - 14.30
Sessions are held at St Stephen's Church Hall


Time Series Handbook¶
This handbook extensively covers time series analysis and forecasting, delving from the most fundamental methods to the state-of-the-art. The handbook was made in Python and is designed such that readers can both learn the theory and apply them to real-world problems. Although chapters were made to be stand alone, it is recommended that readers go through the first few chapters to be able to fully appreciate the latter chapters. Moreover, the Jena climate dataset is used across several chapters, with a summary of the performance of the models used at the end.
The handbook is structured as follows: in the first part, classical forecasting methods are discussed in detail. The middle part is then dedicated to dynamical forecasting methods and as well as causality and correlations, topics that are particularly essential in understanding the intricacies of time series forecasting. Finally, the last part shows a glimpse into the current trends and open problems in time series forecasting and modeling.
The aim of this handbook is to serve as a practitioner’s guide to forecasting, enabling them to better understand relationships in signals. It is made for an audience with a solid background in Statistics and Mathematics, as well as a basic knowledge of Python. Familiarity with Machine Learning methods is a plus, especially for the later chapters.
Outline¶
This handbook contains a variety of techniques that you can use for time series analysis – from simple statistical models to some of the state-of-the-art algorithms as of writing. Here are the items that are covered in this material:
Chapter 0: Introduction to Time Series Analysis
Chapter 1: Autoregressive integrated moving average
Chapter 2: Linear Trend and Momentum Forecasting
Chapter 3: Vector Autoregressive Methods
Chapter 4: Granger Causality
Chapter 5: Simplex and S-map Projections
Chapter 6: Convergent Cross Mapping and Sugihara Causality
Chapter 7: Cross-Correlations, Fourier Transform and Wavelet Transform
Chapter 8: Winningest Methods
How to use this reference¶
Each of the chapters mentioned above includes Jupyter notebook/s that contain/s the discussion of each topic (background, limitations, applications). Most of the datasets used in the handbook are included in this repository, and the details of each are described in the data folder.
 You can install one via Anaconda or via Python’s native venv
module.
Anaconda¶
To set up a virtual environment called atsa
, run the following in your terminal:
# this will create an anaconda environment
# called atsa in 'path/to/anaconda3/envs/'
conda create -n atsa
To activate and enter the environment, run conda activate atsa
. To deactivate the environment, either run conda deactivate atsa
or exit the terminal. For more information on setting up your virtual evironment using Anaconda, please visit this page.
Python venv¶
To set up a virtual environment called atsa
, run the following in your terminal:
# this will create a virtual environment
# called atsa in your home directory
python3 -m venv ~/atsa
To activate and enter the environment, run source ~/atsa/bin/activate
. To deactivate the environment, either run deactivate
or exit the terminal. Note that every time you want to work on the assignment, you should rerun source ~/atsa/bin/activate
.
Rendering the notebooks¶
To view the individual notebooks outside of Github without setting up a repository or installing any software, you may use The Jupyter Notebook Viewer.
Open
https://nbviewer.jupyter.org/
Paste the link to the notebook.
When a notebook rendered in nbviewer appears differently from the one rendered github, just append ?flush_cache=true
to the end of the nbviewer URL to force it to rerender.
Jupyterbook¶
To view all the chapters of this handbook, please visit this link: Time Series Analysis Handbook
Contributors¶
Benjur Emmanuel Borja
Gilbert Michael G. Chua
Francis James Corpuz
Carlo Vincienzo Dajac
Sebastian C. Ibañez
Prince Joseph Erneszer Javier
Marissa P. Liponhay
Maria Eloisa M. Ventura


The path of the testset folder that will contain the uploaded testset. The path doesn't include the Root testset folder.
For example, sampletestsetfolder\subfolder means, the testsets will be uploaded to testset folder named 'subfolder', which is under the testset folder named 'sampletestsetfolder',
and 'sampletestsetfolder' is under the root testset folder 'Root'.


{{template "header" .}}
Select a project to delete
Your projects
Select
Name
Created
{{ range .Proj }}
{{ .Name }}
{{ .CreatedDate }} at {{ .CreatedTime }}
{{ end }}
Cancel and return to dashboard


Social Calendar
Social Calendar
Portal for scheduling social sharing.
CMG
ADD Client
Fill in the form to add client.
Upload Client Logo:
Client Name
Select Social Channels
Facebook
Twitter
Linkedin
Instagram
Cancel


Report a Website
menu
About
List
About
No Https
Insecure Form
Plain Text Password
Phishing
Other
Submit


SegSort: Segmentation by Discriminative Sorting of Segments
Abstract
Almost all existing deep learning approaches for semantic segmentation tackle this task as a pixel-wise classification problem. Yet humans understand a scene not in terms of pixels, but by decomposing it into perceptual groups and structures that are the basic building blocks of recognition. This motivates us to propose an end-to-end pixel-wise metric learning approach that mimics this process. In our approach, the optimal visual representation determines the right segmentation within individual images and associates segments with the same semantic classes across images. The core visual learning problem is therefore to maximize the similarity within segments and minimize the similarity between segments. Given a model trained this way, inference is performed consistently by extracting pixel-wise embeddings and clustering, with the semantic label determined by the majority vote of its nearest neighbors from an annotated set.
As a result, we present the SegSort, as a first attempt using deep learning for unsupervised semantic segmentation, achieving 76% performance of its supervised counterpart. When supervision is available, SegSort shows consistent improvements over conventional approaches based on pixel-wise softmax training. Additionally, our approach produces more precise boundaries and consistent region predictions. The proposed SegSort further produces an interpretable result, as each choice of label can be easily understood from the retrieved nearest segments.
Materials
Code and Models
Citation
@inproceedings{segsort2019, title={SegSort: Segmentation by Discriminative Sorting of Segments}, author={Hwang, Jyh-Jing and Yu, Stella X and Shi, Jianbo and Collins, Maxwell D and Yang, Tien-Ju and Zhang, Xiao and Chen, Liang-Chieh}, booktitle={Proceedings of the IEEE International Conference on Computer Vision}, pages={7334--7344}, year={2019} }


#pragma once
#include "beh-type.h"
#include "coord.h"
#include "god-type.h"
#include "mgen-enum.h"
#include "mon-flags.h"
#include "xp-tracking-type.h"
// Hash key for passing a weapon to be given to
// a dancing weapon.
#define TUKIMA_WEAPON "tukima-weapon"
#define TUKIMA_POWER "tukima-power"
#define MGEN_NUM_HEADS "num_heads"
#define MGEN_BLOB_SIZE "blob_size"
#define MGEN_TENTACLE_CONNECT "tentacle_connect"
/// doesn't automatically perish over time (for pillars of salt, blocks of ice)
#define MGEN_NO_AUTO_CRUMBLE "no_auto_crumble"
// A structure with all the data needed to whip up a new monster.
struct mgen_data
{
// Monster type.
monster_type cls;
// Determines the behaviour of the monster after it is generated. This
// behaviour is an unholy combination of monster attitude
// (friendly, hostile) and monster initial state (asleep, wandering).
// XXX: Could use splitting up these aspects.
beh_type behaviour;
// Who summoned this monster? Important to know for death accounting
// and the summon cap, if and when it goes in. nullptr is no summoner.
const actor* summoner;
// For summoned monsters, this is a measure of how long the summon will
// hang around, on a scale of 1-6, 6 being longest. Use 0 for monsters
// that aren't summoned.
int abjuration_duration;
// For summoned monsters this is their type of summoning, either the
// spell which summoned them or one of the values of the enumeration
// mon_summon_type in mon-enum.h.
int summon_type;
// Where the monster will be created.
coord_def pos;
// The monster's foe, i.e. which monster it will want to attack. foe
// may be an index into the monster array (0 - (MAX_MONSTERS-1)), or
// it may be MHITYOU to indicate that the monster wants to attack the
// player, or MHITNOT, to indicate that the monster has no foe and is
// just wandering around.
unsigned short foe;
// Generation flags.
mgen_flags flags;
// What god the monster worships, if any. Used for monsters that
// are god gifts, to indicate which god sent them, and by priest
// monsters, to indicate whose priest they are.
god_type god;
// If the monster is zombie-like, or a specialised draconian, this
// is the base monster that the monster is based on - should be
// set to MONS_NO_MONSTER when not used.
monster_type base_type;
// The colour of the monster, or COLOUR_UNDEF for col:any
int colour;
// How close to or far from the player the monster should be created.
// Is usually used only when the initial position (pos) is unspecified.
proximity_type proximity;
// What place we're in, or pretending to be in, usually the place
// the player is actually in.
level_id place;
int hd;
int hp;
// These flags will be appended to the monster's flags after placement.
monster_flags_t extra_flags;
string mname;
// This is used to account for non-actor summoners. Blasted by an Ice
// Fiend ... summoned by the effects of Hell.
string non_actor_summoner;
// This simply stores the initial shape-shifter type.
monster_type initial_shifter;
// A grid feature to prefer when finding a place to create monsters.
// For instance, using DNGN_FLOOR when placing flying monsters or
// merfolk in the Shoals will force them to appear on land.
// preferred_grid_feature will be ignored if it is incompatible with
// the monster's native habitat (for instance, if trying to place
// a electric eel with preferred_grid_feature DNGN_FLOOR).
dungeon_feature_type preferred_grid_feature = DNGN_UNSEEN;
// Some predefined vaults (aka maps) include flags to suppress random
// generation of monsters. When generating monsters, this is a mask of
// map flags to honour (such as MMT_NO_MONS to specify that we shouldn't
// randomly generate a monster inside a map that doesn't want it). These
// map flags are usually respected only when a dungeon level is being
// constructed, since at future points vault information may no longer
// be available (vault metadata is not preserved across game saves).
unsigned map_mask = 0;
// This can eventually be used to store relevant information.
CrawlHashTable props;
// What class of XP is this for LevelXPInfo tracking purposes.
xp_tracking_type xp_tracking;
mgen_data(monster_type mt = RANDOM_MONSTER,
beh_type beh = BEH_HOSTILE,
const coord_def &p = coord_def(-1, -1),
unsigned short mfoe = MHITNOT,
mgen_flags genflags = MG_NONE,
god_type which_god = GOD_NO_GOD)
: cls(mt), behaviour(beh), summoner(nullptr), abjuration_duration(0),
summon_type(0), pos(p), foe(mfoe), flags(genflags), god(which_god),
base_type(MONS_NO_MONSTER), colour(COLOUR_INHERIT),
proximity(PROX_ANYWHERE), place(level_id::current()), hd(0), hp(0),
extra_flags(MF_NO_FLAGS), mname(""), non_actor_summoner(""),
initial_shifter(RANDOM_MONSTER), xp_tracking(XP_NON_VAULT)
{ }
mgen_data &set_non_actor_summoner(string nas)
{
non_actor_summoner = nas;
return *this;
}
mgen_data &set_place(level_id _place)
{
place = _place;
return *this;
}
mgen_data &set_prox(proximity_type prox)
{
proximity = prox;
return *this;
}
mgen_data &set_col(int col)
{
colour = col;
return *this;
}
mgen_data &set_base(monster_type base)
{
base_type = base;
return *this;
}
mgen_data &set_summoned(const actor* _summoner, int abjuration_dur,
int _summon_type, god_type _god = GOD_NO_GOD)
{
summoner = _summoner;
abjuration_duration = abjuration_dur;
summon_type = _summon_type;
if (_god != GOD_NO_GOD)
god = _god;
ASSERT(summon_type == 0 || abjuration_dur >= 1 && abjuration_dur <= 6
|| cls == MONS_BALL_LIGHTNING || cls == MONS_ORB_OF_DESTRUCTION
|| cls == MONS_BATTLESPHERE || cls == MONS_BALLISTOMYCETE_SPORE
|| summon_type == SPELL_STICKS_TO_SNAKES
|| summon_type == SPELL_DEATH_CHANNEL
|| summon_type == SPELL_BIND_SOULS
|| summon_type == SPELL_SIMULACRUM
|| summon_type == SPELL_AWAKEN_VINES
|| summon_type == SPELL_FULMINANT_PRISM
|| summon_type == SPELL_INFESTATION
|| summon_type == SPELL_FOXFIRE);
return *this;
}
bool permit_bands() const
{
// The permit flag is set but the forbid flag is not.
return (flags & (MG_PERMIT_BANDS|MG_FORBID_BANDS)) == MG_PERMIT_BANDS;
}
bool force_place() const { return bool(flags & MG_FORCE_PLACE); }
bool needs_patrol_point() const { return bool(flags & MG_PATROLLING); }
// Is there a valid position set on this struct that we want to use
// when placing the monster?
bool use_position() const { return in_bounds(pos); };
bool summoned() const { return abjuration_duration > 0; }
static mgen_data sleeper_at(monster_type what,
const coord_def &where,
mgen_flags genflags = MG_NONE)
{
return mgen_data(what, BEH_SLEEP, where, MHITNOT, genflags);
}
static mgen_data hostile_at(monster_type mt,
bool alert = false,
const coord_def &p = coord_def(-1, -1))
{
return mgen_data(mt, BEH_HOSTILE, p, alert ? MHITYOU : MHITNOT);
}
};
↑ V648 Priority of the '&&' operation is higher than that of the '||' operation.


{{upload.name}}
For this example we use ngx-file-drop library for drag and drop which can also handles drag n drop directories. There are other good librarys out for drag and drop we decide to use this one for following reasons:
Since we dont use ngx-fileupload browser, we have to take care when files have been dropped, create a new UploadRequest with NgxFileUploadFactory and put every UploadRequest into storage.


Natural ability
In the anime, using the example of Meowth from Team R, it was shown that the Meowths are able to learn to speak consciously, although because of this they lose their ability to fight.


{{ journeyLeg.disruptionInfo.delaydescription }} {{ journeyLeg.disruptionInfo.delayadditionalinformation }} Information correct at {{ journeyLeg.disruptionInfo.delaypublished }}


It looks like you're trying to paste directly from Microsoft Office!
But your browser is unable to handle pasting from Microsoft Office properly, so we've sanitized it for you.
You can now copy and paste the sanitized content that appears below.
Pasting from Microsoft Office also erases your undo history. To avoid this in the future, don't paste directly from Microsoft Office.


Applies natural exponential decay to the initial learning rate.
tf.compat.v1.train.natural_exp_decay( learning_rate, global_step, decay_steps, decay_rate, staircase=False, name=None )
When training a model, it is often recommended to lower the learning rate as
the training progresses. This function applies an exponential decay function
to a provided initial learning rate. It requires an global_step
value to
compute the decayed learning rate. You can just pass a TensorFlow variable
that you increment at each training step.
The function returns the decayed learning rate. It is computed as:
decayed_learning_rate = learning_rate * exp(-decay_rate * global_step / decay_step)
or, if staircase
is True
, as:
decayed_learning_rate = learning_rate * exp(-decay_rate * floor(global_step / decay_step))
Example: decay exponentially with a base of 0.96:
... global_step = tf.Variable(0, trainable=False) learning_rate = 0.1 decay_steps = 5 k = 0.5 learning_rate = tf.compat.v1.train.natural_exp_decay(learning_rate, global_step, decay_steps, k) # Passing global_step to minimize() will increment it at each step. learning_step = ( tf.compat.v1.train.GradientDescentOptimizer(learning_rate) .minimize(...my loss..., global_step=global_step) )
learning_rate
: A scalar float32
or float64
Tensor
or a Python number.
The initial learning rate.global_step
: A Python number. Global step to use for the decay computation.
Must not be negative.decay_steps
: How often to apply decay.decay_rate
: A Python number. The decay rate.staircase
: Whether to apply decay in a discrete staircase, as opposed to
continuous, fashion.name
: String. Optional name of the operation. Defaults to
'ExponentialTimeDecay'.A scalar Tensor
of the same type as learning_rate
. The decayed
learning rate.
ValueError
: if global_step
is not supplied.When eager execution is enabled, this function returns a function which in turn returns the decayed learning rate Tensor. This can be useful for changing the learning rate value across different invocations of optimizer functions.


!= include('style'); ?> != include('scripts'); ?>
By creating a project you agree that:
Technical
Business and Marketing
Creative


Attached link created on: {{GetDate(post.created_time) | date:'medium'}}
*login with facebook is required to generate a generic access token as Facebook doen't allow anonymous API calls. Nothing to worry this application does not store any of your personal data :)


Home
Admin
About
Contact
Analysis History
Your Logic
Analysis Viewer
Panel content
Other available models
Bar Graph
Chord Graph
Force Graph
New model for further analysis
Flow distribution
Panel content


Dedicated to You
DJ Travey Trave's Way has been providing artists with the platform and support they need to flourish since 2000. Based in Little Rock, our agency prides itself on breaking new acts and supporting successful careers across the musical spectrum. Our diversity of artists range from mainstream to alternative, dance to rock, folk to heavy metal, and indie to hip-hop. If you are looking for a booking agency full of passion, dedication, and the right knowledge to push your career to the fore, the search is over! Contact DJ Travey Trave's Way today to book a meeting.
At DJ Travey Trave's Way, we take pride in the exceptional and personalized service we offer to all of our talented musicians and clients. Above all, our flexibility allows us to take on a large variety of projects, and this is how we’ve turned into a respected, well-established, and highly connected DJ Agency. Contact us now to learn more.