计算化学公社

 找回密码 Forget password
 注册 Register
Views: 348|回复 Reply: 5
打印 Print 上一主题 Last thread 下一主题 Next thread

[VMD] 求助:VMD如何对盒子颜色进行修改

[复制链接 Copy URL]

214

帖子

0

威望

854

eV
积分
1068

Level 4 (黑子)

跳转到指定楼层 Go to specific reply
楼主
本帖最后由 Lisy 于 2025-11-17 18:27 编辑

请问VMD中如何对盒子颜色进行修改,能把实线改成虚线吗?以及如何把渲染时候原子的轮廓黑边去掉呢

260

帖子

0

威望

631

eV
积分
891

Level 4 (黑子)

2#
发表于 Post on 2025-11-17 20:32:31 | 只看该作者 Only view this author
1. pbc box -color <颜色> -width <线宽> -style <类型>,具体各有什么值可以去看看手册
2. 不知道你说的轮廓黑边具体是什么,不过也许你可以通过更换渲染器和渲染参数或者更换材质来解决

6万

帖子

99

威望

5万

eV
积分
124668

管理员

公社社长

3#
发表于 Post on 2025-11-18 02:57:25 | 只看该作者 Only view this author
例如pbc box -color red -width 10 -style dashed:用红色、粗细为10的虚线绘制盒子

主动给出截图体现你所谓的黑边是什么意思,同时说清楚具体怎么渲染的
北京科音自然科学研究中心http://www.keinsci.com)致力于计算化学的发展和传播,长期开办极高质量的各种计算化学类培训:初级量子化学培训班中级量子化学培训班高级量子化学培训班量子化学波函数分析与Multiwfn程序培训班分子动力学与GROMACS培训班CP2K第一性原理计算培训班,内容介绍以及往届资料购买请点击相应链接查看。这些培训是计算化学从零快速入门以及进一步全面系统性提升研究水平的高速路!培训各种常见问题见《北京科音办的培训班FAQ》
欢迎加入北京科音微信公众号获取北京科音培训的最新消息,并避免错过网上有价值的计算化学文章!
欢迎加入人气极高、专业性特别强的理论与计算化学综合交流群思想家公社QQ群(群号见此链接),合计达一万多人。北京科音培训班的学员在群中可申请VIP头衔,提问将得到群主Sobereva的最优先解答。
思想家公社的门口Blog:http://sobereva.com(发布大量原创计算化学相关博文)
Multiwfn主页:http://sobereva.com/multiwfn(十分强大、极为流行的量子化学波函数分析程序)
Google Scholar:https://scholar.google.com/citations?user=tiKE0qkAAAAJ
ResearchGate:https://www.researchgate.net/profile/Tian_Lu

454

帖子

1

威望

2872

eV
积分
3346

Level 5 (御坂)

4#
发表于 Post on 2025-11-18 08:33:38 | 只看该作者 Only view this author
顺便分享一个脚本
  1. #! /usr/bin/env tclsh

  2. proc get_box_vec {} {
  3.     global a b c alpha beta gamma a_vec b_vec c_vec
  4.     global pi pi_4 cos_alpha cos_beta cos_gamma sin_gamma

  5.     if {! [info exist pi  ]} {set pi   [expr 4.*atan2(1.,1.)]}
  6.     if {! [info exist pi_4]} {set pi_4 [expr    atan2(1.,1.)]}

  7.     if {! [info exist a]} {set a [molinfo top get a]}
  8.     if {! [info exist b]} {set b [molinfo top get b]}
  9.     if {! [info exist c]} {set c [molinfo top get c]}
  10.     if {! [info exist alpha]} {set alpha [molinfo top get alpha]}
  11.     if {! [info exist beta ]} {set beta  [molinfo top get beta ]}
  12.     if {! [info exist gamma]} {set gamma [molinfo top get gamma]}

  13.     if {! [info exist cos_alpha]} {set cos_alpha [expr cos($alpha/45.*$pi_4)]}
  14.     if {! [info exist cos_beta ]} {set cos_beta  [expr cos($beta /45.*$pi_4)]}
  15.     if {! [info exist cos_gamma]} {set cos_gamma [expr cos($gamma/45.*$pi_4)]}
  16.     if {! [info exist sin_gamma]} {set sin_gamma [expr sin($gamma/45.*$pi_4)]}

  17.     if {! [info exist a_vec]} {set a_vec [list $a 0. 0.]}
  18.     if {! [info exist b_vec]} {
  19.         set b_vec [list [expr $b*$cos_gamma] [expr $b*$sin_gamma] 0.]
  20.     }
  21.     if {! [info exist c_vec]} {
  22.         set c_vec [vecscale [list $cos_beta \
  23.         [expr ($cos_alpha-$cos_beta*$cos_gamma)/$sin_gamma] \
  24.         [expr sqrt(1.+2.*$cos_alpha*$cos_beta*$cos_gamma-$cos_alpha**2-$cos_beta**2-$cos_gamma**2)/$sin_gamma]] \
  25.         $c]
  26.     }

  27.     return
  28. }

  29. proc move_mol {molid direction {id {top}}} {
  30.     # molid counts from 1
  31.     global a_vec b_vec c_vec

  32.     get_box_vec

  33.     set sel [atomselect $id "fragment [expr $molid - 1]"]

  34.     if       {[string compare $direction {+a}] == 0} {
  35.         $sel moveby $a_vec
  36.     } elseif {[string compare $direction {-a}] == 0} {
  37.         $sel moveby [vecinvert $a_vec]
  38.     } elseif {[string compare $direction {+b}] == 0} {
  39.         $sel moveby $b_vec
  40.     } elseif {[string compare $direction {-b}] == 0} {
  41.         $sel moveby [vecinvert $b_vec]
  42.     } elseif {[string compare $direction {+c}] == 0} {
  43.         $sel moveby $c_vec
  44.     } elseif {[string compare $direction {-c}] == 0} {
  45.         $sel moveby [vecinvert $c_vec]
  46.     } else {
  47.         puts stderr "invalid direction: $direction"
  48.         return
  49.     }

  50.     set tmp {}
  51.     return
  52. }

  53. proc draw_3d_box {{also_draw_arrow 1}} {
  54.     global a_vec b_vec c_vec

  55.     get_box_vec

  56.     set line_width 2
  57.     set arrow_resolution 25
  58.     set arrow_width 0.6
  59.     set arrow_length [expr 1. - .1]

  60.     draw color red
  61.     set point_beg [veczero]
  62.     set point_end [vecadd $point_beg $a_vec]
  63.     draw line $point_beg $point_end width $line_width
  64.     set point_beg [vecadd $point_beg $b_vec]
  65.     set point_end [vecadd $point_end $b_vec]
  66.     draw line $point_beg $point_end width $line_width
  67.     set point_beg [vecadd $point_beg $c_vec]
  68.     set point_end [vecadd $point_end $c_vec]
  69.     draw line $point_beg $point_end width $line_width
  70.     set point_beg [vecsub $point_beg $b_vec]
  71.     set point_end [vecsub $point_end $b_vec]
  72.     draw line $point_beg $point_end width $line_width
  73.     if {$also_draw_arrow} {
  74.         set point_beg [vecscale $a_vec $arrow_length]
  75.         set point_end $a_vec
  76.         draw cone $point_beg $point_end radius $arrow_width resolution $arrow_resolution
  77.     }

  78.     draw color green
  79.     set point_beg [veczero]
  80.     set point_end [vecadd $point_beg $b_vec]
  81.     draw line $point_beg $point_end width $line_width
  82.     set point_beg [vecadd $point_beg $c_vec]
  83.     set point_end [vecadd $point_end $c_vec]
  84.     draw line $point_beg $point_end width $line_width
  85.     set point_beg [vecadd $point_beg $a_vec]
  86.     set point_end [vecadd $point_end $a_vec]
  87.     draw line $point_beg $point_end width $line_width
  88.     set point_beg [vecsub $point_beg $c_vec]
  89.     set point_end [vecsub $point_end $c_vec]
  90.     draw line $point_beg $point_end width $line_width
  91.     if {$also_draw_arrow} {
  92.         set point_beg [vecscale $b_vec $arrow_length]
  93.         set point_end $b_vec
  94.         draw cone $point_beg $point_end radius $arrow_width resolution $arrow_resolution
  95.     }

  96.     draw color blue
  97.     set point_beg [veczero]
  98.     set point_end [vecadd $point_beg $c_vec]
  99.     draw line $point_beg $point_end width $line_width
  100.     set point_beg [vecadd $point_beg $a_vec]
  101.     set point_end [vecadd $point_end $a_vec]
  102.     draw line $point_beg $point_end width $line_width
  103.     set point_beg [vecadd $point_beg $b_vec]
  104.     set point_end [vecadd $point_end $b_vec]
  105.     draw line $point_beg $point_end width $line_width
  106.     set point_beg [vecsub $point_beg $a_vec]
  107.     set point_end [vecsub $point_end $a_vec]
  108.     draw line $point_beg $point_end width $line_width
  109.     if {$also_draw_arrow} {
  110.         set point_beg [vecscale $c_vec $arrow_length]
  111.         set point_end $c_vec
  112.         draw cone $point_beg $point_end radius $arrow_width resolution $arrow_resolution
  113.     }

  114.     draw color black
  115.     set tmp {}
  116.     return
  117. }

  118. proc draw_box_directions {{point_beg {0 0 0}}} {
  119.     global cos_alpha cos_beta cos_gamma sin_gamma
  120.     global a_vec_normed b_vec_normed c_vec_normed

  121.     set line_length 2.0
  122.     set line_width 6
  123.     set axis_width 0.3
  124.     set arrow_resolution 25
  125.     set arrow_width 0.6
  126.     set arrow_length 1.0

  127.     get_box_vec

  128.     if {! [info exist a_vec_normed]} {set a_vec_normed [list 1. 0. 0.]}
  129.     if {! [info exist b_vec_normed]} {set b_vec_normed [list $cos_gamma $sin_gamma 0.]}
  130.     if {! [info exist c_vec_normed]} {set c_vec_normed [list $cos_beta \
  131.         [expr ($cos_alpha-$cos_beta*$cos_gamma)/$sin_gamma] \
  132.         [expr sqrt(1.+2.*$cos_alpha*$cos_beta*$cos_gamma-$cos_alpha**2-$cos_beta**2-$cos_gamma**2)/$sin_gamma]]}

  133.     draw color red
  134.     set point_end [vecadd $point_beg [vecscale $a_vec_normed $line_length]]
  135.     set point_end2 [vecadd $point_beg [vecscale $a_vec_normed [expr $line_length+$arrow_length]]]
  136.     # draw line $point_beg $point_end width $line_width
  137.     draw cylinder $point_beg $point_end radius $axis_width filled yes resolution $arrow_resolution
  138.     draw cone $point_end $point_end2 radius $arrow_width resolution $arrow_resolution

  139.     draw color green
  140.     set point_end [vecadd $point_beg [vecscale $b_vec_normed $line_length]]
  141.     set point_end2 [vecadd $point_beg [vecscale $b_vec_normed [expr $line_length+$arrow_length]]]
  142.     # draw line $point_beg $point_end width $line_width
  143.     draw cylinder $point_beg $point_end radius $axis_width filled yes resolution $arrow_resolution
  144.     draw cone $point_end $point_end2 radius $arrow_width resolution $arrow_resolution

  145.     draw color blue
  146.     set point_end [vecadd $point_beg [vecscale $c_vec_normed $line_length]]
  147.     set point_end2 [vecadd $point_beg [vecscale $c_vec_normed [expr $line_length+$arrow_length]]]
  148.     # draw line $point_beg $point_end width $line_width
  149.     draw cylinder $point_beg $point_end radius $axis_width filled yes resolution $arrow_resolution
  150.     draw cone $point_end $point_end2 radius $arrow_width resolution $arrow_resolution

  151.     draw color black
  152.     set tmp {}

  153.     return
  154. }

  155. proc clear_box {} {
  156.     # draw delete all
  157.     set nsystems [molinfo top]
  158.     for {set i 0} {$i <= $nsystems} {incr i} {
  159.         graphics $i delete all
  160.     }
  161.     set tmp {}
  162.     return
  163. }
复制代码

保存为draw_box.tcl,VMD启动时候用vmd -e draw_box.tcl或者启动后source {/path/to/draw_box.tcl},然后draw_3d_box 0命令可以画出类似GaussView那种a b c轴方向别用红绿蓝画出的盒子图形。如果要加上三个正方向标志,删掉后面的0。如果要指示出abc三个方向,可以用draw_box_directions命令,后面接{px py pz}更改这个坐标轴出现的位置。clear_box命令清除绘画。

1208

帖子

6

威望

2430

eV
积分
3758

Level 5 (御坂)

傻傻的木瓜

5#
发表于 Post on 2025-11-19 17:15:27 | 只看该作者 Only view this author
snljty2 发表于 2025-11-18 08:33
顺便分享一个脚本

保存为draw_box.tcl,VMD启动时候用vmd -e draw_box.tcl或者启动后source {/path/to/d ...

您写的VMD脚本比我在楼主另一帖里写的强多了……想请教几个小问题:
1. 我知道脚本首行的shebang语法可以指定在Linux系统的命令行里直接执行时用的shell/解释器,但对已经集成了tcl解释器的VMD程序,还写第一行#! /usr/bin/env tclsh有什么作用呢?常用的Windows平台VMD 1.9.3官方发行没有内置python解释器,是不是自行编译了VMD添加python解释器支持后,所有VMD脚本都需要shebang指定用tcl或python才能正确识别语言类型?
2. 每个函数结尾set tmp {}和return这两行的作用是什么?
3. move_mol函数里的一大串if-elseif-else比较字符串为何不用tcl原生的switch来写呢?
√546=23.36664289109

454

帖子

1

威望

2872

eV
积分
3346

Level 5 (御坂)

6#
发表于 Post on 2025-11-19 17:52:35 | 只看该作者 Only view this author
本帖最后由 snljty2 于 2025-12-3 10:08 编辑
Uus/pMeC6H4-/キ 发表于 2025-11-19 17:15
您写的VMD脚本比我在楼主另一帖里写的强多了……想请教几个小问题:
1. 我知道脚本首行的shebang语法可 ...

没有没有,我这个写的也不太好,是为了配合另一个脚本实现一些目的的...

1. 没有作用,就是强迫症...
  1. set mols_seq [list]

  2. proc new_mol {{molid 1}} {
  3.     global jobname backbone_indices mol_color_list mols_seq
  4.     mol new "$jobname"
  5.     mol modstyle 0 top Licorice 0.2 25 25
  6.     lappend mols_seq $molid
  7.     set molid0 [expr $molid - 1]
  8.     mol modcolor 0 top ColorID [lindex $mol_color_list $molid0]
  9.     mol modselect 0 top "fragment $molid0 and serial $backbone_indices"
  10.     return
  11. }

  12. proc new_group {} {
  13.     global jobname backbone_indices mol_color_list
  14.     clear_box
  15.     set num_mols [llength $mol_color_list]
  16.     for {set molid 1} {$molid <= $num_mols} {incr molid} {
  17.         new_mol $molid
  18.     }
  19.     draw_3d_box
  20.     return
  21. }

  22. proc move_sys {sysid direction} {
  23.     global mols_seq
  24.     set num_sys [llength $mols_seq]
  25.     set sysid0 [expr $sysid - 1]
  26.     set molid [lindex $mols_seq $sysid0]
  27.     move_mol $molid $direction $sysid0
  28.     return
  29. }
复制代码


2. return没啥意义,个人习惯。函数里面set tmp {}好像没啥用,但是全局的set tmp {}是为了让上一个变量别打印出来,不然屏幕上多一堆东西不好看。这个脚本写的比较早,那时候我也不是太熟悉,不好意思哈

3. 确实可以,我当时忘了...

评分 Rate

参与人数
Participants 1
eV +1 收起 理由
Reason
Uus/pMeC6H4-/キ + 1 看来我想多了233

查看全部评分 View all ratings

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2026-1-23 20:34 , Processed in 0.378484 second(s), 21 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list