找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1125|回复: 3

[LISP程序]加粗曲线

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-1-9 22:17:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本程序取自晓东工具箱,改用Lisp完成,但Spline 和 Ellipse 模拟使用了ET函数(该函数包含在哪个文件中未知)

  1. (defun xdl-dxf (elst code)
  2.   (cdr (assoc code elst))
  3. )
  4. ;|(mapcar        '(lambda (x) (load x nil))
  5.         '("acetutil.fas"
  6.           "acetutil2.fas"
  7.           "acetutil3.fas"
  8.           "acetutil4.fas"
  9.         )
  10. )|;
  11. (DEFUN C:plw_match (/         tf   e0   wid        ss   cr          rad  d1   d2         ent
  12.                     xform     i           ll        e    tp          cr   r    oldwid
  13.                     sc         d1   d2   tf        tol  e40  i    ssl  e         el
  14.                     olderr    myerr        ucstf
  15.                    )
  16.   (defun myerr (msg)
  17.     (if        (/= msg "CANCEL")
  18.       (princ "\n*Cancel*")
  19.     )
  20.     (setvar "plinewid" oldwid)
  21.     (setvar "osmode" oldos)
  22.     (command ".undo" "end")
  23.     (if        ucstf
  24.       (command ".ucs" "p")
  25.     )
  26.     (princ)
  27.   )
  28.   (setq oldwid (getvar "plinewid"))
  29.   (if (or (setq e0 (entsel "\n请选择匹配源(回车输入加粗方式): "))
  30.           (progn
  31.             (initget "1 2")
  32.             (setq tf (getkword "\n请选择方式[1:加粗 2:变比]<1>:"))
  33.           )
  34.       )
  35.     (progn
  36.       (setq oldos   (getvar "osmode")
  37.             olderr  *error*
  38.             *error* myerr
  39.       )
  40.       (cond
  41.         ((= (type e0) 'LIST)
  42.          (setq el (entget (car e0)))
  43.          (progn
  44.            (if (wcmatch (xdl-dxf el 0) "*POLYLINE")
  45.              (setq wid (xdl-dxf el 40))
  46.              (setq wid 0)
  47.            )
  48.          )
  49.         )
  50.         (T
  51.          (if (not tf)
  52.            (setq tf "1")
  53.          )
  54.          (if (not #xd_width)
  55.            (setq #xd_width 50)
  56.          )
  57.          (if (not #xd_scale)
  58.            (setq #xd_scale 1.0)
  59.          )
  60.          (if (= tf "1")
  61.            (progn
  62.              (initget 4)
  63.              (if (setq wid (getreal (strcat "\n请输入加粗后的的宽度<"
  64.                                             (rtos #xd_width 2 0)
  65.                                             ">:"
  66.                                     )
  67.                            )
  68.                  )
  69.                (setq #xd_width wid)
  70.              )
  71.            )
  72.            (progn
  73.              (initget 6)
  74.              (setq sc (getreal (strcat "\n请输入比例系数<"
  75.                                        (rtos #xd_scale
  76.                                              2
  77.                                              2
  78.                                        )
  79.                                        ">:"
  80.                                )
  81.                       )
  82.              )
  83.              (if (not sc)
  84.                (setq sc #xd_scale)
  85.                (setq #xd_scale sc)
  86.              )
  87.            )
  88.          )
  89.         )
  90.       )
  91.       ;;(xdrx_begin)
  92.       ;;(xdrx_ucson)
  93.       (command ".undo" "begin")
  94.       (if (/= (getvar "worlducs") 0)
  95.         (progn
  96.           (command ".ucs" "W")
  97.           (setq ucstf t)
  98.         )
  99.       )
  100.       (if
  101.         (if (= (type e0) 'LIST)
  102.           (progn
  103.             (princ "\n线宽= ")
  104.             (princ wid)
  105.             (princ
  106.               "\n选择需要匹配的直线、圆、弧、椭圆、spline、多义线<退出>..."
  107.             )
  108.             (setq #xd_width wid)
  109.             (setq ss (ssget '((0 . "*line,circle,arc,ellipse,spline"))))
  110.           )
  111.           (progn
  112.             (if        (= tf "1")
  113.               (progn
  114.                 (princ
  115.                   "\n请选取要加粗的直线、圆、弧、椭圆、spline、多义线<退出>..."
  116.                 )
  117.                 (setq ss
  118.                        (ssget '((0 . "*line,circle,arc,ellipse,spline")))
  119.                 )
  120.               )
  121.               (progn
  122.                 (princ "\n请选取要宽度变比的多义线<退出>...")
  123.                 (setq ss (ssget '((0 . "*polyline"))))
  124.               )
  125.             )
  126.           )
  127.         )
  128.          (progn
  129.            ;;(xdrx_setsstodb ss 0)
  130.            (setq ssl (sslength ss)
  131.                  i   -1
  132.            )
  133.            (if (or
  134.                  (= tf "1")
  135.                  e0
  136.                )
  137.              (progn
  138.                ;;(while (setq e (xdrx_getentdata 0))
  139.                (repeat ssl
  140.                  (setq e  (ssname ss (setq i (1+ i)))
  141.                        el (entget e)
  142.                  )
  143.                  (setq tp (xdl-dxf el 0))
  144.                  (cond
  145.                    ((= tp "CIRCLE")
  146.                     (setq cr (xdl-dxf el 10)
  147.                           r  (xdl-dxf el 40)
  148.                     )
  149.                     (setq d1 (+ (* 2 r) #xd_width)
  150.                           d2 (- (* 2 r) #xd_width)
  151.                     )
  152.                     ;;(setq xForm (xdrx_matrix_wcs2ucs))
  153.                     ;;(setq cr (xdrx_point_transform cr xForm))
  154.                     (command ".donut" d1 d2 cr "")
  155.                     (entdel e)
  156.                    )
  157.                    ((or
  158.                       (= tp "SPLINE")
  159.                       (= tp "ELLIPSE")
  160.                     )
  161.                     (setq tol (getvar "viewsize")
  162.                           tol (/ tol 400.0)
  163.                     )
  164.                     (setvar "plinewid" #xd_width)
  165.                     (setvar "osmode" 0)
  166.                     (setq el (acet-geom-object-point-list e h)) ;_此处使用了ET函数
  167.                     (apply
  168.                       'command
  169.                       (cons ".pline" el)
  170.                     )
  171.                     (command "")
  172.                     (entdel e)
  173.                    )
  174.                    ((wcmatch tp "*POLYLINE")
  175.                     (command ".pedit" e "w" #xd_width "")
  176.                    )
  177.                    ((or
  178.                       (= tp "ARC")
  179.                       (= tp "LINE")
  180.                     )
  181.                     (command ".pedit" e "y" "w" #xd_width "")
  182.                    )
  183.                  )
  184.                )
  185.              )
  186.              (progn
  187.                (setq ssl (sslength ss)
  188.                      i         -1
  189.                )
  190.                ;;(while (setq e (xdrx_getentdata 0))
  191.                (repeat ssl
  192.                  (setq e  (ssname ss (setq i (1+ i)))
  193.                        el (entget e)
  194.                  )
  195.                  (setq e40 (xdl-dxf el 40))
  196.                  (command ".pedit" e "w" (* e40 sc) "")
  197.                )
  198.              )
  199.            )
  200.          )
  201.       )
  202.       ;;(xdrx_ucsoff)
  203.       ;;(xdrx_end)
  204.       (command ".undo" "end")
  205.       (if ucstf
  206.         (command ".ucs" "p")
  207.       )
  208.       (setq *error* olderr)
  209.       (setvar "osmode" oldos)
  210.     )
  211.   )
  212.   (setvar "plinewid" oldwid)
  213.   (princ)
  214. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 8612个

财富等级: 富甲天下

发表于 2006-1-10 13:55:23 | 显示全部楼层
这一部分要调一下,要不回车不相应。

  1. (or (setq e0 (entsel "\n请选择匹配源(回车输入加粗方式): "))
  2.           (progn
  3.             (initget "1 2")
  4.             (setq tf (getkword "\n请选择方式[1:加粗 2:变比]<1>:"))
  5.             (if        (not tf)
  6.               (setq tf "1")
  7.               tf
  8.             )
  9.           )
  10.       )

同时把后面的这句话删掉。

  1. (if (not tf)
  2.            (setq tf "1")
  3.          )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-1-12 12:34:54 | 显示全部楼层
这个程序对某些多义线不能进行处理,返回错误是:
“The object is not parallel to the UCS.”
下面贴一个我写的函数,可以处理这类多义线(没有考虑SPLINE)
[PHP]
;改变ent的宽度为wid 测试:(chgwd (car(entsel)) (getreal))
(defun chgwd ( ent wid / ent1 entn ent210 cen rad lay8 d1 d2 )
(setq ent1 (entget ent) entn (cdr (assoc 0 ent1)) ent210 (cdr (assoc 210 ent1)))
(if (member entn '("VERTEX" "POLYLINE" "LWPOLYLINE" "LINE" "ARC" "CIRCLE")) (progn
    (if (not (equal ent210 '(0.0 0.0 1.0)))  ;;实体与当前UCS不平行时,将当前UCS设为实体UCS
       (progn
           (vl-cmdf "ucs" "save" "ch_ucs1") (if (= (getvar "cmdactive") 1) (command "y")) ;;改变UCS前先存
           (if (>= (atof (getvar "ACADVER")) 15.0) (command "ucs" "n" "ob" ent) (command "ucs" "ob" ent))
    )); end of if;因为线与当前UCS不平行时,PEDIT命令不能修改线宽
  (cond
    ((or(= entn "VERTEX")(= entn "POLYLINE")(= entn "LWPOLYLINE"))(command "pedit" ent "w" wid ""))
    ((or (= entn "LINE") (= entn "ARC")) (command "pedit" ent "y" "w" wid ""))
    ((= entn "CIRCLE") (progn
      (setq cen (cdr (assoc 10 (entget ent)))
            cen (trans cen ent 1)
            rad (cdr (assoc 40 (entget ent)))
            lay8 (cdr (assoc 8 (entget ent)))
            d1 (- (* 2 rad) wid)
            d2 (+ (* 2 rad) wid)
        )
      (command "donut" d1 d2 cen "") ;;;erase circle ,create donut
      ;;(subdxf (entlast) 8 lay8)  ;;改变至圆所在的图层
      (entdel ent)
      ))
  )  ;;;cond
  (if (and ent210 (not (equal ent210 '(0.0 0.0 1.0)))) (vl-cmdf "ucs" "restore" "ch_ucs1"))  ;恢复UCS
));;end of if
)  ;end of defun
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-13 11:10:44 | 显示全部楼层
ea, ucs下圆圈会跑掉...
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-18 00:33 , Processed in 0.206575 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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