├── .gitignore ├── source ├── code.jpg ├── qcode.jpg ├── pipeline.jpg ├── p_Git │ ├── git_cmd.png │ ├── git_token.png │ ├── git_code_review.rst │ ├── git_all_commands.rst │ ├── git_release_version.rst │ ├── git_ignore.rst │ ├── git_install_tortoisegit.rst │ ├── git_repo_hosts.rst │ ├── git_simple_workflow.rst │ ├── git_config_proxy.rst │ ├── git_install_token.rst │ └── git_speed_up.rst ├── p_Maya │ ├── rshair.png │ ├── rsramp.png │ ├── maya_globals.rst │ ├── maya_plugin_p+.rst │ ├── xgen_hair1.png │ ├── xgen_hair2.png │ ├── maya_custom_mll_plugin.rst │ ├── maya_custom_py_plugin.rst │ ├── maya_plugin_shave.rst │ ├── maya_plugin_yeti.rst │ ├── maya_custom_command.rst │ ├── maya_plugin_arnold.rst │ ├── maya_plugin_redshift.rst │ ├── maya_plugin_qualoth.rst │ ├── maya_xgen_linux_win.rst │ ├── maya_default_open_method.rst │ ├── maya_mel_basics.rst │ ├── maya_redshift_rstexbin.rst │ ├── maya_shelf_tools.rst │ ├── maya_pack_tool.rst │ ├── maya_execute_script_nodes.rst │ ├── maya_environment_variables.rst │ ├── maya_redshift_cache.rst │ ├── maya_redshift_xgen.rst │ ├── maya_user_interface.rst │ ├── maya_custom_shelf.rst │ ├── maya_playblast_tool.rst │ ├── maya_front_render.rst │ ├── maya_pymel.rst │ ├── maya_aov_tool.rst │ └── maya_playblast_settings.rst ├── p_PyQt │ ├── pyqt_model.rst │ ├── pyqt_bat.rst │ ├── pyqt_in_nuke.rst │ ├── pyqt_tray_icon.rst │ ├── pyqt_qss.rst │ ├── pyqt_qt.rst │ ├── pyqt_resources.rst │ ├── pyqt_line_edit.rst │ ├── pyqt_uic.rst │ ├── pyqt_rcc.rst │ ├── pyqt_vs_pyside.rst │ └── pyqt_rich_text.rst ├── pipeline_origin.jpg ├── p_Python │ ├── python_pep8.rst │ ├── python_daemon_thread.rst │ ├── python_built_in_module_csv.rst │ ├── python_module_namespace.rst │ ├── python_built_in_module_operator.rst │ ├── python_built_in_module_functools.rst │ ├── python_database_connect.rst │ ├── python_built_in_module_py_compile.rst │ ├── python_closure_function.rst │ ├── python_third_party_module_python_fire.rst │ ├── python_built_in_module_inspect.rst │ ├── python_indentation_principle.rst │ ├── python_module_import_principle.rst │ ├── python_mind_map.rst │ ├── python_pyc.rst │ ├── python_special_method_getitem_setitem.rst │ ├── python_special_property_dict.rst │ ├── python_api.rst │ ├── python_third_party_module_pillow.rst │ ├── python_built_in_module_abc.rst │ ├── python_third_party_module_yaml.rst │ ├── python_built_in_module_getpass.rst │ ├── python_built_in_module_shutil.rst │ ├── python_special_property_doc.rst │ ├── python_generator.rst │ ├── python_special_property_path.rst │ ├── python_comprehensions.rst │ ├── python_special_property_file.rst │ ├── python_special_property_name.rst │ ├── python_iterator.rst │ ├── python_docstring.rst │ ├── python_advanced_features.rst │ ├── python_built_in_module_time.rst │ ├── python_built_in_module_datetime.rst │ ├── python_anaconda.rst │ ├── python_built_in_module_itertools.rst │ ├── python_built_in_module_importlib.rst │ ├── python_variables_reference.rst │ ├── python_container_tuple.rst │ ├── python_built_in_module_pprint.rst │ ├── python_built_in_module_re.rst │ ├── python_built_in_module_math.rst │ ├── python_name_rules.rst │ ├── python_container_set.rst │ ├── python_built_in_module_json.rst │ ├── python_container_dict.rst │ ├── python_built_in_module_random.rst │ ├── python_built_in_module_subprocess.rst │ ├── python_ide.rst │ ├── python_data_types_bool_none.rst │ ├── python_data_types_string.rst │ ├── python_built_in_module_sys.rst │ ├── python_type_instance_concept.rst │ ├── python_built_in_module_calendar.rst │ ├── python_custom_package.rst │ ├── python_built_in_module_copy.rst │ ├── python_special_method_repr.rst │ └── python_custom_module.rst ├── p_Houdini │ ├── houdini_desktop.rst │ ├── houdini_pdg.rst │ ├── houdini_usd.rst │ ├── houdini_presets_gallery.rst │ ├── houdini_vex_include.rst │ ├── houdini_vex_string.rst │ ├── houdini_python_geometry.rst │ ├── houdini_vex_compiler.rst │ ├── houdini_jump_path.rst │ ├── houdini_module_stateutils.rst │ ├── houdini_plugin_qlib.rst │ ├── houdini_fbx_material_converter.rst │ ├── houdini_radial_menu.rst │ ├── houdini_custom_resolution.rst │ ├── houdini_hotkeys.rst │ ├── houdini_stage_stagemanager.rst │ ├── houdini_procedural_path_solver.rst │ ├── houdini_shell.rst │ ├── houdini_vex_snippets.rst │ ├── houdini_hscript_command.rst │ ├── houdini_expression_functions.rst │ ├── houdini_miss_icons.rst │ ├── houdini_vex_viewport.rst │ ├── houdini_vex_conversion.rst │ ├── houdini_miss_dialog.rst │ ├── houdini_vex_noise.rst │ ├── houdini_python_panel.rst │ ├── houdini_vex_texture.rst │ ├── houdini_python_executable_environment.rst │ ├── houdini_vex_groups.rst │ ├── houdini_opencl.rst │ ├── houdini_shelf_tools.rst │ ├── houdini_otls_scripts.rst │ ├── houdini_vex_volume.rst │ ├── houdini_vex_measure.rst │ ├── houdini_vex_math.rst │ ├── houdini_ascode.rst │ ├── houdini_vex_interpolation.rst │ ├── houdini_plugin_arnold.rst │ ├── houdini_vex_struct.rst │ ├── houdini_multi_loader.rst │ ├── houdini_plugin_redshift.rst │ ├── houdini_otls_upgrade.rst │ ├── houdini_development_environment.rst │ ├── houdini_vex_variables.rst │ ├── houdini_otls_parameters.rst │ ├── houdini_vex_custom_functions.rst │ ├── houdini_otls_create_update.rst │ ├── houdini_vex_visual_programming.rst │ ├── houdini_progress_bar.rst │ ├── houdini_custom_menu.rst │ ├── houdini_vex_attributes.rst │ ├── houdini_module_toolutils.rst │ ├── houdini_vex_geometry.rst │ ├── houdini_vex_point_cloud.rst │ ├── houdini_vex_channel_parameter.rst │ ├── houdini_program_types.rst │ └── houdini_vex_flow_control.rst ├── p_Nuke │ ├── nuke_custom_toolset.rst │ ├── nuke_daemon_thread.rst │ ├── nuke_plugin_dft.rst │ ├── nuke_plugin_film_convert.rst │ ├── nuke_plugin_rsmb.rst │ ├── nuke_plugin_cryptomatte.rst │ ├── nuke_develop_environment.rst │ ├── nuke_plugin_bokeh.rst │ ├── nuke_create_gizmo.rst │ ├── nuke_home_directory.rst │ ├── nuke_callback_scripts.rst │ ├── nuke_tcl.rst │ ├── nuke_centralized_tools.rst │ ├── nuke_developer_document.rst │ ├── nuke_preferences.rst │ ├── nuke_python_panel.rst │ ├── nuke_develop_plugins.rst │ ├── nuke_python_import.rst │ ├── nuke_python_arguments.rst │ ├── nuke_custom_node_knob.rst │ └── nuke_create_read.rst ├── p_Deadline │ ├── deadline_config_xgen.rst │ ├── deadline_maya_plugin.rst │ ├── deadline_nuke_plugin.rst │ ├── deadline_install_error.rst │ ├── deadline_config_app_version.rst │ ├── deadline_pool_group.rst │ ├── deadline_server_install_deploy.rst │ ├── deadline_install_mongodb.rst │ ├── deadline_priority_manager.rst │ ├── deadline_houdini_plugin.rst │ └── deadline_python_api.rst ├── p_Shotgun │ ├── shotgun_events_develop.rst │ ├── shotgun_rv_screening_room.rst │ ├── shotgun_enable_tickets.rst │ └── shotgun_access_method.rst ├── p_Devops │ ├── Others │ │ ├── devops_deploy_factory.rst │ │ ├── devops_deploy_kms.rst │ │ ├── devops_mklink.rst │ │ ├── devops_deploy_jira.rst │ │ ├── devops_deploy_securecrt.rst │ │ ├── devops_deploy_unreal_engine.rst │ │ ├── devops_subnet_mask.rst │ │ ├── devops_deploy_gitlab.rst │ │ ├── devops_deploy_seafile.rst │ │ ├── devops_deploy_jupyterlab.rst │ │ ├── devops_deploy_confluence.rst │ │ ├── devops_davinci.rst │ │ ├── devops_deploy_typora.rst │ │ ├── devops_onedrive.rst │ │ ├── devops_filelocator_pro.rst │ │ ├── devops_vmware_display.rst │ │ ├── devops_install_zbrush.rst │ │ ├── devops_install_katana.rst │ │ ├── devops_install_marvelous_designer.rst │ │ ├── devops_remove_cd_driver.rst │ │ ├── devops_shell.rst │ │ ├── devops_disk_check_tool.rst │ │ ├── devops_disk_genius.rst │ │ ├── devops_pip_manual.rst │ │ ├── devops_truenas_install.rst │ │ ├── devops_renderbus_proxy.rst │ │ ├── devops_wiki.rst │ │ ├── devops_youtube_download.rst │ │ ├── devops_win_server_priority.rst │ │ ├── devops_remote_oracle.rst │ │ ├── devops_install_clarisse.rst │ │ ├── devops_deploy_rocket_chat.rst │ │ ├── devops_install_ue4.rst │ │ ├── devops_net_disable_enable.rst │ │ ├── devops_intranet_penetration.rst │ │ ├── devops_deploy_squid.rst │ │ ├── devops_ffmpeg_codec.rst │ │ ├── devops_software.rst │ │ ├── devops_traceroute.rst │ │ ├── devops_ad_domain.rst │ │ ├── devops_deploy_system.rst │ │ ├── devops_record_screen.rst │ │ ├── devops_custom_shortcut.rst │ │ ├── devops_c_drive_space.rst │ │ ├── devops_route_settings.rst │ │ ├── devops_rst_syntax.rst │ │ ├── devops_computer.rst │ │ ├── devops_redshift_crash_houdini.rst │ │ ├── devops_photo_viewer.rst │ │ └── devops_office_mail.rst │ ├── FreeNAS.rst │ ├── FreeNAS │ │ ├── devops_freenas_acl.rst │ │ └── devops_freenas_install.rst │ └── Others.rst ├── p_UE4 │ ├── ue4_python_environment.rst │ ├── ue4_epic_install.rst │ └── ue4_share_blueprint.rst ├── p_Katana │ ├── readme.txt │ ├── katana_load_module.rst │ ├── katana_custom_plugin.rst │ ├── katana_callback_events.rst │ ├── katana_custom_shelf.rst │ ├── katana_basic_operator.rst │ ├── katana_python_env.rst │ └── katana_custom_node_menu.rst ├── parts │ ├── Blender.rst │ ├── CGTeamwork.rst │ ├── Ftrack.rst │ ├── Git.rst │ ├── Maya.rst │ ├── Shotgun.rst │ ├── SQL.rst │ ├── PyQt.rst │ ├── C4D.rst │ ├── Nuke.rst │ ├── UE4.rst │ ├── UE5.rst │ ├── Katana.rst │ ├── Deadline.rst │ ├── Devops.rst │ ├── Python.rst │ ├── Clarisse.rst │ ├── Houdini.rst │ └── Linux.rst ├── p_SQL │ ├── sql_order_by.rst │ └── sql_group_by.rst ├── p_Linux │ └── linux_command.rst ├── p_C4D │ └── c4d_deploy_redshift.rst ├── readme.txt ├── p_Ftrack │ └── ftrack_python_api.rst ├── index.rst ├── preface.rst └── p_Clarisse │ └── clarisse_gui.rst ├── Makefile └── make.bat /.gitignore: -------------------------------------------------------------------------------- 1 | ipynb -------------------------------------------------------------------------------- /source/code.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CGRnDStudio/CGTDCourse/HEAD/source/code.jpg -------------------------------------------------------------------------------- /source/qcode.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CGRnDStudio/CGTDCourse/HEAD/source/qcode.jpg -------------------------------------------------------------------------------- /source/pipeline.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CGRnDStudio/CGTDCourse/HEAD/source/pipeline.jpg -------------------------------------------------------------------------------- /source/p_Git/git_cmd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CGRnDStudio/CGTDCourse/HEAD/source/p_Git/git_cmd.png -------------------------------------------------------------------------------- /source/p_Maya/rshair.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CGRnDStudio/CGTDCourse/HEAD/source/p_Maya/rshair.png -------------------------------------------------------------------------------- /source/p_Maya/rsramp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CGRnDStudio/CGTDCourse/HEAD/source/p_Maya/rsramp.png -------------------------------------------------------------------------------- /source/p_Git/git_token.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CGRnDStudio/CGTDCourse/HEAD/source/p_Git/git_token.png -------------------------------------------------------------------------------- /source/p_PyQt/pyqt_model.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | PyQt MVC设计模式 3 | ============================= 4 | -------------------------------------------------------------------------------- /source/pipeline_origin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CGRnDStudio/CGTDCourse/HEAD/source/pipeline_origin.jpg -------------------------------------------------------------------------------- /source/p_Maya/maya_globals.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya插件:Yeti 3 | ============================== 4 | -------------------------------------------------------------------------------- /source/p_Maya/maya_plugin_p+.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya插件:p+ 3 | ============================== 4 | -------------------------------------------------------------------------------- /source/p_Maya/xgen_hair1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CGRnDStudio/CGTDCourse/HEAD/source/p_Maya/xgen_hair1.png -------------------------------------------------------------------------------- /source/p_Maya/xgen_hair2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CGRnDStudio/CGTDCourse/HEAD/source/p_Maya/xgen_hair2.png -------------------------------------------------------------------------------- /source/p_PyQt/pyqt_bat.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | PyQt使用bat伪装应用程序 3 | ============================= 4 | -------------------------------------------------------------------------------- /source/p_Python/python_pep8.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python PEP8 3 | ============================= 4 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_desktop.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini自定义布局 3 | ============================== 4 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_pdg.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini PDG相关 3 | ============================== 4 | -------------------------------------------------------------------------------- /source/p_Maya/maya_custom_mll_plugin.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya自定义mll插件 3 | ============================== -------------------------------------------------------------------------------- /source/p_Maya/maya_custom_py_plugin.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya自定义py插件 3 | ============================== -------------------------------------------------------------------------------- /source/p_Maya/maya_plugin_shave.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya插件:Shave 3 | ============================== 4 | -------------------------------------------------------------------------------- /source/p_Maya/maya_plugin_yeti.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya插件:Yeti 3 | ============================== 4 | -------------------------------------------------------------------------------- /source/p_Nuke/nuke_custom_toolset.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Nuke自定义工具集 3 | ============================== 4 | -------------------------------------------------------------------------------- /source/p_PyQt/pyqt_in_nuke.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | PyQt在Nuke中执行的模板代码 3 | ============================= 4 | -------------------------------------------------------------------------------- /source/p_PyQt/pyqt_tray_icon.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | PyQt定义应用程序任务栏图标 3 | ============================= 4 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_usd.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini USD相关 3 | ============================== 4 | 5 | -------------------------------------------------------------------------------- /source/p_Maya/maya_custom_command.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya自定义mel命令 3 | ============================== 4 | -------------------------------------------------------------------------------- /source/p_Maya/maya_plugin_arnold.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya插件:Arnold 3 | ============================== 4 | -------------------------------------------------------------------------------- /source/p_Maya/maya_plugin_redshift.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya插件:Redshift 3 | ============================== 4 | -------------------------------------------------------------------------------- /source/p_Nuke/nuke_daemon_thread.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Nuke守护线程自动保存文件 3 | ============================== 4 | -------------------------------------------------------------------------------- /source/p_Python/python_daemon_thread.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Python守护线程 3 | ============================== 4 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_presets_gallery.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini自定义预设 3 | ============================== 4 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_include.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:头文件 3 | ============================== 4 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_string.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:字符串函数 3 | ============================== 4 | -------------------------------------------------------------------------------- /source/p_Maya/maya_plugin_qualoth.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya插件:Qualoth 3 | ============================== 4 | 5 | -------------------------------------------------------------------------------- /source/p_Python/python_built_in_module_csv.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python内置模块:csv 3 | ============================= 4 | -------------------------------------------------------------------------------- /source/p_Python/python_module_namespace.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Python模块名称空间 3 | ============================== 4 | -------------------------------------------------------------------------------- /source/p_Deadline/deadline_config_xgen.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Deadline渲染农场渲染XGen问题 3 | ============================= 4 | -------------------------------------------------------------------------------- /source/p_Git/git_code_review.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Git Code Review流程 3 | ============================== 4 | 5 | 6 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_python_geometry.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini Python控制几何体 3 | ============================== 4 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_compiler.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:编译器pragmas 3 | ============================== 4 | -------------------------------------------------------------------------------- /source/p_Shotgun/shotgun_events_develop.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Shotgun Events开发流程 3 | ============================= 4 | -------------------------------------------------------------------------------- /source/p_Shotgun/shotgun_rv_screening_room.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Shotgun RV审片室工作流程 3 | ============================= 4 | -------------------------------------------------------------------------------- /source/p_Deadline/deadline_maya_plugin.rst: -------------------------------------------------------------------------------- 1 | =============================== 2 | Deadline渲染农场Maya提交工具 3 | =============================== 4 | -------------------------------------------------------------------------------- /source/p_Deadline/deadline_nuke_plugin.rst: -------------------------------------------------------------------------------- 1 | =============================== 2 | Deadline渲染农场Nuke提交工具 3 | =============================== 4 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_jump_path.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini添加侧边栏快捷路径 3 | ============================== 4 | 5 | jump.pref -------------------------------------------------------------------------------- /source/p_Houdini/houdini_module_stateutils.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini模块:stateutils 3 | ============================== 4 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_plugin_qlib.rst: -------------------------------------------------------------------------------- 1 | ================================= 2 | Houdini中心化部署:qLib插件 3 | ================================= 4 | -------------------------------------------------------------------------------- /source/p_Python/python_built_in_module_operator.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python内置模块:operator 3 | ============================= 4 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_fbx_material_converter.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini FBX材质自动赋予工具 3 | ============================== 4 | -------------------------------------------------------------------------------- /source/p_Python/python_built_in_module_functools.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python内置模块:functools 3 | ============================= 4 | -------------------------------------------------------------------------------- /source/p_Python/python_database_connect.rst: -------------------------------------------------------------------------------- 1 | ======================================= 2 | Python数据库操作 3 | ======================================= 4 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_deploy_factory.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | 格式工厂 3 | ========================================= 4 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_deploy_kms.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | KMS服务器搭建 3 | ========================================= 4 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_mklink.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | mklink符号链接技术 3 | ========================================= 4 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_radial_menu.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini自定义热盒菜单 3 | ============================== 4 | 5 | 配置radialmenu文件自定义热盒 -------------------------------------------------------------------------------- /source/p_Nuke/nuke_plugin_dft.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Nuke插件:DFT 3 | ============================== 4 | 5 | Digital Film Tools(DFT) 6 | -------------------------------------------------------------------------------- /source/p_PyQt/pyqt_qss.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | PyQt美化界面皮肤qss 3 | ============================= 4 | 5 | - 认识qss 6 | - 下载qss 7 | - 修改qss 8 | -------------------------------------------------------------------------------- /source/p_Python/python_built_in_module_py_compile.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python内置模块:py_compile 3 | ============================= 4 | 5 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_deploy_jira.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Jira项目跟踪服务器部署 3 | ========================================= 4 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_deploy_securecrt.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | SecureCRT 3 | ========================================= 4 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_deploy_unreal_engine.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | 虚幻引擎 3 | ========================================= 4 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_subnet_mask.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Windows AD域服务器搭建 3 | ========================================= 4 | -------------------------------------------------------------------------------- /source/p_Python/python_closure_function.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python闭包函数 3 | ============================= 4 | 5 | 闭包函数指的是在函数内定义的内部函数。 6 | -------------------------------------------------------------------------------- /source/p_Python/python_third_party_module_python_fire.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python第三方模块:python-fire 3 | ============================= 4 | 5 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_deploy_gitlab.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Gitlab代码仓库服务器部署 3 | ========================================= 4 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_deploy_seafile.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Seafile文件同步服务器部署 3 | ========================================= 4 | -------------------------------------------------------------------------------- /source/p_Nuke/nuke_plugin_film_convert.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Nuke插件:FilmConvert 3 | ============================== 4 | 5 | FilmConvert Pro 6 | -------------------------------------------------------------------------------- /source/p_Nuke/nuke_plugin_rsmb.rst: -------------------------------------------------------------------------------- 1 | ================================== 2 | Nuke插件:Reel Smart Motion Blur 3 | ================================== 4 | 5 | 运动模块插件 6 | -------------------------------------------------------------------------------- /source/p_UE4/ue4_python_environment.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | UE4启用Python执行环境以及可执行方法 3 | ========================================= 4 | 5 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_deploy_jupyterlab.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | JupyterLab在线代码开发环境搭建 3 | ========================================= 4 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_deploy_confluence.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Confluence文档服务器部署 3 | ========================================= 4 | 5 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_custom_resolution.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini自定义分辨率预设 3 | ============================== 4 | 5 | 添加一条HOUDINI_PATH,并创建FBres文件,无扩展名 -------------------------------------------------------------------------------- /source/p_Houdini/houdini_hotkeys.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini自定义快捷键 3 | ============================== 4 | 5 | 配置HotkeyOverrides文件自定义快捷键 Ctrl+Shift+Alt+左键 -------------------------------------------------------------------------------- /source/p_PyQt/pyqt_qt.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | PyQt之Qt.py的使用 3 | ============================= 4 | 5 | Qt.py如何使用? 6 | 7 | - https://github.com/mottosso 8 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_davinci.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Davinci专业剪辑调色软件 3 | ========================================= 4 | 5 | 达芬奇是一款非常出色的剪辑调色软件。 -------------------------------------------------------------------------------- /source/p_Houdini/houdini_stage_stagemanager.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini stage 3 | ============================== 4 | 5 | Scene Graph Tree面板控制USD层级结构 6 | 7 | -------------------------------------------------------------------------------- /source/p_Nuke/nuke_plugin_cryptomatte.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Nuke插件:Crytomatte 3 | ============================== 4 | 5 | https://github.com/Psyop/Cryptomatte -------------------------------------------------------------------------------- /source/p_Python/python_built_in_module_inspect.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python内置模块:inspect 3 | ============================= 4 | 5 | isfunction() 6 | 7 | ismethod() -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_deploy_typora.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Markdown工具 3 | ========================================= 4 | 5 | https://typora.io/ 6 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_procedural_path_solver.rst: -------------------------------------------------------------------------------- 1 | ==================================== 2 | Houdini程序化练习:Path Solver 3 | ==================================== 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /source/p_Python/python_indentation_principle.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python缩进原则 3 | ============================= 4 | 5 | Python中使用冒号+缩进的方式代替C++等语言中的{}类表示代码的逻辑结构。 6 | 7 | -------------------------------------------------------------------------------- /source/p_Python/python_module_import_principle.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python模块导入机制 3 | ============================= 4 | 5 | sys.path 6 | 7 | sys.modules 8 | 9 | reload -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_onedrive.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | OneDrive协同办公流程 3 | ========================================= 4 | 5 | OneDrive网页端被墙,客户端可以正常登陆和使用。 6 | -------------------------------------------------------------------------------- /source/p_Git/git_all_commands.rst: -------------------------------------------------------------------------------- 1 | ==================================== 2 | Git指令大全 3 | ==================================== 4 | 5 | 友情提示:图片可以另存为或者新标签放大查看。 6 | 7 | .. image:: git_cmd.png 8 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_shell.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini Shell相关 3 | ============================== 4 | 5 | .. code-block:: bash 6 | 7 | hconfig -ap 8 | icp 9 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_snippets.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:代码片段 3 | ============================== 4 | 5 | https://github.com/kiryha/Houdini/wiki/vex-snippets 6 | -------------------------------------------------------------------------------- /source/p_Python/python_mind_map.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python知识体系:思维导图 3 | ============================= 4 | 5 | https://www.processon.com/view/link/5e8c1a04e4b0bf3ebcfd2dcc 6 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_hscript_command.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini HScript命令 3 | ============================== 4 | 5 | https://www.sidefx.com/docs/houdini/commands/index.html -------------------------------------------------------------------------------- /source/p_Python/python_pyc.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python文件后缀 3 | ============================= 4 | 5 | - .py 6 | - .pyc 7 | - .pyo 8 | - .pyd 9 | - .pyz(w) 10 | - .exe 11 | -------------------------------------------------------------------------------- /source/p_Python/python_special_method_getitem_setitem.rst: -------------------------------------------------------------------------------- 1 | ========================================== 2 | Python特殊方法:__getitem__ & __setitem__ 3 | ========================================== 4 | 5 | -------------------------------------------------------------------------------- /source/p_Python/python_special_property_dict.rst: -------------------------------------------------------------------------------- 1 | ======================================= 2 | Python特殊属性:__dict__ 3 | ======================================= 4 | 5 | __dict__是模块对象的globals名称空间。 6 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_filelocator_pro.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | FileLocator Pro全盘检索工具 3 | ========================================= 4 | 5 | 非常好用的全盘索引检索工具,提供文件内容检索,效率非常高。 -------------------------------------------------------------------------------- /source/p_Houdini/houdini_expression_functions.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini表达式函数 3 | ============================== 4 | 5 | https://www.sidefx.com/docs/houdini/expressions/index.html -------------------------------------------------------------------------------- /source/p_Python/python_api.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python API 3 | ============================= 4 | 5 | 掌握API是一种编程技能,API是应用程序接口(Application Programming Interface),通俗来讲就是别人写的代码库,提供接口给我们使用。 -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_vmware_display.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | VMware虚拟机Edge浏览器右键字体模糊 3 | ========================================= 4 | 5 | 在浏览器中找到设置>系统和性能>使用硬件加速(如可用),将此选项禁用即可 -------------------------------------------------------------------------------- /source/p_Houdini/houdini_miss_icons.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini图标丢失解决方案 3 | ============================== 4 | 5 | 删我的文档可以恢复,删除的时候格外小心是否有配置houdini.env,desktop或者其它预设,最好备份一下,把需要的文件保留。 6 | -------------------------------------------------------------------------------- /source/p_Nuke/nuke_develop_environment.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Nuke开发环境搭建 3 | ============================== 4 | 5 | VS Code 6 | 7 | Auto Complete 8 | 9 | NUKE_INTERACTIIVE=1 10 | -------------------------------------------------------------------------------- /source/p_Python/python_third_party_module_pillow.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python第三方模块:Pillow 3 | ============================= 4 | 5 | 处理图片 6 | 7 | - https://pillow.readthedocs.io/en/stable/ 8 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_viewport.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:视图属性 3 | ============================== 4 | 5 | .. code-block:: python 6 | 7 | @gl_wireframe = true; 8 | @gl_lit = true; -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_install_zbrush.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | 软件安装:ZBrush 3 | ========================================= 4 | 5 | - 选择ZBrush_2019_Installer.exe,右键以管理员身份运行。 6 | - 一直Next傻瓜式安装即可。 7 | -------------------------------------------------------------------------------- /source/p_Nuke/nuke_plugin_bokeh.rst: -------------------------------------------------------------------------------- 1 | ================================== 2 | Nuke插件:Peregrine Labs Bokeh 3 | ================================== 4 | 5 | 和Yeti同一家出品的Nuke景深插件 6 | 7 | - http://documentation.peregrinelabs.com/bokeh/ -------------------------------------------------------------------------------- /source/p_Nuke/nuke_create_gizmo.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Nuke创建Gizmo流程 3 | ============================== 4 | 5 | - Ctrl + G # 打组 6 | - Ctrl + Alt + G # 解组 7 | 8 | .gizmo文件想在Nuke中可以使用,需要创建菜单来创建gizmo,这样才可以按tab键找到节点。 -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_install_katana.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | 软件安装:Katana 3 | ========================================= 4 | 5 | - 选择Katana3.5v2-win-x86-release-64.exe,右键以管理员身份运行。 6 | - 一直Next傻瓜式安装即可。 7 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_install_marvelous_designer.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | 软件安装:Marvelous Designer 3 | ========================================= 4 | 5 | - 选择Setup.exe,右键以管理员身份运行。 6 | - 一直Next傻瓜式安装即可。 7 | -------------------------------------------------------------------------------- /source/p_Nuke/nuke_home_directory.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Nuke主目录 3 | ============================== 4 | 5 | .. code-block:: python 6 | 7 | C:\Users\{USERNAME}\.nuke 8 | 9 | - init.py 10 | - menu.py 11 | -------------------------------------------------------------------------------- /source/p_Python/python_built_in_module_abc.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python内置模块:abc 3 | ============================= 4 | 5 | 抽象基类(Abstract Base Classes) 6 | 7 | * 抽象基类不能实例化 8 | * 子类需要实现基类指定的抽象方法 9 | 10 | 11 | -------------------------------------------------------------------------------- /source/p_Katana/readme.txt: -------------------------------------------------------------------------------- 1 | - [ ] 如何在Katana自定义工具代码? 2 | - [ ] 如何在Katana自定义工具架工具? 3 | - [ ] 如何反编译Katana的API代码? 4 | - [ ] 如何在Katana中集成式部署Arnold? 5 | - [ ] 如何自定义Katana工具架工具图标? 6 | - [ ] 如何理解KATANA_RESOURCES环境变量? 7 | - [ ] 如何自定义Katana菜单? 8 | 9 | -------------------------------------------------------------------------------- /source/p_Maya/maya_xgen_linux_win.rst: -------------------------------------------------------------------------------- 1 | ================================== 2 | Maya XGen Linux资产切换Win版本 3 | ================================== 4 | 5 | - notepad++文本修改.xgen文件中的路径 6 | - DG模式 7 | - Arnold要先加载,mtoa的版本要对应 8 | - 修改Xg Version路径 9 | -------------------------------------------------------------------------------- /source/p_Python/python_third_party_module_yaml.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python第三方模块:yaml 3 | ============================= 4 | 5 | yaml模块和json模块有异曲同工之妙 6 | 7 | - yaml.load 8 | - yaml.loads 9 | - yaml.dump 10 | - yaml.dumps -------------------------------------------------------------------------------- /source/parts/Blender.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Blender 3 | ============================= 4 | 5 | Blender是一款开源的三维软件 6 | 7 | Contents: 8 | 9 | .. toctree:: 10 | :maxdepth: 1 11 | :glob: 12 | 13 | ../p_Blender/* 14 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_remove_cd_driver.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | 移除CD驱动器 3 | ========================================= 4 | 5 | 首先你得下载一个软件 ``UltraISO`` 安装,这个软件也是做U盘系统会用到的一款软件。 6 | 7 | 打开软件选择继续试用,找到菜单选项>配置>虚拟光驱>设备数量>无,确认。 -------------------------------------------------------------------------------- /source/p_Python/python_built_in_module_getpass.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python内置模块:getpass 3 | ============================= 4 | 5 | .. code-block:: python 6 | 7 | import getpass 8 | 9 | user = getpass.getuser() 10 | -------------------------------------------------------------------------------- /source/p_Python/python_built_in_module_shutil.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python内置模块:shutil 3 | ============================= 4 | 5 | .. code-block:: python 6 | 7 | shutil.copy() 8 | shutil.copy2() 9 | shutil.rmtree() 10 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_shell.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Shell技术 3 | ========================================= 4 | 5 | cd == change directory 6 | 7 | pwd == print working directory 8 | 9 | 想在当前文件夹路径下快捷打开命令行可以在资源管理器直接输入cmd即可 10 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_disk_check_tool.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | 硬盘检测工具 3 | ========================================= 4 | 5 | - ATTO Disk 6 | - AS SSD Benchmark 7 | - CrystalDiskMark 8 | - HD Tune Pro 9 | 10 | 推荐ATTO Disk测试硬盘读写速度。 11 | -------------------------------------------------------------------------------- /source/p_Nuke/nuke_callback_scripts.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Nuke Python Callback机制 3 | ============================== 4 | 5 | 修改创建节点的默认参数。 6 | 7 | .. code-block:: python 8 | 9 | import nuke 10 | 11 | nuke.knobDefault("Blur.size", "10") 12 | -------------------------------------------------------------------------------- /source/parts/CGTeamwork.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | CGTeamwork 3 | ============================= 4 | 5 | CGTeamwork是一款国产CG流程软件,非常符合国内外包流程,提供网盘功能 6 | 7 | Contents: 8 | 9 | .. toctree:: 10 | :maxdepth: 1 11 | :glob: 12 | 13 | ../p_CGTeamwork/* 14 | -------------------------------------------------------------------------------- /source/p_UE4/ue4_epic_install.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | UE4安装以及虚幻工程下载使用 3 | ========================================= 4 | 5 | 首先上虚幻引擎官网下载并安装Epic,需要注册登陆账号。 6 | 7 | 然后选择库,点击引擎版本后面加号,选择需要安装的Unreal Engine版本,点击安装即可。 8 | 9 | 虚幻商城中的工程是可以免费或者购买直接使用的。 10 | -------------------------------------------------------------------------------- /source/parts/Ftrack.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Ftrack 3 | ============================= 4 | 5 | Ftrack提供CG相关项目管理和Pipeline工具,可帮助CG工作室跟踪,安排,审查,协作和管理其数字资产。 6 | 7 | Contents: 8 | 9 | .. toctree:: 10 | :maxdepth: 1 11 | :glob: 12 | 13 | ../p_Ftrack/* 14 | -------------------------------------------------------------------------------- /source/parts/Git.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Git 3 | ============================= 4 | 5 | Git是一个分布式版本控制软件,最初目的是为更好地管理Linux内核开发而设计,后来Git内核已经成熟到可以独立地用作版本控制。 6 | 7 | Contents: 8 | 9 | .. toctree:: 10 | :maxdepth: 1 11 | :glob: 12 | 13 | ../p_Git/* 14 | -------------------------------------------------------------------------------- /source/parts/Maya.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Maya 3 | ============================= 4 | 5 | Autodesk Maya是美国Autodesk公司出品的三维动画软件,应用对象是专业的影视广告,角色动画,电影特技等。 6 | 7 | Contents: 8 | 9 | .. toctree:: 10 | :maxdepth: 1 11 | :glob: 12 | 13 | ../p_Maya/* 14 | -------------------------------------------------------------------------------- /source/p_Deadline/deadline_install_error.rst: -------------------------------------------------------------------------------- 1 | ================================ 2 | Deadline渲染农场安装服务启动错误 3 | ================================ 4 | 5 | 这是一个典型的常见安装错误 ``Error starting service Deadline10DatabaseService`` , 遇见过几次,问题都是出在杀毒软件上,可以将杀毒软件暂时退出再进行安装,安装完再启动杀毒软件,我这边用到了火绒杀毒,关掉就好了。 6 | -------------------------------------------------------------------------------- /source/p_Katana/katana_load_module.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Katana加载模块文件的三种方案 3 | ========================================= 4 | 5 | 最基本的方案就是在代码中将模块路径添加到sys.path 6 | 7 | 另一种是写bat文件,设置PYTHONPATH环境变量 8 | 9 | 还有一种麻烦一点通过Startup/init.py文件配置sys.path 10 | -------------------------------------------------------------------------------- /source/p_Maya/maya_default_open_method.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya默认打开方式 3 | ============================== 4 | 5 | 管理员打开注册表 6 | 7 | 计算机\HKEY_CLASSES_ROOT\MayaBinaryFile\shell\open\command 8 | 9 | 计算机\HKEY_CLASSES_ROOT\MayaAsciiFile\shell\open\command 10 | -------------------------------------------------------------------------------- /source/parts/Shotgun.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Shotgun 3 | ============================= 4 | 5 | Shotgun提供CG相关项目管理和Pipeline工具,可帮助CG工作室跟踪,安排,审查,协作和管理其数字资产。 6 | 7 | Contents: 8 | 9 | .. toctree:: 10 | :maxdepth: 1 11 | :glob: 12 | 13 | ../p_Shotgun/* 14 | -------------------------------------------------------------------------------- /source/p_Python/python_special_property_doc.rst: -------------------------------------------------------------------------------- 1 | ======================================= 2 | Python特殊属性:__doc__ 3 | ======================================= 4 | 5 | __doc__是模块对象的特殊属性,存储模块文件的docstring,docstring实际就是代码的解释文档,如果按规范写成,在使用help()的时候就可以获取到模块、函数抑或类的具体帮助文档,甚至可以通过第三方模块直接将代码转成API帮助文档。 6 | -------------------------------------------------------------------------------- /source/parts/SQL.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | SQL 3 | ============================= 4 | 5 | SQL(Structured Query Language)结构化查询语言是一种特定目的的编程语言,用于管理关系数据库管理系统(RDBMS)。 6 | 7 | Contents: 8 | 9 | .. toctree:: 10 | :maxdepth: 1 11 | :glob: 12 | 13 | ../p_SQL/* 14 | -------------------------------------------------------------------------------- /source/p_Devops/FreeNAS.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | FreeNAS 3 | ============================= 4 | 5 | FreeNAS是一套基于FreeBSD操作系统核心的开放源代码的网络存储设备(NAS)服务器系统,支持众多服务,用户访问权限管理,提供网页设置接口。 6 | 7 | Contents: 8 | 9 | .. toctree:: 10 | :maxdepth: 1 11 | :glob: 12 | 13 | FreeNAS/* 14 | -------------------------------------------------------------------------------- /source/p_Devops/FreeNAS/devops_freenas_acl.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | FreeNAS:回收站无权访问刷新ACL控制列表 3 | ========================================= 4 | 5 | FreeNAS配置的回收站.recycle文件夹时间久了不知道为什么权限就消失了,无法访问别人删除的文件 6 | 7 | 此时进FreeNAS网页端,找到共享>Windows共享(SMB)>编辑访问控制列表>递归应用权限>将权限应用于子数据集>保存就行 -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_disk_genius.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | 磁盘分区工具 3 | ========================================= 4 | 5 | DiskGenius非常好用的磁盘分区格式化工具。 6 | 7 | ------------------------ 8 | 参考文档 9 | ------------------------ 10 | 11 | - https://www.diskgenius.cn/download.php -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_pip_manual.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | pip命令使用手册 3 | ========================================= 4 | 5 | pip下载源决定了安装第三方模块的速度与稳定性,如果下载源在国外服务器可能会比较缓慢,可以切换到阿里云上安装。 6 | 7 | * pip install 8 | * pip install -i https://mirrors.aliyun.com/pypi/simple 9 | -------------------------------------------------------------------------------- /source/parts/PyQt.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | PyQt 3 | ============================= 4 | 5 | PyQt是Python语言的GUI编程解决方案之一。可以用来代替Python内置的Tkinter。其它替代者还有PyGTK、wxPython等。与Qt一样,PyQt是一个自由软件。 6 | 7 | Contents: 8 | 9 | .. toctree:: 10 | :maxdepth: 1 11 | :glob: 12 | 13 | ../p_PyQt/* 14 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_truenas_install.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | TrueNAS:系统安装 3 | ========================================= 4 | 5 | 这里演示下载与安装TrueNAS CORE(TrueNAS SCALE还相对不完善) 6 | 7 | https://www.truenas.com/download-truenas-core/ 8 | 9 | 使用Win32DiskImager写U盘系统,然后从U盘启动即可 10 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_conversion.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:转换函数 3 | ============================== 4 | 5 | - float atof(string str) // 字符串转浮点数 6 | - int atoi(string str) // 字符串转整数 7 | - float radians(float num_in_degs) // 角度转弧度 8 | - float degrees(float num_in_rads) // 弧度转角度 9 | -------------------------------------------------------------------------------- /source/parts/C4D.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | C4D 3 | ============================= 4 | 5 | Cinema 4D是一套由德国公司Maxon Computer开发的三维绘图软件,以其高的运算速度和强大的渲染外挂着称。Cinema 4D应用广泛,在广告、电影、工业设计等方面都有出色的表现。 6 | 7 | Contents: 8 | 9 | .. toctree:: 10 | :maxdepth: 1 11 | :glob: 12 | 13 | ../p_C4D/* 14 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_renderbus_proxy.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | RenderBus客户端配置Sock5代理 3 | ========================================= 4 | 5 | 参考下面两篇文章,配置Sock5代理即可解析文件提交任务。 6 | 7 | https://www.renderbus.com/support-new/inssub 8 | https://www.renderbus.com/support-new/network-requirements 9 | -------------------------------------------------------------------------------- /source/p_Git/git_release_version.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Git发布版本 3 | ============================= 4 | 5 | Github中找到想要发布版本的repo代码仓库,找到Release选项创建新版本。 6 | 7 | Gitlab中找到想要发布版本的repo代码仓库,点击Tag标签,New Tag,修改Tag name,Message以及Release notes,Tag name建议是v1.1.0这样的版本号。 8 | 9 | - 语义化版本标准:https://semver.org/lang/zh-CN/ -------------------------------------------------------------------------------- /source/p_PyQt/pyqt_resources.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | PyQt设置图标的相对路径 3 | ============================= 4 | 5 | - 编译qrc相对路径 6 | 7 | 创建resource.qrc 8 | "C:\Python27\Scripts\pyside-uic.exe" -o deploy.py deploy.ui 9 | "C:\Python27\Lib\site-packages\PySide\pyside-rcc.exe" -o resource_rc.py resource.qrc 10 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_wiki.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | 维基百科镜像 3 | ========================================= 4 | 5 | 国内上维基百科步步维艰,可以通过维基百科镜像访问。 6 | 7 | 8 | ---------------- 9 | 参考文档 10 | ---------------- 11 | 12 | - http://www.zgc261.com/wikipedia.html 13 | - https://www.wanweibaike.com/ 14 | -------------------------------------------------------------------------------- /source/parts/Nuke.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Nuke 3 | ============================= 4 | 5 | NUKE是由位于英国伦敦的The Foundry公司开发和销售的一款“基于节点”的数字影视合成软件,广泛应用于电影和电视的后期合成。NUKE 当前支持的操作系统为:Microsoft Windows,Mac OS X,以及Linux。 6 | 7 | Contents: 8 | 9 | .. toctree:: 10 | :maxdepth: 1 11 | :glob: 12 | 13 | ../p_Nuke/* 14 | -------------------------------------------------------------------------------- /source/p_Git/git_ignore.rst: -------------------------------------------------------------------------------- 1 | ==================================== 2 | Git使用.gitignore过滤上传文件 3 | ==================================== 4 | 5 | 很多时候我们并不想仓库中所有文件都要推送到远程仓库中,此时可以在仓库的根目录上创建一个.gitignore文件。 6 | 7 | 记事本打开写入如下内容: 8 | 9 | .. code-block:: python 10 | 11 | *.py[cod] 12 | .vscode 13 | *.nk.autosave 14 | *.nk~ 15 | -------------------------------------------------------------------------------- /source/parts/UE4.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | UE4 3 | ============================= 4 | 5 | UE4是Unreal Engine 4的缩写,中文译为“虚幻引擎4”,UE4是一款代码开源、商业收费、学习免费的游戏引擎,支持PC、手机、掌机等各种平台,能够充分发挥硬件的性能。UE4虽然也有自己的脚本语言,但性能堪忧,所以在大型游戏开发中人们一般使用C++。 6 | 7 | Contents: 8 | 9 | .. toctree:: 10 | :maxdepth: 1 11 | :glob: 12 | 13 | ../p_UE4/* 14 | -------------------------------------------------------------------------------- /source/parts/UE5.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | UE5 3 | ============================= 4 | 5 | UE5是Unreal Engine 5的缩写,中文译为“虚幻引擎5”,UE5是一款代码开源、商业收费、学习免费的游戏引擎,支持PC、手机、掌机等各种平台,能够充分发挥硬件的性能。UE5虽然也有自己的脚本语言,但性能堪忧,所以在大型游戏开发中人们一般使用C++。 6 | 7 | Contents: 8 | 9 | .. toctree:: 10 | :maxdepth: 1 11 | :glob: 12 | 13 | ../p_UE5/* 14 | -------------------------------------------------------------------------------- /source/p_Devops/Others.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Others 3 | ============================= 4 | 5 | DevOps(Development和Operations的组合詞)是一种重视「软件开发人员(Dev)」和「IT运维技术人员(Ops)」之间沟通合作的文化、运动或慣例。透过自动化「软件交付」和「架构变更」的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。 6 | 7 | Contents: 8 | 9 | .. toctree:: 10 | :maxdepth: 1 11 | :glob: 12 | 13 | Others/* 14 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_miss_dialog.rst: -------------------------------------------------------------------------------- 1 | ======================================= 2 | Houdini输出进度条不在显示器内的解决方案 3 | ======================================= 4 | 5 | 偶尔我们在更换过程中会遇到某些窗口跑到显示器外面,如何找回呢? 6 | 7 | 通常的解决方案是通过Alt+Tab选择有问题的窗口,然后Alt+Space调出最大化最小化移动的窗口,再用快捷键M+↑↓←→就可以移动窗口了,或者按X最大化窗口。 8 | 9 | 但是Houdini这个窗口位置是记录在我的文档里面的,可以通过删除我的文档内容,切记要备份文件。 10 | -------------------------------------------------------------------------------- /source/p_SQL/sql_order_by.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | SQL查询按数字排序 3 | ========================================= 4 | 5 | 这里要特别注意如果字段是字符串类型的数字,需要转换int类型再做排序,不然会出问题。 6 | 7 | .. code-block:: python 8 | 9 | SELECT version_number FROM publishedfile WHERE task__id = 11086 and _active = 't' ORDER BY CAST(version_number AS int) 10 | -------------------------------------------------------------------------------- /source/parts/Katana.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Katana 3 | ============================= 4 | 5 | The Foundry Katana是一款相当优秀的专业化3D渲染软件,The Foundry Katana最新版功能强劲,为用户提供了专业性的灯光照明增强功能,为您带来高效的灯光照明效果,The Foundry Katana软件便捷好用,能够满足当今最苛刻的视觉效果项目的需求。 6 | 7 | Contents: 8 | 9 | .. toctree:: 10 | :maxdepth: 1 11 | :glob: 12 | 13 | ../p_Katana/* 14 | -------------------------------------------------------------------------------- /source/p_Git/git_install_tortoisegit.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Git以及TortoiseGit安装以及使用 3 | ============================== 4 | 5 | SVN和Git都是代码版本控制软件,Git更是采用分布式版本控制系统,目前市面比较常用,而TortoiseGit是Git图形化软件,使代码管理更高效。 6 | 7 | - 安装Git 8 | 9 | 官网下载地址:https://git-scm.com/downloads 10 | 11 | - 安装TortoiseGit 12 | 13 | 官网下载地址:https://tortoisegit.org/download/ 14 | -------------------------------------------------------------------------------- /source/parts/Deadline.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Deadline 3 | ============================= 4 | 5 | Deadline是用于Windows,Linux和基于macOS的渲染农场的无忧管理和计算管理工具包。它支持开箱即用的80多种DCC应用程序。它为各种规模的渲染农场和计算集群提供了灵活性和广泛的管理选项,并允许用户自由地轻松访问内部部署或基于云的资源的任意组合以满足其渲染和处理需求。 6 | 7 | Contents: 8 | 9 | .. toctree:: 10 | :maxdepth: 1 11 | :glob: 12 | 13 | ../p_Deadline/* 14 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_noise.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:噪波函数 3 | ============================== 4 | 5 | - float rand(float seed) 6 | - vector2 rand(float seed) 7 | - vector rand(float seed) 8 | - vector4 rand(float seed) 9 | - ... 10 | 11 | .. code-block:: python 12 | 13 | @Cd = rand(@ptnum); 14 | @Cd = rand(@primnum); 15 | -------------------------------------------------------------------------------- /source/p_Nuke/nuke_tcl.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Nuke TCL 3 | ============================== 4 | 5 | .. code-block:: python 6 | 7 | [file dirname [value root.name]] # 当前nuke文件所在的文件夹 8 | [join [lrange [split [file dirname [value root.name]] /] 0 end-1] /] # 当前nuke文件所在文件夹的上一个层级 9 | 10 | 参考文档: 11 | 12 | - http://www.jeangjenq.com/tcl-python-snippets/ -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_youtube_download.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Youtube视频下载 3 | ========================================= 4 | 5 | 下载可以尝试下面的网址,因为政策一直在变,也要跟着变化 6 | 7 | https://loader.to/en55/1080p-video-downloader.html 8 | 9 | 10 | 下载字幕 11 | 12 | https://downsub.com/ 13 | 14 | 下载中英混合字幕(SRT 中文在上,以中文时间轴为准) 15 | 16 | 最新版格式工厂混流加音频与字幕,字幕加粗即可 -------------------------------------------------------------------------------- /source/parts/Devops.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Devops 3 | ============================= 4 | 5 | DevOps(Development和Operations的组合詞)是一种重视「软件开发人员(Dev)」和「IT运维技术人员(Ops)」之间沟通合作的文化、运动或慣例。透过自动化「软件交付」和「架构变更」的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。 6 | 7 | Contents: 8 | 9 | .. toctree:: 10 | :maxdepth: 2 11 | :glob: 12 | 13 | ../p_Devops/FreeNAS 14 | ../p_Devops/Others -------------------------------------------------------------------------------- /source/parts/Python.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python 3 | ============================= 4 | 5 | Python在CG行业中应用广泛,大部分DCC软件,比如Houdini、Maya、Nuke、Katana、C4D等等都用Python作为接口编程语言,因其开发效率高,代码简洁容易上手的特性,为没有系统学习过计算机原理的艺术家也可以编写自己的工具插件以提高日常工作效率,因此掌握Python知识体系是每个艺术家的当务之急。 6 | 7 | Contents: 8 | 9 | .. toctree:: 10 | :maxdepth: 1 11 | :glob: 12 | 13 | ../p_Python/* 14 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_win_server_priority.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Win Server 2012文件共享权限管理 3 | ========================================= 4 | 5 | 正常来说我们将一个分区共享出去并配置Everyone读写权限,这是个一劳永逸的方案,任何用户都能访问共享,但是经常我们有具体文件夹具体权限分配的问题,比如一个分区中有个档案文件夹需要关闭所有人访问权限,只授予某些人的单独权限,可以在档案文件夹上右键选择共享>停止共享,这样设置之后就没有用户能访问这个文件夹了,然后在右键>属性>安全添加某一个用户的权限,这样就可以将这个文件夹权限做了特定用户权限,而无须每个文件夹去配置权限。 -------------------------------------------------------------------------------- /source/parts/Clarisse.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Clarisse 3 | ============================= 4 | 5 | 如今的 VFX 与 CG 项目需要比以往更加精细和复杂的环境。Clarisse iFX 为用户提供能满足这一需求的工具。艺术家能生成精美和丰富的数字化环境,达到前所未有的交互水平,同时处理数不胜数的多边形。布局、场景构建、布景和摄影机投影都为了实现全面的灵活性而打造;由实时几何体更新提供动力的非线性工作流程意味着艺术家能随时随地工作,与他人的合作也更多。 6 | 7 | Contents: 8 | 9 | .. toctree:: 10 | :maxdepth: 1 11 | :glob: 12 | 13 | ../p_Clarisse/* 14 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_remote_oracle.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Win10远程桌面出现身份验证错误 3 | ========================================= 4 | 5 | Win10操作系统在使用mstsc远程桌面连接的时候偶尔会遇到 6 | 7 | ``出现身份验证错误。要求的函数不受支持 远程计算机:这可能是由于CredSSP加密Oracle修正。`` 8 | 9 | 遇到这个问题的时候,在遇到问题的计算机上 ``Win+R`` 打开“运行”,输入gpedit.msc打开本地组策略编辑器。 10 | 11 | 找到计算机配置>管理模板>系统>凭据分配>加密Oracle修正。 12 | 13 | 选择启用并选择易受攻击即可。 14 | -------------------------------------------------------------------------------- /source/p_Python/python_generator.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python生成器 3 | ============================= 4 | 5 | 生成器的本质也是迭代器,惰性迭代,在于减少内存占用。 6 | 7 | yield与return的区别 8 | 9 | next()与__next__() 10 | 11 | .. code-block:: python 12 | 13 | def generatorFunc(): 14 | a = 1 15 | yield a 16 | 17 | a = 2 18 | yield a 19 | 20 | a = 3 21 | yield a 22 | -------------------------------------------------------------------------------- /source/p_Maya/maya_mel_basics.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya MEL基础 3 | ============================== 4 | 5 | - Maya脚本编辑器使用方法 6 | - Maya帮助文档查询方法 7 | - Maya中MEL命令转Python命令方法 8 | - Maya中Python中执行MEL命令 9 | 10 | Script Editor脚本编辑器,提取历史命令。 11 | 12 | 快捷键Ctrl+Enter 13 | 14 | 单行注释 15 | 16 | 多行注释 17 | 18 | MEL语言的一些标识,$,分号,花括号,变量类型声明 19 | 20 | MEL与Python脚本的互转,如何在MEL脚本中执行Python,Python脚本中执行MEL? 21 | 22 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_install_clarisse.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | 软件安装:Clarisse 3 | ========================================= 4 | 5 | - 选择isotropix_clarisse_ifx_4.0_win64.exe,右键以管理员身份运行。 6 | - 一直Next傻瓜式安装,遇到python安装可以先不安装(如果安装过python27的话)。 7 | - 修改配置文件C:\Program Files\Isotropix\Clarisse iFX 3.0\Clarisse\clarisse.env 8 | 9 | .. code-block:: python 10 | 11 | PYTHONHOME=C:\Python27 12 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_python_panel.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini Python Panel 3 | ============================== 4 | 5 | Interfaces 6 | 7 | Toolbar Menu 8 | 9 | Pane Tab Menu 10 | 11 | 12 | .. code-block:: python 13 | 14 | from hutil.Qt import QtWidgets 15 | 16 | def onCreateInterface(): 17 | widget = QtWidgets.QPushButton("Create Explosion NOW!") 18 | return widget 19 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_texture.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:贴图函数 3 | ============================== 4 | 5 | ============ ================================================================== 6 | colormap() # 将贴图颜色信息映射到点 7 | ============ ================================================================== 8 | 9 | .. code-block:: bash 10 | 11 | @Cd = colormap("texture path", @uv); 12 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_deploy_rocket_chat.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Rocket.Chat免费聊天工具部署 3 | ========================================= 4 | 5 | .. code-block:: python 6 | 7 | from rocketchat_API.rocketchat import RocketChat 8 | 9 | rocket = RocketChat("Robot", "", server_url="http://192.168.0.244:3000") 10 | rocket.chat_post_message("@Andy test!", channel="general") 11 | -------------------------------------------------------------------------------- /source/p_Python/python_special_property_path.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python特殊属性:__path__ 3 | ============================= 4 | 5 | __path__是模块包的特殊属性,它会返回模块包的文件夹完整路径。 6 | 7 | .. code-block:: python 8 | 9 | >>> import PySide 10 | >>> PySide.__file__ 11 | 'C:\\Python27\\lib\\site-packages\\PySide\\__init__.pyc' 12 | >>> PySide.__path__ 13 | ['C:\\Python27\\lib\\site-packages\\PySide'] 14 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_install_ue4.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | 软件安装:UE4 3 | ========================================= 4 | 5 | 通过Epic安装UE4一般限于网速比较困难,可以网络上下载离线安装包,解压完会有四个文件夹。 6 | 7 | .. code-block:: python 8 | 9 | Engine 10 | FeaturePacks 11 | Samples 12 | Templates 13 | 14 | 直接找下面的.exe文件打开运行即可。 15 | 16 | .. code-block:: python 17 | 18 | Engine\Binaries\Win64\UE4Editor.exe 19 | -------------------------------------------------------------------------------- /source/p_Maya/maya_redshift_rstexbin.rst: -------------------------------------------------------------------------------- 1 | ================================ 2 | Maya Redshift批量转贴图rstexbin 3 | ================================ 4 | 5 | 在Redshift安装路径 ``C:\ProgramData\Redshift\bin`` 下找到redshiftTextureProcessor.exe,比如 ``D:\Texture`` 路径下有一批.jpg贴图需要转rstexbin,可以打开命令行窗口,写入下面的指令批量转换,有时候能解决贴图渲染卡住的问题。 6 | 7 | .. code-block:: bash 8 | 9 | C:\ProgramData\Redshift\bin\redshiftTextureProcessor.exe D:\Texture\*.jpg 10 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_python_executable_environment.rst: -------------------------------------------------------------------------------- 1 | =============================== 2 | Houdini中可执行Python代码的环境 3 | =============================== 4 | 5 | * Python Shell 6 | 7 | Windows>Python Shell 8 | 9 | * Python Source Editor 10 | 11 | Window>Python Source Editor 12 | 13 | * Shelf Tools 14 | * Custom Menu 15 | * Parameter Expressions 16 | * Python SOPs 17 | * Button Callback 18 | * Event Handler 19 | * Python Panel 20 | -------------------------------------------------------------------------------- /source/p_Python/python_comprehensions.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python推导 3 | ============================= 4 | 5 | Python四种内建容器刚好对应有四种推导方式。 6 | 7 | - 列表推导 8 | 9 | .. code-block:: python 10 | 11 | myList = [] 12 | 13 | for i in range(10): 14 | myList.append(i * 2) 15 | 16 | .. code-block:: python 17 | 18 | myList = [i * 2 for i in range(10)] 19 | 20 | - 生成器表达式 21 | 22 | - 集合推导 23 | 24 | - 字典推导 25 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_groups.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:组 3 | ============================== 4 | 5 | VEX打组 6 | 7 | @group_name 8 | 9 | npointsgroup() // 返回组中有多少个点 10 | nprimitivesgroup() 11 | nverticesgroup() 12 | 13 | .. code-block:: python 14 | 15 | if (@P.x > 0) { 16 | @group_up = 1; 17 | } 18 | 19 | 20 | 组函数 21 | 22 | setpointgroup() 23 | 24 | inpointgroup() 25 | 26 | expandgroup() 以数组的形式返回组中元素 27 | -------------------------------------------------------------------------------- /source/p_Maya/maya_shelf_tools.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya自定义工具架工具 3 | ============================== 4 | 5 | 6 | 7 | load shelf 8 | 9 | 自定义工具架 10 | 自定义工具架工具 11 | 12 | 1.鼠标中键拖拽代码 13 | 2.Ctrl+Shift+鼠标左键点击菜单 14 | 15 | Shelf Editor 16 | 17 | Shelves 18 | Command 19 | Double Click Command 20 | Popup Menu Items 21 | 22 | 23 | loadNewShelf 24 | 25 | import pymel.core as pm 26 | 27 | if not pm.shelfLayout(shelfName, q=True, ex=True) 28 | -------------------------------------------------------------------------------- /source/p_Linux/linux_command.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Linux常用指令大全 3 | ============================= 4 | 5 | 防火墙相关指令: 6 | 7 | .. code-block:: bash 8 | 9 | systemctl status firewalld 10 | systemctl start firewalld 11 | systemctl stop firewalld 12 | systemctl disable firewalld 13 | systemctl enable firewalld 14 | 15 | 参考文档: 16 | 17 | - https://www.bilibili.com/video/BV1nW411L7xm 18 | - https://www.bilibili.com/video/BV1DW411G7VB 19 | -------------------------------------------------------------------------------- /source/p_Maya/maya_pack_tool.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya打包工具 3 | ============================== 4 | 5 | Maya外链文件、缓存以及代理 6 | 7 | - nParticle缓存(不包括已经过时的经典粒子) 8 | - nHair缓存 9 | - nCloth缓存 10 | - Fluid缓存 11 | - Geo缓存 12 | - MASH缓存 13 | - Texture贴图(包括UDIM-Mari) 14 | - Alembic缓存 15 | - XGEN描述及贴图 16 | - Reference Ma及Mb文件 17 | - Arnold_Proxy代理(以及代理内的贴图) 18 | - Vray_Proxy代理 19 | - Redshift_Proxy代理 20 | - Bifrost缓存 21 | - Audio声音文件 22 | 23 | 通过插件加载情况来针对性检测外链文件 24 | 25 | -------------------------------------------------------------------------------- /source/p_UE4/ue4_share_blueprint.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | UE4蓝图分享网址 3 | ========================================= 4 | 5 | 「蓝图」是虚幻引擎为开发者开发的一款脚本语言,它已经封装好大量的函数和带有可视化编程的特点,深受广大开发者的喜爱,不过这种方便带来的弊端是性能上的损耗,所以蓝图更适合开发中小型项目。 6 | 7 | 分享你的蓝图脚本可以使用下面的网址: 8 | 9 | .. code-block:: python 10 | 11 | https://blueprintue.com/ 12 | http://blueprintue.cn/ 13 | 14 | 临时分享代码的网址还有一个,也挺有意思。 15 | 16 | .. code-block:: python 17 | 18 | https://paste.ubuntu.com/ 19 | -------------------------------------------------------------------------------- /source/p_Maya/maya_execute_script_nodes.rst: -------------------------------------------------------------------------------- 1 | ===================================== 2 | Maya配置Execute script nodes 3 | ===================================== 4 | 5 | 在菜单File>Open打开文件的选项设置中有一项Execute script nodes,默认是勾选状态,它的意思是打开文件的时候执行文件中ScriptNode节点中的脚本,这也是普天同庆恶意脚本传播的原理,所以在清理完C盘相关文件之后,只要简单配置关闭这个选项就可以防止这个恶意脚本的传播。 6 | 7 | 我们找到文件C:\Users\huweiguo\Documents\maya\2018\prefs\userPrefs.mel,搜索fileExecuteSN,将1改为0保存即可。 8 | 9 | .. code-block:: python 10 | 11 | -iv "fileExecuteSN" 0 12 | -------------------------------------------------------------------------------- /source/p_Deadline/deadline_config_app_version.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Deadline渲染农场配置软件版本 3 | ============================= 4 | 5 | 配置软件版本需要配置两个地方,首先如果你是使用默认菜单提交方式,想添加软件版本可以通过修改下面的模块文件 6 | 7 | .. code-block:: python 8 | 9 | DeadlineRepository10\scripts\Submission\HoudiniSubmission.py 10 | 11 | 此时我们只是能提交我们配置的软件版本,但任务肯定会报错,因为我们还需要配置插件,也就是后台会去调用什么软件版本去跑任务。这里需要去明确配置。 12 | 13 | .. code-block:: python 14 | 15 | DeadlineRepository10\plugins\Houdini\Houdini.param 16 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_opencl.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini OpenCL简单介绍 3 | ============================== 4 | 5 | .. code-block:: python 6 | 7 | kernel void up(int P_length, global float *P) { 8 | int idx = get_global_id(0); 9 | 10 | if (idx >= P_length) { 11 | return; 12 | } 13 | 14 | float3 pos = vload3(idx, P); 15 | 16 | pos.y += 1; 17 | 18 | vstore3(pos, idx, P); 19 | } 20 | 21 | OpenCL不能创建属性。 -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_net_disable_enable.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | 命令行禁用网卡再启用操作 3 | ========================================= 4 | 5 | 有时候域网络首次无法识别,需要禁用网卡再启用才能识别,但很多时候需要远程操作就比较麻烦,网络被禁用就无法远程,所以写两条指令自动禁用再启用比较OK。 6 | 7 | 管理员身份运行cmd,然后将下面三行shell脚本粘贴到命名行窗口执行即可,注意网卡名称“以太网”需要改成对应的名称,pause是必须的,不然无法执行第二条指令。 8 | 9 | .. code-block:: python 10 | 11 | netsh interface set interface "以太网" disabled 12 | netsh interface set interface "以太网" enabled 13 | pause 14 | -------------------------------------------------------------------------------- /source/p_Python/python_special_property_file.rst: -------------------------------------------------------------------------------- 1 | ======================================= 2 | Python特殊属性:__file__ 3 | ======================================= 4 | 5 | __file__是模块对象的特殊属性,它会返回模块文件的完整路径,如果模块是包的话,则返回包的__init__.py的完整路径。这在工作中非常实用,比如我自定义了一个命名污染的模块platform.py,在使用的时候一直报错,就可以通过代码查找此模块的路径,就会发现系统已经存在这个模块,是因为导入的不是我写的这个模块导致的错误,很多时候很方便检查代码在什么地方。 6 | 7 | .. code-block:: python 8 | 9 | >>> import platform 10 | >>> platform.__file__ 11 | 'C:\\Python27\\lib\\platform.pyc' 12 | 13 | -------------------------------------------------------------------------------- /source/p_Git/git_repo_hosts.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Git代码仓库托管平台 3 | ============================= 4 | 5 | Git托管平台推荐使用Github、Gitlab,国外服务器访问上可能有些丢包延时的问题,也可以使用本地服务器安装虚拟机搭建本地Gitlab以满足大型团队协作。 6 | 7 | 国外平台: 8 | 9 | - Github: https://github.com/ 10 | - Gitlab: https://gitlab.com 11 | - BitBucket: https://bitbucket.org/ 12 | - SourceForge: https://sourceforge.net/ 13 | 14 | 国内平台: 15 | 16 | - 码云: https://gitee.com/ 17 | 18 | 19 | 参考文档: 20 | 21 | - https://www.jianshu.com/p/bd24f3202011 22 | -------------------------------------------------------------------------------- /source/p_Git/git_simple_workflow.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Git基本工作流程 3 | ============================== 4 | 5 | 下面的命令是日常Git工作流必须要使用到的命令,多敲几遍掌握它们。 6 | 7 | - git clone repo 8 | - git config --global user.name "Your Name" 9 | - git config --global user.email "email@example.com" 10 | - git status 11 | - gitk 12 | - git pull origin master 13 | - git add . 14 | - git commit -m "comment" -a 15 | - git push origin master 16 | 17 | 下面这些命令偶尔使用,知道是做什么用的即可。 18 | 19 | - git remote -v # 获取远程仓库的目标地址 20 | -------------------------------------------------------------------------------- /source/p_Maya/maya_environment_variables.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya环境变量 3 | ============================== 4 | 5 | 高级系统设置>环境变量 6 | 7 | 系统变量 8 | 用户变量 9 | 10 | 命令行窗口如何运行Maya? 11 | Path 12 | 如何修改Maya语言选项? 13 | MAYA_UI_LANGUAGE 14 | 15 | putenv & getenv 16 | 17 | Maya.env 18 | 19 | 如何阅读帮助文档? 20 | 21 | MAYA_PLUG_IN_PATH 22 | MAYA_MODULE_PATH 23 | MAYA_SCRIPT_PATH 24 | XBMLANGPATH 25 | 26 | - http://help.autodesk.com/view/MAYAUL/2018/CHS/?guid=GUID-925EB3B5-1839-45ED-AA2E-3184E3A45AC7 27 | -------------------------------------------------------------------------------- /source/p_Python/python_special_property_name.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python特殊属性:__name__ 3 | ============================= 4 | 5 | __name__是模块对象的特殊属性,模块文件在直接执行的时候等于"__main__",而在被导入的时候则为模块的名称。所以一般可以在模块中将单元测试代码放在下面的if语句块中。 6 | 7 | .. code-block:: python 8 | 9 | if __name__ == "__main__": 10 | code block 11 | 12 | 正常来说模块文件都不是直接执行,而是通过模块导入名称空间的方式调用模块中具体变量,函数以及类从而达到使用模块的目的,也就是说上面的代码块在导入模块的时候将不起作用,只有在直接执行的时候才会运行,所以常用来作为单个模块单元测试使用。 13 | 14 | 在导入模块的时候__name__将会作为key的方式存储在sys.modules字典中。 15 | -------------------------------------------------------------------------------- /source/p_C4D/c4d_deploy_redshift.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | C4D部署Redshift 3 | ========================================= 4 | 5 | C4D中部署Redshift非常简单,在安装Redshift的时候如果没有安装C4D或者自动配置环境的选项没有勾选,则C4D不会自动加载Redshift插件。后期部署Redshift也非常简单。这里假设你已经安装好了Redshift以及C4D R19,以管理员身份打开命令行窗口(切记以管理员身份运行)。 6 | 7 | .. code-block:: python 8 | 9 | C:\Users\huweiguo>cd C:\ProgramData\Redshift\Plugins\C4D 10 | C:\ProgramData\Redshift\Plugins\C4D>install_c4d.bat R19 "C:\Program Files\MAXON\Cinema 4D R19\plugins" 11 | -------------------------------------------------------------------------------- /source/p_Maya/maya_redshift_cache.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya Redshift修改缓存路径 3 | ============================== 4 | 5 | Maya Redshift插件默认缓存路径 ``%LOCALAPPDATA%\Redshift\Cache``,如果使用默认缓存路径,很快C盘空间就会爆掉,此处的LOCALAPPDATA是环境变量路径,可以通过命令行窗口输入下面指令得到路径。 6 | 7 | .. code-block:: bash 8 | 9 | C:\Users\huweiguo>set LOCALAPPDATA 10 | LOCALAPPDATA=C:\Users\huweiguo\AppData\Local 11 | 12 | C:\Users\huweiguo> 13 | 14 | 在Maya渲染面板Render Settings中切换Redshift渲染选项,找到System>Global Preferences>Cache Folder,可以修改缓存文件夹路径。 -------------------------------------------------------------------------------- /source/readme.txt: -------------------------------------------------------------------------------- 1 | - [ ] shader 2 | - [ ] docker 3 | - [ ] webhook 4 | - [ ] RestAPI 5 | 6 | - [ ] Katana Python开发 7 | - [ ] UE4蓝图开发 8 | - [ ] Houdini VEX开发 9 | - [ ] C4D开发 10 | - [ ] Nuke Studio 11 | - [ ] Hiero 12 | - [ ] Substance Painter 13 | - [ ] Substance Designer 14 | - [ ] Marvelous Designer 15 | 16 | - [ ] Maya MEL 17 | - [ ] Maya Python 18 | - [ ] Maya Script 19 | - [ ] Maya Program 20 | 21 | 课件注重案例与练习 22 | 23 | 胡安迪工具盒 24 | 25 | - qLib 26 | - Arnold 27 | - Redshift 28 | - Realflow 29 | - Deadline Submit 30 | -------------------------------------------------------------------------------- /source/p_Deadline/deadline_pool_group.rst: -------------------------------------------------------------------------------- 1 | =============================== 2 | Deadline渲染农场池和组的概念 3 | =============================== 4 | 5 | Groups很容易理解,渲染节点的硬件和软件配置不同可以设置不同的组以便适应不同任务渲染。比如现在有一批Houdini 18的文件需要渲染,你只能在已经安装过Houdini 18的机器上才能正确渲染,别的机器渲染肯定会报错,此时为了排除不正确的机器就可以将机器编组,提交任务的时候将任务丢到组中,这样就不会调度没有组的机器。 6 | 7 | 池可以说是有优先级顺序的组,相当于把农场几分天下,有时候有这样一些需求就是灯光任务优先级永远是最高的,或者分配一部分机器给某一个项目优先使用,此时就要用到池的概念,一个任务进农场调度机器首先会检查它属于哪个池,如果没有设置池的属性,渲染优先级都是最低的,设置了池,任务就会到这个池中然后按正常的优先级,提交日期和组去调度池中的机器。如果池中没有了任务,机器才会调度给没有设置池的任务,即使他们的优先级设置了100也没用,池中优先级是最优先的。 8 | -------------------------------------------------------------------------------- /source/p_Python/python_iterator.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python迭代器 3 | ============================= 4 | 5 | - 迭代器对象 6 | - 可迭代对象 7 | 8 | .. code-block:: python 9 | 10 | from collections import Iterator 11 | from collections import Iterable 12 | 13 | print(help(Iterator)) 14 | print(help(Iterable)) 15 | 16 | 17 | .. code-block:: python 18 | 19 | list1 = range(5) 20 | iter1 = iter(list1) 21 | print(list1.__next__) 22 | print(type(list1)) 23 | print(type(iter1)) 24 | 25 | 26 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_shelf_tools.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini工具架工具 3 | ============================== 4 | 5 | Houdini工具架上点击加号 + > New Shelf ... 6 | 7 | toolbar & HOUDINI_PATH 8 | 9 | Name & Label 10 | 11 | Icon 官方图标加载的两种方案 & 自定义图标 & HOUDINI_PATH 12 | 13 | 模块化代码管理 sys.path & HOUDINI_PATH & reload & sys.modules & 包与模块 14 | 15 | TAB menu 16 | 17 | Hotkeys & HotkeyOverrides & HOUDINI_PATH & Ctrl+Shift+Alt+Left Mouse 18 | 19 | 拖拽工具架工具集中管理 20 | 21 | 将一套节点拖拽到工具架工具管理 22 | 23 | kwargs & __builtin__ & __name__ 24 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_intranet_penetration.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | 花生壳内网穿透技术解析 3 | ========================================= 4 | 5 | 内网穿透的必备条件是有搭建好的本地服务器,比如Confluence,Jira,RocketChat,Seafile等等,一般搭建好服务器都可以通过本地的IP地址加端口号来访问服务器,但是如果想外网也能访问内部服务器,这里就要使用到内网穿透技术,一般如果有固定的公网IP,直接在路由器上做好设置也没有什么问题,但是如果网络是公用的,那么是没有固定公网IP分配的,可以打电话给营业商咨询。如果实在没有公网IP,那么使用类似花生壳这样的软件来做动态IP解析也是可以的。 6 | 7 | 在花生壳申请域名,不知道这个能不能用自己购买的域名,然后添加使用HTTP协议的内网穿透配置即可,花生壳需要实名认证,否则功能会被禁用。 8 | 9 | .. code-block:: bash 10 | 11 | https://www.oray.com/ 12 | -------------------------------------------------------------------------------- /source/p_Ftrack/ftrack_python_api.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Ftrack Python API 3 | ============================= 4 | 5 | 创建用户 6 | 7 | .. code-block:: python 8 | 9 | newUser = session.create("User", {"username": "huweiguo@do-vfx.com"}) 10 | 11 | session.commit() 12 | 13 | 创建任务 14 | 15 | .. code-block:: python 16 | 17 | shot = session.query("Shot where name is 'f_CTS049'").first() 18 | 19 | newTask = session.create("Task", {"name": "fx_autosphere", "parent": shot}) 20 | 21 | session.commit() 22 | 23 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_otls_scripts.rst: -------------------------------------------------------------------------------- 1 | ================================ 2 | Houdini otls:可执行代码 3 | ================================ 4 | 5 | hou.pwd().hdaModule() 6 | 7 | hou.pwd() & kwargs 8 | 9 | Custom Script 10 | 11 | Expressions 12 | 13 | Python Module 14 | 15 | Before First Create 16 | 17 | On Created 18 | 19 | On Loaded 20 | 21 | On Updated 22 | 23 | On Deleted 24 | 25 | After Last Delete 26 | 27 | On Input Changed 28 | 29 | On Name Changed 30 | 31 | On Install 32 | 33 | On Uninstall 34 | 35 | Sync Node Version 36 | -------------------------------------------------------------------------------- /source/p_Nuke/nuke_centralized_tools.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Nuke中心化配置插件 3 | ============================== 4 | 5 | 插件是否可以中心化,取决于插件是否按扩展开发的层级结构来处理,如果按照规范来开发的插件,可以通过修改 ``C:\Users\{用户名}\.nuke\init.py`` 文件来中心化插件。 6 | 7 | .. code-block:: python 8 | 9 | import nuke 10 | 11 | nuke.pluginAddPath("插件路径") 12 | 13 | 举个例子,可以从网络上下载一个插件 14 | 15 | https://github.com/Psyop/Cryptomatte 16 | 17 | 下载完将其解压到D盘,可以通过下面代码将插件部署到Nuke。 18 | 19 | .. code-block:: python 20 | 21 | import nuke 22 | 23 | nuke.pluginAddPath("D:/Cryptomatte") -------------------------------------------------------------------------------- /source/p_Python/python_docstring.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python注释文档 3 | ============================= 4 | 5 | - docstring 6 | 7 | 单行代码注释 8 | 多行代码注释 9 | 10 | 11 | docstring规范 12 | 都是以三引号的字符串 13 | 自定义模块在开始 14 | 自定义函数def之后 15 | 自定义class之后 16 | 17 | .. code-block:: python 18 | 19 | def sceneViewer(): 20 | """ Returns an existing open Scene Viewer pane if there is one. A 21 | Context viewer is also acceptable is no dedicated scene viewer 22 | is found. 23 | """ 24 | 25 | 如何将docstring转成html文档? 26 | -------------------------------------------------------------------------------- /source/p_Nuke/nuke_developer_document.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Nuke开发者文档 3 | ============================== 4 | 5 | - HieroPythonDevGuide 6 | - NDKDevGuide 7 | - NDKReference 8 | - NukePythonAPI 9 | - NukePythonDevGuide 10 | 11 | 参考文档: 12 | 13 | - Nuke Python Developer’s Guide: https://learn.foundry.com/nuke/developers/latest/pythondevguide/ 14 | - Nuke Python API: https://learn.foundry.com/nuke/developers/latest/pythonreference/ 15 | - Nuke Pedia: http://www.nukepedia.com/ 16 | - Andrea Geremia: http://www.andreageremia.it/tutorial.html 17 | -------------------------------------------------------------------------------- /source/p_Git/git_config_proxy.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Git配置代理网络访问 3 | ============================== 4 | 5 | 首先我们要用Vmware+CentOS搭建一个代理服务器,比如IP是192.168.0.112。 6 | 7 | 内网Git可以通过配置代理访问远程仓库。 8 | 9 | .. code-block:: python 10 | 11 | git config --global http.proxy 192.168.0.112:3128 12 | 13 | 如果内网搭建了域以及DNS服务器做了IP映射,也可以通过下面的方式来配置。 14 | 15 | .. code-block:: python 16 | 17 | git config --global http.proxy squid.do-vfx.com:3128 18 | 19 | 如果不想使用代理服务器了,可以使用下面的指令移除配置。 20 | 21 | .. code-block:: python 22 | 23 | git config --global --unset https.proxy 24 | -------------------------------------------------------------------------------- /source/p_Python/python_advanced_features.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python高级功能 3 | ============================= 4 | 5 | - Python小整数池 6 | - Python异常处理 7 | - Python生成器yield以及迭代器 8 | - Python函数式编程 9 | - Python高阶函数,匿名函数,闭包函数以及装饰器 10 | - Python递归函数 11 | - Python anaconda 12 | - IPython 13 | - Jupyter lab 14 | - Jupyter notebook 15 | - import this 16 | - import __hello__ 17 | - import antigravity 18 | - Python 3 f-string格式化 19 | - __builtin__ 20 | - __file__ & __path__ 21 | - __name__ 22 | - Python列表推导 23 | - Python字典推导 24 | - Python生成器表达式 25 | - locals & globals 26 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_volume.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:体积函数 3 | ============================== 4 | 5 | - vector volumegradient(geometry, int primnum, vector pos) // 体积梯度 6 | - vector volumegradient(geometry, string volumename, vector pos) // 体积梯度 7 | - float volumesample(geometry, int primnum, vector pos) // 体积采样 8 | - float volumesample(geometry, string volumename, vector pos) // 体积采样 9 | 10 | .. code-block:: python 11 | 12 | float sample = volumesample(1, 0, @P); 13 | 14 | if (sample < 0) { 15 | removepoint(0, @ptnum); 16 | } 17 | -------------------------------------------------------------------------------- /source/parts/Houdini.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Houdini 3 | ============================= 4 | 5 | Houdini是一款三维计算机图形软件,由加拿大Side Effects Software Inc.(简称SESI)公司开发,SESI公司由Kim Davidson和Greg Hermanovic创建于1987年。Houdini是在Prisms基础上重新开发而来,可运行于Linux, Windows, Mac OS等操作系统,是完全基于节点模式设计的产物,其结构、操作方式等和其它的三维软件有很大的差异。Houdini自带的渲染器是Mantra,基于Reyes渲染架构,因此也能够快速的渲染运动模糊、景深和置换效果。Mantra是经过产品验证的成熟渲染器,可以满足电影级别的渲染要求。当然,Houdini也有第三方渲染器的接口,比如:RenderMan、Mental ray、V-Ray和Torque等,可以把场景导出到这些渲染引擎进行渲染。此部分文档主要用来探讨在Houdini中所有可行的编程方案以及更好的Pipeline解决方案。 6 | 7 | Contents: 8 | 9 | .. toctree:: 10 | :maxdepth: 1 11 | :glob: 12 | 13 | ../p_Houdini/* 14 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_deploy_squid.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Squid代理服务器搭建 3 | ========================================= 4 | 5 | VMware部署一台CentOS7 Linux虚拟机。 6 | 7 | .. code-block:: bash 8 | 9 | # 安装 10 | yum install squid -y 11 | yum install httpd-tools -y 12 | # 服务启动 13 | systemctl start squid.service 14 | # 服务停止 15 | systemctl stop squid.service 16 | # 配置开机自启动 17 | systemctl enable squid.service 18 | # 服务重启 19 | systemctl restart squid.service 20 | # 关闭防火墙 21 | systemctl stop firewalld.service 22 | # 禁用防火墙 23 | systemctl disable firewalld.service -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_measure.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:测量函数 3 | ============================== 4 | 5 | - vector relbbox(geometry, vector position) 6 | - vector relbbox(geometry, string primgroup, vector position) 7 | - vector relbbox(vector position) 8 | 9 | distance() 10 | 11 | .. code-block:: python 12 | 13 | @Cd = relbbox(geoself(), @P); 14 | 15 | - vector getbbox_size(geometry) 16 | - vector getbbox_size(geometry, string primgroup) 17 | 18 | .. code-block:: python 19 | 20 | vector size = getbbox_size(geoself()); 21 | printf("%g", size); 22 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_ffmpeg_codec.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | FFmpeg批量转码工具 3 | ========================================= 4 | 5 | .. code-block:: bash 6 | 7 | echo off 8 | M: 9 | cd M:\thirdParty\tools\ffmpeg\bin 10 | 11 | set OUTPUT_PATH=%1\build 12 | 13 | if not exist %OUTPUT_PATH% ( 14 | md %OUTPUT_PATH% 15 | ) 16 | 17 | for %%i in (%1\*.mov) do ffmpeg -i %%i -vcodec h264 -pix_fmt yuv420p -y %%~dpibuild\%%~ni.mov 18 | for %%i in (%1\*.mov) do echo %%~dpibuild\%%~ni.mov 19 | echo "Convert H.264 Successed!" 20 | echo "Output Path--->" %OUTPUT_PATH% 21 | pause 22 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_software.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | 中小型企业好用的软件推荐 3 | ========================================= 4 | 5 | - 火绒安全 6 | - Rocket.Chat 7 | - 网易邮箱大师 8 | - WPS 9 | - 钉钉 10 | - 阿里云邮箱 11 | - Snipaste 12 | - Deadline 13 | - Shotgun 14 | - 腾讯会议 15 | - Splashtop 16 | - 7-Zip 17 | - XMind 18 | - Navicat(访问数据库表) 19 | - VS Code(开源跨平台) 20 | - Notepad++ 21 | - Seafile 22 | - 拖把更名器 23 | - QuickTime 24 | - Chrome(谷歌翻译) 25 | - Firefox 26 | - Git 27 | - TortoiseGit 28 | - Connector 29 | - VMware 30 | - CentOS 31 | - KMS 32 | - Squid 33 | - Bandicam(Win录屏,Mac录屏使用QuickTime自带录屏) 34 | - IObit 35 | - 格式工厂(可以录屏,可以加字幕) 36 | - RDCMan(局域网远程桌面) 37 | 38 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_traceroute.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | 路由跟踪指令traceroute 3 | ========================================= 4 | 5 | - Linux 6 | 7 | .. code-block:: bash 8 | 9 | nslookup do-vfx.shotgunstudio.com 10 | traceroute do-vfx.shotgunstudio.com 11 | nslookup sg-media-tokyo.s3-accelerate.amazonaws.com 12 | traceroute sg-media-tokyo.s3-accelerate.amazonaws.com 13 | 14 | - Windows 15 | 16 | .. code-block:: bash 17 | 18 | nslookup do-vfx.shotgunstudio.com 19 | tracert do-vfx.shotgunstudio.com 20 | nslookup sg-media-tokyo.s3-accelerate.amazonaws.com 21 | tracert sg-media-tokyo.s3-accelerate.amazonaws.com 22 | -------------------------------------------------------------------------------- /source/p_Python/python_built_in_module_time.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python内置模块:math 3 | ============================= 4 | 5 | .. code-block:: python 6 | 7 | >>> import time 8 | >>> type(time) 9 | 10 | >>> dir(time) 11 | ['_STRUCT_TM_ITEMS', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'altzone', 'asctime', 'ctime', 'daylight', 'get_clock_info', 'gmtime', 'localtime', 'mktime', 'monotonic', 'monotonic_ns', 'perf_counter', 'perf_counter_ns', 'process_time', 'process_time_ns', 'sleep', 'strftime', 'strptime', 'struct_time', 'thread_time', 'thread_time_ns', 'time', 'time_ns', 'timezone', 'tzname'] 12 | >>> 13 | -------------------------------------------------------------------------------- /source/p_Python/python_built_in_module_datetime.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python内置模块:datetime 3 | ============================= 4 | 5 | .. code-block:: python 6 | 7 | >>> import datetime 8 | >>> type(datetime) 9 | 10 | >>> datetime.__file__ 11 | 'C:\\Python38\\lib\\datetime.py' 12 | >>> dir(datetime) 13 | ['MAXYEAR', 'MINYEAR', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'date', 'datetime', 'datetime_CAPI', 'sys', 'time', 'timedelta', 'timezone', 'tzinfo'] 14 | >>> 15 | >>> datetime.datetime(2020, 8, 18, 18, 48) 16 | datetime.datetime(2020, 8, 18, 18, 48) 17 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_math.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:数学函数 3 | ============================== 4 | 5 | =============== ==================================================== 6 | 函数名 描述 7 | abs() 返回参数的绝对值 8 | cos() cos函数 9 | ceil() 向下求整,返回大于或等于参数的最小整数 10 | cross() 叉乘 11 | dot() 点乘 12 | floor() 向上求整,返回小于或等于参数的最大整数 13 | frac() 返回参数的小数部分 14 | length() 返回矢量的长度 15 | normalize() 矢量规格化 16 | pow() 次方 17 | sin() sin函数 18 | sqrt() 开平方 19 | tan() tan函数 20 | =============== ==================================================== 21 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_ad_domain.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | 局域网子网掩码 3 | ========================================= 4 | 5 | 一般家用没有交换机,只有个路由器,此时路由器充当数据交换的作用,关闭路由器DHCP服务,手动设置IP,只要在同一个IP段,数据就可以互相访问 6 | 7 | 企业有交换机的情况下,实际是不需要路由器就可以连局域网的 8 | 9 | 正常192.168.x.0~192.168.x.255这样是一个IP段,默认子网掩码是255.255.255.0,比如192.168.8.0~192.168.8.255 10 | 11 | 上面的IP段除掉头尾只有254个IP可供使用,想要扩展更多的IP在同一个局域网可以通过子网掩码,比如设置成255.255.254.0 12 | 13 | 这样192.168.8.0~192.168.8.255和192.168.9.0~192.168.9.255这样是在同一个IP段,IP翻倍变成512个 14 | 15 | 机器如果是固定IP得自己配置子网掩码,如果是通过路由器DHCP服务自动获取IP,可以将路由器子网掩码设置成255.255.254.0 16 | 17 | freenas可在网络>接口>编辑钟设置IP地址为192.168.0.123/23,23代表这255.255.254.0 18 | 19 | 群晖在控制面板>网络>网络界面>编辑>子网掩码 20 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_ascode.rst: -------------------------------------------------------------------------------- 1 | ======================================= 2 | Houdini通过Python代码自定义节点参数 3 | ======================================= 4 | 5 | .. code-block:: python 6 | 7 | node = hou.node("/out") 8 | 9 | mantra = node.createNode("ifd") 10 | 11 | #print(dir(mantra)) 12 | #print(mantra.asCode()) 13 | # 14 | #hou_parm_template = hou.ToggleParmTemplate("tpreframe", "tpreframe", default_value=True) 15 | #hou_parm_template_group.append(hou_parm_template) 16 | #hou_node.setParmTemplateGroup(hou_parm_template_group) 17 | 18 | exec_parm = mantra.parm("execute") 19 | print(exec_parm.asCode()) 20 | print(exec_parm.parmTemplate().asCode()) 21 | -------------------------------------------------------------------------------- /source/p_Python/python_anaconda.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python Anaconda 3 | ============================= 4 | 5 | - 什么是anaconda? 6 | - 什么是miniconda? 7 | - 什么是conda? 8 | 9 | miniconda2安装jupyter遇到错误可以先执行下面的指令 10 | 11 | .. code-block:: python 12 | 13 | pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ipykernel==4.10.0 14 | 15 | .. code-block:: python 16 | 17 | https://docs.conda.io/projects/conda/en/4.6.0/_downloads/52a95608c49671267e40c689e0bc00ca/conda-cheatsheet.pdf 18 | https://conda.io/projects/conda/en/latest/user-guide/getting-started.html 19 | 20 | .. code-block:: python 21 | 22 | https://www.anaconda.com/ 23 | 24 | 下载默认安装,启用Anaconda Navigator。 25 | -------------------------------------------------------------------------------- /source/p_Shotgun/shotgun_enable_tickets.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Shotgun Tickets 3 | ============================= 4 | 5 | Shotgun Tickets是为了项目辅助任务提供填写timelog的表格,以便更准确地统计项目所花费的人力成本,比如制片的项目管理,TD的流程搭建等等,它不涉及具体镜头和资产的制作时间。 6 | 7 | Shotgun创建的项目默认状态是禁用Tickets的,直接创建Ticket会遇到下面的错误信息。 8 | 9 | **Sorry, you cannot create Tickets in XYJ, because they are not available in the project. To make them available, please configure the project's tracking settings and try this again. To learn more about project tracking settings, visit our help center.** 10 | 11 | 启用具体项目的Tickets页面很简单,打开需要启用的项目的任何页面,比如Shots,找到右上角Project Actions>Tracking Settings,在HIDDEN菜单中找到Ticket,找到右上角Hide Ticket将其显示,然后点击DONE即可。 12 | -------------------------------------------------------------------------------- /source/parts/Linux.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Linux 3 | ============================= 4 | 5 | Linux,全称GNU/Linux,是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。伴随着互联网的发展,Linux得到了来自全世界软件爱好者、组织、公司的支持。它除了在服务器方面保持着强劲的发展势头以外,在个人电脑、嵌入式系统上都有着长足的进步。使用者不仅可以直观地获取该操作系统的实现机制,而且可以根据自身的需要来修改完善Linux,使其最大化地适应用户的需要。 6 | 7 | Linux不仅系统性能稳定,而且是开源软件。其核心防火墙组件性能高效、配置简单,保证了系统的安全。在很多企业网络中,为了追求速度和安全,Linux不仅仅是被网络运维人员当作服务器使用,Linux既可以当作服务器,又可以当作网络防火墙是Linux的一大亮点。 8 | 9 | Linux 具有开放源码、没有版权、技术社区用户多等特点 ,开放源码使得用户可以自由裁剪,灵活性高,功能强大,成本低。尤其系统中内嵌网络协议栈 ,经过适当的配置就可实现路由器的功能。这些特点使得Linux成为开发路由交换设备的理想开发平台。 10 | 11 | Contents: 12 | 13 | .. toctree:: 14 | :maxdepth: 1 15 | :glob: 16 | 17 | ../p_Linux/* 18 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_deploy_system.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | U盘重装Win10操作系统 3 | ========================================= 4 | 5 | 所谓硬件如果没什么问题,所有软件问题都不是问题,重装系统一时爽,一直重装一直爽,系统装的好,备胎当到老。 6 | 7 | 重装系统和硬件以及要安装的系统版本都有很大的关系,通俗讲就是每台电脑的系统重装可能都会在细节上有不同之处,也会遇到完全不同的问题。 8 | 9 | 但是套路大体相同,逐一排查,多问度娘,你遇到的坑总有人已经填过,多来几次就是了,摸清自己电脑脾气,写个安装文档,再次重装的时候就会顺很多。 10 | 11 | 文章只讲一种我常用的U盘安装纯净版操作系统的方法,实际重装系统方案在网络上天花乱坠,随个人喜好,我写的不一定就是最好的,只是个人比较喜欢的。 12 | 13 | - 下载Windows操作系统网站:https://msdn.itellyou.cn/。 14 | - 安装UltraISO,选择继续试用。 15 | - 打开下载好的系统镜像文件.iso。 16 | - 选择菜单启动>写入硬盘映像,正常来说插入U盘会自动识别U盘,先格式化,后写入。 17 | - 正常来说此U盘插到电脑上在BIOS中选择从U盘启动即可重装系统了。 18 | - 如果需要使用UEFI可以选择便捷启动>写入新的驱动器引导扇区>Windows 10/8.1/8/7/Vista即可。 19 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_record_screen.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | 几款录屏软件对比 3 | ========================================= 4 | 5 | 录屏软件有操作系统平台之分,Win操作系统相对多一些。 6 | 7 | Bandicam录屏在Window系统使用整体还可以,很遗憾没有mac版本。 8 | 9 | Snagit录屏偶尔会录完保存的时候会卡崩,丢了文件,很头疼,有Win版本也有mac版本。 10 | 11 | Camstia录制出来的视频需要二次输出mp4,只想录制视频比较蛋疼,有win和mac版本。 12 | 13 | N卡自带GeForce录屏功能,得有N卡才行,有时候快捷键调不出来。 14 | 15 | OBS跨平台免费软件,我用我的mac pro录制掉帧非常严重,不知道原因,很多人推荐,弃了,估计是吃硬件。 16 | 17 | mac自带Quick Time录屏,Shift+Command+5,默认设置录制的视频比较大,比较蛋疼。 18 | 19 | Screenflow一款mac录屏,也是需要二次输出mp4,比较蛋疼。 20 | 21 | 格式工厂也可以录屏,只有win版本,没有mac版本。 22 | 23 | WPS也可以录屏,mac pro一直卡死,还是算了。 24 | 25 | Captura没去试过,只有win版本,有人推荐。 26 | 27 | screenbits没有试过。 28 | 29 | -------------------------------------------------------------------------------- /source/p_Maya/maya_redshift_xgen.rst: -------------------------------------------------------------------------------- 1 | ================================ 2 | Maya Redshift渲染Xgen毛发流程 3 | ================================ 4 | 5 | - 创建个球和地面,选择球Import Preset From Library,选择Sheep预设 6 | 7 | - 创建Redshift Physical Light,修改Light Type>Directional,Intensity Multiplier>1 8 | 9 | - 创建Redshift Dome Light,降低Tint 10 | 11 | - 创建RedshiftHair材质,选择description给上材质 12 | 13 | - 修改Xgen面板Renderer为Redshift 14 | 15 | - 修改Render Settings>GI>Brute Force,采样32-128 16 | 17 | - 创建RedshiftUserDataColor节点连接到rsHair节点 18 | 19 | .. image:: rshair.png 20 | 21 | .. image:: xgen_hair1.png 22 | 23 | - 实现颜色过度,创建RedshiftHairPosition和ramp[Texture]节点连接 24 | 25 | .. image:: rsramp.png 26 | 27 | .. image:: xgen_hair2.png 28 | 29 | 30 | -------------------------------------------------------------------------------- /source/p_Nuke/nuke_preferences.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Nuke偏好配置 3 | ============================== 4 | 5 | - 自定义布局 6 | 7 | 调整好自己喜欢的窗口布局之后,点击菜单Workspace>Save Workspace...,给布局起个名字比如叫blablabla。 8 | 9 | .. code-block:: python 10 | 11 | .nuke/Workspaces/Nuke/blablabla.xml 12 | 13 | 保存完成之后点击菜单Edit>Preferences>Behaviors>Startup>startup workspace>blablabla。 14 | 15 | - 脚本编辑器 16 | 17 | Edit>Preferences>Panels>clear input window on successful script execution选项去勾,在执行完代码,代码就不会丢失。 18 | 19 | - 临时文件 20 | 21 | Edit>Preferences>Performance>Caching>temp directory修改临时文件路径 22 | 23 | - 兼容路径 24 | 25 | Edit>Preferences>General>Path Substitutions,支持OSX、Windows、Linux,这里配置了路径之后,节点上文件路径可以简写自动匹配。 26 | 27 | 28 | -------------------------------------------------------------------------------- /source/p_PyQt/pyqt_line_edit.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | PyQt重写QLineEdit支持拖拽功能 3 | ============================= 4 | 5 | .. code-block:: python 6 | 7 | class QLineEditPath(QtGui.QLineEdit): 8 | 9 | def __init__(self, parent): 10 | super(QLineEditPath, self).__init__(parent) 11 | 12 | def dragEnterEvent(self, event): 13 | 14 | if event.mimeData().hasUrls(): 15 | event.accept() 16 | else: 17 | event.ignore() 18 | 19 | def dropEvent(self, event): 20 | 21 | if event.mimeData().hasUrls(): 22 | url = event.mimeData().urls()[0] 23 | self.setText(url.toLocalFile()) 24 | -------------------------------------------------------------------------------- /source/p_Deadline/deadline_server_install_deploy.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Deadline渲染农场服务器安装部署 3 | ============================== 4 | 5 | 文档采用服务器集中式部署方案,将DeadlineRepository与DeadlineClient全部部署在服务器,从而客户端无需安装任何东西即可使用的方案。 6 | 7 | 部署环境如下: 8 | 9 | - 服务器:Windows Server 2012 R2 Standard 10 | - 客户端:Window 10 企业版 11 | - Deadline版本:Thinkbox Deadline v10.0.20.2 Win 12 | 13 | 远程控制,需要开启deadlinepulse.exe 14 | 15 | Deadline如果使用服务器部署存在三个问题需要解决,一个是安装的路径得是共享路径,在D盘你是没法在另一台电脑上开启客户端软件连接数据库的。客户端电脑有时候打不开Deadline的原因可能是需要安装.net的库,一般安装完Maya就可以解决这个问题。还有会遇到deadline.ini文件找不到的问题,可以直接拷贝Thinkbox\Deadline10\bin\Thinkbox\Deadline10\deadline.ini文件到下面的路径中。 16 | 17 | .. code-block:: python 18 | 19 | C:\ProgramData\Thinkbox\Deadline10 20 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line, and also 5 | # from the environment for the first two. 6 | SPHINXOPTS ?= 7 | SPHINXBUILD ?= sphinx-build 8 | SOURCEDIR = source 9 | BUILDDIR = build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 21 | -------------------------------------------------------------------------------- /source/p_Maya/maya_user_interface.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya用户界面 3 | ============================== 4 | 5 | Maya中自定义用户界面有很多种方案,MEL可以写用户界面,cmds也可以写用户界面,推荐使用内置的PySide2来写用户界面。 6 | 7 | .. code-block:: python 8 | 9 | import maya.cmds as cmds 10 | 11 | win = "myFirstWindow" 12 | 13 | if cmds.window(win, q=1, exists=1): 14 | cmds.deleteUI(win, wnd=1) 15 | 16 | if cmds.windowPref(win, q=1, exists=1): 17 | cmds.windowPref(win, r=1) 18 | 19 | myWindow = cmds.window(win, w=400, h=300, t="My First Window Options:") 20 | 21 | cmds.columnLayout() 22 | 23 | for i in range(5): 24 | cmds.button(l="Button%d" % i, c="print(%d)" % i) 25 | 26 | cmds.showWindow(myWindow) 27 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_interpolation.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:插值函数 3 | ============================== 4 | 5 | .. code-block:: python 6 | 7 | float fit(float value, float omin, float omax, float nmin, float nmax) 8 | 9 | fit(value, omin, omax, nmin, nmax) 10 | 11 | float fit01(float value, float nmin, float nmax) 12 | 13 | fit01(value, nmin, nmax) 14 | 15 | float fit10(float value, float nmin, float nmax) 16 | 17 | fit10(value, nmin, nmax) 18 | 19 | float fit11(float value, float nmin, float nmax) 20 | 21 | fit11(value, nmin, nmax) -------------------------------------------------------------------------------- /source/p_PyQt/pyqt_uic.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | PyQt uic使用 3 | ============================= 4 | 5 | Houdini、Maya与Nuke中内置PySide2 6 | 7 | 了解PyQt的历史以及协议 8 | PySide & PyQt4 & Qt4 9 | PySide2 & PyQt5 & Qt5 10 | 11 | https://github.com/mottosso 12 | 13 | Qt.py如何使用? 14 | 15 | 16 | PySide2安装&部署 17 | PySide2层级结构 18 | - QtCore 核心算法库 19 | - QtGui 界面图形算法库 20 | - QtWidgets 界面控件库 21 | - uic ui文件到py文件的桥梁 22 | - sip C++对象到Python转换库 23 | 24 | 25 | Designer使用 26 | 27 | setModel 28 | QThread 29 | QSQL 30 | 31 | - 配置左下角托盘 32 | - 修改图标 33 | - 如何部署自己的app 34 | 35 | - 编译qrc相对路径 36 | 37 | 创建resource.qrc 38 | "C:\Python27\Scripts\pyside-uic.exe" -o deploy.py deploy.ui 39 | "C:\Python27\Lib\site-packages\PySide\pyside-rcc.exe" -o resource_rc.py resource.qrc 40 | 41 | loadUi 42 | -------------------------------------------------------------------------------- /source/p_Python/python_built_in_module_itertools.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python内置模块:itertools 3 | ============================= 4 | 5 | .. code-block:: python 6 | 7 | >>> import itertools 8 | >>> 9 | >>> list(itertools.dropwhile(lambda i: i < 4, range(10))) 10 | [4, 5, 6, 7, 8, 9] 11 | >>> list(itertools.takewhile(lambda i: i < 4, range(10))) 12 | [0, 1, 2, 3] 13 | >>> list(itertools.ifilter(lambda x: x % 2, range(10))) 14 | [1, 3, 5, 7, 9] 15 | >>> list(itertools.ifilterfalse(lambda x: x % 2, range(10))) 16 | [0, 2, 4, 6, 8] 17 | >>> list(itertools.imap(lambda x, y: x + y, (2, 3, 10), (5, 2, 3))) 18 | [7, 5, 13] 19 | >>> list(itertools.starmap(lambda x, y: x + y, [(1, 2), (10, 20)])) 20 | [3, 30] 21 | 22 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_plugin_arnold.rst: -------------------------------------------------------------------------------- 1 | ================================= 2 | Houdini中心化部署:Arnold插件 3 | ================================= 4 | 5 | 中心化部署也称集中式部署环境,集中式部署对于多台电脑的局域网环境是非常有利的,只要将Arnold渲染器部署到共享位置,通过环境变量来控制插件加载路径即可。 6 | 7 | 这意味着你可以将Arnold渲染器部署到任何位置,比如D盘。 8 | 9 | 在安装Arnold是时候可以自定义选择安装路径,尽量不要去拷贝文件夹到别的位置,如果不想改,默认用C盘安装路径也无不可。 10 | 11 | 在我的文档中找到需要安装Arnold渲染器的Houdini文件夹,比如houdini18.0,打开houdini.env文件,写入如下四句环境变量配置脚本即可。 12 | 13 | .. code-block:: bash 14 | 15 | # htoa env 16 | HTOA = M:/thirdParty/htoa/htoa-5.1.0_r9289183_houdini-18.0.348/htoa-5.1.0_r9289183_houdini-18.0.348 17 | PATH = $PATH;$HTOA/scripts/bin 18 | solidangle_LICENSE = 5053@localhost 19 | 20 | # HOUDINI_PATH 21 | HOUDINI_PATH = $HTOA;& 22 | 23 | 如果houdini.env中配置了别的环境变量,注意将环境变量合并处理。 24 | -------------------------------------------------------------------------------- /source/p_Git/git_install_token.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Git安装配置本机身份验证 3 | ============================== 4 | 5 | 从几何时起Github单方面取消了Git终端使用账号密码访问,从而导致无法提交代码 6 | 7 | 此时需要安装配置个人身份令牌 8 | 9 | https://docs.github.com/en/get-started/quickstart/set-up-git#next-steps-authenticating-with-github-from-git 10 | 11 | 下载gh的msi客户端安装 12 | 13 | https://github.com/cli/cli/releases/tag/v2.4.0 14 | 15 | 安装完成管理员打开命令提示符,确保git.exe在Path环境变量里 16 | 17 | 输入gh auth login,然后依次选择下图中选项 18 | 19 | .. image:: git_token.png 20 | 21 | 在选择Paste an authentication token之后,首先你需要网页端登陆www.github.com 22 | 23 | 找settings>Developer settings>Personal access tokens>Generate new token,勾选所有选项创建即可 24 | 25 | 参考文档 26 | 27 | https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token 28 | -------------------------------------------------------------------------------- /source/p_Nuke/nuke_python_panel.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Nuke Python Panel 3 | ============================== 4 | 5 | .. code-block:: python 6 | 7 | print(type(nuke.Panel)) 8 | print(dir(nuke.Panel)) 9 | # 10 | # ['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'addBooleanCheckBox', 'addButton', 'addClipnameSearch', 'addEnumerationPulldown', 'addExpressionInput', 'addFilenameSearch', 'addMultilineTextInput', 'addNotepad', 'addPasswordInput', 'addRGBColorChip', 'addScriptCommand', 'addSingleLineInput', 'addTextFontPulldown', 'clear', 'execute', 'setTitle', 'setWidth', 'show', 'title', 'value', 'width'] 11 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_custom_shortcut.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Windows自定义快捷方式 3 | ========================================= 4 | 5 | Nuke打开频繁遇到下面这个问题。 6 | 7 | Frame Server failed to bind TCP port 5559 and found existing Frame Server processes. Would you like Nuke to attempt to kill these processes? 8 | 9 | 软件启动一般可以带一些参数起到不同启动的效果,往往我们需要自定义一些软件启动的快捷方式。默认NukeX的启动目标是这样的。 10 | 11 | .. code-block:: python 12 | 13 | "C:\Program Files\Nuke12.1v2\Nuke12.1.exe" --nukex 14 | 15 | 可以通过右键新建>快捷方式,写入启动内容。 16 | 17 | .. code-block:: python 18 | 19 | "C:\Program Files\Nuke11.2v3\Nuke11.2.exe" --nukex --disable-nuke-frameserver 20 | 21 | 比如启动Maya关闭Console窗口,可以这样干。 22 | 23 | .. code-block:: python 24 | 25 | "C:\Program Files\Autodesk\Maya2018\bin\maya.exe" -hideConsole 26 | 27 | 28 | -------------------------------------------------------------------------------- /source/p_Katana/katana_custom_plugin.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Katana自定义插件层级结构 3 | ========================================= 4 | 5 | 参考示例C:\Program Files\Katana3.5v2\plugins\Resources\Examples或者$KATANA_ROOT/plugins/Resources/Examples 6 | 7 | - Args 8 | - AssetPlugins 9 | - Gaffer* 10 | - GenericAssign 11 | - Importmatic* 12 | - Libs 13 | - Macros 14 | - Ops 15 | - Plugins 16 | - Python: 配置PYTHONPATH或通过Startup添加sys.path或直接在插件中添加sys.path。 17 | - RenderBin 18 | - Resolutions 19 | - Shaders 20 | - Shelves: 自定义主菜单工具架工具 21 | - ShelvesNodeSpecific: 自定义节点参数面板工具架工具 22 | - ShelvesScenegraph: 自定义Scene Graph面板工具架工具 23 | - Startup: init.py自启动执行脚本 24 | - SuperTools* 25 | - Tabs* 26 | - UIPlugins 27 | - ViewerManipulators 28 | 29 | - https://learn.foundry.com/katana/Content/ug/installation_licensing/katana_resources.html -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_c_drive_space.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | C盘空间清理几个方案 3 | ========================================= 4 | 5 | - SpaceSniffer 6 | 7 | SpaceSniffer工具非常好用,可以很方便查看具体文件夹以及文件大小分布情况,从而可以知道哪些文件占用了磁盘空间。 8 | 9 | - %tmp% 10 | 11 | Windows系统中通过 ``Win+R`` 键打开运行面板,输入 ``%tmp%`` 确定可以打开C盘产生的临时文件,文件夹 ``C:\Users\{USERNAME}\AppData\Local\Temp`` 中的文件都可以删除,提示占用勾选全部跳过即可。 12 | 13 | - Redshift 14 | 15 | Redshift贴图缓存文件路径默认是在C盘 ``$LOCALAPPDATA\Cache``,如果不更改而使用,会逐渐占用很多C盘空间,建议设置在D盘路径或者定期清理,路径在 ``C:\Users\{USERNAME}\AppData\Local\Redshift\Cache`` 16 | 17 | - hiberfil.sys 18 | 19 | hiberfil.sys是Windows系统休眠文件,往往占用很大的磁盘空间,如果你会重装系统就直接通过下面的命令关闭休眠功能,这样可以删除hiberfil.sys文件。 20 | 21 | .. code-block:: bash 22 | 23 | powercfg -h off 24 | 25 | 重新启用休眠功能可以使用下面的指令。 26 | 27 | .. code-block:: bash 28 | 29 | powercfg -h on 30 | -------------------------------------------------------------------------------- /source/p_Deadline/deadline_install_mongodb.rst: -------------------------------------------------------------------------------- 1 | ================================ 2 | Deadline渲染农场MongoDB离线安装 3 | ================================ 4 | 5 | 在安装DeadlineRepository的时候,会遇到在线安装MongoDB数据库服务器的需求,如果在线下载安装往往非常非常慢,无法忍受。 6 | 7 | 在Deadline官方安装文档中有提到可以先下载MongoDB数据库服务器离线安装包,再来安装,这样速度是极快的。 8 | 9 | Deadline 10.1版本所要求的MongoDB版本在3.2.12~3.6.16之间。 10 | 11 | 上MongoDB官网 https://www.mongodb.com/download-center 下载,找到Server选项,选择配置,我这里拿Windows 10操作系统做的测试,稳定性考虑建议使用服务器操作系统,将Deadline搭建在服务器上,比如Windows Server 2012 R2 Standard,下面的配置是测试配置按实际环境修改。 12 | 13 | - Version: 3.4.24(previous release) 14 | - OS: Windows x64 15 | - Package: ZIP 16 | 17 | 我这里下下来是这样一个安装包mongodb-win32-x86_64-2008plus-ssl-3.4.24.zip,在安装DeadlineRepository选择这个离线安装包安装就可以了。 18 | 19 | 参考文档: 20 | 21 | - https://docs.thinkboxsoftware.com/products/deadline/10.1/1_User%20Manual/manual/install-db-repo.html -------------------------------------------------------------------------------- /source/index.rst: -------------------------------------------------------------------------------- 1 | .. CG TD Pipeline documentation master file, created by 2 | sphinx-quickstart on Thu Mar 12 20:46:05 2020. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | ======================================== 7 | CG TD Pipeline's documentation 8 | ======================================== 9 | 10 | .. toctree:: 11 | :maxdepth: 3 12 | :glob: 13 | 14 | preface 15 | parts/Python 16 | parts/PyQt 17 | parts/Git 18 | parts/Houdini 19 | parts/Maya 20 | parts/Nuke 21 | parts/Ftrack 22 | parts/Shotgun 23 | parts/CGTeamwork 24 | parts/Deadline 25 | parts/Linux 26 | parts/SQL 27 | parts/Devops 28 | parts/Clarisse 29 | parts/Katana 30 | parts/UE4 31 | parts/UE5 32 | parts/Blender 33 | parts/C4D 34 | reference 35 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_route_settings.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | 路由器配置固定IP 3 | ========================================= 4 | 5 | 路由器WAN口局域网的IP是可以设置的,LAN口的局域网IP也是可以设置的,一般路由器的IP要么是192.168.0.1,要么是192.168.1.1。具体如何看这个IP非常简单,将路由器接猫,找个笔记本接路由器LAN口,一般路由器默认会是DHCP自动给笔记本分配IP,这个时候你就可以看到路由器的网关,这个网关就是路由器的局域网IP,可以通过此IP访问路由器的设置页面。比如一款红米路由器,它的网关IP就是192.168.31.1。 6 | 7 | 固定IP我一般是采取关掉路由器的DHCP服务,通过设置每台电脑的IP去固定每台电脑的IP,自然域环境中需要设置域的DNS。 8 | 9 | 10 | 现在有个需求需要实现,就是办公室,会议室以及机房之间距离太远,老板要求会议室和办公室要覆盖一个他专用的无线网,可以访问内网,可以移动办公,专线无线网只能他可以使用。现在手头上有两个路由器,如何搭建一个无线网而无需切换呢? 11 | 12 | 本来想搞无线扩展卡或者无线AP的东西,想想还要购买硬件,而且无线的效果不一定好,准备好两个路由器,分主路由A和副路由B,首先将路由A接到猫,修改网关IP为192.168.0.1,设置无线网络名比如DO-VFX,开启DHCP服务(默认是开启的),然后将路由B也接到猫,设置网关IP为192.168.0.2,注意是和路由A在同一个IP段,设置无线网络名也为DO-VFX,关闭DHCP服务(切记),路由A留在机房,路由B丢到办公室,注意下面的接法,将路由A的一个LAN口和路由B的一个LAN口相连,这点非常重要,然后你在办公室以及会议室就都可以访问DO-VFX无线网络啦。 13 | -------------------------------------------------------------------------------- /source/p_Python/python_built_in_module_importlib.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python内置模块:importlib 3 | ============================= 4 | 5 | importlib是Python 3加入的模块,里面有个重要的方法reload在Python 2中是内置函数。 6 | 7 | .. code-block:: python 8 | 9 | >>> import importlib 10 | >>> importlib.__file__ 11 | 'C:\\Python37\\lib\\importlib\\__init__.py' 12 | >>> dir(importlib) 13 | ['_RELOADING', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__import__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_bootstrap', '_bootstrap_external', '_imp', '_r_long', '_w_long', 'abc', 'find_loader', 'import_module', 'invalidate_caches', 'machinery', 'reload', 'sys', 'types', 'util', 'warnings'] 14 | >>> 15 | >>> import os 16 | >>> importlib.reload(os) 17 | 18 | >>> -------------------------------------------------------------------------------- /source/p_Python/python_variables_reference.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python变量引用 3 | ============================= 4 | 5 | - 变量命名规则 6 | 7 | - 命名要具有描述性。 8 | - 必须以字母或下划线开头,且只能是下划线、字母和数字的组合。 9 | - 不能使用Python的关键字,也称保留字。 10 | - 命名是区分大小写的。 11 | 12 | - 赋值运算符 13 | 14 | 在编程语言中,一个等于号是赋值运算符,两个等于号才是比较运算符。 15 | 16 | .. code-block:: python 17 | 18 | >>> a = 100 19 | >>> a 20 | 100 21 | >>> b = 100 22 | >>> b 23 | 100 24 | >>> a == b 25 | True 26 | >>> a is b 27 | True 28 | >>> a = 257 29 | >>> b = 257 30 | >>> a == b 31 | True 32 | >>> a is b 33 | False 34 | >>> 35 | 36 | - 变量交换 37 | 38 | .. code-block:: python 39 | 40 | >>> a = 10 41 | >>> b = 20 42 | >>> a 43 | 10 44 | >>> b 45 | 20 46 | >>> a, b = b, a 47 | >>> a 48 | 20 49 | >>> b 50 | 10 51 | >>> 52 | 53 | -------------------------------------------------------------------------------- /make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=source 11 | set BUILDDIR=build 12 | 13 | if "%1" == "" goto help 14 | 15 | %SPHINXBUILD% >NUL 2>NUL 16 | if errorlevel 9009 ( 17 | echo. 18 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 19 | echo.installed, then set the SPHINXBUILD environment variable to point 20 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 21 | echo.may add the Sphinx directory to PATH. 22 | echo. 23 | echo.If you don't have Sphinx installed, grab it from 24 | echo.http://sphinx-doc.org/ 25 | exit /b 1 26 | ) 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /source/preface.rst: -------------------------------------------------------------------------------- 1 | ======== 2 | 前言 3 | ======== 4 | 5 | ----------- 6 | 流程 7 | ----------- 8 | 9 | 学习和掌握CG项目管道流程(Pipeline&Workflow)对于TD来说是首要职责,下面有张很有趣的管道流程图,是照明娱乐公司关于小黄人电影制作全流程,包含了一部影片从故事板到大荧幕的所有环节,大家可以找找属于自己的小黄人。 10 | 11 | .. image:: pipeline.jpg 12 | 13 | ----------- 14 | 声明 15 | ----------- 16 | 17 | 本书著作权属胡安迪个人所有,书中内容只是CG工作中经验之谈,不能作为专业知识导向,书中有描述不当之处希望读者能有基本的是非对错判断,如果能指正作者将感恩不尽。 18 | 19 | ----------- 20 | 主页 21 | ----------- 22 | 23 | https://github.com/CGRnDStudio/CGTDCourse 24 | 25 | ----------- 26 | 作者 27 | ----------- 28 | 29 | - 姓名:胡安迪 30 | - 微信:13851709904 31 | - Email:huweiguo@do-vfx.com 32 | - 微信公众号:CGRnDStudio 33 | - GitHub:https://github.com/CGRnDStudio 34 | 35 | .. image:: qcode.jpg 36 | 37 | ----------- 38 | 致谢 39 | ----------- 40 | 41 | 劲爆羊、薛定谔是铲屎官、徐国梁、臧长龙、鹅大、机器猫、A·Better、热冬、Taka 42 | 43 | ----------- 44 | 赞赏 45 | ----------- 46 | 47 | 文字如果对你有所启发,就赞赏一下up主加个鸡腿补补身子吧,后面会有更多更好的内容更新~(3)~ 48 | 49 | .. image:: code.jpg 50 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_struct.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:结构体 3 | ============================== 4 | 5 | .. code-block:: python 6 | 7 | struct box { 8 | vector size = {1, 1, 1}; 9 | vector center = {0, 0, 0}; 10 | float uscale = 1; 11 | 12 | void create() { 13 | vector pos[] = { 14 | {0.5, 0.5, 0.5}, 15 | {0.5, 0.5, 0.5}, 16 | {0.5, 0.5, 0.5}, 17 | {0.5, 0.5, 0.5}, 18 | {0.5, 0.5, 0.5}, 19 | {0.5, 0.5, 0.5}, 20 | {0.5, 0.5, 0.5}, 21 | {0.5, 0.5, 0.5} 22 | }; 23 | foreach(vector pt; pos) { 24 | addpoint(0, pt); 25 | } 26 | } 27 | } 28 | 29 | 30 | .. code-block:: python 31 | 32 | #include 33 | box mybox; 34 | printf("%g\n", mybox.size); 35 | mybox->create(); 36 | -------------------------------------------------------------------------------- /source/p_Python/python_container_tuple.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python容器:元组 () 3 | ============================= 4 | 5 | 容器是对专门用来装其它对象的数据类型的统称。在Python中,有四种最常见的内建容器类型:列表(list)、元组(tuple)、字典(dict)和集合(set)。Python语言内部实现细节也与这些容器息息相关。比如Python的类实例属性、全局变量globals()等都是通过字典类型来存储的。 6 | 7 | - 元组 tuple () 8 | 9 | - 不可变的 10 | 11 | 元组的不可变是相对的。 12 | 13 | - 有序的 14 | 15 | - 索引 & 切片 16 | 17 | - 可迭代的 18 | 19 | - 元组的方法 20 | 21 | .. code-block:: python 22 | 23 | >>> type(()) 24 | 25 | >>> dir(()) 26 | ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index'] 27 | >>> 28 | -------------------------------------------------------------------------------- /source/p_PyQt/pyqt_rcc.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | PyQt rcc使用 3 | ============================= 4 | 5 | 基本概况 6 | 7 | Houdini、Maya与Nuke中内置PySide2 8 | 9 | 了解PyQt的历史以及协议 10 | PySide & PyQt4 & Qt4 11 | PySide2 & PyQt5 & Qt5 12 | 13 | https://github.com/mottosso 14 | 15 | Qt.py如何使用? 16 | 17 | 18 | PySide2安装&部署 19 | PySide2层级结构 20 | - QtCore 核心算法库 21 | - QtGui 界面图形算法库 22 | - QtWidgets 界面控件库 23 | - uic ui文件到py文件的桥梁 24 | - sip C++对象到Python转换库 25 | 26 | 27 | Designer使用 28 | 29 | setModel 30 | QThread 31 | QSQL 32 | 33 | - 配置左下角托盘 34 | - 修改图标 35 | - 如何部署自己的app 36 | 37 | - 编译qrc相对路径 38 | 39 | 创建resource.qrc 40 | "C:\Python27\Scripts\pyside-uic.exe" -o deploy.py deploy.ui 41 | "C:\Python27\Lib\site-packages\PySide\pyside-rcc.exe" -o resource_rc.py resource.qrc 42 | 43 | loadUi 44 | 45 | 46 | 参考文档: 47 | 48 | - https://www.riverbankcomputing.com/static/Docs/PyQt4/classes.html 49 | - https://doc.bccnsoft.com/docs/PyQt5/class_reference.html 50 | -------------------------------------------------------------------------------- /source/p_SQL/sql_group_by.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | SQL查询按字段打组 3 | ========================================= 4 | 5 | GROUP BY是个很有意思的操作。 6 | 7 | .. code-block:: python 8 | 9 | SELECT new.code, path_cache, version_number, task__id, published_file_type__id, new.created_by__id, new.created_at, humanuser.name, publishedfiletype.code AS file_type, content FROM (SELECT code, path_cache, max.version_number, max.task__id, published_file_type__id, created_by__id, created_at, name FROM (SELECT task__id, MAX(version_number) AS version_number FROM publishedfile WHERE project__id=%d AND entity__id=%d AND _active='t' GROUP BY task__id, published_file_type__id) max JOIN publishedfile ON max.task__id=publishedfile.task__id AND max.version_number=publishedfile.version_number AND _active='t') new, publishedfiletype, humanuser, task WHERE new.published_file_type__id=publishedfiletype.id AND new.created_by__id=humanuser.id AND new.task__id=task.id 10 | -------------------------------------------------------------------------------- /source/p_Python/python_built_in_module_pprint.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python内置模块:pprint 3 | ============================= 4 | 5 | .. code-block:: python 6 | 7 | >>> import pprint 8 | >>> type(pprint) 9 | 10 | >>> dir(pprint) 11 | ['PrettyPrinter', '_StringIO', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_builtin_scalars', '_collections', '_perfcheck', '_recursion', '_safe_key', '_safe_repr', '_safe_tuple', '_sys', '_types', '_wrap_bytes_repr', 'isreadable', 'isrecursive', 'pformat', 'pp', 'pprint', 're', 'saferepr'] 12 | >>> pprint.__file__ 13 | 'C:\\Python38\\lib\\pprint.py' 14 | >>> import sys 15 | >>> pprint.pprint(sys.path) 16 | ['', 17 | 'C:\\Python38\\python38.zip', 18 | 'C:\\Python38\\DLLs', 19 | 'C:\\Python38\\lib', 20 | 'C:\\Python38', 21 | 'C:\\Python38\\lib\\site-packages'] 22 | >>> 23 | -------------------------------------------------------------------------------- /source/p_Python/python_built_in_module_re.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python内置模块:re 3 | ============================= 4 | 5 | 正则表达式模块re 6 | 7 | .. code-block:: python 8 | 9 | import re 10 | from pprint import pprint 11 | 12 | files = ["tank_1_color_v0.rat", 13 | "tank_2_color_v5.rat", 14 | "tank_1_color_v3.rat", 15 | "tank_3_color_v1.rat", 16 | "tank_4_color_v2.rat", 17 | "tank_4_color_v4.rat", 18 | "tank_5_color_v1.rat", 19 | "tank_6_color_v6.rat"] 20 | 21 | pat_num = re.compile("\D+_(\d+)_") 22 | pat_ver = re.compile("(\d+)\D+$") 23 | 24 | def sorter_num(elem): 25 | res = re.search(pat_num, elem) 26 | return res.groups()[0] 27 | 28 | def sorter_ver(elem): 29 | res = re.search(pat_ver, elem) 30 | return res.groups()[0] 31 | 32 | # pprint(sorted(files, key=sorter_num)) 33 | pprint(sorted(files, key=sorter_ver)) 34 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_rst_syntax.rst: -------------------------------------------------------------------------------- 1 | ================================= 2 | reStructuredText(rst)语法说明文档 3 | ================================= 4 | 5 | * 注释 6 | 7 | .. code-block:: python 8 | 9 | .. comment 10 | 11 | * 代码块 12 | 13 | .. code-block:: python 14 | 15 | .. code-block:: python 16 | 17 | code 18 | 19 | * 标题 20 | 21 | .. code-block:: python 22 | 23 | ========= 24 | 一级标题 25 | ========= 26 | 27 | --------- 28 | 二级标题 29 | --------- 30 | 31 | * 列表 32 | 33 | .. code-block:: python 34 | 35 | * 符号列表1 36 | * 符号列表2 37 | 38 | * 表格 39 | 40 | .. code-block:: python 41 | 42 | ========== ========= 43 | 第一列 第二列 44 | ========== ========= 45 | 46 | ---------------- 47 | 参考文档 48 | ---------------- 49 | 50 | 《`Quick reStructured Text `_》 51 | 52 | 《`reStructuredText(rst)快速入门语法说明 `_》 53 | 54 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_computer.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | 电脑配置一些坑 3 | ========================================= 4 | 5 | [×] CPU(认准核心数和线程数以及算力赫兹),AMD的算力比Intel要好很多,渲染不然,个人使用建议AMD 3950x往上,如果单纯CPU渲染,可以淘二手志强双路的洋垃圾,也是相当不错的。 6 | 7 | [√] 显卡(认准显存大小,8G往上) 1070,2070往上(如果有GPU渲染,可以上2080Ti往上)。 8 | 9 | [×] 主板(要考虑是否板载显卡,以及集成显卡和独立显卡切换问题,还有是否支持温度监控以及网卡唤醒功能,要考虑内存卡槽以及使用什么级别的内存,比如DDR3还是DDR4要注意一下,再有就是大板还是小板,用哪个实际无所谓,要注意能插大显卡,如果想插多张显卡也要考虑一下) 10 | 11 | [×] 主机箱(考虑散热的情况下尽量小而轻一些,搬家太费劲) 12 | 13 | [×] 内存(16G暂时够用,要注意看下内存品牌以及等级,这个看你主板的内存槽个数,个数少建议单根内存要大些,比如32G一根,四根就是128G,不要搞太多根,很多时候主板内存插槽不是每个都能使用) 14 | 15 | [×] 网卡(正常都是千兆网卡,如果有带宽传输需求,可以考虑万兆网卡) 16 | 17 | [×] 声卡(主板不带板载声卡,需要另外安装,可以让商家赠送) 18 | 19 | [√] 硬盘(搞块1T SSD固态硬盘足够使用) 20 | 21 | [×] 键盘鼠标(让商家赠送吧,实际没必要讲究,有钱玩玩机械硬盘,个人感觉又贵又不好用) 22 | 23 | [×] 显示器(选dell吧,普通选1080分辨率,23.8寸够用,高级一点选2K分辨率,25寸尚可,比如U2518D,显示器的坑比较多,比如检查有没有坏点,便宜显示器色差比较大,这个很影响渲染图效果,所以还是要选贵点的显示器做灯光渲染合成会比较好,连接线用mDP或者HDMI,如果配置双屏注意和显卡的配合,显卡上的插槽和显示器的插槽要对应上,贵的一般都有很多插槽,如果插槽搞的不对,只能自己买转接线才能玩) 24 | 25 | [×] 散热器(风冷,水冷,散热效果,噪音) -------------------------------------------------------------------------------- /source/p_Houdini/houdini_multi_loader.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini批量导入工具 3 | ============================== 4 | 5 | .. code-block:: python 6 | 7 | import os 8 | 9 | obj_dir = hou.ui.selectFile(title="Select Obj Directory", file_type=hou.fileType.Directory) 10 | obj_dir_expanded = hou.expandString(obj_dir) 11 | 12 | obj_files = os.listdir(obj_dir_expanded) 13 | 14 | file_nodes = [] 15 | loader = hou.node("/obj").createNode("geo", "OBJ_Loader") 16 | 17 | for obj in obj_files: 18 | obj_file_node = loader.createNode("file", obj) 19 | obj_file_node.parm("file").set(obj_dir + obj) 20 | obj_file_node.parm("missingframe").set(1) 21 | 22 | file_nodes.append(obj_file_node) 23 | 24 | merge_objs = loader.createNode("merge", "OBJ_Merger") 25 | 26 | for node in file_nodes: 27 | merge_objs.setNextInput(node) 28 | 29 | loader.layoutChildren() 30 | 31 | merge_objs.setDisplayFlag(True) 32 | merge_objs.setRenderFlag(True) 33 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_plugin_redshift.rst: -------------------------------------------------------------------------------- 1 | ================================= 2 | Houdini中心化部署:Redshift插件 3 | ================================= 4 | 5 | 中心化部署也称集中式部署环境,集中式部署对于多台电脑的局域网环境是非常有利的,只要将Redshift渲染器部署到共享位置,通过环境变量来控制插件加载路径即可。 6 | 7 | 这意味着你可以将Redshift渲染器部署到任何位置,比如D盘。 8 | 9 | Redshift渲染器默认安装路径 ``C:\ProgramData\Redshift`` ,安装完可以将Redshift文件夹拷贝到D盘或者共享位置,如果不想改,默认用C盘安装路径也无不可。 10 | 11 | 在我的文档中找到需要安装Redshift渲染器的Houdini文件夹,比如houdini18.0,打开houdini.env文件,写入如下三句环境变量配置脚本即可。 12 | 13 | .. code-block:: bash 14 | 15 | # Redshift env 16 | RS_PATH = C:/ProgramData/Redshift 17 | PATH = $PATH;$RS_PATH/bin 18 | 19 | HOUDINI_PATH = $RS_PATH/Plugins/Houdini/18.0.348;& 20 | 21 | 如果你想用共享位置的Redshift,假如现在有个M盘,我将Redshfit文件夹拷贝到M:\thirdParty\Redshift位置,就可以这样配置houdini.env。 22 | 23 | .. code-block:: bash 24 | 25 | # Redshift env 26 | RS_PATH = M:/thirdParty/Redshift 27 | PATH = $PATH;$RS_PATH/bin 28 | 29 | HOUDINI_PATH = $RS_PATH/Plugins/Houdini/18.0.348;& 30 | 31 | 如果houdini.env中配置了别的环境变量,注意将环境变量合并处理。 32 | -------------------------------------------------------------------------------- /source/p_Nuke/nuke_develop_plugins.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Nuke扩展开发插件的层级结构 3 | ============================== 4 | 5 | 扩展开发的层级结构大概如下: 6 | 7 | .. code-block:: python 8 | 9 | package1 10 | __init__.py 11 | module1.py 12 | package2 13 | __init__.py 14 | module2.py 15 | gizmo 16 | xxx1.gizmo 17 | xxx2.gizmo 18 | icons 19 | xxx1.png 20 | xxx2.svg 21 | xxx1.gizmo 22 | xxx1.png 23 | module1.py 24 | module2.py 25 | init.py 26 | menu.py 27 | 28 | 他们围绕着一个方法来控制路径查询机制,可以修改 ``C:\Users\{用户名}\.nuke\init.py`` 文件。 29 | 30 | .. code-block:: python 31 | 32 | import nuke 33 | 34 | nuke.pluginAddPath("插件路径") 35 | 36 | menu.py文件中一般写自定义菜单的代码,这样在Nuke启动的时候会自动加载菜单,而菜单中的执行的代码一般都是此文件夹下的模块或包的文件以及图标或Gizmo文件。 37 | 38 | init.py文件主要用来处理路径问题,如果不想gizmo和icons中文件通过gizmo/xxx1.gizmo来处理的话,可以在init.py写入如下脚本。 39 | 40 | .. code-block:: python 41 | 42 | import nuke 43 | 44 | nuke.pluginAddPath("gizmo") 45 | nuke.pluginAddPath("icons") 46 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_otls_upgrade.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Houdini otls:升级的两种方案 3 | ============================= 4 | 5 | Houdini中otl的版本切换可以通过主菜单 Asset>Asset Manager>Configuration 设置 Asset Bar 为 Display Menu of All Definitions ,在每个otl参数面板即可看到 Asset Name and Path 的切换信息。 6 | 7 | Houdini中想升级otl,在已经创建好的otl节点上右键选择 Show in Asset Manager... 菜单打开 Asset Manager 。 8 | 9 | Asset Manager 对话框中在当前选择的节点上右键选择 Duplicate... 菜单,可以打开 Copy Asset 对话框。 10 | 11 | 这里升级otl有两种方案,推荐使用第一种。 12 | 13 | 第一种方案是在 Operator Name 上添加版本号, Operator Label 以及 Save to Library 保持不变。 14 | 15 | 比如: 16 | 17 | .. code-block:: python 18 | 19 | do::pack_cache::1.0 20 | do::pack_cache::2.0 21 | 22 | 使用这种方案的好处是otl文件只有一个,两个版本都存储在此文件中,可以通过otl参数面板上的 Asset Name 来切换版本,默认优先使用的都是最新版本。 23 | 24 | 第二种方案是在 Save to Library 的时候将版本号添加到otl文件名上,保持 Operator Name 和 Operator Label 不变。这样做会另外存一个otl文件出来,相当于重新做了一个otl的方案。因为 Operator Name 是相同的,所以节点也只有一个,可以通过otl参数面板上的 Asset Path 来切换版本,默认优先使用的都是最新版本。 25 | 26 | 27 | 参考文档 28 | 29 | https://www.sidefx.com/docs/houdini/assets/index.html 30 | -------------------------------------------------------------------------------- /source/p_Python/python_built_in_module_math.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python内置模块:math 3 | ============================= 4 | 5 | .. code-block:: python 6 | 7 | >>> import math 8 | >>> type(math) 9 | 10 | >>> dir(math) 11 | ['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc'] 12 | >>> 13 | 14 | =================== =========================================================== 15 | math.ceil() # 向上取整 16 | math.floor() # 向下取整 17 | =================== =========================================================== 18 | -------------------------------------------------------------------------------- /source/p_PyQt/pyqt_vs_pyside.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | PyQt VS PySide 3 | ============================= 4 | 5 | PyQt是GPLv3协议,大意是你的程序中用了它,你的程序就要开源,如果闭源商用就会违反协议(后果自负,脸皮够厚无所谓)。除非你搞封装动态加载那一套来强行规避。 6 | 7 | PySide是LGPL协议,如果你只是作为库用用它,你的程序还是可以闭源商用。 8 | 9 | 所以很多人喜欢PySide。如果不做商业项目,强烈建议使用PyQt,资料多,稳定。需要开发闭源商用软件的就用PySide。 10 | 11 | GPL(General Public License)和LGPL( Lesser General Public License)是GNU的两种License。越来越多的自由软件(Free Software)使用GPL作为其授权声明,如果对GPL一点都不了解,有可能在使用自由软件时违反了GPL的授权。如果是个人或不正规的公司倒也无所谓,但如果是有规模的公司,恐怕会有被起诉的风险。 12 | 13 | LGPL是GPL的变种,也是GNU为了得到更多的甚至是商用软件开发商的支持而提出的。与 GPL的最大不同是,可以私有使用LGPL授权的自由软件,开发出来的新软件可以是私有的而不需要是自由软件。所以任何公司在使用自由软件之前应该保证在 LGPL或其它GPL变种的授权下。 14 | 15 | pyside2-uic.exe VS pyuic5.exe 16 | 17 | pyside2-rcc.exe VS pyrcc5.exe 18 | 19 | pyqtSignal VS Signal 20 | 21 | pyqtSlot VS Slot 22 | 23 | - https://blog.csdn.net/The_Time_Runner/article/details/89329556 24 | - https://wiki.qt.io/Differences_Between_PySide_and_PyQt/zh 25 | - https://www.zhihu.com/question/21237276 26 | - https://maicss.gitbooks.io/pyqt5/content/ 27 | - https://github.com/maicss/PyQt5-Chinese-tutorial 28 | -------------------------------------------------------------------------------- /source/p_Maya/maya_custom_shelf.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya自定义工具架 3 | ============================== 4 | 5 | Maya中自定义工具架工具还是挺有意思的,这篇文字介绍自定义工具架工具的方方面面。 6 | 7 | 首先有几种已知的方案可以添加工具架工具,首先我们应该要创建一个新的工具架,Maya预留了一个空的Custom工具架给我们使用。 8 | 9 | 为了可以存储我们自己的工具建议还是自己创建一个工具架,点击工具架一栏左边的齿轮菜单,点击New Shelf,输入shelf name点击OK,这样我们就创建了一个新的工具架。 10 | 11 | 这个工具架的文件会存储在我的文档下面的位置。 12 | 13 | .. code-block:: python 14 | 15 | C:\Users\{USERNAME}\Documents\maya\{VERSION}\prefs\shelves 16 | 17 | Maya工具架有个毛病是不能通过环境变量中心化管理,Maya启动的时候只认我的文档这个位置的shelf文件加载。 18 | 19 | 在工具架上添加工具有下面几种已知的方法: 20 | 21 | - 可以通过鼠标中键将已经存在的工具架工具拖拽到当前的工具架。 22 | - 可以通过鼠标中键将左侧ToolBox中的工具拖拽到当前的工具架。 23 | - 可以将任何一个主菜单中的工具通过CTRL+SHIFT+单击的方式添加到当前的工具架。 24 | - 可以选择脚本编辑器中的代码,通过鼠标中键拖拽到当前工具架。 25 | - 可以通过Shelf Editor面板自定义添加工具到我们的当前工具架。 26 | 27 | 正常来说Shelf Editor是万能的自定义工具架工具的方法,不管上面是以哪种方式添加的工具,实际都可以通过Shelf Editor来添加与修改。 28 | 29 | 关于Shelf Editor面板有几点需要说明: 30 | 31 | - Shelves: 添加或者删除某个工具架某个工具,设置工具图标,工具提示等等。 32 | - Command: 单击工具执行的脚本,可以是MEL,也可以是Python。 33 | - Double Click Command: 双击工具执行的脚本,可以是MEL,也可以是Python。 34 | - Popup Menu Items: 可以给工具添加一些右键菜单,执行不同的脚本。 35 | -------------------------------------------------------------------------------- /source/p_Nuke/nuke_python_import.rst: -------------------------------------------------------------------------------- 1 | ================================ 2 | Nuke Python导入nk文件的几种方式 3 | ================================ 4 | 5 | 基于流程的话经常要通过代码来处理nk文件导入导出的问题,下面总结一些用法,不能以偏概全。 6 | 7 | .. code-block:: python 8 | 9 | import nuke 10 | 11 | path = "D:/blablabla.nk" 12 | 13 | # 清空当前场景 14 | nuke.scriptClear() 15 | # 打开nk文件,如果当前场景为空,会直接打开此nk文件,如果场景不为空,则会另开Nuke软件打开,功能同菜单File>Open Comp... 16 | nuke.scriptOpen(path) 17 | # 在当前场景中导入nk文件中所有节点,不管当前场景是否为空,导入成功导入的所有节点会是选择状态,功能同菜单File>Insert Comp Nodes... 18 | nuke.nodePaste(path) 19 | # 在当前场景中导入nk文件中所有节点,不管当前场景是否为空,导入成功没有节点是被选中状态。 20 | nuke.scriptReadFile(path) 21 | # 同上 22 | nuke.scriptReadText(path) 23 | # 同上 24 | nuke.scriptSource(path) 25 | # 将当前场景文件存储到path设置的路径,功能同菜单File>Save Comp 26 | nuke.scriptSave(path) 27 | # 功能同菜单File>Save Comp As... 28 | nuke.scriptSaveAs() 29 | nuke.scriptSaveAndClear() 30 | # 功能同菜单File>Close Comp 31 | nuke.scriptClose() 32 | # 功能同菜单File>Quit 33 | nuke.scriptExit() 34 | # 新建Nuke,功能同菜单File>New Comp... 35 | nuke.scriptNew() 36 | -------------------------------------------------------------------------------- /source/p_Python/python_name_rules.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python命名规则 3 | ============================= 4 | 5 | 编程的时候遇到变量、函数、模块以及类的时候都要给它们起名字,起名字不能张三李四这样随便乱起,否则会导致代码的阅读性降低,后期维护变得困难。命名一般遵循以下几条规则: 6 | 7 | * 命名要具有描述性。 8 | * 必须以字母或下划线开头,且只能是下划线、字母和数字的组合。 9 | * 不能使用Python的关键字,也称保留字。 10 | * 命名是区分大小写的。 11 | * 模块中以下划线开头的名字是模块私有的。 12 | * 以双下划线开头的类成员名字是类私有的。 13 | * 同时以双下划线开头和结尾的名字,叫做特殊方法,也叫双下方法或魔术方法。 14 | * 推荐使用驼峰命名法或下划线命名法。 15 | * 类命名,首字母大写,尽量使用驼峰命名法。 16 | 17 | 18 | * 驼峰命名法VS下划线命名法 19 | 20 | .. code-block:: python 21 | 22 | myFirstVarable = 100 23 | my_first_varable = 100 24 | 25 | * 关键字 26 | 27 | 关键字也称保留字,不能用于命名。 28 | 29 | ========== ========== ========== ========== ========== 30 | False class finally is return 31 | None continue for lambda try 32 | True def from nolcoal while 33 | and del global not with 34 | as elif if or yield 35 | assert else import pass break 36 | except in raise 37 | ========== ========== ========== ========== ========== -------------------------------------------------------------------------------- /source/p_Houdini/houdini_development_environment.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini搭建VS Code开发环境 3 | ============================== 4 | 5 | * 安装VS Code 6 | * 安装Python插件 7 | * 安装VEX插件 8 | * 配置VS Code 9 | 10 | .. code-block:: python 11 | 12 | { 13 | "python.linting.pylintEnabled": false, 14 | "python.linting.pep8Enabled": true, 15 | "editor.renderWhitespace": "all", 16 | "editor.mouseWheelZoom": true, 17 | "editor.rulers": [79, 120, 150], 18 | "editor.tabSize": 4, 19 | "window.title": "${activeEditorLong}", 20 | "python.pythonPath": "C:/Python27/python.exe" 21 | } 22 | 23 | * 下载Houdini Expression Editor 24 | 25 | .. code-block:: python 26 | 27 | https://cgtoolbox.com/ 28 | 29 | * 配置HOUDINI_PATH,安装Houdini Expression Editor 30 | * 配置扩展编辑器快捷键 31 | 32 | .. code-block:: python 33 | 34 | Ctrl+Shift+Alt+LM 35 | 36 | CG Toolbox扩展编辑器配置 37 | 38 | 将HoudiniExprEditor插件配置到HOUDINI_PATH中 39 | 40 | .. code-block:: python 41 | 42 | from HoudiniExprEditor import ParmWatcher 43 | reload(ParmWatcher) 44 | ParmWatcher.set_external_editor() 45 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_variables.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:变量 3 | ============================== 4 | 5 | 6 | 变量 7 | 8 | 数据类型 9 | 10 | int 11 | float 12 | vector2 13 | vector 14 | vector4 15 | array 16 | struct 17 | matrix2 18 | matrix3 19 | matrix 20 | string 21 | bsdf 22 | 23 | 变量命名 24 | 25 | 26个字母大小写,阿拉伯数字以及下划线,不能以数字开头,不能使用保留字 26 | 27 | .. code-block:: bash 28 | 29 | int i = 100; 30 | float pi = 3.14; 31 | // vector分量都是浮点型数据 32 | vector2 v1 = {1.0, 2.0}; 33 | vector v2 = {1.0, 2.0, 3.0}; 34 | vector4 v3 = {1, 2, 3, 4}; 35 | // matrix中括号可要可不要,最好是便于阅读 36 | matrix2 m1 = {{0, 1}, {1, 0}}; 37 | matrix2 m2 = {0, 1, 2, 3}; 38 | matrix3 m3 = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; 39 | matrix m4 = {{1, 2, 3, 0}, {4, 5, 6, 0}, {7, 8, 9, 0}, {10, 11, 12, 0}}; 40 | string s = "Andy"; 41 | 42 | 数组类型是有序的同类型数据的组合。 43 | 44 | 可以声明空数组 45 | .. code-block:: python 46 | 47 | int a1[]; 48 | int a2[] = {}; 49 | int a3[] = array(); 50 | printf("%g\n", a1); 51 | printf("%g\n", a2); 52 | printf("%g\n", a3); 53 | 54 | {}和array()区别,array()中可以是变量,花括号中只能是数值。 55 | -------------------------------------------------------------------------------- /source/p_Shotgun/shotgun_access_method.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Shotgun API访问方案 3 | ============================= 4 | 5 | - 通过用户名访问 6 | 7 | 管理员用户登陆找到People entity,记住两个字段值Login和Password。 8 | 9 | .. code-block:: python 10 | 11 | sg = shotgun_api3.Shotgun("https://do-vfx.shotgunstudio.com", 12 | login="字段Login值", 13 | password="字段Password值") 14 | sg.find("Shot", filters=[["sg_status_list", "is", "ip"]], fields=["code", "sg_status_list"]) 15 | 16 | - 通过Scripts访问 17 | 18 | 管理员用户登陆找到Scripts entity,通过Add Script添加一条Script,记住两个字段值Script Name和Application Key。 19 | 20 | .. code-block:: python 21 | 22 | sg = shotgun_api3.Shotgun("https://do-vfx.shotgunstudio.com", 23 | login="字段Script Name值", 24 | password="字段Application Key值") 25 | sg.find("Shot", filters=[["sg_status_list", "is", "ip"]], fields=["code", "sg_status_list"]) 26 | 27 | 如果是写工具来访问Shotgun数据,推荐使用Scripts的方法来访问。 28 | 29 | 参考文档: 30 | 31 | - https://developer.shotgunsoftware.com/ 32 | - https://developer.shotgunsoftware.com/python-api/ 33 | -------------------------------------------------------------------------------- /source/p_Deadline/deadline_priority_manager.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Deadline渲染农场权限管理 3 | ============================= 4 | 5 | 咱们来解决一个农场的一个问题,如何有效防止制作上传任务修改自己任务优先级? 6 | 7 | 想从根本上解决这个问题,我们得规范提交流程,各大DCC软件中提交工具是必须写的,因为从Deadline Monitor面板或者DCC软件中集成的菜单提交是没法禁用这个优先级的修改的(我是没找到,只找到个优先级最大值的设置,这个没啥用),任何人提交的时候都可以将任务优先级修改为100(默认最高优先级是100)。 8 | 9 | 不光光提交任务的时候可以事先修改这个优先级,在提交完成之后Deadline默认配置是个人可以修改自己的任务优先级,那如何杜绝这个问题。 10 | 11 | 首先我们得配置一个Super User的密码,Tools>Configure Repository Options>User Security。 12 | 13 | 配置完我们配置用户组,分管理员Administrator和普通用户Custom。需要授予管理员权限的用户添加到Administrator,一般用户权限添加到Custom。 14 | 15 | 这样处理之后管理员用户不用每次都要输入密码切换Super User Mode,普通用户可以随时通过管理员密码切换到Super User。 16 | 17 | 我们这里将禁止修改任务优先级权限,要做三件事,第一件事禁用提交按钮,比如去掉Maya提交。 18 | 19 | 通过菜单Tools>Configure Script Menus>Edit Selection,将Maya提交菜单Disabled掉,自然我们软件里的Deadline提供的提交任务插件也是不能部署的。 20 | 21 | 第二件事禁用修改已经提交的任务的优先级,这个在我们的Tools>Manage User Group...进入Custom>Job Properties将Job Priority选项Disabled。 22 | 23 | 第三件事自己通过Deadline Python API写提交工具,提升百倍提交任务效率,避免手动提交的错误以及文件规范性,数海提交农场任务都是秒传没毛病,从创业两年以来提交总任务数59021个,如果以手动提交一个任务30秒的速度(往往是不止的)话,需要花费一个人491.8小时的工作量,这里不包括手动提交的设置问题,所以非常建议大家自己写自己的提交工具,不超过百行的Python代码。 24 | -------------------------------------------------------------------------------- /source/p_Python/python_container_set.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python容器:集合 {} 3 | ============================= 4 | 5 | 容器是对专门用来装其它对象的数据类型的统称。在Python中,有四种最常见的内建容器类型:列表(list)、元组(tuple)、字典(dict)和集合(set)。Python语言内部实现细节也与这些容器息息相关。比如Python的类实例属性、全局变量globals()等都是通过字典类型来存储的。 6 | 7 | - 集合 set {} 8 | 9 | 集合与字典都是使用花括号{}来定义,区别是字典是通过键值对的方式存储。 10 | 11 | - 元素唯一性 12 | 13 | - 集合方法 14 | 15 | .. code-block:: python 16 | 17 | >>> type(set()) 18 | 19 | >>> dir(set()) 20 | ['__and__', '__class__', '__cmp__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update'] 21 | >>> -------------------------------------------------------------------------------- /source/p_Houdini/houdini_otls_parameters.rst: -------------------------------------------------------------------------------- 1 | ======================================== 2 | Houdini otls:自定义参数 3 | ======================================== 4 | 5 | otls上参数创建有三种方案: 6 | 7 | * By Type 8 | * From Nodes 9 | * 拖拽参数 10 | 11 | Name 12 | Label 13 | Type 14 | Callback Script 15 | Invisible 16 | File Pattern 17 | Horizontally Join to Next Parameter 18 | 19 | Houdini创建otl的时候,想要将节点的参数面板做些布局,学会使用参数Folder的用法是比较有意思的。 20 | 21 | Folder参数有以下几种类型模式: 22 | 23 | - Collapsible # 加减号收缩与伸展 24 | - Simple # 简单的框框 25 | - Tabs # 选项卡式 26 | - Radio Buttons # 和Tabs类似,多了一个Radio按钮显示 27 | - Import Block 28 | - Multiparm Block (list) # 可以加减控件数量以列表的形式 29 | - Multiparm Block (scrolling) # 可以加减控件数量以下拉滑条的形式 30 | - Multiparm Block (tabs) # 可以加减控件数量以选项卡的形式 31 | 32 | Ordered Menu>Menu Script 33 | 34 | .. code-block:: python 35 | 36 | labels = ["Box", "Sphere", "Grid"] 37 | result = [] 38 | 39 | for i, v in enumerate(labels): 40 | result.extend([i, v]) 41 | 42 | return result 43 | 44 | String>Menu 45 | 46 | - Replace (Field + Single Selection Menu) 47 | - Toggle (Field + Multiple Selection Menu) 48 | 49 | Action Button 50 | 51 | 参考文档 52 | 53 | https://www.sidefx.com/docs/houdini/assets/index.html 54 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_redshift_crash_houdini.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Redshift导致Houdini渲崩的可能原因 3 | ========================================= 4 | 5 | 软件版本: 6 | 7 | - Houdini 18.0.416 8 | - Redshift 3.0.20 9 | 10 | 测试的是一张英伟达GTX 1060显卡,实际我有尝试别的显卡,比如GTX 1050 Ti、GTX 1070 Ti、GTX 1080 Ti、GTX TITAN X、RTX 2080 Super都出现了相同的问题,Redshift点击渲染导致Houdini直接崩掉,没有任何商量的余地。尝试了几种解决方案都没用,最后不得不重装系统得以解决。 11 | 12 | 但是自己电脑实在不想重装系统,太多东西要重新配置,所以还是纠结其原因,Houdini Crash完可以从Redshift安装包中找到日志。 13 | 14 | .. code-block:: python 15 | 16 | C:\ProgramData\Redshift\Log 17 | 18 | 在latest log中你可以找到这样的错误信息。 19 | 20 | .. code-block:: python 21 | 22 | ====================================================================================================== 23 | ASSERT FAILED 24 | 25 | File OptiXDenoiser7.cpp 26 | Line 137 27 | 28 | Failed to init Optix 7.0 29 | ====================================================================================================== 30 | 31 | 从错误信息上可以怀疑是显卡驱动可能存在问题,实际我的显卡驱动已经是相对比较新的版本了,尝试到英伟达官网下载驱动。 32 | 33 | https://www.nvidia.cn/Download/index.aspx?lang=cn 34 | 35 | 注意下载类型,我之前一直使用Studio驱动程序(SD),重新下载最新版本Game Ready驱动程序(GRD)安装完渲染没有什么问题,如果你们也遇到类似问题,可以尝试更新自己的显卡驱动。 36 | -------------------------------------------------------------------------------- /source/p_Maya/maya_playblast_tool.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya拍屏工具 3 | ============================== 4 | 5 | .. code-block:: python 6 | 7 | import uuid 8 | import datetime 9 | import maya.cmds as cmds 10 | 11 | def playblast(path, cam, start, end, view=False): 12 | """ 13 | """ 14 | imagePath = os.path.expanduser("~/playblast") 15 | 16 | if not os.path.isdir(imagePath): 17 | os.makedirs(imagePath) 18 | 19 | imagePrefix = os.path.join(imagePath, "20200903_ABCDEF") 20 | print(imagePrefix) 21 | cmds.playblast(filename=imagePrefix, 22 | format="image", 23 | compression="tga", 24 | width=1280, 25 | height=720, 26 | startTime=start, 27 | endTime=end, 28 | clearCache=1, 29 | viewer=1, 30 | showOrnaments=1, 31 | fp=4, 32 | percent=100, 33 | quality=100) 34 | 35 | if __name__ == "__main__": 36 | playblast("", "persp", 1, 10) 37 | -------------------------------------------------------------------------------- /source/p_Maya/maya_front_render.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya前台渲染脚本解决方案 3 | ============================== 4 | 5 | 一般来说前台渲染调用RenderIntoNewWindow或者renderWindowRenderCamera命令即可,批量渲染写个for循环问题不大,下面是Python与MEL两种写法。 6 | 7 | .. code-block:: python 8 | 9 | # Python 10 | import maya.cmds as cmds 11 | import maya.mel as mel 12 | 13 | for i in range(1, 241): 14 | cmds.currentTime(i) 15 | mel.eval("renderWindowRenderCamera redoPreviousRender renderView persp;") 16 | 17 | .. code-block:: bash 18 | 19 | // MEL 20 | for (int $i = 1; $i <= 240; $i++) { 21 | evalDeferred("currentTime $i;"); 22 | evalDeferred("RenderIntoNewWindow;"); 23 | } 24 | 25 | 但是遇到Redshift渲染器的时候,上面的for循环会报渲染占用的错误,解决方案可以在Render Settings中写Post render frame MEL,将下面的任何一句MEL脚本写到此设置中,在点击Render View窗口渲染的时候会自动渲染下一帧,渲染的序列在工程路径/images/tmp中,简单实现前台批量渲染的功能,结束渲染需要按ESC中断。 26 | 27 | .. code-block:: bash 28 | 29 | // MEL 30 | int $frame = `currentTime -q`; evalDeferred("currentTime ($frame + 1);"); evalDeferred("RenderIntoNewWindow;"); 31 | int $frame = `currentTime -q`; evalDeferred("currentTime ($frame + 1);"); evalDeferred("renderWindowRenderCamera redoPreviousRender renderView persp;"); -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_custom_functions.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:自定义函数 3 | ============================== 4 | 5 | 函数是编程语言中最简单的一种封装,函数最重要的是参数和返回值,参数又有形式参数(简称形参)与实际参数(简称实参)之分。 6 | 7 | .. code-block:: python 8 | 9 | int test(int a, b; string c) { 10 | if (a > b) { 11 | printf(c); 12 | } 13 | } 14 | 15 | .. code-block:: python 16 | 17 | function int[] nb(int ptnum) { 18 | pass 19 | } 20 | 21 | .. code-block:: python 22 | 23 | int[] nb(int ptnum) { 24 | pass 25 | } 26 | 27 | .. code-block:: python 28 | 29 | void createGeo(vector pos){ 30 | int p0 = addpoint(geoself(), pos + {1, 0, 1}); 31 | int p1 = addpoint(geoself(), pos + {1, 0, -1}); 32 | int p2 = addpoint(geoself(), pos + {-1, 0, 1}); 33 | int p3 = addpoint(geoself(), pos + {-1, 0, -1}); 34 | int p4 = addpoint(geoself(), pos + {0, 1.5, 0}); 35 | 36 | addprim(geoself(), "poly", p0, p1, p3, p2); 37 | addprim(geoself(), "poly", p2, p4, p0); 38 | addprim(geoself(), "poly", p0, p4, p1); 39 | addprim(geoself(), "poly", p1, p4, p3); 40 | addprim(geoself(), "poly", p3, p4, p2); 41 | } 42 | 43 | createGeo(chv("pos")); -------------------------------------------------------------------------------- /source/p_Houdini/houdini_otls_create_update.rst: -------------------------------------------------------------------------------- 1 | ================================ 2 | Houdini otls:创建以及更新的流程 3 | ================================ 4 | 5 | otl是一种老的数字资产的扩展名,现在扩展名是hda(Houdini Digital Assets),因为习惯就沿用了otl的名称。 6 | 7 | Subnet自定义HDA方法 8 | HOUDINI_PATH & HOUDINI_OTLSCAN_PATH 9 | Operator Name & Operator Label 10 | 自定义参数齿轮菜单 11 | 12 | 内嵌资产是指将otl保存到Embedded,这样otl只会和场景文件一起存储,不会生成otl文件,一般是用于在正式创建资产之前测试数字资产,便于迭代和共享资产。 13 | 14 | 正常流程 15 | Match Current Definition 16 | 17 | Allow Editing of Contents 18 | 19 | 案例 20 | 21 | 创建一个pack cache的otl 22 | 23 | 要求能打包当前文件中所有filecache节点缓存,并生成新的hip文件 24 | 25 | 知识点 26 | 27 | * 获取所有filecache节点 28 | * 获取所有filecache节点上缓存路径 29 | * 拷贝文件操作 30 | * 修改所有filecache节点上缓存路径 31 | * 保存成新的hip文件 32 | 33 | .. code-block:: python 34 | 35 | # 获取某节点下的所有filecache节点 36 | import toolutils 37 | 38 | rootNode = hou.node("/") 39 | 40 | nodes = toolutils.findAllChildNodesOfType(rootNode, "filecache", dorecurse=True) 41 | 42 | # 获取所有filecache节点上缓存路径 43 | node.parm("file").eval() 44 | node.parm("file").unexpandedString() 45 | 46 | Subnet自定义HDA方法 47 | HOUDINI_PATH & HOUDINI_OTLSCAN_PATH 48 | Operator Name & Operator Label 49 | 自定义参数齿轮菜单 50 | 51 | 参考文档: 52 | 53 | https://www.sidefx.com/docs/houdini/assets/index.html 54 | -------------------------------------------------------------------------------- /source/p_Python/python_built_in_module_json.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python内置模块:json 3 | ============================= 4 | 5 | json (JavaScript Object Notation) 是一种轻量级的数据交换格式。 6 | 7 | .. code-block:: python 8 | 9 | >>> import json 10 | >>> json.__file__ 11 | 'C:\\Python27\\lib\\json\\__init__.pyc' 12 | >>> type(json) 13 | 14 | >>> dir(json) 15 | ['JSONDecoder', 'JSONEncoder', '__all__', '__author__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '__version__', '_default_decoder', '_default_encoder', 'decoder', 'dump', 'dumps', 'encoder', 'load', 'loads', 'scanner'] 16 | >>> 17 | 18 | - json.dump 字典转文件 19 | - json.dumps 字典转字符串 20 | - json.load 文件转字典 21 | - json.loads 字符串转字典 22 | 23 | .. code-block:: python 24 | 25 | import json 26 | 27 | data = { 28 | "name": "Andy", 29 | "age": 29, 30 | "weight": 55.5 31 | } 32 | 33 | jsonStr = json.dumps(data) 34 | 35 | jsonData = json.loads(jsonStr) 36 | 37 | # Writing JSON data 38 | with open("data.json", "w") as f: 39 | json.dump(data, f) 40 | 41 | # indent用法 42 | with open("data.json", "w") as f: 43 | json.dump(data, f, indent=4) 44 | 45 | with open("data.json", "r") as f: 46 | data = json.load(f) 47 | -------------------------------------------------------------------------------- /source/p_Python/python_container_dict.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python容器:字典 {key: value} 3 | ============================= 4 | 5 | 容器是对专门用来装其它对象的数据类型的统称。在Python中,有四种最常见的内建容器类型:列表(list)、元组(tuple)、字典(dict)和集合(set)。Python语言内部实现细节也与这些容器息息相关。比如Python的类实例属性、全局变量globals()等都是通过字典类型来存储的。 6 | 7 | - 字典 dict {key: value} 8 | 9 | - 无序的(散列表) 10 | 11 | - 可迭代的 12 | 13 | 字典的迭代本质上并不是字典本身迭代,而是列表的迭代。 14 | 15 | .. code-block:: python 16 | 17 | for k, v in dict.items(): 18 | for k in dict.keys(): 19 | for v in dict.values(): 20 | for k, v in dict.iteritems(): 21 | for k in dict.keys(): 22 | for v in dict.values(): 23 | 24 | - 字典的方法 25 | 26 | .. code-block:: python 27 | 28 | >>> type({}) 29 | 30 | >>> dir({}) 31 | ['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues'] 32 | >>> 33 | -------------------------------------------------------------------------------- /source/p_Nuke/nuke_python_arguments.rst: -------------------------------------------------------------------------------- 1 | ================================ 2 | Nuke Python命令行传参的两种方案 3 | ================================ 4 | 5 | 后台调用Nuke的Python执行环境有三种方案,打开命令行窗口,下面的三句脚本都是可以打开Nuke的Python执行环境。 6 | 7 | .. code-block:: python 8 | 9 | "C:\Program Files\Nuke10.5v1\python.exe" blablabla.py arg1 arg2 arg3 10 | "C:\Program Files\Nuke10.5v1\Nuke10.5.exe" -t blablabla.py arg1 arg2 arg3 11 | "C:\Program Files\Nuke10.5v1\Nuke10.5.exe" -x blablabla.py arg1 arg2 arg3 12 | 13 | 命令行窗口给py文件传参有两种方案,一种最普通的方式是通过sys.argv来获取参数,但是在三种执行环境中都有一些问题,第一种执行环境下blablabla.py文件中import nuke和sys.argv得有先后顺序。 14 | 15 | .. code-block:: python 16 | 17 | import sys 18 | print(sys.argv) 19 | 20 | import nuke 21 | print(nuke.__file__) 22 | 23 | 上面的代码是可以正常传递命令行参数的,但下面这种情况就不行,你会得到空列表。 24 | 25 | .. code-block:: python 26 | 27 | import sys 28 | import nuke 29 | 30 | print(sys.argv) 31 | print(nuke.__file__) 32 | 33 | 第二种和第三种执行环境下不存在这样的问题,但是对于数字的参数,它会遇到警告,这种参数通过sys.argv存储不了。比如: 34 | 35 | .. code-block:: python 36 | 37 | "C:\Program Files\Nuke10.5v1\Nuke10.5.exe" -t blablabla.py 101 200 38 | 39 | **WARNING: The command line argument ' 101 200' will be used as a Frame Range argument and will not be forward to the python sys.argv. 40 | To define a frame range argument use the -F option.** 41 | 42 | 43 | 此时可以通过nuke.rawArgs来获取就是OK的。 44 | -------------------------------------------------------------------------------- /source/p_Python/python_built_in_module_random.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python内置模块:random 3 | ============================= 4 | 5 | .. code-block:: python 6 | 7 | >>> import random 8 | >>> type(random) 9 | 10 | >>> random.__file__ 11 | 'C:\\Python38\\lib\\random.py' 12 | >>> dir(random) 13 | ['BPF', 'LOG4', 'NV_MAGICCONST', 'RECIP_BPF', 'Random', 'SG_MAGICCONST', 'SystemRandom', 'TWOPI', '_Sequence', '_Set', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_accumulate', '_acos', '_bisect', '_ceil', '_cos', '_e', '_exp', '_inst', '_log', '_os', '_pi', '_random', '_repeat', '_sha512', '_sin', '_sqrt', '_test', '_test_generator', '_urandom', '_warn', 'betavariate', 'choice', 'choices', 'expovariate', 'gammavariate', 'gauss', 'getrandbits', 'getstate', 'lognormvariate', 'normalvariate', 'paretovariate', 'randint', 'random', 'randrange', 'sample', 'seed', 'setstate', 'shuffle', 'triangular', 'uniform', 'vonmisesvariate', 'weibullvariate'] 14 | >>> 15 | 16 | =================== =========================================================== 17 | random.choice() # 从序列中随机挑选一个元素 18 | random.randint() # 给定范围随机整数 19 | random.random() # 随机0~1之间小数 20 | =================== =========================================================== 21 | -------------------------------------------------------------------------------- /source/p_Git/git_speed_up.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Git国外服务器加速方案 3 | ============================== 4 | 5 | 不管是Github还是Gitlab都是国外服务器托管代码的平台,这就导致了代码推送或者拉取的时候速度受到限制。 6 | 7 | 那么如何曲线救国呢? 8 | 9 | 咱以一个开源仓库qLib下载作为测试案例。 10 | 11 | .. code-block:: python 12 | 13 | git clone https://github.com/qLab/qLib 14 | 15 | 500M移动网络拉取代码速度只有30~50kb左右,代码仓库小还没什么影响,一旦文件过多基本以失败告终。 16 | 17 | 上国内代码托管平台码云注册账号,创建仓库的时候选择从Gitlab/Github导入仓库。 18 | 19 | 选择从URL导入,填写代码仓库网址。 20 | 21 | .. code-block:: python 22 | 23 | https://github.com/qLab/qLib.git 24 | 25 | 26 | 再次尝试拉取仓库,此次使用码云仓库链接,速度变成10M/s,100M的仓库10s就下载完成啦,牛逼! 27 | 28 | .. code-block:: python 29 | 30 | git clone https://gitee.com/CGRnDStudio/qLib.git 31 | 32 | 此时的码云仓库和国外平台仓库一毛钱关系没有,如果国外平台仓库更新了,需要手动同步才能将更新的部分同步到码云。 33 | 34 | 那么如何将自建的代码仓库用码云管理的同时,推送代码的时候能自动同步到Github或者Gitlab呢? 35 | 36 | 如果你选择码云管理代码仓库,而不需要国外平台,就不没有同步一说。我个人喜欢用Gitlab,所以想通过Gitee来中转。 37 | 38 | 这里给一个解决方案,git remote多配置一个远程仓库,在push的时候可以同时推送代码到码云和Gitlab上,而拉取代码依然是码云仓库。 39 | 40 | .. code-block:: bash 41 | 42 | git remote set-url --add --push origin https://gitee.com/CGRnDStudio/blablabla.git 43 | git remote set-url --add --push origin https://github.com/CGRnDStudio/blablabla.git 44 | 45 | 完事之后可以看到.git/config文件中已添加了Github地址。 46 | 47 | 但我相信应该有更好的解决方案,比如配置webhook技术,还没有去测试。 48 | 49 | 当然想解决自己公司的仓库推送和拉取速度缓慢的问题,可以自己搭建Gitlab本地服务器,云时代我还是比较喜欢用云端产品。 50 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_photo_viewer.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Win10调出照片查看器 3 | ========================================= 4 | 5 | 写一个注册表文件.reg,将下面的文本拷贝到其中保存之后运行合并即可。 6 | 7 | .. code-block:: python 8 | 9 | Windows Registry Editor Version 5.00 10 | 11 | ; Change Extension's File Type 12 | 13 | [HKEY_CURRENT_USER\Software\Classes\.jpg] 14 | 15 | @="PhotoViewer.FileAssoc.Tiff" 16 | 17 | ; Change Extension's File Type 18 | 19 | [HKEY_CURRENT_USER\Software\Classes\.jpeg] 20 | 21 | @="PhotoViewer.FileAssoc.Tiff" 22 | 23 | ; Change Extension's File Type 24 | 25 | [HKEY_CURRENT_USER\Software\Classes\.gif] 26 | 27 | @="PhotoViewer.FileAssoc.Tiff" 28 | 29 | ; Change Extension's File Type 30 | 31 | [HKEY_CURRENT_USER\Software\Classes\.png] 32 | 33 | @="PhotoViewer.FileAssoc.Tiff" 34 | 35 | ; Change Extension's File Type 36 | 37 | [HKEY_CURRENT_USER\Software\Classes\.bmp] 38 | 39 | @="PhotoViewer.FileAssoc.Tiff" 40 | 41 | ; Change Extension's File Type 42 | 43 | [HKEY_CURRENT_USER\Software\Classes\.tiff] 44 | 45 | @="PhotoViewer.FileAssoc.Tiff" 46 | 47 | ; Change Extension's File Type 48 | 49 | [HKEY_CURRENT_USER\Software\Classes\.ico] 50 | 51 | @="PhotoViewer.FileAssoc.Tiff" -------------------------------------------------------------------------------- /source/p_Deadline/deadline_houdini_plugin.rst: -------------------------------------------------------------------------------- 1 | =============================== 2 | Deadline渲染农场Houdini提交工具 3 | =============================== 4 | 5 | - 案例:编写Houdini、Nuke提交工具 6 | 7 | - Deadline Python API 8 | - 其它CG软件的提交代码 9 | - 其它农场提交代码 10 | 11 | .. code-block:: python 12 | 13 | import sys 14 | sys.path.insert(0, r"Y:\Program\DeadlineRepository10\api\python") 15 | from Deadline.DeadlineConnect import DeadlineCon as Connect 16 | con = Connect("farm.do-vfx.com", 8082) 17 | 18 | job = con.Jobs.GetJob("5bfce04f4096fe78c0f6d640") 19 | 20 | print(job) 21 | import Deadline.DeadlineConnect as Connect 22 | 23 | Deadline = Connect.DeadlineCon('farm.do-vfx.com', 8082) 24 | print(Deadline) 25 | JobInfo = { 26 | "Name": "Submitted via Python", 27 | "UserName": "huweiguo", 28 | "Frames": "1-24", 29 | "Plugin": "Houdini" 30 | } 31 | 32 | PluginInfo = { 33 | "OutputDriver": "/obj/ropnet1/mantra1", 34 | "SceneFile": "Y:/shotTest/untitled.hip", 35 | "Version": "17.0" 36 | } 37 | 38 | try: 39 | newJob = Deadline.Jobs.SubmitJob(JobInfo, PluginInfo) 40 | print newJob 41 | except: 42 | print "Sorry, Web Service is currently down!" 43 | 44 | Houdini提交工具 45 | 46 | - Python API提交任务 47 | - PySide2构建UI界面 48 | 49 | Nuke提交工具 50 | 51 | - Python API提交任务 52 | - PySide2构建UI界面 53 | -------------------------------------------------------------------------------- /source/p_Nuke/nuke_custom_node_knob.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Nuke自定义节点参数 3 | ============================== 4 | 5 | Nuke官方给了一些节点参数控件,可以通过简单添加来自定义节点参数。 6 | 7 | - Floating Point Slider 8 | - 2d Position Knob 9 | - 3d Position Knob 10 | - Width/Height Knob 11 | - Bounding Box Knob 12 | - Size Knob 13 | - UV Coordinate Knob 14 | - Integer Knob 15 | - RGB Color Knob 16 | - RGBA Color Knob 17 | - Check Box 18 | - TCL Script Button 19 | - Python Script Button 20 | - Python Custom 21 | - Pulldown Choice 22 | - Cascading Pulldown Choice 23 | - Command Menu 24 | - Text input Knob 25 | - Filename 26 | - Tab 27 | - Group 28 | - Text 29 | - Divider Line 30 | - Obsolete Knob 31 | 32 | 这些参数控件都非常简单,使用起来也很简单,只要创建过一次应该都可以上手掌握,但有几个细节值得注意: 33 | 34 | - 我们往往会先创建一个Tab,将自定义创建的参数归类放在一起,默认直接创建knob会在User选项中,也可以后期修改User的命名。 35 | - Hide可以隐藏参数控件。 36 | - Python Custom会在显示节点参数的时候初始化代码,用于事件触发。 37 | - Start new line可以让控件在不换行,比如并行两个Button。 38 | - 参数关联。 39 | 40 | 创建一个NoOp, 右键参数菜单Manage User Knobs...>Add>Python Script Button... 41 | 42 | Python Script Button中添加可执行代码。 43 | 44 | 通过Python脚本添加节点参数 45 | 46 | .. code-block:: python 47 | 48 | import nuke 49 | 50 | tkTest = nuke.Text_Knob("test", "Text", "This is Text Knob Test") 51 | node = nuke.createNode("Write") 52 | node.addKnob(tkTest) 53 | 54 | .. code-block:: python 55 | 56 | nuke.PyScript_Knob() 57 | nuke.Tab_Knob() 58 | 59 | 参考文档: 60 | 61 | - https://www.foundry.com/products/nuke/developers 62 | -------------------------------------------------------------------------------- /source/p_PyQt/pyqt_rich_text.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | PyQt富文本 3 | ============================= 4 | 5 | 创建QLabel控件,如何让文本丰富起来,比如将其中一部分字体设置为红色该如何操作? 6 | 7 | 打开Nuke Script Editor或者Maya Script Editor验证下面的代码。 8 | 9 | .. code-block:: python 10 | 11 | from PySide2 import QtGui 12 | from PySide2 import QtCore 13 | from PySide2 import QtWidgets 14 | 15 | 16 | widget = QtWidgets.QLabel("Hello World") 17 | widget.show() 18 | 19 | .. code-block:: python 20 | 21 | from PySide2 import QtGui 22 | from PySide2 import QtCore 23 | from PySide2 import QtWidgets 24 | 25 | 26 | widget = QtWidgets.QLabel("Hello
World") 27 | widget.show() 28 | 29 | ==================== ================================================ 30 | 红色 text 31 | 绿色 text 32 | 蓝色 text 33 | 颜色 text 34 | 加粗 text 35 | 字体大小 text 36 | 换行
37 | 下划线 text 38 | 斜体 text 39 | 加粗 text 40 | 删除线 text 41 | ==================== ================================================ 42 | -------------------------------------------------------------------------------- /source/p_Devops/FreeNAS/devops_freenas_install.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | FreeNAS:硬件配置以及系统安装 3 | ========================================= 4 | 5 | FreeNAS是一套基于FreeBSD操作系统核心的开放源代码的网络存储设备(NAS)服务器系统,支持众多服务,用户访问权限管理,提供网页设置接口。 6 | 7 | 硬件配置: 8 | 9 | - R730XD E5 2678v3*2 32G*4 8T*12 H330阵列卡 x710四口万兆网卡 10 | 11 | 因为没有配置SSD固态盘作为系统盘,FreeNAS使用软RAID,所以不通过BIOS来配置硬盘的RAID,我们先做系统,为了将操作系统和存储数据分开,准备两个U盘,如果你有专门固态盘作为系统盘的话只需要一个U盘,将系统做到SSD中即可,这里我选择将系统做到另一个U盘中。这里我将FreeNAS做到32G的U盘中。 12 | 13 | 随便找台win电脑,将FreeNAS镜像烧录到其中一个U盘。需要下载两个东西。 14 | 15 | - win32diskimager-1.0.0-install.exe 16 | - FreeNAS-11.3-RELEASE.iso 17 | 18 | 一旦烧录了FreeNAS操作系统,U盘将不在盘符区显示,如果需要重新烧录,你会发现U盘无法格式化,推荐你们使用DiskGenius工具格式化分区,非常好用。 19 | 20 | 开机按F2配置BIOS启动(去掉UEFI如果设置过),重启按F11选择U盘启动。 21 | 22 | 23 | - [ ] 测试U盘恢复FreeNAS系统 24 | - [ ] FreeNAS域环境配置 25 | - [ ] 测试FreeNAS读写速度 26 | - [ ] FreeNAS软RAID 27 | - [√] FreeNAS共享文件 28 | - [ ] FreeNAS文件系统怎么用 29 | - [ ] FreeNAS配置备份,如何一键恢复 30 | - [√] FreeNAS如何固定IP 31 | - [√] FreeNAS权限管理 32 | - [ ] FreeNAS软链接是否可用 33 | 34 | FreeNAS设置静态IP,在Web端选择Network>Interfaces,找到对应的网卡,比如bge1,DHCP自动分配去勾选,设置IP Address。 35 | 36 | FreeNAS创建用户以及用户权限。 37 | 38 | 39 | --------------------------- 40 | 参考文档 41 | --------------------------- 42 | 43 | 44 | - https://www.getnas.com/freenas-installation/ 45 | - https://blog.csdn.net/sanwe3333/article/details/104831493 46 | - http://www.freenas.com.cn/ 47 | - https://www.getnas.com/freenas-static-ip/ 48 | - https://www.cnblogs.com/hjc4025/p/7079364.html 49 | -------------------------------------------------------------------------------- /source/p_Katana/katana_callback_events.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Katana回调事件处理机制 3 | ========================================= 4 | 5 | 回调和事件在很多软件都是存在一种处理机制,回调是添加到Katana环境中的一段Python代码,当Katana中发生各种事件(例如创建节点或加载脚本)时,它会自动运行。事件是由于用户操作或其他来源(例如单击鼠标或按下键)而发生的操作。事件处理程序是用于处理事件的例程,允许程序员编写将在事件发生时执行的代码。 6 | 7 | .. code-block:: python 8 | 9 | print(dir(Callbacks)) 10 | print(dir(Callbacks.Type)) 11 | # ['Type', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'addCallback', 'delCallback'] 12 | # ['__doc__', '__module__', 'exportAsset', 'finalize3DNodeChanges', 'onGafferLightCreated', 'onGafferMasterMaterialCreated', 'onGafferRigCreated', 'onGafferShaderSelected', 'onLiveRenderCommand', 'onLiveRenderUpdate', 'onLookFileMaterialActiveSet', 'onLookFileMaterialSet', 'onMasterMaterialAssigned', 'onNewScene', 'onNodeCreate', 'onNodeDelete', 'onRenderSetup', 'onSceneAboutToLoad', 'onSceneLoad', 'onSceneSave', 'onShutdown', 'onStartup', 'onStartupComplete', 'onTabCreated', 'postLiveGroupPublish', 'postLookFileBake', 'preLiveGroupPublish', 'preLookFileBake'] 13 | 14 | .. code-block:: python 15 | 16 | def sayHello(**kwargs): 17 | for i in kwargs.keys(): 18 | print(i) 19 | 20 | Callbacks.addCallback(Callbacks.Type.onSceneLoad, sayHello) 21 | -------------------------------------------------------------------------------- /source/p_Python/python_built_in_module_subprocess.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python内置模块:subprocess 3 | ============================= 4 | 5 | .. code-block:: python 6 | 7 | >>> import subprocess 8 | >>> type(subprocess) 9 | 10 | >>> dir(subprocess) 11 | ['CREATE_NEW_CONSOLE', 'CREATE_NEW_PROCESS_GROUP', 'CalledProcessError', 'MAXFD', 'PIPE', 'Popen', 'STARTF_USESHOWWINDOW', 'STARTF_USESTDHANDLES', 'STARTUPINFO', 'STDOUT', 'STD_ERROR_HANDLE', 'STD_INPUT_HANDLE', 'STD_OUTPUT_HANDLE', 'SW_HIDE', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_active', '_args_from_interpreter_flags', '_cleanup', '_demo_posix', '_demo_windows', '_eintr_retry_call', '_subprocess', 'call', 'check_call', 'check_output', 'errno', 'gc', 'list2cmdline', 'msvcrt', 'mswindows', 'os', 'pywintypes', 'signal', 'sys', 'threading', 'traceback', 'types'] 12 | >>> 13 | 14 | .. code-block:: python 15 | 16 | import subprocess 17 | 18 | exePath = "C:/Python27/python.exe" 19 | 20 | pyFile = "D:/andy/tests_subprocess.py" 21 | 22 | commands = '"{0}" "{1}"'.format(exePath, pyFile) 23 | 24 | subprocess.check_call(commands) 25 | 26 | .. code-block:: python 27 | 28 | import subprocess 29 | 30 | exePath = "C:/Program Files/Nuke10.5v1/Nuke10.5.exe" 31 | 32 | commands = '"{0}" --nukex'.format(exePath) 33 | 34 | subprocess.check_call(commands) 35 | 36 | subprocess.check_call->会卡主程序 37 | 38 | subprocess.check_output->会卡主程序,会返回一些结果 39 | 40 | subprocess.Popen->独立程序,不会卡主程序 41 | -------------------------------------------------------------------------------- /source/p_Python/python_ide.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python IDE 3 | ============================= 4 | 5 | IDE的全称是:Integrated Development Environment,简称 IDE,也称为 Integration Design Environment、Integration Debugging Environment,翻译成中文叫做“集成开发环境”,在台湾那边叫做“整合開發環境”。它是一种辅助程序员开发用的应用软件。 6 | 7 | IDE通常包括程式语言编辑器、自动建立工具、通常还包括除错器。有些 IDE 包含编译器/直译器,如微软的 Microsoft Visual Studio,有些则不包含,如 Eclipse、SharpDevelop 等,这些 IDE 是通过调用第三方编译器来实现代码的编译工作的。有时 IDE 还会包含版本控制系统和一些可以设计圆形用戶界面的工具。许多支援物件导向的现代化 IDE 还包括了类別浏览器、物件检视器、物件结构图。虽然目前有一些IDE支援多种程式语言(例如 Eclipse、NetBeans、Microsoft Visual Studio),但是一般而言,IDE 主要还是针对特定的程式语言而量身打造(例如 Visual Basic)。 8 | 9 | - 集成开发环境 10 | 11 | - Visual Studio Code 12 | - JetBrains PyCharm 13 | - Sublime Text 3 14 | 15 | - 文本编辑器 16 | 17 | - Notepad++ 18 | - Vim 19 | 20 | - 交互式开发环境 21 | 22 | - IDLE 23 | - DreamPie 24 | - IPython 25 | 26 | - VSCode配置 27 | 28 | .. code-block:: bash 29 | 30 | { 31 | "python.linting.pylintEnabled": false, 32 | "python.linting.pep8Enabled": true, 33 | "editor.renderWhitespace": "all", 34 | "editor.mouseWheelZoom": true, 35 | "editor.rulers": [79, 120, 150], 36 | "editor.tabSize": 4, 37 | "window.title": "${activeEditorLong}", 38 | "python.pythonPath": "C:/Python27/python.exe" 39 | } 40 | 41 | - VSCode快捷键 42 | 43 | - Ctrl + /:注释、反注释 44 | - Ctrl + F2:选中所有相同字段以便批量修改 45 | - Ctrl + D:逐个选中相同字段以便批量修改 46 | - Shift + Alt + LM:列模式编辑 47 | - Shift + Alt + ↑/↓:向上、向下复制 48 | 49 | - VSCode好用的插件 50 | 51 | - Python 52 | - VEX 53 | - MayaCode 54 | - Code Runner 55 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_visual_programming.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:可视化编程 3 | ============================== 4 | 5 | 方案一:通过PolyExtrude节点可视化数据。 6 | 7 | - 创建一个Geometry。 8 | - 创建一个Grid,Rows->100,Columns->100。 9 | - 创建一个Attribute Wrangle。 10 | - 创建一个Attribute Promote,Original Name->zscale,New Class->Primitive,Promotion Method->Maximum。 11 | - 创建一个PolyExtrude,Divide Into->Individual Elements,Distance->1,Extrusion->Output Back,Local Control->Distance Scale。 12 | - Attribute Wrangle节点中写入如下的代码可得到可视化结果。 13 | 14 | .. code-block:: python 15 | 16 | f@zscale = @P.x; 17 | f@zscale = pow(@P.x, 2); 18 | f@zscale = sin(@P.x); 19 | f@zscale = floor(@P.x); 20 | f@zscale = frac(@P.x); 21 | f@zscale = abs(@P.x); 22 | f@zscale = abs(sin(@P.x)); 23 | f@zscale = floor(sin(@P.x)); 24 | f@zscale = pow(frac(@P.x), 2); 25 | 26 | .. code-block:: python 27 | 28 | float temp = noise(@P); 29 | 30 | if (temp > 0.5) { 31 | f@zscale = 1; 32 | } 33 | 34 | 方案二:通过点颜色可视化数据。 35 | 36 | .. code-block:: python 37 | 38 | - 创建一个Geometry。 39 | - 创建一个Grid,Rows->100,Columns->100。 40 | - 创建一个Attribute Wrangle。 41 | 42 | .. code-block:: python 43 | 44 | @Cd = {0, 0, 0}; 45 | float temp = noise(@P); 46 | 47 | if (temp > 0.5) { 48 | @Cd.r = 1; 49 | } 50 | 51 | - 创建一个Geometry。 52 | - 创建一个Box。 53 | - 创建一个。 54 | - 创建一个Attribute Wrangle。 55 | 56 | 方案三:通过点位置可视化数据。 57 | 58 | - 创建一个Geometry。 59 | - 创建一个Line,Origin->-2.5, 0, 0,Direction->1, 0, 0,Length->5,Points->1000。 60 | - 创建一个Attribute Wrangle。 61 | 62 | .. code-block:: python 63 | 64 | @P.y = pow(@P.x); 65 | -------------------------------------------------------------------------------- /source/p_Devops/Others/devops_office_mail.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | WPS Office、Foxmail办公软件推荐 3 | ========================================= 4 | 5 | Office推荐WPS个人版 6 | 7 | 邮箱推荐Foxmail,选择手动配置 8 | 9 | - 接收服务器类型:POP3 10 | - 邮件账号: huweiguo@do-vfx.com 11 | - POP服务器:pop3.mxhichina.com 端口:110 12 | - SMTP服务器:smtp.mxhichina.com 端口:25 13 | - 设置最小化时,在任务栏显示 14 | - 关闭主窗口时,退出程序 15 | 16 | 内网禁网机制,添加钉邮IP 17 | 18 | .. code-block:: bash 19 | 20 | route print 21 | 22 | route delete 0.0.0.0/0 23 | 24 | :: email 25 | route -p add 106.11.252.0/24 192.168.0.1 26 | route -p add 140.205.106.0/24 192.168.0.1 27 | route -p add 140.205.2.0/24 192.168.0.1 28 | route -p add 140.205.23.0/24 192.168.0.1 29 | route -p add 140.205.28.0/24 192.168.0.1 30 | route -p add 140.205.77.0/24 192.168.0.1 31 | route -p add 140.205.80.0/24 192.168.0.1 32 | route -p add 140.205.97.0/24 192.168.0.1 33 | route -p add 42.120.149.0/24 192.168.0.1 34 | route -p add 42.120.151.0/24 192.168.0.1 35 | route -p add 42.120.158.0/24 192.168.0.1 36 | route -p add 42.120.214.0/24 192.168.0.1 37 | route -p add 42.120.219.0/24 192.168.0.1 38 | route -p add 42.120.226.0/24 192.168.0.1 39 | route -p add 42.120.230.0/24 192.168.0.1 40 | route -p add 42.156.140.0/24 192.168.0.1 41 | route -p add 42.156.141.0/24 192.168.0.1 42 | route -p add 42.156.235.0/24 192.168.0.1 43 | route -p add 198.11.189.0/24 192.168.0.1 44 | route -p add 205.204.101.0/24 192.168.0.1 45 | route -p add 47.89.74.0/24 192.168.0.1 46 | route -p add 47.89.80.0/24 192.168.0.1 47 | route -p add 47.88.68.0/24 192.168.0.1 48 | 49 | 50 | -------------------------------------------------------------------------------- /source/p_Python/python_data_types_bool_none.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python数据类型:布尔值 & 空值 3 | ============================= 4 | 5 | - 布尔值 True & False 6 | 7 | 比较运算符 8 | 9 | ==, <, >, !=, <=, >=, in, not in, is, is not 10 | 11 | 逻辑运算符 12 | 13 | .. code-block:: python 14 | 15 | and 16 | or 17 | not 18 | 19 | Python逻辑运算符的短路规则 20 | 21 | 如果你了解二进制以及逻辑电路的知识,对逻辑运算符应该不会陌生。十进制数有加减乘除等算术运算,二进制作为另一种进制规则,自然也会有自己的运算方法,这种运算方法叫做逻辑运算。在Python中逻辑运算符有三个and、or和not,对应逻辑电路里的与、或、非门。 22 | 23 | 短路规则,又称最小化求值。是一种逻辑运算符的求值策略。只有当第一个运算数的值无法确定逻辑运算的结果时,才对第二个运算数进行求值。例如,当and的第一个运算数的值为False时,其结果必定为False;当or的第一个运算数为True时,最后结果必定为True,在这种情况下,就不需要知道第二个运算数的具体值。 24 | 25 | 那么Python中如何判定一个对象的真假呢?下面列举的是Python中的默认为假值的对象。 26 | 27 | .. code-block:: python 28 | 29 | None 30 | False 31 | 0 32 | 0.0 33 | 0j 34 | Decimal(0) 35 | Fraction(0, 1) 36 | [] - an empty list 37 | {} - an empty dict 38 | () - an empty tuple 39 | '' - an empty str 40 | b'' - an empty bytes 41 | set() - an empty set 42 | 43 | 一个对象的真假状态可以通过内置函数bool()来做检测,在写if条件的时候可以通过对象的真假状态来直接判断,而无需比较。 44 | 45 | 不建议的代码: 46 | 47 | .. code-block:: python 48 | 49 | if var == None: 50 | if var == 0: 51 | if var == []: 52 | if var == "": 53 | 54 | 建议的代码: 55 | 56 | .. code-block:: python 57 | 58 | if not var: 59 | 60 | 用and和or实现三元表达式(也叫三目运算符) 61 | 62 | .. code-block:: python 63 | 64 | x = 5 65 | y = "A" if x > 0 else "B" 66 | 67 | 用or提供默认值 68 | 69 | .. code-block:: python 70 | 71 | path in sys.path or sys.path.insert(0, path) 72 | 73 | 基于这种惰性求值方法,尽可能将需要求值时间短的表达式放前面。 74 | 75 | - 空值 None 76 | 77 | None是Python中一个特殊的值,虽然它不表示任何数据,但仍然具有重要的作用。自定义函数如果没有使用return,则默认返回值是None。 78 | -------------------------------------------------------------------------------- /source/p_Katana/katana_custom_shelf.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Katana自定义工具架工具 3 | ========================================= 4 | 5 | 工具架工具有几个地方可以定义Shelf Actions,主菜单上的齿轮菜单、Scene Graph中的齿轮菜单、节点参数面板中的齿轮菜单。 6 | 7 | 点击齿轮菜单>Add>New Shelf>New Item,工具架工具会存储在下面路径。 8 | 9 | C:\Users\\.katana\Shelves 10 | 11 | 工具架的几个参数定义 12 | 13 | .. code-block:: python 14 | 15 | """ 16 | NAME: Set abcAsset Path 17 | ICON: icon.png 18 | KEYBOARD_SHORTCUT: 19 | SCOPE: 20 | Enter Description Here 21 | 22 | """ 23 | 24 | 每个工具架工具代码中开头都有这么一段配置脚本。 25 | 26 | NAME即工具的名称,ICON设置工具图标,KEYBOARD_SHORTCUT设置工具的快捷方式。 27 | 28 | 图标文件在这里C:\Program Files\Katana3.5v2\bin\python\UI4\Resources\Icons 29 | 30 | 即$KATANA_HOME\bin\python\UI4\Resources\Icons 31 | 32 | SCOPE限制特定节点类型,写描述。 33 | 34 | 我们可以在.katana/Shelves创建文件夹Custom_Shelves,然后创建一个firstShelfTool.py文件,写入如下内容。 35 | 36 | .. code-block:: python 37 | 38 | """ 39 | NAME: Float Selected 40 | ICON: Icons\Scenegraph\camera128.png 41 | KEYBOARD_SHORTCUT: T 42 | SCOPE: none 43 | Float Selected Nodes via Keyboard Shortcut 44 | """ 45 | 46 | # Get list of selected nodes 47 | nodeList = NodegraphAPI.GetAllSelectedNodes() 48 | 49 | # Find Nodegraph tab and float nodes 50 | nodegraphTab = UI4.App.Tabs.FindTopTab("Node Graph") 51 | 52 | if nodegraphTab: 53 | nodegraphTab.floatNodes(nodeList) 54 | 55 | 56 | - https://support.foundry.com/hc/en-us/articles/360001163884-Q100401-Creating-a-Shelf-Item-in-Katana 57 | - https://support.foundry.com/hc/en-us/articles/360001235064 58 | - https://learn.foundry.com/katana/content/tg/shelf_item_scripts/shelf_item_scripts.html?TocPath=Technical%20Information%7C_____5#User-def 59 | -------------------------------------------------------------------------------- /source/p_Python/python_data_types_string.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python数据类型:字符串 3 | ============================= 4 | 5 | 字符串(str)是编程语言中最基本也是最重要的一种数据类型,在Python中可以说无时无刻不会跟字符串打交道。 6 | 7 | - 字符串定义 8 | 9 | 三引号正常用于多行注释Docstring。 10 | 11 | .. code-block:: python 12 | 13 | "andy" 14 | 'andy' 15 | """andy""" 16 | '''andy''' 17 | 18 | - 字符串格式化 19 | 20 | - % 21 | - .format() 22 | - F-Strings 23 | - format() 24 | 25 | - 字符串索引取值 26 | 27 | - 字符串不可变性 28 | 29 | - 字符串切片 30 | 31 | - 字符串循环迭代 32 | 33 | - 字符串方法 34 | 35 | 掌握字符串方法是非常重要的一项技能,特别是常用的format、join、split和replace四个方法。 36 | 37 | .. code-block:: python 38 | 39 | >>> type("python") 40 | 41 | >>> 42 | >>> dir("python") 43 | ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] 44 | >>> 45 | 46 | - 转义字符 47 | 48 | - \n 49 | - %% 50 | - \\ 51 | 52 | - 字符编码 53 | 54 | - ASCII 55 | - GB2312 56 | - GBK 57 | - Unicode 58 | - UTF-8 59 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_progress_bar.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini进度条 3 | ============================== 4 | 5 | Houdini Python API中提供hou.InteruptableOperation类来处理进度条,还有一种进度条方案是通过PyQt来实现。此文档介绍一下官方提供的接口的使用方法。 6 | 7 | 如果只有一个循环任务可以使用下面的套路代码,将time.sleep(1)替换成任务代码。 8 | 9 | .. code-block:: python 10 | 11 | import time 12 | import hou 13 | 14 | num = 5 15 | 16 | with hou.InterruptableOperation("Performing Tasks", open_interrupt_dialog=True) as operation: 17 | 18 | for i in range(num): 19 | # Perform task here. 20 | time.sleep(1) 21 | 22 | # Update operation progress. 23 | percent = float(i) / float(num) 24 | operation.updateProgress(percent) 25 | 26 | 如果有两个循环嵌套的子任务,可以用下面的套路代码模板来写,将time.sleep(1)替换成任务代码即可。 27 | 28 | .. code-block:: python 29 | 30 | import time 31 | import hou 32 | 33 | taskNum = 5 34 | subTaskNum = 5 35 | 36 | with hou.InterruptableOperation("Performing", "Performing Tasks", open_interrupt_dialog=True) as operation: 37 | 38 | for i in range(taskNum): 39 | # Update long operation progress. 40 | longPercent = float(i) / float(taskNum) 41 | operation.updateLongProgress(longPercent, long_op_status="Performing Tasks %d%%" % (longPercent * 100)) 42 | 43 | # Start the sub-operation. 44 | with hou.InterruptableOperation("Performing Task %i" % i) as suboperation: 45 | for j in range(subTaskNum): 46 | # Update sub-operation progress. 47 | percent = float(j) / float(subTaskNum) 48 | suboperation.updateProgress(percent) 49 | 50 | # Perform subtask here. 51 | time.sleep(1) 52 | -------------------------------------------------------------------------------- /source/p_Maya/maya_pymel.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya PyMEL 3 | ============================== 4 | 5 | 什么是pymel? 6 | 7 | pymel 与mel以及cmds区别? 8 | 9 | 10 | .. code-block:: python 11 | 12 | import pymel.core as pm 13 | import maya.cmds as cmds 14 | 15 | 16 | - 返回类型不同 17 | 18 | cmds只返回字符串 19 | 20 | pymel返回实例对象,可以用type,dir以及help内置函数 21 | 22 | .. code-block:: python 23 | 24 | # 通过pm.PyNode()将节点实例化 25 | 26 | resNode = pm.PyNode("defaultResolution") 27 | # 列出节点所有属性 28 | resNode.listAttr() 29 | resNode.width.set(720) 30 | resNode.width.get() 31 | pm.selected() 32 | 33 | Node Editor 34 | 35 | node.inputs() 36 | 37 | # 获取的是实例化对象,有属性和方法 38 | pm.sceneName() 39 | pm.env.minTime 40 | pm.env.maxTime 41 | pm.listCameras() 42 | 43 | import pymel.core as pm 44 | 45 | for k, v in pm.language.Env.envVars.items(): 46 | print(k, v) 47 | 48 | 49 | fileName = pm.sceneName().splitext()[0].basename() 50 | startFrame = pm.env.minTime 51 | endFrame = pm.env.maxTime 52 | cameraName = "%s_f%03d_f%03d" % (fileName, startFrame, endFrame) 53 | cameraList = [cam for cam in pm.listCameras(p = True)] 54 | selPanel = pm.getPanel(withFocus = True) 55 | selCam = pm.modelPanel(selPanel, q=True, camera=True) 56 | cam = pm.PyNode(selCam) 57 | cam.rename(cameraName) 58 | 59 | node = pm.PyNode("defaultRenderGlobals") 60 | pm.listAttr(node) 61 | node.imageFilePrefix.set("/") 62 | node.animation.set(1) 63 | node.startFrame.set(startFrame) 64 | node.endFrame.set(endFrame) 65 | pm.setAttr("defaultResolution.width", 1280) 66 | pm.setAttr("defaultResolution.height", 720) 67 | 68 | https://help.autodesk.com/cloudhelp/2017/ENU/Maya-Tech-Docs/PyMel/ -------------------------------------------------------------------------------- /source/p_Python/python_built_in_module_sys.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python内置模块:sys 3 | ============================= 4 | 5 | 内置模块sys是用来描述与Python解释器密切相关的一些功能,而非操作系统的功能,操作系统相关功能都在内置模块os中,这也是两个模块主要区别。 6 | 7 | .. code-block:: python 8 | 9 | >>> import sys 10 | >>> 11 | >>> type(sys) 12 | 13 | >>> dir(sys) 14 | ['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_getframe', '_git', 'api_version', 'argv', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 'dont_write_bytecode', 'exc_clear', 'exc_info', 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'exitfunc', 'flags', 'float_info', 'float_repr_style', 'getcheckinterval', 'getdefaultencoding', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', 'getwindowsversion', 'hexversion', 'last_traceback', 'last_type', 'last_value', 'long_info', 'maxint', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'py3kwarning', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions', 'winver'] 15 | >>> 16 | >>> sys.api_version 17 | 1013 18 | >>> sys.executable 19 | 'C:\\Python27\\python.exe' 20 | >>> sys.platform 21 | 'win32' 22 | >>> sys.version 23 | '2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:19:30) [MSC v.1500 32 bit (Intel)]' 24 | >>> sys.version_info 25 | sys.version_info(major=2, minor=7, micro=14, releaselevel='final', serial=0) 26 | 27 | * sys.argv 28 | * sys.path 29 | * sys.modules 30 | * reload 31 | -------------------------------------------------------------------------------- /source/p_Maya/maya_aov_tool.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya AOV分层工具 3 | ============================== 4 | 5 | AOV(Arbitrary Output Variables),可以通过Arnold Python API添加修改删除AOV。 6 | 7 | .. code-block:: python 8 | 9 | import mtoa 10 | 11 | print(mtoa.__file__) 12 | print(type(mtoa)) 13 | print(dir(mtoa)) 14 | 15 | # ['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'aovs', 'api', 'callbacks', 'cmds', 'convertShaders', 'core', 'denoise', 'hooks', 'licensing', 'lightFilters', 'lightManager', 'makeTx', 'melUtils', 'renderToTexture', 'txManager', 'ui', 'utils'] 16 | 17 | from mtoa import aovs 18 | 19 | aovName = "beauty" 20 | newAov = aovs.AOVInterface() 21 | print(dir(newAov)) 22 | 23 | # ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_aovAttr', '_node', '_removeAOVNode', 'addAOV', 'getAOVNode', 'getAOVNodes', 'getAOVs', 'nextAvailableAttr', 'node', 'removeAOV', 'removeAOVs', 'renameAOVs'] 24 | 25 | newAov.addAOV(aovName) 26 | print(help(newAov.addAOV)) 27 | 28 | Help on method addAOV in module mtoa.aovs: 29 | 30 | addAOV(self, aovName, aovType=None, aovShader=None) method of mtoa.aovs.AOVInterface instance 31 | add an AOV to the active list for this AOV node 32 | 33 | returns the created AOV node 34 | 35 | None 36 | 37 | addAOV方法有三个形参,两个缺省参数,所以至少传入aovName,aovType和aovShader可以缺省。 38 | 39 | 获取与移除AOV 40 | 41 | .. code-block:: python 42 | 43 | from mtoa import aovs 44 | 45 | newAov = aovs.AOVInterface() 46 | allAovs = newAov.getAOVs() 47 | print(allAovs) 48 | newAov.removeAOVs(allAovs) 49 | -------------------------------------------------------------------------------- /source/p_Deadline/deadline_python_api.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Deadline渲染农场提交农场接口 3 | ============================= 4 | 5 | 使用Deadline Python API提交任务需要开启deadlinewebservice.exe服务。 6 | 7 | .. code-block:: python 8 | 9 | >>> import sys 10 | >>> 11 | >>> 12 | >>> path = r"Y:\Program\DeadlineRepository10\api\python" 13 | >>> 14 | >>> path in sys.path or sys.path.insert(0, path) 15 | >>> import Deadline.DeadlineConnect as Connect 16 | >>> con = Connect.DeadlineCon("192.168.0.111", 8082) 17 | >>> con 18 | 19 | >>> type(con) 20 | 21 | >>> 22 | >>> 23 | >>> 24 | >>> dir(con) 25 | ['AuthenticationModeEnabled', 'Balancer', 'EnableAuthentication', 'Groups', 'JobReports', 'Jobs', 'LimitGroups', 'MappedPaths', 'MaximumPriority', 'Plugins', 'Pools', 'Pulse', 'Repository', 'SetAuthenticationCredentials', 'Slaves', 'SlavesRenderingJob', 'TaskReports', 'Tasks', 'Users', '__doc__', '__init__', '__module__', 'connectionProperties'] 26 | >>> 27 | >>> 28 | >>> con.Groups 29 | 30 | >>> dir(con.Groups) 31 | ['AddGroup', 'AddGroups', 'DeleteGroup', 'DeleteGroups', 'GetGroupNames', 'PurgeGroups', '__doc__', '__init__', '__module__', 'connectionProperties'] 32 | >>> con.Groups.GetGroupNames() 33 | [u'none', u'nuke', u'arnold', u'cache', u'gpu', u'maya2016', u'largem', u'core48', u'pdg', u'maya2017', u'rs3', u'maya2018'] 34 | >>> 35 | >>> job = con.Jobs.GetJob("5f16b24ab3a4a507c0359b71") 36 | >>> type(job) 37 | 38 | >>> from pprint import pprint 39 | >>> pprint(job) 40 | >>> job["Props"]["Pri"] = 97 41 | >>> pprint(job) 42 | >>> con.Jobs.SaveJob(job) 43 | 'Success' 44 | >>> 45 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_custom_menu.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini自定义菜单 3 | ============================== 4 | 5 | 自定义菜单是一项必备的技能,而Houdini中扩展自定义菜单更是非常简单方便,Houdini中可以自定义菜单的地方有很多,文档举三个比较重要的案例,其它菜单扩展以此类推。 6 | 7 | * MainMenuCommon.xml 自定义主菜单 8 | * OPmenu.xml 自定义节点菜单 9 | * PARMmenu.xml 自定义参数菜单 10 | 11 | scriptArgs怎么用 12 | 13 | 自定义主菜单 14 | 15 | .. code-block:: bash 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 在Windows主菜单中添加子菜单 36 | 37 | .. code-block:: bash 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | <> 47 | 48 | 49 | 50 | 可执行代码标签 51 | 52 | .. code-block:: bash 53 | 54 | 57 | 58 | 59 | .. code-block:: bash 60 | 61 | 68 | 69 | 70 | 参考文档: 71 | 72 | * https://www.sidefx.com/docs/houdini/basics/config_menus -------------------------------------------------------------------------------- /source/p_Python/python_type_instance_concept.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python类型实例概念 3 | ============================= 4 | 5 | Python中万物皆对象,但是得先有类型,才能生成实例对象。我们操作某一个实例的时候,首先得分析它是什么类型,可以通过type()来获取对象的类型,然后分析它有什么属性以及方法,可以通过dir()来获取对象的属性和方法,再然后可以通过help()来获取具体属性与方法的帮助文档。 6 | 7 | .. code-block:: python 8 | 9 | >>> s1 = "Hello world!" 10 | >>> s1 11 | 'Hello world!' 12 | >>> type(s1) 13 | 14 | >>> dir(s1) 15 | ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] 16 | >>> help(s1.split) 17 | Help on built-in function split: 18 | 19 | split(...) 20 | S.split([sep [,maxsplit]]) -> list of strings 21 | 22 | Return a list of the words in the string S, using sep as the 23 | delimiter string. If maxsplit is given, at most maxsplit 24 | splits are done. If sep is not specified or is None, any 25 | whitespace string is a separator and empty strings are removed 26 | from the result. 27 | >>> s1.split() 28 | ['Hello', 'world!'] 29 | 30 | 可以看出type()、dir()以及help()乃是一套通用心法,无论你得到一个什么实例对象,你都可以通过此三个内置函数来获取对于这个对象的初步的文档以及使用方法。 31 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_attributes.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:属性 3 | ============================== 4 | 5 | 6 | 7 | 创建属性 8 | 9 | .. code-block:: python 10 | 11 | int @num = 100; 12 | 13 | i@num = 100; 14 | 15 | int @num[]; 16 | 17 | i[]@num = {100, 200}; 18 | 19 | 20 | 两种方案的区别有一些,i@num可以使用表达式运算或者函数返回值,数组属性不简写不能赋初始值。 21 | 22 | .. code-block:: python 23 | 24 | vector @up = {0, 1, 0}; 25 | v@up = set(0, 1, 0); 26 | 27 | 内置属性不用指定数据类型,比如@ptnum,@N等,自定义属性如果不指定数据类型,默认初始化为浮点型数据。 28 | 29 | 所以为了和变量创建区别开推荐使用简写创建属性的方案。 30 | 31 | i@i = 100; 32 | f@pi = 3.14; 33 | u@v1 = {1.0, 2.0}; 34 | v@v2 = set(1.0, $PI, 2.0); 35 | p@ 36 | 2@ 37 | 3@ 38 | 4@ 39 | s@ 40 | 41 | 数组属性 42 | 43 | i[]@ 44 | f[]@ 45 | s[]@ 46 | 47 | 函数添加属性 48 | 49 | .. code-block:: python 50 | 51 | addpointattrib(0, "Cd", {0, 0, 0}); 52 | addvertexattrib(0, "Cd", {0, 0, 0}); 53 | addprimattrib(0, "Cd", {0, 0, 0}); 54 | adddetailattrib(0, "Cd", {0, 0, 0}); 55 | 56 | 修改属性 57 | 58 | .. code-block:: python 59 | 60 | setpointattrib(0, "Cd", 0, {0, 0, 0}); 61 | setvertexattrib(0, "Cd", 0, {0, 0, 0}); 62 | setprimattrib(0, "Cd", 0, 0, {0, 0, 0}); 63 | setdetailattrib(0, "Cd", {0, 0, 0}); 64 | 65 | 获取属性 66 | 67 | .. code-block:: python 68 | 69 | float f1 = @P.y; 70 | float f2 = @opinput1_Cd.y; 71 | float f3 = v@opinput1_v1.y; 72 | vector c1 = point(1, "Cd", @ptnum); 73 | vector c2 = prim(1, "Cd", 0); 74 | vector c3 = vertex(1, "Cd", 0); 75 | vector c4 = detail(1, "Cd", 0); 76 | 77 | 全局属性 78 | 79 | .. code-block:: bash 80 | 81 | printf("%g\n", $PI); 82 | printf("%g\n", $E); 83 | printf("%g\n", @Frame); 84 | printf("%g\n", @Time); 85 | printf("%g\n", @Timeinc); 86 | printf("%g\n", @SimFrame); 87 | printf("%g\n", @SimTime); 88 | 89 | 内在属性 90 | 91 | Intrinsic内在属性只有prim和detail上才会存在 92 | 93 | prim() 读取属性 94 | primintrinsic() 读取属性 95 | setprimintrinsic() 设置属性 96 | 97 | 属性相关函数 98 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_module_toolutils.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini模块:toolutils 3 | ============================== 4 | 5 | - 查询某一类型所有节点,比如查询所有的File Cache节点 6 | 7 | .. code-block:: python 8 | 9 | import toolutils 10 | 11 | nodes = toolutils.findAllChildNodesOfType(hou.node("/obj"), "filecache", dorecurse=True) 12 | 13 | for node in nodes: 14 | print(node.path()) 15 | 16 | - 与Scene View窗口交互,比如只能选择相机得到结果。 17 | 18 | .. code-block:: python 19 | 20 | import toolutils 21 | 22 | scene_viewer = toolutils.sceneViewer() 23 | selected_objects = scene_viewer.selectObjects("Select a camera and press Enter", allowed_types = ["cam"]) 24 | print(selected_objects) 25 | 26 | - 设置当前视图相机 27 | 28 | .. code-block:: python 29 | 30 | >>> import toolutils 31 | >>> scene_view = toolutils.sceneViewer() 32 | >>> viewport = scene_view.curViewport() 33 | >>> viewport.setCamera(hou.node("/obj/cam1/")) 34 | >>> 35 | 36 | .. code-block:: python 37 | 38 | import toolutils 39 | 40 | kwargs["pane"] = None 41 | 42 | toolutils.createOrShowPythonPanel(kwargs, "attribmanager", "Attribute Manager", 4) 43 | 44 | .. code-block:: python 45 | 46 | >>> import toolutils 47 | >>> 48 | >>> scene_view = toolutils.sceneViewer() 49 | >>> 50 | >>> scene_view 51 | 52 | >>> scene_view.pwd() 53 | 54 | >>> scene_view.pwd() 55 | 56 | >>> scene_view.curViewport() 57 | 58 | >>> 59 | >>> viewport = scene_view.curViewport() 60 | >>> viewport 61 | 62 | >>> settings = viewport.settings() 63 | >>> settings 64 | 65 | >>> 66 | >>> settings.camera() 67 | >>> settings.camera() 68 | 69 | >>> 70 | 71 | -------------------------------------------------------------------------------- /source/p_Katana/katana_basic_operator.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Katana基础操作 3 | ========================================= 4 | 5 | 默认视窗分为五大块: 渲染窗口、大纲窗口、三维视窗、节点编辑窗口和属性面板。 6 | 7 | 三维视窗的操作和Maya相同,非常简单,结合Alt+左中右键可以调整视窗,按F居中显示场景物体。 8 | 9 | 选中相应的物体可以通过W\E\R键来移动、旋转、缩放。 10 | 11 | 可以自定义视窗布局,通过Layouts>Save Current Layout保存自定义视窗。 12 | 13 | 在Node Graph窗口可以通过Tab来创建节点(也可以通过New菜单来创建节点)。 14 | 15 | 节点的左侧方格是在Scene Graph中显示,节点右侧方格是显示节点的属性面板,对应快捷键V和E。 16 | 17 | 修改节点名称可以通过属性面板修改或者选中节点按N键修改。 18 | 19 | 快捷键G可以将选中节点打组Group,Alt+G可以将选中节点打组GroupStack,可以使用Ctrl+鼠标中键或者Ctrl+Enter可以进组修改。 20 | 21 | Node Graph>Edit>Fit Backdrop Node to Selected Nodes给节点归类添加Backdrop。 22 | 23 | Viewer(Hydra)>Viewer>Monitor Layer: 视窗渲染 24 | 25 | Viewer(Hydra)>Viewer>Monitor Layer Options>Display While Manipulating: 视窗实时监视渲染 26 | 27 | Viewer(Hydra)>Viewer>Monitor Layer Options>Ignore Alpha: 视窗透明渲染 28 | 29 | Scene Graph>Live Render Updates: 勾选需要实时渲染的选项。 30 | 31 | 常用一些节点解释 32 | 33 | ====================== ======================================================== 34 | 节点类型 节点描述 35 | PrimitiveCreate 模型节点 36 | Merge 合并节点 37 | Dot 点节点 38 | HierarchyCopy 复制节点 39 | Transform3D 移动节点 40 | CameraCreate 相机节点 41 | Material 材质节点 42 | MaterialAssign 材质赋予节点 43 | GafferThree 灯光组节点 44 | RenderSettings 渲染设置节点 45 | DISettings 采样设置节点 46 | Render 渲染节点 47 | ====================== ======================================================== 48 | 49 | XGen毛发进Katana步骤 50 | 51 | - [ ] 如何导入显示? 52 | - [ ] 默认渲染器如何渲染? 53 | - [ ] Katana中心化部署流程? 54 | - [ ] Arnold如何渲染,配置与渲染? 55 | 56 | 文字Katana部署Arnold 57 | 文字Katana导入XGen流程 58 | 文字Katana中心化部署 59 | 60 | Katana中隐藏模型渲染? 61 | 62 | Katana渲染图保存对比? 63 | 64 | Katana背景色怎么设置? 65 | 66 | Katana帧数范围在哪设置? 67 | 68 | 参考文档: 69 | 70 | - https://rmanwiki.pixar.com/display/RFK/XGen+in+Katana 71 | - https://docs.arnoldrenderer.com/display/A5KTN/Installation -------------------------------------------------------------------------------- /source/p_Katana/katana_python_env.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Katana开发环境 3 | ========================================= 4 | 5 | Katana中支持三种语言编程:Python,Lua和C++。Python应用于工作流非常方便,Lua用于OpScript节点。 6 | 7 | Katana中选择菜单Tabs>Python即可打开Katana脚本编辑器。 8 | 9 | API文档在Help>API Reference>Python APIs。 10 | 11 | .. code-block:: python 12 | 13 | print(KatanaFile.__file__) 14 | print(type(KatanaFile)) 15 | print(dir(KatanaFile)) 16 | # C:\Program Files\Katana3.5v2/bin/python\PyUtilModule\KatanaFile.pyc 17 | # 18 | # ['AllowFileOverwrite', 'AssetAPI', 'Callbacks', 'Configuration', 'CrashSave', 'CrashSaveDisable', 'CrashSaveEnable', 'CreateSceneAsset', 'Export', 'FileUtils', 'GetCrashActions', 'GetCrashTime', 'GetKatanaXMLElement', 'GetNextCrashFileName', 'GetViableCrashFiles', 'Import', 'IsFileDirty', 'IsFileSavedAsAsset', 'Load', 'MAX_CRASH_FILES', 'New', 'NodegraphAPI', 'Nodes2DAPI', 'Nodes3DAPI', 'Paste', 'PopFileDirtyState', 'PostCreateSceneAsset', 'PushFileDirtyState', 'RegisterPasteHandler', 'Revert', 'Save', 'ScenegraphBookmarkManager', 'SetFileDirty', 'UndoEntries', 'Utils', 'WasFileLoadedFromCrashFile', 'WasFileVersionedOnLoad', '_CleanupRenderNodes', '_ContainsModifiedLiveGroupNodes', '_CrashActions', '_CrashDisable', '_CrashFilePreviouslySaved', '_CrashHandlerUndoCB', '_CrashIndex', '_CrashSaveImpl', '_EvaluateFilename', '_ExportNodesToFile', '_FileDirty', '_FileDirtyStates', '_FileLoadedFromCrashFile', '_FileVersionedOnLoad', '_FindRenderNodes', '_LastCrashSave', '_RestoreFileDirty', '_SaveAndPublish', '_SaveFile', '_SaveFileDirty', '_SetKatanaSceneNameAndSourceFile', '__PasteHandlers', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'log', 'logging', 'operator', 'os', 'stat', 'time', 'xml'] 19 | 20 | 参考文档: 21 | 22 | - https://learn.foundry.com/katana/3.5/dev-guide/index.html 23 | - https://support.foundry.com/hc/zh-cn/articles/360001288699-Q100443-Katana%E4%B8%AD%E7%9A%84%E8%84%9A%E6%9C%AC%E5%92%8C%E7%BC%96%E7%A8%8B 24 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_geometry.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:几何体函数 3 | ============================== 4 | 5 | =============== ==================================================== 6 | addpoint() 添加点到几何体 7 | addvertex() 添加顶点到几何体上的面 8 | addprim() 添加面到几何体 9 | 10 | removepoint() 删除点 11 | removeprim() 删除面 12 | removevertex() 删除顶点 13 | =============== ==================================================== 14 | 15 | 使用add创建一个四角锥或者Attribute Wrangle创建一个四角锥,注意面法线方向。 16 | 17 | .. code-block:: python 18 | 19 | int p0 = addpoint(geoself(), {1, 0, 1}); 20 | int p1 = addpoint(geoself(), {1, 0, -1}); 21 | int p2 = addpoint(geoself(), {-1, 0, 1}); 22 | int p3 = addpoint(geoself(), {-1, 0, -1}); 23 | int p4 = addpoint(geoself(), {0, 1.5, 0}); 24 | 25 | addprim(geoself(), "poly", p0, p1, p3, p2); 26 | addprim(geoself(), "poly", p2, p4, p0); 27 | addprim(geoself(), "poly", p0, p4, p1); 28 | addprim(geoself(), "poly", p1, p4, p3); 29 | addprim(geoself(), "poly", p3, p4, p2); 30 | 31 | .. code-block:: python 32 | 33 | if (@P.x < 0) { 34 | removepoint(geoself(), @ptnum); 35 | } 36 | 37 | .. code-block:: python 38 | 39 | for (int i = 0; i < chi("num"); i++) { 40 | addpoint(geoself(), set(0, 0, i * chf("size"))); 41 | } 42 | 43 | setprimintrinsic() 44 | setvertexpoint(0, 2, 0, 0); 45 | 46 | primvertices() 47 | primvertex() 48 | primvertexcount() 49 | primpoints() 50 | primpoint() 51 | 52 | pointprims() 53 | pointvetices() 54 | pointvertex() 55 | vertexpoint() 56 | vertexprev() 57 | vertexnext() 58 | vertexindex() 59 | vertexprim() 60 | vertexprimindex() 61 | 62 | 顶点序号 63 | 64 | 线性顶点序号 65 | 66 | .. code-block:: python 67 | 68 | int lvt0 = pointvertex(0, 7); 69 | int lvt1 = pointvertex(0, lvt0); 70 | int lvt2 = pointvertex(0, lvt1); 71 | 72 | setvertexattrib(0, "Cd", -1, lvt0, {1, 0, 0}); 73 | setvertexattrib(0, "Cd", -1, lvt1, {0, 1, 0}); 74 | setvertexattrib(0, "Cd", -1, lvt2, {0, 0, 1}); 75 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_point_cloud.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:点云函数 3 | ============================== 4 | 5 | 6 | ============== ================================================================ 7 | nearpoint() # 查找离我最近的点,如果自己也在几何体中,则返回自己 8 | nearpoints() # 按范围查找最近的点,如果自己也在几何体中,数组中第一个元素是自己 9 | neighbour() # 查找 10 | neighbours() # 查找某一个点临近点 11 | ============== ================================================================ 12 | 13 | 新建Atttribute Wrangle创建随机点。 14 | 15 | .. code-block:: python 16 | 17 | for (int i = 0; i < 1000; i++) { 18 | vector randPos = rand(i); 19 | // randPos.y = 0; 20 | addpoint(0, randPos); 21 | } 22 | 23 | 查找最近的两个点去连线。 24 | 25 | .. code-block:: python 26 | 27 | int nearpt = nearpoints(0, @P, 1, 2)[1]; 28 | 29 | if (@ptnum > nearpt) { 30 | addprim(0, "polyline", nearpt, @ptnum); 31 | } 32 | 33 | 查找附近多个点进行连线。 34 | 35 | .. code-block:: python 36 | 37 | int nearpts[] = nearpoints(0, @P, 1, 10)[1:]; 38 | 39 | foreach (int nearpt; nearpts) { 40 | if (@ptnum > nearpt) { 41 | addprim(0, "polyline", nearpt, @ptnum); 42 | } 43 | } 44 | 45 | 最简单的颜色通过小球来控制颜色传递。 46 | 47 | .. code-block:: python 48 | 49 | int nearpt = nearpoint(1, @P, 0.5); 50 | 51 | if(nearpt != -1) { 52 | @Cd = {1, 0, 0}; 53 | } 54 | 55 | 查找临近点。 56 | 57 | .. code-block:: python 58 | 59 | int nbs[] = neighbours(0, @ptnum); 60 | 61 | foreach (int nb; nbs) { 62 | @Cd = v@Cd2; 63 | i@infected = 1; 64 | } 65 | 66 | 67 | For Loop与Solver区别,For Loop循环不会继承前一帧的效果,Solver会继承上一帧的效果。 68 | 69 | ============== ================================================================ 70 | pcopen() 71 | pcnumfound() 72 | pciterate() 73 | pcimport() 74 | pcclose() 75 | ============== ================================================================ 76 | 77 | .. code-block:: python 78 | 79 | int handle = pcopen(0, "P", @P, 0.05, 10); 80 | i@num = pcnumfound(handle); 81 | 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /source/p_Nuke/nuke_create_read.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Nuke Python创建Read节点小技巧 3 | ============================== 4 | 5 | 用过Nuke的童鞋都知道我们可以拖拽mov或者文件夹素材到Nuke的Node Graph中,它可以自动分类这些素材形成几个Read节点,并自动识别素材的帧数范围以及Metadata关于素材的所有信息。 6 | 7 | 那么在编写工具的时候如果遇到需要使用代码来创建Read节点并读取素材该怎么办呢?正常思维能想到的就是先创建Read节点,然后设置节点上的file参数,尝试过之后你会发现得不到你想要的结果。正确的方式是通过节点参数实例的fromUserText方法来实现。 8 | 9 | 我们先执行下面的代码看下fromUserText方法的定义 10 | 11 | .. code-block:: python 12 | 13 | import nuke 14 | readNode = nuke.nodes.Read() 15 | print(help(readNode["file"].fromUserText)) 16 | 17 | 执行完之后会得到下面的帮助文档 18 | 19 | .. code-block:: python 20 | 21 | # Result: Help on built-in function fromUserText: 22 | 23 | fromUserText(...) 24 | self.fromUserText(s) -> None. 25 | Assign string to knob, parses frame range off the end and opens file to get set the format. 26 | @param s: String to assign. 27 | @return: None. 28 | 29 | None 30 | 31 | 意味着我需要传输素材的一个路径进去,比如一个mov,可以这样创建Read节点 32 | 33 | .. code-block:: python 34 | 35 | import nuke 36 | 37 | movPath = r"D:\tests_nuke_read\XX_XXX_v001.mov" 38 | readNode = nuke.nodes.Read() 39 | readNode["file"].fromUserText(movPath) 40 | 41 | 你会发现和拖拽进来的素材丝毫不差,那么如果是exr序列呢?可以尝试将.mov改成####.exr或者%04d.exr,这样都得不到正确的结果,我们想获取到正确的序列,需要通过nuke.getFileNameList方法来解析一个文件夹中有哪些序列,如果一个文件夹中存在三套序列,它将返回一个三个元素组成的列表,类似下面这样 42 | 43 | .. code-block:: python 44 | 45 | import nuke 46 | 47 | exrPath = r"D:\tests_nuke_read\render" 48 | print(nuke.getFileNameList(exrPath)) 49 | # Result: ['BillowySmoke1.####.exr 700-1300', 'finalRender_Smoke_Right_bg.####.exr 1-200', 'qiangjiaohuo.####.exr 100-700'] 50 | 51 | 其中每个元素的结尾都标明了对应序列的帧数范围,这样我们去创建Read节点就好办了,可以一次性创建三个Read节点 52 | 53 | .. code-block:: python 54 | 55 | import nuke 56 | 57 | exrPath = r"D:\tests_nuke_read\render" 58 | seqs = nuke.getFileNameList(exrPath) 59 | 60 | for seq in seqs: 61 | seqPath = "%s/%s" % (exrPath, seq) 62 | readNode = nuke.nodes.Read() 63 | readNode["file"].fromUserText(seqPath) 64 | 65 | 完美 -------------------------------------------------------------------------------- /source/p_Python/python_built_in_module_calendar.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python内置模块:calendar 3 | ============================= 4 | 5 | 日历模块calendar 6 | 7 | .. code-block:: python 8 | 9 | >>> import calendar 10 | >>> type(calendar) 11 | 12 | >>> calendar.__file__ 13 | 'C:\\Python38\\lib\\calendar.py' 14 | >>> dir(calendar) 15 | ['Calendar', 'EPOCH', 'FRIDAY', 'February', 'HTMLCalendar', 'IllegalMonthError', 'IllegalWeekdayError', 'January', 'LocaleHTMLCalendar', 'LocaleTextCalendar', 'MONDAY', 'SATURDAY', 'SUNDAY', 'THURSDAY', 'TUESDAY', 'TextCalendar', 'WEDNESDAY', '_EPOCH_ORD', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_colwidth', '_locale', '_localized_day', '_localized_month', '_monthlen', '_nextmonth', '_prevmonth', '_spacing', 'c', 'calendar', 'datetime', 'day_abbr', 'day_name', 'different_locale', 'error', 'firstweekday', 'format', 'formatstring', 'isleap', 'leapdays', 'main', 'mdays', 'month', 'month_abbr', 'month_name', 'monthcalendar', 'monthrange', 'prcal', 'prmonth', 'prweek', 'repeat', 'setfirstweekday', 'sys', 'timegm', 'week', 'weekday', 'weekheader'] 16 | >>> 17 | 18 | .. code-block:: python 19 | 20 | import calendar 21 | 22 | for i in range(1, 13): 23 | print(calendar.month_name[i]) 24 | 25 | import calendar 26 | 27 | d={} 28 | for i in range(1, 13): 29 | d[calendar.month_name[i]] = i 30 | 31 | print(d) 32 | 33 | import calendar 34 | from pprint import pprint 35 | s2 = "February January May October August September April November July March December" 36 | 37 | d = {} 38 | for i in range(1, 13): 39 | d[calendar.month_name[i]] = i 40 | 41 | def sorter(elem): 42 | return d[elem] 43 | 44 | pprint(sorted(s2.split(), key=sorter)) 45 | 46 | import calendar 47 | month_names = [calendar.month_name[i] for i in range(1, 13)] 48 | print(month_names) 49 | print(sorted(s2.split(), key=month_names.index)) 50 | -------------------------------------------------------------------------------- /source/p_Python/python_custom_package.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python自定义包 3 | ============================= 4 | 5 | - 包的唯一标识__init__.py 6 | - 查询包路径__path__ 7 | - 包的层级结构 8 | - 通配导入__all__ 9 | - 包的相对路径导入 10 | 11 | 包(package)是将一些模块组织在一起构成一个更大规模的模块,也是Python中对模块的更高一级的抽象。Python允许用户把目录当成模块看待,目录中不同模块文件,就变成了包里面的子模块。一个包可以由一个或多个模块或子包构成的模块,包目录下不但可以包含作为子模块的py文件,还可以包含子目录,这些子目录也可以是Python的包。 12 | 13 | - __init__.py文件的作用? 14 | 15 | 当一个文件夹中存在一个__init__.py文件时,这个文件夹就会被Python解释器识别为一个包。__init__.py除了标识一个文件夹是包的作用以外,它还可以执行一些初始化操作。在使用import导入一个模块的时候,__init__.py文件会首先被执行。因此__init__.py中可以写一些初始化的代码,比如导入其他依赖的Python模块。 16 | 17 | - 如何验证__init__.py是优先被导入的? 18 | 19 | 绝大部分时候让__init__.py文件空着就好。 20 | 21 | - 查询包路径__path__ 22 | 23 | __path__是一个包自带的隐藏属性,它描述一个包的完整路径,也是包的一个标识。 24 | 25 | - 包的层级结构 26 | 27 | 封装成包是很简单的。在文件系统上组织你的代码,并确保每个目录都定义了一个__init__.py文件。 28 | 29 | .. code-block:: python 30 | 31 | chooseTask/ 32 | __init__.py 33 | ui/ 34 | __init__.py 35 | resource.py 36 | config/ 37 | __init__.py 38 | user.py 39 | sg.py 40 | mainWin.py 41 | 42 | 有了上面的层级结构,你可以执行各种import语句 43 | 44 | 包的相对路径导入 45 | 46 | Python自定义包的相对导入问题? 47 | 48 | Python 2.x和3.x包导入的区别 49 | 50 | 相对导入对执行方式是有一定的要求,不同执行方式可能会报一种不是错误的错误 51 | 52 | 假设现在有一个myPackage的包 53 | 54 | .. code-block:: python 55 | 56 | myPackage/ 57 | __init__.py 58 | aaa/ 59 | __init__.py 60 | spam.py 61 | grok.py 62 | bbb/ 63 | __init__.py 64 | bar.py 65 | 66 | 如果模块myPackage.aaa.spam要导入同目录下的模块grok 67 | 68 | .. code-block:: python 69 | 70 | # myPackage/aaa/spam.py 71 | from . import grok 72 | 73 | 如果模块myPackage.aaa.spam要导入不同目录下的模块bbb.bar 74 | 75 | .. code-block:: python 76 | 77 | # myPackage/aaa/spam.py 78 | from ..bbb import bar 79 | 80 | .. code-block:: python 81 | 82 | # -*- coding: utf-8 -*- 83 | #!/usr/bin/python 84 | 85 | """ 86 | this is a doc string of test pack 87 | """ 88 | 89 | a = 1 90 | b = 2 91 | 92 | def foo(): 93 | print("fool") 94 | -------------------------------------------------------------------------------- /source/p_Python/python_built_in_module_copy.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python内置模块:copy 3 | ============================= 4 | 5 | 内置模块copy的存在主要为了深度拷贝,那么什么是深度拷贝呢? 6 | 7 | 深度拷贝会递归拷贝所有深度成员。 8 | 9 | .. code-block:: python 10 | 11 | >>> import copy 12 | >>> type(copy) 13 | 14 | >>> dir(copy) 15 | ['Error', 'PyStringMap', '_EmptyClass', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_copy_dispatch', '_copy_immutable', '_copy_inst', '_copy_with_constructor', '_copy_with_copy_method', '_deepcopy_atomic', '_deepcopy_dict', '_deepcopy_dispatch', '_deepcopy_inst', '_deepcopy_list', '_deepcopy_method', '_deepcopy_tuple', '_keep_alive', '_reconstruct', '_test', 'copy', 'deepcopy', 'dispatch_table', 'error', 'name', 't', 'weakref'] 16 | >>> help(copy.deepcopy) 17 | Help on function deepcopy in module copy: 18 | 19 | deepcopy(x, memo=None, _nil=[]) 20 | Deep copy operation on arbitrary Python objects. 21 | 22 | See the module's __doc__ string for more info. 23 | 24 | >>> 25 | 26 | 存在深度拷贝主要原因是可变数据类型可能会触碰到这个问题。 27 | 28 | .. code-block:: python 29 | 30 | >>> l1 = [1, [2, 3], 4] 31 | >>> l2 = l1[:] 32 | >>> l1 33 | [1, [2, 3], 4] 34 | >>> l2 35 | [1, [2, 3], 4] 36 | >>> id(l1) 37 | 52764264 38 | >>> id(l2) 39 | 52762824 40 | >>> id(l1[1]) 41 | 52786560 42 | >>> id(l2[1]) 43 | 52786560 44 | >>> l1.append(5) 45 | >>> l1 46 | [1, [2, 3], 4, 5] 47 | >>> l2 48 | [1, [2, 3], 4] 49 | >>> l1[1].append(100) 50 | >>> l1 51 | [1, [2, 3, 100], 4, 5] 52 | >>> l2 53 | [1, [2, 3, 100], 4] 54 | 55 | 上面代码是一个浅拷贝的例子,不经意间你的代码就会出现问题,如果用copy模块呢? 56 | 57 | .. code-block:: python 58 | 59 | >>> import copy 60 | >>> l1 61 | [1, [2, 3, 100], 4, 5] 62 | >>> l3 = copy.deepcopy(l1) 63 | >>> id(l1) 64 | 52764264 65 | >>> id(l3) 66 | 52786520 67 | >>> id(l1[1]) 68 | 52786560 69 | >>> id(l3[1]) 70 | 52788600 71 | >>> l1[1].pop() 72 | 100 73 | >>> l1 74 | [1, [2, 3], 4, 5] 75 | >>> l3 76 | [1, [2, 3, 100], 4, 5] 77 | >>> 78 | -------------------------------------------------------------------------------- /source/p_Katana/katana_custom_node_menu.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Katana自定义节点菜单 3 | ========================================= 4 | 5 | .. code-block:: python 6 | 7 | from Katana import UI4, NodegraphAPI 8 | from UI4.FormMaster.NodeActionDelegate import (BaseNodeActionDelegate, RegisterActionDelegate) 9 | from UI4.Manifest import QtCore, QtGui, QtWidgets 10 | 11 | 12 | class MyNodeActionDelegate(BaseNodeActionDelegate.BaseNodeActionDelegate): 13 | class _SelectNodeAction(QtWidgets.QAction): 14 | 15 | def __init__(self, parent, node): 16 | QtWidgets.QAction.__init__(self, 'Select "%s"' % node.getName(), parent) 17 | 18 | self.__node = node 19 | if node: 20 | self.triggered.connect(self.__triggered) 21 | self.setEnabled(self.__node is not None 22 | and not self.__node.isLocked(True)) 23 | 24 | def __triggered(self, checked): 25 | NodegraphAPI.SetNodeSelected(self.__node, True) 26 | 27 | class _DeselectNodeAction(QtWidgets.QAction): 28 | 29 | def __init__(self, parent, node): 30 | QtWidgets.QAction.__init__(self, 'Deselect "%s"' % node.getName(), parent) 31 | 32 | self.__node = node 33 | if node: 34 | self.triggered.connect(self.__triggered) 35 | self.setEnabled(self.__node is not None 36 | and not self.__node.isLocked(True)) 37 | 38 | def __triggered(self, checked): 39 | NodegraphAPI.SetNodeSelected(self.__node, False) 40 | 41 | def addToContextMenu(self, menu, node): 42 | menu.addAction(self._SelectNodeAction(menu, node)) 43 | menu.addAction(self._DeselectNodeAction(menu, node)) 44 | 45 | def addToWrenchMenu(self, menu, node, hints=None): 46 | pass 47 | 48 | 49 | RegisterActionDelegate("CameraCreate", MyNodeActionDelegate()) 50 | 51 | 52 | - https://support.foundry.com/hc/en-us/articles/208838305-Q100108-Adding-custom-menu-items-to-the-context-menu-of-nodes -------------------------------------------------------------------------------- /source/p_Python/python_special_method_repr.rst: -------------------------------------------------------------------------------- 1 | ========================================== 2 | Python特殊方法:__repr__ 3 | ========================================== 4 | 5 | .. code-block:: python 6 | 7 | import random 8 | 9 | class Point(object): 10 | def __init__(self, dist_from_origin, weight): 11 | self.dist = dist_from_origin 12 | self.weight = weight 13 | 14 | def __repr__(self): 15 | return "Point dist: %f; weight: %f" % (self.dist, self.weight) 16 | 17 | def getPointList(numPoints, maxDist): 18 | l = [] 19 | n = 0 20 | 21 | while n <= numPoints: 22 | dist = random.random() 23 | random.seed() 24 | weight = random.uniform(0.01, 0.1) 25 | 26 | if dist <= maxDist: 27 | l.append(Point(dist, weight)) 28 | n += 1 29 | 30 | return l 31 | 32 | print(getPointList(100, 0.17)) 33 | 34 | .. code-block:: python 35 | 36 | import random 37 | 38 | class Point(object): 39 | def __init__(self, dist_from_origin, weight): 40 | self.dist = dist_from_origin 41 | self.weight = weight 42 | 43 | def __repr__(self): 44 | return "Point dist: %f; weight: %f" % (self.dist, self.weight) 45 | 46 | @measure_time 47 | def getPointList(numPoints, maxDist): 48 | l = [] 49 | n = 0 50 | 51 | while n <= numPoints: 52 | dist = random.random() 53 | random.seed() 54 | weight = random.uniform(0.01, 0.1) 55 | 56 | if dist <= maxDist: 57 | l.append(Point(dist, weight)) 58 | n += 1 59 | 60 | return l 61 | 62 | @measure_time 63 | def pointGenerator(numPoints, maxDist): 64 | n = 0 65 | 66 | while n <= numPoints: 67 | dist = random.random() 68 | random.seed() 69 | weight = random.uniform(0.01, 0.1) 70 | 71 | if dist <= maxDist: 72 | n += 1 73 | yield Point(dist, weight) 74 | 75 | print("List: ", getPointList(1000, 0.17)) 76 | print("Generator: ", pointGenerator(1000, 0.17)) 77 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_channel_parameter.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:通道参数 3 | ============================== 4 | 5 | .. code-block:: python 6 | 7 | float dist = chf("dist"); 8 | int num = chi("num"); 9 | 10 | for (int n = 0; n < num; n++) { 11 | addpoint(0, set(n * dist, 0, 0)); 12 | } 13 | 14 | 通道参数是Houdini本身就存在的一种自定义参数的方案,只不过这里用到了VEX代码中而已。 15 | 16 | 这里总结一些VEX关于通道的内置函数。 17 | 18 | ============== ====================== ==================== 19 | 类型 HScript VEX 20 | int ch chi() 21 | float ch chf() 22 | string ch chs() 23 | vector chv() 24 | ramp chramp chramp() 25 | ============== ====================== ==================== 26 | 27 | ch()通道函数默认类型是float,一般建议在VEX脚本中标明通道参数的具体类型。 28 | 29 | 创建通道参数 30 | 31 | chi() 32 | chf() 33 | chu() 34 | chv() 35 | chp() 36 | ch2() 37 | ch3() 38 | ch4() 39 | chs() 40 | 41 | chramp() 42 | 43 | .. code-block:: python 44 | 45 | // 0-1循环 46 | @P.y = chramp("ramp", @P.x); 47 | 48 | float px = fit(@P.x, chf("min"), chf("max"), 0, 1); 49 | @P.y = chramp("ramp", px); 50 | 51 | vector(chramp("color", fit(@P.x, -5, 5, 0, 1))); 52 | 53 | 读取通道参数 54 | 55 | chf(, 时间) 56 | 57 | # 不谈 58 | 59 | - chsraw() 60 | - chexpr() 61 | 62 | .. code-block:: python 63 | 64 | float chramp(string channel, float ramppos) 65 | float chramp(string channel, float ramppos, float time) 66 | vector chramp(string channel, float ramppos) 67 | vector chramp(string channel, float ramppos, float time) 68 | 69 | ramppos值域[0, 1],任何可以区别开来的属性都可以借这个值域去映射,比如@ptnum / (@numpt - 1.0), sin(@ptnum), rand(@ptnum)。 70 | 71 | - 创建个Geometry。 72 | - 创建个Grid,Rows>100,Columns>100。 73 | - 创建个Mountain。 74 | - 创建个Attribute Wrangle。 75 | 76 | .. code-block:: python 77 | 78 | @P.y = fit(@P.y, -0.5, 0.5, 0, chf("heights")); 79 | float ramp = chramp("ramp", fit(@P.x, -5, 5, 0, 1)); 80 | @P.y = @P.y * ramp; 81 | 82 | 通道参数不光光可以自定义,还可以直接引用别的节点的参数过来,通过具体的参数路径或者相对路径。 83 | 84 | . 当前层级 85 | 86 | .. 上一层级 87 | 88 | 参考文档: 89 | 90 | - http://www.sidefx.com/docs/houdini/ref/expression_cookbook 91 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_program_types.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini编程语言种类 3 | ============================== 4 | 5 | Houdini中编程语言的种类 6 | Python & VEX & HScript之间的区别和联系 7 | Python的优缺点 8 | VEX的优缺点 9 | Python的执行环境种类 10 | Python Shell 11 | Python Source Editor & hou.session 12 | Shelf Tools & Custom Menu 13 | 如何在工具架工具中编写Python代码 14 | 如何在自定义菜单中编写Python代码 15 | Event Handler & Startup Scripts 16 | 123.py & 456.py & onCreated.py 17 | Button Callback & HDA Scripts 18 | Python Sops & Parameter Expressions 19 | 20 | HScript, 21 | VEX, 22 | Python, 23 | Expression functions, 24 | openCL, 25 | HDK, 26 | C++ 27 | 28 | 29 | 切换场景自动与手动更新工具架工具 30 | 31 | .. code-block:: python 32 | 33 | def autoUpdate(): 34 | """ Switch current auto update status 35 | """ 36 | VIEW_UPDATE = "viewupdate %s %s.%s.world" 37 | currentDesktop = hou.ui.curDesktop() 38 | desktopName = currentDesktop.name() 39 | paneType = hou.paneTabType.SceneViewer 40 | paneTabName = currentDesktop.paneTabOfType(paneType).name() 41 | currentStatus = hou.hscript(VIEW_UPDATE % ("-c", desktopName, paneTabName)) 42 | currentStatus = str(currentStatus) 43 | currentStatus = currentStatus[:-8] 44 | currentStatus = currentStatus[+16:] 45 | 46 | if currentStatus == "always": 47 | hou.hscript(VIEW_UPDATE % ("-u never", desktopName, paneTabName)) 48 | else: 49 | hou.hscript(VIEW_UPDATE % ("-u always", desktopName, paneTabName)) 50 | 51 | 52 | Houdini Desktop设置 存储 默认启动 环境变量配置 53 | 54 | @pscale = .5; 55 | @N = rand(@ptnum); 56 | 57 | For-Each Point 58 | 59 | .. code-block:: python 60 | 61 | import os 62 | 63 | objectsPath = hou.node(".").parm("import").eval() 64 | 65 | folder = os.listdir(objectsPath) 66 | 67 | print(folder) 68 | 69 | rootNode = hou.node("../python_test") 70 | grid = rootNode.createNode("grid") 71 | wrangler = rootNode.createNode("attrbwrangle") 72 | wrangler.setInput(0, grid) 73 | 74 | switch = rootNode.create("switch") 75 | copy = rootNode.createNode("copytopoints") 76 | blockBegin = rootNode.createNode("block_begin", "begin") 77 | blockBegin 78 | 79 | blockEnd = rootNode.createNode("block_end", "end") 80 | -------------------------------------------------------------------------------- /source/p_Maya/maya_playblast_settings.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Maya如何获取拍屏面板参数? 3 | ============================== 4 | 5 | optionVar命令可以获取一些Maya选项设置的参数 6 | 7 | .. code-block:: python 8 | 9 | import maya.cmds as cmds 10 | 11 | for elem in cmds.optionVar(l=True): 12 | 13 | if "playblast" in elem.lower(): 14 | print(elem) 15 | print(cmds.optionVar(q=elem)) 16 | 17 | 通过上面的代码可以将与拍屏相关的参数筛选出来。 18 | 19 | .. code-block:: python 20 | 21 | PlayblastCmdAvi 22 | 23 | PlayblastCmdFormatAvi 24 | 25 | PlayblastCmdFormatQuicktime 26 | 27 | PlayblastCmdQuicktime 28 | 29 | optionBoxDimensionsPlayblast 30 | [546L, 350L] 31 | playblastClearCache 32 | 1 33 | playblastCompression 34 | H.264 35 | playblastDisplaySizeSource 36 | 1 37 | playblastEndTime 38 | 10.0 39 | playblastFile 40 | playblast 41 | playblastFormat 42 | qt 43 | playblastHeight 44 | 256 45 | playblastMultiCamera 46 | 0 47 | playblastOffscreen 48 | 0 49 | playblastPadding 50 | 4 51 | playblastQuality 52 | 70 53 | playblastSaveToFile 54 | 0 55 | playblastScale 56 | 0.5 57 | playblastShowOrnaments 58 | 1 59 | playblastStartTime 60 | 1.0 61 | playblastUseSequenceTime 62 | 0 63 | playblastUseStartEnd 64 | 0 65 | playblastViewerOn 66 | 1 67 | playblastWidth 68 | 256 69 | 70 | 参数与具体option的对照表 71 | 72 | ======================== =================================================== 73 | View: playblastViewerOn 74 | Show ornaments: playblastShowOrnaments 75 | Render offscreen: playblastOffscreen 76 | Multi-Camera Output: playblastMultiCamera 77 | Format: playblastFormat 78 | Encoding: playblastCompression 79 | Quality: playblastQuality 80 | Display size: playblastWidth playblastHeight 81 | Scale: playblastScale 82 | Frame padding: playblastPadding 83 | Remove temporary files: playblastClearCache 84 | Save to file: playblastSaveToFile 85 | Movie file: playblastFile 86 | ======================== =================================================== 87 | -------------------------------------------------------------------------------- /source/p_Python/python_custom_module.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Python自定义模块 3 | ============================= 4 | 5 | - 几种常见的模块导入方式 6 | - 模块导入的搜索机制sys.path 7 | - 缓存区sys.modules、pyc以及reload 8 | - 查询模块路径__file__ 9 | - 模块中__name__的作用 10 | - 模块帮助文档docstring(__doc__) 11 | 12 | 13 | 几种常见的模块导入方式 14 | 15 | Python允许开发者通过导入外部程序块的方式来扩展自己的程序,这些可以被导入(import)并使用的程序块就是模块(module) 16 | 17 | 模块的基本单元是一个.py文件,Python的包在广义上也被称为模块(module) 18 | 19 | 以内置模块datetime为例 20 | 21 | .. code-block:: python 22 | 23 | import datetime 24 | import datetime as dt 25 | print(dt.datetime.now()) 26 | from datetime import datetime 27 | print(datetime.now()) 28 | from datetime import * 29 | from datetime import datetime as ddt 30 | print(ddt.now()) 31 | 32 | 模块导入的搜索机制sys.path,模块导入搜索路径是由多个目录路径组成的列表,第一个路径默认是当前模块所在的路径,模块搜索路径 = 当前工作路径 + sys.path列表内的所有路径。 33 | 34 | - 何为环境变量PYTHONPATH? 35 | - sys.path在环境变量中起什么作用? 36 | - sys.path添加路径的两种方案以及区别? 37 | - DCC软件如何管理sys.path? 38 | 39 | .. code-block:: python 40 | 41 | import sys 42 | 43 | path in sys.path or sys.path.insert(0, path) 44 | 45 | - 缓存区sys.modules、pyc以及reload 46 | - import可以是属性方法类型,reload只能是模块 47 | - 查询模块路径__file__ 48 | 49 | __file__属性是一个Python模块隐藏的默认属性,它描述了一个模块的完整路径。 50 | 51 | - 模块中__name__的作用 52 | 53 | __name__属性是所有Python模块自带的一个隐藏属性,用于标注模块在不同执行环境下的名称。当一个模块作为主模块运行(被Python解释器直接运行)时,__name__的值是"__main__",否则,该模块的__name__属性值为此模块的名称。 54 | 55 | - 模块帮助文档docstring(__doc__) 56 | 57 | 双三引号,docstring写在什么位置? help()内置函数与docstring的关系? 58 | 59 | myFirstModule.py 60 | 61 | .. code-block:: python 62 | 63 | # -*- coding: utf-8 -*- 64 | #!/usr/bin/python 65 | 66 | """ 67 | this is a doc string 68 | """ 69 | 70 | a = 5 71 | 72 | def foo(): 73 | print("this is foo function") 74 | 75 | print("hello, this is my first module") 76 | 77 | if __name__ == "__main__": 78 | print("this string is under main") 79 | 80 | main.py 81 | 82 | .. code-block:: python 83 | 84 | # -*- coding: utf-8 -*- 85 | #!/usr/bin/python 86 | 87 | print("before import") 88 | import myFirstModule as mfm 89 | 90 | print("after import") 91 | print("my first module attr a is: ", mfm.a) 92 | print("my first module method foo is: ", mfm.foo) 93 | print(mfm.__name__) 94 | print(mfm.__file__) 95 | print(mfm.__doc__) 96 | -------------------------------------------------------------------------------- /source/p_Clarisse/clarisse_gui.rst: -------------------------------------------------------------------------------- 1 | ========================================= 2 | Clarisse Python开发界面 3 | ========================================= 4 | 5 | GUI依然是通过Python代码来实现,同样的道理也有两种方案,第一种方案是用Clarisse封装的GUI库,以Gui开头的Class,它封装的比较全面,可以一用,另一种方案就是用Python中PyQt模块。 6 | 7 | .. code-block:: python 8 | 9 | window = ix.api.GuiWindow(ix.application, 0, 0, 640, 480) 10 | window.show() 11 | while window.is_shown(): ix.application.check_for_events() 12 | 13 | .. code-block:: python 14 | 15 | class CustomButton(ix.api.GuiPushButton): 16 | def __init__(self, parent, x, y, w, h, label): 17 | ix.api.GuiPushButton.__init__(self, parent, x, y, w, h, label) 18 | self.connect(self, "EVT_ID_PUSH_BUTTON_CLICK", self.on_click) 19 | 20 | def on_click(self, sender, evtid): 21 | name = list.get_selected_item_name() 22 | 23 | if name == "Cube": 24 | ix.cmds.CreateObject("box", "GeometryBox", "Global", "project://scene") 25 | print("Created a cube success!!!") 26 | elif name == "Sphere": 27 | ix.cmds.CreateObject("sphere", "GeometrySphere", "Global", "project://scene") 28 | print("Created a sphere success!!!") 29 | 30 | if __name__ == "__main__": 31 | app_x = ix.application.get_event_window().get_position()[0] 32 | app_y = ix.application.get_event_window().get_position()[1] 33 | app_w = ix.application.get_event_window().get_width() 34 | app_h = ix.application.get_event_window().get_height() 35 | 36 | window_x = 150 37 | window_y = 30 38 | 39 | window = ix.api.GuiWindow(ix.application, 40 | app_x + (app_w - window_x) / 2, 41 | app_y + (app_h - window_y) / 2, 42 | window_x, 43 | window_y, 44 | "Create Object") 45 | 46 | list = ix.api.GuiListButton(window, 0, 0, 100, 30) 47 | list.add_item("Cube") 48 | list.add_item("Sphere") 49 | btn = CustomButton(window, 100, 0, 50, 30, "OK") 50 | 51 | window.show() 52 | 53 | while window.is_shown(): 54 | ix.application.check_for_events() 55 | 56 | .. code-block:: python 57 | 58 | for method in dir(ix.api): 59 | if "EVT_" in method: 60 | print(method) 61 | -------------------------------------------------------------------------------- /source/p_Houdini/houdini_vex_flow_control.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Houdini VEX:流控制语句 3 | ============================== 4 | 5 | - 循环语句 6 | 7 | - do statement [while (condition)] 8 | - for (init; condition; change) statement 9 | - foreach (type value; array) statement 10 | - foreach (int index, type value; array) statement 11 | - while (condition) statement 12 | 13 | .. code-block:: python 14 | 15 | int i = 0; 16 | 17 | for (float foo = 1; foo <= 128; foo *= 2, i++) { 18 | vector pos = point(0, "P", i); 19 | --pos.y; 20 | setpointattrib(0, "P", i, pos); 21 | } 22 | 23 | .. code-block:: python 24 | 25 | for (int n = 0; n < 10; n++) { 26 | addpoint(0, set(n, 0, 0)); 27 | } 28 | 29 | .. code-block:: python 30 | 31 | s@a = "andyvfx"; 32 | 33 | foreach (string s; @a) { 34 | printf("%g\n", s); 35 | } 36 | 37 | .. code-block:: python 38 | 39 | i[]@a = {10, 20, 30, 40, 50, 60}; 40 | 41 | foreach (int i; @a) { 42 | printf(itoa(i) + "\n"); 43 | } 44 | 45 | .. code-block:: python 46 | 47 | i[]@a = {10, 20, 30, 40, 50, 60}; 48 | 49 | foreach (int i; int v; @a) { 50 | printf(itoa(i) + "\n"); 51 | printf(itoa(v) + "\n"); 52 | } 53 | 54 | - 条件语句 55 | 56 | - if (condition) statement_if_true [else statement_if_false] 57 | - if (condition) statement_if_true [else if (condition) statement_if_true] else statement_if_false 58 | 59 | - break & continue & return 60 | 61 | .. code-block:: python 62 | 63 | int max(int a, b) { 64 | 65 | if (a > b) { 66 | return a; 67 | } 68 | 69 | return b; 70 | } 71 | 72 | .. code-block:: python 73 | 74 | for (int i = 0; i < sizes; i++) { 75 | mixamount += getAmount(roughness); 76 | 77 | if (mixamount > 1) { 78 | break; 79 | } 80 | } 81 | 82 | .. code-block:: python 83 | 84 | foreach (x; myarray) { 85 | 86 | if (x < 10) continue; 87 | ... 88 | } 89 | 90 | - 与或非 && || ! 91 | 92 | .. code-block:: python 93 | 94 | if (@ptnum % 2 == 0) { 95 | print("%g\n", @ptnum); 96 | } 97 | 98 | 99 | if (@ptnum % 2) { 100 | print("%g\n", @ptnum); 101 | } 102 | 103 | - 条件表达式 104 | 105 | .. code-block:: bash 106 | 107 | @Cd = @ptnum ? 1 : 0; 108 | --------------------------------------------------------------------------------