File size: 5,539 Bytes
d2405f5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import gradio as gr
import subprocess
import os
import tempfile
import datetime
from huggingface_hub import upload_file

def convert_image_to_dxf(image_file, output_folder=None, use_lines=False):
    try:
        # Validate input image
        if image_file is None:
            return "No image provided", None, None
        
        # Define output folder, using a temp directory if none is specified
        if not output_folder:
            output_folder = tempfile.mkdtemp()
        else:
            os.makedirs(output_folder, exist_ok=True)
        
        # Generate the date-based output file name
        current_date = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
        image_path = image_file
        output_path = os.path.join(output_folder, f"{current_date}_output.dxf")
        debug_output_path = os.path.join(output_folder, f"{current_date}_debug.png")
        
        # Prepare the command arguments
        command_args = ["./SimpleImageToDxfHavePass"]
        
        # Add --use-lines if the checkbox is checked
        if use_lines:
            command_args.append("--use-lines")
        
        # Add other arguments
        command_args.extend([f"--imagePath={image_path}", f"--outputPath={output_path}", f"--debug-output={debug_output_path}"])
        
        # Execute conversion command
        result = subprocess.run(
            command_args,
            check=True,
            capture_output=True
        )
        
        # Log stdout for debugging
        print(result.stdout.decode('utf-8'))
        
        # Check if conversion was successful
        if not os.path.exists(output_path):
            return "Conversion failed: DXF file was not created.", None, None
        
        # Prepare folder structure for upload
        date_folder = f"{current_date}"
        
        # Hugging Face token
        hf_token = os.getenv("HF_TOKEN")
        if not hf_token:
            return "Hugging Face token not found", None, None
        
        # Upload input image, output DXF, and optionally debug image to Hugging Face in a date-based folder
        uploaded_files = []
        
        # Upload input image
        uploaded_input = upload_file(
            path_or_fileobj=image_path,
            path_in_repo=f"datasets/ArrcttacsrjksX/ImageToAutocadData/{date_folder}/{os.path.basename(image_path)}",
            repo_id="ArrcttacsrjksX/ImageToAutocadData",
            token=hf_token
        )
        uploaded_files.append(uploaded_input)

        # Upload DXF output
        uploaded_dxf = upload_file(
            path_or_fileobj=output_path,
            path_in_repo=f"datasets/ArrcttacsrjksX/ImageToAutocadData/{date_folder}/{os.path.basename(output_path)}",
            repo_id="ArrcttacsrjksX/ImageToAutocadData",
            token=hf_token
        )
        uploaded_files.append(uploaded_dxf)

        # If the checkbox is ticked, upload debug image
        if use_lines:
            uploaded_debug = upload_file(
                path_or_fileobj=debug_output_path,
                path_in_repo=f"datasets/ArrcttacsrjksX/ImageToAutocadData/{date_folder}/{os.path.basename(debug_output_path)}",
                repo_id="ArrcttacsrjksX/ImageToAutocadData",
                token=hf_token
            )
            uploaded_files.append(uploaded_debug)

        # Return files directly for download in Gradio interface
        return output_path, debug_output_path if use_lines else None, uploaded_files
    
    except subprocess.CalledProcessError as e:
        error_msg = f"Error converting image to DXF: {e.stderr.decode('utf-8') if e.stderr else e}"
        return error_msg, None, None

def main():
    with gr.Blocks() as demo:
        with gr.Tabs():
            # Tab for conversion
            with gr.TabItem("Image to DXF"):
                gr.Markdown("# SimpleImageToDxfHavePass")
                
                # Input row for image and optional output folder
                with gr.Row():
                    image_input = gr.Image(type="filepath", label="Input Image (PNG/JPG)")
                    output_folder = gr.Textbox(label="Output Folder (optional)", placeholder="Leave blank to use a temporary folder")
                
                # Checkbox to decide whether to use --use-lines
                use_lines_checkbox = gr.Checkbox(label="Use --use-lines for conversion", value=False)  # Default is False
                
                # Outputs: Debug image and DXF file download link
                with gr.Row():
                    debug_output = gr.Image(type="filepath", label="Debug Output Preview")
                    dxf_output = gr.File(label="DXF File Download")
                
                # Conversion button with event binding
                convert_btn = gr.Button("Convert to DXF")
                convert_btn.click(
                    convert_image_to_dxf, 
                    inputs=[image_input, output_folder, use_lines_checkbox], 
                    outputs=[dxf_output, debug_output, dxf_output]
                )
            
            # About tab
            with gr.TabItem("About"):
                gr.Markdown("This Gradio app allows users to convert an image to a DXF file using the SimpleImageToDxfHavePass command-line tool.")

    demo.launch(share=True)

if __name__ == "__main__":
    try:
        subprocess.run(['chmod', '+x', './SimpleImageToDxfHavePass'], check=True)
    except subprocess.CalledProcessError as e:
        print(f"Error setting permissions: {e}")
        exit(1)
    main()