明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1475|回复: 11

[提问] 大家帮我看看这个源码,为什么只对直线起作用,圆和圆弧怎么用不了。

[复制链接]
发表于 2016-10-4 17:01:57 | 显示全部楼层 |阅读模式
这是一个变双线的代码,默认是0.3,当宽度大于0.7时,两头会自己封口。可是有个弊端,就是只对直线起作用,圆和圆弧怎么用不了。哪位高手能帮忙改一下,使圆和圆弧都能用。在这里先谢谢了。
(defun c:dkK (/ esel ename entna s st1 st2 ed1 ed2)
  (setq temperr *error*)
  (setq *error* trap8)
  (setq old1 (getvar "blipmode"))
  (setq old (getvar "pickfirst"))
  (setq cmd (getvar "cmdecho"))
  (setq os (getvar "osmode"))
  (setvar "cmdecho" 0)
  (command "undo" "m")
  (command "undo" "m")
  (setvar "blipmode" 0)
  (setvar "pickfirst" 0)
  (setvar "osmode" 0)
  (prompt "\n选择线变成双线:")
  (setq ent_ca (ssget))
  (if (= ent_ca nil)
    (exit)
  )
  (if (= dlw nil)
    (setq dlw 0.3)
  )
  (princ "\n当前双线宽度:<")
  (princ dlw)
  (princ "> ")
  (setq s (getstring))
  (if (/= s "")
    (setq dlw (atof s))
  )
  (setq len (sslength ent_ca))
  (setq cx 0)
  (repeat len
    (setq ename (ssname ent_ca cx))
    (setq elist (entget ename))
    (setq entna (dxf 0 elist))
    (cond
      ((= entna "LINE")
       (progn
     (redraw ename 3)
     (line)
     (setq st1 (polar st (+ (angle st ed) (/ pi 2)) (/ dlw 2)))
     (setq ed1 (polar ed (+ (angle st ed) (/ pi 2)) (/ dlw 2)))
     (setq st2 (polar st (+ (angle st ed) (* pi 1.5)) (/ dlw 2)))
     (setq ed2 (polar ed (+ (angle st ed) (* pi 1.5)) (/ dlw 2)))
     (entmake (list (cons 0 "LINE") (cons 10 st1) (cons 11 ed1)))
     (entmake (list (cons 0 "LINE") (cons 10 st2) (cons 11 ed2)))
     (if (> dlw 0.7)
       (progn
         (entmake (list (cons 0 "LINE") (cons 10 st1) (cons 11 st2))
         )
         (entmake (list (cons 0 "LINE") (cons 10 ed1) (cons 11 ed2))
         )
       )
     )
     (entdel ename)
       )
      )
      (T (exit))
    )
    (setq cx (+ cx 1))
  )
  (setvar "cmdecho" cmd)
  (setvar "blipmode" old1)
  (setvar "pickfirst" old)
  (setvar "osmode" os)
  (setq *error* temperr)
  (princ)
)

发表于 2016-10-5 07:11:43 | 显示全部楼层
本帖最后由 ZZXXQQ 于 2016-10-7 07:04 编辑
  1. (defun c:dkK (/ esel ename entna s st1 st2 ed1 ed2)
  2.   (defun dxf (code elst) (cdr(assoc code elst)))
  3. ;  (setq temperr *error*)
  4. ;  (setq *error* trap8)
  5.   (mapcar 'set '(old1 old cmd os)
  6.     (mapcar 'getvar '("blipmode" "pickfirst" "cmdecho" "osmode"))
  7.   )
  8.   (command "undo" "m")
  9.   (mapcar 'setvar '("cmdecho" "bilipmode" "pickfirst" "osmode") '(0 0 0 0))
  10.   (prompt "\n选择线变成双线:")
  11.   (if (setq ss (ssget '((0 . "ARC,CIRCLE,LINE")))) (progn
  12.    (if (= dlw nil) (setq dlw 0.3))
  13.    (setq s (getstring (strcat "\n当前双线宽度:<" (rtos dlw 2) "> ")))
  14.    (if (/= s "") (setq dlw (atof s)))
  15.    (repeat (setq i (sslength ss))
  16.     (setq en (ssname ss (setq i (1- i))))
  17.     (setq elist (entget en))
  18.     (redraw en 3)
  19.     (setq enname (dxf 0 elist))
  20.     (cond
  21.       ((= enname "LINE")
  22.        (setq st (dxf 10 elist))
  23.        (setq ed (dxf 11 elist))
  24.        (setq st1 (polar st (+ (angle st ed) (/ pi 2)) (/ dlw 2)))
  25.        (setq ed1 (polar ed (+ (angle st ed) (/ pi 2)) (/ dlw 2)))
  26.        (setq st2 (polar st (+ (angle st ed) (* pi 1.5)) (/ dlw 2)))
  27.        (setq ed2 (polar ed (+ (angle st ed) (* pi 1.5)) (/ dlw 2)))
  28.        (entmake (list (cons 0 "LINE") (cons 10 st1) (cons 11 ed1)))
  29.        (entmake (list (cons 0 "LINE") (cons 10 st2) (cons 11 ed2)))
  30.        (if (> dlw 0.7) (progn
  31.         (entmake (list (cons 0 "LINE") (cons 10 st1) (cons 11 st2)))
  32.         (entmake (list (cons 0 "LINE") (cons 10 ed1) (cons 11 ed2)))
  33.        ))
  34.       )
  35.       ((= enname "CIRCLE")
  36.        (setq pc (dxf 10 elist) r (dxf 40 elist))
  37.        (entmake(list'(0 . "CIRCLE")(cons 10 pc)(cons 40 (+ r (/ dlw 2)))))
  38.        (entmake(list'(0 . "CIRCLE")(cons 10 pc)(cons 40 (- r (/ dlw 2)))))
  39.       )
  40.       ((= enname "ARC")
  41.        (setq pc (dxf 10 elist) r (dxf 40 elist))
  42.        (setq st (polar pc (dxf 50 elist) r))
  43.        (setq ed (polar pc (dxf 51 elist) r))
  44.        (entmake(list'(0 . "ARC")(cons 10 pc)(cons 40 (+ r (/ dlw 2)))(assoc 50 elist)(assoc 51 elist)))
  45.        (entmake(list'(0 . "ARC")(cons 10 pc)(cons 40 (- r (/ dlw 2)))(assoc 50 elist)(assoc 51 elist)))
  46.        (if (> dlw 0.7) (progn
  47.         (setq st1 (polar pc (dxf 50 elist) (+ r (/ dlw 2))))
  48.         (setq st2 (polar pc (dxf 50 elist) (- r (/ dlw 2))))
  49.         (setq ed1 (polar pc (dxf 51 elist) (+ r (/ dlw 2))))
  50.         (setq ed2 (polar pc (dxf 51 elist) (- r (/ dlw 2))))
  51.         (entmake (list (cons 0 "LINE") (cons 10 st1) (cons 11 st2)))
  52.         (entmake (list (cons 0 "LINE") (cons 10 ed1) (cons 11 ed2)))
  53.        ))
  54.       )
  55.      )
  56.      (entdel ename)
  57.     )
  58.   ))
  59.   (mapcar 'setvar '("cmdecho" "blipmode" "pickfirst" "osmode") '(cmd old1 old os))
  60. ;  (setq *error* temperr)
  61.   (princ)
  62. )

程序改了,再试一下。
发表于 2016-10-5 09:43:15 | 显示全部楼层
ZZXXQQ。。。论坛大神更是大大的热心人
 楼主| 发表于 2016-10-5 11:40:57 | 显示全部楼层

先谢谢了,我试试看。
 楼主| 发表于 2016-10-5 12:00:39 | 显示全部楼层

亲,未知命令,帮忙调试一下可以吗?谢谢,

点评

缺函数,无法调试。  发表于 2016-10-6 06:22
发表于 2016-10-6 06:25:02 | 显示全部楼层
xiao88gang 发表于 2016-10-5 12:00
亲,未知命令,帮忙调试一下可以吗?谢谢,

请提供所缺函数,否则无法调试。
 楼主| 发表于 2016-10-6 14:48:30 | 显示全部楼层
我也不知道函数,这个是在R14下用的插件。那就算了,不弄了,还是要谢谢你的热心帮助。

点评

程序改了,再试一下。  发表于 2016-10-7 07:06
发表于 2016-10-6 15:13:41 | 显示全部楼层
(mapcaqr 'setvar '("cmdecho" "bilipmode" "pickfirst" "osmode") '(0 0 0 0))
Try ===>
(mapcar 'setvar '("cmdecho" "bilipmode" "pickfirst" "osmode") '(0 0 0 0))
发表于 2016-10-6 20:59:21 | 显示全部楼层
根据楼主提供的程序和所提的问题,基本可以认为,程序不是自己写的
当然,不是说不能用别人的程序进行修改以达到学习的目的,实际上我也经常把别人程序改成自己需要的
起点和过程不重要,最重要的是结果:自己确实学到东西而不是有了一大堆自己需要的程序
发表于 2020-2-21 21:21:47 | 显示全部楼层

ZZXXQQ 论坛大神更是大大的热心人
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-18 10:06 , Processed in 0.194257 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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