|
@@ -130,6 +130,12 @@ const getFuseUrl = (caseId: number) =>
|
|
|
`${getHref(SceneTypeDomain[SceneType.SWMX]!, SceneTypePaths[SceneType.SWMX][0], { caseId: caseId.toString() })}&share=1#show/summary`
|
|
|
|
|
|
|
|
|
+enum ImageType {
|
|
|
+ FUSE,
|
|
|
+ KANKAN,
|
|
|
+ LASER
|
|
|
+}
|
|
|
+type FuseImageRet = { type: ImageType, blob: Blob | null }
|
|
|
const getFuseImage = async (iframe: HTMLIFrameElement) => {
|
|
|
const iframeElement = iframe.contentWindow?.document.documentElement
|
|
|
if (!iframeElement) {
|
|
@@ -141,22 +147,22 @@ const getFuseImage = async (iframe: HTMLIFrameElement) => {
|
|
|
const fuseCnavas = targetWindow.document.querySelector('.scene-canvas > canvas') as HTMLElement
|
|
|
|
|
|
if (fuseCnavas) {
|
|
|
- return domScreenshot(fuseCnavas)
|
|
|
+ return domScreenshot(fuseCnavas).then(blob => ({ type: ImageType.FUSE, blob }))
|
|
|
}
|
|
|
const isLaser = targetWindow.document.querySelector('.laser-layer')
|
|
|
|
|
|
if (isLaser) {
|
|
|
const sdk = await targetWindow.__sdk
|
|
|
- return new Promise<Blob | null>(resolve => {
|
|
|
+ return new Promise<FuseImageRet>(resolve => {
|
|
|
sdk.scene.screenshot(900, 900).done((data: string) => {
|
|
|
- resolve(base64ToBlob(data))
|
|
|
+ resolve({ type: ImageType.FUSE, blob: base64ToBlob(data) })
|
|
|
})
|
|
|
})
|
|
|
} else {
|
|
|
const sdk = targetWindow.__sdk
|
|
|
- return new Promise<Blob | null>(resolve => {
|
|
|
+ return new Promise<FuseImageRet>(resolve => {
|
|
|
sdk.Camera.screenshot([ {width: 2048, height: 1024, name: '2k' }],false).then((result: any)=>{
|
|
|
- resolve(base64ToBlob(result[0].data))
|
|
|
+ resolve({ type: ImageType.KANKAN, blob: base64ToBlob(result[0].data) })
|
|
|
})
|
|
|
})
|
|
|
}
|
|
@@ -168,10 +174,11 @@ export const SelectFuse = (props: SelectImageProps & { caseId: number }) => {
|
|
|
const [blob, setBlob] = useState<Blob | null>(null)
|
|
|
const [tags, setTags] = useState<Tagging[]>([])
|
|
|
const [selectTags, setSelectTags] = useState<string[]>([])
|
|
|
- const [addTags, setAddTags] = useState<string[]>([])
|
|
|
+ const [addTagIds, setAddTagIds] = useState<string[]>([])
|
|
|
const iframeRef = useRef<HTMLIFrameElement>(null)
|
|
|
const coverUrl = useMemo(() => blob && URL.createObjectURL(blob), [blob])
|
|
|
const url = useMemo(() => getFuseUrl(props.caseId), [props.caseId])
|
|
|
+ const addTags = useMemo(() => addTagIds.map(id => tags.find(tag => tag.tagId.toString() === id)!), [addTagIds, tags])
|
|
|
const mockData = useMemo(() => tags.map(tag => ({
|
|
|
data: tag,
|
|
|
key: tag.tagId.toString()
|
|
@@ -183,11 +190,60 @@ export const SelectFuse = (props: SelectImageProps & { caseId: number }) => {
|
|
|
}, [props.caseId])
|
|
|
|
|
|
const onSubmit = async () => {
|
|
|
- props.onSave(blob, tags.filter(tag => addTags.includes(tag.tagId.toString())))
|
|
|
+ const filterTags = tags.filter(tag => addTagIds.includes(tag.tagId.toString()))
|
|
|
+ props.onSave(blob, filterTags)
|
|
|
+ setOpen(false)
|
|
|
}
|
|
|
const getCover = async () => {
|
|
|
if (iframeRef.current) {
|
|
|
- const blob = await getFuseImage(iframeRef.current)
|
|
|
+ const fuseImage = await getFuseImage(iframeRef.current)
|
|
|
+ if (!fuseImage?.blob) {
|
|
|
+ return;
|
|
|
+ } else if (fuseImage.type !== ImageType.FUSE || !addTags.length) {
|
|
|
+ setBlob(fuseImage.blob)
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const img = new Image()
|
|
|
+ img.src = URL.createObjectURL(fuseImage.blob)
|
|
|
+ await new Promise(resolve => img.onload = resolve)
|
|
|
+
|
|
|
+ const $canvas = document.createElement('canvas')
|
|
|
+ $canvas.width = img.width
|
|
|
+ $canvas.height = img.height
|
|
|
+
|
|
|
+ const ctx = $canvas.getContext('2d')!
|
|
|
+ ctx.drawImage(img, 0, 0, img.width, img.height)
|
|
|
+
|
|
|
+ const contentDoc = iframeRef.current.contentWindow!.document
|
|
|
+ const hotItems = Array.from(contentDoc.querySelectorAll('.hot-item')) as HTMLDivElement[]
|
|
|
+ hotItems.forEach(hot => {
|
|
|
+ const hotTitle = (hot.querySelector('.tip') as HTMLDivElement).innerText
|
|
|
+ const index = addTags.findIndex(tag => tag.tagTitle === hotTitle)
|
|
|
+ if (index !== -1) {
|
|
|
+ const bound = hot.getBoundingClientRect()
|
|
|
+ const size = 32
|
|
|
+ const left = bound.left + size / 2
|
|
|
+ const top = bound.top + size / 2
|
|
|
+ ctx.save()
|
|
|
+ ctx.translate(left, top)
|
|
|
+ ctx.beginPath()
|
|
|
+ ctx.arc(0, 0, size / 2, 0, 2 * Math.PI)
|
|
|
+ ctx.strokeStyle = '#000'
|
|
|
+ ctx.fillStyle = '#fff'
|
|
|
+ ctx.stroke()
|
|
|
+ ctx.fill()
|
|
|
+ ctx.beginPath()
|
|
|
+ ctx.fillStyle = '#000'
|
|
|
+ ctx.textAlign = 'center'
|
|
|
+ ctx.textBaseline = 'middle'
|
|
|
+ ctx.font = `normal ${size / 2}px serif`
|
|
|
+ ctx.fillText((index + 1).toString(), 0, 0)
|
|
|
+ ctx.restore()
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ const blob = await new Promise<Blob | null>(resolve => $canvas.toBlob(resolve, 'png'))
|
|
|
setBlob(blob)
|
|
|
}
|
|
|
}
|
|
@@ -214,9 +270,9 @@ export const SelectFuse = (props: SelectImageProps & { caseId: number }) => {
|
|
|
<Transfer
|
|
|
dataSource={mockData}
|
|
|
titles={['所有', '需要']}
|
|
|
- targetKeys={addTags}
|
|
|
+ targetKeys={addTagIds}
|
|
|
selectedKeys={selectTags}
|
|
|
- onChange={setAddTags}
|
|
|
+ onChange={setAddTagIds}
|
|
|
onSelectChange={(sKeys, tKeys) => setSelectTags([...sKeys, ...tKeys])}
|
|
|
render={(item) => item.data.tagTitle}
|
|
|
/>
|