明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2437|回复: 25

[源码] 普通六角螺母绘制(2021.6.21版)

[复制链接]
发表于 2021-6-21 13:28 | 显示全部楼层 |阅读模式
本帖最后由 fangmin723 于 2021-6-23 16:22 编辑

;;说明:绘制普通六角螺母 LM---普通六角螺母绘制 < LM >; by-702099480@qq.com(2021.6.21)
(defun cM(/ action_ljlm_keys arcsin dcl_file dcl_id de dialog_return dn drawnut ds getpar isc keys p start_ljlm_keys th write_dcl_ljlm)
        (vl-load-com)
        (progn;;;自定义函数
                ;-------------------------------------
                (defun Arcsin(X) (Atan (/ X (expt (- 1 (* X X)) 0.5))))
                (defun Start_ljlm_Keys(key value istart);控件值初始化
                        (cond
                                ((= key "cirle");;;{"内接圆"} (单选按钮)
                                        (if istart
                                                ()
                                                (progn
                                                        (mode_tile "circled" 0)
                                                        (mode_tile "lens" 1)
                                                )
                                        );控件内容
                                )
                                ((= key "lns");;;{"六角长距"} (单选按钮)
                                        (if istart
                                                ()
                                                (progn
                                                        (mode_tile "circled" 1)
                                                        (mode_tile "lens" 0)
                                                )
                                        );控件内容
                                )
                        )
                        (prin1)
                )
                ;-------------------------------------
                (defun Action_ljlm_Keys(key value);全部控件的点击动作触发
                        (cond
                                ((= key "accept");;;{"确认按钮"}
                                        (getpar)
                                        (done_dialog 1);对话框退出返回主函数 传递给Dialog_Return值为1
                                )
                                ((= key "cancel");;;{"取消按钮"}
                                        (done_dialog 0);对话框退出返回主函数 传递给Dialog_Return值为0
                                )
                                (T
                                        (Start_ljlm_Keys key value nil);;;其余控件的点击动作触发
                                )
                        )
                        (prin1)
                )
                ;-------------------------------------
                (defun Write_Dcl_ljlm(/ Dcl_File file str)
                        (setq Dcl_File (vl-filename-mktemp nil nil ".Dcl"))
                        (setq file (open Dcl_File "w"))
                        (foreach str '(
                                                                                        "ljlm:dialog {"
                                                                                        "    label = \"绘制螺母\" ;"
                                                                                        "    :boxed_column {"
                                                                                        "        label = \"几何数据\" ;"
                                                                                        "        :radio_row {"
                                                                                        "            :radio_button {"
                                                                                        "                key = \"cirle\" ;"
                                                                                        "                label = \"六角短距\" ;"
                                                                                        "                value = \"1\" ;"
                                                                                        "            }"
                                                                                        "            :radio_button {"
                                                                                        "                key = \"lns\" ;"
                                                                                        "                label = \"六角长距\" ;"
                                                                                        "            }"
                                                                                        "        }"
                                                                                        "        :edit_box {"
                                                                                        "            edit_width = 8 ;"
                                                                                        "            key = \"diameter\" ;"
                                                                                        "            label = \"螺母公称直径 D\" ;"
                                                                                        "            value = \"50\" ;"
                                                                                        "        }"
                                                                                        "        :edit_box {"
                                                                                        "            edit_width = 8 ;"
                                                                                        "            key = \"lentooth\" ;"
                                                                                        "            label = \"螺纹牙距     P\" ;"
                                                                                        "            value = \"2.0\" ;"
                                                                                        "        }"
                                                                                        "        :edit_box {"
                                                                                        "            edit_width = 8 ;"
                                                                                        "            key = \"nutt\" ;"
                                                                                        "            label = \"螺母厚度     T\" ;"
                                                                                        "            value = \"40\" ;"
                                                                                        "        }"
                                                                                        "        :edit_box {"
                                                                                        "            edit_width = 8 ;"
                                                                                        "            key = \"circled\" ;"
                                                                                        "            label = \"六边形短距  De\" ;"
                                                                                        "            value = \"100\" ;"
                                                                                        "        }"
                                                                                        "        :edit_box {"
                                                                                        "            edit_width = 8 ;"
                                                                                        "            is_enabled = false ;"
                                                                                        "            key = \"lens\" ;"
                                                                                        "            label = \"六边形长距  Ds\" ;"
                                                                                        "            value = \"100\" ;"
                                                                                        "        }"
                                                                                        "    }"
                                                                                        "    ok_cancel;"
                                                                                        "}"
                                                                                )
                                (write-line str file)
                        )
                        (close file)
                        Dcl_File
                )
                (defun getpar()
                        (setq
                                isc (atoi (get_tile "cirle"))
                                dn (if (= (get_tile "diameter") "") 50. (atof (get_tile "diameter")))
                                p (if (= (get_tile "lentooth") "") 2.0 (atof (get_tile "lentooth")))
                                th (if (= (get_tile "nutt") "") (* 0.8 dn) (atof (get_tile "nutt")))
                                de (if (= isc 1) (if (= (get_tile "circled") "") 100. (atof (get_tile "circled"))) 0.0)
                                ds (if (= isc 1) 0.0 (if (= (get_tile "lens") "") (* 2. dn) (atof (get_tile "lens"))))
                        )
                )
                (defun drawnut(isc dn p th de ds / ang arc d1 d2 disx disy h lne lst modarc p0 p1 p10 p11 p12 p13 p14 p15 p16 p17 p18 p2 p3 p4 p5 p6 p7 p8 p9 pc1 pc2 r1 r2)
                        (defun modarc(arc lne cen num spy spycar / angmode arced interwithpt ptlst)
                                (defun InterWithPt(ent1 ent2 / bf-list-split-3d var)
                                        ;;;name:BF-list-split-3d
                                        ;;;desc:列表按顺序切分为3元素表组成的表,不足部分用nil表示
                                        ;;;arg:lst:列表
                                        ;;;return(x x x )(x x x)...)
                                        ;;;exampleBF-list-split-3d '(1 2 3 4))
                                        (defun BF-list-split-3d (lst)
                                                (if lst
                                                        (cons
                                                                (list
                                                                        (car lst)
                                                                        (cadr lst)
                                                                        (caddr lst)
                                                                )
                                                                (BF-list-split-3d (cdddr lst))
                                                        )
                                                )
                                        )
                                        (if (> (vlax-safearray-get-u-bound (setq var (vlax-variant-value (vla-IntersectWith (vlax-ename->vla-object ent1) (vlax-ename->vla-object ent2) acExtendNone))) 1) 1)
                                                (BF-list-split-3d (vlax-safearray->list var))
                                                nil
                                        )
                                )
                                (if (setq ptlst (InterWithPt arc lne))
                                        (progn
                                                (setq ptlst (vl-sort ptlst '(lambda(x y) (spy (spycar x) (spycar y)))))
                                                (setq angmode (angle cen (car ptlst)))
                                                (setq arced (entget arc))
                                                (entmod (setq arced (subst (cons num angmode) (assoc num arced) arced)))
                                        )
                                )
                        )
                        (if (= isc 1) (setq ds (/ de (cos (/ pi 6)))) (setq de (* (cos (/ pi 6)) ds)))
                        (setq
                                h (* (/ (sqrt 3.0) 2.0) p)
                                d1 (atof (rtos (- dn (* 2.0 (/ 5.0 8.0) h)) 2 3))
                                d2 (atof (rtos (- dn (* 2.0 (/ 3.0 8.0) h)) 2 3))
                        )
                        (if (setq p0 (getpoint "\n请指定放置点:"))
                                (progn
                                        ;;===========俯视图===========
                                        (setq lst
                                                (list
                                                        (setq p1 (polar p0 0 (* 0.5 ds)))
                                                        (setq p2 (polar p0 (* 1 (/ pi 3)) (* 0.5 ds)))
                                                        (setq p3 (polar p0 (* 2 (/ pi 3)) (* 0.5 ds)))
                                                        (setq p4 (polar p0 (* 3 (/ pi 3)) (* 0.5 ds)))
                                                        (setq p5 (polar p0 (* 4 (/ pi 3)) (* 0.5 ds)))
                                                        (setq p6 (polar p0 (* 5 (/ pi 3)) (* 0.5 ds)))
                                                )
                                        )
                                        (entmake (append (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 90 (length lst)) (cons 70 1)) (mapcar '(lambda (pt) (cons 10 pt)) lst)))
                                        (entmake (list '(0 . "CIRCLE") (cons 10 p0) (cons 40 (* 0.5 de))))
                                        (entmake (list '(0 . "LINE") (cons 62 1) (cons 6 "ACAD_ISO04W100") (cons 10 (polar p0 (* pi 1.5) (* 0.65 de))) (cons 11 (polar p0 (* pi 0.5) (* 0.65 de)))))
                                        (entmake (list '(0 . "LINE") (cons 62 1) (cons 6 "ACAD_ISO04W100") (cons 10 (polar p0 pi (* 0.65 de))) (cons 11 (polar p0 0 (* 0.65 de)))))
                                        (entmake (list '(0 . "CIRCLE") (cons 10 p0) (cons 40 (* 0.5 d1))))
                                        (entmake (list '(0 . "ARC") (cons 62 2) (cons 6 "ACAD_ISO02W100") (cons 10 p0) (cons 40 (* 0.5 dn)) (cons 50 (* 35 (/ pi 36))) (cons 51 (* 19 (/ pi 36)))))
                                        ;;===========主视图===========
                                        (setq
                                                disx (* 0.5 (- ds de))
                                                disy (* disx (/ (sin (/ pi 6.0)) (cos (/ pi 6.0))))
                                                ang (* 2 (atan (/ disy (* 0.5 (- (car p2) (car p3))))))
                                                r1 (/ (* 0.5 (- (car p2) (car p3))) (sin ang))
                                                pc1 (list (car p0) (- (+ (cadr p0) (* 0.8 ds) th) r1))
                                                pc2 (list (car p0) (+ (cadr p0) (* 0.8 ds) r1))
                                                p15 (polar pc1 (- (* pi 0.5) ang) r1)
                                                p16 (polar pc1 (+ (* pi 0.5) ang) r1)
                                                p17 (polar pc2 (- (* pi 1.5) ang) r1)
                                                p18 (polar pc2 (+ (* pi 1.5) ang) r1)
                                        )
                                        (setq p7 (list (+ (car p4) disx) (+ (cadr p0) (* 0.8 ds) th)))
                                        (setq p8 (list (car p4) (- (cadr p7) disy)))
                                        (setq p9 (list (car p4) (+ (cadr p0) (* 0.8 ds) disy)))
                                        (setq p10 (list (car p7) (+ (cadr p0) (* 0.8 ds))))
                                        (setq p11 (list (- (car p1) disx) (cadr p10)))
                                        (setq p12 (list (car p1) (cadr p9)))
                                        (setq p13 (list (car p1) (cadr p8)))
                                        (setq p14 (list (car p11) (cadr p7)))
                                        (entmake (list '(0 . "ARC") (cons 10 pc1) (cons 40 r1) (cons 50 (- (* pi 0.5) ang)) (cons 51 (+ (* pi 0.5) ang))))
                                        (entmake (list '(0 . "ARC") (cons 10 pc2) (cons 40 r1) (cons 50 (- (* pi 1.5) ang)) (cons 51 (+ (* pi 1.5) ang))))
                                        (entmake (list '(0 . "LINE") (cons 10 p15) (cons 11 p18)))
                                        (entmake (list '(0 . "LINE") (cons 10 p16) (cons 11 p17)))
                                        (setq ang (* 2 (Atan (/ disy (* 0.5 (- (car p1) (car p2)))))))
                                        (setq pc1 (list (* 0.5 (+ (car p1) (car p2))) (- (cadr p14) (setq r2 (/ (* 0.5 (- (car p1) (car p2))) (sin ang))))))
                                        (setq lne (entmakex (list '(0 . "LINE") (cons 10 p13) (cons 11 p14))))
                                        (setq arc (entmakex (list '(0 . "ARC") (cons 10 pc1) (cons 40 r2) (cons 50 (- (* pi 0.5) ang)) (cons 51 (+ (* pi 0.5) ang)))))
                                        (modarc arc lne pc1 50 < car)
                                        (entmake (list '(0 . "LINE") (cons 10 p14) (cons 11 p7)))
                                        (setq pc1 (list (* 0.5 (+ (car p3) (car p4))) (cadr pc1)))
                                        (setq lne (entmakex (list '(0 . "LINE") (cons 10 p7) (cons 11 p8))))
                                        (setq arc (entmakex (list '(0 . "ARC") (cons 10 pc1) (cons 40 r2) (cons 50 (- (* pi 0.5) ang)) (cons 51 (+ (* pi 0.5) ang)))))
                                        (modarc arc lne pc1 51 > car)
                                        (entmake (list '(0 . "LINE") (cons 10 p8) (cons 11 p9)))
                                        (setq pc2 (list (* 0.5 (+ (car p3) (car p4))) (+ (cadr p10) r2)))
                                        (setq lne (entmakex (list '(0 . "LINE") (cons 10 p9) (cons 11 p10))))
                                        (setq arc (entmakex (list '(0 . "ARC") (cons 10 pc2) (cons 40 r2) (cons 50 (- (* pi 1.5) ang)) (cons 51 (+ (* pi 1.5) ang)))))
                                        (modarc arc lne pc2 50 > car)
                                        (entmake (list '(0 . "LINE") (cons 10 p10) (cons 11 p11)))
                                       
                                        (setq pc2 (list (* 0.5 (+ (car p1) (car p2))) (cadr pc2)))
                                        (setq lne (entmakex (list '(0 . "LINE") (cons 10 p11) (cons 11 p12))))
                                        (setq arc (entmakex (list '(0 . "ARC") (cons 10 pc2) (cons 40 r2) (cons 50 (- (* pi 1.5) ang)) (cons 51 (+ (* pi 1.5) ang)))))
                                        (modarc arc lne pc2 51 < car)
                                        (entmake (list '(0 . "LINE") (cons 10 p12) (cons 11 p13)))
                                        (entmake (list '(0 . "LINE") (cons 62 1) (cons 6 "ACAD_ISO04W100") (cons 10 (list (car p0) (- (cadr p10) (* 0.1 ds)))) (cons 11 (list (car p0) (+ (cadr p14) (* 0.1 ds))))))
                                        ;;===========左视图===========
                                        (entmake (list '(0 . "LINE") (cons 10 (setq p7 (list (+ (car p0) (* 0.8 ds)) (cadr p2)))) (cons 11 (setq p8 (list (car p7) (cadr p6))))))
                                        (entmake (list '(0 . "LINE") (cons 10 p8) (cons 11 (setq p9 (list (+ (car p8) th) (cadr p8))))))
                                        (entmake (list '(0 . "LINE") (cons 10 p9) (cons 11 (setq p10 (list (car p9) (cadr p7))))))
                                        (entmake (list '(0 . "LINE") (cons 10 p10) (cons 11 p7)))
                                        (setq ang (* 2 (atan (/ disy (* 0.5 (- (cadr p2) (cadr p1)))))) r1 (/ (* 0.5 (- (cadr p2) (cadr p1))) (sin ang)))
                                        (setq pc1 (list (+ (car p0) (* 0.8 ds) r1) (* 0.5 (+ (cadr p1) (cadr p2)))))
                                        (setq p15 (polar pc1 (+ pi ang) r1))
                                        (entmake (list '(0 . "ARC") (cons 10 pc1) (cons 40 r1) (cons 50 (- pi ang)) (cons 51 (+ pi ang))))
                                        (setq pc1 (list (car pc1) (* 0.5 (+ (cadr p1) (cadr p6)))))
                                        (entmake (list '(0 . "ARC") (cons 10 pc1) (cons 40 r1) (cons 50 (- pi ang)) (cons 51 (+ pi ang))))
                                        (setq pc2 (list (+ (car p0) (* 0.8 ds) th (- 0 r1)) (* 0.5 (+ (cadr p1) (cadr p2)))))
                                        (entmake (list '(0 . "ARC") (cons 10 pc2) (cons 40 r1) (cons 50 (- 0 ang)) (cons 51 ang)))
                                        (setq p16 (polar pc2 (- 0 ang) r1))
                                        (setq pc2 (list (car pc2) (* 0.5 (+ (cadr p1) (cadr p6)))))
                                        (entmake (list '(0 . "ARC") (cons 10 pc2) (cons 40 r1) (cons 50 (- 0 ang)) (cons 51 ang)))
                                        (entmake (list '(0 . "LINE") (cons 62 1) (cons 6 "ACAD_ISO04W100") (cons 10 (list (+ (car p0) (* 0.7 ds)) (cadr P0))) (cons 11 (list (+ (car p0) (* 0.9 ds) th) (cadr P0)))))
                                        (entmake (list '(0 . "LINE") (cons 10 p15) (cons 11 p16)))
                                )
                        )
                        (prin1)
                )
        )
        (setq dcl_id (load_dialog (setq Dcl_File (Write_Dcl_ljlm))));对话框加载
        (vl-file-delete Dcl_File);加载后删除DCL文件
        (setq Dialog_Return 3)
        (while (> Dialog_Return 2) ;循环控制对话框是否结束
                (new_dialog "ljlm" dcl_id);建立窗体
                ;--->--->---对话框初始化--->--->---
                (setq keys '("cirle" "lns" "accept" "cancel"));列表全部控件名称
               
                ;->->-下拉列表初始化->->-
                (foreach key keys;全部控件的初始化
                        (Start_ljlm_Keys key nil T)
                )
                (foreach key keys;;;全部控件的点击动作触发
                        (action_tile key "(Action_ljlm_Keys $key $value)");;;点击动作 $reason
                )
                ;---<---<---对话框初始化完成---<---<---
                (setq Dialog_Return (start_dialog));开启对话框(用户可见)
        )
        (unload_dialog dcl_id);退出时卸载对话框
        (cond
                ((< 0 Dialog_Return 2) (drawnut isc dn p th de ds))
                ((= Dialog_Return 0) (princ "\n*取消*"))
        )
        (prin1);防止函数回显
)
(princ "\n普通六角螺母绘制 < LM >; by-702099480@qq.com(2021.6.21)" )
(prin1)

本帖子中包含更多资源

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

x

评分

参与人数 2明经币 +2 收起 理由
xvjiex + 1 赞一个!
lee50310 + 1 很给力!

查看全部评分

"觉得好,就打赏"
    共1人打赏
 楼主| 发表于 2021-6-22 12:59 | 显示全部楼层
本帖最后由 fangmin723 于 2021-6-22 13:15 编辑
xvjiex 发表于 2021-6-22 11:10
很好的制图插件,全是干货。经过测试,段距改为200有些小bug:除数为零。


我测试了下,按照你的尺寸,左视图半径为D,这样不合理,所以画不成啊

本帖子中包含更多资源

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

x
 楼主| 发表于 2021-6-24 10:25 | 显示全部楼层
xvjiex 发表于 2021-6-24 09:43
经过测试,完美修复!另外还有一个问题想请教一下:就是这个圆弧点,为何不是在螺帽的角点上?

在起点的话,或穿过那条倒角线啊
 楼主| 发表于 2021-9-29 16:28 | 显示全部楼层
蓝盾设计 发表于 2021-9-27 01:43
楼主:怎么视频看有中心线,实际操作没有中心线?

中心线有的啊,你有没有加载这种线型。还有我用的是中望CAD2014版本
 楼主| 发表于 2021-6-21 13:43 | 显示全部楼层
习惯性占楼
发表于 2021-6-21 15:42 | 显示全部楼层
谢谢楼主的无私分享,很有用处
发表于 2021-6-21 16:37 | 显示全部楼层

谢谢楼主的无私分享,备货啦
发表于 2021-6-22 07:33 | 显示全部楼层
谢谢楼主的无私分享,备货啦
发表于 2021-6-22 10:28 | 显示全部楼层
謝謝你無私的分享!
滿好用的。
发表于 2021-6-22 11:10 | 显示全部楼层
很好的制图插件,全是干货。经过测试,段距改为200有些小bug:除数为零。
发表于 2021-6-22 13:22 | 显示全部楼层
我是外行,不按套路出牌,学习了!
 楼主| 发表于 2021-6-22 13:47 | 显示全部楼层
xvjiex 发表于 2021-6-22 13:22
我是外行,不按套路出牌,学习了!

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-18 20:31 , Processed in 0.302249 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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