BlenderCN论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1033|回复: 0

[请教]如何让物体数值修改后在场景中即时刷新

[复制链接]
发表于 2015-6-19 12:08:18 | 显示全部楼层 |阅读模式
本帖最后由 imdjs 于 2015-6-19 12:08 编辑

我用py 导入用bl源码编译的dll动态库实现修改物体数据的目的,目前基本可以实现修改,但修改后还不能即时在场景里看到结果,还要手动刷新才行.
因为如果引用了源码里的函数,编译后的dll有60多mb大,于是我现在用的方法是,先把需要用到的函数用类成员打包并编译成一个dll公共库.然后用另外一个
dll导入这个公共库里的函数,第二个dll编译后体积比较小只有几百kb,这个dll就是我所有功能的实现,最后用py导入第二个dll库实现修改物体数据的目的.

在这里我先简单说说如何编译那个公共库:
先用源码生成blender,然后在E:\blender\SRC\build\lib\Release  里会生成很多个lib的静态库,里包含bl里的所有函数的实现,然后我再用静态库的方式,导出里面
我需要用到的函数,并编译成公共库dll.
在这里我直接用notepad++ 加上exec插件用命令行生成这个公共库:
以下是notepad++里的命令行
  1. SET B_=B:
  2. SET local VCBASE=E:\Microsoft Visual Studio 12.0
  3. SET local VCDIR = $(VCBASE)\VC
  4. SET local VSCOMMON = $(VCBASE)\Common7\IDE
  5. SET local MSSDK = E:\Microsoft SDKs\Windows\v7.1A
  6. ENV_SET PATH = $(VCDIR)\bin\amd64;$(MSSDK)\bin\x64;$(VSCOMMON);$(SYS.PATH)
  7. ENV_SET INCLUDE = $(MSSDK)\include;$(VCDIR)\include;$(SYS.INCLUDE)
  8. ENV_SET LIB = $(MSSDK)\lib\x64;$(VCDIR)\lib\x64;$(SYS.LIB)
  9. SET local OBJ = $(B_)\$(NAME_PART)

  10. SET dy ="glu32.lib" "opengl32.lib" "ws2_32.lib" "vfw32.lib" "winmm.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "comdlg32.lib" "advapi32.lib" "shfolder.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "psapi.lib" "Dbghelp.lib" "imm32.lib"  
  11. // "Nafxcwd.lib"   "Libcmtd.lib" "nafxcw.lib"  "libcmt.lib"
  12. SET dy2 ="OpenGL32.Lib "

  13. SET i1 ="E:\blender\SRC\build\source\creator"
  14. SET i2 ="E:\blender\SRC\blender\intern\cycles\util"
  15. SET i3 ="E:\Microsoft Visual Studio 12.0\VC\Microsoft SDKs\Windows\v7.1A\Include"
  16. SET i4 ="E:\blender\SRC\lib\win64_vc12\opencollada\include\opencollada\COLLADABaseUtils"
  17. SET i5 ="E:\blender\SRC\blender\source\blender\avi"
  18. SET i6 ="E:\blender\SRC\lib\win64_vc12\jpeg\include"
  19. // 以下的  include  可能不是必要的
  20. SET i7="E:\blender\SRC\blender\source\blender\freestyle"
  21. SET i8 ="E:\blender\SRC\blender\source\gameengine\BlenderRoutines"
  22. SET i9 ="E:\blender\SRC\blender\source\blender\python"
  23. SET i10 ="E:\blender\SRC\blender\intern\cycles\blender"
  24. SET i11 ="E:\blender\SRC\blender\extern\libmv"
  25. SET i12 ="E:\blender\SRC\blender\intern\utfconv"
  26. SET i13 ="E:\blender\SRC\blender\extern\glew\include"
  27. SET i14 ="E:\blender\SRC\blender\source\blender\imbuf"
  28. SET i15 ="E:\blender\SRC\blender\intern\glew-mx"
  29. SET i16 ="E:\Microsoft Visual Studio 12.0\VC\MyFunc"
  30. //-------------------------------------------------------------------------
  31. SET lib0="E:\blender\SRC\lib\win64_vc12"
  32. SET lib1="E:\Microsoft Visual Studio 12.0\VC\lib\amd64"
  33. SET lib2="E:\Microsoft Visual Studio 12.0\VC\Microsoft SDKs\Windows\v7.1A\Lib\x64"

  34. SET d0="BUILD_PLATFORM="Windows""
  35. SET d1="BUILD_TYPE="""
  36. SET d2="BUILD_CFLAGS="
  37. SET d3="BUILD_LINKFLAGS="
  38. SET d4="CMAKE_INTDIR="Release""

  39. SET pdb="E:/blender/SRC/build/bin/Release/blender-app.pdb"
  40. //SET implib="E:/blender/SRC/build/bin/Release/blender-app.lib"
  41. SET pgd="E:\blender\SRC\build\bin\Release\blender-app.pgd"

  42. ///Fd"bf_avi.dir\Release\vc120.pdb" /Fp"bf_avi.dir\Release\bf_avi.pch"/D $(d32)  /D $(d33)  /D $(d34)   /D $(d35)  /D $(d36)  /D $(d1)  /D $(d2)  /D$(d3) /D $(d4)  /D $(d5) /D $(d6)  /D $(d7)   /D $(d8)  /D $(d9)  /D  $(d10) /D $(d11)  /D $(d12) /D $(d13)  /D $(d14) /D $(d15)   /D $(d16)   /D $(d17)  /D $(d18)  /D $(d19)  /D $(d20)  /D $(d21)  /D $(d22) /D $(d23)  /D $(d24) /D $(d25)  /D $(d26)  /D $(d27)  /D $(d28)  /D $(d29)  /D $(d30)

  43. cmd /k chdir /d $(CURRENT_DIRECTORY)   &cl  $(FILE_NAME)  /MP /GS /TP  /Zc:wchar_t       /W3 /w34062 /wd4018 /wd4065 /wd4127 /wd4181 /wd4200 /wd4244 /wd4267 /wd4305 /wd4800 /we4013 /we4431   /EHsc    /I $(i1)   /I $(i2) /I $(i3)  /I $(i4)   /I $(i5)   /I $(i6)     /I $(i7)   /I $(i8) /I $(i9)  /I $(i10)   /I $(i11)   /I $(i12)  /I $(i13)   /I $(i14)   /I $(i15)    /I $(i16)      /D $(d0)  /D $(d1)  /D $(d2)  /D $(d3)   /D $(d4)     /Fo:$(OBJ).obj  /c  &EXIT
  44. ///Fa"Release/" /we"4013" /we"4431"    /W3 /wd"4018" /wd"4065" /wd"4127" /wd"4181" /wd"4200" /wd"4244" /wd"4267" /wd"4305" /wd"4800"   /Gm- /O2 /Ob2 /fp:precise   /errorReport:prompt /WX- /Zc:forScope /Gd /J /MT /openmp /nologo  
  45. // /O1创建小代码
  46. cmd /k chdir /d $(B_)   &link  /LIBPATH:$(lib0) /LIBPATH:$(lib1)  /LIBPATH:$(lib2)     /DYNAMICBASE $(dy) $(dy2)    /NODEFAULTLIB:msvcrt.lib  /NODEFAULTLIB:msvcmrt.lib  /NODEFAULTLIB:msvcurt.lib  /NODEFAULTLIB:msvcrtd.lib       /SUBSYSTEM:WINDOWS  /MACHINE:X64      /DLL    "$(NAME_PART)".obj   /OUT:$(B_)\$(NAME_PART)64.dll   &EXIT
复制代码
还要加上必要的include 头文件

并设置后环境变量后就可以编译成dll,并伴随生成一个lib文件,(可能要修改一些源码才能成功通过编译,)这个公共库我暂名为blenderTest64.dll,这个公共库要放在
blender文件夹的目录下,我目前还找不到方法可以让它放到自定义目录下.
然后编译第二个dll,这个dll要依赖前一个公共库dll的函数接口头文件,与它的lib,才能通过编译.第二个dll可以放到addons的里的py目录下
这是源码
http://yunpan.cn/cQd2hs9wMdjDM  访问密码 da72
----------------------------------------------------------------------------------------------------------------------------------------------------
先讨论一下这个简单的 把一个物体矩阵赋给另一个物体的例子
MATH*mathG;
OBJECT*objectG;
CONTEXT* contextG;

EXC void FUNC移动物体(bContext*C,  Object * o,Object * o结果)
    {
    //Scene *scene = CTX_data_scene(C);
    //printf("context=%s\n",C->data.scene->id.name);Scene *scene = contextG->CTX_data_scene(C);
    objectG->BKE_object_apply_mat4(o结果,o->obmat,false ,false );//实现物体间矩阵的赋值

    //contextG->DAG_id_tag_update(&o结果->id, OB_RECALC_OB);//出错!!!
    //WM_main_add_notifier我的(NC_OBJECT | ND_TRANSFORM, o结果);
    //contextG->WM_main_add_notifier(NC_OBJECT | ND_DRAW, o结果);
    //contextG->WM_main_add_notifier(NC_OBJECT | ND_TRANSFORM, o结果);
    //WM_event_add_notifier(BPy_GetContext(), NC_OBJECT | ND_TRANSFORM, NULL);//可能要用这个刷新
   
    /*   
    contextG->WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL);//可能要用这个刷新
    contextG->WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, o结果);//可能要用这个刷新
    //WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, scene);//可能要用这个刷新
    contextG->WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, o结果);
    contextG->WM_event_add_notifier(C, NC_OBJECT | ND_DRAW,contextG->CTX_wm_view3d(C));   
    contextG->WM_event_add_notifier(C, NC_OBJECT | ND_DATA, o结果);   
    printf("ADD WM_event_add_notifier\n");   

    contextG->WM_event_add_notifier(C, NC_WINDOW, NULL);
   
   
    //View3D *v3d = (View3D &)contextG->CTX_wm_view3d(C);
    contextG->WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D,contextG->CTX_wm_view3d(C));
   
    contextG->WM_event_add_notifier(C, NC_SCENE | NA_EDITED, scene);
    contextG->WM_event_add_notifier(C, NC_SCENE | ND_LAYER_CONTENT,scene);
    contextG->WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE,scene);
    contextG->WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT,scene);   
   
    contextG->WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_MODE_OBJECT, scene);
    contextG->WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_EDITMODE_MESH, scene);   
    contextG->WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_EDITMODE_ARMATURE, scene);   
   
    contextG->WM_event_add_notifier(C, NC_GEOM | ND_VERTEX_GROUP,o结果->data);
    */
    }


在场景里选定两个物体然后运行这个函数,的确是把一个物体的矩阵赋给了另一个,但不能即时刷新看到结果,要手动按一下g,才看到.
(那些被注释的行是我的试验,但并不能成功刷新场景)
我想知道应该要加入什么代码才能实现像py  的operator那种一赋予值就立刻刷新的功能.



























您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Blender最新中文教学视频|Blender头条|小黑屋|手机版|Archiver|Blender中国 ( 蜀ICP备17002929号 )360网站安全检测平台

GMT+8, 2019-9-24 00:51 , Processed in 0.025742 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表