@@ -64,8 +64,8 @@ class NTP_Operator(Operator):
6464 bpy .types .NodeTreeInterfaceSocketTexture
6565 }
6666
67- def __init__ (self ):
68- super ().__init__ ()
67+ def __init__ (self , * args , ** kwargs ):
68+ super ().__init__ (* args , ** kwargs )
6969
7070 # Write functions after nodes are mostly initialized and linked up
7171 self ._write_after_links : list [Callable ] = []
@@ -229,6 +229,9 @@ def _init_operator(self, idname: str, label: str) -> None:
229229 """
230230 self ._idname = idname
231231 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+
232235 self ._write (f"bl_idname = \" node.{ idname } \" " , 1 )
233236 self ._write (f"bl_label = { str_to_py_str (label )} " , 1 )
234237 self ._write ("bl_options = {\' REGISTER\' , \' UNDO\' }\n " , 1 )
@@ -408,26 +411,27 @@ def _set_settings_defaults(self, node: Node) -> None:
408411 elif st == ST .COLOR :
409412 self ._write (f"{ setting_str } = { color_to_py_str (attr )} " )
410413 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" )
415415 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" )
420419 elif st == ST .COLOR_RAMP :
421420 self ._color_ramp_settings (node , attr_name )
422421 elif st == ST .CURVE_MAPPING :
423422 self ._curve_mapping_settings (node , attr_name )
424423 elif st == ST .NODE_TREE :
425424 self ._node_tree_settings (node , attr_name )
426425 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 :
428429 if attr .source in {'FILE' , 'GENERATED' , 'TILED' }:
429430 if self ._save_image (attr ):
430431 self ._load_image (attr , f"{ node_var } .{ attr_name } " )
432+ else :
433+ self ._set_if_in_blend_file (attr , setting_str , "images" )
434+
431435 elif st == ST .IMAGE_USER :
432436 self ._image_user_settings (attr , f"{ node_var } .{ attr_name } " )
433437 elif st == ST .SIM_OUTPUT_ITEMS :
@@ -755,6 +759,7 @@ def _process_items(self, parent: NodeTreeInterfacePanel,
755759 processed items, so none are done twice
756760 ntp_nt (NTP_NodeTree): owner of the socket
757761 """
762+
758763 if parent is None :
759764 items = ntp_nt .node_tree .interface .items_tree
760765 else :
@@ -774,6 +779,14 @@ def _process_items(self, parent: NodeTreeInterfacePanel,
774779 elif item .item_type == 'PANEL' :
775780 self ._create_panel (item , panel_dict , items_processed ,
776781 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+
777790
778791 def _tree_interface_settings (self , ntp_nt : NTP_NodeTree ) -> None :
779792 """
@@ -837,9 +850,12 @@ def _set_input_defaults(self, node: Node) -> None:
837850 # images
838851 elif input .bl_idname == 'NodeSocketImage' :
839852 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" )
843859 default_val = None
844860
845861 # materials
@@ -921,6 +937,16 @@ def _set_socket_defaults(self, node: Node):
921937 self ._set_input_defaults (node )
922938 self ._set_output_defaults (node )
923939
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+
924950 def _color_ramp_settings (self , node : Node , color_ramp_name : str ) -> None :
925951 """
926952 Replicate a color ramp node
0 commit comments