public static IDisposable DoWithOpenDoc(this SldWorks swApp, Action <IModelDoc2, Action <IDisposable> > action) { Func <IModelDoc2, IDisposable> func = doc => { var disposables = new CompositeDisposable(); action(doc, disposables.Add); return(disposables); }; return(swApp.DoWithOpenDoc(func)); }
public static IDisposable Setup(SldWorks swApp) { if (swApp == null) { throw new ArgumentNullException(nameof(swApp)); } if (Interlocked.CompareExchange(ref _isInitialized, 1, 0) == 1) { return(Disposable.Empty); } var d0 = swApp .DoWithOpenDoc(modelDoc => { if (!modelDoc.Visible) { return(Disposable.Empty); } var modelView = (ModelView)modelDoc.GetFirstModelView(); Lookup.GetOrAdd(modelDoc, mv => new OpenGlRenderer(modelView)); return(Disposable.Create(() => { OpenGlRenderer openGlRenderer; if (Lookup.TryRemove(modelDoc, out openGlRenderer)) { openGlRenderer.Dispose(); } })); }); var d1 = Disposable.Create(() => { foreach (var modelView in Lookup.Keys) { OpenGlRenderer openGlRenderer; Lookup.TryRemove(modelView, out openGlRenderer); openGlRenderer.Dispose(); } Debug.Assert(Lookup.IsEmpty); }); return(new CompositeDisposable(d0, d1)); }
public static IDisposable Setup(SldWorks swApp) { if (swApp == null) throw new ArgumentNullException(nameof(swApp)); if (Interlocked.CompareExchange(ref _isInitialized, 1, 0) == 1) return Disposable.Empty; var d0 = swApp .DoWithOpenDoc(modelDoc => { if (!modelDoc.Visible) return Disposable.Empty; var modelView = (ModelView) modelDoc.GetFirstModelView(); Lookup.GetOrAdd(modelDoc, mv => new OpenGlRenderer(modelView)); return Disposable.Create(() => { OpenGlRenderer openGlRenderer; if (Lookup.TryRemove(modelDoc, out openGlRenderer)) { openGlRenderer.Dispose(); } }); }); var d1 = Disposable.Create(() => { foreach (var modelView in Lookup.Keys) { OpenGlRenderer openGlRenderer; Lookup.TryRemove(modelView, out openGlRenderer); openGlRenderer.Dispose(); } Debug.Assert(Lookup.IsEmpty); }); return new CompositeDisposable(d0, d1); }