summaryrefslogtreecommitdiff
path: root/grc/python/Platform.py
diff options
context:
space:
mode:
Diffstat (limited to 'grc/python/Platform.py')
-rw-r--r--grc/python/Platform.py53
1 files changed, 53 insertions, 0 deletions
diff --git a/grc/python/Platform.py b/grc/python/Platform.py
index 21fd7ef8d2..1d932761d8 100644
--- a/grc/python/Platform.py
+++ b/grc/python/Platform.py
@@ -24,6 +24,7 @@ from gnuradio import gr
from .. base.Platform import Platform as _Platform
from .. gui.Platform import Platform as _GUIPlatform
+from .. gui import Messages
from . import extract_docs
from .FlowGraph import FlowGraph as _FlowGraph
@@ -84,6 +85,7 @@ class Platform(_Platform, _GUIPlatform):
self,
prefs_file=PREFS_FILE
)
+ self._auto_hier_block_generate_chain = set()
@staticmethod
def _move_old_pref_file():
@@ -111,6 +113,57 @@ class Platform(_Platform, _GUIPlatform):
)
return block
+ @staticmethod
+ def find_file_in_paths(filename, paths, cwd):
+ """Checks the provided paths relative to cwd for a certain filename"""
+ if not os.path.isdir(cwd):
+ cwd = os.path.dirname(cwd)
+ if isinstance(paths, str):
+ paths = (p for p in paths.split(':') if p)
+
+ for path in paths:
+ path = os.path.expanduser(path)
+ if not os.path.isabs(path):
+ path = os.path.normpath(os.path.join(cwd, path))
+ file_path = os.path.join(path, filename)
+ if os.path.exists(os.path.normpath(file_path)):
+ return file_path
+
+ def load_and_generate_flow_graph(self, file_path):
+ """Loads a flowgraph from file and generates it"""
+ Messages.set_indent(len(self._auto_hier_block_generate_chain))
+ Messages.send('>>> Loading: %r\n' % file_path)
+ if file_path in self._auto_hier_block_generate_chain:
+ Messages.send(' >>> Warning: cyclic hier_block dependency\n')
+ return False
+ self._auto_hier_block_generate_chain.add(file_path)
+ try:
+ flow_graph = self.get_new_flow_graph()
+ flow_graph.grc_file_path = file_path
+ # other, nested higiter_blocks might be auto-loaded here
+ flow_graph.import_data(self.parse_flow_graph(file_path))
+ flow_graph.rewrite()
+ flow_graph.validate()
+ if not flow_graph.is_valid():
+ raise Exception('Flowgraph invalid')
+ except Exception as e:
+ Messages.send('>>> Load Error: %r: %s\n' % (file_path, str(e)))
+ return False
+ finally:
+ self._auto_hier_block_generate_chain.discard(file_path)
+ Messages.set_indent(len(self._auto_hier_block_generate_chain))
+
+ try:
+ Messages.send('>>> Generating: %r\n' % file_path)
+ generator = self.get_generator()(flow_graph, file_path)
+ generator.write()
+ except Exception as e:
+ Messages.send('>>> Generate Error: %r: %s\n' % (file_path, str(e)))
+ return False
+
+ self.load_block_xml(generator.get_file_path_xml())
+ return True
+
##############################################
# Constructors
##############################################