Przeglądaj źródła

sceneControl. Fixed issue if element is not set.

sceneControl. Improved debugging.
sceneControl. Deletion now also deletes Kenv
sceneControl. Write Nodes get a new label with the used exr compression type.
sceneControl. Fixed issue when unloading plugin
sceneControl. Simplified kenv queries
sceneControl. updateWriteNodeConfig() for updating the Keller tab on write nodes
ffmpeg_write. Initial version. NNode with correct names and burn-ins
our_write. Write nodes now have a compression label and a custom color to see which exr compression type is set.
added search and replace panel.
Denoise with noice. Initial version.
ocio config, image formats, fps and favorites are now set from KEnv project_config.py.
Martin Sächsinger 3 lat temu
rodzic
commit
427e4b9b14

+ 1
- 1
.gitignore Wyświetl plik

@@ -1,3 +1,3 @@
1 1
 *.rar
2 2
 *.pyc
3
-*.bak
3
+*.bak*

+ 1
- 1
.idea/12.iml Wyświetl plik

@@ -2,7 +2,7 @@
2 2
 <module type="PYTHON_MODULE" version="4">
3 3
   <component name="NewModuleRootManager">
4 4
     <content url="file://$MODULE_DIR$" />
5
-    <orderEntry type="jdk" jdkName="Python 2.7" jdkType="Python SDK" />
5
+    <orderEntry type="jdk" jdkName="Python 2.7 (3)" jdkType="Python SDK" />
6 6
     <orderEntry type="sourceFolder" forTests="false" />
7 7
   </component>
8 8
   <component name="PyDocumentationSettings">

+ 1
- 1
.idea/misc.xml Wyświetl plik

@@ -1,6 +1,6 @@
1 1
 <?xml version="1.0" encoding="UTF-8"?>
2 2
 <project version="4">
3
-  <component name="ProjectRootManager" version="2" project-jdk-name="Python 2.7" project-jdk-type="Python SDK" />
3
+  <component name="ProjectRootManager" version="2" project-jdk-name="Python 2.7 (3)" project-jdk-type="Python SDK" />
4 4
   <component name="PyPackaging">
5 5
     <option name="earlyReleasesAsUpgrades" value="true" />
6 6
   </component>

+ 6
- 0
.idea/other.xml Wyświetl plik

@@ -0,0 +1,6 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<project version="4">
3
+  <component name="PySciProjectComponent">
4
+    <option name="PY_SCI_VIEW_SUGGESTED" value="true" />
5
+  </component>
6
+</project>

+ 81
- 1
README.md Wyświetl plik

@@ -1 +1,81 @@
1
-Nuke Workgroup 12.2
1
+# **Nuke Workgroup 12.2**
2
+
3
+##### New commands:
4
+
5
+- align nodes vertically: `alt + x`
6
+- align nodes horizontally: `alt + y`
7
+- read from write: `alt + shift + r`
8
+- write from read: `shift + r`
9
+- paste to selected: `ctrl. + shift + v`
10
+- muster submit: `ctrl. + r`
11
+- sceneControl: `F12`
12
+- increment major: `ctrl. + alt + s`
13
+- increment minor: `alt + s`
14
+- ffmpeg render: `F6`
15
+- stamps: `F8`
16
+- stacking backdrops (grey): `alt + b`
17
+
18
+
19
+##### New panels:
20
+- search and replace panel (RightClick Windows/Custom )
21
+- denoice with noice panel (Render/Denoise with Noice)
22
+
23
+
24
+##### New nodes:
25
+
26
+- sceneControl
27
+
28
+![screenshot](doc/sceneControl.jpg?raw=true)
29
+![screenshot](doc/sceneControl_m0.jpg?raw=true)
30
+![screenshot](doc/sceneControl_m1.jpg?raw=true)
31
+![screenshot](doc/sceneControl_m2.jpg?raw=true)
32
+
33
+- keller tab on newly created write nodes
34
+
35
+![screenshot](doc/ourWrite.jpg?raw=true)
36
+
37
+- musterSubmit 2
38
+
39
+![screenshot](doc/musterSubmit2.jpg?raw=true)
40
+
41
+- FFMpeg Render
42
+
43
+![screenshot](doc/ffmpegWrite.jpg?raw=true)
44
+
45
+- Denoise with Noice
46
+
47
+![screenshot](doc/nukeNoice.jpg?raw=true)
48
+
49
+- channelSelect
50
+
51
+![screenshot](doc/channelSelect.jpg?raw=true)
52
+
53
+
54
+
55
+##### Changelog:
56
+
57
+`2021-06-18`
58
+
59
+`sceneControl. Fixed issue if element is not set.`
60
+
61
+`sceneControl. Improved debugging.`
62
+
63
+`sceneControl. Deletion now also deletes Kenv`
64
+
65
+`sceneControl. Write Nodes get a new label with the used exr compression type.`
66
+
67
+`sceneControl. Fixed issue when unloading plugin`
68
+
69
+`sceneControl. Simplified kenv queries`
70
+
71
+`sceneControl. updateWriteNodeConfig() for updating the Keller tab on write nodes`
72
+
73
+`ffmpeg_write. Initial version. NNode with correct names and burn-ins`
74
+
75
+`our_write. Write nodes now have a compression label and a custom color to see which exr compression type is set.`
76
+
77
+`added search and replace panel.`
78
+
79
+`Denoise with noice. Initial version.`
80
+
81
+`ocio config, image formats, fps and favorites are set from KEnv project_config.py.`

+ 0
- 1478
gimmicks/Gimmicks/KF_GRAIN.gimmick
Plik diff jest za duży
Wyświetl plik


+ 0
- 71
gimmicks/Gimmicks/KF_Handles.gimmick Wyświetl plik

@@ -1,71 +0,0 @@
1
-set cut_paste_input [stack 0]
2
-version 10.5 v3
3
-push $cut_paste_input
4
-Group {
5
-name KF_Handles1
6
-selected true
7
-xpos -198
8
-ypos 523
9
-addUserKnob {20 User}
10
-addUserKnob {3 Handles}
11
-Handles 24
12
-}
13
-Input {
14
-inputs 0
15
-name Input1
16
-xpos -476
17
-ypos 213
18
-}
19
-set N3b3f800 [stack 0]
20
-push $N3b3f800
21
-Text2 {
22
-font_size_toolbar 100
23
-font_width_toolbar 100
24
-font_height_toolbar 100
25
-cliptype none
26
-message Handles
27
-old_message {{72 97 110 100 108 101 115}
28
-  }
29
-box {{width/2} 100 {width/2} 10}
30
-xjustify center
31
-yjustify center
32
-transforms {{0 2}
33
-  }
34
-font_size_values {{0 100 1 100 2 100 3 100 4 100 5 100 6 100 0 25 1 25 2 25 3 25 4 25 5 25 6 25}
35
-  }
36
-scale {1 1}
37
-center {1024 778}
38
-cursor_initialised true
39
-autofit_bbox false
40
-initial_cursor_position {{756 102.5}
41
-  }
42
-group_animations {{0} imported: 0 selected: 0 items: "root transform/"}
43
-animation_layers {{1 11 1024 778 0 0 1 1 0 0 0 0}
44
-  }
45
-name Text1
46
-xpos -405
47
-ypos 271
48
-}
49
-set N9d5fc800 [stack 0]
50
-Switch {
51
-inputs 2
52
-which {{frame>root.first_frame+(parent.Handles-1)?frame<root.last_frame-(parent.Handles-1)?1:0:0}}
53
-name Switch1
54
-xpos -476
55
-ypos 325
56
-}
57
-Output {
58
-name Output1
59
-xpos -476
60
-ypos 377
61
-}
62
-push $N9d5fc800
63
-Viewer {
64
-frame_range 1001-1101
65
-name Viewer1
66
-xpos -291
67
-ypos 384
68
-}
69
-end_group
70
-# Creation Time=Thu Jun 07 17:42:55 2018
71
-# Creator=ne

+ 0
- 66
gimmicks/Gimmicks/graincheck_ppo.gimmick Wyświetl plik

@@ -1,66 +0,0 @@
1
-set cut_paste_input [stack 0]
2
-version 11.2 v3
3
-push $cut_paste_input
4
-Group {
5
-name graincheck_ppo
6
-tile_color 0xcbff00ff
7
-selected true
8
-xpos -351
9
-ypos 905
10
-addUserKnob {20 User}
11
-addUserKnob {41 size l blursize T Blur2.size}
12
-addUserKnob {41 white l gain T Grade2.white}
13
-addUserKnob {26 ""}
14
-addUserKnob {26 ccc l "" +STARTLINE T "Grainchecker\n\nPlug it at the end of your comp. Dark areas showing missing grain.\n\np.poetsch @ 2014"}
15
-}
16
-Input {
17
-inputs 0
18
-name Input1
19
-xpos 462
20
-ypos 109
21
-}
22
-Dot {
23
-name Dot3
24
-xpos 494
25
-ypos 149
26
-}
27
-set N87f29880 [stack 0]
28
-Blur {
29
-size 1.5
30
-name Blur2
31
-xpos 401
32
-ypos 184
33
-}
34
-push $N87f29880
35
-Merge2 {
36
-inputs 2
37
-operation divide
38
-name Merge1
39
-xpos 462
40
-ypos 239
41
-}
42
-Grade {
43
-add -1
44
-name Grade1
45
-xpos 462
46
-ypos 265
47
-}
48
-Grade {
49
-white 100
50
-name Grade2
51
-xpos 462
52
-ypos 291
53
-}
54
-Dot {
55
-name Dot6
56
-xpos 494
57
-ypos 317
58
-}
59
-Output {
60
-name Output1
61
-xpos 494
62
-ypos 417
63
-}
64
-end_group
65
-# Creation Time=Wed Sep  4 10:24:17 2019
66
-# Creator=tmt

+ 0
- 84
gimmicks/Templates/KF_Bokeh.gimmick Wyświetl plik

@@ -1,84 +0,0 @@
1
-set cut_paste_input [stack 0]
2
-version 10.5 v3
3
-BackdropNode {
4
- inputs 0
5
- name BackdropNode1
6
- tile_color 0x388e8e00
7
- note_font_size 42
8
- selected true
9
- xpos -224
10
- ypos -68
11
- bdwidth 269
12
- bdheight 196
13
-}
14
-push $cut_paste_input
15
-Dot {
16
- name IMAGE_INPUT
17
- label IMAGE_INPUT
18
- note_font Verdana
19
- note_font_size 15
20
- note_font_color 0xffffffff
21
- selected true
22
- xpos -180
23
- ypos -129
24
-}
25
-Copy {
26
- from0 rgba.red
27
- to0 depth.Z
28
- name Copy1
29
- selected true
30
- xpos -214
31
- ypos 10
32
-}
33
-pgBokeh {
34
- focalPlane {{LensMetaData.LensFocus+LensMetaData.FocusOffset}}
35
- realWorldLens true
36
- focalLength {{LensMetaData.LensFocalLength}}
37
- fStop {{LensMetaData.LensIris+LensMetaData.IrisOffset}}
38
- worldScale m
39
- filmFormat Custom
40
- apertureWidth 54.12
41
- apertureHeight 25.58
42
- name pgBokeh1
43
- selected true
44
- xpos -214
45
- ypos 96
46
-}
47
-Dot {
48
- name IMAGE_OUTPUT
49
- label IMAGE_OUTPUT
50
- note_font Verdana
51
- note_font_size 15
52
- note_font_color 0xffffffff
53
- selected true
54
- xpos -180
55
- ypos 175
56
-}
57
-Dot {
58
- inputs 0
59
- name METADATA_INPUT
60
- label METADATA_INPUT
61
- note_font Verdana
62
- note_font_size 15
63
- note_font_color 0xffffffff
64
- selected true
65
- xpos 23
66
- ypos -91
67
-}
68
-Dot {
69
- name LensMetaData
70
- selected true
71
- xpos 23
72
- ypos 101
73
- addUserKnob {20 User}
74
- addUserKnob {7 LensFocalLength l "Lens Focal Length"}
75
- LensFocalLength {{"\[metadata \"ext/Lens Focal Length\"]"}}
76
- addUserKnob {7 LensFocus l "Lens Focus Distance"}
77
- LensFocus {{"\[metadata \"ext/Lens Focus Distance\"]"}}
78
- addUserKnob {7 LensIris l "Lens Iris"}
79
- LensIris {{"\[metadata \"ext/Lens Iris\"]"}}
80
- addUserKnob {7 FocusOffset l "Lens Focus Distance Offset"}
81
- addUserKnob {7 IrisOffset l "Lens Iris Offset"}
82
-}
83
-# Creation Time=Mon Jun 11 15:40:27 2018
84
-# Creator=ne

+ 0
- 51
gimmicks/Templates/KF_Thumbnails_first.gimmick Wyświetl plik

@@ -1,51 +0,0 @@
1
-set cut_paste_input [stack 0]
2
-version 10.5 v3
3
-BackdropNode {
4
- inputs 0
5
- name BackdropNode1
6
- tile_color 0x999999ff
7
- gl_color 0x999999ff
8
- label "first_frame\n"
9
- note_font_size 15
10
- selected true
11
- xpos -181
12
- ypos -131
13
- bdheight 200
14
-}
15
-push $cut_paste_input
16
-Reformat {
17
- type "to box"
18
- box_width 500
19
- name Reformat1
20
- selected true
21
- xpos -171
22
- ypos -51
23
-}
24
-Vectorfield {
25
- vfield_file O:/LUTs/K1S1_3D_Neutral.cube
26
- version 3
27
- file_type cube
28
- colorspaceIn AlexaV3LogC
29
- name Vectorfield1
30
- selected true
31
- xpos -171
32
- ypos -25
33
-}
34
-Write {
35
- channels rgba
36
- file "//calculon/o/_projekte/KalteFuesse/000_A_TrelloThumbs/\[file tail \[lrange \[split \[file rootname \[value root.name]] ] 0 1]].####.jpg"
37
- raw true
38
- file_type jpeg
39
- first {{root.first_frame}}
40
- last {{root.first_frame}}
41
- use_limit true
42
- checkHashOnRead false
43
- version 1
44
- beforeRender createWriteDir.createWriteDir()
45
- name Write1
46
- selected true
47
- xpos -171
48
- ypos 11
49
-}
50
-# Creation Time=Tue Jun 05 18:16:39 2018
51
-# Creator=ne

+ 0
- 51
gimmicks/Templates/KF_Thumbnails_last.gimmick Wyświetl plik

@@ -1,51 +0,0 @@
1
-set cut_paste_input [stack 0]
2
-version 10.5 v3
3
-BackdropNode {
4
- inputs 0
5
- name BackdropNode3
6
- tile_color 0x999999ff
7
- gl_color 0x999999ff
8
- label "last frame\n"
9
- note_font_size 15
10
- selected true
11
- xpos 147
12
- ypos -134
13
- bdheight 202
14
-}
15
-push $cut_paste_input
16
-Reformat {
17
- type "to box"
18
- box_width 500
19
- name Reformat3
20
- selected true
21
- xpos 157
22
- ypos -54
23
-}
24
-Vectorfield {
25
- vfield_file O:/LUTs/K1S1_3D_Neutral.cube
26
- version 4
27
- file_type cube
28
- colorspaceIn AlexaV3LogC
29
- name Vectorfield3
30
- selected true
31
- xpos 157
32
- ypos -28
33
-}
34
-Write {
35
- channels rgba
36
- file "//calculon/o/_projekte/KalteFuesse/000_A_TrelloThumbs/\[file tail \[lrange \[split \[file rootname \[value root.name]] ] 0 1]].####.jpg"
37
- raw true
38
- file_type jpeg
39
- first {{root.last_frame}}
40
- last {{root.last_frame}}
41
- use_limit true
42
- checkHashOnRead false
43
- version 1
44
- beforeRender createWriteDir.createWriteDir()
45
- name Write3
46
- selected true
47
- xpos 157
48
- ypos 11
49
-}
50
-# Creation Time=Tue Jun 05 18:17:13 2018
51
-# Creator=ne

+ 0
- 51
gimmicks/Templates/KF_Thumbnails_middle.gimmick Wyświetl plik

@@ -1,51 +0,0 @@
1
-set cut_paste_input [stack 0]
2
-version 10.5 v3
3
-BackdropNode {
4
- inputs 0
5
- name BackdropNode2
6
- tile_color 0x999999ff
7
- gl_color 0x999999ff
8
- label "mid_frame\n"
9
- note_font_size 15
10
- selected true
11
- xpos -22
12
- ypos -132
13
- bdheight 198
14
-}
15
-push $cut_paste_input
16
-Reformat {
17
- type "to box"
18
- box_width 500
19
- name Reformat2
20
- selected true
21
- xpos -12
22
- ypos -52
23
-}
24
-Vectorfield {
25
- vfield_file O:/LUTs/K1S1_3D_Neutral.cube
26
- version 4
27
- file_type cube
28
- colorspaceIn AlexaV3LogC
29
- name Vectorfield2
30
- selected true
31
- xpos -12
32
- ypos -26
33
-}
34
-Write {
35
- channels rgba
36
- file "//calculon/o/_projekte/KalteFuesse/000_A_TrelloThumbs/\[file tail \[lrange \[split \[file rootname \[value root.name]] ] 0 1]].####.jpg"
37
- raw true
38
- file_type jpeg
39
- first {{int((root.first_frame+root.last_frame)/2)}}
40
- last {{int((root.first_frame+root.last_frame)/2)}}
41
- use_limit true
42
- checkHashOnRead false
43
- version 1
44
- beforeRender createWriteDir.createWriteDir()
45
- name Write2
46
- selected true
47
- xpos -12
48
- ypos 10
49
-}
50
-# Creation Time=Tue Jun 05 18:17:00 2018
51
-# Creator=ne

+ 25
- 1
init.py Wyświetl plik

@@ -4,12 +4,27 @@
4 4
 ## loaded by nuke before menu.py
5 5
 
6 6
 import os
7
-# import kenv
7
+import sys
8
+import KEnv
8 9
 
9 10
 nuke.pluginAddPath('./gizmos')
10 11
 nuke.pluginAddPath('./icons')
11 12
 nuke.pluginAddPath('./ndk')
12 13
 
14
+# KEnv
15
+try:
16
+    project = os.getenv('PROJECT')
17
+except:
18
+    project = "GEN"
19
+
20
+env = KEnv.create(PROJECT=project, APP_ID='nuke')
21
+PYTHON_LIBS_NUKE = env.get('PYTHON_LIBS_NUKE')
22
+
23
+# project path
24
+try:
25
+    sys.path.insert(1, PYTHON_LIBS_NUKE)
26
+except:
27
+    "init.py: cannot find project libs path specified"
13 28
 
14 29
 # Paths
15 30
 nuke_path = os.getenv('NUKE_PATH')
@@ -19,6 +34,15 @@ icon_path = os.path.join(nuke_path, 'icons')
19 34
 # Plugins
20 35
 nuke.pluginAppendPath(plugin_path, icon_path)
21 36
 
37
+def filenameFix(s):
38
+    s = s.replace("/Volumes/O/", "//calculon/o/", 1)
39
+    s = s.replace("/Volumes/P/", "//hades/p/", 1)
40
+    s = s.replace("O:/", "//calculon/o/", 1)
41
+    s = s.replace("P:/", "//hades/p/", 1)
42
+    s = s.replace("o:/", "//calculon/o/", 1)
43
+    s = s.replace("p:/", "//hades/p/", 1)
44
+    return s
45
+
22 46
 # Needs to be loaded last?
23 47
 import kellerPluginCore
24 48
 kellerPluginCore.start( os.path.join( nuke_path ,"pythonplugins") )

+ 10
- 0
menu.py Wyświetl plik

@@ -1,5 +1,15 @@
1
+# kellerPluginCore
1 2
 import kellerPluginCore
2 3
 kellerPluginCore.start( os.path.join( nuke_path ,"pythonpluginsUI") )
3 4
 
5
+# cryptomatte_utilities
4 6
 import cryptomatte_utilities
5 7
 cryptomatte_utilities.setup_cryptomatte_ui()
8
+
9
+# searchReplacePanel
10
+import SearchReplacePanel
11
+def addSRPanel():
12
+    myPanel = SearchReplacePanel.SearchReplacePanel()
13
+    return myPanel.addToPane()
14
+nuke.menu('Pane').addCommand('SearchReplace', addSRPanel)
15
+nukescripts.registerPanel('com.ohufx.SearchReplace', addSRPanel)

+ 0
- 8
pythonplugins/_default_configs/filenameFix.py Wyświetl plik

@@ -2,23 +2,15 @@ def filenameFix(s):
2 2
     if nuke.env["MACOS"]:
3 3
         s = s.replace("//calculon/o/", "/Volumes/O/", 1)
4 4
         s = s.replace("//hades/p/", "/Volumes/P/", 1)
5
-        s = s.replace("//zeus/r/", "/Volumes/R/", 1)
6 5
         s = s.replace("/Volumes/192.168.0.253/", "/Volumes/O/", 1)
7 6
         s = s.replace("/Volumes/192.168.0.251/", "/Volumes/P/", 1)
8
-        s = s.replace("/Volumes/192.168.0.250/", "/Volumes/R/", 1)
9 7
         s = s.replace("O:/", "/Volumes/O/", 1)
10 8
         s = s.replace("P:/", "/Volumes/P/", 1)
11
-        s = s.replace("R:/", "/Volumes/R/", 1)
12 9
     else:
13 10
         s = s.replace("/Volumes/O/", "//calculon/o/", 1)
14 11
         s = s.replace("/Volumes/P/", "//hades/p/", 1)
15
-        s = s.replace("/Volumes/R/", "//zeus/r/", 1)
16 12
         s = s.replace("O:/", "//calculon/o/", 1)
17 13
         s = s.replace("P:/", "//hades/p/", 1)
18
-        s = s.replace("R:/", "//zeus/r/", 1)
19 14
         s = s.replace("o:/", "//calculon/o/", 1)
20 15
         s = s.replace("p:/", "//hades/p/", 1)
21
-        s = s.replace("r:/", "//zeus/r/", 1)
22
-        # for LUT
23
-        s = s.replace("/Volumes/Libs/Nuke/arri/", "//hades/p/env/nuke/_workgroup/6.0v5/lut/", 1)
24 16
     return s

+ 10
- 12
pythonplugins/_default_configs/genericDefaults.py Wyświetl plik

@@ -7,23 +7,21 @@ class genericDefaults(KellerNukePlugin):
7 7
         #
8 8
         # NON PROJECT SPECIFIC DEFAULTS GO HERE
9 9
         ############################################################################################################################################
10
-        
10
+
11
+        # Exposure
12
+        nuke.knobDefault("EXPTool.mode", "0")
13
+
11 14
         # read nodes
12 15
         nuke.knobDefault("Read.premultiplied", "true")
13
-        
14
-        # add fileout Defaults
15
-        nuke.knobDefault("Write.channels","rgba")
16
-        # 'createWriteDir.createWriteDir()' is called from the createWriteDir Plugin
17 16
 
18
-        # write nodes
19
-        nuke.knobDefault("Write.channels","rgba")
20
-        nuke.knobDefault("Write.dpx.channels","rgb")
17
+        # Write
18
+        nuke.knobDefault("Write.channels", "rgba")
19
+        nuke.knobDefault("Write.dpx.channels", "rgb")
21 20
         nuke.knobDefault("Write.create_directories", "1")
22
-        nuke.knobDefault("Write.noprefix", "1")
23
-        nuke.knobDefault("Write.metadata", "3")
21
+        nuke.knobDefault("Write.exr.noprefix", "1")
22
+        nuke.knobDefault("Write.exr.metadata", "all metadata")
24 23
 
25
-        # Exposure
26
-        nuke.knobDefault("EXPTool.mode", "0")
24
+        # 'createWriteDir.createWriteDir()' is called from the createWriteDir Plugin
27 25
 
28 26
     def unconfigurePlugin(self):
29 27
         pass

+ 24
- 19
pythonplugins/_default_configs/projectDefaults.py Wyświetl plik

@@ -1,5 +1,18 @@
1
-#TODO: OCIO config from KEnv
2
-#TODO: Formats fron KEnv
1
+import KEnv
2
+import os
3
+import nuke
4
+
5
+# KEnv
6
+try:
7
+    project = os.getenv('PROJECT')
8
+except:
9
+    project = "GEN"
10
+
11
+env = KEnv.create(PROJECT=project, APP_ID='nuke')
12
+ociopath = env.get('OCIO_CONFIG')
13
+projectID = env.get('PROJECT_ID')
14
+formats = env.get('IMAGEFORMATS')
15
+fps = env.get('FPS')
3 16
 
4 17
 class ProjectDefaults(KellerNukePlugin):
5 18
 
@@ -11,28 +24,20 @@ class ProjectDefaults(KellerNukePlugin):
11 24
         #
12 25
         ############################################################################################################################################
13 26
 
14
-        # Write
15
-        nuke.knobDefault("Write.channels", "rgba")
16
-        nuke.knobDefault("Write.dpx.channels", "rgb")
17
-        nuke.knobDefault("Write.create_directories", "1")
18
-        nuke.knobDefault("Write.exr.noprefix", "1")
19
-        nuke.knobDefault("Write.exr.metadata", "all metadata")
20
-
21
-        # Exposure
22
-        nuke.knobDefault("EXPTool.mode", "0")
23
-
24
-        # add formats
25
-        nuke.addFormat('3840 2160 0 0 3840 2160 1 HOT_WORK')
26
-        nuke.addFormat('3840 2160 0 0 3840 2160 1 HOT_DELIVERY')
27
-        nuke.addFormat('2560 1440 0 0 2560 1440 1 HOT_3D_PREVIEW')
28
-        nuke.addFormat('1920 1080 0 0 1920 1080 1 HOT_3D_PREVIEW_LOW')
27
+        # add formats from KEnv
28
+        for key, value in formats.items():
29
+            fav = '{1} {0}'.format(key, value)
30
+            nuke.addFormat(fav)
31
+
29 32
         # add fileout Defaults
30 33
         nuke.knobDefault('Write.channels', 'rgba')
31 34
         nuke.knobDefault('Root.colorManagement', 'OCIO')
32 35
         nuke.knobDefault('Root.OCIO_config', 'custom')
33
-        nuke.knobDefault('Root.customOCIOConfigPath', '//hades/p/_projekte/HOTZ/000_dev/ocio/aces_1.2/config.ocio')
36
+        nuke.knobDefault('Root.customOCIOConfigPath', ociopath)
34 37
         # set format
35
-        nuke.knobDefault('Root.format', 'HOT_WORK')
38
+        nuke.knobDefault('Root.format', projectID + '_WORK')
39
+        # fps
40
+        nuke.knobDefault('Root.fps', str(fps))
36 41
         # set viewer
37 42
         # viewer is set via config.ocio: active_views: [P3D65 Rec.709 Limited, sRGB, DCDM, DCDM P3D60 Limited..]
38 43
 

+ 39
- 27
pythonplugins/_default_configs/projectFavorites.py Wyświetl plik

@@ -1,30 +1,42 @@
1
-PROJECTNAME = "HOTZ"
2
-
3
-if nuke.env["MACOS"]:
4
-  FAVOURITES = {
5
-    'O_PRJ': '/Volumes/O/_projekte',
6
-    'P_PRJ': '/Volumes/P/_projekte'
7
-  }
8
-else:
9
-    FAVOURITES = (
10
-        ('______', '//calculon/o/_projekte/' + PROJECTNAME),
11
-        ('HOT_O', '//calculon/o/_projekte/' + PROJECTNAME),
12
-        ('020_footageIn', '//calculon/o/_projekte/' + PROJECTNAME + '/020_footageIn'),
13
-        ('220_processedFootage', '//calculon/o/_projekte/' + PROJECTNAME + '/220_processedFootage'),
14
-        ('250_render3D', '//calculon/o/_projekte/' + PROJECTNAME + '/250_render3D'),
15
-        ('300_work2d', '//calculon/o/_projekte/' + PROJECTNAME + '/300_work2d'),
16
-        ('120_ref', '//calculon/o/_projekte/' + PROJECTNAME + '/120_ref'),
17
-        ('450_precomp', '//calculon/o/_projekte/' + PROJECTNAME + '/450_precomp'),
18
-        ('500_renders', '//calculon/o/_projekte/' + PROJECTNAME + '/500_renders'),
19
-        ('_____', '//hades/p//_projekte/' + PROJECTNAME),
20
-        ('HOT_P', '//hades/p//_projekte/' + PROJECTNAME),
21
-        ('210_setData', '//hades/p/_projekte/' + PROJECTNAME + '/210_setData'),
22
-        ('230_sources', '//hades/p/_projekte/' + PROJECTNAME + '/230_sources'),
23
-        ('300_work3d', '//hades/p/_projekte/' + PROJECTNAME + '/300_work3d'),
24
-        ('410_textures', '//hades/p/_projekte/' + PROJECTNAME + '/410_textures'),
25
-        ('500_renders_', '//hades/p/_projekte/' + PROJECTNAME + '/500_renders'),
26
-        ('____', '//hades/p//_projekte/' + PROJECTNAME + '')
27
-    )
1
+import KEnv
2
+import os
3
+import nuke
4
+
5
+# KEnv
6
+try:
7
+    project = os.getenv('PROJECT')
8
+except:
9
+    project = "GEN"
10
+
11
+env = KEnv.create(PROJECT=project, APP_ID='nuke')
12
+projectID = env.get('PROJECT_ID')
13
+formats = env.get('IMAGEFORMATS')
14
+
15
+# 3D FOLDER
16
+WORK_3D_ROOT = env.get('WORK_3D_ROOT')
17
+RENDER_3D_ROOT = env.get('RENDER_3D_ROOT')
18
+PROCESSED_FOOTAGE_ROOT_3D  = env.get('PROCESSED_FOOTAGE_ROOT_3D')
19
+
20
+# 2D FOLDER
21
+WORK_2D_ROOT = env.get('WORK_2D_ROOT')
22
+RENDER_2D_ROOT = env.get('RENDER_2D_ROOT')
23
+PROCESSED_FOOTAGE_ROOT_2D  = env.get('PROCESSED_FOOTAGE_ROOT_2D')
24
+
25
+# GEN
26
+CAMERAS_ROOT = env.get('CAMERAS_ROOT')
27
+SETDATA_ROOT = env.get('SETDATA_ROOT')
28
+
29
+
30
+FAVOURITES = (
31
+    ('WORK_3D_ROOT', WORK_3D_ROOT),
32
+    ('RENDER_3D_ROOT', RENDER_3D_ROOT),
33
+    ('PROCESSED_FOOTAGE_ROOT_3D', PROCESSED_FOOTAGE_ROOT_3D),
34
+    ('WORK_2D_ROOT', WORK_2D_ROOT),
35
+    ('RENDER_2D_ROOT', RENDER_2D_ROOT),
36
+    ('PROCESSED_FOOTAGE_ROOT_2D', PROCESSED_FOOTAGE_ROOT_2D),
37
+    ('CAMERAS_ROOT', CAMERAS_ROOT),
38
+    ('SETDATA_ROOT', SETDATA_ROOT),
39
+)
28 40
 
29 41
 class projectFavorites(KellerNukePlugin):
30 42
 

+ 295
- 73
pythonpluginsUI/ChannelSelect/ChannelSelect.py Wyświetl plik

@@ -1,22 +1,56 @@
1 1
 import fnmatch
2 2
 import nuke
3 3
 
4
-# Idea from Stefan@BigHug
5
-# 2018-10-02: Martin S.
6
-#
7
-# Version 0.1
4
+
5
+# martin@keller.io
6
+__version__ = '1.0'
7
+
8
+MODES = ['MergeBackIntoStream','SelectOnly', 'ContactSheet']
9
+PATTERNDEFAULT = "*direct* !*indirect* !*default"
10
+INIT_DONE = False
8 11
 
9 12
 class ChannelSelect(KellerNukePlugin):
10 13
 
11 14
     def configurePlugin(self):
12
-        self.menu = nuke.menu("Nodes")
13
-        m = self.menu.addMenu("Workgroup","Toolbar_Workgroup.png")
14
-        m.addCommand("ChannelSelect", "import ChannelSelect; ChannelSelect.createChannelSelect()",  icon=":qrc/images/ToolbarChannel.png")
15
+        self.menu = nuke.menu('Nodes')
16
+        m = self.menu.addMenu('Workgroup','Toolbar_Workgroup.png')
17
+        m.addCommand('ChannelSelect', 'import ChannelSelect; ChannelSelect.createChannelSelect()',  icon=':qrc/images/ToolbarChannel.png')
18
+        nuke.addKnobChanged(onKnobChanged)
15 19
 
16 20
     def unconfigurePlugin(self):
17
-        self.menu.removeItem("ChannelSelect")
21
+        self.menu.removeItem('ChannelSelect')
22
+        nuke.removeKnobChanged(onKnobChanged)
23
+        pass
24
+
25
+
26
+# events
27
+def onKnobChanged():
28
+    global INIT_DONE
29
+    if not INIT_DONE:
30
+        # not ready
31
+        return
32
+
33
+    k = nuke.thisKnob()
34
+    # do a refresh on these knobs
35
+    refresh_resolved = ['pattern','update']
36
+
37
+    if k.name() in refresh_resolved:
38
+        print('ChannelSelect: Info. Event refresh triggered.')
39
+        # Config changed, loading new tasks
40
+        n = nuke.thisNode()
41
+
42
+        pattern = n['pattern'].value()
43
+        resolved = resolvePattern(n, pattern)
44
+        if resolved:
45
+            resString = '\n'.join(resolved)
46
+
47
+        if not resolved:
48
+            n['resolved'].setValue('NO MATCH')
49
+        else:
50
+            n['resolved'].setValue(resString)
18 51
         pass
19 52
 
53
+
20 54
 def createChannelSelect():
21 55
     # get selected Node (for connecting our node below)
22 56
     try:
@@ -25,11 +59,11 @@ def createChannelSelect():
25 59
         s = None
26 60
     # deselect all Nodes
27 61
     for a in nuke.allNodes():
28
-        a.knob("selected").setValue(False)
62
+        a.knob('selected').setValue(False)
29 63
 
30 64
     # create Group
31 65
     n = nuke.collapseToGroup(show = False)
32
-    n.setName("ChannelSelect")
66
+    n.setName('ChannelSelect')
33 67
     # % (r * 255, g * 255, b * 255, 1), 16): change r g and b to your liking
34 68
     hexColour = int('%02x%02x%02x%02x' % (0 * 255, 0 * 255, 0 * 255, 1), 16)
35 69
     n['tile_color'].setValue(hexColour)
@@ -39,34 +73,91 @@ def createChannelSelect():
39 73
         n.setXYpos(s.xpos(), s.ypos() + 100)
40 74
 
41 75
     # tab ChannelSelect
42
-    k = nuke.Tab_Knob("select", "Select")
76
+    k = nuke.Tab_Knob('select', 'Select')
77
+    n.addKnob(k)
78
+
79
+    # Pattern
80
+    k = nuke.EvalString_Knob('pattern', 'Pattern')
81
+    n.addKnob(k)
82
+    n.knob('pattern').setTooltip('*diffuse* *SSS*\nwith exclude (! or ^):\n*direct* !*indirect*')
83
+    n.knob('pattern').setValue(PATTERNDEFAULT)
84
+
85
+    # Update
86
+    k = nuke.PyScript_Knob('update', 'Set', 'ChannelSelect.updatePattern(nuke.thisNode())')
87
+    n.addKnob(k)
88
+    n.knob('update').setTooltip('Creates Nodes in Group based on Search Pattern')
89
+
90
+    # Resolved Channels
91
+    k = nuke.Multiline_Eval_String_Knob('resolved', 'Resolved')
92
+    n.addKnob(k)
93
+    n.knob('resolved').setTooltip('These AOVs are found based on your search Pattern above')
94
+
95
+    # Divide and Conquer
96
+    k = nuke.Text_Knob('divider', '')
97
+    n.addKnob(k)
98
+
99
+    # Exposure
100
+    k = nuke.Double_Knob('exposure', 'Exposure')
101
+    n.addKnob(k)
102
+    n.knob('exposure').setRange(-2,2)
103
+
104
+    # Multiply
105
+    k = nuke.Color_Knob('multiply', 'Multiply')
106
+    n.addKnob(k)
107
+    n.knob('multiply').setValue([1, 1, 1])
108
+
109
+    # Gamma
110
+    k = nuke.Double_Knob('gamma', 'Gamma')
111
+    n.addKnob(k)
112
+    n.knob('gamma').setValue(1)
113
+    n.knob('gamma').setRange(0.2, 2)
114
+
115
+    # Compensate Mult
116
+    k = nuke.Boolean_Knob('compensate', 'Compensate Mult')
43 117
     n.addKnob(k)
118
+    n.knob('compensate').setValue(True)
119
+    n.knob('compensate').setFlag(nuke.STARTLINE)
44 120
 
45
-    k = nuke.EvalString_Knob("pattern", "Pattern")
121
+    # Reset Values
122
+    k = nuke.PyScript_Knob('reset', 'Reset', 'ChannelSelect.resetValues(nuke.thisNode())')
46 123
     n.addKnob(k)
47
-    n.knob("pattern").setTooltip("*diffuse* *SSS*\nwith exclude (! or ^):\n*direct* !*indirect*")
48
-    n.knob("pattern").setValue("*key*")
124
+    n.knob('reset').setTooltip('Reset Color Correct values')
125
+    n.knob('reset').setFlag(nuke.STARTLINE)
49 126
 
50
-    k = nuke.PyScript_Knob("update", "Update", "ChannelSelect.update(nuke.thisNode())")
127
+    # Divide and Conquer
128
+    k = nuke.Text_Knob('divider', '')
51 129
     n.addKnob(k)
52
-    n.knob("update").setTooltip("Creates Nodes in Group based on Search Pattern")
53 130
 
54
-    k = nuke.Text_Knob("divider", "")
131
+    # Mode
132
+    k = nuke.Enumeration_Knob('mode', 'Mode', MODES)
55 133
     n.addKnob(k)
134
+    k.setTooltip('MergeBackIntoStream: Shuffles the resolved aovs, applies the grading options and merges the result back to main comp stream\n\nSelectOnly: Just shuffles the resolved aovs and adds them together.\n\nLayerContactSheet: Displays the LayerContactSheet with layer names. Note. You need to Press Set in order for this to work. An empty Pattern is possible')
135
+    n.knob('mode').clearFlag(nuke.STARTLINE)
136
+
137
+    # refresh again
138
+    n.knob('pattern').setValue('*key*')
139
+    n.knob('pattern').setValue(PATTERNDEFAULT)
56 140
 
141
+    global INIT_DONE
142
+    INIT_DONE = True
57 143
     return None
58 144
 
145
+
146
+def resetValues(n):
147
+    n['exposure'].setValue(0)
148
+    n['multiply'].setValue([1, 1, 1])
149
+    n['gamma'].setValue(1)
150
+    n['compensate'].setValue(True)
151
+
152
+
59 153
 def resolvePattern(n, pattern):
154
+    if pattern == "":
155
+        return None
156
+
60 157
     channels = n.channels()
61
-    print ("channels")
62
-    print (channels)
63 158
     layers = list(set([c.split('.')[0] for c in channels]))
64 159
     layers.sort()
65
-    print ("layers:")
66
-    print (layers)
67
-    if layers is not None:
68
-        print ("layers: %s " %layers)
69
-    print ("pattern: " + pattern)
160
+
70 161
     matchChannels = []
71 162
     ignoreChannels = []
72 163
     for p in pattern.split(' '):
@@ -77,82 +168,213 @@ def resolvePattern(n, pattern):
77 168
 
78 169
     matchChannels = list(set(matchChannels) - set(ignoreChannels))
79 170
     matchChannels.sort()
80
-    print ("matchedChannels: %s" % matchChannels)
81
-    print ("ignoredChannels: %s" % ignoreChannels)
82 171
     return matchChannels
83 172
 
84 173
 
85
-def update(n):
86
-    # n = node
87
-    pattern = n['pattern'].value()
174
+def updatePattern(n):
88 175
 
89
-    # empty pattern
90
-    if pattern == "":
91
-        n['label'].setValue("NO MATCH")
92
-        return
176
+    V_OFFSET = 250
93 177
 
94
-    # get the pattern
178
+    # n = node
179
+    pattern = n['pattern'].value()
95 180
     resolved = resolvePattern(n, pattern)
96
-    print ("Found %s matching channels" % len(resolved))
97
-    if len(resolved) > 0:
98
-        print ("resolved: %s" % resolved)
181
+
182
+    # create nodes
99 183
     # input and output of Group
100
-    input = nuke.toNode("Input1")
101
-    output = nuke.toNode("Output1")
184
+    input = nuke.toNode('Input1')
185
+    output = nuke.toNode('Output1')
102 186
 
103 187
     # delete old nodes
104 188
     g = nuke.toNode(n.name())
105
-    oldNodes = [i for i in g.nodes() if i.Class() == "Merge2" or i.Class() == "Shuffle"]
189
+    oldNodes = [i for i in g.nodes() if '__' in i['name'].value()]
106 190
 
107 191
     for node in oldNodes:
108 192
         nuke.delete(node)
109 193
 
194
+    # dot input
195
+    dot_input = nuke.nodes.Dot(xpos=input.xpos() , ypos=input.ypos()+100)
196
+    dot_input['name'].setValue('dot_input__')
197
+    dot_input['label'].setValue('[value name]')
198
+    #dot_input['note_font_size'].setValue(25)
199
+    # connect to the input1 node
200
+
201
+    # dot input 2
202
+    dot_input2 = nuke.nodes.Dot(xpos=dot_input.xpos()+1500 , ypos=dot_input.ypos())
203
+    dot_input2['name'].setValue('dot_input2__')
204
+    dot_input2['label'].setValue('[value name]')
205
+    #dot_input2['note_font_size'].setValue(25)
206
+    # connect to the input1 node
207
+
208
+    # dot resolved
209
+    dot_resolved = nuke.nodes.Dot(xpos=dot_input.xpos() , ypos=dot_input.ypos() + V_OFFSET)
210
+    dot_resolved['name'].setValue('dot_resolved__')
211
+    dot_resolved['label'].setValue('[value name]')
212
+    #dot_resolved['note_font_size'].setValue(25)
213
+
214
+    # dot resolved2
215
+    dot_resolved2 = nuke.nodes.Dot(xpos=dot_resolved.xpos() - 100, ypos=dot_resolved.ypos())
216
+    dot_resolved2['name'].setValue('dot_resolved2__')
217
+    dot_resolved2['label'].setValue('[value name]')
218
+    #dot_resolved2['note_font_size'].setValue(25)
219
+
220
+    # dot resolved3
221
+    dot_resolved3 = nuke.nodes.Dot(xpos=dot_resolved2.xpos(), ypos=dot_resolved.ypos() + V_OFFSET)
222
+    dot_resolved3['name'].setValue('dot_resolved3__')
223
+    dot_resolved3['label'].setValue('[value name]')
224
+    #dot_resolved3['note_font_size'].setValue(25)
225
+
226
+    # merge from
227
+    merge_from = nuke.nodes.Merge2(xpos=dot_input.xpos()+500 , ypos=dot_input.ypos() )
228
+    merge_from['name'].setValue('merge_from__')
229
+    merge_from['operation'].setValue("from")
230
+
231
+    # exposure
232
+    exposure = nuke.nodes.EXPTool(xpos=dot_resolved.xpos() , ypos=dot_resolved.ypos() + V_OFFSET)
233
+    exposure['name'].setValue('exposure__')
234
+
235
+    # grade
236
+    grade = nuke.nodes.Grade(xpos=exposure.xpos() , ypos=exposure.ypos() + V_OFFSET)
237
+    grade['name'].setValue('grade__')
238
+
239
+    # merge plus
240
+    merge_plus = nuke.nodes.Merge2(xpos=grade.xpos() , ypos=grade.ypos() + V_OFFSET)
241
+    merge_plus['operation'].setValue("plus")
242
+    merge_plus['name'].setValue('merge_plus__')
243
+
244
+    # dot input From
245
+    dot_input_from = nuke.nodes.Dot(xpos=merge_from.xpos() , ypos=merge_plus.ypos())
246
+    dot_input_from['name'].setValue('dot_input_from__')
247
+    dot_input_from['label'].setValue('[value name]')
248
+    #dot_input_from['note_font_size'].setValue(25)
249
+
250
+    # contact_sheet_all
251
+    contact_sheet_all = nuke.nodes.LayerContactSheet(xpos=merge_plus.xpos() +250 , ypos=merge_plus.ypos() + 200)
252
+    contact_sheet_all['name'].setValue('contact_sheet__')
253
+
254
+    # switch
255
+    switch = nuke.nodes.Switch(xpos=merge_plus.xpos() , ypos=merge_plus.ypos() + V_OFFSET)
256
+    switch['name'].setValue('switch__')
257
+
258
+    # dot output
259
+    dot_output = nuke.nodes.Dot(xpos=dot_input.xpos() , ypos=dot_input.ypos() + V_OFFSET)
260
+    dot_output['name'].setValue('dot_output__')
261
+    dot_output['label'].setValue('[value name]')
262
+    #dot_output['note_font_size'].setValue(25)
263
+
110 264
     # create new nodes
111 265
     i = 1
112 266
     j = 0
113 267
     offset = 100
114 268
 
115
-    if len(resolved) > 0:
116
-        for r in resolved:
117
-            # shuffle
118
-            shuffle = nuke.nodes.Shuffle(xpos=input.xpos() - (len(resolved)/2)*offset + (i * offset), ypos=input.ypos() + offset)
119
-            shuffle['in'].setValue(resolved[i - 1])
120
-            shuffle['in2'].setValue('rgba')
121
-            shuffle['out'].setValue('rgb')
122
-            shuffle.setInput(0, input)
123
-
124
-            # create plus
125
-            if i == 1:
126
-                plus = nuke.nodes.Merge2(xpos=input.xpos(), ypos=output.ypos() - offset)
127
-                plus['operation'].setValue("plus")
128
-
129
-            # connect plus
130
-            # skip Mask Input
131
-            if j==2:
132
-                j+=1
133
-            plus.setInput(j, shuffle)
134
-
135
-            # connect output
136
-            output.setInput(i - 1, plus)
137
-            # next please
138
-            i += 1
139
-            j += 1
140
-        n['label'].setValue(pattern)
269
+    merge_resolved = None
270
+    if resolved:
271
+        if len(resolved) > 0:
272
+            for r in resolved:
273
+                # shuffle
274
+                shuffle = nuke.nodes.Shuffle(xpos=dot_input.xpos() - (len(resolved)/2)*offset + (i * offset), ypos=dot_input.ypos() + offset)
275
+                shuffle['in'].setValue(resolved[i - 1])
276
+                shuffle['in2'].setValue('rgba')
277
+                shuffle['out'].setValue('rgb')
278
+                shuffle['name'].setValue('shuffle__' + str(i))
279
+                # connect to the dot dot_input
280
+                shuffle.setInput(0, dot_input)
281
+
282
+                # create plus
283
+                if i == 1:
284
+                    merge_resolved = nuke.nodes.Merge2(xpos=dot_input.xpos(), ypos=dot_output.ypos() + 50)
285
+                    merge_resolved['operation'].setValue("plus")
286
+                    merge_resolved['name'].setValue("merge_resolved__")
287
+
288
+                # connect plus
289
+                # skip Mask Input
290
+                if j==2:
291
+                    j+=1
292
+                # connect input
293
+                merge_resolved.setInput(j, shuffle)
294
+
295
+                # next please
296
+                i += 1
297
+                j += 1
298
+
299
+            # connect to the input1 node
300
+            dot_resolved.setInput(0, merge_resolved)
301
+
141 302
     else:
142 303
         # shuffle
143
-        shuffle = nuke.nodes.Shuffle(xpos=input.xpos() - (len(resolved)/2)*offset + (i * offset), ypos=input.ypos() + offset)
304
+        shuffle = nuke.nodes.Shuffle(xpos=dot_input.xpos()  + (i * offset), ypos=dot_input.ypos() + offset)
144 305
         # create black in rgb and a
145 306
         shuffle['in'].setValue('none')
146 307
         shuffle['in2'].setValue('none')
147 308
         shuffle['out'].setValue('rgb')
309
+        shuffle['name'].setValue('shuffle_empty__')
148 310
 
149
-        shuffle.setInput(0, input)
311
+        shuffle.setInput(0, dot_input)
150 312
 
151 313
         # remove old input connections
152
-        for r in range(output.inputs()):
153
-            output.setInput(r, None)
314
+        #for r in range(output.inputs()):
315
+        #    output.setInput(r, None)
316
+
317
+        # connect to the input1 node
318
+        dot_resolved.setInput(0, shuffle)
154 319
 
155
-        output.setInput(0, shuffle)
156
-        n['label'].setValue("NO MATCH.")
157 320
 
158
-    return None
321
+    # connect the nodes
322
+    dot_input.setInput(0, input)
323
+    dot_input2.setInput(0, dot_input)
324
+    dot_input_from.setInput(0, merge_from)
325
+    dot_resolved2.setInput(0, dot_resolved)
326
+    dot_resolved3.setInput(0, dot_resolved2)
327
+    merge_plus.setInput(1, grade)
328
+    merge_plus.setInput(0, dot_input_from)
329
+    grade.setInput(0, exposure)
330
+    exposure.setInput(0, dot_resolved)
331
+    merge_from.setInput(0, dot_input2)
332
+    merge_from.setInput(1, dot_resolved)
333
+    contact_sheet_all.setInput(0, dot_input2)
334
+    switch.setInput(0, merge_plus)
335
+    switch.setInput(1, contact_sheet_all)
336
+    switch.setInput(2, dot_resolved3)
337
+    dot_output.setInput(0,switch)
338
+    output.setInput(0, dot_output)
339
+
340
+    # link the nodes
341
+    exposure['mode'].setValue('Stops')
342
+    exposure['gang'].setValue(0)
343
+    exposure['red'].setExpression('parent.exposure')
344
+    exposure['green'].setExpression('parent.exposure')
345
+    exposure['blue'].setExpression('parent.exposure')
346
+    # init
347
+    grade['multiply'].setValue([1,1,1,1])
348
+    grade['multiply'].setExpression('parent.multiply.r',0)
349
+    grade['multiply'].setExpression('parent.multiply.g',1)
350
+    grade['multiply'].setExpression('parent.multiply.b',2)
351
+    grade['multiply'].setValue(1, 3)
352
+    # enable Compensate Mult by default
353
+    grade['white'].setExpression('parent.compensate == 1 ? 1/((parent.multiply.r+parent.multiply.g+parent.multiply.b)/3) : 1')
354
+    grade['gamma'].setExpression('parent.gamma')
355
+    contact_sheet_all['width'].setExpression('parent.width')
356
+    contact_sheet_all['height'].setExpression('parent.height')
357
+    contact_sheet_all['showLayerNames'].setValue(1)
358
+    # again. Weird Update Issues
359
+    contact_sheet_all['showLayerNames'].setExpression('parent.mode == 0 ? 0 :1')
360
+    switch['which'].setExpression('parent.mode == 0 ? 0 :(parent.mode == 1 ? 2 : 1)')
361
+
362
+    # arrange the nodes
363
+    weird_dot_offset = 0
364
+    dot_input.setXYpos(input.xpos()+weird_dot_offset, input.ypos() + 100)
365
+    if merge_resolved:
366
+        merge_resolved.setXYpos(input.xpos(), input.ypos() + 350)
367
+    dot_resolved.setXYpos(input.xpos()+weird_dot_offset, input.ypos() + 500)
368
+    dot_resolved2.setXYpos(dot_resolved.xpos()-250+weird_dot_offset, dot_resolved.ypos())
369
+    dot_resolved3.setXYpos(dot_resolved2.xpos()+weird_dot_offset, dot_resolved2.ypos() + 500)
370
+    exposure.setXYpos(dot_resolved.xpos(), dot_resolved.ypos()+150)
371
+    grade.setXYpos(exposure.xpos(), exposure.ypos() + 150)
372
+    merge_plus.setXYpos(grade.xpos(), grade.ypos() + 150)
373
+    switch.setXYpos(merge_plus.xpos(), merge_plus.ypos() + 150)
374
+    dot_output.setXYpos(switch.xpos()+weird_dot_offset, switch.ypos() + 150)
375
+    output.setXYpos(dot_output.xpos(), dot_output.ypos() + 150)
376
+    merge_from.setXYpos(dot_input2.xpos(), dot_resolved.ypos())
377
+    dot_input_from.setXYpos(merge_from.xpos()+weird_dot_offset, merge_plus.ypos())
378
+
379
+    n['label'].setValue('[value pattern]')
380
+    return None

+ 463
- 258
pythonpluginsUI/sceneControl/sceneControl.py
Plik diff jest za duży
Wyświetl plik


Ładowanie…
Anuluj
Zapisz