明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2035|回复: 5

[源码] 2点画Leader及批量修改Leader

[复制链接]
发表于 2015-9-4 12:15:42 | 显示全部楼层 |阅读模式
本帖最后由 waterchen 于 2015-9-4 13:37 编辑

   由于工作中经常要画或者修改Leader,要点3个点才能画1个Leader,修改就更麻烦了,所以就写了这个小程序.功能很简单,点2个点按设定的角度画Leader,或者按设定的角度修改有3个点的Leader.
  Angle:        设定角度;
  Inplaceof:用当前的Dimension style,当前设定的角度,重新画一次所选择的Leader;
  Select:       用当前设定的角度修改所选择的Leader(要有3个点的才成哦);
  From point:输入2个点画Leader.
  这是初学写的,没什么技术含量,高手就顠过吧。同时源码都给出来了,如有什么不好的地方,或者有不同的喜好,又或者有想改进的地方,请各自修改吧。
  1. (defun c:qt (/ oldang ang1 ang2 ang3 cc ent ent1 entla ent_data ent_data1 ent_data_n ent_pr hh input_type input_type1
  2.        i j pt_data pt1 pt2 pt3 pt4 pt3_dxf xpt1 xpt3 ypt1 ypt3 ss ss_lth ssla temp)
  3.   (defun *error* (msg)
  4.     (if (/=  msg "Function cancelled")     ; If an error (such as CTRL-C) occurs
  5.       (princ (strcat "\nError: " msg))    ; while this command is active...
  6.       )
  7.     (setvar "CMDECHO" 1)
  8.     (setvar "osmode" os)
  9.     (setq *error* olderr)               ; Restore old *error* handler
  10.     (princ)
  11.     )
  12.   (setq olderr *error*)
  13.   (if (null oldang) (setq oldang 60.0))
  14.   (setq os (getvar "osmode"))
  15.   (setvar "CMDECHO" 0)
  16.   (initget (+ 1 128) "Angle Inplaceof Select")
  17.   (setq input_type (getpoint "\nAngle/Inplaceof/Select/<From point>:"))
  18.   (cond ((= input_type "Angle")
  19.    (prompt "\nSetting Leader Angle.")
  20.    (setq ang1 nil)
  21.    (while (/= 'REAL (type ang1))
  22.      (initget (+ 2 4 128))
  23.      (setq ang1 (getreal (strcat "\nAngle of leader <" (rtos oldang 2 2) ">: ")))
  24.      (if (null ang1) (setq ang1 (* (/ oldang 180) PI)))
  25.      (if (= 'STR (type ang1)) (setq ang1 (eval (read ang1))))
  26.      (if (/= 'REAL (type ang1)) (princ "\nRequires numeric value."))
  27.      )
  28.    ;(setq ang1 (* (/ ang1 180) PI))
  29.    (setq oldang ang1)
  30.    
  31.    (initget (+ 1 128) "Inplaceof Select")
  32.    (setq input_type1 (getpoint "\nInplaceof/Select/<From point>:"))
  33.    (cond ((= input_type1 "Inplaceof") (setq ang1 (* (/ oldang 180) PI)) (Inplaceof_leader_drawing))
  34.          ((= input_type1 "Select") (setq ang1 (* (/ oldang 180) PI)) (select_leader_drawing))
  35.          ((= 'LIST (type input_type1))
  36.     (setq pt1 input_type1) (setq ang1 (* (/ oldang 180) PI)) (leader_drawing))
  37.          )
  38.    )
  39.   ((= input_type "Inplaceof") (setq ang1 (* (/ oldang 180) PI)) (Inplaceof_leader_drawing))
  40.   ((= input_type "Select") (setq ang1 (* (/ oldang 180) PI)) (select_leader_drawing))
  41.   ((= 'LIST (type input_type)) (setq ang1 (* (/ oldang 180) PI))
  42.    (setq pt1 input_type)
  43.    (leader_drawing)
  44.    )
  45.   )
  46.   (setvar "osmode" os)
  47.   (setvar "CMDECHO" 1)
  48.   (setq *error* olderr)
  49.   (princ)
  50.   )

  51. ;;; --------------------------- sub Program ---------------------------------;
  52. (defun select_leader_drawing ()
  53.   (prompt "\nChange of Select Leader.")
  54.   (SETQ SS (ssget '((0 . "LEADER"))))
  55.   ;(if (= ang1 0) (setq ang1 (/ PI 3)))
  56.   (setq ang2 (sin ang1))
  57.   (setq j 0)
  58.   (setq ss_lth 0)
  59.   (setq SS_lth (sslength ss))
  60.   (command "_.undo" "group")
  61.   (WHILE (< j SS_lth)
  62.     (setq i 0)
  63.     (setq pt1 nil)
  64.     (setq pt2 nil)
  65.     (setq pt3 nil)
  66.     (setq ent (ssname ss j))
  67.     (setq ent_data (entget ent))
  68.     (setq ent_pr ent_data)
  69.     (while (/= ent_pr nil)
  70.       (setq temp (car ent_pr))
  71.       (if (= (car temp) 10)
  72.   (if (/= pt1 nil)
  73.     (if (/= pt2 nil)
  74.       (setq pt3 (cdr temp))
  75.       (progn (setq pt2 (cdr temp)) (setq pt2_nth i))
  76.       )
  77.     (setq pt1 (cdr temp))
  78.     )
  79.   
  80.   )
  81.       (setq ent_pr (cdr ent_pr))
  82.       (setq i (+ i 1))
  83.       )
  84.    
  85.     (if (/= pt3 nil)
  86.       (progn
  87.   (setq ang3 (angle pt1 pt3))
  88.   (setq xpt1 (car pt1))
  89.   (setq ypt1 (car (cdr pt1)))
  90.   (setq xpt3 (car pt3))
  91.   (setq ypt3 (car (cdr pt3)))
  92.   (setq hh (abs (- ypt3 ypt1)))
  93.   (setq cc (/ hh ang2))
  94.   (if (< ang3 (* PI 0.5))
  95.     (setq pt2_n (polar pt1 ang1 cc)))
  96.   (if (and (> ang3 (* PI 0.5)) (< ang3 PI))
  97.     (setq pt2_n (polar pt1 (- PI ang1) cc)))
  98.   (if (and (> ang3 PI) (< ang3 (+ PI (* PI 0.5))))
  99.     (setq pt2_n (polar pt1 (+ PI ang1) cc)))
  100.   (if (and (> ang3 (+ PI (* PI 0.5))) (< ang3 (* PI 2)))
  101.     (setq pt2_n (polar pt1 (- (* PI 2) ang1) cc)))
  102.   (setq pt_data (cons 10 pt2_n))
  103.   (setq ent_data_n (subst pt_data (nth pt2_nth ent_data) ent_data))
  104.   (entmod ent_data_n)
  105.   )
  106.       )
  107.     (SETQ j (1+ j))
  108.     )
  109.   (command "_.UNDO" "END")
  110.   )

  111. ;;;==============================leader_drawing=============================
  112. (defun leader_drawing ()
  113.     (prompt "\nDrawing Leader.")
  114.     (initget (+ 32 128))
  115.     (setq pt3 (getpoint pt1 "\nInput leader sencond point:"))
  116.     (setvar "osmode" 0)
  117.     ;(if (= ang1 0) (setq ang1 (/ PI 3)))
  118.   (setq ang2 (sin ang1))
  119.   (setq ang3 (angle pt1 pt3))
  120.     (setq ssla nil)
  121.     (setq xpt1 (car pt1))
  122.     (setq ypt1 (car (cdr pt1)))
  123.   (setq xpt3 (car pt3))
  124.     (setq ypt3 (car (cdr pt3)))
  125.   (setq hh (abs (- ypt3 ypt1)))
  126.   (setq cc (/ hh ang2))
  127.   (if (< ang3 (* PI 0.5))
  128.       (progn  (setq pt2 (polar pt1 ang1 cc))
  129.         (setq pt4 (polar pt3 0 100))
  130.         (setq ssla (ssget "f" (list pt3 pt4)))
  131.     ))
  132.     (if (and (> ang3 (* PI 0.5)) (< ang3 PI))
  133.     (progn  (setq pt2 (polar pt1 (- PI ang1) cc))
  134.         (setq pt4 (polar pt3 pi 100))
  135.         (setq ssla (ssget "f" (list pt3 pt4)))
  136.     ))
  137.     (if (and (> ang3 PI) (< ang3 (+ PI (* PI 0.5))))
  138.     (progn  (setq pt2 (polar pt1 (+ PI ang1) cc))
  139.         (setq pt4 (polar pt3 pi 100))
  140.         (setq ssla (ssget "f" (list pt3 pt4)))
  141.     ))
  142.     (if (and (> ang3 (+ PI (* PI 0.5))) (< ang3 (* PI 2)))
  143.     (progn  (setq pt2 (polar pt1 (- (* PI 2) ang1) cc))
  144.         (setq pt4 (polar pt3 0 100))
  145.         (setq ssla (ssget "f" (list pt3 pt4)))
  146.     ))
  147.     (command "leader" pt1 pt2 pt3 "Annotation" "" "NONE")
  148.     (if (/= ssla nil)
  149.       (progn  (setq ent1 (entlast))
  150.         (setq ent (ssname ssla 0))
  151.         (setq ent_data1 (cdr (entget ent)))
  152.         (setq entla (cdr (assoc '8 ent_data1)))
  153.         (command "chprop" ent1 "" "la" entla "")
  154.      ))
  155. )

  156. ;;;==============================Inplaceof_leader_drawing=============================
  157. (defun Inplaceof_leader_drawing ()
  158.   (prompt "\nInplace of Select Leader.")
  159.   (setvar "osmode" 0)
  160.   (SETQ SS (ssget '((0 . "LEADER"))))
  161.   ;(if (= ang1 0) (setq ang1 (/ PI 3)))
  162.   (setq ang2 (sin ang1))
  163.   (setq j 0)
  164.   (setq ss_lth 0)
  165.   (setq SS_lth (sslength ss))
  166.   
  167.   (WHILE (< j SS_lth)
  168.     (setq i 0)
  169.     (setq pt1 nil)
  170.     (setq pt2 nil)
  171.     (setq pt3 nil)
  172.     (setq ent (ssname ss j))
  173.     (setq ent_data (entget ent))
  174.     (setq la (cdr (assoc 8 ent_data)))
  175.     (setvar "clayer" la)
  176.     (setq ent_pr ent_data)
  177.     (while (/= ent_pr nil)
  178.       (setq temp (car ent_pr))
  179.       (if (= (car temp) 10)
  180.   (if (/= pt1 nil)
  181.     (if (/= pt2 nil)
  182.       (setq pt3 (cdr temp))
  183.       (progn (setq pt2 (cdr temp)) (setq pt2_nth i))
  184.       )
  185.     (setq pt1 (cdr temp))
  186.     )
  187.   
  188.   )
  189.       (setq ent_pr (cdr ent_pr))
  190.       (setq i (+ i 1))
  191.       )
  192.    
  193.     (if (/= pt3 nil)
  194.       (progn
  195.   (setq ang3 (angle pt1 pt3))
  196.   (setq xpt1 (car pt1))
  197.   (setq ypt1 (car (cdr pt1)))
  198.   (setq xpt3 (car pt3))
  199.   (setq ypt3 (car (cdr pt3)))
  200.   (setq hh (abs (- ypt3 ypt1)))
  201.   (setq cc (/ hh ang2))
  202.   (if (< ang3 (* PI 0.5))
  203.     (setq pt2_n (polar pt1 ang1 cc)))
  204.   (if (and (> ang3 (* PI 0.5)) (< ang3 PI))
  205.     (setq pt2_n (polar pt1 (- PI ang1) cc)))
  206.   (if (and (> ang3 PI) (< ang3 (+ PI (* PI 0.5))))
  207.     (setq pt2_n (polar pt1 (+ PI ang1) cc)))
  208.   (if (and (> ang3 (+ PI (* PI 0.5))) (< ang3 (* PI 2)))
  209.     (setq pt2_n (polar pt1 (- (* PI 2) ang1) cc)))
  210.   (command "leader" pt1 pt2_n pt3 "Annotation" "" "NONE")
  211.   (entdel ent)
  212.   )
  213.       )
  214.     (SETQ j (1+ j))
  215.     )
  216.   (command "_.UNDO" "END")
  217.   )

  218. (princ)

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2015-9-4 14:25:23 | 显示全部楼层
谢谢楼主分享
发表于 2015-9-4 17:09:25 | 显示全部楼层
先收藏了。
发表于 2015-9-4 18:24:52 | 显示全部楼层
感谢 waterchen 分享程序!
发表于 2015-9-7 20:10:18 | 显示全部楼层
2点leader是很好! 但是代码这么长, 看看就望而却步了,[em0]
发表于 2015-9-11 10:42:34 | 显示全部楼层
感觉有点象QQ截图中的画箭头啊
感谢谢你的分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-29 03:50 , Processed in 0.193223 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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