} else {
offsetToEdge = -1;
}
if (!currentPlaneY.guide) {
SliceSlot slot = new SliceSlot(slicePlane, slotPos,
slotDir, (-splineWidth - offsetToEdge),
SETTINGS.materialThickness);
slot.swap();
slot.setOnEdge(new Vec2D(0, 1));
if(crossSliceSelection.getCapType() != CrossSliceSelection.CAP_INSIDE)
slot.makesEdge = true;
currentPlaneY.getSketch().getSlots().add(slot);
}
if (!currentPlaneY.guide) {
if (!crossSliceSelection.flipSide) {
if (j != 0 && j != planesToSlice.size() - 1 ){
float yPosSlot = intersectX.y + (splineWidth);
SliceSlot slot = new SliceSlot(
currentPlaneY,
new Vec2D(intersectX.x,yPosSlot),
new Vec2D(-1, 0), splineWidth,
SETTINGS.materialThickness);
if(crossSliceSelection.getCapType() != CrossSliceSelection.CAP_INSIDE)
slot.makesEdge = true;
slot.setOnEdge(new Vec2D(0,-1)); // these slots start from the middle so this doesn't work, flip slots.
//LOGGER.info("X " + slot.getPos().x + " Y " + slot.getPos().y );
slicePlane
.getSketch()
.getSlots()
.add(slot);
}
} else {
if (j != 0 && j != planesToSlice.size() - 1){
SliceSlot slot = new SliceSlot(
currentPlaneY,
new Vec2D(intersectX.x,
intersectX.y
- (splineWidth)),
new Vec2D(1, 0), splineWidth,
SETTINGS.materialThickness);
slot.setOnEdge(new Vec2D(0, -1));
if(crossSliceSelection.getCapType() != CrossSliceSelection.CAP_INSIDE)
slot.makesEdge = true;
slicePlane
.getSketch()
.getSlots()
.add(slot);
}
}
}
// if(topIntersect != null){
Vec3D tempVec = new Vec3D(bottomIntersect.x,
bottomIntersect.y, 0);
tempVec = slicePlane.getWorldPosIntersect(tempVec);
if (SETTINGS.DEBUG) {
currentPlaneY.debugIntersectionPoints.add(slotPos);
currentPlaneY.debugIntersectionPointsTop.add(tempPos
.scale(tempDir));
currentPlaneY.debugIntersectionPointsBottom.add(tempPos
.scale(tempDir.scale(-1)));
}
topLine.add(new SketchPoint(bottomIntersect));
bottomLine.add(new SketchPoint(topIntersect));
}
}
}
//}
/* ACROSS SKETCHPATH */
/**
* Find intersections across cross section
*
* <pre>
* currentPath
* ^
* |
* ------ x1 -> (topIntersect)
* | \/ -------------------------> (crossSliceSelection)
* | /\
* | / /
* \ / \
* \_/____\
* /
* x2 -> (bottomIntersect)
* </pre>
*/
else if (spline instanceof SketchPath) {
SketchPath currentPath = (SketchPath) spline;
vecPos = new Vec3D(vecPos.x, vecPos.y,currentPlaneY.getPlane().z);
//always crop to shape as we work out the correct shape earlier
List<List<Vec2D>> points = currentPlaneY.getIntersection(
slicePlane, true,
currentPath);
if (points != null && points.size() > 1) {
Vec2D topIntersect = null;
Vec2D bottomIntersect = null;
Vec2D topIntersectY = null;
Vec2D bottomIntersectY = null;
Vec2D topIntersectX = null;
Vec2D bottomIntersectX = null;
float dist = 0;
float neartestDist = -1;
Vec2D vecStart = new Vec2D(vecPos.x, vecPos.y);
//find the closest point
for (int k = 0; k < points.size(); k++) {
Vec2D vec2d = (Vec2D) points.get(k).get(0);
Vec2D vec2dX = (Vec2D) points.get(k).get(1);
Vec3D vec3d = new Vec3D(vec2dX.x, vec2dX.y,vecPos.z);
float d = vecStart.distanceTo(vec2dX);
//Display intersects in debug mode
if (SETTINGS.DEBUG) {
currentPlaneY.debugIntersectionPoints
.add(vec2dX);
currentPlaneY.debugIntersetStart = new Vec2D(
vecPos.x, vecPos.y);
}
if (d < neartestDist || neartestDist == -1) {
neartestDist = d;
topIntersect = vec2d;
topIntersectX = vec2dX;
}
}
float MIN_DUPLICATE_DIST = 2;
//Remove the closest point
for (int k = 0; k < points.size(); k++) {
Vec2D vec2d = (Vec2D) points.get(k).get(0);
Vec2D vec2dx = (Vec2D) points.get(k).get(1);
float distToLastIntersect = topIntersectX
.distanceTo(vec2dx);
if (vec2d.equals(topIntersect)
|| distToLastIntersect < MIN_DUPLICATE_DIST) {
points.remove(k);
k--;
}
}
//find the next closest intersect!
neartestDist = -1;
for (int k = 0; k < points.size(); k++) {
Vec2D vec2d = (Vec2D) points.get(k).get(0);
Vec2D vec2dX = (Vec2D) points.get(k).get(1);
Vec3D vec3d = new Vec3D(vec2d.x, vec2d.y,
currentPlaneY.getPlane().z);
float d = vecStart.distanceTo(vec2dX);
if ((d < neartestDist && vec2d != topIntersect)
|| neartestDist == -1) {
neartestDist = d;
bottomIntersect = vec2d;
bottomIntersectX = vec2dX;
}
}
/**
* Lets Fix any intersects that are swapped around
*/
if ((bottomIntersect != null && topIntersect != null)
&& bottomIntersect.y < topIntersect.y) {
Vec2D topIntersectTemp = topIntersect.copy();
Vec2D topIntersectXTemp = topIntersectX.copy();
topIntersect = bottomIntersect;
topIntersectX = bottomIntersectX;
bottomIntersect = topIntersectTemp;
bottomIntersectX = topIntersectXTemp;
}
/**
* Are slats a set height?
*/
if (crossSliceSelection.getSlatHeight() != 0) {
bottomIntersect = topIntersect.add(0,
crossSliceSelection.getSlatHeight());
bottomIntersectX = topIntersectX.add(0,
crossSliceSelection.getSlatHeight());
}
if (SETTINGS.DEBUG) {
currentPlaneY.debugIntersectionPointsTop
.add(topIntersectX);
currentPlaneY.debugIntersectionPointsBottom
.add(bottomIntersectX);
}
//if we have found both intersects then add them to the outline
if (bottomIntersect != null && topIntersect != null) {
float len = bottomIntersect
.distanceTo(topIntersect);
if (!currentPlaneY.guide) {
if (crossSliceSelection.flipSide) {
Vec2D slotPos = bottomIntersectX.copy();
Vec2D dirPerp = new Vec2D(vecDir.x,
vecDir.y);
dirPerp.rotate((float) (Math.PI / 2));
SliceSlot slot = new SliceSlot(slicePlane,
slotPos, new Vec2D(
-vecDir.x,
-vecDir.y),
(len / 2f),
SETTINGS.materialThickness);
slot.setOnEdge(new Vec2D(0, -1));
if(crossSliceSelection.getCapType() != CrossSliceSelection.CAP_INSIDE)
slot.makesEdge = true;
currentPlaneY
.getSketch()
.getSlots()
.add(slot);
} else {
Vec2D slotPos = topIntersectX.copy();
Vec2D dirPerp = new Vec2D(vecDir.x,
vecDir.y);
dirPerp.rotate((float) (Math.PI / 2));
SliceSlot slot = new SliceSlot(slicePlane,
slotPos,
new Vec2D(vecDir.x,
vecDir.y),
(len / 2f),
SETTINGS.materialThickness);
slot.setOnEdge(new Vec2D(0, -1));
if(crossSliceSelection.getCapType() != CrossSliceSelection.CAP_INSIDE)
slot.makesEdge = true;
// Switch what side slots are added to
currentPlaneY
.getSketch()
.getSlots()
.add(slot);
}
}
Vec2D topSlotintersect = bottomIntersect.copy();
Vec2D bottomtopSlotintersect = topIntersect.copy();
if (!currentPlaneY.guide) {
if (!crossSliceSelection.flipSide) {
if (j != 0
&& j != planesToSlice.getList()
.size() - 1){
SliceSlot slot = new SliceSlot(
currentPlaneY,
topSlotintersect,
new Vec2D(-1, 0),
(len / 2f),
SETTINGS.materialThickness);
slot.setOnEdge(new Vec2D(0, -1));
if(crossSliceSelection.getCapType() != CrossSliceSelection.CAP_INSIDE)
slot.makesEdge = true;
slicePlane
.getSketch()
.getSlots()
.add(slot);
}
} else {
if (j != 0
&& j != planesToSlice.getList()
.size() - 1){
SliceSlot slot = new SliceSlot(
currentPlaneY,
bottomtopSlotintersect,
new Vec2D(1, 0),
((len / 2f)),
SETTINGS.materialThickness);
slot.setOnEdge(new Vec2D(0, -1));
if(crossSliceSelection.getCapType() != CrossSliceSelection.CAP_INSIDE)
slot.makesEdge = true;
slicePlane
.getSketch()
.getSlots()