Spaces:
Running
Running
ArrcttacsrjksX
commited on
Update app.py
Browse files
app.py
CHANGED
@@ -169,7 +169,6 @@ class ImageToDxfConverter:
|
|
169 |
logger.error(f"Conversion failed: {str(e)}")
|
170 |
return None, None, []
|
171 |
|
172 |
-
# ... (các phần import và class ImageToDxfConverter giữ nguyên) ...
|
173 |
|
174 |
def create_gradio_interface():
|
175 |
"""Create and configure the Gradio interface."""
|
@@ -188,8 +187,6 @@ def create_gradio_interface():
|
|
188 |
with gr.Row():
|
189 |
with gr.Column(scale=2):
|
190 |
image_input = gr.Image(
|
191 |
-
source="upload", # Thêm source parameter
|
192 |
-
tool="select", # Chỉ cho phép select
|
193 |
type="filepath",
|
194 |
label="Input Image",
|
195 |
elem_id="image_input",
|
@@ -224,48 +221,38 @@ def create_gradio_interface():
|
|
224 |
# Cập nhật JavaScript để xử lý paste
|
225 |
demo.load(js="""
|
226 |
function initPasteHandler() {
|
227 |
-
// Lắng nghe sự kiện paste trên toàn document
|
228 |
document.addEventListener('paste', function(e) {
|
229 |
-
// Ngăn hành vi paste mặc định
|
230 |
e.preventDefault();
|
231 |
|
232 |
-
// Lấy dữ liệu từ clipboard
|
233 |
const items = e.clipboardData.items;
|
234 |
|
235 |
for (let i = 0; i < items.length; i++) {
|
236 |
const item = items[i];
|
237 |
|
238 |
-
// Kiểm tra nếu là ảnh
|
239 |
if (item.type.indexOf('image') !== -1) {
|
240 |
const file = item.getAsFile();
|
241 |
const reader = new FileReader();
|
242 |
|
243 |
reader.onload = function(event) {
|
244 |
-
// Tạo một đối tượng File từ dữ liệu base64
|
245 |
fetch(event.target.result)
|
246 |
.then(res => res.blob())
|
247 |
.then(blob => {
|
248 |
const file = new File([blob], "pasted_image.png", { type: "image/png" });
|
249 |
|
250 |
-
// Tạo một sự kiện drag and drop giả
|
251 |
const dt = new DataTransfer();
|
252 |
dt.items.add(file);
|
253 |
|
254 |
-
// Tìm input file trong Gradio interface
|
255 |
const fileInput = document.querySelector('#image_input input[type="file"]');
|
256 |
if (fileInput) {
|
257 |
-
// Cập nhật files của input
|
258 |
fileInput.files = dt.files;
|
259 |
|
260 |
-
|
261 |
-
const event = new Event('change', { bubbles: true });
|
262 |
fileInput.dispatchEvent(event);
|
263 |
|
264 |
-
// Auto click nút convert sau khi paste
|
265 |
setTimeout(() => {
|
266 |
const convertBtn = document.querySelector('#convert_btn');
|
267 |
if (convertBtn) convertBtn.click();
|
268 |
-
},
|
269 |
}
|
270 |
});
|
271 |
};
|
@@ -277,12 +264,14 @@ def create_gradio_interface():
|
|
277 |
});
|
278 |
}
|
279 |
|
280 |
-
// Đảm bảo DOM đã load xong
|
281 |
if (document.readyState === 'complete') {
|
282 |
initPasteHandler();
|
283 |
} else {
|
284 |
window.addEventListener('load', initPasteHandler);
|
285 |
}
|
|
|
|
|
|
|
286 |
""")
|
287 |
|
288 |
# Event handlers
|
@@ -290,7 +279,6 @@ def create_gradio_interface():
|
|
290 |
fn=converter.convert_image,
|
291 |
inputs=[image_input, use_lines_checkbox],
|
292 |
outputs=[dxf_output, debug_output],
|
293 |
-
api_name=False # Disable API endpoint for this event
|
294 |
)
|
295 |
|
296 |
return demo
|
|
|
169 |
logger.error(f"Conversion failed: {str(e)}")
|
170 |
return None, None, []
|
171 |
|
|
|
172 |
|
173 |
def create_gradio_interface():
|
174 |
"""Create and configure the Gradio interface."""
|
|
|
187 |
with gr.Row():
|
188 |
with gr.Column(scale=2):
|
189 |
image_input = gr.Image(
|
|
|
|
|
190 |
type="filepath",
|
191 |
label="Input Image",
|
192 |
elem_id="image_input",
|
|
|
221 |
# Cập nhật JavaScript để xử lý paste
|
222 |
demo.load(js="""
|
223 |
function initPasteHandler() {
|
|
|
224 |
document.addEventListener('paste', function(e) {
|
|
|
225 |
e.preventDefault();
|
226 |
|
|
|
227 |
const items = e.clipboardData.items;
|
228 |
|
229 |
for (let i = 0; i < items.length; i++) {
|
230 |
const item = items[i];
|
231 |
|
|
|
232 |
if (item.type.indexOf('image') !== -1) {
|
233 |
const file = item.getAsFile();
|
234 |
const reader = new FileReader();
|
235 |
|
236 |
reader.onload = function(event) {
|
|
|
237 |
fetch(event.target.result)
|
238 |
.then(res => res.blob())
|
239 |
.then(blob => {
|
240 |
const file = new File([blob], "pasted_image.png", { type: "image/png" });
|
241 |
|
|
|
242 |
const dt = new DataTransfer();
|
243 |
dt.items.add(file);
|
244 |
|
|
|
245 |
const fileInput = document.querySelector('#image_input input[type="file"]');
|
246 |
if (fileInput) {
|
|
|
247 |
fileInput.files = dt.files;
|
248 |
|
249 |
+
const event = new Event('change', { 'bubbles': true });
|
|
|
250 |
fileInput.dispatchEvent(event);
|
251 |
|
|
|
252 |
setTimeout(() => {
|
253 |
const convertBtn = document.querySelector('#convert_btn');
|
254 |
if (convertBtn) convertBtn.click();
|
255 |
+
}, 500); // Tăng timeout lên 500ms
|
256 |
}
|
257 |
});
|
258 |
};
|
|
|
264 |
});
|
265 |
}
|
266 |
|
|
|
267 |
if (document.readyState === 'complete') {
|
268 |
initPasteHandler();
|
269 |
} else {
|
270 |
window.addEventListener('load', initPasteHandler);
|
271 |
}
|
272 |
+
|
273 |
+
// Thêm handler để debug
|
274 |
+
console.log('Paste handler initialized');
|
275 |
""")
|
276 |
|
277 |
# Event handlers
|
|
|
279 |
fn=converter.convert_image,
|
280 |
inputs=[image_input, use_lines_checkbox],
|
281 |
outputs=[dxf_output, debug_output],
|
|
|
282 |
)
|
283 |
|
284 |
return demo
|