示例#1
0
        private void FindShape()
        {       // wird in einem zweiten Thread aufgerufen. Ob es Probleme macht, dass von dieser
            // Methode ausgehend indirekt OpenCascade verwendet wird? Um zu verhindern, dass
            // gleichzeitig mehrere Methoden von OpenCascade laufen müsste man ein "lock" mit einem
            // globalen Objekt der OpenCascade Bibliothek machen...
            try
            {
                Frame.ActiveView.Canvas.Cursor = "WaitCursor";
                GeoPoint p = base.CurrentMousePosition;
                foundOnPlane = CurrentMouseView.Projection.ProjectionPlane; // bei mehreren Fenstern so nicht gut!!!
                GeoPoint2D onPlane = foundOnPlane.Project(p);
                // hier müsste man irgendwie erst wenig picken und wenn nix geht dann immer mehr
                BoundingRect pickrect      = new BoundingRect(onPlane, base.WorldViewSize, base.WorldViewSize);
                Set <Layer>  visibleLayers = null;
                if (Frame.ActiveView is ModelView)
                {
                    visibleLayers = new Set <Layer>((Frame.ActiveView as ModelView).GetVisibleLayers());
                }
#if !WEBASSEMBLY
                else if (Frame.ActiveView is GDI2DView)
                {
                    visibleLayers = new Set <Layer>((Frame.ActiveView as GDI2DView).VisibleLayers.Checked);
                }
#endif
                GeoObjectList l = Frame.ActiveView.Model.GetObjectsFromRect(pickrect, CurrentMouseView.Projection, visibleLayers, PickMode.normal, Frame.Project.FilterList);
                // Problem: ein großese Rechteck, welches weit über pickrect hinausgeht hat Inseln, die nicht im pickrect liegen
                // Diese werden nicht gefunden. Deshalb hier nochmal das pickrect ggf. erweitern
                pickrect = l.GetExtent(CurrentMouseView.Projection, true, false);
                // l = Frame.ActiveView.ProjectedModel.GetObjectsFromRect(pickrect, null);
                l = Frame.ActiveView.Model.GetObjectsFromRect(pickrect, CurrentMouseView.Projection, visibleLayers, PickMode.normal, Frame.Project.FilterList);
                l.DecomposeBlocks(false);
                // l.Reduce(Frame.Project.FilterList); // FilterList jetzt schon beim Picken
                // CompoundShape cs = CompoundShape.CreateFromConnectedList(l, foundOnPlane, onPlane, l.GetExtent().Size * 1e-6, mode);
                CompoundShape cs = null;
                if (cs == null)
                {
                    CurveGraph cg = CurveGraph.CrackCurves(l, foundOnPlane, l.GetExtent().Size * 1e-6); // gap eine Ordnung größer als Precision
                    if (cg != null)
                    {
                        cs = cg.CreateCompoundShape(true, onPlane, mode, false);
#if DEBUG
                        if (cs == null)
                        {
                            cg = CurveGraph.CrackCurves(l, foundOnPlane, l.GetExtent().Size * 1e-6); // gap eine Ordnung größer als Precision
                            cs = cg.CreateCompoundShape(true, onPlane, mode, false);
                        }
#endif
                    }
                    else
                    {
                        cg = CurveGraph.CrackCurves(l, foundOnPlane, l.GetExtent().Size * 1e-6); // gap eine Ordnung größer als Precision
                    }
                }
                if (cs != null)
                {
                    Plane shapesPlane;
                    Plane pln;
                    if (cs != null)
                    {
                        // das BeginInvoke synchronisiert mit den MouseMessages, d.h.
                        // OnShapeFound wird nur aufgerufen, wenn alle Messages
                        // abgearbeitet sind, er also nicht in irgendeiner anderen
                        // Methode dieser Klasse steckt. Denn in OnShapeFound wird
                        // ActiveObject gesetzt und das geht nur synchron mit dem Control.
                        if (Curves.GetCommonPlane(cs.Curves3d(), out shapesPlane))
                        {
                            //cs = cs.Project(foundOnPlane, shapesPlane);
                            pln = shapesPlane;
                        }
                        else
                        {
                            pln = CurrentMouseView.Projection.DrawingPlane;
                        }
                        if (debug)
                        {
                            OnShapeFound(cs, pln, p);
                        }
                        else
                        {
                            OnShapeFound(cs, pln, p);
                        }
                    }
                }
                findShapeIsRunning = false;
            }
            catch (ThreadAbortException)
            {
                findShapeIsRunning = false;
            }
            catch (System.Exception e)
            {
                string dbg = e.Message;
                findShapeIsRunning = false;
            }
            finally
            {   // aus welchen Gründen könnte er hier rausfliegen???
                findShapeIsRunning = false;
            }
        }