找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 21|回复: 4

[lisp] 绘制箭头程序(直箭头,弯箭头,大弯箭头)

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-10-8 21:04:52 | 显示全部楼层 |阅读模式

  1. (defun C:jt()
  2.   (prompt "\n绘制箭头")
  3.   (setvar "cmdecho" 0)
  4.   (setq oldmode (getvar "osmode"))
  5.   (setvar "osmode" 0)  ;关闭扑捉
  6.   
  7.   (initget "A B C")
  8.   (setq enda (getkword "\n直箭头A/弯箭头B/大弯箭头<C> <A>")
  9.         enda (if enda enda "A"))
  10.         
  11.    (while (setq p1 (getpoint "\n箭头的尖端位置:")
  12.         p2 (getpoint p1 "\n箭头的另一端:")
  13.         dd (distance p1 p2))
  14.   (prompt (rtos dd 2 4))
  15.   (setq w (* dd 1.2)
  16.         an (angle p1 p2)
  17.         p3 (polar p2 (+ an (* pi 0.5)) (/ w 2.0))
  18.         p4 (polar p2 (+ an (* pi 1.5)) (/ w 2.0)))
  19.   (if (= enda "A")
  20.   (progn
  21.   (command "solid" p1 p3 p1 p4 ""
  22.            "pline" p2 "w" (* w 0.4) (* w 0.4) (polar p2 an (getdist p2)) "")
  23.    )
  24.    )
  25.    (if (= enda "B")
  26.    (command "pline" p1 "w" "0" w p2 "w" (* w 0.4) (* w 0.4) "a" pause "")
  27.    )
  28.    (if (= enda "C")
  29.    (command "pline" p1 "w" "0" w p2 "w" (* w 0.4) (* w 1.2) "a" pause "")
  30.     )
  31.     (if (= p1 nil) (exit))
  32.     )
  33.   (setvar "osmode" oldmode)
  34.   (prin1)
  35. )
复制代码

本帖子中包含更多资源

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

×

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-10-8 21:10:09 | 显示全部楼层
  1. ;;;;;;;;;;;;;;;;;;;;;;;;箭头工具
  2. (defun C:jt()
  3.   (prompt "\n绘制箭头")
  4.   (setvar "cmdecho" 0)
  5.   (setq oldmode (getvar "osmode"))
  6.   (setvar "osmode" 0)  ;关闭扑捉
  7.   
  8.   (initget "A B C")
  9.   (setq enda (getkword "\n直箭头A/弯箭头B/大弯箭头<C> <A>")
  10.         enda (if enda enda "A"))
  11.          
  12.   (while (setq p1 (getpoint "\n箭头的尖端位置:"))
  13.         (setq p2 (getpoint p1 "\n箭头的另一端:")
  14.               dd (distance p1 p2))
  15.   (prompt (rtos dd 2 4))
  16.   (setq w (* dd 1.0)
  17.         an (angle p1 p2)
  18.         p3 (polar p2 (+ an (* pi 0.5)) (/ w 4.0))
  19.         p4 (polar p2 (+ an (* pi 1.5)) (/ w 4.0)))
  20.   
  21.   (if (= enda "A")
  22.   (progn
  23.   (command "solid" p1 p3 p1 p4 ""
  24.            "pline" p2 "w" (* w 0.2) (* w 0.2) (polar p2 an (getdist p2)) "")
  25.    )
  26.    )
  27.    (if (= enda "B")
  28.    (progn
  29.   (command "solid" p1 p3 p1 p4 ""
  30.            "pline" p2 "w" "0" w p2 "w" (* w 0.2) (* w 0.2) "a" pause "")
  31.    )
  32.    )
  33.    (if (= enda "C")
  34.    (progn
  35.   (command "solid" p1 p3 p1 p4 ""
  36.            "pline" p2 "w" "0" w p2 "w" (* w 0.2) (* w 0.6) "a" pause "")
  37.    )
  38.    )
  39.     (if (= p1 nil) (exit))
  40.     )
  41.   (setvar "osmode" oldmode)
  42.   (prin1)
  43. )
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-10-8 21:13:47 | 显示全部楼层
  1. (defun c:tt ()
  2.    (vl-load-com)
  3.    (setq acad (vlax-get-acad-object))
  4.    (setq acaddocument (vla-get-activedocument acad))
  5.    (setq mspace (vla-get-modelspace acaddocument))
  6.    (setq h (getreal "\n请输入偏移距离"))
  7. (setq endata (entsel "\n请选择一条线"))
  8.    (setq ename (car endata))
  9.    (setq p0 (cadr endata))
  10.    (setq obj (vlax-ename->vla-object ename))
  11.    (setq l1 (car (vlax-safearray->list (vlax-variant-value (vla-offset obj h)))))           ;偏移曲线1
  12.    (setq l2 (car (vlax-safearray->list (vlax-variant-value (vla-offset obj (* -1 h))))))    ;偏移曲线2
  13.    (setq p1 (vlax-curve-getclosestpointto l1 p0 t))      ;插入点1
  14.    (setq p2 (vlax-curve-getclosestpointto l2 p0 t))      ;插入点2
  15.    (vla-delete l1)    ;删除曲线1
  16.    (vla-delete l2)    ;删除曲线2
  17.    (setq ang1 (angle p2 p1))  ;插入点1 点2角度
  18.    (setq ang2 (- ang1 (/ pi 2)))  ;计算直线角度或者曲线的切线角度
  19.    (setq obj (vla-insertblock mspace (vlax-3d-point p2) "11005" 1 1 1 ang2)) ;插入块名为11005的图块
  20.    (setq loop t)
  21.   (while loop
  22.     (setq code (grread t 8))
  23.     (cond
  24.      ((= (car code) 5)
  25.     (setq ang3 (- (angle p0 (cadr code)) ang2))     ;光标所在点与单选点的角度减去直线的或者曲线切线的角度
  26.     (if (< ang3 0)
  27.         (setq ang3 (+ ang3 (* 2 pi))))
  28.      (cond
  29.         ((and (> ang3 0 ) (< ang3  (/ pi 2)))  
  30.          (vla-put-Rotation obj ang2)  
  31.          (vla-put-insertionpoint obj (vlax-3d-point p1))
  32.          )
  33.         ((and (> ang3 (/ pi 2)) (< ang3 pi))
  34.          (vla-put-Rotation obj (- ang2 pi))
  35.          (vla-put-insertionpoint obj (vlax-3d-point p1))
  36.          )
  37.         ((and (> ang3 pi) (< ang3  (* 3 (/ pi 2))))
  38.          (vla-put-Rotation obj (- ang2 pi))
  39.          (vla-put-insertionpoint obj (vlax-3d-point p2))
  40.          )
  41.         ((and (> ang3 (* 3 (/ pi 2))) (< ang3  (* 2 pi)))
  42.          (vla-put-Rotation obj ang2)
  43.          (vla-put-insertionpoint obj (vlax-3d-point p2))
  44.          )            
  45.        )
  46.     )
  47.    ((= code '(25 37)) (vla-delete obj))
  48.    (T (setq loop nil))
  49.    )
  50.    )
  51.   )
复制代码

本帖子中包含更多资源

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

×

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-10-8 21:14:10 | 显示全部楼层
  1. (defun c:crtk ()
  2.   (vl-load-com)
  3.           (setq acad (vlax-get-acad-object))
  4.           (setq acaddocument (vla-get-activedocument acad))
  5.           (setq mspace (vla-get-modelspace acaddocument))
  6.    (if (not (setq bl_data (vlax-ldata-get "bl_tools" "bl"))) ;读取本函数保存在图档中的数据,如果bl_data返回为空值,说明第一次运行本程序
  7.     (progn
  8.       ;第一次运行本程序,为确保程序正确运行,需要建立一个默认的原始数据。这个数据主要用于保存上次的设置,以便下次调用
  9.       ;数据格式为一个点对表,格式为:
  10.        (setq bl_data (list '(1 . 1) '(2 . 0) '(3 . "")));初始值(1.缩放系数)(2.偏移值)(3.块名)
  11.        ;创建默认数据
  12.       (vlax-ldata-put "bl_tools" "bl" bl_data) ;将默认数据保存到图档的字典中,以便下次调用
  13.       )
  14.     )
  15.   (setq s (cdr (assoc 1 bl_data)) ;取出缩放系数
  16.         h (cdr (assoc 2 bl_data)) ;取出偏移值
  17.         enblb (cdr (assoc 3 bl_data)) ;取出块名
  18.    )  ;恢复设置数据
  19.   (setq gr t)
  20.   
  21.   (while gr ;获取用户动作,在用户点击左键后退出循环
  22.   
  23.    (if(/= enblb "")
  24.      (progn
  25.         (initget "t r")
  26.         (setq endata (entsel (strcat"\n选择线[选择图块(t)][输入图块名(r)]:当前块<"(cdr (assoc 3 bl_data))">")))
  27.         );progn11
  28.      
  29.      (progn
  30.      (initget "t")
  31.      (setq enbl (getstring (strcat"\n输入图块名[选择图块(t)]当前块:<"(cdr (assoc 3 bl_data))">")))
  32.      (if(= enbl "t")
  33.      (progn
  34.      (setq enbl (entsel (strcat"\n选择块:当前块<"(cdr (assoc 3 bl_data))">")))
  35.      (setq enbla (entget (car enbl)))
  36.      (setq enblb (cdr (assoc 2 enbla)))
  37.      (vlax-ldata-put "bl_tools" "bl" (setq bl_data (subst (cons 3 enblb) (assoc 3 bl_data) bl_data)))
  38.      (setq endata (entsel (strcat"\n选择线:当前块<"(cdr (assoc 3 bl_data))">")))
  39.           );progn21
  40.      (progn
  41.      (command "pline" '(800 0) "w" "0" "400" '(0  0) "")
  42.      (command "block" enbl  '(0 0 ) (entlast) "")
  43.      (setq enblb enbl)
  44.      (vlax-ldata-put "bl_tools" "bl" (setq bl_data (subst (cons 3 enblb) (assoc 3 bl_data) bl_data)))
  45.      (setq endata (entsel (strcat"\n选择线:当前块<"(cdr (assoc 3 bl_data))">")) ));progn22
  46.     );if2
  47.      );progn12
  48.         );if1
  49.   
  50.      (if(= endata "t")
  51.      (progn
  52.      (setq enbl (entsel (strcat"\n选择块:当前块<"(cdr (assoc 3 bl_data))">")))
  53.      (setq enbla (entget (car enbl)))
  54.      (setq enblb (cdr (assoc 2 enbla)))
  55.      (vlax-ldata-put "bl_tools" "bl" (setq bl_data (subst (cons 3 enblb) (assoc 3 bl_data) bl_data)))
  56.      (setq endata (entsel (strcat"\n选择线:当前块<"(cdr (assoc 3 bl_data))">")))
  57.           );progn31
  58.     );if3
  59.      (if(= endata "r")
  60.      (progn
  61.      (setq enbl (getstring (strcat"\n输入图块名:当前块<"(cdr (assoc 3 bl_data))">")))
  62.      (setq enblb enbl)
  63.      (vlax-ldata-put "bl_tools" "bl" (setq bl_data (subst (cons 3 enblb) (assoc 3 bl_data) bl_data)))
  64.      (setq endata (entsel (strcat"\n选择线:当前块<"(cdr (assoc 3 bl_data))">")))
  65.           );progn41
  66.     );if4
  67.    
  68.           (if (= endata nil)
  69.           (setq gr nil)
  70.           (progn
  71.           (setq p0 (cadr endata))
  72.           (setq l1 (vlax-ename->vla-object (car endata)))
  73.           (setq p1 (vlax-curve-getclosestpointto l1 p0 t))
  74.           (setq ang1 (angle p1 (mapcar '+ p1 (vlax-curve-getfirstderiv l1 (vlax-curve-getparamatpoint l1 p1)))))
  75.           (setq p2 (polar p1 (+ ang1 (/ pi 2)) h))
  76.           (setq p3 (polar p1 (- ang1 (/ pi 2))  h))
  77.           (setq obj (vla-insertblock mspace (vlax-3d-point p2) enblb s s s ang1))
  78.           (setq loop t)
  79.   (princ (strcat"\n指定图块位置或[偏移距离(O)<" (rtos h) ">/缩放(S)]<" (rtos s) ">"))
  80.   (setq YH_mouse (grread T 5 0)) ;获取当前鼠标坐标。getpoint,grread等得到的点都是相对于用户的UCS坐标系的
  81.         (while (/= (car (setq YH_mouse (grread YH_mouse 1 0))) 3) ;获取用户动作,在用户点击左键后退出循环
  82.                         
  83.                           (cond
  84.                             ((= (car YH_mouse) 2) ;键盘输入
  85.                            (setq YH_keyb (strcase (chr (cadr YH_mouse))))
  86.                            (cond
  87.                              ((= YH_keyb "O") ;用户键入的是O键,响应修改偏移距离
  88.                              (setq h (getreal (strcat "\n输入偏移距离:当前值<" (rtos h) ">")))
  89.                               (if (/= h nil)
  90.                               (progn
  91.                               (vlax-ldata-put "bl_tools" "bl" (setq bl_data (subst (cons 2 h) (assoc 2 bl_data) bl_data)))
  92.                               (setq p2 (polar p1 (+ ang1 (/ pi 2)) h))
  93.                               (setq p3 (polar p1 (- ang1 (/ pi 2)) h))
  94.                                 );progn
  95.                                 );if
  96.                           );or21
  97.                                ((= YH_keyb "S") ;用户键入的是S键,响应修改大小
  98.                              (setq s (getreal (strcat "\n输入缩放系数:当前值<" (rtos s) ">")))
  99.                               (if (/= s nil)
  100.                               (progn
  101.                         (vlax-ldata-put "bl_tools" "bl" (setq bl_data (subst (cons 1 s) (assoc 1 bl_data) bl_data)))
  102.                                  (vla-delete obj)
  103.                                 (setq obj (vla-insertblock mspace (vlax-3d-point p2) enblb s s s ang1))       
  104.                             );progn
  105.                           );if
  106.                           );or22
  107.                              )
  108.                              );cond2
  109.                              (t
  110.                             (setq ang2 (- (angle p1 (cadr YH_mouse)) ang1))  
  111.                             (if (< ang2 0)(setq ang2 (+ ang2 (* 2 pi))))
  112.                              (cond
  113.                              ((and (> ang2 0 ) (< ang2 (/ pi 2)))               
  114.                               (vla-put-Rotation obj ang1)               
  115.                               (vla-put-insertionpoint obj (vlax-3d-point p2))
  116.                               )
  117.                              ((and (> ang2 (/ pi 2) ) (< ang2 pi))               
  118.                               (vla-put-Rotation obj (- ang1 pi))               
  119.                               (vla-put-insertionpoint obj (vlax-3d-point p2))
  120.                               )
  121.                              ((and (> ang2 pi ) (< ang2  (* 3 (/ pi 2))))               
  122.                               (vla-put-Rotation obj (- ang1 pi))               
  123.                               (vla-put-insertionpoint obj (vlax-3d-point p3))
  124.                               )
  125.                              ((and (> ang2 (* 3 (/ pi 2))) (< ang2  (* pi 2)))               
  126.                               (vla-put-Rotation obj ang1)               
  127.                               (vla-put-insertionpoint obj (vlax-3d-point p3))
  128.                               )
  129.                             )
  130.                                );t
  131.                            );cond
  132.                           
  133.          
  134.          ));while
  135.     ));while
  136. (princ "\n完成")
  137.   );end
复制代码

0

主题

0

回帖

26

积分

管理员

积分
26
 楼主| 发表于 2024-10-8 21:16:31 | 显示全部楼层
  1. ;;;--------箭头线----------
  2. (defun c:jt (/ olderr  txt pt pt1 pt2 pt3 i ku k1)
  3.     (setq olderr  *error*
  4.    *error* at_err
  5.     )
  6.     (setq oss (getvar "osmode"))
  7.     (PROMPT"\n标注内容: 1 上;2 下")
  8.     (WHILE(NOT(MEMBER(SETQ A(LAST(GRREAD)))'(49 50))))
  9.     (SETQ TXT(COND((= A 49)"上")((= A 50)"下")))
  10.     (setq pt0 (getpoint "\nPick point:"))
  11.     (if (setq pt1 pt0)
  12. (progn (setq i 0)
  13.         (while (setq pt2 (getpoint pt1 "\nPick point:"))
  14.      (setq ku (angle pt1 pt2))
  15.      (setq k1 (+ ku pi))
  16.                    (setq pt (polar pt1 k1 300))
  17.      (setvar "osmode" 0)
  18.                    (setVar "OrthoMode" 1)
  19.                   
  20.      (if (= i 0)
  21.         (command "._text" "j" "mc" pt 350 0 txt)
  22.                       (command "Donut" "0" "100" pt0 "" );画箭头线起点圆点   
  23.      )
  24.      (command "line" pt1 pt2 "")
  25.      (command "")
  26.      (setq pt1 pt2
  27.     i   (1+ i)
  28.      )
  29.         )
  30.         (setq pt3 (polar pt1 k1 300))
  31.         (command "Pline" pt1 "W" "0" "60" pt3 "")
  32.          )
  33.     )
  34.     (setq *error* olderr)
  35.     (setvar "osmode" oss)
  36.     (princ)
  37. )
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-27 07:51 , Processed in 0.143988 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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