first version

This commit is contained in:
2024-09-07 09:12:14 +08:00
commit bc8cc22a9c
27 changed files with 2530 additions and 0 deletions

163
README.md Normal file
View File

@@ -0,0 +1,163 @@
# 目录结构说明
asset放一些学习资料github仓库放不下就放到网盘中去。
plugin为自建的pymol的插件开发的一些代码
scripts为一些脚本文件主要是测试代码
## pymol 资源学习绘图
[各种作用力绘图](https://proteintools.uni-bayreuth.de./)
## 环境安装
```shell
conda install -c conda-forge ffmpeg pymol-open-source biopython loguru
```
## 最高质量渲染
```shell
util.performance(0)
rebuild
```
PyMOL可以用多种方式进行录制
1. **命令行录制**: 使用`log_open``log_close`命令可以将PyMOL的命令行操作记录到文本文件。
```
cmd.log_open('filename.log')
... # Your operations
cmd.log_close()
```
2. **Ray Tracing**: 使用`ray`命令渲染高质量的图片,然后用其他软件将图片合成为视频。
3. **使用`mset`和`mview`创建动画**: 如你之前所述,通过这两个命令创建动画,然后使用`mpng`命令将动画导出为PNG帧最后用其他软件将其合成为视频。
```
cmd.mpng('frame_prefix_', 1, 60)
```
4. **屏幕录制软件**: 使用外部屏幕录制软件如OBS、Camtasia等进行录制。
5. **PyMOL API和脚本**: 使用PyMOL的Python API和PyMOL脚本可以更精细地控制录制内容。
## PyMOL工作目录
使用`cd`命令改变PyMOL的工作目录。例如
```
cmd.cd("/path/to/new/directory")
```
## 图片渲染
设置600DPI
```shell
width = int(1920 * (600 / 72))
height = int(1080 * (600 / 72))
cmd.ray(width, height)
```
得到帧1至帧60的PNG图片
```shell
cmd.mset("1 x60 61 x60")
cmd.scene('frame1', 'store')
cmd.mview('store', state=1, scene='frame1')
cmd.scene('frame2', 'store')
cmd.mview('store', state=60, scene='frame2')
cmd.mview('interpolate')
for i in range(1, 61):
cmd.frame(i)
cmd.ray(1920, 1080, 300)
cmd.mpng(f'frame_prefix_{i}.png')
```
```shell
from dataclasses import dataclass, field
from typing import Tuple
from pathlib import Path
@dataclass
class PyMOLAnimator:
resolution: Tuple[int, int] = (1920, 1080)
dpi: int = 300
frame_count: int = 120
output_dir: Path = field(default_factory=lambda: Path('./'))
def save_frames(self, scene_1: str, scene_2: str):
import pymol.cmd as cmd
# 设置动画帧数
cmd.mset(f"1 x{self.frame_count} {self.frame_count+1} x{self.frame_count}")
# 存储第一帧和最后一帧
cmd.scene(scene_1, 'store')
cmd.mview('store', state=1, scene=scene_1)
cmd.scene(scene_2, 'store')
cmd.mview('store', state=self.frame_count, scene=scene_2)
# 插值以创建动画
cmd.mview('interpolate')
output_path = self.output_dir / 'frame_prefix_'
# 保存每一帧为PNG图片
for i in range(1, self.frame_count+1):
cmd.frame(i)
cmd.ray(self.resolution[0], self.resolution[1], self.dpi)
cmd.mpng(str(output_path) + f'{i}.png')
# 使用
animator = PyMOLAnimator((1920, 1080), 300, 120, Path('/path/to/save'))
animator.save_frames('frame1', 'frame2')
```
## 场景设置
`cmd.mview`和`cmd.scene`两者都用于存储视图状态,但用途和范围有所不同:
### `cmd.mview`
- **主要用途**: 用于电影插值,在电影播放中创建平滑过渡。
- **存储内容**: 主要存储相机和对象矩阵,用于电影帧之间的插值。
- **特定于帧**: 可以为电影中的特定帧或帧范围存储视图。
- **动画专用**: 主要用于创建复杂的电影动画。
```
cmd.mview('store', state=1, scene='frame1')
```
这会在状态1下用场景名`frame1`存储当前相机和对象矩阵。
### `cmd.scene`
- **主要用途**: 存储和恢复场景,方便用户随时回到特定的视图和设置。
- **存储内容**: 存储相机视图、所有对象的活动信息、所有原子的可见性和颜色、所有的表示形式和全局帧索引。
- **不特定于帧**: 主要用于一般目的的视图保存和恢复。
```
cmd.scene('MyScene', 'store', 'This is my special scene')
```
这会存储一个名为"MyScene"的场景,并附带一条消息。