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} />
)} ) }