/// <summary> /// Setup the "Samples" sub-menu with contents of samples directory. /// </summary> /// <param name="bench">The bench where the UI will be loaded</param> public static void LoadSamplesMenu(dynBench bench) { string directory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string samplesPath = Path.Combine(directory, "samples"); if (Directory.Exists(samplesPath)) { string[] dirPaths = Directory.GetDirectories(samplesPath); string[] filePaths = Directory.GetFiles(samplesPath, "*.dyn"); // handle top-level files if (filePaths.Any()) { foreach (string path in filePaths) { var item = new MenuItem { Header = Path.GetFileNameWithoutExtension(path), Tag = path }; item.Click += OpenSample_Click; bench.SamplesMenu.Items.Add(item); } } // handle top-level dirs, TODO - factor out to a seperate function, make recusive if (dirPaths.Any()) { foreach (string dirPath in dirPaths) { var dirItem = new MenuItem { Header = Path.GetFileName(dirPath), Tag = Path.GetFileName(dirPath) }; filePaths = Directory.GetFiles(dirPath, "*.dyn"); if (filePaths.Any()) { foreach (string path in filePaths) { var item = new MenuItem { Header = Path.GetFileNameWithoutExtension(path), Tag = path }; item.Click += OpenSample_Click; dirItem.Items.Add(item); } } bench.SamplesMenu.Items.Add(dirItem); } return; } } //this.fileMenu.Items.Remove(this.samplesMenu); }
/// <summary> /// Class constructor /// </summary> public DynamoController(ExecutionEnvironment env) { dynSettings.Controller = this; this.RunEnabled = true; this.CanRunDynamically = true; Bench = new dynBench(this); dynSettings.Bench = Bench; // custom node loader string directory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string pluginsPath = Path.Combine(directory, "definitions"); CustomNodeLoader = new CustomNodeLoader(pluginsPath); SearchViewModel = new SearchViewModel(); PackageManagerClient = new PackageManagerClient(this); PackageManagerLoginViewModel = new PackageManagerLoginViewModel(PackageManagerClient); PackageManagerPublishViewModel = new PackageManagerPublishViewModel(PackageManagerClient); FSchemeEnvironment = env; HomeSpace = CurrentSpace = new HomeWorkspace(); Bench.CurrentOffset = new Point(dynBench.CANVAS_OFFSET_X, dynBench.CANVAS_OFFSET_Y); Bench.InitializeComponent(); Bench.Log(String.Format( "Dynamo -- Build {0}.", Assembly.GetExecutingAssembly().GetName().Version)); DynamoLoader.LoadBuiltinTypes(SearchViewModel, this, Bench); DynamoLoader.LoadSamplesMenu(Bench); Bench.settings_curves.IsChecked = true; Bench.settings_curves.IsChecked = false; Bench.LockUI(); Bench.Activated += OnBenchActivated; dynSettings.Workbench = Bench.WorkBench; //run tests if (FScheme.RunTests(Bench.Log)) { if (Bench != null) Bench.Log("All Tests Passed. Core library loaded OK."); } }
//public DynamoController(SplashScreen splash) public DynamoController() { Bench = new dynBench(this); homeSpace = CurrentSpace = new HomeWorkspace(); Bench.CurrentX = dynBench.CANVAS_OFFSET_X; Bench.CurrentY = dynBench.CANVAS_OFFSET_Y; Bench.InitializeComponent(); Bench.Log(String.Format( "Dynamo -- Build {0}.", Assembly.GetExecutingAssembly().GetName().Version.ToString())); dynSettings.Bench = Bench; dynSettings.Controller = this; dynSettings.Workbench = Bench.WorkBench; if (DynamoCommands.ShowSplashScreenCmd.CanExecute(null)) { DynamoCommands.ShowSplashScreenCmd.Execute(null); } //WTF Bench.settings_curves.IsChecked = true; Bench.settings_curves.IsChecked = false; Bench.LockUI(); //run tests if (FScheme.RunTests(Bench.Log)) Bench.Log("All Tests Passed. Core library loaded OK."); FSchemeEnvironment = new ExecutionEnvironment(); LoadBuiltinTypes(); PopulateSamplesMenu(); Bench.Activated += Bench_Activated; //Dispatcher.CurrentDispatcher.Hooks.DispatcherInactive += new EventHandler(Hooks_DispatcherInactive); }
/// <summary> /// Load Custom Nodes from the default directory - the "definitions" /// directory where the executing assembly is located.. /// </summary> /// <param name="bench">The logger is needed in order to tell how long it took.</param> public static void LoadCustomNodes(dynBench bench, CustomNodeLoader customNodeLoader, SearchViewModel searchViewModel) { // custom node loader var sw = new Stopwatch(); sw.Start(); customNodeLoader.UpdateSearchPath(); var nn = customNodeLoader.GetNodeNameCategoryAndGuidList(); // add nodes to search foreach (var pair in nn) { searchViewModel.Add(pair.Item1, pair.Item2, pair.Item3); } sw.Stop(); bench.Log(string.Format("{0} ellapsed for loading definitions.", sw.Elapsed)); // update search view searchViewModel.SearchAndUpdateResultsSync(searchViewModel.SearchText); }
public DynamoController(SplashScreen splash) { Bench = new dynBench(this); splashScreen = splash; homeSpace = CurrentSpace = new HomeWorkspace(); Bench.CurrentX = dynBench.CANVAS_OFFSET_X; Bench.CurrentY = dynBench.CANVAS_OFFSET_Y; Bench.InitializeComponent(); Bench.Log(String.Format( "Dynamo -- Build {0}.", Assembly.GetExecutingAssembly().GetName().Version.ToString())); //WTF Bench.settings_curves.IsChecked = true; Bench.settings_curves.IsChecked = false; dynSettings.Bench = Bench; dynSettings.Controller = this; dynSettings.Workbench = Bench.WorkBench; Bench.LockUI(); //run tests if (FScheme.RunTests(Bench.Log)) Bench.Log("All Tests Passed. Core library loaded OK."); FSchemeEnvironment = new ExecutionEnvironment(); LoadBuiltinTypes(); PopulateSamplesMenu(); Bench.Activated += Bench_Activated; }
public Autodesk.Revit.UI.Result Execute(Autodesk.Revit.UI.ExternalCommandData revit, ref string message, ElementSet elements) { try { //create a log file string tempPath = System.IO.Path.GetTempPath(); string logPath = Path.Combine(tempPath, "dynamoLog.txt"); if (File.Exists(logPath)) { File.Delete(logPath); } tw = new StreamWriter(logPath); tw.WriteLine("Dynamo log started " + System.DateTime.Now.ToString()); m_revit = revit.Application; m_doc = m_revit.ActiveUIDocument; trans = new Transaction(m_doc.Document, "Dynamo"); trans.Start(); FailureHandlingOptions failOpt = trans.GetFailureHandlingOptions(); failOpt.SetFailuresPreprocessor(new DynamoWarningSwallower()); trans.SetFailureHandlingOptions(failOpt); m_revit.Idling += new EventHandler <IdlingEventArgs>(OnIdling); #region default level Level defaultLevel = null; FilteredElementCollector fecLevel = new FilteredElementCollector(m_doc.Document); fecLevel.OfClass(typeof(Level)); for (int i = 0; i < fecLevel.ToElements().Count; i++) { defaultLevel = fecLevel.ToElements()[i] as Level; break; } #endregion DynamoWarningSwallower swallow = new DynamoWarningSwallower(); dynElementSettings.SharedInstance.Revit = m_revit; dynElementSettings.SharedInstance.Doc = m_doc; dynElementSettings.SharedInstance.DefaultLevel = defaultLevel; dynElementSettings.SharedInstance.WarningSwallower = swallow; dynElementSettings.SharedInstance.MainTransaction = trans; dynElementSettings.SharedInstance.Writer = tw; //dynElementSettings settings = new dynElementSettings(m_revit, m_doc, //defaultLevel, swallow, trans); //show the log dynamoForm = new dynBench(); //get the window handle Process process = Process.GetCurrentProcess(); new System.Windows.Interop.WindowInteropHelper(dynamoForm).Owner = process.MainWindowHandle; dynamoForm.Show(); if (dynamoForm.DialogResult.HasValue && dynamoForm.DialogResult.Value == false) //the WPF false is "cancel" { tw.WriteLine("Dynamo log ended " + System.DateTime.Now.ToString()); tw.Close(); return(Autodesk.Revit.UI.Result.Cancelled); } } catch (Exception e) { trans.Dispose(); Debug.WriteLine(e.Message + ":" + e.StackTrace); Debug.WriteLine(e.InnerException); message = e.Message + " : " + e.StackTrace; if (tw != null) { tw.WriteLine(e.Message); tw.WriteLine(e.StackTrace); tw.Close(); } return(Autodesk.Revit.UI.Result.Failed); } trans.Commit(); return(Autodesk.Revit.UI.Result.Succeeded); }
void dynamoForm_Closed(object sender, EventArgs e) { dynamoBench = null; }
public Autodesk.Revit.UI.Result Execute(Autodesk.Revit.UI.ExternalCommandData revit, ref string message, ElementSet elements) { if (dynamoBench != null) { dynamoBench.Focus(); return Result.Succeeded; } //SplashScreen splashScreen = null Window splashScreen = null; try { //create a log file string tempPath = System.IO.Path.GetTempPath(); string logPath = Path.Combine(tempPath, "dynamoLog.txt"); if (File.Exists(logPath)) File.Delete(logPath); tw = new StreamWriter(logPath); tw.WriteLine("Dynamo log started " + System.DateTime.Now.ToString()); m_revit = revit.Application; m_doc = m_revit.ActiveUIDocument; #region default level Level defaultLevel = null; FilteredElementCollector fecLevel = new FilteredElementCollector(m_doc.Document); fecLevel.OfClass(typeof(Level)); defaultLevel = fecLevel.ToElements()[0] as Level; #endregion dynRevitSettings.Revit = m_revit; dynRevitSettings.Doc = m_doc; dynRevitSettings.DefaultLevel = defaultLevel; dynSettings.Writer = tw; IdlePromise.ExecuteOnIdle(new Action( delegate { try{ //get window handle IntPtr mwHandle = Process.GetCurrentProcess().MainWindowHandle; //prepare and show splash //splashScreen = new SplashScreen(Assembly.GetExecutingAssembly(), "splash.png"); splashScreen = new DynamoSplash(); //splashScreen.Show(false, true); //show the window var dynamoController = new DynamoController_Revit(DynamoRevitApp.updater); dynamoBench = dynamoController.Bench; //set window handle and show dynamo new System.Windows.Interop.WindowInteropHelper(dynamoBench).Owner = mwHandle; if (System.Windows.Forms.SystemInformation.MonitorCount > 1) { dynamoBench.WindowStartupLocation = WindowStartupLocation.Manual; System.Drawing.Rectangle bounds = System.Windows.Forms.Screen.AllScreens[1].Bounds; dynamoBench.Left = bounds.X; dynamoBench.Top = bounds.Y; dynamoBench.Loaded += new RoutedEventHandler(dynamoForm_Loaded); } else { //System.Drawing.Rectangle bounds = System.Windows.Forms.Screen.AllScreens[0].Bounds; //dynamoForm.Left = bounds.X; //dynamoForm.Top = bounds.Y; dynamoBench.WindowStartupLocation = WindowStartupLocation.CenterOwner; } dynamoBench.Show(); dynamoBench.Closed += new EventHandler(dynamoForm_Closed); } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.ToString()); } } )); } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.ToString()); if (tw != null) { tw.WriteLine(ex.Message); tw.WriteLine(ex.StackTrace); tw.WriteLine("Dynamo log ended " + System.DateTime.Now.ToString()); tw.Close(); } return Result.Failed; } return Autodesk.Revit.UI.Result.Succeeded; }
public DynamoWarningPrinter(dynBench b) { this.bench = b; }
public Autodesk.Revit.UI.Result Execute(Autodesk.Revit.UI.ExternalCommandData revit, ref string message, ElementSet elements) { try { //create a log file string tempPath = System.IO.Path.GetTempPath(); string logPath = Path.Combine(tempPath, "dynamoLog.txt"); if (File.Exists(logPath)) File.Delete(logPath); tw = new StreamWriter(logPath); tw.WriteLine("Dynamo log started " + System.DateTime.Now.ToString()); m_revit = revit.Application; m_doc = m_revit.ActiveUIDocument; trans = new Transaction(m_doc.Document, "Dynamo"); trans.Start(); FailureHandlingOptions failOpt = trans.GetFailureHandlingOptions(); failOpt.SetFailuresPreprocessor(new DynamoWarningSwallower()); trans.SetFailureHandlingOptions(failOpt); m_revit.Idling += new EventHandler<IdlingEventArgs>(OnIdling); #region default level Level defaultLevel = null; FilteredElementCollector fecLevel = new FilteredElementCollector(m_doc.Document); fecLevel.OfClass(typeof(Level)); for (int i = 0; i < fecLevel.ToElements().Count; i++) { defaultLevel = fecLevel.ToElements()[i] as Level; break; } #endregion DynamoWarningSwallower swallow = new DynamoWarningSwallower(); dynElementSettings.SharedInstance.Revit = m_revit; dynElementSettings.SharedInstance.Doc = m_doc; dynElementSettings.SharedInstance.DefaultLevel = defaultLevel; dynElementSettings.SharedInstance.WarningSwallower = swallow; dynElementSettings.SharedInstance.MainTransaction = trans; dynElementSettings.SharedInstance.Writer = tw; //dynElementSettings settings = new dynElementSettings(m_revit, m_doc, //defaultLevel, swallow, trans); //show the log dynamoForm = new dynBench(); //get the window handle Process process = Process.GetCurrentProcess(); new System.Windows.Interop.WindowInteropHelper(dynamoForm).Owner = process.MainWindowHandle; dynamoForm.Show(); if (dynamoForm.DialogResult.HasValue && dynamoForm.DialogResult.Value == false) //the WPF false is "cancel" { tw.WriteLine("Dynamo log ended " + System.DateTime.Now.ToString()); tw.Close(); return Autodesk.Revit.UI.Result.Cancelled; } } catch (Exception e) { trans.Dispose(); Debug.WriteLine(e.Message + ":" + e.StackTrace); Debug.WriteLine(e.InnerException); message = e.Message + " : " + e.StackTrace; if (tw != null) { tw.WriteLine(e.Message); tw.WriteLine(e.StackTrace); tw.Close(); } return Autodesk.Revit.UI.Result.Failed; } trans.Commit(); return Autodesk.Revit.UI.Result.Succeeded; }
private void dynamoForm_Closed(object sender, EventArgs e) { IdlePromise.ClearPromises(); dynamoBench = null; }
public Result Execute(ExternalCommandData revit, ref string message, ElementSet elements) { if (dynamoBench != null) { dynamoBench.Focus(); return Result.Succeeded; } dynSettings.StartLogging(); try { m_revit = revit.Application; m_doc = m_revit.ActiveUIDocument; #region default level Level defaultLevel = null; var fecLevel = new FilteredElementCollector(m_doc.Document); fecLevel.OfClass(typeof (Level)); defaultLevel = fecLevel.ToElements()[0] as Level; #endregion dynRevitSettings.Revit = m_revit; dynRevitSettings.Doc = m_doc; dynRevitSettings.DefaultLevel = defaultLevel; IdlePromise.ExecuteOnIdle(delegate { //get window handle IntPtr mwHandle = Process.GetCurrentProcess().MainWindowHandle; //show the window var dynamoController = new DynamoController_Revit(DynamoRevitApp.env, DynamoRevitApp.updater); dynamoBench = dynamoController.Bench; //set window handle and show dynamo new WindowInteropHelper(dynamoBench).Owner = mwHandle; dynamoBench.WindowStartupLocation = WindowStartupLocation.Manual; Rectangle bounds = Screen.PrimaryScreen.Bounds; dynamoBench.Left = bounds.X; dynamoBench.Top = bounds.Y; dynamoBench.Loaded += dynamoForm_Loaded; dynamoBench.Show(); dynamoBench.Closed += dynamoForm_Closed; }); } catch (Exception ex) { MessageBox.Show(ex.ToString()); if (dynSettings.Writer != null) { dynSettings.Writer.WriteLine(ex.Message); dynSettings.Writer.WriteLine(ex.StackTrace); dynSettings.Writer.WriteLine("Dynamo log ended " + DateTime.Now.ToString()); } return Result.Failed; } return Result.Succeeded; }
public void StartDynamo() { dynSettings.StartLogging(); try { _mRevit = DynamoRevitTestsLoader.RevitCommandData.Application; _mDoc = _mRevit.ActiveUIDocument; #region default level Level defaultLevel = null; var fecLevel = new FilteredElementCollector(_mDoc.Document); fecLevel.OfClass(typeof (Level)); defaultLevel = fecLevel.ToElements()[0] as Level; #endregion dynRevitSettings.Revit = _mRevit; dynRevitSettings.Doc = _mDoc; dynRevitSettings.DefaultLevel = defaultLevel; //get window handle IntPtr mwHandle = Process.GetCurrentProcess().MainWindowHandle; //show the window var dynamoController = new DynamoController_Revit(DynamoRevitApp.env, DynamoRevitApp.updater); _dynamoBench = dynamoController.Bench; //set window handle and show dynamo new WindowInteropHelper(_dynamoBench).Owner = mwHandle; _dynamoBench.WindowStartupLocation = WindowStartupLocation.Manual; Rectangle bounds = Screen.PrimaryScreen.Bounds; _dynamoBench.Left = bounds.X; _dynamoBench.Top = bounds.Y; _dynamoBench.Show(); _dynamoBench.Closed += dynamoForm_Closed; } catch (Exception ex) { MessageBox.Show(ex.ToString()); if (dynSettings.Writer != null) { dynSettings.Writer.WriteLine(ex.Message); dynSettings.Writer.WriteLine(ex.StackTrace); dynSettings.Writer.WriteLine("Dynamo log ended " + DateTime.Now.ToString()); } } }
/// <summary> /// Enumerate the types in an assembly and add them to DynamoController's /// dictionaries and the search view model. Internally catches exceptions and sends the error /// to the console. /// </summary> /// <param name="searchViewModel">The searchViewModel to which the nodes will be added</param> /// <param name="controller">The DynamoController, whose dictionaries will be modified</param> /// <param name="bench">The bench where logging errors will be sent</param> private static void LoadNodesFromAssembly(Assembly assembly, SearchViewModel searchViewModel, DynamoController controller, dynBench bench ) { try { Type[] loadedTypes = assembly.GetTypes(); foreach (Type t in loadedTypes) { //only load types that are in the right namespace, are not abstract //and have the elementname attribute object[] attribs = t.GetCustomAttributes(typeof(NodeNameAttribute), false); if (IsNodeSubType(t) && attribs.Length > 0) { searchViewModel.Add(t); string typeName = (attribs[0] as NodeNameAttribute).Name; var data = new TypeLoadData(assembly, t); controller.builtinTypesByNickname.Add(typeName, data); controller.builtinTypesByTypeName.Add(t.FullName, data); } } } catch (Exception e) { bench.Log("Could not load types."); bench.Log(e); if (e is ReflectionTypeLoadException) { var typeLoadException = e as ReflectionTypeLoadException; Exception[] loaderExceptions = typeLoadException.LoaderExceptions; bench.Log("Dll Load Exception: " + loaderExceptions[0]); bench.Log(loaderExceptions[0].ToString()); if (loaderExceptions.Count() > 1) { bench.Log("Dll Load Exception: " + loaderExceptions[1]); bench.Log(loaderExceptions[1].ToString()); } } } }
/// <summary> /// Enumerate local library assemblies and add them to DynamoController's /// dictionaries and search. /// </summary> /// <param name="searchViewModel">The searchViewModel to which the nodes will be added</param> /// <param name="controller">The DynamoController, whose dictionaries will be modified</param> /// <param name="bench">The bench where logging errors will be sent</param> internal static void LoadBuiltinTypes(SearchViewModel searchViewModel, DynamoController controller, dynBench bench) { Assembly dynamoAssembly = Assembly.GetExecutingAssembly(); string location = Path.GetDirectoryName(dynamoAssembly.Location); #region determine assemblies to load var allLoadedAssembliesByPath = new Dictionary<string, Assembly>( AppDomain.CurrentDomain.GetAssemblies().ToDictionary(x => x.Location)); var allLoadedAssemblies = new Dictionary<string, Assembly>(); foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) allLoadedAssemblies[assembly.FullName] = assembly; string path = Path.Combine(location, "Packages"); if (!Directory.Exists(path)) Directory.CreateDirectory(path); IEnumerable<string> allDynamoAssemblyPaths = Directory.GetFiles(location, "*.dll") .Concat(Directory.GetFiles( path, "*.dll", SearchOption.AllDirectories)); var resolver = new ResolveEventHandler(delegate(object sender, ResolveEventArgs args) { Assembly result; allLoadedAssemblies.TryGetValue(args.Name, out result); return result; }); AppDomain.CurrentDomain.AssemblyResolve += resolver; foreach (string assemblyPath in allDynamoAssemblyPaths) { if (allLoadedAssembliesByPath.ContainsKey(assemblyPath)) LoadNodesFromAssembly(allLoadedAssembliesByPath[assemblyPath], searchViewModel, controller, bench); else { try { Assembly assembly = Assembly.LoadFrom(assemblyPath); allLoadedAssemblies[assembly.GetName().Name] = assembly; LoadNodesFromAssembly(assembly, searchViewModel, controller, bench); } catch { } } } AppDomain.CurrentDomain.AssemblyResolve -= resolver; //AppDomain.Unload(tempDomain); #endregion }