计算化学公社

标题: 让Windows和Linux下的Multiwfn图形界面初步支持鼠标拖拽旋转分子 [打印本页]

作者
Author:
liuyuje714    时间: 2025-4-13 23:06
标题: 让Windows和Linux下的Multiwfn图形界面初步支持鼠标拖拽旋转分子
本帖最后由 liuyuje714 于 2025-5-23 02:10 编辑




更新(2025.05.23):已经支持Linux系统下的鼠标拖拽分子,尝鲜版本点击下载:Multiwfn_3.8_dev_Linux_x64_2025.05.22 (依靠Centos 8静态编译,应该适用于大多数Linux系统)
由于X11和Win32有底层的差异,目前这个Linux版本旋转操作如下:
每次进行拖拽旋转的时候必须先点击一下图形区域,光标变成手形,代表可以进行左键按压旋转,然后再次点击并拖拽,此过程中光标为exchange形状就可以旋转了。因为Linux下底层是采用的X11,没有Win32那么好用,详情可以自行查看mouserotate.f90中的代码部分:

需要编译自行编译的可按照此链接说明:https://github.com/liuyujie714/Multiwfn_compile

开发寄语:是不是可以把`isys`判定系统类型并call的也用于Linux系统呢,好像在此之前添加一个call reawgt就可以了,不需要每次都要点击任意按钮来显示出图形。




尝试让Multiwfn的GUI分子界面支持鼠标左键拖拽旋转分子。
Multiwfn目前并不支持鼠标拖拽旋转分子操作,主要和Dislin库有关,没有直接支持。但是可以让它间接支持,我尝试注入一个Win32的鼠标事件接口,让这个操作成为可能。
目前只针对Windows系统,intel fortran编译器直接结合它自带的ifwin模块,如果是Mingw下gfortran编译器则直接使用C binding的方式,


基本用法:直接下载mouserotate.f90源文件,将其添加到最新Multiwfn的源码文件夹中,然后针对Multiwfn中特定的GUI界面函数添加一个回调,比如给GUI.f90中的subroutine drawmolgui 添加一个回调:
  1. use mouse_rotate_mod
复制代码
  1. call swgcbk(idisgraph, mouse_rotate)
复制代码


意思就是当鼠标左键单击分子界面矩形区域的时候,进行对应的鼠标事件响应。
(, 下载次数 Times of downloads: 77)

最后编译源码即可,比如我这有个编译好的最新Multiwfn可以测试效果,只添加了上面这个界面的,因为Multiwfn的GUI有很多种,完全实现应该考虑多种GUI中修改和添加。
另外有个小问题就是当这个GUI被其他程序窗口顶层覆盖的时候再想激活旋转需要先鼠标左键在矩形区域点击两次,因为需要先捕获界面。

嘿嘿






作者
Author:
sobereva    时间: 2025-4-14 01:49

效果非常好!可以说是解决了一个大问题

最近我刚好在DISLIN的邮件列表里看到有人讨论这个问题https://groups.google.com/g/dislin-users/c/LVCqRtpJ-_Y,也正考虑能不能弄到Multiwfn里

你的这个patch我近期等有时间的时候会弄到官方版里。
作者
Author:
yygong    时间: 2025-4-14 08:37
效果真不错,赞!
作者
Author:
snljty2    时间: 2025-4-14 09:07
您好,我这边在AMD的Zen2 CPU上运行有个报错
  1. Please verify that both the operating system and the processor support Intel(R) X87, CMOV, MMX, FXSAVE, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, MOVBE, POPCNT, AVX, F16C, FMA, BMI, LZCNT and AVX2 instructions.
复制代码
,请问是不是跟编译时候的优化指令有关呢?谢谢!
作者
Author:
liuyuje714    时间: 2025-4-14 09:09
本帖最后由 liuyuje714 于 2025-4-14 12:30 编辑
snljty2 发表于 2025-4-14 09:07
您好,我这边在AMD的Zen2 CPU上运行有个报错,请问是不是跟编译时候的优化指令有关呢?谢谢!

我这个开了avx2,估计是QxCORE-AVX2导致的。我更新了一下,用了SSE4.2,你试试看行不行
作者
Author:
snljty2    时间: 2025-4-14 16:54
liuyuje714 发表于 2025-4-14 09:09
我这个开了avx2,估计是QxCORE-AVX2导致的。我更新了一下,用了SSE4.2,你试试看行不行

您好,还是一样的报错诶
作者
Author:
liuyuje714    时间: 2025-4-14 20:51
snljty2 发表于 2025-4-14 16:54
您好,还是一样的报错诶

现在可以了,测试了amd的U
作者
Author:
snljty2    时间: 2025-4-15 08:58
liuyuje714 发表于 2025-4-14 20:51
现在可以了,测试了amd的U

收到,谢谢老师!
作者
Author:
sobereva    时间: 2025-4-26 21:48
我已将此代码植入了Multiwfn官方版,详见
http://bbs.keinsci.com/thread-53146-1-1.html
作者
Author:
liuyuje714    时间: 2025-5-23 02:11
update 2025.5.23,初步支持Linux系统,见一楼更新日志。
作者
Author:
sobereva    时间: 2025-5-23 08:54
我有时间把linux的补丁也弄到官方版里

“开发寄语:是不是可以把`isys`判定系统类型并call的也用于Linux系统呢,好像在此之前添加一个call reawgt就可以了,不需要每次都要点击任意按钮来显示出图形。”  我不清楚意思,我试了没成功

作者
Author:
liuyuje714    时间: 2025-5-23 13:11
sobereva 发表于 2025-5-23 08:54
我有时间把linux的补丁也弄到官方版里

“开发寄语:是不是可以把`isys`判定系统类型并call的也用于Linux ...

比如drawmol子程序中的:
  1. call swgtyp("HORI","SCALE") !Reset the default mode for list widget
  2. idrawisosur=0 !Don't draw the cubmat in memory at first time go into the GUI
  3. if (isys==1) call drawmol !Directly show image in Windows GUI
  4. !However, in linux, "draw" widget is available only after WGFIN subroutine so we need a mouse event to active it, before this, the draw widget cannot be used, this is why "if (isys==1)"
  5. CALL WGFIN
复制代码
改成:
  1. call swgtyp("HORI","SCALE") !Reset the default mode for list widget
  2. idrawisosur=0 !Don't draw the cubmat in memory at first time go into the GUI
  3. call reawgt
  4. call drawmol !Directly show image in Windows GUI
  5. !However, in linux, "draw" widget is available only after WGFIN subroutine so we need a mouse event to active it, before this, the draw widget cannot be used, this is why "if (isys==1)"
  6. CALL WGFIN
复制代码



作者
Author:
sobereva    时间: 2025-5-24 06:43
liuyuje714 发表于 2025-5-23 13:11
比如drawmol子程序中的:
改成:

成功了。下次更新时会引入
作者
Author:
sobereva    时间: 2025-6-4 00:20
Linux版对鼠标旋转操作的支持今日也纳入Multiwfn官方版了
为了能让noGUI版顺利编译,对Makefile做了很多调整





欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3