77import tornado
88
99from jupytercad_freecad .freecad .loader import FCStd
10-
10+ from jupytercad_freecad . freecad . jcad_converter import convert_jcad_to_fcstd
1111
1212class BackendCheckHandler (APIHandler ):
1313 @tornado .web .authenticated
@@ -85,6 +85,40 @@ def post(self):
8585 self .finish (json .dumps ({"done" : True , "exportedPath" : str (export_path )}))
8686
8787
88+ class FCStdExportHandler (APIHandler ):
89+ @tornado .web .authenticated
90+ def post (self ):
91+ body = self .get_json_body ()
92+
93+ # same path‐splitting logic as JCadExportHandler
94+ path = body .get ("path" , "" )
95+ parts = path .split (":" , 1 )
96+ file_name = parts [1 ] if len (parts ) == 2 else parts [0 ]
97+
98+ new_name = body ["newName" ]
99+ root_dir = Path (self .contents_manager .root_dir ).resolve ()
100+ in_path = Path (to_os_path (ApiPath (file_name ), str (root_dir )))
101+ out_path = in_path .parent / new_name
102+
103+ # load JCAD JSON from disk
104+ try :
105+ jcad_dict = json .loads (in_path .read_text ())
106+ except Exception as e :
107+ self .log .error (f"Error reading JCAD file { in_path } : { e } " )
108+ self .set_status (500 )
109+ return self .finish (json .dumps ({"error" : str (e )}))
110+
111+ # convert to FreeCAD document
112+ try :
113+ doc = convert_jcad_to_fcstd (jcad_dict )
114+ doc .saveAs (str (out_path )) # write .FCStd
115+ except Exception as e :
116+ self .log .error (f"Conversion to FCStd failed: { e } " )
117+ self .set_status (500 )
118+ return self .finish (json .dumps ({"error" : str (e )}))
119+
120+ self .finish (json .dumps ({"done" : True , "exportedPath" : str (out_path )}))
121+
88122def setup_handlers (web_app ):
89123 host_pattern = ".*$"
90124
@@ -98,6 +132,10 @@ def setup_handlers(web_app):
98132 (
99133 url_path_join (base_url , "jupytercad_freecad" , "export-jcad" ),
100134 JCadExportHandler ,
135+ ),
136+ (
137+ url_path_join (base_url , "jupytercad_freecad" , "export-fcstd" ),
138+ FCStdExportHandler ,
101139 ),
102140 ]
103141 web_app .add_handlers (host_pattern , handlers )
0 commit comments