diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2011-10-11 01:15:11 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2011-10-11 01:15:11 +0400 |
commit | d546002476a849524ba938c53a5d9e9a81c50ded (patch) | |
tree | 37a5b2b8eec0832779cfd9bc172e0ac29d3098e6 /doc | |
parent | 28cc31ba11f805c4cac2a250b4181ec9c556b8da (diff) | |
parent | 9cabc57a62e8db17edd09839d7ae200239fb3618 (diff) |
Merged changes in the trunk up to revision 40911.
Conflicts resolved:
source/blender/blenloader/intern/readfile.c
Diffstat (limited to 'doc')
-rw-r--r-- | doc/build_systems/cmake.txt | 51 | ||||
-rw-r--r-- | doc/python_api/examples/aud.py | 6 | ||||
-rw-r--r-- | doc/python_api/rst/change_log.rst | 571 | ||||
-rw-r--r-- | doc/python_api/sphinx_changelog_gen.py | 5 | ||||
-rw-r--r-- | doc/python_api/sphinx_doc_gen.py | 24 |
5 files changed, 615 insertions, 42 deletions
diff --git a/doc/build_systems/cmake.txt b/doc/build_systems/cmake.txt index 1ff621c6e96..d0e8a088ca7 100644 --- a/doc/build_systems/cmake.txt +++ b/doc/build_systems/cmake.txt @@ -11,7 +11,7 @@ $Id$ 3. Obtaining Dependencies 4. Deciding on a Build Environment 5. Configuring the build for the first time - 6. Configuring the build after CVS updates + 6. Configuring the build after SVN updates 7. Specify alternate Python library versions and locations @@ -36,7 +36,7 @@ $Id$ http://www.blender.org/cms/Getting_Dependencies.135.0.html that you have all dependencies needed for building Blender. Note that for windows many of these dependencies already come in the lib/windows - module from CVS. + module from SVN. 4. Deciding on a Build Environment ---------------------------------- @@ -47,8 +47,8 @@ $Id$ have been successfully used to generate build files for the following environments: - 1. Microsoft Visual Studio 2005. There is a free version available - at http://msdn.microsoft.com/vstudio/express/visualc/. + 1. Microsoft Visual Studio 2008. There is a free version available + at http://http://www.microsoft.com/visualstudio/en-us/products/2008-editions/express 2. Xcode on Mac OSX @@ -65,7 +65,7 @@ $Id$ with different Blender configurations (Audio/NoAudio, GameEngine/NoGameEngine etc.) while maintaining a clean source tree. It also makes it possible to generate files for different build systems on the same source tree. This also has benefits for - general CVS management for the developer as patches and submit logs are much cleaner. + general SVN management for the developer as patches and submit logs are much cleaner. Create a directory outside the blender source tree where you would like to build Blender (from now on called $BLENDERBUILD). On the commandline you can then run @@ -78,27 +78,27 @@ $Id$ % cd $BLENDERBUILD % cmake - ... - ... - --version [file] = Show program name/version banner and exit. + ... + ... + --version [file] = Show program name/version banner and exit. - Generators + Generators - The following generators are available on this platform: - KDevelop3 = Generates KDevelop 3 project files. - Unix Makefiles = Generates standard UNIX makefiles. - Xcode = Generate XCode project files. + The following generators are available on this platform: + KDevelop3 = Generates KDevelop 3 project files. + Unix Makefiles = Generates standard UNIX makefiles. + Xcode = Generate XCode project files. % cmake -G Xcode $BLENDERSOURCE - ... - ... - -- Configuring blender - -- Configuring blenderplayer - -- Configuring done - -- Generating done - -- Build files have been written to: $BLENDERBUILD + ... + ... + -- Configuring blender + -- Configuring blenderplayer + -- Configuring done + -- Generating done + -- Build files have been written to: $BLENDERBUILD This will generate the build files with default values. Specific features can be enabled or disabled by running the ccmake "GUI" from $BLENDERBUILD as follows: @@ -114,15 +114,15 @@ $Id$ It is also possible to use the commandline of 'cmake' to override certain of these settings. - 6. Configuring the build after CVS updates + 6. Configuring the build after SVN updates ------------------------------------------ The $BLENDERBUILD directory maintains a file called CMakeCache.txt which remembers the initial run's settings for subsequent generation runs. After - every CVS update it may be a good idea to rerun the generation before building + every SVN update it may be a good idea to rerun the generation before building Blender again. Just rerun the original 'cmake' run to do this, the settings will be remembered. For the example above the following will do after every - 'cvs up': + 'svn up': % cmake -G Xcode $BLENDERSOURCE @@ -132,9 +132,9 @@ $Id$ The commandline can be used to override detected/default settings, e.g: On Unix: - cmake -D PYTHON_LIBRARY=/usr/local/lib/python3.1/config/libpython3.1.so -D PYTHON_INCLUDE_DIRS=/usr/local/include/python3.1 -G "Unix Makefiles" ../blender + cmake -D PYTHON_LIBRARY=/usr/local/lib/python3.2/config/libpython3.2.so -D PYTHON_INCLUDE_DIR=/usr/local/include/python3.2 ../blender On Macs: - cmake -D PYTHON_INCLUDE_DIRS=/System/Library/Frameworks/Python.framework/Versions/3.1/include/python3.1 -G Xcode ../blender + cmake -D PYTHON_INCLUDE_DIRS=/System/Library/Frameworks/Python.framework/Versions/3.2/include/python3.2 -G Xcode ../blender Mote that this should only be needed once per build directory generation because it will keep the overrides in CMakeCache.txt for subsequent runs. @@ -153,4 +153,3 @@ $Id$ on the various platforms. /Jacques Beaurain (jbinto) - diff --git a/doc/python_api/examples/aud.py b/doc/python_api/examples/aud.py index e41e8214cc0..2c74d6a0eb1 100644 --- a/doc/python_api/examples/aud.py +++ b/doc/python_api/examples/aud.py @@ -11,10 +11,10 @@ device = aud.device() factory = aud.Factory('music.ogg') # play the audio, this return a handle to control play/pause -handle = device.play(sound) +handle = device.play(factory) # if the audio is not too big and will be used often you can buffer it -factory_buffered = aud.Factory.buffer(sound) -handle_buffered = device.play(buffered) +factory_buffered = aud.Factory.buffer(factory) +handle_buffered = device.play(factory_buffered) # stop the sounds (otherwise they play until their ends) handle.stop() diff --git a/doc/python_api/rst/change_log.rst b/doc/python_api/rst/change_log.rst index e7db5df4a1f..d332c4faff4 100644 --- a/doc/python_api/rst/change_log.rst +++ b/doc/python_api/rst/change_log.rst @@ -909,3 +909,574 @@ Added * :class:`bpy.types.SceneGameData.use_glsl_color_management` + +2.58 to 2.59 +============ + +bpy.types.Scene +--------------- + +Function Arguments +^^^^^^^^^^^^^^^^^^ + +* :class:`bpy.types.Scene.collada_export` (filepath, selected), *was (filepath)* + +bpy.types.MultiresModifier +-------------------------- + +Added +^^^^^ + +* :class:`bpy.types.MultiresModifier.use_subsurf_uv` + +bpy.types.KeyMap +---------------- + +Removed +^^^^^^^ + +* **copy_to_user** + +Renamed +^^^^^^^ + +* **is_user_defined** -> :class:`bpy.types.KeyMap.is_user_modified` + +bpy.types.SceneRenderLayer +-------------------------- + +Added +^^^^^ + +* :class:`bpy.types.SceneRenderLayer.use_pass_material_index` + +bpy.types.ToolSettings +---------------------- + +Renamed +^^^^^^^ + +* **use_snap_project_self** -> :class:`bpy.types.ToolSettings.use_snap_self` + +bpy.types.UserPreferencesInput +------------------------------ + +Added +^^^^^ + +* :class:`bpy.types.UserPreferencesInput.ndof_fly_helicopter` +* :class:`bpy.types.UserPreferencesInput.ndof_lock_horizon` +* :class:`bpy.types.UserPreferencesInput.ndof_orbit_invert_axes` +* :class:`bpy.types.UserPreferencesInput.ndof_sensitivity` +* :class:`bpy.types.UserPreferencesInput.ndof_show_guide` +* :class:`bpy.types.UserPreferencesInput.ndof_zoom_invert` +* :class:`bpy.types.UserPreferencesInput.ndof_zoom_updown` + +Removed +^^^^^^^ + +* **edited_keymaps** +* **ndof_pan_speed** +* **ndof_rotate_speed** + +bpy.types.IDMaterials +--------------------- + +Function Arguments +^^^^^^^^^^^^^^^^^^ + +* :class:`bpy.types.IDMaterials.pop` (index, update_data), *was (index)* + +bpy.types.Material +------------------ + +Added +^^^^^ + +* :class:`bpy.types.Material.pass_index` + +bpy.types.RenderLayer +--------------------- + +Added +^^^^^ + +* :class:`bpy.types.RenderLayer.use_pass_material_index` + +bpy.types.Object +---------------- + +Added +^^^^^ + +* :class:`bpy.types.Object.closest_point_on_mesh` + +bpy.types.ThemeNodeEditor +------------------------- + +Added +^^^^^ + +* :class:`bpy.types.ThemeNodeEditor.noodle_curving` + +bpy.types.ChildOfConstraint +--------------------------- + +Added +^^^^^ + +* :class:`bpy.types.ChildOfConstraint.inverse_matrix` + +bpy.types.KeyConfigurations +--------------------------- + +Added +^^^^^ + +* :class:`bpy.types.KeyConfigurations.addon` +* :class:`bpy.types.KeyConfigurations.user` + +bpy.types.Image +--------------- + +Added +^^^^^ + +* :class:`bpy.types.Image.use_generated_float` + +bpy.types.KeyMapItem +-------------------- + +Added +^^^^^ + +* :class:`bpy.types.KeyMapItem.is_user_modified` + + +2.59 to 2.60 +============ + +.. These have been manually added wait until RC to do final changelog! + +bpy.types.MeshTextureFace +------------------------- + +Removed +^^^^^^^ + +* **use_image** +* **use_object_color** +* **use_blend_shared** + +Moved +^^^^^ + +* **hide** -> :class:`bpy.types.Material.game_settings.invisible` +* **use_collision** -> :class:`bpy.types.Material.game_settings.physics` +* **use_light** -> :class:`bpy.types.Material.game_settings.use_shadeless` +* **use_twoside** -> :class:`bpy.types.Material.game_settings.backface_culling` +* **use_bitmap_text** -> :class:`bpy.types.Material.game_settings.text` +* **blend_type** -> :class:`bpy.types.Material.game_settings.alpha_blend` +* **use_alpha_sort** -> :class:`bpy.types.Material.game_settings.alpha_blend` +* **use_billboard** -> :class:`bpy.types.Material.game_settings.face_orientation` +* **use_halo** -> :class:`bpy.types.Material.game_settings.face_orientation` +* **use_shadow_cast** -> :class:`bpy.types.Material.game_settings.face_orientation` + +.. Automatically Generated, 2.59 -> r40804! + +bpy.types.RenderSettings +------------------------ + +Added +^^^^^ + +* :class:`bpy.types.RenderSettings.ffmpeg_audio_channels` + +bpy.types.DriverTarget +---------------------- + +Added +^^^^^ + +* :class:`bpy.types.DriverTarget.transform_space` + +Removed +^^^^^^^ + +* **use_local_space_transform** + +bpy.types.Sound +--------------- + +Added +^^^^^ + +* :class:`bpy.types.Sound.factory` +* :class:`bpy.types.Sound.use_mono` + +bpy.types.Camera +---------------- + +Added +^^^^^ + +* :class:`bpy.types.Camera.view_frame` + +bpy.types.Scene +--------------- + +Added +^^^^^ + +* :class:`bpy.types.Scene.audio_volume` + +bpy.types.KeyingSet +------------------- + +Added +^^^^^ + +* :class:`bpy.types.KeyingSet.refresh` + +bpy.types.Armature +------------------ + +Added +^^^^^ + +* :class:`bpy.types.Armature.deform_method` + +bpy.types.GameObjectSettings +---------------------------- + +Added +^^^^^ + +* :class:`bpy.types.GameObjectSettings.obstacle_radius` +* :class:`bpy.types.GameObjectSettings.use_obstacle_create` + +bpy.types.BlendData +------------------- + +Added +^^^^^ + +* :class:`bpy.types.BlendData.speakers` + +bpy.types.SolidifyModifier +-------------------------- + +Added +^^^^^ + +* :class:`bpy.types.SolidifyModifier.thickness_vertex_group` + +bpy.types.ThemeGraphEditor +-------------------------- + +Added +^^^^^ + +* :class:`bpy.types.ThemeGraphEditor.handle_auto_clamped` +* :class:`bpy.types.ThemeGraphEditor.handle_sel_auto_clamped` + +bpy.types.CompositorNodeIDMask +------------------------------ + +Added +^^^^^ + +* :class:`bpy.types.CompositorNodeIDMask.use_smooth_mask` + +bpy.types.Node +-------------- + +Added +^^^^^ + +* :class:`bpy.types.Node.parent` + +bpy.types.Texture +----------------- + +Added +^^^^^ + +* :class:`bpy.types.Texture.evaluate` + +bpy.types.UILayout +------------------ + +Added +^^^^^ + +* :class:`bpy.types.UILayout.template_keymap_item_properties` + +bpy.types.ToolSettings +---------------------- + +Added +^^^^^ + +* :class:`bpy.types.ToolSettings.use_multipaint` + +bpy.types.UserPreferencesInput +------------------------------ + +Added +^^^^^ + +* :class:`bpy.types.UserPreferencesInput.ndof_panx_invert_axis` +* :class:`bpy.types.UserPreferencesInput.ndof_pany_invert_axis` +* :class:`bpy.types.UserPreferencesInput.ndof_panz_invert_axis` +* :class:`bpy.types.UserPreferencesInput.ndof_roll_invert_axis` +* :class:`bpy.types.UserPreferencesInput.ndof_rotate_invert_axis` +* :class:`bpy.types.UserPreferencesInput.ndof_tilt_invert_axis` + +bpy.types.LockedTrackConstraint +------------------------------- + +Added +^^^^^ + +* :class:`bpy.types.LockedTrackConstraint.head_tail` + +bpy.types.SpaceGraphEditor +-------------------------- + +Moved +^^^^^ + +* use_fancy_drawing -> :class:`bpy.types.SpaceGraphEditor.use_beauty_drawing` + +bpy.types.ParticleSystem +------------------------ + +Added +^^^^^ + +* :class:`bpy.types.ParticleSystem.dt_frac` + +bpy.types.Mesh +-------------- + +Added +^^^^^ + +* :class:`bpy.types.Mesh.use_paint_mask_vertex` + +bpy.types.FCurve +---------------- + +Removed +^^^^^^^ + +* **use_auto_handle_clamp** + +bpy.types.DampedTrackConstraint +------------------------------- + +Added +^^^^^ + +* :class:`bpy.types.DampedTrackConstraint.head_tail` + +bpy.types.ImageTexture +---------------------- + +Added +^^^^^ + +* :class:`bpy.types.ImageTexture.use_derivative_map` + +bpy.types.SoundSequence +----------------------- + +Added +^^^^^ + +* :class:`bpy.types.SoundSequence.pan` +* :class:`bpy.types.SoundSequence.pitch` + +Removed +^^^^^^^ + +* **attenuation** + +bpy.types.FModifier +------------------- + +Added +^^^^^ + +* :class:`bpy.types.FModifier.blend_in` +* :class:`bpy.types.FModifier.blend_out` +* :class:`bpy.types.FModifier.frame_end` +* :class:`bpy.types.FModifier.frame_start` +* :class:`bpy.types.FModifier.influence` +* :class:`bpy.types.FModifier.use_influence` +* :class:`bpy.types.FModifier.use_restricted_range` + +bpy.types.EnvironmentMap +------------------------ + +Added +^^^^^ + +* :class:`bpy.types.EnvironmentMap.clear` +* :class:`bpy.types.EnvironmentMap.is_valid` +* :class:`bpy.types.EnvironmentMap.save` + +bpy.types.UserPreferencesSystem +------------------------------- + +Added +^^^^^ + +* :class:`bpy.types.UserPreferencesSystem.use_translate_interface` + +Removed +^^^^^^^ + +* **use_translate_buttons** +* **use_translate_toolbox** + +bpy.types.LimitDistanceConstraint +--------------------------------- + +Added +^^^^^ + +* :class:`bpy.types.LimitDistanceConstraint.head_tail` +* :class:`bpy.types.LimitDistanceConstraint.use_transform_limit` + +bpy.types.MovieSequence +----------------------- + +Added +^^^^^ + +* :class:`bpy.types.MovieSequence.stream_index` + +bpy.types.Material +------------------ + +Added +^^^^^ + +* :class:`bpy.types.Material.game_settings` + +bpy.types.Object +---------------- + +Added +^^^^^ + +* :class:`bpy.types.Object.matrix_parent_inverse` + +bpy.types.SequenceProxy +----------------------- + +Added +^^^^^ + +* :class:`bpy.types.SequenceProxy.build_100` +* :class:`bpy.types.SequenceProxy.build_25` +* :class:`bpy.types.SequenceProxy.build_50` +* :class:`bpy.types.SequenceProxy.build_75` +* :class:`bpy.types.SequenceProxy.build_free_run` +* :class:`bpy.types.SequenceProxy.build_free_run_rec_date` +* :class:`bpy.types.SequenceProxy.build_record_run` +* :class:`bpy.types.SequenceProxy.quality` +* :class:`bpy.types.SequenceProxy.timecode` + +bpy.types.Sequence +------------------ + +Added +^^^^^ + +* :class:`bpy.types.Sequence.waveform` + +bpy.types.DopeSheet +------------------- + +Added +^^^^^ + +* :class:`bpy.types.DopeSheet.show_datablock_filters` +* :class:`bpy.types.DopeSheet.show_speakers` + +bpy.types.ActionActuator +------------------------ + +Added +^^^^^ + +* :class:`bpy.types.ActionActuator.apply_to_children` +* :class:`bpy.types.ActionActuator.layer` +* :class:`bpy.types.ActionActuator.layer_weight` +* :class:`bpy.types.ActionActuator.use_additive` +* :class:`bpy.types.ActionActuator.use_force` +* :class:`bpy.types.ActionActuator.use_local` + +bpy.types.VertexGroup +--------------------- + +Added +^^^^^ + +* :class:`bpy.types.VertexGroup.lock_weight` + +bpy.types.ThemeView3D +--------------------- + +Added +^^^^^ + +* :class:`bpy.types.ThemeView3D.speaker` + +bpy.types.Image +--------------- + +Added +^^^^^ + +* :class:`bpy.types.Image.pack` +* :class:`bpy.types.Image.unpack` + +bpy.types.Curve +--------------- + +Added +^^^^^ + +* :class:`bpy.types.Curve.fill_mode` + +Removed +^^^^^^^ + +* **use_fill_back** +* **use_fill_front** + +bpy.types.ParticleSettings +-------------------------- + +Added +^^^^^ + +* :class:`bpy.types.ParticleSettings.adaptive_subframes` +* :class:`bpy.types.ParticleSettings.courant_target` + +bpy.types.SceneGameData +----------------------- + +Added +^^^^^ + +* :class:`bpy.types.SceneGameData.level_height` +* :class:`bpy.types.SceneGameData.obstacle_simulation` +* :class:`bpy.types.SceneGameData.recast_data` +* :class:`bpy.types.SceneGameData.restrict_animation_updates` +* :class:`bpy.types.SceneGameData.show_obstacle_simulation` + diff --git a/doc/python_api/sphinx_changelog_gen.py b/doc/python_api/sphinx_changelog_gen.py index 7a56e73b7ad..3ded1035123 100644 --- a/doc/python_api/sphinx_changelog_gen.py +++ b/doc/python_api/sphinx_changelog_gen.py @@ -39,6 +39,9 @@ python doc/python_api/sphinx_changelog_gen.py \ --api_to blender_api_2_57.py \ --api_out changes.rst +# Save the latest API dump in this folder, renaming it with its revision. +# This way the next person updating it doesn't need to build an old Blender only for that + """ # format @@ -299,7 +302,7 @@ def api_changelog(api_from, api_to, api_out): for func_id, args_old, args_new in func_args: args_new = ", ".join(args_new) args_old = ", ".join(args_old) - fw("* :class:`%s.%s.%s` (%s), *was (%s)*\n" % (mod_id, class_name, prop_id, args_new, args_old)) + fw("* :class:`%s.%s.%s` (%s), *was (%s)*\n" % (mod_id, class_name, func_id, args_new, args_old)) fw("\n") fout.close() diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py index b2ed52eaf84..c3f8675a30e 100644 --- a/doc/python_api/sphinx_doc_gen.py +++ b/doc/python_api/sphinx_doc_gen.py @@ -163,7 +163,7 @@ def range_str(val): def example_extract_docstring(filepath): - file = open(filepath, 'r') + file = open(filepath, "r", encoding="utf-8") line = file.readline() line_no = 0 text = [] @@ -362,7 +362,7 @@ def pymodule2sphinx(BASEPATH, module_name, module, title): if module_all: module_dir = module_all - file = open(filepath, "w") + file = open(filepath, "w", encoding="utf-8") fw = file.write @@ -518,7 +518,7 @@ def pycontext2sphinx(BASEPATH): # Only use once. very irregular filepath = os.path.join(BASEPATH, "bpy.context.rst") - file = open(filepath, "w") + file = open(filepath, "w", encoding="utf-8") fw = file.write fw("Context Access (bpy.context)\n") fw("============================\n\n") @@ -706,7 +706,7 @@ def pyrna2sphinx(BASEPATH): # return filepath = os.path.join(BASEPATH, "bpy.types.%s.rst" % struct.identifier) - file = open(filepath, "w") + file = open(filepath, "w", encoding="utf-8") fw = file.write base_id = getattr(struct.base, "identifier", "") @@ -920,7 +920,7 @@ def pyrna2sphinx(BASEPATH): def fake_bpy_type(class_value, class_name, descr_str, use_subclasses=True): filepath = os.path.join(BASEPATH, "bpy.types.%s.rst" % class_name) - file = open(filepath, "w") + file = open(filepath, "w", encoding="utf-8") fw = file.write write_title(fw, class_name, "=") @@ -971,7 +971,7 @@ def pyrna2sphinx(BASEPATH): for op_module_name, ops_mod in op_modules.items(): filepath = os.path.join(BASEPATH, "bpy.ops.%s.rst" % op_module_name) - file = open(filepath, "w") + file = open(filepath, "w", encoding="utf-8") fw = file.write title = "%s Operators" % op_module_name.replace("_", " ").title() @@ -1025,7 +1025,7 @@ def rna2sphinx(BASEPATH): # conf.py - empty for now filepath = os.path.join(BASEPATH, "conf.py") - file = open(filepath, "w") + file = open(filepath, "w", encoding="utf-8") fw = file.write version_string = ".".join(str(v) for v in bpy.app.version) @@ -1061,7 +1061,7 @@ def rna2sphinx(BASEPATH): # main page needed for sphinx (index.html) filepath = os.path.join(BASEPATH, "contents.rst") - file = open(filepath, "w") + file = open(filepath, "w", encoding="utf-8") fw = file.write fw("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n") @@ -1179,7 +1179,7 @@ def rna2sphinx(BASEPATH): # internal modules if "bpy.ops" not in EXCLUDE_MODULES: filepath = os.path.join(BASEPATH, "bpy.ops.rst") - file = open(filepath, "w") + file = open(filepath, "w", encoding="utf-8") fw = file.write fw("Operators (bpy.ops)\n") fw("===================\n\n") @@ -1191,7 +1191,7 @@ def rna2sphinx(BASEPATH): if "bpy.types" not in EXCLUDE_MODULES: filepath = os.path.join(BASEPATH, "bpy.types.rst") - file = open(filepath, "w") + file = open(filepath, "w", encoding="utf-8") fw = file.write fw("Types (bpy.types)\n") fw("=================\n\n") @@ -1204,7 +1204,7 @@ def rna2sphinx(BASEPATH): # not actually a module, only write this file so we # can reference in the TOC filepath = os.path.join(BASEPATH, "bpy.data.rst") - file = open(filepath, "w") + file = open(filepath, "w", encoding="utf-8") fw = file.write fw("Data Access (bpy.data)\n") fw("======================\n\n") @@ -1298,7 +1298,7 @@ def rna2sphinx(BASEPATH): if 0: filepath = os.path.join(BASEPATH, "bpy.rst") - file = open(filepath, "w") + file = open(filepath, "w", encoding="utf-8") fw = file.write fw("\n") |