明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 9882|回复: 41

[基础] 原创,圆孔生成镙丝孔

    [复制链接]
发表于 2013-4-14 04:08 | 显示全部楼层 |阅读模式
本帖最后由 邹锋 于 2013-4-14 04:10 编辑

好久没来,最近闲着无事,练练手,整个LISP ,比较适合做机械朋友使用
由于我们UG转出来的图档里没有标明哪些孔是镙丝孔,哪些是顶针孔,所以需要朋友们去一个个注明, 一套模具有几十个几百个,也挺累的,于是,我就有这个想法了,


  1. (defun c:sww()
  2.   ;----系统变量备份----
  3.   (setvar "cmdecho" 0);_关闭命令提示
  4.   (command "undo" "be")
  5.   (setq osmode_bak (getvar "osmode"));_记录捕捉
  6.   (setvar "osmode" 0);_关闭捕捉
  7.   (setq clayer_bak (getvar "clayer"));_记录当前图层
  8.   (setq cecolor_bak (getvar "cecolor"));_记录当前颜色
  9.   (setq celtype_bak (getvar "celtype"));_记录当前线型
  10.   (setq textstyle_bak (getvar "textstyle"));_记录当前文字样式
  11.   (setq chksty (tblsearch "style" "TXT"))
  12.   (if (= chksty nil)
  13.     (entmake (list '(0 . "STYLE") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbTextStyleTableRecord") (cons 2 "TXT")
  14.        '(70 . 0) (cons 40 1) (cons 41 1) '(3 . "txt.shx") '(4 . "gbcbig.shx")
  15.     )
  16.   )
  17.     )
  18.   (setq chklty (tblsearch "LTYPE" "CENTER"))
  19.   (if (= chklty nil)
  20.     (entmake (list '(0 . "LTYPE") '(100 . "AcDbSymbolTableRecord")  '(100 . "AcDbLinetypeTableRecord")
  21.        (cons 2 "CENTER")  '(3 . "Center ____ _ ____ _ ____ _ ____ _ ____ _ ____")
  22.        '(70 . 0)  '(73 . 2) '(40 . 15.0) '(49 . 10.0)  '(74 . 0) '(49 . -5.0) '(74 . 0)
  23.        )
  24.        )
  25.     )
  26.   (setq ss (ssget '((0 . "CIRCLE")))
  27.        i  0)
  28.   (repeat (sslength ss)
  29.    (setq ename (ssname ss i)
  30.          dat (entget ename)
  31.          pt (usdxf 10 dat)
  32.          r (dxf 40 dat)
  33.    cel (dxf 6 dat)
  34.    D (* R 2)
  35.    )
  36.     (if (or (= cel "DASHED") (= cel "HIDDEN"))
  37.       (setq cel "HIDDEN")
  38.       (setq cel "Continuous")
  39.       )
  40.     (cond ((= d  2.5)
  41.      (setq text "M3")
  42.      (setq xk 0.06)
  43.      (setq mr 1.5)
  44.      (makent)
  45.      )
  46.     ((= d 3.3)
  47.      (setq text "M4")
  48.      (setq xk 0.08)
  49.      (setq mr 2)
  50.      (makent)
  51.     )
  52.     ((= d 4.2)
  53.      (setq text "M5")
  54.      (setq xk 0.1)
  55.      (setq mr 2.5)
  56.      (makent)
  57.      )
  58.     ((= d 5)
  59.      (setq text "M6")
  60.      (setq xk 0.12)
  61.      (setq mr 3)
  62.      (makent)
  63.      )
  64.     ((= d 6.8)
  65.      (setq text "M8")
  66.      (setq xk 0.16)
  67.      (setq mr 4)
  68.      (makent)
  69.      )
  70.     ((= d 8.5)
  71.      (setq text "M10")
  72.      (setq xk 0.2)
  73.      (setq mr 5)
  74.      (makent)
  75.      )
  76.     ((= d 10.5)
  77.      (setq text "M12")
  78.      (setq xk 0.24)
  79.      (setq mr 6)
  80.      (makent)
  81.      )
  82.     ((= d 12)
  83.      (setq text "M14")
  84.      (setq xk 0.28)
  85.      (setq mr 7)
  86.      (makent)
  87.      )
  88.     ((= d 14)
  89.      (setq text "M16")
  90.      (setq xk 0.32)
  91.      (setq mr 8)
  92.      (makent)
  93.      )
  94.     ((= d 15.5)
  95.      (setq text "M18")
  96.      (setq xk 0.36)
  97.      (setq mr 9)
  98.      (makent)
  99.      )
  100.     ((= d 17.5)
  101.      (setq text "M20")
  102.      (setq xk 0.4)
  103.      (setq mr 10)
  104.      (makent)
  105.      )
  106.     )
  107.     (setq i (1+ i))
  108.    )
  109.   ;----系统变量还原----
  110.   (setvar "osmode" osmode_bak);_还原捕捉
  111.   (setvar "clayer" clayer_bak);_还原图层
  112.   (setvar "cecolor" cecolor_bak);_还原颜色
  113.   (setvar "celtype" celtype_bak);_还原线型
  114.   (setvar "textstyle" textstyle_bak);_还原文字样式
  115.   (command "undo" "e")
  116.   (setvar "cmdecho" 1);_打开命令提示
  117.   (princ);_关闭程序返回值
  118.   )

  119. (defun makent ()
  120.   ;;;计算点
  121.   (setq dist (* mr 1.1))
  122.   (setq texth (* mr 0.4))
  123.   (setq pt1 (polar pt 0 dist))
  124.   (setq pt2 (polar pt (* PI 0.5) dist))
  125.   (setq pt3 (polar pt pi dist))
  126.   (setq pt4 (polar pt (* 1.5 pi) dist))
  127.   (setq tept1 (polar pt pi (* mr 2 0.17)))
  128.   (setq textpt (polar tept1 (* 1.5 pi) (* mr 2 0.25)))
  129.   
  130.   ;生成圆
  131.   (entmake (list (cons 0 "CIRCLE")
  132.      (cons 67 0)
  133.      (CONS 62 33)
  134.      (cons 8 "screw")
  135.      (cons 6  cel)
  136.      (cons 48 xk)
  137.      (cons 10 pt)
  138.      (cons 40 r)
  139.      )
  140.      )
  141.   (setq en1 (entlast))
  142.   ;生成中心线
  143.   (entmake (list (cons 0 "LINE")
  144.      (cons 8 "screw")
  145.      (CONS 62 1)
  146.      (cons 6  "CENTER")
  147.      (cons 48 xk)
  148.      (cons 10 pt1)
  149.      (cons 11 pt3)
  150.       )
  151.       )
  152.   (setq en2 (entlast))
  153.   ;生成中心线
  154.   (entmake (list (cons 0 "LINE")
  155.      (cons 8 "screw")
  156.      (CONS 62 1)
  157.      (cons 6  "CENTER")
  158.      (cons 48 xk)
  159.      (cons 10 pt2)
  160.      (cons 11 pt4)
  161.       )
  162.       )
  163.   (setq en3 (entlast))
  164.   ;生成圆弧
  165.   (entmake (list (cons 0 "ARC")
  166.      (cons 8 "screw")
  167.      (CONS 62 92)
  168.      (cons 6 cel)
  169.      (cons 48 xk)
  170.      (cons 10 pt)
  171.      (cons 40 mr)
  172.      (list 210 0.0 0.0 1.0)
  173.      (cons 50 4.71239)
  174.      (cons 51 3.14159)
  175.       )
  176.       )
  177.   (setq en4 (entlast))
  178.   ;;;生成文字
  179.   (entmake (list (cons 0 "TEXT")
  180.      (cons 8 "screw")
  181.      (CONS 62 6)
  182.      (cons 10 textpt)
  183.      (cons 40 texth)
  184.      (cons 1 text)
  185.      (cons 7 "TXT")
  186.      (cons 41 1)
  187.      (cons 51 0.0)
  188.      (cons 71 0)
  189.      (cons 72 0)
  190.      (cons 73 0)
  191.      (list 210 0.0 0.0 1.0)
  192.       )
  193.       )
  194.   (setq en5 (entlast))
  195.   ;;;做成块
  196.   (setq sslist (ssadd))
  197.   (ssadd en1 sslist)
  198.   (ssadd en2 sslist)
  199.   (ssadd en3 sslist)
  200.   (ssadd en4 sslist)
  201.   (ssadd en5 sslist)
  202.   (emkblk sslist pt text )
  203.   (princ)
  204.   )

  205. ;13、entmake生成普通块
  206. ;http://bbs.mjtd.com/forum.php?mod=viewthread&tid=92482
  207. ;by langjs
  208. (defun emkblk (ss pt name / i)
  209.   (setvar "cmdecho" 0)
  210.   (entmake (list '(0 . "block") (cons 2 name) '(70 . 0) (cons 10 pt)))
  211.   (repeat (setq i (sslength ss))    (entmake (cdr (entget (ssname ss (setq i (1- i))))))  )
  212.   (entmake '((0 . "ENDBLK")))
  213.   (command "_.erase" ss "")
  214.   (entmake (list '(0 . "INSERT") (cons 8 "screw") (cons 2 name) (cons 10 pt)))
  215.   (setvar "cmdecho" 1)
  216. )

  217. (defun dxf (m dat) (cdr (assoc m dat)))
  218. (defun dxfucs (m dat)  (trans (cdr (assoc m dat)) 0 1))



还望明经高手指导,只做了M20以下的,M20以上的很少用
,最后还有点不明白就是,生成同名块,老是显示重定义块,,,有没有更好的方法呢,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

楼主请问怎样只实现加上中心线和文字!!!!支持框选!  发表于 2015-11-26 09:34
请继续研究竖直的螺丝孔标记,实现类似功能  发表于 2015-7-16 07:45
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2020-10-28 20:27 | 显示全部楼层
这个一般都是固定标准的,所以才用程序生成。或者用其他组合插件
发表于 2013-4-14 08:33 | 显示全部楼层
  1. ;圆变螺孔 明经 ZZXXQQ 2010.9.8
  2. (defun c:tt ()
  3. (defun mkline (p1 p2 ln)
  4.   (entmake (list '(0 . "LINE") (cons 8 ln) (cons 10 p1) (cons 11 p2)))
  5. )
  6. (setvar "CMDECHO" 0)
  7. (if (and (princ "\n选择圆 :")
  8.           (setq ss (ssget '((0 . "CIRCLE"))))) (progn
  9.   (setq i 0)
  10.   (repeat (sslength ss)
  11.    (setq en (ssname ss i)
  12.          ent (entget en)
  13.          i (1+ i)
  14.          pc (cdr(assoc 10 ent))
  15.          r (cdr(assoc 40 ent))
  16.          ri (* r 0.9)
  17.          ro (* r 1.1)
  18.          pc1 (polar pc 0 ro)
  19.          pc2 (polar pc pi ro)
  20.          pc3 (polar pc (/ pi 2) ro)
  21.          pc4 (polar pc (/ pi -2) ro)
  22.          an1 (/ pi 3)
  23.          an2 (/ pi -6))
  24.    (if (not (tblsearch "LAYER" "CEN"))
  25.     (command ".LAYER" "N" "CEN" "C" 1 "CEN" "L" "CENTER2" "CEN" "")
  26.    )
  27.    (mkline pc1 pc2 "CEN")
  28.    (mkline pc3 pc4 "CEN")
  29.    (entmake (list '(0 . "CIRCLE") (assoc 8 ent) (cons 10 pc) (cons 40 ri)))
  30.    (entmake
  31.     (list '(0 . "ARC") (cons 10 pc) (cons 40 r) (cons 50 an1) (cons 51 an2) '(62 . 1))
  32.    )
  33.    (entdel en)
  34.   )
  35. ))
  36. (setvar "CMDECHO" 1)
  37. (princ)
  38. )
发表于 2013-4-14 08:52 | 显示全部楼层
如果这么做,选择的孔不螺丝孔,而其孔径大小和螺丝的底孔大小完全相同,那不也变成了螺丝空
 楼主| 发表于 2013-4-14 09:36 来自手机 | 显示全部楼层
ZZXXQQ 发表于 2013-4-14 08:33

螺丝是固定大小的吧,标准件,反正我这用的是固定十几种,而你的是遇到圆就变成了螺丝孔,
发表于 2013-4-14 09:38 | 显示全部楼层
跟隨須求走.寫的程式.就是好程式.但.Scmtools 說的情況.的確有此可能.!! 所以明知道那幾個孔不是螺絲孔.就要避開.不選取.!! 倒可以再加個圖層.事先分好層.!! 做歸類.再轉換,僅建議.!!

我自己的所有孔類!!都由組立圖.取出.拆不同模板.做不同的視圖自動轉換.!! 跟樓主情況不太一樣.
 楼主| 发表于 2013-4-14 09:40 来自手机 | 显示全部楼层
ScmTools 发表于 2013-4-14 08:52
如果这么做,选择的孔不螺丝孔,而其孔径大小和螺丝的底孔大小完全相同,那不也变成了螺丝空

适合手动选择好螺丝孔,不能框选整个模板让它自动寻找螺丝孔,除非再UG图中做好特征,
发表于 2013-4-14 09:58 | 显示全部楼层
支持机械设计的朋友
发表于 2013-4-14 11:29 | 显示全部楼层
感谢 邹锋 及 Z版 方享程序!
发表于 2013-4-14 19:48 | 显示全部楼层
错误: no function definition: USDXF

点评

(defun usdxf (n entt) (cdr(assoc n entt)))  发表于 2013-4-15 21:25
发表于 2013-4-15 00:57 | 显示全部楼层
很方便的程序!
有参考价值
谢谢 楼主及版主的分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-3 15:38 , Processed in 0.266341 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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