天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 21|回复: 4

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

[复制链接]
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    99

    主题

    11

    回帖

    1234

    积分

    管理员

    积分
    1234
    QQ
    发表于 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. )
    复制代码

     

     

     

     

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

    本帖子中包含更多资源

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

    ×
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    99

    主题

    11

    回帖

    1234

    积分

    管理员

    积分
    1234
    QQ
     楼主| 发表于 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. )
    复制代码

     

     

     

     

    [lisp] 绘制箭头程序(直箭头,弯箭头,大弯箭头)
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    99

    主题

    11

    回帖

    1234

    积分

    管理员

    积分
    1234
    QQ
     楼主| 发表于 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.   )
    复制代码

     

     

     

     

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

    本帖子中包含更多资源

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

    ×
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    99

    主题

    11

    回帖

    1234

    积分

    管理员

    积分
    1234
    QQ
     楼主| 发表于 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



    复制代码

     

     

     

     

    [lisp] 绘制箭头程序(直箭头,弯箭头,大弯箭头)
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    99

    主题

    11

    回帖

    1234

    积分

    管理员

    积分
    1234
    QQ
     楼主| 发表于 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. )
    复制代码

     

     

     

     

    [lisp] 绘制箭头程序(直箭头,弯箭头,大弯箭头)
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-10-27 08:25 , Processed in 0.190213 second(s), 25 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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