70001859 Check the clip area between 2 hatches if is inside or not

Article 70001859
Type HowTo
Product Engine
Version 8
Date Added 11/5/2020
Fixed 8.8006.0.4 (11/5/2020)
Submitted by Claude UZAN

Summary

How to test the clip area between 2 hatches if the one hatch is inside the other or not.

Solution

Try in a empty form to add two buttons and a vdFramed control and try this code:

using VectorDraw.Professional.vdObjects;
using VectorDraw.Geometry;
using VectorDraw.Generics;
using VectorDraw.Professional.vdPrimaries;

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        vdDocument doc;
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            doc = vdFramedControl1.BaseControl.ActiveDocument;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            doc.Open(@"C:\test\hatches.vdcl");
            doc.CommandAction.Zoom("E", 0, 0);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //Testing the method
            //NOTE: doc is a predefined vdDocument object
            IvdHatchFigure hfig1, hfig2;
            gPoint pt;
            vdFigure fig;

            doc.Prompt("Pick hatch 1");
            doc.ActionUtility.getUserEntity(out fig, out pt);
            doc.Prompt(null);
            hfig1 = fig as IvdHatchFigure;
            if (hfig1 == null) return;

            doc.Prompt("Pick hatch 2");
            doc.ActionUtility.getUserEntity(out fig, out pt);
            doc.Prompt(null);
            hfig2 = fig as IvdHatchFigure;
            if (hfig2 == null) return;

            // -1  error  hfig1 and or hfig2 are invalid hatches
            //  0 == hfig2 is Completely inside hfig1
            //  1 == hfig2 is Completely off the hfig1
            //  2 == hfig1 Clip somehow hfig2
            int ret = TestClipHatch(hfig1, hfig2);
            switch (ret)
            {
                case -1:
                    doc.Prompt("\r\n error  hfig1 and or hfig2 are invalid hatches"); doc.Prompt(null);
                    break;
                case 0:
                    doc.Prompt("\r\n hfig2 is completely inside hfig1"); doc.Prompt(null);
                    break;
                case 1:
                    doc.Prompt("\r\n hfig2 is completely off hfig1"); doc.Prompt(null);
                    break;
                case 2:
                    doc.Prompt("\r\n hfig2 is partial inside hfig1"); doc.Prompt(null);
                    break;
            }
        }

        // Test the clip area between 2 hatches and returns one of the following
        // -1  error  hfig1 and or hfig2 are invalid hatches
        //  0 == hfig2 is Completely inside hfig1
        //  1 == hfig2 is Completely off the hfig1
        //  2 == hfig1 Clip somehow hfig2
        int TestClipHatch(IvdHatchFigure hfig1, IvdHatchFigure hfig2)
        {
            vdHatchProperties h1 = hfig1.HatchProperties;
            vdHatchProperties h2 = hfig2.HatchProperties;
            if (h1 == null || h2 == null) return -1;
            VectorDraw.Generics.vdArray<gPoints> array1 = h1.GetFilledPolygons(0, 0);
            if (array1 == null) return -1;
            VectorDraw.Generics.vdArray<gPoints> array2 = h2.GetFilledPolygons(0, 0);
            if (array2 == null) return -1;

            vdArray<gPoints> clips = new vdArray<gPoints>();
            vdArray<VectorDraw.Geometry.GpcWrapper.ClippingOperation> opers = new vdArray<VectorDraw.Geometry.GpcWrapper.ClippingOperation>(new VectorDraw.Geometry.GpcWrapper.ClippingOperation[] 
                  { VectorDraw.Geometry.GpcWrapper.ClippingOperation.Intersection, VectorDraw.Geometry.GpcWrapper.ClippingOperation.Intersection });
            for (int i = 0; i < array1.Count; i++)
            {
                for (int k = 0; k < array2.Count; k++)
                {
                    vdArray<gPoints> arr = new vdArray<gPoints>(new gPoints[] { array1[i], array2[k] });
                    vdArray<gPoints> pts = PolygonClipper.getCountours(PolygonClipper.getCountoursPolygonObject(arr, opers), arr);
                    if (pts != null && pts.Count > 0)
                        clips.AddRange(pts);
                }
            }
            if (clips == null || clips.Count == 0) return 1;
            VectorDraw.Generics.vdArray<gPoints> array = new vdArray<gPoints>();
            array.AddRange(array2);
            array.AddRange(clips);
            opers = new vdArray<VectorDraw.Geometry.GpcWrapper.ClippingOperation>();
            for (int i = 0; i < array.Count; i++) opers.AddItem(VectorDraw.Geometry.GpcWrapper.ClippingOperation.XOr);
            vdArray<gPoints> retpts = PolygonClipper.getCountours(PolygonClipper.getCountoursPolygonObject(array, opers), array);
            double area = 0.0;
            if (retpts != null && retpts.Count > 0)
            {
                foreach (gPoints item in retpts)
                {
                    area += Math.Abs(item.Area());
                }
            }
            if (Globals.AreEqual(area, 0.0, Globals.DefaultAreaEquality)) return 0;
            return 2;
        }

    }
}

Send comments on this topic.