AlgebraMaster

Modern C++ 创造非凡 . 改变世界

导航

NODE BASED PROCEDURAL TASK :: VVGRAPH

特性:

1,随时查看节点的内部定义

2,类houdini的local variable/global variable功能

3,支持界面表达式paramexpression,方便引用其他节点界面值

4,随时查看节点里面的流动的attributes

5,支持用bash语法访问全局环境变量,局部变量

6,后台 支持覆盖节点参数值,支持多节点执行,支持添加环境变量

7,类Houdini bypass, current

8,暴露一部分API,方便操作graph node scene

9,完全分离运行线程,进程分离

10,快捷键大部分参考Houdini/Katana的风格来,按Y键断开链接,按e/p 显示节点参数界面,tab键创建节点

11,插件结构

12,cached network

13,plugin API超级友好

14,轻量级

 

 

LOGIC:

 

 

 

 

 

RELEASE 0.01:

KATANA WINDOWS:

 

 Ubuntu:

KATANA LINUX

 

 一个测试FFMPEG (先合成序列,转成微信支持得编码)

 

 exrs to video

 /mnt/lagrange_proj/course/WaterFlood/comp/V006

有需要我联系方式的WECHAT/QQ:617207388

 

--------------------------------------------- WIP ------------------------------------------------------

 

 

-----NODE BASED  PROCEDURAL TASK-----

 

以前写过好多次,但是都没写完....主要是节点树的执行过程.这次打算好好写完。

这次目的是写一个 类似houdini sop下的 管理过程

目的是把大量流程中的杂乱比如后台处理,Arnold->Render->ffmepg合成视频等等 基于任务的东东,放到节点平台,这样可以完整的procedural the task

而且数据从左到右流动.节点树递归反向分析,等待退栈建立正确的节点执行顺序.去重建立节点缓存。

 

可以观看视频演示:Rlease v0.01 : https://vimeo.com/316527592  

 

 

WIP_01:

 

 

 

 

 

WIP_02:初步实现tabview,还有点击tab键创建节点。

1,看这个tab键出来的选择创建节点的面板,完全按照Houdini的设计方式,

从Factory里读到节点的描述,真正点击的时候才创建真正的UI节点和他的delegate节点。

2,在Python中factory完全就是个list,根本就不用创建什么复杂的类型,里面直接塞N个{节点描述字典},

也可以直接全部创建为字典描述,不过 这样节点注册的完  工厂里的节点描述 是没顺序的。

 

 

 

支持像Nuke 一样的快捷键D: 把节点bypass/ on the fly 查看节点的所有核心属性

 

 Sticky Node: TODO:Fix the focus event......

修复focus event, 当你在打字的时候请别影响别的选择的Node.......

 

 

 

 

 WIP: dot 节点仅仅只连接

 

 

化繁去简,节点参数界面简单映射:

 

 

 

Production Ready:

 

一套自定义的command 创建模块:

比如CMDStart节点:

# A cmd start engine
class CmdStart(Stream_Node):
    def __init__(self):
        super(CmdStart, self).__init__()
        self.outputPortColor = [30, 255, 150]
        self.color = [170, 255, 200]
        self.haveInput = False
        self.haveOutput = True

        self.appendAttributeMapping('executable')
        self.appendAttributeMapping('args')

    def cookMyNode(self):
        exec_path = self.evalParam('executable')
        self.gdp.addAttribute('executable', exec_path)
        self.gdp.addAttribute('args', [])
        Message("Create Attribute:>>%s<< in the node%s, the excutable is:%s" % ("executable",self.name, exec_path))

    @staticmethod
    def creator():
        return CmdStart()


CmdStartSignal = {}
CmdStartSignal['name'] = 'UniversalCommandStart'
CmdStartSignal['typeName'] = 'CMDStart'
CmdStartSignal['creator'] = CmdStart.creator
CmdStartSignal['paramsContainer'] = CmdStartParams
CmdStartSignal['flavor'] = 'Universal Command'
CmdStartSignal['context'] = 0x01


# EXPORT ALL PLUGINS
EXPORTS_PLUGINS = [CmdStartSignal,
                   CmdEndSignal,
                   BuildingArgChainSignal,
                   BuildingDopArgChainSignal,
                   AppendDopArgChainSignal,
                   IOWriteTextSignal,
                   IOReadTextSignal]

 CMDEnd:

class CmdEnd(Stream_Node):
    def __init__(self):
        super(CmdEnd, self).__init__()
        self.outputPortColor = [30, 255, 150]
        self.color = [170, 255, 200]
        self.haveInput = True
        self.haveOutput = False
        self.appendAttributeMapping('executable')
        self.appendAttributeMapping('args')

    def cookMyNode(self):
        self.copyInput()
        exec = self.gdp.getAttributeValue('executable')
        args = self.gdp.getAttributeValue('args')
        for arg in args:
            exec += (" " + arg)
        Message("building command line is :%s"%(exec))
        os.system(exec)

    @staticmethod
    def creator():
        return CmdEnd()

CmdEndSignal = {}
CmdEndSignal['name'] = 'UniversalCommandEnd'
CmdEndSignal['typeName'] = 'CMDEnd'
CmdEndSignal['creator'] = CmdEnd.creator
CmdEndSignal['paramsContainer'] = None
CmdEndSignal['flavor'] = 'Universal Command'
CmdEndSignal['context'] = 0x01

 

 

Bug Fix, QProcess replace the os.system()

描述katana后台

 

 

Add JIT Support

 

发现一个致命的问题,如果要在python中使用QProcess 显示正确的进程消息:因为QByteArray->不能直接decode.不如QString方便.可是python没这个玩意啊

可以使用:

def printStdOut():
    readSize = self.bytesAvailable()
    readData = self.read(readSize)
# 也可以未decode('cp936')
print(readData.data().decode('gb2312'))

 直接显示正确.... 

 

Finally: 

例如ping -t 127.0.0.1

 

无敌的后台:

 

posted on 2018-11-24 14:56  gearslogy  阅读(1176)  评论(2编辑  收藏  举报