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; 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); +}