KittyCAD / modeling-app

The KittyCAD modeling app.
https://kittycad.io/modeling-app/download
MIT License
368 stars 30 forks source link

[BUG]: Fillet fails after a shell is used #3257

Closed r-barton closed 1 month ago

r-barton commented 1 month ago

Describe the bug

The shell command appears to be causing the upstream fillet command to fail

Steps to Reproduce

The below code causes the fillet to fail with "no such edge or face exists". Commenting out the shell command at the end, the fillets are correct

const rpizWidth = 30
const rpizLength = 65

const caseThickness = 1

const border = 4

const screwHeight = 4

const caseWidth = rpizWidth + border * 2
const caseLength = rpizLength + border * 2
const caseHeight = 8

const widthBetweenScrews = 23
const lengthBetweenScrews = 29 * 2

const miniHdmiDistance = 12.4
const microUsb1Distance = 41.4
const microUsb2Distance = 54

const miniHdmiWidth = 11.2
const microUsbWidth = 7.4
const connectorPadding = 4

const miniHdmiHole = startSketchAt([
       0,
       border + miniHdmiDistance - (miniHdmiWidth / 2)
     ])
  |> lineTo([
       0,
       border + miniHdmiDistance + miniHdmiWidth / 2
     ], %)
  |> lineTo([
       1,
       border + miniHdmiDistance + miniHdmiWidth / 2
     ], %)
  |> lineTo([
       1,
       border + miniHdmiDistance - (miniHdmiWidth / 2)
     ], %)
  |> close(%)

const case = startSketchOn('XY')
  |> startProfileAt([0, 0], %)
  |> lineTo([caseWidth, 0], %, $edge1)
  |> lineTo([caseWidth, caseLength], %, $edge2)
  |> lineTo([0, caseLength], %, $edge3)
  |> close(%, $edge4)
  |> extrude(caseHeight, %)
  |> fillet({
    radius: 1,
    tags: [
    getNextAdjacentEdge(edge1),
    getNextAdjacentEdge(edge2),
    getNextAdjacentEdge(edge3),
    getNextAdjacentEdge(edge4)
    ],
  }, %)

fn m25Screw = (x, y, height) => {
  const screw = startSketchOn("XY")
    |> startProfileAt([0, 0], %)
    |> circle([x, y], 2.5, %)
    |> hole(circle([x, y], 1.25, %), %)
    |> extrude(height, %)
  return screw
}

m25Screw(border + rpizWidth / 2 - (widthBetweenScrews / 2), 0 + border + rpizLength / 2 - (lengthBetweenScrews / 2), screwHeight)

m25Screw(border + rpizWidth / 2 - (widthBetweenScrews / 2), 0 + border + rpizLength / 2 + lengthBetweenScrews / 2, screwHeight)

m25Screw(border + rpizWidth / 2 + widthBetweenScrews / 2, 0 + border + rpizLength / 2 + lengthBetweenScrews / 2, screwHeight)

m25Screw(border + rpizWidth / 2 + widthBetweenScrews / 2, 0 + border + rpizLength / 2 - (lengthBetweenScrews / 2), screwHeight)

shell({
  faces: ['end'],
  thickness: caseThickness
}, case)

Expected Behavior

Fillets should work after the shell command has been applied

Screenshots and Recordings

No response

Desktop OS

Win10, MacOS

Browser

No response

Version

v0.24.7

Additional Context

No response

jessfraz commented 1 month ago

Probably an order of operations issue within kcl we have lots of edge cases for fillets and I bet we need to execute right before the shell

I can take a crack at this tomorrow

jessfraz commented 1 month ago

I have the fillets executing before the shell operation now (https://github.com/KittyCAD/modeling-app/pull/3261) but now it will fail with "Shell of non-planar solid3d not available yet" which we know @benjamaan476 is working on

jessfraz commented 1 month ago

this is fixed now in engine!