/// <summary>
        /// Recursively handle geometry element to
        /// retrieve all curves it contains that lie
        /// in the given plane
        /// </summary>
        static void GetCurvesInPlane(
            List <Curve> curves,
            JtObjCounter geoCounter,
            Plane plane,
            GeometryElement geo)
        {
            geoCounter.Increment(geo);

            if (null != geo)
            {
                foreach (GeometryObject obj in geo)
                {
                    geoCounter.Increment(obj);

                    Solid sol = obj as Solid;

                    if (null != sol)
                    {
                        EdgeArray edges = sol.Edges;

                        foreach (Edge edge in edges)
                        {
                            Curve curve = edge.AsCurve();

                            Debug.Assert(curve is Line,
                                         "we currently only support lines here");

                            geoCounter.Increment(curve);

                            if (IsLineInPlane(curve as Line, plane))
                            {
                                curves.Add(curve);
                            }
                        }
                    }
                    else
                    {
                        GeometryInstance inst = obj as GeometryInstance;

                        if (null != inst)
                        {
                            GetCurvesInPlane(curves, geoCounter,
                                             plane, inst.GetInstanceGeometry());
                        }
                        else
                        {
                            Debug.Assert(false,
                                         "unsupported geometry object "
                                         + obj.GetType().Name);
                        }
                    }
                }
            }
        }
        public Result Execute(
            ExternalCommandData commandData,
            ref string message,
            ElementSet elements)
        {
            UIApplication uiapp        = commandData.Application;
            UIDocument    uidoc        = uiapp.ActiveUIDocument;
            Application   app          = uiapp.Application;
            Document      doc          = uidoc.Document;
            View          section_view = commandData.View;
            Parameter     p            = section_view.get_Parameter(
                BuiltInParameter.VIEWER_BOUND_FAR_CLIPPING);

            if (ViewType.Section != section_view.ViewType ||
                ViewDetailLevel.Fine != section_view.DetailLevel ||
                1 != p.AsInteger())
            {
                message = _instructions;
                return(Result.Failed);
            }

            FilteredElementCollector a
                = new FilteredElementCollector(
                      doc, section_view.Id);

            Options opt = new Options()
            {
                ComputeReferences        = false,
                IncludeNonVisibleObjects = false,
                View = section_view
            };

            SketchPlane plane1 = section_view.SketchPlane; // this is null

            Plane plane2 = Plane.CreateByNormalAndOrigin(
                section_view.ViewDirection,
                section_view.Origin);

            JtObjCounter geoCounter = new JtObjCounter();

            List <Curve> curves = new List <Curve>();

            foreach (Element e in a)
            {
                geoCounter.Increment(e);

                GeometryElement geo = e.get_Geometry(opt);

                GetCurvesInPlane(curves,
                                 geoCounter, plane2, geo);
            }

            Debug.Print("Objects analysed:");
            geoCounter.Print();

            Debug.Print(
                "{0} cut geometry lines found in section plane.",
                curves.Count);

            using (Transaction tx = new Transaction(doc))
            {
                tx.Start("Create Section Cut Model Curves");

                SketchPlane plane3 = SketchPlane.Create(
                    doc, plane2);

                foreach (Curve c in curves)
                {
                    doc.Create.NewModelCurve(c, plane3);
                }

                tx.Commit();
            }
            return(Result.Succeeded);
        }