From ced9b0987f55c7f8557e4e9ab0c4c8c577f1a6f6 Mon Sep 17 00:00:00 2001 From: BoykoNeov Date: Mon, 27 Jul 2026 22:14:33 +0300 Subject: [PATCH 1/2] Classify a tangent face that meets our surface edge-on beside a crossing face. SShell::ClassifyEdge()'s edge-on-edge case, where exactly two faces of the shell meet along the edge being classified, treats a face whose normal is parallel to our surface's normal at p as coincident with our surface. But such a face may instead be merely tangent to our surface at the shell's edge, curving away from it past that edge; the normals at p cannot tell those apart. The both-parallel branch already probes each face's geometry a little way in from the shell's edge to distinguish them, but the mixed branches--one face parallel, the other crossing--did not, and reported the side of our edge towards the tangent face as coincident regardless. That side is then neither kept as material nor cut away, so the edge is dropped from the trim and the whole face fails to assemble. It happens where the spline face of a cut ends tangent to the face it cuts through while the cut's neighbouring face crosses that same face at the tangency, so that the cut's material fills the region behind the tangent face (issue #1291): the cube face there is lost, leaving six naked edges. Probe the tangent face the same way the both-parallel branch does, and if it curves away rather than lying flat, classify that side as inside or outside the shell accordingly. Share the probe between the two branches. Fixes the tangent-outside case from #1291. Co-Authored-By: Claude Opus 5 (1M context) --- src/srf/raycast.cpp | 89 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 67 insertions(+), 22 deletions(-) diff --git a/src/srf/raycast.cpp b/src/srf/raycast.cpp index 9f460961e..3222eda24 100644 --- a/src/srf/raycast.cpp +++ b/src/srf/raycast.cpp @@ -425,6 +425,40 @@ SShell::Class SShell::ClassifyRegion(Vector edge_n, Vector inter_surf_n, // use overlapping sets of 3 to reduce memory usage. static const double Random[8] = {1.278, 5.0103, 9.427, -2.331, 7.13, 2.954, 5.034, -4.777}; +//----------------------------------------------------------------------------- +// A face of our shell meets the surface being classified edge-on, with its +// normal parallel to that surface's normal at p, so the face lies in that +// surface's tangent plane at p. It might be coincident with the surface there, +// or it might merely be tangent to it at the shell's edge and curve away from +// it past that edge. The normals at p can't tell those apart, so probe the +// face's actual geometry a little way in from the shell's edge, and report how +// far it then deviates from the tangent plane (measured along nu, a unit +// normal to the surface at p). The direction we probed in, which points into +// the face perpendicular to the shell's edge, is returned in f. +//----------------------------------------------------------------------------- +static double ProbeTangentFace(SSurface *srf, Vector p, Vector inter_edge_n, + Vector nu, Vector *f, bool *flat) +{ + // Probe at a small fraction of the face's own size, so that the deviation + // of a curved face is well above numerical noise no matter the model's + // scale. + Vector c00 = srf->ctrl[0][0], + cm0 = srf->ctrl[srf->degm][0], + c0n = srf->ctrl[0][srf->degn], + cmn = srf->ctrl[srf->degm][srf->degn]; + double size = max(max((cm0.Minus(c00)).Magnitude(), + (c0n.Minus(c00)).Magnitude()), + (cmn.Minus(c00)).Magnitude()); + // inter_edge_n points out of the face, so negate it to probe into it. + *f = (inter_edge_n.ScaledBy(-1)).WithMagnitude(max(size / 20, LENGTH_EPS * 100)); + + Point2d fuv; + srf->ClosestPointTo(p.Plus(*f), &fuv, /*mustConverge=*/false); + double dev = ((srf->PointAt(fuv)).Minus(p)).Dot(nu); + *flat = fabs(dev) < max(LENGTH_EPS, 1e-3 * f->Magnitude()); + return dev; +} + bool SShell::ClassifyEdge(Class *indir, Class *outdir, Vector ea, Vector eb, Vector p, @@ -479,7 +513,33 @@ bool SShell::ClassifyEdge(Class *indir, Class *outdir, swap(inter_srf[0], inter_srf[1]); } - Class coinc = (surf_n.Dot(inter_surf_n[0])) > 0 ? Class::SURF_COINC_SAME : Class::SURF_COINC_OPP; + // The class of the side of our edge that face 0 extends into, when + // face 0 lies in our tangent plane at p and face 1 does not. That's + // coincident with the shell if face 0 really is coincident with our + // surface, but see below for when it's only tangent to it. + Class towards_0 = + (surf_n.Dot(inter_surf_n[0])) > 0 ? Class::SURF_COINC_SAME : Class::SURF_COINC_OPP; + + if(fabs(dotp[0]) < DOTP_TOL && fabs(dotp[1]) >= DOTP_TOL) { + // Face 0 might be merely tangent to our surface at the shell's + // edge, curving away from it past that edge, e.g. where the + // spline face of a cut is tangent to the face it cuts through + // and the cut's other face crosses that face there (issue + // #1291). Then the side of our edge towards face 0 is not + // coincident with the shell at all; it's inside or outside it + // depending on which way face 0 curves away. + Vector f; + bool flat; + double dev = ProbeTangentFace(inter_srf[0], p, inter_edge_n[0], + surf_n.WithMagnitude(1), &f, &flat); + if(!flat) { + // As in the both-tangent case below: our edge is on the + // shell's material side of face 0 iff face 0 curves away + // opposite its own outward normal. + towards_0 = (dev * surf_n.Dot(inter_surf_n[0]) > 0) ? + Class::SURF_INSIDE : Class::SURF_OUTSIDE; + } + } if(fabs(dotp[0]) < DOTP_TOL && fabs(dotp[1]) < DOTP_TOL) { // Both faces meeting at the shell's edge lie in our surface's @@ -498,23 +558,8 @@ bool SShell::ClassifyEdge(Class *indir, Class *outdir, bool flat[2]; // does face i lie in our tangent plane? Vector nu = surf_n.WithMagnitude(1); for(int i = 0; i < 2; i++) { - // Probe at a small fraction of the face's own size, so - // that the deviation of a curved face is well above - // numerical noise no matter the model's scale. - SSurface *srf = inter_srf[i]; - Vector c00 = srf->ctrl[0][0], - cm0 = srf->ctrl[srf->degm][0], - c0n = srf->ctrl[0][srf->degn], - cmn = srf->ctrl[srf->degm][srf->degn]; - double size = max(max((cm0.Minus(c00)).Magnitude(), - (c0n.Minus(c00)).Magnitude()), - (cmn.Minus(c00)).Magnitude()); - f[i] = (inter_edge_n[i].ScaledBy(-1)) - .WithMagnitude(max(size / 20, LENGTH_EPS * 100)); - Point2d fuv; - srf->ClosestPointTo(p.Plus(f[i]), &fuv, /*mustConverge=*/false); - dev[i] = ((srf->PointAt(fuv)).Minus(p)).Dot(nu); - flat[i] = fabs(dev[i]) < max(LENGTH_EPS, 1e-3 * f[i].Magnitude()); + dev[i] = ProbeTangentFace(inter_srf[i], p, inter_edge_n[i], nu, + &f[i], &flat[i]); } Class *dir[2] = { indir, outdir }; Vector en[2] = { edge_n_in, edge_n_out }; @@ -555,19 +600,19 @@ bool SShell::ClassifyEdge(Class *indir, Class *outdir, } } else if(fabs(dotp[0]) < DOTP_TOL && dotp[1] > DOTP_TOL) { if(edge_n_out.Dot(inter_edge_n[0]) > 0) { - *indir = coinc; + *indir = towards_0; *outdir = Class::SURF_OUTSIDE; } else { *indir = Class::SURF_INSIDE; - *outdir = coinc; + *outdir = towards_0; } } else if(fabs(dotp[0]) < DOTP_TOL && dotp[1] < -DOTP_TOL) { if(edge_n_out.Dot(inter_edge_n[0]) > 0) { - *indir = coinc; + *indir = towards_0; *outdir = Class::SURF_INSIDE; } else { *indir = Class::SURF_OUTSIDE; - *outdir = coinc; + *outdir = towards_0; } } else if(dotp[0] > DOTP_TOL && dotp[1] > DOTP_TOL) { *indir = Class::SURF_INSIDE; From b56bacb48a6563abb98e37ca5610d1c001409391 Mon Sep 17 00:00:00 2001 From: BoykoNeov Date: Mon, 27 Jul 2026 22:14:43 +0300 Subject: [PATCH 2/2] Add a regression test for Booleans with a face tangent beside a crossing face. The model is ruevs' cube_cut with the profile spline made tangent to the cube's face on the other side, its corner left outside the cube so that the line continuing the profile from the tangency crosses that face. Without the classification fix the cube's face fails to assemble and the shell leaks; the test checks that the result is watertight and has the volume of the exact Boolean. Like the other Boolean cases, it deliberately has no CHECK_SAVE or CHECK_RENDER: the surface cache holds last-ulp floats that PrepareSavefile does not normalize. Co-Authored-By: Claude Opus 5 (1M context) --- test/CMakeLists.txt | 1 + .../boolean_tangent_crossing/normal.slvs | 2149 +++++++++++++++++ test/group/boolean_tangent_crossing/test.cpp | 36 + 3 files changed, 2186 insertions(+) create mode 100644 test/group/boolean_tangent_crossing/normal.slvs create mode 100644 test/group/boolean_tangent_crossing/test.cpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 0dafd42db..6a603f4ce 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -65,6 +65,7 @@ set(testsuite_SOURCES request/workplane/test.cpp group/boolean_coplanar_union/test.cpp group/boolean_knife_edge/test.cpp + group/boolean_tangent_crossing/test.cpp group/boolean_tangent_edge/test.cpp group/boolean_tangent_fillet/test.cpp group/boolean_tangent_spline/test.cpp diff --git a/test/group/boolean_tangent_crossing/normal.slvs b/test/group/boolean_tangent_crossing/normal.slvs new file mode 100644 index 000000000..d3ffb01cd --- /dev/null +++ b/test/group/boolean_tangent_crossing/normal.slvs @@ -0,0 +1,2149 @@ +±²³SolveSpaceREVa + + +Group.h.v=00000001 +Group.type=5000 +Group.name=#references +Group.color=ff000000 +Group.skipFirst=0 +Group.predef.swapUV=0 +Group.predef.negateU=0 +Group.predef.negateV=0 +Group.visible=1 +Group.suppress=0 +Group.relaxConstraints=0 +Group.allowRedundant=0 +Group.allDimsReference=0 +Group.scale=1.00000000000000000000 +Group.remap={ +} +AddGroup + +Group.h.v=00000002 +Group.type=5001 +Group.order=1 +Group.name=sketch-square +Group.activeWorkplane.v=80020000 +Group.color=ff000000 +Group.subtype=6000 +Group.skipFirst=0 +Group.predef.q.w=1.00000000000000000000 +Group.predef.origin.v=00010001 +Group.predef.swapUV=0 +Group.predef.negateU=0 +Group.predef.negateV=0 +Group.visible=1 +Group.suppress=0 +Group.relaxConstraints=0 +Group.allowRedundant=0 +Group.allDimsReference=0 +Group.scale=1.00000000000000000000 +Group.remap={ +} +AddGroup + +Group.h.v=00000003 +Group.type=5100 +Group.order=2 +Group.name=extrude-cube +Group.opA.v=00000002 +Group.color=00646464 +Group.subtype=7001 +Group.skipFirst=0 +Group.predef.entityB.v=80020000 +Group.predef.swapUV=0 +Group.predef.negateU=0 +Group.predef.negateV=0 +Group.visible=1 +Group.suppress=0 +Group.relaxConstraints=0 +Group.allowRedundant=0 +Group.allDimsReference=0 +Group.scale=1.00000000000000000000 +Group.remap={ + 1 00040000 1002 + 2 00040001 1002 + 3 00040002 1002 + 4 00040000 1001 + 5 00040001 1001 + 6 00040002 1001 + 7 00040000 1004 + 8 00040001 1003 + 9 00040002 1003 + 10 00050000 1002 + 11 00050001 1002 + 12 00050002 1002 + 13 00050000 1001 + 14 00050001 1001 + 15 00050002 1001 + 16 00050000 1004 + 17 00050001 1003 + 18 00050002 1003 + 19 00060000 1002 + 20 00060001 1002 + 21 00060002 1002 + 22 00060000 1001 + 23 00060001 1001 + 24 00060002 1001 + 25 00060000 1004 + 26 00060001 1003 + 27 00060002 1003 + 28 00070000 1002 + 29 00070001 1002 + 30 00070002 1002 + 31 00070000 1001 + 32 00070001 1001 + 33 00070002 1001 + 34 00070000 1004 + 35 00070001 1003 + 36 00070002 1003 + 37 80020000 1002 + 38 80020000 1001 + 39 80020001 1002 + 40 80020002 1002 + 41 80020001 1001 + 42 80020002 1001 + 43 80020002 1003 + 44 00000000 1001 + 45 00000000 1002 +} +AddGroup + +Group.h.v=00000004 +Group.type=5001 +Group.order=3 +Group.name=sketch-fillet +Group.activeWorkplane.v=80040000 +Group.color=00646464 +Group.subtype=6001 +Group.skipFirst=0 +Group.predef.origin.v=80030018 +Group.predef.entityB.v=8003000d +Group.predef.entityC.v=80030016 +Group.predef.swapUV=0 +Group.predef.negateU=1 +Group.predef.negateV=0 +Group.visible=1 +Group.suppress=0 +Group.relaxConstraints=0 +Group.allowRedundant=0 +Group.allDimsReference=0 +Group.scale=1.00000000000000000000 +Group.remap={ +} +AddGroup + +Group.h.v=00000005 +Group.type=5100 +Group.order=4 +Group.name=cut +Group.opA.v=00000004 +Group.color=00646464 +Group.subtype=7000 +Group.skipFirst=0 +Group.meshCombine=1 +Group.predef.entityB.v=80040000 +Group.predef.swapUV=0 +Group.predef.negateU=0 +Group.predef.negateV=0 +Group.visible=1 +Group.suppress=0 +Group.relaxConstraints=0 +Group.allowRedundant=0 +Group.allDimsReference=0 +Group.scale=1.00000000000000000000 +Group.remap={ + 1 00080000 1002 + 2 00080001 1002 + 3 00080002 1002 + 4 00080000 1001 + 5 00080001 1001 + 6 00080002 1001 + 7 00080000 1004 + 8 00080001 1003 + 9 00080002 1003 + 10 00090000 1002 + 11 00090001 1002 + 12 00090002 1002 + 13 00090000 1001 + 14 00090001 1001 + 15 00090002 1001 + 16 00090000 1004 + 17 00090001 1003 + 18 00090002 1003 + 19 000a0000 1002 + 20 000a0001 1002 + 21 000a0002 1002 + 22 000a0003 1002 + 23 000a0004 1002 + 24 000a0000 1001 + 25 000a0001 1001 + 26 000a0002 1001 + 27 000a0003 1001 + 28 000a0004 1001 + 29 000a0001 1003 + 30 000a0002 1003 + 31 000a0003 1003 + 32 000a0004 1003 + 33 80040000 1002 + 34 80040000 1001 + 35 80040001 1002 + 36 80040002 1002 + 37 80040001 1001 + 38 80040002 1001 + 39 80040002 1003 + 40 00000000 1001 + 41 00000000 1002 +} +AddGroup + +Param.h.v.=00010010 +AddParam + +Param.h.v.=00010011 +AddParam + +Param.h.v.=00010012 +AddParam + +Param.h.v.=00010020 +Param.val=1.00000000000000000000 +AddParam + +Param.h.v.=00010021 +AddParam + +Param.h.v.=00010022 +AddParam + +Param.h.v.=00010023 +AddParam + +Param.h.v.=00020010 +AddParam + +Param.h.v.=00020011 +AddParam + +Param.h.v.=00020012 +AddParam + +Param.h.v.=00020020 +Param.val=0.50000000000000000000 +AddParam + +Param.h.v.=00020021 +Param.val=0.50000000000000000000 +AddParam + +Param.h.v.=00020022 +Param.val=0.50000000000000000000 +AddParam + +Param.h.v.=00020023 +Param.val=0.50000000000000000000 +AddParam + +Param.h.v.=00030010 +AddParam + +Param.h.v.=00030011 +AddParam + +Param.h.v.=00030012 +AddParam + +Param.h.v.=00030020 +Param.val=0.50000000000000000000 +AddParam + +Param.h.v.=00030021 +Param.val=-0.50000000000000000000 +AddParam + +Param.h.v.=00030022 +Param.val=-0.50000000000000000000 +AddParam + +Param.h.v.=00030023 +Param.val=-0.50000000000000000000 +AddParam + +Param.h.v.=00040010 +Param.val=30.00000000000000000000 +AddParam + +Param.h.v.=00040011 +Param.val=-30.00000000000000000000 +AddParam + +Param.h.v.=00040013 +Param.val=30.00000000000000000000 +AddParam + +Param.h.v.=00040014 +Param.val=30.00000000000000000000 +AddParam + +Param.h.v.=00050010 +Param.val=-30.00000000000000000000 +AddParam + +Param.h.v.=00050011 +Param.val=-30.00000000000000000000 +AddParam + +Param.h.v.=00050013 +Param.val=30.00000000000000000000 +AddParam + +Param.h.v.=00050014 +Param.val=-30.00000000000000000000 +AddParam + +Param.h.v.=00060010 +Param.val=-30.00000000000000000000 +AddParam + +Param.h.v.=00060011 +Param.val=30.00000000000000000000 +AddParam + +Param.h.v.=00060013 +Param.val=-30.00000000000000000000 +AddParam + +Param.h.v.=00060014 +Param.val=-30.00000000000000000000 +AddParam + +Param.h.v.=00070010 +Param.val=30.00000000000000000000 +AddParam + +Param.h.v.=00070011 +Param.val=30.00000000000000000000 +AddParam + +Param.h.v.=00070013 +Param.val=-30.00000000000000000000 +AddParam + +Param.h.v.=00070014 +Param.val=30.00000000000000000000 +AddParam + +Param.h.v.=00080010 +Param.val=13.75569688166065063228 +AddParam + +Param.h.v.=00080011 +AddParam + +Param.h.v.=00080013 +Param.val=70.95998125794230304564 +AddParam + +Param.h.v.=00080014 +AddParam + +Param.h.v.=00090010 +Param.val=70.95998125794230304564 +AddParam + +Param.h.v.=00090011 +AddParam + +Param.h.v.=00090013 +Param.val=60.00000000000000000000 +AddParam + +Param.h.v.=00090014 +Param.val=48.78837126472273411082 +AddParam + +Param.h.v.=000a0010 +Param.val=13.75569688166065063228 +AddParam + +Param.h.v.=000a0011 +AddParam + +Param.h.v.=000a0013 +Param.val=48.78060959786832029295 +AddParam + +Param.h.v.=000a0014 +AddParam + +Param.h.v.=000a0016 +Param.val=60.00000000000000000000 +AddParam + +Param.h.v.=000a0017 +Param.val=17.73791345999914881304 +AddParam + +Param.h.v.=000a0019 +Param.val=60.00000000000000000000 +AddParam + +Param.h.v.=000a001a +Param.val=48.78837126472273411082 +AddParam + +Param.h.v.=4000000d +Param.val=0.22926161469434416795 +AddParam + +Param.h.v.=4000000f +Param.val=0.81313952107871223518 +AddParam + +Param.h.v.=40000016 +Param.val=0.81301015996447201228 +AddParam + +Param.h.v.=40000018 +Param.val=0.29563189099998582465 +AddParam + +Param.h.v.=80030000 +AddParam + +Param.h.v.=80030001 +AddParam + +Param.h.v.=80030002 +Param.val=30.00000000000000000000 +AddParam + +Param.h.v.=80050000 +AddParam + +Param.h.v.=80050001 +AddParam + +Param.h.v.=80050002 +Param.val=-15.00000000000000000000 +AddParam + +Request.h.v=00000001 +Request.type=100 +Request.group.v=00000001 +Request.construction=0 +AddRequest + +Request.h.v=00000002 +Request.type=100 +Request.group.v=00000001 +Request.construction=0 +AddRequest + +Request.h.v=00000003 +Request.type=100 +Request.group.v=00000001 +Request.construction=0 +AddRequest + +Request.h.v=00000004 +Request.type=200 +Request.workplane.v=80020000 +Request.group.v=00000002 +Request.construction=0 +AddRequest + +Request.h.v=00000005 +Request.type=200 +Request.workplane.v=80020000 +Request.group.v=00000002 +Request.construction=0 +AddRequest + +Request.h.v=00000006 +Request.type=200 +Request.workplane.v=80020000 +Request.group.v=00000002 +Request.construction=0 +AddRequest + +Request.h.v=00000007 +Request.type=200 +Request.workplane.v=80020000 +Request.group.v=00000002 +Request.construction=0 +AddRequest + +Request.h.v=00000008 +Request.type=200 +Request.workplane.v=80040000 +Request.group.v=00000004 +Request.construction=0 +AddRequest + +Request.h.v=00000009 +Request.type=200 +Request.workplane.v=80040000 +Request.group.v=00000004 +Request.construction=0 +AddRequest + +Request.h.v=0000000a +Request.type=300 +Request.workplane.v=80040000 +Request.group.v=00000004 +Request.construction=0 +AddRequest + +Entity.h.v=00010000 +Entity.type=10000 +Entity.construction=0 +Entity.point[0].v=00010001 +Entity.normal.v=00010020 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00010001 +Entity.type=2000 +Entity.construction=1 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00010020 +Entity.type=3000 +Entity.construction=0 +Entity.point[0].v=00010001 +Entity.actNormal.w=1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00020000 +Entity.type=10000 +Entity.construction=0 +Entity.point[0].v=00020001 +Entity.normal.v=00020020 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00020001 +Entity.type=2000 +Entity.construction=1 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00020020 +Entity.type=3000 +Entity.construction=0 +Entity.point[0].v=00020001 +Entity.actNormal.w=0.50000000000000000000 +Entity.actNormal.vx=0.50000000000000000000 +Entity.actNormal.vy=0.50000000000000000000 +Entity.actNormal.vz=0.50000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00030000 +Entity.type=10000 +Entity.construction=0 +Entity.point[0].v=00030001 +Entity.normal.v=00030020 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00030001 +Entity.type=2000 +Entity.construction=1 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00030020 +Entity.type=3000 +Entity.construction=0 +Entity.point[0].v=00030001 +Entity.actNormal.w=0.50000000000000000000 +Entity.actNormal.vx=-0.50000000000000000000 +Entity.actNormal.vy=-0.50000000000000000000 +Entity.actNormal.vz=-0.50000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00040000 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=00040001 +Entity.point[1].v=00040002 +Entity.workplane.v=80020000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00040001 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00040002 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00050000 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=00050001 +Entity.point[1].v=00050002 +Entity.workplane.v=80020000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00050001 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=-30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00050002 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00060000 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=00060001 +Entity.point[1].v=00060002 +Entity.workplane.v=80020000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00060001 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=-30.00000000000000000000 +Entity.actPoint.y=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00060002 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=-30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00070000 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=00070001 +Entity.point[1].v=00070002 +Entity.workplane.v=80020000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00070001 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00070002 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=-30.00000000000000000000 +Entity.actPoint.y=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00080000 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=00080001 +Entity.point[1].v=00080002 +Entity.workplane.v=80040000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00080001 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80040000 +Entity.actPoint.x=-16.24430311833934936772 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00080002 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80040000 +Entity.actPoint.x=40.95998125794230304564 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00090000 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=00090001 +Entity.point[1].v=00090002 +Entity.workplane.v=80040000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00090001 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80040000 +Entity.actPoint.x=40.95998125794230304564 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00090002 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80040000 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=18.78837126472273411082 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=000a0000 +Entity.type=12000 +Entity.construction=0 +Entity.point[0].v=000a0001 +Entity.point[1].v=000a0002 +Entity.point[2].v=000a0003 +Entity.point[3].v=000a0004 +Entity.workplane.v=80040000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=000a0001 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80040000 +Entity.actPoint.x=-16.24430311833934936772 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=000a0002 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80040000 +Entity.actPoint.x=18.78060959786832029295 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=000a0003 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80040000 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=-12.26208654000085118696 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=000a0004 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80040000 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=18.78837126472273411082 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80020000 +Entity.type=10000 +Entity.construction=0 +Entity.point[0].v=80020002 +Entity.normal.v=80020001 +Entity.actVisible=0 +AddEntity + +Entity.h.v=80020001 +Entity.type=3010 +Entity.construction=0 +Entity.point[0].v=80020002 +Entity.actNormal.w=1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80020002 +Entity.type=2012 +Entity.construction=1 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030001 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=80030002 +Entity.point[1].v=80030003 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030002 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=-30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030003 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=30.00000000000000000000 +Entity.actPoint.z=-30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030004 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=80030005 +Entity.point[1].v=80030006 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030005 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030006 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030007 +Entity.type=5001 +Entity.construction=0 +Entity.point[0].v=80030005 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actNormal.vx=-1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030008 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=80030005 +Entity.point[1].v=80030002 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030009 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=80030006 +Entity.point[1].v=80030003 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8003000a +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=8003000b +Entity.point[1].v=8003000c +Entity.actVisible=1 +AddEntity + +Entity.h.v=8003000b +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=-30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=-30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8003000c +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=-30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8003000d +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=8003000e +Entity.point[1].v=8003000f +Entity.actVisible=1 +AddEntity + +Entity.h.v=8003000e +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=-30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8003000f +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030010 +Entity.type=5001 +Entity.construction=0 +Entity.point[0].v=8003000e +Entity.actPoint.x=-30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actNormal.vy=1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030011 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=8003000e +Entity.point[1].v=8003000b +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030012 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=8003000f +Entity.point[1].v=8003000c +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030013 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=80030014 +Entity.point[1].v=80030015 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030014 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=-30.00000000000000000000 +Entity.actPoint.y=30.00000000000000000000 +Entity.actPoint.z=-30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030015 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=-30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=-30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030016 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=80030017 +Entity.point[1].v=80030018 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030017 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=-30.00000000000000000000 +Entity.actPoint.y=30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030018 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=-30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030019 +Entity.type=5001 +Entity.construction=0 +Entity.point[0].v=80030017 +Entity.actPoint.x=-30.00000000000000000000 +Entity.actPoint.y=30.00000000000000000000 +Entity.actNormal.vx=1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8003001a +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=80030017 +Entity.point[1].v=80030014 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8003001b +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=80030018 +Entity.point[1].v=80030015 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8003001c +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=8003001d +Entity.point[1].v=8003001e +Entity.actVisible=1 +AddEntity + +Entity.h.v=8003001d +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=30.00000000000000000000 +Entity.actPoint.z=-30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8003001e +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=-30.00000000000000000000 +Entity.actPoint.y=30.00000000000000000000 +Entity.actPoint.z=-30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8003001f +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=80030020 +Entity.point[1].v=80030021 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030020 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030021 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=-30.00000000000000000000 +Entity.actPoint.y=30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030022 +Entity.type=5001 +Entity.construction=0 +Entity.point[0].v=80030020 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=30.00000000000000000000 +Entity.actNormal.vy=-1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030023 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=80030020 +Entity.point[1].v=8003001d +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030024 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=80030021 +Entity.point[1].v=8003001e +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030027 +Entity.type=3010 +Entity.construction=0 +Entity.point[0].v=80030028 +Entity.actNormal.w=1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030028 +Entity.type=2010 +Entity.construction=1 +Entity.actPoint.z=-30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80030029 +Entity.type=3010 +Entity.construction=0 +Entity.point[0].v=8003002a +Entity.actNormal.w=1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8003002a +Entity.type=2010 +Entity.construction=1 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8003002b +Entity.type=11000 +Entity.construction=1 +Entity.point[0].v=8003002a +Entity.point[1].v=80030028 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8003002c +Entity.type=5000 +Entity.construction=0 +Entity.point[0].v=8003002a +Entity.actPoint.z=30.00000000000000000000 +Entity.actNormal.vz=1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8003002d +Entity.type=5000 +Entity.construction=0 +Entity.point[0].v=80030028 +Entity.actPoint.z=-30.00000000000000000000 +Entity.actNormal.vz=1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80040000 +Entity.type=10000 +Entity.construction=0 +Entity.point[0].v=80040002 +Entity.normal.v=80040001 +Entity.actVisible=0 +AddEntity + +Entity.h.v=80040001 +Entity.type=3010 +Entity.construction=0 +Entity.point[0].v=80040002 +Entity.actNormal.w=1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80040002 +Entity.type=2012 +Entity.construction=1 +Entity.actPoint.x=-30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050001 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=80050002 +Entity.point[1].v=80050003 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050002 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=-16.24430311833934936772 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050003 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=40.95998125794230304564 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050004 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=80050005 +Entity.point[1].v=80050006 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050005 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=-16.24430311833934936772 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050006 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=40.95998125794230304564 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050007 +Entity.type=5001 +Entity.construction=0 +Entity.point[0].v=80050005 +Entity.actPoint.x=-16.24430311833934936772 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actNormal.vy=-1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050008 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=80050005 +Entity.point[1].v=80050002 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050009 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=80050006 +Entity.point[1].v=80050003 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8005000a +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=8005000b +Entity.point[1].v=8005000c +Entity.actVisible=1 +AddEntity + +Entity.h.v=8005000b +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=40.95998125794230304564 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8005000c +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=18.78837126472273411082 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8005000d +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=8005000e +Entity.point[1].v=8005000f +Entity.actVisible=1 +AddEntity + +Entity.h.v=8005000e +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=40.95998125794230304564 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8005000f +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=18.78837126472273411082 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050010 +Entity.type=5001 +Entity.construction=0 +Entity.point[0].v=8005000e +Entity.actPoint.x=40.95998125794230304564 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actNormal.vx=0.97568423032715678733 +Entity.actNormal.vy=0.21918093596593588024 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050011 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=8005000e +Entity.point[1].v=8005000b +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050012 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=8005000f +Entity.point[1].v=8005000c +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050013 +Entity.type=12000 +Entity.construction=0 +Entity.point[0].v=80050014 +Entity.point[1].v=80050015 +Entity.point[2].v=80050016 +Entity.point[3].v=80050017 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050014 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=-16.24430311833934936772 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050015 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=18.78060959786832029295 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050016 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=-12.26208654000085118696 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050017 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=18.78837126472273411082 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050018 +Entity.type=12000 +Entity.construction=0 +Entity.point[0].v=80050019 +Entity.point[1].v=8005001a +Entity.point[2].v=8005001b +Entity.point[3].v=8005001c +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050019 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=-16.24430311833934936772 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8005001a +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=18.78060959786832029295 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8005001b +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=-12.26208654000085118696 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8005001c +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=18.78837126472273411082 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8005001d +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=80050019 +Entity.point[1].v=80050014 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8005001e +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=8005001a +Entity.point[1].v=80050015 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8005001f +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=8005001b +Entity.point[1].v=80050016 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050020 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=8005001c +Entity.point[1].v=80050017 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050023 +Entity.type=3010 +Entity.construction=0 +Entity.point[0].v=80050024 +Entity.actNormal.w=1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050024 +Entity.type=2010 +Entity.construction=1 +Entity.actPoint.x=-30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050025 +Entity.type=3010 +Entity.construction=0 +Entity.point[0].v=80050026 +Entity.actNormal.w=1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050026 +Entity.type=2010 +Entity.construction=1 +Entity.actPoint.x=-30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050027 +Entity.type=11000 +Entity.construction=1 +Entity.point[0].v=80050026 +Entity.point[1].v=80050024 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050028 +Entity.type=5000 +Entity.construction=0 +Entity.point[0].v=80050026 +Entity.actPoint.x=-30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actNormal.vz=1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050029 +Entity.type=5000 +Entity.construction=0 +Entity.point[0].v=80050024 +Entity.actPoint.x=-30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actNormal.vz=1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Constraint.h.v=00000001 +Constraint.type=20 +Constraint.group.v=00000002 +Constraint.workplane.v=80020000 +Constraint.ptA.v=00040001 +Constraint.ptB.v=00050002 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=00000002 +Constraint.type=20 +Constraint.group.v=00000002 +Constraint.workplane.v=80020000 +Constraint.ptA.v=00050001 +Constraint.ptB.v=00060002 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=00000003 +Constraint.type=20 +Constraint.group.v=00000002 +Constraint.workplane.v=80020000 +Constraint.ptA.v=00060001 +Constraint.ptB.v=00070002 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=00000004 +Constraint.type=20 +Constraint.group.v=00000002 +Constraint.workplane.v=80020000 +Constraint.ptA.v=00070001 +Constraint.ptB.v=00040002 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=00000006 +Constraint.type=80 +Constraint.group.v=00000002 +Constraint.workplane.v=80020000 +Constraint.entityA.v=00050000 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=00000007 +Constraint.type=81 +Constraint.group.v=00000002 +Constraint.workplane.v=80020000 +Constraint.entityA.v=00060000 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=00000008 +Constraint.type=61 +Constraint.group.v=00000002 +Constraint.workplane.v=80020000 +Constraint.ptA.v=00070002 +Constraint.ptB.v=00070001 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=00000009 +Constraint.type=62 +Constraint.group.v=00000002 +Constraint.workplane.v=80020000 +Constraint.ptA.v=00050002 +Constraint.ptB.v=00070001 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=0000000a +Constraint.type=50 +Constraint.group.v=00000002 +Constraint.workplane.v=80020000 +Constraint.entityA.v=00070000 +Constraint.entityB.v=00060000 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=0000000b +Constraint.type=30 +Constraint.group.v=00000002 +Constraint.workplane.v=80020000 +Constraint.valA=60.00000000000000000000 +Constraint.ptA.v=00070001 +Constraint.ptB.v=00070002 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +Constraint.disp.offset.y=10.00000000000000000000 +AddConstraint + +Constraint.h.v=0000000c +Constraint.type=50 +Constraint.group.v=00000003 +Constraint.entityA.v=80030024 +Constraint.entityB.v=8003001f +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=0000000d +Constraint.type=42 +Constraint.group.v=00000004 +Constraint.workplane.v=80040000 +Constraint.valP.v=4000000d +Constraint.ptA.v=00080001 +Constraint.entityA.v=8003000d +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=0000000e +Constraint.type=20 +Constraint.group.v=00000004 +Constraint.workplane.v=80040000 +Constraint.ptA.v=00080002 +Constraint.ptB.v=00090001 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=0000000f +Constraint.type=42 +Constraint.group.v=00000004 +Constraint.workplane.v=80040000 +Constraint.valP.v=4000000f +Constraint.ptA.v=00090002 +Constraint.entityA.v=80030004 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=00000010 +Constraint.type=20 +Constraint.group.v=00000004 +Constraint.workplane.v=80040000 +Constraint.ptA.v=00080001 +Constraint.ptB.v=000a0001 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=00000011 +Constraint.type=20 +Constraint.group.v=00000004 +Constraint.workplane.v=80040000 +Constraint.ptA.v=00090002 +Constraint.ptB.v=000a0004 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=00000012 +Constraint.type=41 +Constraint.group.v=00000005 +Constraint.ptA.v=80050019 +Constraint.entityA.v=00010000 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=00000013 +Constraint.type=1000 +Constraint.group.v=00000004 +Constraint.workplane.v=80040000 +Constraint.ptA.v=00090001 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +Constraint.comment=Corner +Constraint.disp.offset.x=0.20241264915207013431 +Constraint.disp.offset.y=-3.59163429853392557334 +Constraint.disp.offset.z=-2.21417101842298524872 +AddConstraint + +Constraint.h.v=00000014 +Constraint.type=1000 +Constraint.group.v=00000004 +Constraint.workplane.v=80040000 +Constraint.ptA.v=000a0002 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +Constraint.comment=P1 +Constraint.disp.offset.x=1.63427326092519353828 +Constraint.disp.offset.y=1.80363269244023460836 +Constraint.disp.offset.z=-3.40170696078009004992 +AddConstraint + +Constraint.h.v=00000015 +Constraint.type=1000 +Constraint.group.v=00000004 +Constraint.workplane.v=80040000 +Constraint.ptA.v=000a0003 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +Constraint.comment=P2 +Constraint.disp.offset.x=0.00123499079765074238 +Constraint.disp.offset.y=-4.38799135888326219401 +Constraint.disp.offset.z=0.22945940412293114319 +AddConstraint + +Constraint.h.v=00000016 +Constraint.type=42 +Constraint.group.v=00000004 +Constraint.workplane.v=80040000 +Constraint.valP.v=40000016 +Constraint.ptA.v=000a0002 +Constraint.entityA.v=8003000d +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=00000017 +Constraint.type=121 +Constraint.group.v=00000004 +Constraint.workplane.v=80040000 +Constraint.entityA.v=00080000 +Constraint.entityB.v=8003000d +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=00000018 +Constraint.type=42 +Constraint.group.v=00000004 +Constraint.workplane.v=80040000 +Constraint.valP.v=40000018 +Constraint.ptA.v=000a0003 +Constraint.entityA.v=80030004 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Surface 00000001 00646464 8003002c 1 1 +SCtrl 0 0 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 0 1 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 0 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 1 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +TrimBy 00000001 0 -16.24430311833934581500 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 +TrimBy 0000000a 0 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 +TrimBy 00000007 0 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 +TrimBy 00000004 0 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 +TrimBy 00000016 1 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 -16.24430311833934581500 -30.00000000000000000000 30.00000000000000000000 +AddSurface +Surface 00000002 00646464 8003002d 1 1 +SCtrl 0 0 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 0 1 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 0 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 1 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +TrimBy 00000008 1 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 +TrimBy 0000000b 1 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 +TrimBy 00000002 1 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 +TrimBy 00000005 1 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 +AddSurface +Surface 00000003 00646464 80030010 1 1 +SCtrl 0 0 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 0 1 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 0 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 1 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +TrimBy 0000000c 0 30.00000000000000000000 -30.00000000000000000000 0.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 +TrimBy 00000002 0 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 +TrimBy 00000003 1 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 +TrimBy 00000001 1 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 -16.24430311833935292043 -30.00000000000000000000 30.00000000000000000000 +TrimBy 00000019 0 -16.24430311833935292043 -30.00000000000000000000 0.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 0.00000000000000000000 +TrimBy 0000001a 0 -16.24430311833935292043 -30.00000000000000000000 30.00000000000000000000 -16.24430311833935292043 -30.00000000000000000000 0.00000000000000000000 +AddSurface +Surface 00000004 00646464 80030019 1 1 +SCtrl 0 0 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 0 1 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 0 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 1 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +TrimBy 00000004 1 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 +TrimBy 00000005 0 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 +TrimBy 00000006 1 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 +TrimBy 00000003 0 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 +AddSurface +Surface 00000005 00646464 80030022 1 1 +SCtrl 0 0 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 0 1 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 0 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 1 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +TrimBy 00000007 1 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 +TrimBy 00000008 0 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 +TrimBy 00000009 1 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 +TrimBy 00000006 0 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 +AddSurface +Surface 00000006 00646464 80030007 1 1 +SCtrl 0 0 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 0 1 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 0 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 1 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +TrimBy 0000000a 1 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 +TrimBy 0000000b 0 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 +TrimBy 0000000c 1 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 -30.00000000000001421085 0.00000000000000000000 +TrimBy 00000009 0 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 +TrimBy 0000001c 0 30.00000000000000000000 -29.99999999999999289457 0.00000000000000000000 30.00000000000000000000 18.78837126472273411082 0.00000000000000000000 +AddSurface +Surface 00000007 00646464 80050029 1 1 +SCtrl 0 0 -16.24430311833934936772 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 0 1 40.95998125794230304564 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 0 -16.24430311833934936772 18.78837126472273411082 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 1 40.95998125794230304564 18.78837126472273411082 30.00000000000000000000 Weight 1.00000000000000000000 +AddSurface +Surface 00000008 00646464 80050028 1 1 +SCtrl 0 0 40.95998125794230304564 -30.00000000000000000000 0.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 0 1 -16.24430311833934581500 -30.00000000000000000000 0.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 0 40.95998125794230304564 18.78837126472273411082 0.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 1 -16.24430311833934581500 18.78837126472273411082 0.00000000000000000000 Weight 1.00000000000000000000 +TrimBy 0000000e 0 -16.24430311833934581500 -30.00000000000000000000 0.00000000000000000000 30.00000000000000355271 18.78837126472273411082 0.00000000000000000000 +TrimBy 00000014 0 30.00000000000000355271 -30.00000000000000355271 0.00000000000000000000 -16.24430311833934581500 -30.00000000000000000000 0.00000000000000000000 +TrimBy 0000001c 1 30.00000000000000355271 18.78837126472273411082 0.00000000000000000000 30.00000000000000000000 -29.99999999999999644729 0.00000000000000000000 +AddSurface +Surface 00000009 00646464 00000000 3 1 +SCtrl 0 0 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 0 1 30.00000000000000000000 18.78837126472273411082 0.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 0 30.00000000000000000000 -12.26208654000085118696 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 1 30.00000000000000000000 -12.26208654000085118696 0.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 2 0 18.78060959786832029295 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 2 1 18.78060959786832029295 -30.00000000000000000000 0.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 3 0 -16.24430311833934936772 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 3 1 -16.24430311833934936772 -30.00000000000000000000 0.00000000000000000000 Weight 1.00000000000000000000 +TrimBy 0000000d 0 -16.24430311833934936772 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 +TrimBy 0000000e 1 30.00000000000000000000 18.78837126472273411082 0.00000000000000000000 -16.24430311833934936772 -30.00000000000000000000 0.00000000000000000000 +TrimBy 0000000f 0 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 30.00000000000000000000 18.78837126472273411082 0.00000000000000000000 +TrimBy 00000015 1 -16.24430311833934936772 -30.00000000000000000000 0.00000000000000000000 -16.24430311833934936772 -30.00000000000000000000 30.00000000000000000000 +AddSurface +Surface 0000000a 00646464 80050010 1 1 +SCtrl 0 0 40.95998125794230304564 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 0 1 40.95998125794230304564 -30.00000000000000000000 0.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 0 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 1 30.00000000000000000000 18.78837126472273411082 0.00000000000000000000 Weight 1.00000000000000000000 +AddSurface +Surface 0000000b 00646464 80050007 1 1 +SCtrl 0 0 -16.24430311833934936772 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 0 1 -16.24430311833934936772 -30.00000000000000000000 0.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 0 40.95998125794230304564 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +SCtrl 1 1 40.95998125794230304564 -30.00000000000000000000 0.00000000000000000000 Weight 1.00000000000000000000 +AddSurface +Curve 00000001 1 1 00000001 00000003 +CCtrl 0 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 +CurvePt 1 -16.24430311833934936772 -30.00000000000000000000 30.00000000000000000000 +CurvePt 1 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 +AddCurve +Curve 00000002 1 1 00000002 00000003 +CCtrl 0 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 +CurvePt 1 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 +AddCurve +Curve 00000003 1 1 00000003 00000004 +CCtrl 0 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 +CurvePt 1 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 +AddCurve +Curve 00000004 1 1 00000001 00000004 +CCtrl 0 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 +CurvePt 1 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 +AddCurve +Curve 00000005 1 1 00000002 00000004 +CCtrl 0 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 +CurvePt 1 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 +AddCurve +Curve 00000006 1 1 00000004 00000005 +CCtrl 0 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 +CurvePt 1 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 +AddCurve +Curve 00000007 1 1 00000001 00000005 +CCtrl 0 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 +CurvePt 1 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 +AddCurve +Curve 00000008 1 1 00000002 00000005 +CCtrl 0 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 +CurvePt 1 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 +AddCurve +Curve 00000009 1 1 00000005 00000006 +CCtrl 0 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 +CurvePt 1 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 +AddCurve +Curve 0000000a 1 1 00000001 00000006 +CCtrl 0 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 +AddCurve +Curve 0000000b 1 1 00000002 00000006 +CCtrl 0 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 +AddCurve +Curve 0000000c 1 1 00000006 00000003 +CCtrl 0 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000001065814 0.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 +AddCurve +Curve 0000000d 1 3 00000007 00000009 +CCtrl 0 -16.24430311833934936772 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 18.78060959786832029295 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 2 30.00000000000000000000 -12.26208654000085118696 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 3 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 -16.24430311833934936772 -30.00000000000000000000 30.00000000000000000000 +CurvePt 0 -9.95303016255717487581 -29.79321423902229426517 30.00000000000000000000 +CurvePt 0 -4.20126241934326838390 -29.17717860561580778267 30.00000000000000000000 +CurvePt 0 1.02943682797025548581 -28.15837557407050439906 30.00000000000000000000 +CurvePt 0 5.75750429605128477561 -26.74328761867633019733 30.00000000000000000000 +CurvePt 0 10.00137670156770752783 -24.93839721372323126047 30.00000000000000000000 +CurvePt 0 13.77949076118740912023 -22.75018683350117498776 30.00000000000000000000 +CurvePt 0 17.11028319157827581876 -20.18513895230010390947 30.00000000000000000000 +CurvePt 0 20.01219070940820188298 -17.24973604440997831944 30.00000000000000000000 +CurvePt 0 22.50365003134506736160 -13.95046058412074785338 30.00000000000000000000 +CurvePt 0 24.60309787405675763239 -10.29379504572236214699 30.00000000000000000000 +CurvePt 0 26.32897095421116873126 -6.28622190350478149412 30.00000000000000000000 +CurvePt 0 27.69970598847617893057 -1.93422363175795641865 30.00000000000000000000 +CurvePt 0 28.73373969351968071351 2.75571729522816255553 30.00000000000000000000 +CurvePt 0 29.44950878600955945785 7.77711840316361779912 30.00000000000000000000 +CurvePt 0 29.86544998261370409409 13.12349721775846056460 30.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 +AddCurve +Curve 0000000e 1 3 00000008 00000009 +CCtrl 0 -16.24430311833934936772 -30.00000000000000000000 0.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 18.78060959786832029295 -30.00000000000000000000 0.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 2 30.00000000000000000000 -12.26208654000085118696 0.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 3 30.00000000000000000000 18.78837126472273411082 0.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 -16.24430311833934936772 -30.00000000000000000000 0.00000000000000000000 +CurvePt 0 -9.95303016255717487581 -29.79321423902229426517 0.00000000000000000000 +CurvePt 0 -4.20126241934326838390 -29.17717860561580778267 0.00000000000000000000 +CurvePt 0 1.02943682797025548581 -28.15837557407050439906 0.00000000000000000000 +CurvePt 0 5.75750429605128477561 -26.74328761867633019733 0.00000000000000000000 +CurvePt 0 10.00137670156770752783 -24.93839721372323126047 0.00000000000000000000 +CurvePt 0 13.77949076118740912023 -22.75018683350117498776 0.00000000000000000000 +CurvePt 0 17.11028319157827581876 -20.18513895230010390947 0.00000000000000000000 +CurvePt 0 20.01219070940820188298 -17.24973604440997831944 0.00000000000000000000 +CurvePt 0 22.50365003134506736160 -13.95046058412074785338 0.00000000000000000000 +CurvePt 0 24.60309787405675763239 -10.29379504572236214699 0.00000000000000000000 +CurvePt 0 26.32897095421116873126 -6.28622190350478149412 0.00000000000000000000 +CurvePt 0 27.69970598847617893057 -1.93422363175795641865 0.00000000000000000000 +CurvePt 0 28.73373969351968071351 2.75571729522816255553 0.00000000000000000000 +CurvePt 0 29.44950878600955945785 7.77711840316361779912 0.00000000000000000000 +CurvePt 0 29.86544998261370409409 13.12349721775846056460 0.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 0.00000000000000000000 +AddCurve +Curve 0000000f 1 1 00000009 0000000a +CCtrl 0 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 18.78837126472273411082 0.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 0.00000000000000000000 +AddCurve +Curve 00000010 1 1 00000007 0000000a +CCtrl 0 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 40.95998125794230304564 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 +CurvePt 1 40.95998125794230304564 -30.00000000000000000000 30.00000000000000000000 +AddCurve +Curve 00000011 1 1 00000008 0000000a +CCtrl 0 30.00000000000000000000 18.78837126472273411082 0.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 40.95998125794230304564 -30.00000000000000000000 0.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 0.00000000000000000000 +CurvePt 1 40.95998125794230304564 -30.00000000000000000000 0.00000000000000000000 +AddCurve +Curve 00000012 1 1 0000000a 0000000b +CCtrl 0 40.95998125794230304564 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 40.95998125794230304564 -30.00000000000000000000 0.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 40.95998125794230304564 -30.00000000000000000000 30.00000000000000000000 +CurvePt 1 40.95998125794230304564 -30.00000000000000000000 0.00000000000000000000 +AddCurve +Curve 00000013 1 1 00000007 0000000b +CCtrl 0 40.95998125794230304564 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 -16.24430311833934936772 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 40.95998125794230304564 -30.00000000000000000000 30.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 +CurvePt 1 -16.24430311833934936772 -30.00000000000000000000 30.00000000000000000000 +AddCurve +Curve 00000014 1 1 00000008 0000000b +CCtrl 0 40.95998125794230304564 -30.00000000000000000000 0.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 -16.24430311833934936772 -30.00000000000000000000 0.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 40.95998125794230304564 -30.00000000000000000000 0.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 0.00000000000000000000 +CurvePt 1 -16.24430311833934936772 -30.00000000000000000000 0.00000000000000000000 +AddCurve +Curve 00000015 1 1 0000000b 00000009 +CCtrl 0 -16.24430311833934936772 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 -16.24430311833934936772 -30.00000000000000000000 0.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 -16.24430311833934936772 -30.00000000000000000000 30.00000000000000000000 +CurvePt 1 -16.24430311833934936772 -30.00000000000000000000 0.00000000000000000000 +AddCurve +Curve 00000016 1 3 00000001 00000009 +CCtrl 0 -16.24430311833934936772 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 18.78060959786832029295 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 2 30.00000000000000000000 -12.26208654000085118696 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 3 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 -16.24430311833934936772 -30.00000000000000000000 30.00000000000000000000 +CurvePt 0 -9.95303016255717487581 -29.79321423902229426517 30.00000000000000000000 +CurvePt 0 -4.20126241934326838390 -29.17717860561580778267 30.00000000000000000000 +CurvePt 0 1.02943682797025548581 -28.15837557407050439906 30.00000000000000000000 +CurvePt 0 5.75750429605128477561 -26.74328761867633019733 30.00000000000000000000 +CurvePt 0 10.00137670156770752783 -24.93839721372323126047 30.00000000000000000000 +CurvePt 0 13.77949076118740912023 -22.75018683350117498776 30.00000000000000000000 +CurvePt 0 17.11028319157827581876 -20.18513895230010390947 30.00000000000000000000 +CurvePt 0 20.01219070940820188298 -17.24973604440997831944 30.00000000000000000000 +CurvePt 0 22.50365003134506736160 -13.95046058412074785338 30.00000000000000000000 +CurvePt 0 24.60309787405675763239 -10.29379504572236214699 30.00000000000000000000 +CurvePt 0 26.32897095421116873126 -6.28622190350478149412 30.00000000000000000000 +CurvePt 0 27.69970598847617893057 -1.93422363175795641865 30.00000000000000000000 +CurvePt 0 28.73373969351968071351 2.75571729522816255553 30.00000000000000000000 +CurvePt 0 29.44950878600955945785 7.77711840316361779912 30.00000000000000000000 +CurvePt 0 29.86544998261370409409 13.12349721775846056460 30.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 +AddCurve +Curve 00000017 1 1 00000001 0000000b +CCtrl 0 -16.24430311833934581500 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 -16.24430311833934581500 -30.00000000000000000000 30.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 +AddCurve +Curve 00000018 1 1 00000003 00000007 +CCtrl 0 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 -16.24430311833934936772 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 +CurvePt 1 -16.24430311833934581500 -30.00000000000000000000 30.00000000000000000000 +AddCurve +Curve 00000019 1 1 00000003 00000008 +CCtrl 0 -16.24430311833934581500 -30.00000000000000000000 0.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 -30.00000000000000000000 0.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 -16.24430311833934581500 -30.00000000000000000000 0.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 0.00000000000000000000 +AddCurve +Curve 0000001a 1 1 00000003 00000009 +CCtrl 0 -16.24430311833934936772 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 -16.24430311833934936772 -30.00000000000000000000 0.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 -16.24430311833934936772 -30.00000000000000000000 30.00000000000000000000 +CurvePt 1 -16.24430311833934936772 -30.00000000000000000000 0.00000000000000000000 +AddCurve +Curve 0000001b 1 1 00000006 00000007 +CCtrl 0 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 -29.99999999999999289457 30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 +CurvePt 1 30.00000000000000000000 -29.99999999999999289457 30.00000000000000000000 +AddCurve +Curve 0000001c 1 1 00000006 00000008 +CCtrl 0 30.00000000000000000000 -29.99999999999999289457 0.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 18.78837126472273411082 0.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 -29.99999999999999289457 0.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 0.00000000000000000000 +AddCurve +Curve 0000001d 1 1 00000006 00000009 +CCtrl 0 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 18.78837126472273411082 0.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 0.00000000000000000000 +AddCurve +Curve 0000001e 1 1 00000006 0000000a +CCtrl 0 30.00000000000008526513 18.78837126472273411082 0.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000008526513 18.78837126472273411082 30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 0.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 +AddCurve +Curve 0000001f 1 1 00000006 0000000b +CCtrl 0 30.00000000000000000000 -30.00000000000000000000 29.99999999999999289457 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 -30.00000000000000000000 -0.00000000000000666134 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 29.99999999999999289457 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 -0.00000000000000666134 +AddCurve diff --git a/test/group/boolean_tangent_crossing/test.cpp b/test/group/boolean_tangent_crossing/test.cpp new file mode 100644 index 000000000..1ced8620e --- /dev/null +++ b/test/group/boolean_tangent_crossing/test.cpp @@ -0,0 +1,36 @@ +#include "solvespace.h" + +#include "harness.h" + +// A cube minus a tool whose profile is a cubic spline closed by two straight +// lines. The spline ends on a face of the cube, tangent to it, but the line +// that continues the profile from that endpoint runs outside the cube, and so +// crosses that face. Along the tangent line, then, one of the tool's faces +// lies in the cube face's tangent plane while the other cuts through it, and +// the tool's material fills the region behind the tangent face. Classifying +// the region on that side as coincident with the tool--as if the tangent face +// were flat there--drops the tangent line from the trim, and the cube face is +// then lost (issue #1291; the model is ruevs' cube_cut with the spline made +// tangent on the other side, its corner left outside the cube). +TEST_CASE(normal_watertight_volume) { + CHECK_LOAD("normal.slvs"); + + Group *g = SK.GetGroup(SS.GW.activeGroup); + g->GenerateDisplayItems(); + SMesh *m = &g->displayMesh; + CHECK_FALSE(m->l.IsEmpty()); + + SEdgeList el = {}; + bool inters, leaks; + SKdNode::From(m)->MakeCertainEdgesInto(&el, + EdgeKind::NAKED_OR_SELF_INTER, /*coplanarIsInter=*/true, &inters, &leaks); + CHECK_FALSE(inters); + CHECK_FALSE(leaks); + CHECK_TRUE(el.l.IsEmpty()); + el.Clear(); + + // The cube is 60³ = 216000 mm³; the tool cuts away a wedge bounded by the + // spline surface, roughly 10500 mm³ (a little less than the true value, + // since the mesh approximates the spline surface with inscribed facets). + CHECK_EQ_EPS(m->CalculateVolume() / 205477.058604742, 1.0); +}