明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2092|回复: 5

[提问] 请问这个自动标注用lisp怎么写

  [复制链接]
发表于 2014-6-29 22:48 | 显示全部楼层 |阅读模式
5明经币
请问框选任意角度排列的N多彼此平行的直线,就能一次性自动标注出各直线间的距离,用lisp要怎么写

最佳答案

发表于 2014-6-29 22:48 | 显示全部楼层
  1. (defun C:TT (/           A         ANG   B     DIMSTYLE         E     E1    ENTL
  2.              ELIST MPT         MPT1  P1    P2           PT         PT1   PT2   PTI
  3.              PTS   SS         V10
  4.             )
  5.   (setvar "cmdecho" 0)
  6.   (setq DIMSTYLE (getvar "dimstyle"))        ; _标注样式,可以修改成自己需要的
  7.   (if (and (setq PT1 (getpoint "\n点取【逐点标注】起始点<退出>:"))
  8.            (setq PT2 (getpoint PT1 "结束点<退出>:"))
  9.            (setq SS (ssget "c" PT1 PT2 '((0 . "LINE"))))
  10.       )
  11.     (progn
  12.       ;;1.
  13.       ;;标注的角度ang按第一条线来定,省去了过滤角度不一样的线,
  14.       ;;其实是我觉得太麻烦了,手上又没有通用函数。偷懒了。呵呵
  15.       (setq E1 (ssname SS 0))
  16.       (setq P1 (CJW-DXF E1 10))
  17.       (setq P2 (CJW-DXF E1 11))
  18.       (setq ANG (angle P1 P2))


  19.       (princ "\n选择不需要标注的线<无>:")
  20.       (command "._select"
  21.                SS
  22.                "r"
  23.                PAUSE
  24.       )

  25.       (if (setq SS (ssget "_P"))
  26.         (progn
  27.           ;;2.
  28.           ;;计算标注基点们pts的位置
  29.           (setq MPT (CJW-PT-MID PT1 PT2))
  30.           (setq        PTS
  31.                  (mapcar '(lambda (E)
  32.                             (setq P1 (CJW-DXF E 10))
  33.                             (setq P2 (CJW-DXF E 11))
  34.                             (setq MPT1 (polar MPT (+ (* 0.5 pi) ANG) 1))
  35.                             (inters MPT1 MPT P1 P2 NIL)
  36.                           )
  37.                          (CJW-SS->ENAMES SS)
  38.                  )
  39.           )
  40.           (setq PTS (CJW-SORT-PTBYDIS PT1 PTS)) ;_点排序
  41.           (setq PTS (mapcar 'list PTS (cdr PTS))) ;_生成标注基点表

  42.           (if (setq PT (getpoint MPT "\n点取尺寸线的位置<原位标注>:"))
  43.             (setq PT PT)
  44.             (setq PT MPT)
  45.           )

  46.           ;;3.
  47.           ;;标注的结果在此:
  48.           (foreach P PTS
  49.             (command "._dimlinear"
  50.                      "none"
  51.                      (car P)
  52.                      "none"
  53.                      (cadr P)
  54.                      "none"
  55.                      PT
  56.             )
  57.             (setq ENTL (entlast))
  58.             (setq ELIST (entget ENTL))
  59.             (setq V10 (cdr (assoc 10 ELIST)))

  60.             ;;标注对齐点
  61.             (setq PTI (inters
  62.                         PT
  63.                         (polar PT (+ ANG (* 0.5 pi)) 1)
  64.                         V10
  65.                         (polar V10 ANG 1)
  66.                         NIL
  67.                       )
  68.             )

  69.             (setq ELIST        (subst (cons 3 DIMSTYLE)
  70.                                (assoc 3 ELIST)
  71.                                ELIST
  72.                         )
  73.             ) ;_修改文字样式
  74.             (setq ELIST        (subst (cons 10 PTI)
  75.                                (assoc 10 ELIST)
  76.                                ELIST
  77.                         )
  78.             ) ;_修改标注对齐点
  79.             (setq ELIST        (subst (cons 50 (+ (* 0.5 pi) ANG))
  80.                                (assoc 50 ELIST)
  81.                                ELIST
  82.                         )
  83.             ) ;_修改标注角度

  84.             (entmod ELIST)

  85.           ) ;_foreach

  86.         ) ;_ss progn
  87.       ) ;_ss if

  88.     ) ;_and progn
  89.   ) ;_and if
  90.   (princ)
  91. )

  92. ;;;(CJW-PT-MID PT1 PT2)
  93. (defun CJW-PT-MID (A B)
  94.   (mapcar
  95.     '(lambda (A B) (* (+ A B) 0.5))
  96.     A
  97.     B
  98.   )
  99. )

  100. ;;;(CJW-SS->ENAMES (ssget))
  101. (defun CJW-SS->ENAMES (SS / ENAMES)
  102.   (setq I 0)
  103.   (while (< I (sslength SS))
  104.     (setq ENAMES (cons (ssname SS I) ENAMES))
  105.     (setq I (1+ I))
  106.   )
  107.   (reverse ENAMES)
  108. )

  109. ;;;(CJW-DXF (car (entsel)) 0)
  110. (defun CJW-DXF (ENAME ITEM)
  111.   (cdr (assoc ITEM (entget ENAME)))
  112. )

  113. ;;;(CJW-SORT-PTBYDIS PT PTS)
  114. (defun CJW-SORT-PTBYDIS        (PT PTS / COMS DISTS SORTS X Y)
  115.   (setq        DISTS (mapcar
  116.                 '(lambda (X)
  117.                    (distance X PT)
  118.                  )
  119.                 PTS
  120.               )
  121.   )
  122.   (setq        COMS (mapcar
  123.                '(lambda        (X Y)
  124.                   (list X Y)
  125.                 )
  126.                DISTS
  127.                PTS
  128.              )
  129.   )
  130.   (setq        SORTS (mapcar
  131.                 'cadr
  132.                 (vl-sort COMS
  133.                          '(lambda (X Y)
  134.                             (if        (equal (car X) (car Y) 1e-10)
  135.                               (<= (car (cadr X)) (car (cadr Y)))
  136.                               (< (car X) (car Y))
  137.                             )
  138.                           )
  139.                 )
  140.               )
  141.   )
  142.   SORTS
  143. )

  144. (princ)
回复

使用道具 举报

发表于 2014-6-30 07:57 | 显示全部楼层
1、框选直线;
2、循环取得直线的坐标点,并计算出角度;
3、按角度分类后按坐标排序;
4、按顺序标注直线距离。
回复

使用道具 举报

 楼主| 发表于 2014-7-1 08:09 | 显示全部楼层
ZZXXQQ 发表于 2014-6-30 07:57
1、框选直线;
2、循环取得直线的坐标点,并计算出角度;
3、按角度分类后按坐标排序;

Z版能不能帮忙写一个呀
回复

使用道具 举报

发表于 2014-7-1 12:42 | 显示全部楼层


本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2014-7-5 00:20 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-21 06:02 , Processed in 0.164516 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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