@@ -64,8 +64,8 @@ class NTP_Operator(Operator):
64
64
bpy .types .NodeTreeInterfaceSocketTexture
65
65
}
66
66
67
- def __init__ (self ):
68
- super ().__init__ ()
67
+ def __init__ (self , * args , ** kwargs ):
68
+ super ().__init__ (* args , ** kwargs )
69
69
70
70
# Write functions after nodes are mostly initialized and linked up
71
71
self ._write_after_links : list [Callable ] = []
@@ -229,6 +229,9 @@ def _init_operator(self, idname: str, label: str) -> None:
229
229
"""
230
230
self ._idname = idname
231
231
self ._write (f"class { self ._class_name } (bpy.types.Operator):" , 0 )
232
+ self ._write ("def __init__(self, *args, **kwargs):" , 1 )
233
+ self ._write ("super().__init__(*args, **kwargs)\n " , 2 )
234
+
232
235
self ._write (f"bl_idname = \" node.{ idname } \" " , 1 )
233
236
self ._write (f"bl_label = { str_to_py_str (label )} " , 1 )
234
237
self ._write ("bl_options = {\' REGISTER\' , \' UNDO\' }\n " , 1 )
@@ -408,26 +411,27 @@ def _set_settings_defaults(self, node: Node) -> None:
408
411
elif st == ST .COLOR :
409
412
self ._write (f"{ setting_str } = { color_to_py_str (attr )} " )
410
413
elif st == ST .MATERIAL :
411
- name = str_to_py_str (attr .name )
412
- self ._write (f"if { name } in bpy.data.materials:" )
413
- self ._write (f"{ setting_str } = bpy.data.materials[{ name } ]" ,
414
- self ._inner_indent_level + 1 )
414
+ self ._set_if_in_blend_file (attr , setting_str , "materials" )
415
415
elif st == ST .OBJECT :
416
- name = str_to_py_str (attr .name )
417
- self ._write (f"if { name } in bpy.data.objects:" )
418
- self ._write (f"{ setting_str } = bpy.data.objects[{ name } ]" ,
419
- self ._inner_indent_level + 1 )
416
+ self ._set_if_in_blend_file (attr , setting_str , "objects" )
417
+ elif st == ST .COLLECTION :
418
+ self ._set_if_in_blend_file (attr , setting_str , "collections" )
420
419
elif st == ST .COLOR_RAMP :
421
420
self ._color_ramp_settings (node , attr_name )
422
421
elif st == ST .CURVE_MAPPING :
423
422
self ._curve_mapping_settings (node , attr_name )
424
423
elif st == ST .NODE_TREE :
425
424
self ._node_tree_settings (node , attr_name )
426
425
elif st == ST .IMAGE :
427
- if self ._addon_dir is not None and attr is not None :
426
+ if attr is None :
427
+ continue
428
+ if self ._addon_dir is not None :
428
429
if attr .source in {'FILE' , 'GENERATED' , 'TILED' }:
429
430
if self ._save_image (attr ):
430
431
self ._load_image (attr , f"{ node_var } .{ attr_name } " )
432
+ else :
433
+ self ._set_if_in_blend_file (attr , setting_str , "images" )
434
+
431
435
elif st == ST .IMAGE_USER :
432
436
self ._image_user_settings (attr , f"{ node_var } .{ attr_name } " )
433
437
elif st == ST .SIM_OUTPUT_ITEMS :
@@ -755,6 +759,7 @@ def _process_items(self, parent: NodeTreeInterfacePanel,
755
759
processed items, so none are done twice
756
760
ntp_nt (NTP_NodeTree): owner of the socket
757
761
"""
762
+
758
763
if parent is None :
759
764
items = ntp_nt .node_tree .interface .items_tree
760
765
else :
@@ -774,6 +779,14 @@ def _process_items(self, parent: NodeTreeInterfacePanel,
774
779
elif item .item_type == 'PANEL' :
775
780
self ._create_panel (item , panel_dict , items_processed ,
776
781
parent , ntp_nt )
782
+ if bpy .app .version >= (4 , 4 , 0 ) and parent is not None :
783
+ nt_var = self ._node_tree_vars [ntp_nt .node_tree ]
784
+ interface_var = f"{ nt_var } .interface"
785
+ panel_var = panel_dict [item ]
786
+ parent_var = panel_dict [parent ]
787
+ self ._write (f"{ interface_var } .move_to_parent("
788
+ f"{ panel_var } , { parent_var } , { item .index } )" )
789
+
777
790
778
791
def _tree_interface_settings (self , ntp_nt : NTP_NodeTree ) -> None :
779
792
"""
@@ -837,9 +850,12 @@ def _set_input_defaults(self, node: Node) -> None:
837
850
# images
838
851
elif input .bl_idname == 'NodeSocketImage' :
839
852
img = input .default_value
840
- if img is not None and self ._addon_dir != None : # write in a better way
841
- if self ._save_image (img ):
842
- self ._load_image (img , f"{ socket_var } .default_value" )
853
+ if img is not None :
854
+ if self ._addon_dir != None : # write in a better way
855
+ if self ._save_image (img ):
856
+ self ._load_image (img , f"{ socket_var } .default_value" )
857
+ else :
858
+ self ._in_file_inputs (input , socket_var , "images" )
843
859
default_val = None
844
860
845
861
# materials
@@ -921,6 +937,16 @@ def _set_socket_defaults(self, node: Node):
921
937
self ._set_input_defaults (node )
922
938
self ._set_output_defaults (node )
923
939
940
+ def _set_if_in_blend_file (self , attr , setting_str : str , data_type : str
941
+ ) -> None :
942
+ """
943
+ Attempts to grab referenced thing from blend file
944
+ """
945
+ name = str_to_py_str (attr .name )
946
+ self ._write (f"if { name } in bpy.data.{ data_type } :" )
947
+ self ._write (f"{ setting_str } = bpy.data.{ data_type } [{ name } ]" ,
948
+ self ._inner_indent_level + 1 )
949
+
924
950
def _color_ramp_settings (self , node : Node , color_ramp_name : str ) -> None :
925
951
"""
926
952
Replicate a color ramp node
0 commit comments