@@ -176,6 +176,7 @@ class GeoNodesToPython(bpy.types.Operator):
176176            ('ADDON' , "Addon" , "Create a full addon" )
177177        ]
178178    )
179+ 
179180    geo_nodes_group_name : bpy .props .StringProperty (name = "Node Group" )
180181
181182    def  execute (self , context ):
@@ -187,16 +188,17 @@ def execute(self, context):
187188
188189        if  self .mode  ==  'ADDON' :
189190            #find base directory to save new addon 
190-             base_dir  =  bpy .path .abspath ("//" )
191-             if  not  base_dir  or  base_dir  ==  "" :
191+             dir  =  bpy .path .abspath (context . scene . ntp_options . dir_path )
192+             if  not  dir  or  dir  ==  "" :
192193                self .report ({'ERROR' }, 
193194                            ("NodeToPython: Save your blend file before using " 
194195                            "NodeToPython!" ))
195196                return  {'CANCELLED' }
196197
197198            #save in addons/ subdirectory 
198-             zip_dir  =  os .path .join (base_dir ,  "addons" , nt_var )
199+             zip_dir  =  os .path .join (dir , nt_var )
199200            addon_dir  =  os .path .join (zip_dir , nt_var )
201+ 
200202            if  not  os .path .exists (addon_dir ):
201203                os .makedirs (addon_dir )
202204            file  =  open (f"{ addon_dir }  /__init__.py" , "w" )
@@ -215,8 +217,8 @@ def execute(self, context):
215217        #dictionary to keep track of node->variable name pairs 
216218        node_vars  =  {}
217219
218-         #keeps  track of all used variables  
219-         used_vars  =  set () 
220+         #dictionary to keep  track of variables->usage count pairs  
221+         used_vars  =  {} 
220222
221223        def  process_geo_nodes_group (node_tree , level , node_vars , used_vars ):
222224            nt_var  =  create_var (node_tree .name , used_vars )
@@ -248,40 +250,48 @@ def process_geo_nodes_group(node_tree, level, node_vars, used_vars):
248250                                                used_vars )
249251                        node_trees .add (node_nt )
250252                elif  node .bl_idname  ==  'NodeGroupInput'  and  not  inputs_set :
251-                     group_io_settings (node , file , inner , "input" , nt_var , node_tree )
253+                     group_io_settings (node , file , inner , "input" , nt_var , 
254+                                       node_tree )
252255                    inputs_set  =  True 
253256
254257                elif  node .bl_idname  ==  'NodeGroupOutput'  and  not  outputs_set :
255-                     group_io_settings (node , file , inner , "output" , nt_var , node_tree )
258+                     group_io_settings (node , file , inner , "output" , nt_var , 
259+                                       node_tree )
256260                    outputs_set  =  True 
257261
258262                #create node 
259263                node_var  =  create_node (node , file , inner , nt_var , 
260-                                       node_vars , used_vars )
264+                                         node_vars , used_vars )
261265                set_settings_defaults (node , geo_node_settings , file , inner , 
262-                                          node_var )
266+                                       node_var )
263267                hide_sockets (node , file , inner , node_var )
264268
265269                if  node .bl_idname  ==  'GeometryNodeGroup' :
266270                    if  node .node_tree  is  not   None :
267271                        file .write ((f"{ inner } { node_var }  .node_tree = " 
268272                                    f"bpy.data.node_groups" 
269273                                    f"[{ str_to_py_str (node .node_tree .name )}  ]\n " ))
274+ 
270275                elif  node .bl_idname  ==  'ShaderNodeValToRGB' :
271276                    color_ramp_settings (node , file , inner , node_var )
277+ 
272278                elif  node .bl_idname  in  curve_nodes :
273279                    curve_node_settings (node , file , inner , node_var )
280+ 
274281                elif  node .bl_idname  in  image_nodes  and  self .mode  ==  'ADDON' :
275282                    img  =  node .image 
276283                    if  img  is  not   None  and  img .source  in  {'FILE' , 'GENERATED' , 'TILED' }:
277284                        save_image (img , addon_dir )
278285                        load_image (img , file , inner , f"{ node_var }  .image" )
286+ 
279287                elif  node .bl_idname  ==  'GeometryNodeSimulationInput' :
280288                    sim_inputs .append (node )
289+ 
281290                elif  node .bl_idname  ==  'GeometryNodeSimulationOutput' :
282291                    file .write (f"{ inner }  #remove generated sim state items\n " )
283292                    file .write (f"{ inner }  for item in { node_var }  .state_items:\n " )
284293                    file .write (f"{ inner } \t { node_var }  .state_items.remove(item)\n " )
294+ 
285295                    for  i , si  in  enumerate (node .state_items ):
286296                        socket_type  =  enum_to_py_str (si .socket_type )
287297                        name  =  str_to_py_str (si .name )
@@ -314,10 +324,12 @@ def process_geo_nodes_group(node_tree, level, node_vars, used_vars):
314324                    set_input_defaults (node , file , inner , node_var )
315325                set_output_defaults (sim_input , file , inner , sim_input_var )
316326
327+             #set look of nodes 
317328            set_parents (node_tree , file , inner , node_vars )
318329            set_locations (node_tree , file , inner , node_vars )
319330            set_dimensions (node_tree , file , inner , node_vars )
320331
332+             #create connections 
321333            init_links (node_tree , file , inner , nt_var , node_vars )
322334
323335            file .write (f"{ inner }  return { nt_var } \n " )
@@ -358,7 +370,14 @@ def apply_modifier():
358370
359371        if  self .mode  ==  'ADDON' :
360372            zip_addon (zip_dir )
361-         self .report ({'INFO' }, "NodeToPython: Saved geometry nodes group" )
373+ 
374+         #alert user that NTP is finished 
375+         if  self .mode  ==  'SCRIPT' :
376+             location  =  "clipboard" 
377+         else :
378+             location  =  dir 
379+         self .report ({'INFO' }, 
380+                     f"NodeToPython: Saved geometry nodes group to { location }  " )
362381        return  {'FINISHED' }
363382
364383    def  invoke (self , context , event ):
@@ -379,7 +398,8 @@ def draw(self, context):
379398        layout  =  self .layout .column_flow (columns = 1 )
380399        layout .operator_context  =  'INVOKE_DEFAULT' 
381400
382-         geo_node_groups  =  [node  for  node  in  bpy .data .node_groups  if  node .type  ==  'GEOMETRY' ]
401+         geo_node_groups  =  [node  for  node  in  bpy .data .node_groups  
402+                            if  node .type  ==  'GEOMETRY' ]
383403
384404        for  geo_ng  in  geo_node_groups :
385405            op  =  layout .operator (GeoNodesToPython .bl_idname , text = geo_ng .name )
0 commit comments