Example #1
0
        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));
        }
Example #2
0
        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);
        }