import {
Component,
lazy,
Suspense,
useEffect,
useState,
type ErrorInfo,
type ReactNode,
} from 'react'
const ManufacturingPanel = lazy(() =>
import('./HicadManufacturingPanel').then((module) => ({
default: module.HicadManufacturingPanel,
}))
)
class ManufacturingBoundary extends Component<
{
children: ReactNode
onClose: () => void
},
{ failed: boolean }
> {
state = { failed: false }
static getDerivedStateFromError() {
return { failed: true }
}
componentDidCatch(error: unknown, info: ErrorInfo) {
console.error('[HiCAD Manufacturing] Extension failed safely', error, info)
}
render() {
if (!this.state.failed) return this.props.children
return (
工程工具暂时无法打开
HiCAD 主编辑器没有受到影响。关闭后可以继续建模并稍后重试。
)
}
}
export function HicadManufacturingLauncher({
projectName,
}: {
projectName: string
}) {
const [active, setActive] = useState(false)
const [triggerPosition, setTriggerPosition] = useState({
left: 16,
bottom: 48,
})
useEffect(() => {
const updateTriggerPosition = () => {
const canvas = [...document.querySelectorAll('canvas')]
.map((element) => ({
element,
rect: element.getBoundingClientRect(),
}))
.filter(({ rect }) => rect.width > 280 && rect.height > 220)
.sort(
(left, right) =>
right.rect.width * right.rect.height -
left.rect.width * left.rect.height
)[0]
if (!canvas) return
setTriggerPosition({
left: Math.round(canvas.rect.left + 16),
bottom: Math.round(
Math.max(window.innerHeight - canvas.rect.bottom + 16, 48)
),
})
}
const observer = new ResizeObserver(updateTriggerPosition)
const observeCanvases = () =>
document.querySelectorAll('canvas').forEach((canvas) => observer.observe(canvas))
const mutationObserver = new MutationObserver(() => {
observeCanvases()
updateTriggerPosition()
})
observeCanvases()
mutationObserver.observe(document.body, { childList: true, subtree: true })
window.addEventListener('resize', updateTriggerPosition)
updateTriggerPosition()
return () => {
observer.disconnect()
mutationObserver.disconnect()
window.removeEventListener('resize', updateTriggerPosition)
}
}, [])
return (
<>
{active && (
setActive(false)}>
正在加载工程工具…
}
>
setActive(false)}
projectName={projectName}
/>
)}
>
)
}