Developing the RobotDesigner ============================ Setting up the development environment -------------------------------------- This section describes how to setup an environment for developing the RobotDesigner including a description of the suggested tools. .. note:: This section assumes that you use either `Ubuntu Linux `_ or Mac OS X. The RobotDesigner (and Blender Plugins in general) are written in `Python `_. If you downloaded Blender as an archive from the dedicated website Python will be shipped with the package, if you installed it via package manager you will at first require a python installation. On Linux, you have to write the following commands in a terminal: .. code-block:: console $ sudo apt-get install python3, python3-pip $ pip3 install virtualenv `Pip `_ is a package manager for Python and `virtualenv `_ creates a *virtual* environment where you can install additional Python Packages and tools while only affecting your project. On MacOS it is suggested to install python via `homebrew `_. After its installation, run the following commands: .. code-block:: console user@hbp $ brew install python3 user@hbp $ pip3 install virtualenv Now you need to download the RobotDesigner repository and to setup a virtual environment within its folder. .. code-block:: console user@hbp ~$ cd projects user@hbp ~/projects $ git clone ... user@hbp ~/projects$ cd RobotDesigner/ user@hbp ~/projects/RobotDesigner$ virtualenv -p /usr/local/bin/python3.4 venv user@hbp ~/projects/RobotDesigner$ source venv/bin/activate (venv)user@hbp ~/projects/RobotDesigner$ pip install -r robot_designer_plugin/requirements.txt (venv)user@hbp ~/projects/RobotDesigner $ deactivate user@hbp RobotDesigner $ In order to work on the RobotDesigner, you need an `IDE `_ (or text editor). Modern IDEs provide you with features such as `code completion `_, and automated `refactoring `_, `syntax highlighting `_, `static code analysis `_, `version control (e.g., GIT) `_ and much more. The suggested IDE is the `community edition of Pycharm `_ which is free to used in open source projects. A good alternative is the `Atom editor `_ which can be configured for the work with Python projects. Editing with PyCharm (TM) ------------------------- .. .. sidebar:: `Pycharm `_ .. .. image:: images/pycharm.svg :width: 200px :align: center A brief description on how to configure the virtual environment with PyCharm can be found in the image below, please follow the indexed steps. .. figure:: images/interpreter.png :align: center :scale: 20% Setup for Pycharm with a virtual env (click to enlarge). Editing with Atom ----------------- .. .. sidebar:: `Atom.io `_ .. .. image:: images/atom.png :width: 200px :align: center This editor is an interesting alternative for developing Python projects. According to its web page it is A hackable text editor for the 21st Century in the ``resources/templates`` folder of the RobotDesigner repository there are templates for setting up the development environment. First, download and install the editor (from the homepage or a package manager). Open the editor and add the RobotDesigner project (``File->Add Project Folder``). Then close the editor and run the following commands to install the proposed setup: .. code-block:: console user@hbp ~$ cd projects/RobotDesigner user@hbp ~/projects/RobotDesigner$ cd resources/templates user@hbp ~/projects/RobotDesigner/resources/templates$ apm install --packages-file package-list.txt user@hbp ~/projects/RobotDesigner/resources/templates$ pip3 --install atom-requirements.txt user@hbp ~/projects/RobotDesigner/resources/templates$ cat projects.cson >> ~/.atom/projects.cson This gives you a basic configuration for the editor. .. note:: This section is currently under development. For more information, please refer to the documentation of the individual packages: * `atom-beautify `_ * `autocomplete-python `_ * `hyperclick `_ * `language-restructuredtext `_ * `linter `_ * `linter-flake8 `_ * `open-recent `_ * `project-manager `_ Geometric operations in Blender ------------------------------- If executed in a text editor in Blender, add these lines first: .. code-block:: python import bpy C = bpy.context D = bpy.data .. code-block:: python scnd = [i for i in bpy.context.selected_objects if i.type =='MESH'][0] model = C.active_object Together with :term:`condition` :class:`robot_designer_plugin.operators.helpers.ModelSelected`. :term:`Pose` of segment in :term:`world coordinates` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ For example, Place an object (second) at the coordinate frame of the segment. .. code-block:: python pose_bone = C.active_object.pose.bones[C.active_bone.name] global_pose = model.matrix_world * pose_bone.matrix scnd.matrix_world = global_pose Relative :term:`pose` to segment ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Retrieve the relative posiion of an object to a segment: .. code-block:: python pose_bone = C.active_object.pose.bones[C.active_bone.name] relative_pose = pose_bone.matrix.inverted() * model.matrix_world.inverted() * scnd.matrix_world Bezier curves ^^^^^^^^^^^^^ .. code-block:: python import bpy from mathutils import Vector, Matrix C = bpy.context D = bpy.data model = C.active_object pose_bone = C.active_object.pose.bones[C.active_bone.name] parent_bone = C.active_object.pose.bones[C.active_bone.parent.name] parent_frame = model.matrix_world * parent_bone.matrix parent_to_bone = parent_frame.inverted() * bezier.matrix_world bone_to_parent = bezier.matrix_world.inverted() * parent_frame l = bone_to_parent.translation.length bevel= bpy.ops.curve.primitive_bezier_circle_add(radius=l/0.25) bezier=bpy.ops.curve.primitive_bezier_curve_add() bezier.bevel_object = bevel bezier.matrix_world = model.matrix_world * pose_bone.matrix print(bezier.matrix_world) #e= C.active_bone.RobotEditor.Euler bpy.ops.object.mode_set(mode="EDIT",toggle=False) a=bezier.data.splines[0].bezier_points[0] b=bezier.data.splines[0].bezier_points[1] a.co = (0,0,0) b.co = bone_to_parent.translation v1 = bone_to_parent.translation max_v1 = max ( abs(i) for i in v1) print(v1,max_v1) v1 = [ 0.1*i/max_v1 if abs(i)==max_v1 else 0.0 for i in v1] v2 = parent_to_bone.translation max_v2 = max ( abs(i) for i in v2) v2 = [ 0.1*i/max_v2 if abs(i)==max_v2 else 0.0 for i in v2] #v2 = Vector(v2)#.to_4d() #v2[3]=0.0 a.handle_right=v1 #a.handle_left=-1 * a.handle_right print(v1,a.handle_right,a.handle_left) m=Matrix() m.translation = v2 #m[3][3] = 0 #b.co = (bone_to_parent *m).translation print(m, bone_to_parent.inverted() * parent_frame * m) b.handle_left=(bone_to_parent * m).translation #b.handle_left=-1 * b.handle_right print(v2,b.handle_right,b.handle_left) #print(a.co,b.co) bpy.ops.object.mode_set(mode="OBJECT",toggle=False) Building the documentation -------------------------- The requirements necessary to build the documentation can be found in the requirements_docu.txt file. The documentation is generated with the Python documentation generator `Sphinx `__. It can be build with the following terminal command from within the BlenderRobotDesigner folder: .. code-block:: sphinx-build -b html docu/ output_dir A preview of the documenation build can be seen by opening the index.html file from the build folder. The resulting output files need to be pushed to the GitHub repository branch *gh-pages* to make the documentation available online.