diff --git a/src/srf/boolean.cpp b/src/srf/boolean.cpp index 16bd74dd0..4ece8a8d7 100644 --- a/src/srf/boolean.cpp +++ b/src/srf/boolean.cpp @@ -203,6 +203,115 @@ SCurve SCurve::MakeCopySplitAgainst(SShell *agnstA, SShell *agnstB, return ret; } +//----------------------------------------------------------------------------- +// Insert p as a vertex of the piecewise linear curve sc, if it lies within one +// of sc's segments (and on sc's exact curve, where we have one) and isn't +// already one of its points. Returns true if we changed the curve. +//----------------------------------------------------------------------------- +static bool InsertVertexIntoCurve(SCurve *sc, Vector p) { + for(const SCurvePt &scpt : sc->pts) { + if(scpt.p.Equals(p)) return false; + } + + int i; + for(i = 1; i < sc->pts.n; i++) { + Vector a = sc->pts[i-1].p, + d = (sc->pts[i].p).Minus(a); + double m = d.MagSquared(); + if(m < LENGTH_EPS*LENGTH_EPS) continue; + double t = (p.Minus(a)).Dot(d)/m; + if((t <= 0.0) || (t >= 1.0)) continue; + if((p.Minus(a.Plus(d.ScaledBy(t)))).Magnitude() > LENGTH_EPS) continue; + break; + } + if(i >= sc->pts.n) return false; + + // The pwl chord of a curved segment is not the curve, so make sure that + // the point really lies on the curve and not just near the chord. + if(sc->isExact) { + double t; + sc->exact.ClosestPointTo(p, &t, /*mustConverge=*/false); + if((p.Minus(sc->exact.PointAt(t))).Magnitude() > LENGTH_EPS) return false; + } + + SCurvePt scpt = {}; + scpt.p = p; + scpt.vertex = true; + + List pts = {}; + pts.ReserveMore(sc->pts.n + 1); + for(int j = 0; j < sc->pts.n; j++) { + if(j == i) pts.Add(&scpt); + pts.Add(&(sc->pts[j])); + } + sc->pts.Clear(); + sc->pts = pts; + return true; +} + +//----------------------------------------------------------------------------- +// A curve of one shell may cross a curve of the other shell at a point that is +// a vertex of neither input shell, and that lies on no surface which either +// curve crosses transversally; that happens where the two shells touch without +// passing through each other, for example where an edge of one runs within a +// coincident face of the other. MakeCopySplitAgainst() splits curves against +// surfaces, so at such a point it splits only whichever of the two curves does +// meet a transversal surface there, and leaves the other one whole. The +// unsplit curve then contributes a single trim edge whose two halves classify +// differently, which cannot be represented: the edge is kept or discarded +// whole, and the trim polygon fails to assemble, so the face is lost. +// +// So propagate the splits that we just made. Any vertex that splitting created +// within a curve from one operand, and that lies within a curve from the other +// operand, becomes a vertex of that curve too. +//----------------------------------------------------------------------------- +void SShell::SplitCurvesAtCrossings() { + List vert[2] = {}; + for(SCurve &sc : curve) { + int i; + if(sc.source == SCurve::Source::A) { + i = 0; + } else if(sc.source == SCurve::Source::B) { + i = 1; + } else { + continue; + } + // Only the interior points that a split created; the endpoints of a + // curve are its shell's own vertices, and an exact curve's endpoints + // may lie outside the real geometry entirely (issue #1452). + for(int j = 1; j < sc.pts.n - 1; j++) { + if(sc.pts[j].vertex) vert[i].Add(&(sc.pts[j].p)); + } + } + + if(!vert[0].IsEmpty() || !vert[1].IsEmpty()) { + for(SCurve &sc : curve) { + int i; + if(sc.source == SCurve::Source::A) { + i = 1; + } else if(sc.source == SCurve::Source::B) { + i = 0; + } else { + continue; + } + + Vector cmax = {VERY_NEGATIVE, VERY_NEGATIVE, VERY_NEGATIVE}, + cmin = {VERY_POSITIVE, VERY_POSITIVE, VERY_POSITIVE}; + for(const SCurvePt &scpt : sc.pts) { + scpt.p.MakeMaxMin(&cmax, &cmin); + } + + for(const Vector &p : vert[i]) { + if(p.OutsideAndNotOn(cmax, cmin)) continue; + InsertVertexIntoCurve(&sc, p); + } + } + } + + vert[0].Clear(); + vert[1].Clear(); +} + void SShell::CopyCurvesSplitAgainst(bool opA, SShell *agnst, SShell *into) { #pragma omp parallel for for(int i=0; iCopyCurvesSplitAgainst(/*opA=*/true, b, this); b->CopyCurvesSplitAgainst(/*opA=*/false, a, this); + // Where the two shells touch without crossing, a curve of one shell can + // cross a curve of the other at a point that splitting against surfaces + // finds on only one of the two curves; carry those points across. + SplitCurvesAtCrossings(); + // Generate the intersection curves for each surface in A against all // the surfaces in B (which is all of the intersection curves). a->MakeIntersectionCurvesAgainst(b, this); diff --git a/src/srf/surface.h b/src/srf/surface.h index d11716762..81124abc9 100644 --- a/src/srf/surface.h +++ b/src/srf/surface.h @@ -402,6 +402,7 @@ class SShell { void MakeFromIntersectionOf(SShell *a, SShell *b); void MakeFromBoolean(SShell *a, SShell *b, SSurface::CombineAs type); void CopyCurvesSplitAgainst(bool opA, SShell *agnst, SShell *into); + void SplitCurvesAtCrossings(); void CopySurfacesTrimAgainst(SShell *sha, SShell *shb, SShell *into, SSurface::CombineAs type); void MakeIntersectionCurvesAgainst(SShell *against, SShell *into); void MakeClassifyingBsps(SShell *useCurvesFrom); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 0dafd42db..5e0b490fd 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -64,6 +64,7 @@ set(testsuite_SOURCES request/ttf_text/test.cpp request/workplane/test.cpp group/boolean_coplanar_union/test.cpp + group/boolean_cross_vertex/test.cpp group/boolean_knife_edge/test.cpp group/boolean_tangent_edge/test.cpp group/boolean_tangent_fillet/test.cpp diff --git a/test/group/boolean_cross_vertex/normal.slvs b/test/group/boolean_cross_vertex/normal.slvs new file mode 100644 index 000000000..053297958 --- /dev/null +++ b/test/group/boolean_cross_vertex/normal.slvs @@ -0,0 +1,2130 @@ +±²³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=7001 +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=60.00000000000000000000 +AddParam + +Param.h.v.=00080014 +AddParam + +Param.h.v.=00090010 +Param.val=60.00000000000000000000 +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.73538976911678588522 +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.=40000017 +Param.val=0.36351674198930805648 +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=-35.68076426785469834613 +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=30.00000000000000000000 +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=30.00000000000000000000 +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.26461023088321411478 +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=65.68076426785469834613 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050003 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=65.68076426785469834613 +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.actPoint.z=-5.68076426785469834613 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050006 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=-5.68076426785469834613 +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=30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=65.68076426785469834613 +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=65.68076426785469834613 +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=30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=-5.68076426785469834613 +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.actPoint.z=-5.68076426785469834613 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050010 +Entity.type=5001 +Entity.construction=0 +Entity.point[0].v=8005000e +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=-30.00000000000000000000 +Entity.actPoint.z=30.00000000000000000000 +Entity.actNormal.vx=1.00000000000000000000 +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=65.68076426785469834613 +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=65.68076426785469834613 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80050016 +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=-12.26461023088321411478 +Entity.actPoint.z=65.68076426785469834613 +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=65.68076426785469834613 +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.actPoint.z=-5.68076426785469834613 +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.actPoint.z=-5.68076426785469834613 +Entity.actVisible=1 +AddEntity + +Entity.h.v=8005001b +Entity.type=2010 +Entity.construction=0 +Entity.actPoint.x=30.00000000000000000000 +Entity.actPoint.y=-12.26461023088321411478 +Entity.actPoint.z=-5.68076426785469834613 +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.actPoint.z=-5.68076426785469834613 +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=65.68076426785469834613 +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.actPoint.z=-5.68076426785469834613 +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.actPoint.z=-5.68076426785469834613 +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=65.68076426785469834613 +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=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=20 +Constraint.group.v=00000004 +Constraint.workplane.v=80040000 +Constraint.ptA.v=00090001 +Constraint.ptB.v=8003000f +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=00000017 +Constraint.type=42 +Constraint.group.v=00000004 +Constraint.workplane.v=80040000 +Constraint.valP.v=40000017 +Constraint.ptA.v=000a0003 +Constraint.entityA.v=00090000 +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 0000000b 0 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 +TrimBy 0000000a 0 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 +TrimBy 00000003 0 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 +TrimBy 0000001d 0 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 +TrimBy 0000001c 1 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 -16.24430311833934581500 -30.00000000000000000000 30.00000000000000000000 +TrimBy 0000001e 0 -16.24430311833934581500 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 -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 00000005 1 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 +TrimBy 00000008 1 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 +TrimBy 00000007 1 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 +TrimBy 0000000c 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 00000009 0 30.00000000000000355271 -30.00000000000000355271 -5.68076426785470278702 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 +TrimBy 00000007 0 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 +TrimBy 00000001 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 00000016 0 -16.24430311833935292043 -30.00000000000000000000 -5.68076426785470189884 30.00000000000000000000 -30.00000000000000000000 -5.68076426785470367520 +TrimBy 00000019 0 -16.24430311833935292043 -30.00000000000000000000 30.00000000000000000000 -16.24430311833935292043 -30.00000000000000000000 -5.68076426785470189884 +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 00000003 1 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 +TrimBy 0000000c 0 -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 00000001 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 00000006 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 00000004 1 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 +TrimBy 00000002 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 -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 -5.68076426785470367520 +TrimBy 00000004 0 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 30.00000000000000000000 -30.00000000000000000000 +TrimBy 00000017 0 30.00000000000000000000 -30.00000000000000000000 -5.68076426785470367520 30.00000000000000000000 18.78837126472273411082 -5.68076426785470545155 +TrimBy 00000018 1 30.00000000000000000000 18.78837126472273411082 -5.68076426785470545155 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 +AddSurface +Surface 00000007 00646464 80050029 1 1 +SCtrl 0 0 -16.24430311833934936772 -30.00000000000000000000 65.68076426785469834613 Weight 1.00000000000000000000 +SCtrl 0 1 29.99999999999999644729 -30.00000000000000000000 65.68076426785469834613 Weight 1.00000000000000000000 +SCtrl 1 0 -16.24430311833934936772 18.78837126472273411082 65.68076426785469834613 Weight 1.00000000000000000000 +SCtrl 1 1 29.99999999999999644729 18.78837126472273411082 65.68076426785469834613 Weight 1.00000000000000000000 +AddSurface +Surface 00000008 00646464 80050028 1 1 +SCtrl 0 0 29.99999999999999644729 -30.00000000000000000000 -5.68076426785469834613 Weight 1.00000000000000000000 +SCtrl 0 1 -16.24430311833934936772 -30.00000000000000000000 -5.68076426785469834613 Weight 1.00000000000000000000 +SCtrl 1 0 29.99999999999999644729 18.78837126472273411082 -5.68076426785469834613 Weight 1.00000000000000000000 +SCtrl 1 1 -16.24430311833934936772 18.78837126472273411082 -5.68076426785469834613 Weight 1.00000000000000000000 +TrimBy 00000014 0 -16.24430311833934936772 -30.00000000000000000000 -5.68076426785469834613 29.99999999999999644729 18.78837126472273411082 -5.68076426785469834613 +TrimBy 0000000f 0 29.99999999999999644729 18.78837126472273411082 -5.68076426785469834613 29.99999999999999644729 -30.00000000000000000000 -5.68076426785469834613 +TrimBy 00000010 0 29.99999999999999644729 -30.00000000000000000000 -5.68076426785469834613 -16.24430311833934936772 -30.00000000000000000000 -5.68076426785469834613 +AddSurface +Surface 00000009 00646464 00000000 3 1 +SCtrl 0 0 30.00000000000000000000 18.78837126472273411082 65.68076426785469834613 Weight 1.00000000000000000000 +SCtrl 0 1 30.00000000000000000000 18.78837126472273411082 -5.68076426785469834613 Weight 1.00000000000000000000 +SCtrl 1 0 30.00000000000000000000 -12.26461023088321411478 65.68076426785469834613 Weight 1.00000000000000000000 +SCtrl 1 1 30.00000000000000000000 -12.26461023088321411478 -5.68076426785469834613 Weight 1.00000000000000000000 +SCtrl 2 0 18.78060959786832029295 -30.00000000000000000000 65.68076426785469834613 Weight 1.00000000000000000000 +SCtrl 2 1 18.78060959786832029295 -30.00000000000000000000 -5.68076426785469834613 Weight 1.00000000000000000000 +SCtrl 3 0 -16.24430311833934936772 -30.00000000000000000000 65.68076426785469834613 Weight 1.00000000000000000000 +SCtrl 3 1 -16.24430311833934936772 -30.00000000000000000000 -5.68076426785469834613 Weight 1.00000000000000000000 +TrimBy 00000014 1 30.00000000000000000000 18.78837126472273411082 -5.68076426785469834613 -16.24430311833934936772 -30.00000000000000000000 -5.68076426785469834613 +TrimBy 00000012 0 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 30.00000000000000000000 18.78837126472273411082 -5.68076426785469834613 +TrimBy 00000011 1 -16.24430311833934936772 -30.00000000000000000000 -5.68076426785469834613 -16.24430311833934936772 -30.00000000000000000000 29.99999999999999289457 +TrimBy 0000001c 0 -16.24430311833934936772 -30.00000000000000000000 29.99999999999999289457 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 +AddSurface +Surface 0000000a 00646464 80050010 1 1 +SCtrl 0 0 30.00000000000000000000 -30.00000000000000000000 65.68076426785469834613 Weight 1.00000000000000000000 +SCtrl 0 1 30.00000000000000000000 -30.00000000000000000000 -5.68076426785469834613 Weight 1.00000000000000000000 +SCtrl 1 0 30.00000000000000000000 18.78837126472273411082 65.68076426785469834613 Weight 1.00000000000000000000 +SCtrl 1 1 30.00000000000000000000 18.78837126472273411082 -5.68076426785469834613 Weight 1.00000000000000000000 +AddSurface +Surface 0000000b 00646464 80050007 1 1 +SCtrl 0 0 -16.24430311833934936772 -30.00000000000000000000 65.68076426785469834613 Weight 1.00000000000000000000 +SCtrl 0 1 -16.24430311833934936772 -30.00000000000000000000 -5.68076426785469834613 Weight 1.00000000000000000000 +SCtrl 1 0 30.00000000000000000000 -30.00000000000000000000 65.68076426785469834613 Weight 1.00000000000000000000 +SCtrl 1 1 30.00000000000000000000 -30.00000000000000000000 -5.68076426785469834613 Weight 1.00000000000000000000 +AddSurface +Curve 00000001 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 00000002 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 00000003 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 00000004 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 00000005 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 00000006 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 00000007 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 00000008 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 00000009 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 29.99999999999999644729 -30.00000000000000000000 -5.68076426785469834613 +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 -30.00000000000000000000 30.00000000000000000000 +AddCurve +Curve 0000000b 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 -30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 +AddCurve +Curve 0000000c 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 0000000d 1 1 00000007 0000000b +CCtrl 0 30.00000000000000000000 -30.00000000000000000000 65.68076426785469834613 Weight 1.00000000000000000000 +CCtrl 1 -16.24430311833934936772 -30.00000000000000000000 65.68076426785469834613 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 65.68076426785469834613 +CurvePt 1 -16.24430311833934936772 -30.00000000000000000000 65.68076426785469834613 +AddCurve +Curve 0000000e 1 1 00000007 0000000a +CCtrl 0 30.00000000000000000000 18.78837126472273411082 65.68076426785469834613 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 -30.00000000000000000000 65.68076426785469834613 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 65.68076426785469834613 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 65.68076426785469834613 +AddCurve +Curve 0000000f 1 1 00000008 0000000a +CCtrl 0 30.00000000000000000000 18.78837126472273411082 -5.68076426785469834613 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 -30.00000000000000000000 -5.68076426785469834613 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 -5.68076426785469834613 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 -5.68076426785469834613 +AddCurve +Curve 00000010 1 1 00000008 0000000b +CCtrl 0 30.00000000000000000000 -30.00000000000000000000 -5.68076426785469834613 Weight 1.00000000000000000000 +CCtrl 1 -16.24430311833934936772 -30.00000000000000000000 -5.68076426785469834613 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 -5.68076426785469834613 +CurvePt 1 -16.24430311833934936772 -30.00000000000000000000 -5.68076426785469834613 +AddCurve +Curve 00000011 1 1 0000000b 00000009 +CCtrl 0 -16.24430311833934936772 -30.00000000000000000000 65.68076426785469834613 Weight 1.00000000000000000000 +CCtrl 1 -16.24430311833934936772 -30.00000000000000000000 -5.68076426785469834613 Weight 1.00000000000000000000 +CurvePt 1 -16.24430311833934936772 -30.00000000000000000000 65.68076426785469834613 +CurvePt 1 -16.24430311833934581500 -30.00000000000000000000 30.00000000000000000000 +CurvePt 1 -16.24430311833934936772 -30.00000000000000000000 -5.68076426785469834613 +AddCurve +Curve 00000012 1 1 00000009 0000000a +CCtrl 0 30.00000000000000000000 18.78837126472273411082 65.68076426785469834613 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 18.78837126472273411082 -5.68076426785469834613 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 65.68076426785469834613 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 -5.68076426785469834613 +AddCurve +Curve 00000013 1 1 0000000a 0000000b +CCtrl 0 30.00000000000000000000 -30.00000000000000000000 65.68076426785469834613 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 -30.00000000000000000000 -5.68076426785469834613 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 65.68076426785469834613 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 -5.68076426785469834613 +AddCurve +Curve 00000014 1 3 00000008 00000009 +CCtrl 0 -16.24430311833934936772 -30.00000000000000000000 -5.68076426785469834613 Weight 1.00000000000000000000 +CCtrl 1 18.78060959786832029295 -30.00000000000000000000 -5.68076426785469834613 Weight 1.00000000000000000000 +CCtrl 2 30.00000000000000000000 -12.26461023088321411478 -5.68076426785469834613 Weight 1.00000000000000000000 +CCtrl 3 30.00000000000000000000 18.78837126472273411082 -5.68076426785469834613 Weight 1.00000000000000000000 +CurvePt 1 -16.24430311833934936772 -30.00000000000000000000 -5.68076426785469834613 +CurvePt 0 -9.95303016255717487581 -29.79324196511841549295 -5.68076426785469834613 +CurvePt 0 -4.20126241934326838390 -29.17728211637465562944 -5.68076426785469834613 +CurvePt 0 1.02943682797025548581 -28.15859183762023931763 -5.68076426785469834613 +CurvePt 0 5.75750429605128477561 -26.74364251270666059668 -5.68076426785469834613 +CurvePt 0 10.00137670156770752783 -24.93890552548542771660 -5.68076426785469834613 +CurvePt 0 13.77949076118740912023 -22.75085225980804892743 -5.68076426785469834613 +CurvePt 0 17.11028319157827581876 -20.18595409952602182102 -5.68076426785469834613 +CurvePt 0 20.01219070940820188298 -17.25068242849086175283 -5.68076426785469834613 +CurvePt 0 22.50365003134506736160 -13.95150863055406986746 -5.68076426785469834613 +CurvePt 0 24.60309787405675763239 -10.29490408956715086219 -5.68076426785469834613 +CurvePt 0 26.32897095421116873126 -6.28734018938160943435 -5.68076426785469834613 +CurvePt 0 27.69970598847617893057 -1.93528831384895116940 -5.68076426785469834613 +CurvePt 0 28.73373969351968071351 2.75478015317931657080 -5.68076426785469834613 +CurvePt 0 29.44950878600955945785 7.77639382785168997714 -5.68076426785469834613 +CurvePt 0 29.86544998261370409409 13.12308132631666524048 -5.68076426785469834613 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 -5.68076426785469834613 +AddCurve +Curve 00000015 1 3 00000007 00000009 +CCtrl 0 -16.24430311833934936772 -30.00000000000000000000 65.68076426785469834613 Weight 1.00000000000000000000 +CCtrl 1 18.78060959786832029295 -30.00000000000000000000 65.68076426785469834613 Weight 1.00000000000000000000 +CCtrl 2 30.00000000000000000000 -12.26461023088321411478 65.68076426785469834613 Weight 1.00000000000000000000 +CCtrl 3 30.00000000000000000000 18.78837126472273411082 65.68076426785469834613 Weight 1.00000000000000000000 +CurvePt 1 -16.24430311833934936772 -30.00000000000000000000 65.68076426785469834613 +CurvePt 0 -9.95303016255717487581 -29.79324196511841549295 65.68076426785469834613 +CurvePt 0 -4.20126241934326838390 -29.17728211637465562944 65.68076426785469834613 +CurvePt 0 1.02943682797025548581 -28.15859183762023931763 65.68076426785469834613 +CurvePt 0 5.75750429605128477561 -26.74364251270666059668 65.68076426785469834613 +CurvePt 0 10.00137670156770752783 -24.93890552548542771660 65.68076426785469834613 +CurvePt 0 13.77949076118740912023 -22.75085225980804892743 65.68076426785469834613 +CurvePt 0 17.11028319157827581876 -20.18595409952602182102 65.68076426785469834613 +CurvePt 0 20.01219070940820188298 -17.25068242849086175283 65.68076426785469834613 +CurvePt 0 22.50365003134506736160 -13.95150863055406986746 65.68076426785469834613 +CurvePt 0 24.60309787405675763239 -10.29490408956715086219 65.68076426785469834613 +CurvePt 0 26.32897095421116873126 -6.28734018938160943435 65.68076426785469834613 +CurvePt 0 27.69970598847617893057 -1.93528831384895116940 65.68076426785469834613 +CurvePt 0 28.73373969351968071351 2.75478015317931657080 65.68076426785469834613 +CurvePt 0 29.44950878600955945785 7.77639382785168997714 65.68076426785469834613 +CurvePt 0 29.86544998261370409409 13.12308132631666524048 65.68076426785469834613 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 65.68076426785469834613 +AddCurve +Curve 00000016 1 1 00000003 00000008 +CCtrl 0 -16.24430311833933515686 -30.00000000000000000000 -5.68076426785469834613 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 -30.00000000000000000000 -5.68076426785469834613 Weight 1.00000000000000000000 +CurvePt 1 -16.24430311833934936772 -30.00000000000000000000 -5.68076426785469834613 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 -5.68076426785469834613 +AddCurve +Curve 00000017 1 1 00000006 00000008 +CCtrl 0 30.00000000000000000000 -29.99999999999999289457 -5.68076426785469834613 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 18.78837126472273411082 -5.68076426785469834613 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 -5.68076426785469834613 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 -5.68076426785469834613 +AddCurve +Curve 00000018 1 1 00000006 00000009 +CCtrl 0 30.00000000000000000000 18.78837126472273411082 65.68076426785469834613 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 18.78837126472273411082 -5.68076426785469834613 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 65.68076426785469834613 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 -5.68076426785469834613 +AddCurve +Curve 00000019 1 1 00000003 00000009 +CCtrl 0 -16.24430311833934936772 -30.00000000000000000000 65.68076426785469834613 Weight 1.00000000000000000000 +CCtrl 1 -16.24430311833934936772 -30.00000000000000000000 -5.68076426785469834613 Weight 1.00000000000000000000 +CurvePt 1 -16.24430311833934936772 -30.00000000000000000000 65.68076426785469834613 +CurvePt 1 -16.24430311833934581500 -30.00000000000000000000 30.00000000000000000000 +CurvePt 1 -16.24430311833934936772 -30.00000000000000000000 -5.68076426785469834613 +AddCurve +Curve 0000001a 1 1 00000003 0000000a +CCtrl 0 30.00000000000000000000 -30.00000000000000000000 -5.68076426785470012248 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 -5.68076426785470012248 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 +AddCurve +Curve 0000001b 1 1 00000006 0000000b +CCtrl 0 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 -30.00000000000000000000 -5.68076426785472410330 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 -5.68076426785470012248 +AddCurve +Curve 0000001c 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.26461023088321411478 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.79324196511841549295 30.00000000000000000000 +CurvePt 0 -4.20126241934326838390 -29.17728211637465562944 30.00000000000000000000 +CurvePt 0 1.02943682797025548581 -28.15859183762023931763 30.00000000000000000000 +CurvePt 0 5.75750429605128477561 -26.74364251270666059668 30.00000000000000000000 +CurvePt 0 10.00137670156770752783 -24.93890552548542771660 30.00000000000000000000 +CurvePt 0 13.77949076118740912023 -22.75085225980804892743 30.00000000000000000000 +CurvePt 0 17.11028319157827581876 -20.18595409952602182102 30.00000000000000000000 +CurvePt 0 20.01219070940820188298 -17.25068242849086175283 30.00000000000000000000 +CurvePt 0 22.50365003134506736160 -13.95150863055406986746 30.00000000000000000000 +CurvePt 0 24.60309787405675763239 -10.29490408956715086219 30.00000000000000000000 +CurvePt 0 26.32897095421116873126 -6.28734018938160943435 30.00000000000000000000 +CurvePt 0 27.69970598847617893057 -1.93528831384895116940 30.00000000000000000000 +CurvePt 0 28.73373969351968071351 2.75478015317931657080 30.00000000000000000000 +CurvePt 0 29.44950878600955945785 7.77639382785168997714 30.00000000000000000000 +CurvePt 0 29.86544998261370409409 13.12308132631666524048 30.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273411082 30.00000000000000000000 +AddCurve +Curve 0000001d 1 1 00000001 0000000a +CCtrl 0 30.00000000000000000000 -29.99999999999998578915 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 18.78837126472273766353 30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 30.00000000000000000000 -29.99999999999998578915 30.00000000000000000000 +CurvePt 1 30.00000000000000000000 18.78837126472273766353 30.00000000000000000000 +AddCurve +Curve 0000001e 1 1 00000001 0000000b +CCtrl 0 -16.24430311833934226229 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CCtrl 1 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 Weight 1.00000000000000000000 +CurvePt 1 -16.24430311833934226229 -30.00000000000000000000 30.00000000000000000000 +CurvePt 1 30.00000000000000000000 -30.00000000000000000000 30.00000000000000000000 +AddCurve diff --git a/test/group/boolean_cross_vertex/test.cpp b/test/group/boolean_cross_vertex/test.cpp new file mode 100644 index 000000000..7d38ee6f6 --- /dev/null +++ b/test/group/boolean_cross_vertex/test.cpp @@ -0,0 +1,37 @@ +#include "solvespace.h" + +#include "harness.h" + +// A cube minus a tool swept along a spline profile. The profile is tangent to +// one face of the cube, and the tool's flat cap face is coincident with that +// same face of the cube, so the tool's tangent edge runs within the cube's +// face and crosses the cube's own edge there. That crossing point is a vertex +// of neither input shell, and neither curve passes through a surface of the +// other shell transversally at it, so SCurve::MakeCopySplitAgainst() splits +// only the tool's edge (which does cross the cube's face) and leaves the +// cube's edge whole. The cube's face is then trimmed by an edge whose two +// halves classify differently, its trim polygon fails to assemble, and two +// faces of the result go missing (issue #1743; the model is phkahler's +// cube_cut_2). +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 same value that the mesh Boolean gives for this model (build it + // with Group.forceToMesh set), to twelve significant figures. + CHECK_EQ_EPS(m->CalculateVolume() / 203485.2242132, 1.0); +} +