明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 650|回复: 6

[源码] 求助大神。能不能帮忙改为批量修改圆直径

[复制链接]
发表于 2023-11-13 19:31 | 显示全部楼层 |阅读模式
求助大神。能不能帮忙修改修改为不开图遍历文件夹下所有的dxf文件,批量将图纸中包含直径36圆修改为直径38.5,最好可以修改包含所有的子目录下的文件。求指点,谢了
  1. (defun c:yx (/ f file tmp)
  2.   (setq  f (getfiled "选择文件夹并任意选取一个文件,请先剔除无需处理文件"
  3.              "C:\\Temp\\1\"
  4.              "dxf"
  5.              0
  6.            )
  7.     f (vl-filename-directory f)
  8.     f (mapcar '(lambda (x) (strcat f "\" x))
  9.         (vl-directory-files f "*.dxf" 1)
  10.       )
  11.   )
  12.   (setq tmp (open (setq file (strcat (getenv "TEMP") "\\tmp.scr")) "w"))
  13.   (foreach n f
  14.     (write-line (strcat "_.open " n "") tmp)
  15.     (write-line
  16.       "(setq ss (ssget "x" '((0 . "CIRCLE") )))
  17. (repeat  (setq n (sslength ss))
  18. (setq  en (ssname ss (setq n (1- n))))
  19. (setq centerpt(Cdr(Assoc 10 (Entget en))))
  20. (entmake (list '(0 . "LINE") (cons 10 (polar centerpt pi 5 )) (cons 11 (polar centerpt 0 5 ))))
  21. (entmake (list '(0 . "LINE") (cons 10 (polar centerpt  ( * 0.5 pi) 5 )) (cons 11 (polar centerpt  ( * -0.5 pi) 5 )))))"
  22.       tmp
  23.     )
  24.     (write-line (strcat "_.qsave dxf 16 " n " y _.close") tmp)
  25.   )
  26.   (close tmp)
  27.   (command ".script" file)
  28.   (vl-file-delete file)
  29.   (princ)
  30. )



发表于 2023-11-13 20:20 | 显示全部楼层
autolisp的方法是实现不了这个的 autolisp的函数都只能在当前文档中使用
用vlisp可以指定文档实现不同文档的修改
并且也只能实现自动打开-修改-关闭
不能真正的不开图修改
http://bbs.mjtd.com/thread-187579-1-1.html
参考此代码 把中间修改图元的代码改成你的修改圆直径就可以了
 楼主| 发表于 2023-11-13 20:41 | 显示全部楼层
freedom_ice 发表于 2023-11-13 20:20
autolisp的方法是实现不了这个的 autolisp的函数都只能在当前文档中使用
用vlisp可以指定文档实现不同文档 ...

好的,谢谢,可不可以帮我修改一下呢?
发表于 2023-11-13 21:45 | 显示全部楼层


可參考看看
[源码] 【 *** 不開圖修改另一圖檔, 將圖內所有圓改為圓心加十字標示線 ***】
http://bbs.mjtd.com/thread-185631-1-1.html
 楼主| 发表于 2023-11-13 21:52 | 显示全部楼层
lee50310 发表于 2023-11-13 21:45
可參考看看
[源码] 【 *** 不開圖修改另一圖檔, 將圖內所有圓改為圓心加十字標示線 ***】
http://bbs ...

我要修改圆直径。
发表于 2023-11-13 22:05 | 显示全部楼层
本帖最后由 lee50310 于 2023-11-14 09:06 编辑
wutao8282 发表于 2023-11-13 21:52
我要修改圆直径。

那是我以前發表的程式
差異不大你可先參考修改看看
 楼主| 发表于 2023-12-13 09:11 | 显示全部楼层
我用Python+ezdxf库实现了,代码贴出来供参考
  1. import os
  2. import ezdxf
  3. import tkinter as tk
  4. from tkinter import filedialog, messagebox

  5. def modify_dxf_files(directory, listbox, original_diameter, modified_diameter):
  6.     for root, dirs, files in os.walk(directory):
  7.         for file in files:
  8.             if file.endswith(".dxf"):
  9.                 file_path = os.path.join(root, file)
  10.                 if contains_diameter_circle(file_path, original_diameter):
  11.                     modify_dxf_file(file_path, original_diameter, modified_diameter)
  12.                     listbox.insert(tk.END, file_path)

  13. def contains_diameter_circle(file_path, diameter):
  14.     doc = ezdxf.readfile(file_path)
  15.     msp = doc.modelspace()

  16.     for circle in msp.query('CIRCLE'):
  17.         if round(circle.dxf.radius * 2, 2) == round(diameter, 2):
  18.             return True

  19.     return False

  20. def modify_dxf_file(file_path, original_diameter, modified_diameter):
  21.     doc = ezdxf.readfile(file_path)
  22.     msp = doc.modelspace()

  23.     for circle in msp.query('CIRCLE'):
  24.         if round(circle.dxf.radius * 2, 2) == round(original_diameter, 2):
  25.             circle.dxf.radius = modified_diameter / 2.0

  26.     doc.saveas(file_path)

  27. def browse_directory(entry):
  28.     directory = filedialog.askdirectory()
  29.     entry.delete(0, tk.END)
  30.     entry.insert(0, directory)

  31. def modify_button_click(entry, listbox, original_entry, modified_entry):
  32.     directory = entry.get()
  33.     original_diameter = float(original_entry.get())
  34.     modified_diameter = float(modified_entry.get())
  35.    
  36.     if directory:
  37.         if original_diameter >= 0 and modified_diameter >= 0:
  38.             modify_dxf_files(directory, listbox, original_diameter, modified_diameter)
  39.             if listbox.size() == 0:
  40.                 messagebox.showinfo("完成", "未找到包含指定直径的圆的文件!")
  41.             else:
  42.                 messagebox.showinfo("完成", "修改完成!")
  43.         else:
  44.             messagebox.showwarning("错误", "直径必须为非负数!")
  45.     else:
  46.         messagebox.showwarning("错误", "请选择路径!")

  47. # 创建窗体
  48. window = tk.Tk()
  49. window.title("DXF文件修改工具")

  50. # 创建路径相关组件
  51. path_frame = tk.Frame(window)
  52. path_frame.grid(row=0, column=0, columnspan=3, pady=20, sticky="w")

  53. path_label = tk.Label(path_frame, text="路径:")
  54. path_label.grid(row=0, column=0, padx=10)

  55. path_entry = tk.Entry(path_frame, width=39)
  56. path_entry.grid(row=0, column=1, padx=10)

  57. browse_button = tk.Button(path_frame, text="浏览", command=lambda: browse_directory(path_entry))
  58. browse_button.grid(row=0, column=2, padx=10)

  59. # 创建直径相关组件和"修改"按钮
  60. diameter_modify_frame = tk.Frame(window)
  61. diameter_modify_frame.grid(row=1, column=0, columnspan=3, pady=10, sticky="w")

  62. original_label = tk.Label(diameter_modify_frame, text="直径:")
  63. original_label.grid(row=0, column=0, padx=10)

  64. original_entry = tk.Entry(diameter_modify_frame, width=13)
  65. original_entry.grid(row=0, column=1, padx=10)

  66. modified_label = tk.Label(diameter_modify_frame, text="改直径:")
  67. modified_label.grid(row=0, column=2, padx=10)

  68. modified_default_value = "38.5"  # 默认值
  69. modified_entry = tk.Entry(diameter_modify_frame, width=13)
  70. modified_entry.insert(0, modified_default_value)
  71. modified_entry.grid(row=0, column=3, padx=10)

  72. modify_button = tk.Button(diameter_modify_frame, text="修改", command=lambda: modify_button_click(path_entry, listbox, original_entry, modified_entry))
  73. modify_button.grid(row=0, column=4, padx=10)

  74. # 创建修改列表相关组件
  75. listbox_frame = tk.Frame(window)
  76. listbox_frame.grid(row=2, column=0, columnspan=3, pady=10, sticky="w")

  77. modify_list_label = tk.Label(listbox_frame, text="列表:")
  78. modify_list_label.grid(row=0, column=0, padx=10)

  79. listbox = tk.Listbox(listbox_frame, width=50, height=10)
  80. listbox.grid(row=0, column=1, padx=10)

  81. # 启动窗体
  82. window.mainloop()
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-7-3 09:05 , Processed in 0.160246 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表