@@ -132,6 +132,7 @@ def _setup_options(self, options: NTPOptions) -> bool:
132132 self ._author_name = options .author_name
133133 self ._version = options .version
134134 self ._location = options .location
135+ self ._license = options .license
135136 self ._category = options .category
136137 self ._custom_category = options .custom_category
137138 if options .menu_id in dir (bpy .types ):
@@ -176,11 +177,12 @@ def _create_header(self, name: str) -> None:
176177 """
177178
178179 self ._write ("bl_info = {" , "" )
180+ self ._name = name
179181 if self ._name_override and self ._name_override != "" :
180- name = self ._name_override
181- self ._write (f"\t \" name\" : { str_to_py_str (name )} ," , "" )
182+ self . _name = self ._name_override
183+ self ._write (f"\t \" name\" : { str_to_py_str (self . _name )} ," , "" )
182184 if self ._description and self ._description != "" :
183- self .write (f"\t \" description\" : { str_to_py_str (self ._description )} ," "" )
185+ self ._write (f"\t \" description\" : { str_to_py_str (self ._description )} ," "" )
184186 self ._write (f"\t \" author\" : { str_to_py_str (self ._author_name )} ," , "" )
185187 self ._write (f"\t \" version\" : { vec3_to_py_str (self ._version )} ," , "" )
186188 self ._write (f"\t \" blender\" : { bpy .app .version } ," , "" )
@@ -204,6 +206,7 @@ def _init_operator(self, idname: str, label: str) -> None:
204206 idname (str): name for the operator
205207 label (str): appearence inside Blender
206208 """
209+ self ._idname = idname
207210 self ._write (f"class { self ._class_name } (bpy.types.Operator):" , "" )
208211 self ._write (f"\t bl_idname = \" node.{ idname } \" " , "" )
209212 self ._write (f"\t bl_label = { str_to_py_str (label )} " , "" )
@@ -391,8 +394,8 @@ def _set_settings_defaults(self, node: Node) -> None:
391394 elif st == ST .IMAGE :
392395 if self ._addon_dir is not None and attr is not None :
393396 if attr .source in {'FILE' , 'GENERATED' , 'TILED' }:
394- self ._save_image (attr )
395- self ._load_image (attr , f"{ node_var } .{ attr_name } " )
397+ if self ._save_image (attr ):
398+ self ._load_image (attr , f"{ node_var } .{ attr_name } " )
396399 elif st == ST .IMAGE_USER :
397400 self ._image_user_settings (attr , f"{ node_var } .{ attr_name } " )
398401 elif st == ST .SIM_OUTPUT_ITEMS :
@@ -779,8 +782,8 @@ def _set_input_defaults(self, node: Node) -> None:
779782 elif input .bl_idname == 'NodeSocketImage' :
780783 img = input .default_value
781784 if img is not None and self ._addon_dir != None : # write in a better way
782- self ._save_image (img )
783- self ._load_image (img , f"{ socket_var } .default_value" )
785+ if self ._save_image (img ):
786+ self ._load_image (img , f"{ socket_var } .default_value" )
784787 default_val = None
785788
786789 # materials
@@ -1037,7 +1040,7 @@ def _node_tree_settings(self, node: Node, attr_name: str) -> None:
10371040 self .report ({'WARNING' }, (f"NodeToPython: Node tree dependency graph "
10381041 f"wasn't properly initialized" ))
10391042
1040- def _save_image (self , img : bpy .types .Image ) -> None :
1043+ def _save_image (self , img : bpy .types .Image ) -> bool :
10411044 """
10421045 Saves an image to an image directory of the add-on
10431046
@@ -1046,13 +1049,13 @@ def _save_image(self, img: bpy.types.Image) -> None:
10461049 """
10471050
10481051 if img is None :
1049- return
1052+ return False
10501053
10511054 img_str = img_to_py_str (img )
10521055
10531056 if not img .has_data :
10541057 self .report ({'WARNING' }, f"{ img_str } has no data" )
1055- return
1058+ return False
10561059
10571060 # create image dir if one doesn't exist
10581061 img_dir = os .path .join (self ._addon_dir , IMAGE_DIR_NAME )
@@ -1064,6 +1067,7 @@ def _save_image(self, img: bpy.types.Image) -> None:
10641067 img_path = f"{ img_dir } /{ img_str } "
10651068 if not os .path .exists (img_path ):
10661069 img .save_render (img_path )
1070+ return True
10671071
10681072 def _load_image (self , img : bpy .types .Image , img_var : str ) -> None :
10691073 """
@@ -1375,6 +1379,25 @@ def _create_main_func(self) -> None:
13751379 self ._write ("if __name__ == \" __main__\" :" , "" )
13761380 self ._write ("register()" , "\t " )
13771381
1382+ if bpy .app .version >= (4 , 2 , 0 ):
1383+ def _create_manifest (self ) -> None :
1384+ manifest = open (f"{ self ._addon_dir } /blender_manifest.toml" , "w" )
1385+ manifest .write ("schema_version = \" 1.0.0\" \n \n " )
1386+ manifest .write (f"id = { str_to_py_str (self ._idname )} \n " )
1387+
1388+ manifest .write (f"version = { version_to_manifest_str (self ._version )} \n " )
1389+ manifest .write (f"name = { str_to_py_str (self ._name )} \n " )
1390+ manifest .write (f"tagline = { str_to_py_str (self ._description )} \n " )
1391+ manifest .write (f"maintainer = { str_to_py_str (self ._author_name )} \n " )
1392+ manifest .write ("type = \" add-on\" \n " )
1393+ manifest .write (f"blender_version_min = { version_to_manifest_str (bpy .app .version )} \n " )
1394+ if self ._license != 'OTHER' :
1395+ manifest .write (f"license = [{ str_to_py_str (self ._license )} ]\n " )
1396+ else :
1397+ self .report ({'WARNING' }, "No license selected. Please add a license to the manifest file" )
1398+
1399+ manifest .close ()
1400+
13781401 def _zip_addon (self ) -> None :
13791402 """
13801403 Zips up the addon and removes the directory
0 commit comments