개발자
smiles code 를 가지고 canvas 에 분자 그림을 그리고 그려진 분자 그림을 엑셀 행 안에 이미지로 나타내고 싶은데 현재 다른 smiles code 인데 불구하고 똑같은 이미지가 출력되는 상황입니다. Map 을 돌면서 해당 smiles code 에 대한 이미지 출력하는 방법을 알고싶습니다
1import React, { useState, useRef, useEffect } from "react";
2import classNames from "classnames/bind";
3import styles from "@/components/button/downloadButton/DownloadButton.module.css";
4import SmilesDrawer from "smiles-drawer";
5import { useInferenceStore } from "@/components/contexts/InferenceStore";
6
7import * as ExcelJS from "exceljs";
8import { toCanvas, toPng } from "html-to-image";
9import * as XLSX from "xlsx";
10import * as FileSaver from "file-saver";
11import { IInference } from "@/types/InferenceTypes";
12import html2canvas from "html2canvas";
13const cx = classNames.bind(styles);
14
15/**
16 * Report Download 버튼
17 * @author hblee
18 */
19
20const DownloadButton = () => {
21 const { cardInfo } = useInferenceStore();
22 const [isDownloaded, setDownloaded] = useState<boolean>(false);
23 const canvasRef = useRef<HTMLCanvasElement>(null);
24 const [layer, setLayer] = useState<any[]>([]);
25
26 const onCapture = () => {
27 html2canvas(document.getElementById("canvas")!).then((canvas) => {
28 onSaveAs(canvas.toDataURL("image/png"), "test.png");
29 });
30 };
31
32 const onSaveAs = (uri: string, filename: string) => {
33 setLayer([...layer, uri]);
34 };
35
36 //dataurl 구하기
37 const repeatDraw = async (smiles: string) => {
38 console.log("smiles : ", smiles);
39 // const canvas = canvasRef.current;
40 let drawer = new SmilesDrawer.Drawer({
41 width: 120,
42 height: 120,
43 compactDrawing: false,
44 });
45
46 SmilesDrawer.parse(smiles, function (tree: any) {
47 drawer.draw(tree, canvasRef.current, "light", false);
48 });
49
50 console.log(drawer);
51 // onCapture();
52 };
53
54 const workbook = new ExcelJS.Workbook();
55 //sheet 이름 test
56 const worksheet = workbook.addWorksheet("test");
57 const excelDownload = async (data: IInference | undefined) => {
58 // sheet 데이터 설정
59 //worksheet.getCell("A1").value = "target smiles";
60 //worksheet.getCell("A2").value = `${cardInfo?.target_smiles}`;
61 // /[`#`, `initial_mol`, `\t`, `reactant1`, `reaction`, `product1`],
62 data?.inference.splice(2, 1).map((data, idx) => {
63 console.log("data : ", data);
64 repeatDraw(String(data.rxn.layer1.A));
65 });
66
67 workbook.xlsx.writeBuffer().then(function (data) {
68 var blob = new Blob([data], {
69 type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
70 });
71 FileSaver.saveAs(blob, "testExcel.xlsx");
72 });
73 };
74
75 const onClickHandler = () => {
76 excelDownload(cardInfo);
77 };
78 // cardInfo에서 target_smiles, A,I,T 필요!
79 // cardInfo에서 얻은 A,I 값으로 분자 그리기
80 useEffect(() => {
81 if (isDownloaded) {
82 onClickHandler();
83 }
84 }, [isDownloaded]);
85
86 return (
87 <>
88 {isDownloaded && (
89 <canvas id="canvas" ref={canvasRef} width={"100%"} height={"100%"} />
90 )}
91 <div className={cx("fixed-btns")}>
92 <button
93 className={cx(isDownloaded && "loading")}
94 onClick={() => setDownloaded(true)}
95 disabled={isDownloaded}
96 >
97 Report Download
98 </button>
99 </div>
100 </>
101 );
102};
103
104export default DownloadButton;
답변 1
안녕하세요! 해결하셨는지 모르겠지만 아마도 repeatDraw 함수 내에서 canvasRef.current를 사용중이어서 그런 것 같습니다. canvasRef.current를 넘기게 되면 같은 canvas 요소를 넘겨주고 있기 때문에 제일 마지막에 그려지는 그림만 canvas에 남게 될 것 같습니다. repeatDraw 안에서 개별 이미지에 대한 처리를 넣어줘야할 것 같습니다. 직접 테스트해보지는 않아서 아닐수도 있는 점 양해 부탁드립니다 :)
익명
작성자
2023년 08월 09일
안녕하세요!! 다른방식으로 해결했지만, 알려주신대로 해결할 수 있을것같네요😄 감사합니다☺️☺️
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!