Git Product home page Git Product logo

actionrecorder's Introduction

LINK

PLEASE!

Our workload has made it difficult for us to update and fix bugs
New programmers are expected to be created!
We have therefore made some major changes to the Action Recorder add-on
For example, we have separated the Python files and added comments to make it easier for other programmers to understand
Please Fork this add-on!

Action Recorder

Are you tirred of coding long intimidating coding task just for one-off modeling? Or may be you're not good coding at all !
Introducing "ActionRecorder" !

ActRec is an add-on developed to streamline your work in Blender

This add-on is similar to Affinity Photo and Photoshop's "Action"
This add-on has been reborn! Command Recorder --> Action Recorder

This add-on is available for Free!
But, It takes a lot of coffee to develop an Add-on!

The update button has been moved!
⚠️ Be sure to use this button

Add-ons Explained

Convert complex, repetitive tasks into one click!

You have to remember is "Add" & "Play" Only!

Supported Versions: 2.83 to 2.9

Simplify complex repetitive tasks, which were difficult to do with the standard “Repeat Last”(Shift+R) function of Blender, by registering multiple actions.

You can register, edit and play back various tasks as you wish

For example, with the touch of a button, you can do routine tasks such as adding instant coffee, milk and sugar while boiling water and adding hot water!

(I've thought about it a few times, but unfortunately this add-on only allows you to register work within Blender.)


INSTALL


On the right side of this page, there is a "Release Link"
Download the Zip file from this button
The next step is the same as the normal add-on installation

Header Menu ->Edit > Preferences > Add-ons > Install

Select the Zip file you downloaded

Click the "Install Add-on" button

このページの右側に「Release」ボタンからZipファイルをダウンロードして下さい

Tutorial&Readme

🇯🇵日本語
※ 日本語解説の更新は停止します。前バージョンの記事で参考に出来ますが、詳しくは英語版でご覧ください

🇺🇸English


Update

https://github.com/InamuraJIN/ActionRecorder/wiki


Community

Discord
https://discord.gg/XTWbkFx


Bug Reports and Requests

actionrecorder's People

Contributors

rivinhd avatar github-actions[bot] avatar inamurajin avatar dependabot[bot] avatar chaosex avatar

Stargazers

 avatar  avatar  avatar "Linku" avatar  avatar Nazir avatar  avatar Armann Gudmundsson avatar  avatar  avatar  avatar Svetoslav Leif avatar  avatar Hank Chinaski avatar RubberMullet avatar David Bryan Roberson avatar  avatar NewTypo avatar  avatar  avatar Olof-Joachim Frahm (欧雅福) avatar Kitae Kim avatar  avatar  avatar Emir Sinan Gürlek avatar  avatar Andrii Orlov avatar  avatar  avatar  avatar  avatar achraf el allali avatar Pedro Valencia avatar  avatar  avatar Thitaree Udomsapaya avatar Aasif Haque avatar gnana sai reddy avatar  avatar  avatar Tiago Fernandes avatar Matheus Vargem avatar  avatar  avatar  avatar Aleksandr Vasilenko avatar Razvan B. avatar  avatar  avatar  avatar  avatar  avatar Constantine Vlasov avatar  avatar  avatar  avatar  avatar  avatar yenii avatar Ryan avatar Flavelius avatar Emre Özçelik avatar Semih Tok avatar TheParaziT avatar  avatar Lez avatar  avatar Draven avatar  avatar  avatar CP-Design avatar javier abanses avatar Rigging Dojo avatar Valdrin Shkreli avatar Wolfgang.IX avatar Alexander Rulkens avatar zuizuihao avatar Coder of Salvation / Leon van Kammen avatar Hina_Mikan avatar  avatar dachi_9797 avatar Aaron E-J avatar Marage avatar Nick Mitchell avatar Stranyan avatar Jacopo Riccioni avatar Westlake avatar  avatar VirtualPierogi avatar  avatar BK7 avatar  avatar Mike Seese avatar Yoichi Dan avatar  avatar  avatar  avatar Marlon Cuesta avatar  avatar nicolas santamaria avatar

Watchers

 avatar Rigging Dojo avatar MW avatar Jimmy Gunawan avatar Arie Leo avatar Lachlan avatar Konstantinos Kostovasilis avatar Craig Jones avatar  avatar  avatar  avatar Mizuko avatar  avatar

actionrecorder's Issues

Adding a Timer macro inside a loop completely breaks actions and crashes blender

Describe the bug
Putting a timer macro inside a loop completely breaks the action.
The action will be stuck in an endless loop like it is constantly pressing the "play" button after the timer is done.
Blender will also crash after a while.
It'll do this behavior even if the loop macro itself is disabled.
The loop works normally if no timer macro is inside.

The Timer behavior works properly when outside the loop
timer_working

But everything breaks when trying to do the same inside a loop, even if the loop is disabled.
I'm not repeatedly pressing play here, I'm just selecting new faces.
timer_broken

To Reproduce

  1. Create an action
  2. Add a Loop start
  3. Add any macro command
  4. Add a timer macro
  5. Add an End Loop

Expected behavior
The timer delay is properly respected, making stops between macros.
But instead it completely breaks the action, looping the action until blender crashes.

Version Information:

  • Add-on Version 4.0.8
  • Blender Version 3.6
  • OS: Windows 10

Does not install in 4.0.2

Following the install procedure, install succeeds but add-on does not appear in the list when searched for.

Wrong operator values adding macros if operator box is changed before

Describe the bug
Added or Recorded macros gets added with wrong operator parameters.

This happens because blender saves operator parameters changed by the user.

Notice on the video.
The first time, when changing the operator 'Merge', it is properly executed as:
bpy.ops.mesh.bridge_edge_loops(use_merge=True)
But on the next execution. It gets called as:
bpy.ops.mesh.bridge_edge_loops()
Even though it is executed with use_merge=True
This is a blender problem. It doesn't pass the operator values that has been changed by the user and uses a 'cached' value in the blender session somehow.

Not sure how to solve this. But this is very bad and can lead to a lot of confusion and problems if the user doesn't know about it.

operator_problme

To Reproduce
Steps to reproduce the behavior:

  1. Execute a command and change a value on the operator box
  2. Undo the command.
  3. Execute it again. The changed value is already there now.
  4. Add the macro with the '+' button
  5. Execute the macro

Expected behavior
Should be able to understand changed values on the operator box.

Version Information:

  • Add-on Version 4.0.8
  • Blender Version 3.6
  • OS: Windows 10

Insert keyframe in VSE

Hello, Congratulations, it is an excellent job

Just a doubt, I am trying to generate a macro for a speed ramp in the video editor, the problem is that it does not record the step corresponding to insert the keyframe, I do not know if I'm doing it right, I attach a screenshot.

imagen

Select the newly created macro

Would it be possible to select the new Macro, when it is created?

In the following screenshot, you can see that the first macro is still being selected. It would be less confusing if the selected line would be the one that has just been created with the + button.

235

Missing Global Actions, if the Internet connection is dissable.

Good day.

Thank you for your hard work.

Windows 10; Blender 2.83.4; Action Recorder 3.4.1;

The macro buttons of Action Recorder add-on disappear in the Global Actions column (the entire column becomes empty), if the computer is disconnected from the Internet.

If the Internet connection is reopened, the macro buttons reappear in Global Actions.

What could be the problem and how it can be fixed?
Is the add-on connecting to something in the Internet to work?

Recording a Bevel doesn't work well

Add-on version: 3.5.15
Blender version: 2.91 (stable)

I am using Blender 2.91 (official stable version) and after copying the Bevel macro to Local, I tried to play it on an edge. But nothing happened.

When I manually add a bevel on an edge by myself (ctrl+b) here is what I see in the Info Editor (and it works):
bpy.ops.mesh.bevel(offset=0.2, offset_pct=0, affect='EDGES')

But when I edit the Bevel macro in Action Recorder, it seems different (and it doesn't work):
bpy.ops.mesh.bevel(offset=0.15, offset_pct=0, vertex_only=False)

Maybe this "Bevel" macro of Action Recorder doesn't work because the operator has changed in Blender 2.91 API ?

08_214049

Error when adding "Apply location/rotation/scale" as a macro

Describe the bug
Getting an error message when trying to add "Apply location, rotation or scale" for selected object as a macro.

To Reproduce
Steps to reproduce the behavior:

  1. Select a mesh object
  2. Apply location, rotation and/or scale (Ctrl+A)
  3. Press "+" on "Macro Editor"
  4. Get error

Report: Error
Python: Traceback (most recent call last):
File "C:\Users\mikae\AppData\Roaming\Blender Foundation\Blender\4.0\scripts\addons\Action Recorder\actrec\operators\macros.py", line 130, in execute and functions.compare_op_dict(ops_values, tracked[3]))
File "C:\Users\mikae\AppData\Roaming\Blender Foundation\Blender\4.0\scripts\addons\Action Recorder\actrec\functions\macros.py", line 240, in compare_op_dict
value = op2_props.get(key, None)
AttributeError: 'numpy.str_' object has no attribute 'get'

Screenshots
image

Version Information:

  • Add-on Version 4.1.0
  • Blender Version 4.0.1
  • Windows 10

Default Global actions(Storage.json) have deprecated and old code, which doesn't work

Describe the bug
Global actions that ships with the addon have deprecated code. (https://github.com/InamuraJIN/ActionRecorder/blob/master/ActRec/Storage.json)
The global actions from External->Scatter and BackUP don't work.
Might be others, I haven't checked all.

Looking around, it seems they originally depended on https://github.com/RivinHD/ScriptToButton/tree/master
And on local configuration files of it. Calling commands like
bpy.ops.stb.scriptbutton(btn_name=\"PlayAnim3\")
Also, the other addon seems to use script_button now, so this should be some pretty old code that was left over.

It would also be nice if the default global actions included some of the actions shown in the "Product Movie" trailer video.
https://www.youtube.com/watch?v=OA0vjP7D4Ec&t=58s
Just so we have some more examples of its utility to explore. The video shows the "slow/before version" so its nice to see what macros that translates to.
I can't quite figure our how to translate that hair mesh alignment one into macros, for example.

To Reproduce
Steps to reproduce the behavior:

  1. Rename the name to "Passive" (scatter seems to search for that object to work on)
  2. Execute the global action Scatter

Expected behavior
Scattered objects.
But gets error while trying to call bpy.ops.stb.scriptbutton

Version Information:

  • Add-on Version 4.0.8
  • Blender Version 3.6
  • OS: Windows 10

PS:
Trying to run an action with the execution mode ´Individual´ does not work.
I was going to make a PR to fix this but it seems you(@RivinHD) already fixed this in your local fork quite a while back.
It's just that its not merged here yet.
Not sure if I should post an issue here to keep track or not. Or just wait for the next minor release.
So adding this section here, so you can decide.

Script Event

Add a Script Event that can be used to run a script in the TextEditor from an action.

Blender 4.1 Bug - Font DejaVu not found

Describe the bug
When clicking on the Macro Editor to edit an action, I get an error looking for the DejaVu font, which now is no-longer used in Blender 4.0+.

To Reproduce
Steps to reproduce the behavior:

  1. Go to 'Macro Editor panel'
  2. Click on a new action to edit it
  3. See error

Expected behavior
No error

Screenshots
image

Version Information:

  • Add-on Version [e.g. 4.0.8]
  • Blender Version [e.g. 4.1.0 + 4.0.2]
  • OS: Windows

FileNotFoundError: [Errno 2] No such file or directory: 'datafiles/fonts/DejaVuSans.woff2'

Describe the bug
When I click on a macro element in the macro editor, I systematically get this error:
FileNotFoundError: [Errno 2] No such file or directory: 'datafiles/fonts/DejaVuSans.woff2'

To Reproduce
Steps to reproduce the behavior:

  1. Install the addon
  2. Record a simple macro
  3. Try to edit the macro

Expected behavior
I guess a pop-up should appear? I don't know since I'm using the addon for the first time.

Screenshots

image

Version Information:

  • Add-on Version: 4.1.0
  • Blender Version: 3.6.2 (from apt repositories)
  • OS: Ubuntu 23.10

Additional context
I search my system for a file named DejaVuSans.woff2 and found these 2:
/usr/share/blender/datafiles/fonts/DejaVuSans.woff2
/usr/share/fonts/woff2/dejavu/DejaVuSans.woff2

Note: After installing the add-on, when I tried to activate it I got an error about module ensurepip not being found.
I solved this by running this command:
sudo apt install python3-pip python3-venv

Issue playing back macro "Copy as new Driver" with shapekeys

Tried to record a macro of "Copy as New Driver" of an object's shapekey value, and "paste as driver" onto another objects shapekey value. the recording worked fine, but attempting to play the macro in another file, after saving to global, produced a 'context' error.
image_2023-10-13_000834480
image_2023-10-13_000950648

Blender 4.0 - error with SubdivisionSurface

Describe the bug
Thanks for a very useful addon.
In Blender 4.0, when trying to write a sequence of commands SubdivisionSurface with a value greater than 1, an error appears:

" Python: Traceback (most recent call last):
File "C:\Users\design\AppData\Roaming\Blender Foundation\Blender\4.0\scripts\addons\ActionRecorder\actrec\operators\locals.py", line 439, in execute
copy_dict = functions.create_object_copy(context, parent, name)
File "C:\Users\design\AppData\Roaming\Blender Foundation\Blender\4.0\scripts\addons\ActionRecorder\actrec\functions\macros.py", line 574, in create_object_copy
id_object = get_id_object(context, source_path, attribute)
File "C:\Users\design\AppData\Roaming\Blender Foundation\Blender\4.0\scripts\addons\ActionRecorder\actrec\functions\macros.py", line 506, in get_id_object
return trace_object(context, source_path)
File "C:\Users\design\AppData\Roaming\Blender Foundation\Blender\4.0\scripts\addons\ActionRecorder\actrec\functions\macros.py", line 523, in trace_object
index = int(index_str.replace("]", ""))
ValueError: invalid literal for int() with base 10: '"Subdivision"'

To Reproduce

  • LocalActions "+"
  • Record
  • AddModifier "Subdivision Surface"
  • Change value Levels viewport "3"
  • Stop
  • Have bug report aforecited

Expected behavior
recording a sequence of actions

Screenshots
screen

Version Information:

  • Add-on Version 4.0.8
  • Blender Version 4.0
  • OS: Windows 10

Additional context
Thanks again for the wonderful addon

2 bugs with Move Down button (in Global Actions)

Blender version: 2.91
Add-on version: 3.5.6

bug 1:
In the "Global Actions - Edit Mode" category, if you move down the fist button (Merge), when this button reaches the end of the "Edit Mode" category, a "Delete" button appears.

bug 2:
And if you continue to click on the "Move Down" button, you can notice that it continues to move down in an "invisible category", and the button re-appears in the "UV Mode" Category but as "Merge".

When you continue to click on "Move Down", when the "Merge" button reaches the end of the "External" category, it stops moving correctly.

QcYU5tT1Ft

To sum up:

  • When the button reaches the end of the "Edit Mode" category, the "Merge" button is renamed "Delete" (where does this Action come from? It wasn't there in the Global Actions before..
  • Between the "Edit Mode" and "UV Mode" categories, there seems to be an invisible category

Install Error in Blender 3.2.0

Traceback (most recent call last):
  File "C:\Program Files\Blender Foundation\Blender 3.2\3.2\scripts\modules\addon_utils.py", line 335, in enable
    mod = __import__(module_name)
ModuleNotFoundError: No module named 'ActionRecorder-1'

Give more information in tooltips

Some tooltips are not very clear. They don't give enough information.

2118312

In this example, why is there "Value"? What does it mean?
I think the tooltip should contain a line like "Click this button to select this Macro". Then, you will be able to copy it to Local if you want to".

ERROR Positional Argument

Tested on Blender 32, 33, 34, 35, all broken:

Creation Action, Record, transform scale object, stop record, error message appear:

But basically none of action is recorded or working.

Screenshot 2022-11-15 at 8 37 53 am

Clicking on "+" brings back the last macro performed in the viewport

When the Macro Editor is empty, adding a new macro brings back the previous macro that has been executed in the viewport.

  1. Select an object in the viewport
  2. Click on the "Record" button
  3. Move the object in the viewport
  4. Click on the "Stop" button
  5. Delete the object in the viewport
  6. Delete the "Move" macro in the Macro Editor (or Clear the Macro Editor)
  7. Click on the "+" button

At this moment, you should notice that the newly created macro is named "Delete"

ghjghg

Category Order does not save

Category Order is not recalled when re-openeing Blender Saved Sessions. Auto save enabled, Save to file "Pressed" prior to saving file, then Quit Blender 2.91-2.92

Within the file directory, Category Order, and Names do reflect the changes made and saved. When re-opening (any) saved Blender file, the Category order is not as saved.. (OSX 10.14).
But upon re-opening the same Blender file, within the File directory, the Category names and order revert back to unsorted.

1-Category Order upon saving
2-Category Order reflected in defualt directory
3-Category Order upon re-opening same doc

UPDATE - upon pressing "Save to File", the changes are relcted in the file structure, then, immediately upon pressing "Load from File", the file directory naming reverts back to unsorted.
*pressing "Save to File" then "Load from File" 2 or more times will yeild a different sort order with each time.

Category.Order.mp4

(performed clean install of blender 2.91-2.92, re-installed addon. problem persists) (disk util shows no error on dsk) defualt folder preferences chosen)

Thanks very much. (hope it is on my end, i see no other mentions). cheers to you and yours. be well.

ActRec duplicates recorded macros when the Operator Context Menu is used

Animated GIF (sorry for the slow speed)

WlvUh5EdpS

After recording a "Bevel" macro (with 3 segments, with the Operator Context Menu), here is what happens:

  • it records 2 Bevels
  • then when I play the macro, it doesn't create the Bevel with the same settings that I typed in the Contextual Menu (the popup that appears at the bottom left corner of the viewport):

Paypall won't let me donate to you

Hello,

When I tried to send a paypal donation to thank you for Action Recorder, paypal said that your account could not receive any more money until you "provided paypal with more information" whatever that means.
Action Recorder is very useful, and I'd like to donate to thank you for your work but it doesn't seem like there's any way to do that.

Thanks-
Ocean

Error in console after closing Blender

Blender version : 2.91 official
Add-on version: 3.5.6

When you close Blender, you can see the following error in the console :

Exception in module unregister(): 'C:\\Users\\xan2622\\AppData\\Roaming\\Blender Foundation\\Blender\\2.91\\scripts\\addons\\ActionRecorder-master\\__init__.py'
Traceback (most recent call last):
  File "E:\blender_Portable\2.91\scripts\modules\addon_utils.py", line 434, in disable
    mod.unregister()
  File "C:\Users\xan2622\AppData\Roaming\Blender Foundation\Blender\2.91\scripts\addons\ActionRecorder-master\__init__.py", line 27, in unregister
    bpy.utils.unregister_class(cls)
RuntimeError: unregister_class(...):, missing bl_rna attribute from 'RNAMeta' instance (may not be registered)

Blender crash on Action that scales and moves UV islands

Blender crashes when trying to run an action that attempts to scale and move selected UV islands.

The action was recorded using keyboard shortcuts (e.g. S 0.75 [enter] G X -0.12 [enter] G Y 0.225 [enter])

To Reproduce
Enter UV edit mode
Select UVs
Create Action
Go into record
Type S 0.5 [enter] G X 0.25 [enter] G Y -0.5 [enter]
Stop record
Reset UVs to previous (just for debugging purposes)
Press 'Play' on Action

Expected behavior
In the UV editor, with some UV islands selected, they should be scaled and moved in the same way as the recorded Action
Instead, Blender crashes

Screenshots
Video of process: https://youtu.be/mBA70D6ps7c (unlisted)

Version Information:

  • Add-on Version 4.07
  • Blender Version 3.4.1
  • OS: Windows10

Additional context
Crash Log provided:
box_uv.crash.txt

The steps to copy a Local macro to Global are not clear

I think the process to copy Local macros to Global is not very clear.
When I clicked on the "Local to Global" button, a message appeared: "Record to button".

At first I thought "What does this mean? What do have I to do?" But after watching the video tutorial, I have been able to understand that I first had to create a category in the "Advanced" drop-down menu.

It's cool that there are videos (they help) but I think that adding Macros to Global could be better explained without needing to read docs.

Suggestion: When there's no category, instead of showing the "Record to button" message, maybe there could be a message like "Add a Category first. To do that, go to the Advanced drop-down menu".

224823

Macro import

Nice to see new versions of this addon absulutely love it for me its the one the best usefull addon for blender but unfortunately ı cant import my macros from 3.5.6 version to 4.0.7 I'm using blender 3.3.3

Extrude Normal and Value Randomize

Hi Jin-san, thanks for this awesome addon. It reminds me of CommandRecorder addon but a bit cleaner.

I wonder what's your tips if I want to make procedure macro, but also want a bit of adjustment / variation, random values?

Let say I like just random extrusions, but I need to change value and I also need to extrude normal, what do you think?

install on blender V 3.4.1

Hi There!

I am trying to install the add-on in V3.4.1 and the install don't give any error but the add-on is not listed to enable it :(
Any clue?

zip installed is ActionRecorder-master.zip

Thanks!
Dany

Difficult to know where to click to add or change the icon

Without watching the video tutorial or reading the documentation, the user can't know where he/she has to click to add an icon.
By default the line doesn't show anything.

211052

I think that there should be a solid color 🟦 or a square 🔳 to indicate the user where to click to change the icon.

211053

211830

Error when deactivating Action Recorder 3.5.6

Blender version: 2.91
Add-on version: 3.5.6

In Preferences > Addons, if you just deactivate "Action Recorder" (not "Remove"), you should see this message:

Traceback (most recent call last):
  File "E:\blender_portable\2.91\scripts\modules\addon_utils.py", line 434, in disable
    mod.unregister()
  File "C:\Users\Sebastien\AppData\Roaming\Blender Foundation\Blender\2.91\scripts\addons\ActionRecorder-master\__init__.py", line 27, in unregister
    bpy.utils.unregister_class(cls)
RuntimeError: unregister_class(...):, missing bl_rna attribute from 'RNAMeta' instance (may not be registered)

Typos

I have noticed a small typo in the Add-on Preferences:

"Strage" instead of "Storage"
11523

"Delet" instead of "Delete"
211831

Play Action on all selected objects

At the moment it's great for a 1 object at a time workflows (active). It would be nice to be able to run the script on all selected objects.

import bpy

for obj in bpy.context.selected_objects:
    bpy.context.view_layer.objects.active = obj

    # Put Operator Chain here
    bpy.ops.ar.record_play()

I use this script to do this, but if the button had this built in it would be great. Run on all selected.

Recording of Bezier Control editing

Blender version: 2.92.0
Add-on version: 3.5.6

Issue: Bezier curve editing is not recorded.

To Reproduce:

  1. Click "record" in ActionRecorder
  2. Create a Bezier Curve
  3. Press Tab to go into edit mode
  4. Move one of the control points
  5. Press Tab to go into object mode
  6. Stop recording in ActionRecorder
  7. Press Play
  8. Notice that the curve edit is not recorded

This issue I think is more to do with Blender than ActionRecorder. When clicking to select one of the control points, blender does not produce a command. The recorded bpy.ops.transform.translate therefore does not know which control point has been selected.

The command which Blender doesn't output would be something like:

bpy.data.curves['BezierCurve'].splines[0].bezier_points[0].select_control_point = True

Can't Record vertex Rip action

Hi I want to make record the Rip vertex action.
while it does record the action, it does not actualy rip the vertexes when playing the action over.

And Seperate selection ( Shortkey "p") wil not record at all.

Can this be fixed?
Using blender 3.0.1

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.