Application
using Autodesk.DesignScript.Interfaces;
using Autodesk.DesignScript.Runtime;
using System;
using System.Collections.Generic;
namespace Autodesk.DesignScript.Geometry
{
[SupressImportIntoVM]
public class Application : IExtensionApplication
{
private static Application mInstance;
private List<IDisposable> mToBeDisposedObjects = new List<IDisposable>();
private IExecutionSession mSession;
public IExecutionSession Session => mSession;
public static Application Instance {
get {
if (mInstance == null)
mInstance = new Application();
return mInstance;
}
}
public bool IsExecuting => mSession != null;
private Application()
{
mInstance = this;
}
private void ToBeDisposed(IDisposable obj)
{
if (obj != null) {
lock (mToBeDisposedObjects) {
mToBeDisposedObjects.Add(obj);
}
}
}
void IExtensionApplication.OnBeginExecution(IExecutionSession session)
{
mSession = session;
if (HostFactory.CurrentInstance != null && !HostFactory.ExtensionApplicationStarted) {
foreach (IExtensionApplication extensionApplication in HostFactory.ExtensionApplications) {
extensionApplication?.OnBeginExecution(session);
}
HostFactory.ExtensionApplicationStarted = true;
}
GeometrySettings.Reset();
GeometrySettings.RootModulePath = session.Configuration.RootModulePath;
object configValue = session.Configuration.GetConfigValue(ConfigurationKeys.GeometryXmlProperties);
if (configValue != null)
GeometrySettings.GeometryXmlProperties = (bool)configValue;
configValue = session.Configuration.GetConfigValue(ConfigurationKeys.GeometryFactory);
if (configValue != null)
GeometrySettings.GeometryFactoryFilePath = (string)configValue;
configValue = session.Configuration.GetConfigValue(ConfigurationKeys.PersistentManager);
if (configValue != null)
GeometrySettings.PersistenceManagerFilePath = (string)configValue;
}
void IExtensionApplication.OnEndExecution(IExecutionSession session)
{
if (HostFactory.CurrentInstance != null && HostFactory.ExtensionApplicationStarted) {
foreach (IExtensionApplication extensionApplication in HostFactory.ExtensionApplications) {
extensionApplication?.OnEndExecution(session);
}
HostFactory.ExtensionApplicationStarted = false;
}
if (mSession != null && !object.ReferenceEquals(mSession, session))
throw new InvalidOperationException("Session mismatch for begin and end execution call.");
IDisposable[] array = null;
lock (mToBeDisposedObjects) {
array = mToBeDisposedObjects.ToArray();
mToBeDisposedObjects.Clear();
}
IDisposable[] array2 = array;
foreach (IDisposable disposable in array2) {
disposable.Dispose();
}
mSession = null;
}
public void OnSuspendExecution(IExecutionSession session)
{
}
public void OnResumeExecution(IExecutionSession session)
{
}
public void StartUp()
{
}
public void ShutDown()
{
}
public void PreloadAsmLibraries(string baseDirectory)
{
}
}
}