乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
楼主: tjjackson

[编程交流] LISP例程帮助

[复制链接]

3

主题

18

帖子

15

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 19:21:18 | 显示全部楼层
  1. ;;; THIS LISP WILL TAKE A LINE ON AN EXPLOPED
  2. ;;; PROFILE AND CALCULATE THE SLOPE
  3. ;;;
  4. ;;; THE LISP WILL ASK THE USER FOR THE RATIO
  5. ;;; OF THE PROFILE IN QUESTION (IE: 10:1 , ]
  6. ;;; 5:1 AND SO ON).
  7. ;;;
  8. ;;; NEXT THE USER WILL SELECT THE LINE IN QUESTION
  9. ;;; AND WILL PLACE THE SLOPE ON THE LINE AT THE MID-POINT
  10. ;;;
  11. ;;;
  12. ;;;   This program is free software: you can redistribute it and/or modify
  13. ;;;    it under the terms of the GNU General Public License as published by
  14. ;;;    the Free Software Foundation, either version 3 of the License, or
  15. ;;;    (at your option) any later version.
  16. ;;;
  17. ;;;    This program is distributed in the hope that it will be useful,
  18. ;;;    but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. ;;;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20. ;;;    GNU General Public License for more details.
  21. ;;;
  22. ;;;    You should have received a copy of the GNU General Public License
  23. ;;;    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  24. ;;;
  25. ;;;
  26. ;;;
  27. ;;; SLOPELINE.LSP - COPYRIGHT 2014 BY J. SHAWN YOUNG
  28. ;;;
  29. ;;;
  30. ;;; VERSION 1.0 - INITIAL STATE
  31. ;;;
  32. ;;; VERSION 2.0 2014-11-26
  33. ;;;                - RE-WROTE LISP TO BE MORE EFFICENT
  34. ;;;                - NO MORE NEGITIVE SLOPES
  35. ;;;                - ALLOW FOR SELECTION SETS OF LINES AND POLYLINES
  36. ;;;
  37. ;;; VERSION 2.1 2014-11-26
  38. ;;;                - FIXED ISSUED WITH TEXT COMING IN UPSIDE DOWN
  39. ;;;                IF LINE WAS DRAWN RIGHT TO LEFT
  40. ;;;
  41. ;;;
  42. ;;;
  43. ;;;
  44. (DEFUN C:SLOPELINE (/      PT1    PT2    PT1_Y  PT1_X  PT2_Y         PT2_X        RATIO
  45.        SSET   OBJ    RISE   RUN           SLOPE  MIDPOINT        ANG
  46.        ANG2   LEN    LST    COUNT  LAYER  ITEM         COUNT        CHECK
  47.        N STYTEXT len2
  48.       )
  49. (vl-load-com)
  50. ;;;                SELECTION SET                ;;;
  51. (SETQ        SSET                                ;BEGIN SETQ
  52. (SSGET                                ;BEGIN SSGET
  53.    '(
  54.      (-4 . "<XOR")                ;BEGIN XOR
  55.      (0 . "LWPOLYLINE")                ;GET POLYLINE
  56.      (0 . "LINE")                ;GET LINE
  57.      (-4 . "XOR>")                ;END XOR
  58.     )
  59. )                                ;END SSGET
  60. )                                        ;END SETQ
  61. (SETQ                                        ;BEGIN SETQ
  62.    COUNT (SSLENGTH SSET)                ;SET COUNT TO SELECTION SET LENGTH
  63.    N          0                                ;N TO 0
  64.    RATIO 1
  65. )                                        ;END SETQ
  66. ;;;        CHECK AND SET TEXT STYLE        ;;;
  67. (COMMAND "CMDECHO" 0)                        ;ECHO OFF
  68. (setq stytext (tblsearch "style" "AE-25")) ;SEARCH FOR AE-25
  69. (if                                        ;BEGINS PROCESS FOR MAKING AE-25
  70.    (or
  71.      (= NIL stytext)
  72.      (/= (cdr (assoc 40 stytext)) 0.0)
  73.    )
  74.     (command "-style" "AE-25" "arial" "a" "y" "N" "2.5" "1.0" "0" "n"
  75.       "n")
  76. )                                        ;END IF
  77. ;;;        CHECK AND SET TEXT STYLE        ;;;
  78. (SETQ LAYER (TBLSEARCH "LAYER" "C-ANNO-TEXT"))
  79. (IF
  80.    (= NIL LAYER)
  81.     (COMMAND "-LAYER" "N" "C-ANNO-TEXT" "S" "C-ANNO-TEXT" "C" "2" "" "")
  82. )
  83. (IF
  84.    (/= LAYER NIL)
  85.     (COMMAND "-LAYER" "S" "C-ANNO-TEXT" "")
  86. )
  87. ;;;        BEGIN MAIN FUNCTION                ;;;
  88. (WHILE                                ;BEGIN IF
  89.    (> COUNT N)                                ;LOGIC STATEMENT
  90.     (PROGN                                ;BEGIN PROGN
  91.       (SETQ                                ;BEGIN SETQ
  92. OBJ   (SSNAME SSET N)                ;GET NEXT OBJECT IN SELECTION SET
  93. OBJ   (VLAX-ENAME->VLA-OBJECT OBJ) ;CONVERT
  94. check (vlax-get obj 'objectname) ;get object name
  95. len   (vla-get-length obj)
  96. len2   (/ len 2)
  97.       )                                ;END SETQ
  98.       (IF                                ;BEGIN IF FOR LINE
  99. (= CHECK "AcDbLine")                ;LOGIC STATEMENT
  100.   (progn
  101.     (setq
  102.       ITEM (ENTGET (SSNAME SSET N))
  103.       PT1  (CDR (ASSOC 10 ITEM))
  104.       PT2  (CDR (ASSOC 11 ITEM))
  105.     )
  106.   )
  107.       )                                ;END IF FOR LINE
  108.       (IF                                ;BEGIN IF FOR POLYLINE
  109. (= CHECK "AcDbPolyline")        ;LOGIC STATEMENT
  110.   (setq                                ;BEGIN SETQ
  111.     lst        (vlax-get OBJ 'coordinates) ;GETS COORDINATES
  112.     LEN        (VLA-GET-LENGTH OBJ)        ;GET LENGTH
  113.     LEN2(/ LEN 2)                ;HALVE THE LENGTH
  114.     pT1        (list (car lst) (cadr lst)) ;GETS START POINT
  115.     lst        (reverse lst)                ;REVERSE LIST
  116.     pT2        (list (cadr lst) (car lst)) ;GETS END POINT
  117.   )
  118.       )                                ;END IF POLYLINE
  119.       (setq
  120. ANG   (ANGLE PT1 PT2)                ;GET ANGLE IN RADS
  121. ANG2  (/ (* ANG 180) PI)        ;CONVERTS ANGLE TO DEGREES
  122. PT1_X (CAR PT1)                ;GETS X OF START POINT
  123. PT1_Y (CADR PT1)                ;GETS Y OF START POINT
  124. PT2_X (CAR PT2)                ;GETS X OF END POINT
  125. PT2_Y (CADR PT2)                ;GETS Y OF END POINT
  126. RUN   (- PT2_X PT1_X)                ;GETS RUN
  127. RISE  (/ (- PT2_Y PT1_Y) RATIO)
  128.                                 ;GETS RISE AND DIVIDES BY RATIO
  129.       )                                ;END SETQ
  130.       (IF (> 0 RUN)                        ;BEGIN IF
  131. (SETQ RUN (* RUN -1))                ;IF RUN IS NEGITIVE TURN POSITIVE
  132.       )                                ;END IF
  133.       (IF (> 0 RISE)                        ;BEGIN IF
  134. (SETQ RISE (* RISE -1))        ;IF RUN IS NEGITIVE TURN POSITIVE
  135.       )                                ;END IF
  136.       (SETQ                                ;BEGIN SETQ
  137. SLOPE (* (/ RISE RUN) 100)        ;GETS SLOPE
  138.       )
  139.       (IF (> 0 SLOPE)                        ;BEGIN IF
  140. (SETQ SLOPE (* SLOPE -1))        ;IF RUN IS NEGITIVE TURN POSITIVE
  141.       )                                ;END IF
  142.       (SETQ
  143. MIDPOINT (POLAR PT1 ANG LEN2)
  144.       )                                ;END SETQ
  145. (if
  146. (< PT2_X PT1_X)
  147. (SETQ ANG2 (- ANG2 180)
  148. ))
  149.       (COMMAND "_TEXT" "J" "BC" MIDPOINT ANG2 ( RTOS len 2 3))
  150.       (SETQ N (+ 1 N))                        ;INCREASE N BY 1
  151.     )                                        ;END PROGN
  152. )                                        ;END IF
  153. (COMMAND "CMDECHO" 1)
  154. (PRINC)
  155. )
  156. ;END DEFUN

 
我写这篇文章是为了给出展开剖面上的斜率。对其进行修改,使其与您保持距离。
回复

使用道具 举报

1

主题

9

帖子

8

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 19:26:27 | 显示全部楼层
令人惊叹的谢谢你的帮助。
有没有办法更改文字方向、文字样式、大小和精度?我们对这些图纸的标准是零旋转和四舍五入到最近的英尺。(例如:232’)
回复

使用道具 举报

3

主题

18

帖子

15

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-5 19:27:17 | 显示全部楼层
在此处更改文字样式和图层
  1. ;;;        CHECK AND SET TEXT STYLE        ;;;
  2. (COMMAND "CMDECHO" 0)                        ;ECHO OFF
  3. (setq stytext (tblsearch "style" "AE-25")) ;SEARCH FOR AE-25
  4. (if                                        ;BEGINS PROCESS FOR MAKING AE-25
  5.    (or
  6.      (= NIL stytext)
  7.      (/= (cdr (assoc 40 stytext)) 0.0)
  8.    )
  9.     (command "-style" "AE-25" "arial" "a" "y" "N" "2.5" "1.0" "0" "n"
  10.       "n")
  11. )                                        ;END IF
  12. ;;;        CHECK AND SET TEXT STYLE        ;;;
  13. (SETQ LAYER (TBLSEARCH "LAYER" "C-ANNO-TEXT"))
  14. (IF
  15.    (= NIL LAYER)
  16.     (COMMAND "-LAYER" "N" "C-ANNO-TEXT" "S" "C-ANNO-TEXT" "C" "2" "" "")
  17. )
  18. (IF
  19.    (/= LAYER NIL)
  20.     (COMMAND "-LAYER" "S" "C-ANNO-TEXT" "")

 
在此处为您的旋转和感知进行更改
 
  1. (if
  2. (< PT2_X PT1_X)
  3. (SETQ ANG2 (- ANG2 180)
  4. ))
  5.       (COMMAND "_TEXT" "J" "BC" MIDPOINT [b]ANG2[/b] ( RTOS len 2 [b]3[/b]))
  6.       (SETQ N (+ 1 N))                        ;INCREASE N BY 1
  7.     )                                        ;END PROGN
  8. )                                        ;END IF

 
将ang2更改为旋转角度,将3更改为0设置感知。
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

铜币
-7
发表于 2022-7-5 19:29:43 | 显示全部楼层
嗨tj
 
这里是一个lisp,用于在每个可能的对极-pevious_极之间绘制线。
它还写下它旁边每一行的长度;该数字表示三维线的实际长度。它适用于您的图形,分解一次,因此每个极点是一个独立的块。
它使用直线,因为块位于特定高程,因此多段线只能投影到平面中,例如z=0。即便如此,也很难找到正确的极点序列,因为有许多交点,极点的编号顺序不明确,并且使用了字母数字系统,这使得排序更加困难。
文本,表示行的长度。。。我不熟悉英制单位,因此文字高度是硬编码的(5个单位,就像我在dwg中找到的文字)。如果文本高度取决于特定设置(如ltscale、dimscale、注释比例等),我可以更改它。
 
  1. (defun c:pole_line ( / *error* acDoc ms ht ss i e p a pn pp pole_list prev_list p1 p2 pt txt)
  2. (setq acDoc (vla-get-activedocument (vlax-get-acad-object)))
  3. (setq ms (vlax-get acDoc (if (= 1 (getvar 'cvport)) 'paperspace 'modelspace)))
  4. ;;;  (setq ht (/ (if (zerop (getvar 'measurement)) 0.1 2.5) (cond ((getvar 'cannoscalevalue)) (1.0))))
  5. (setq ht 5.0)
  6. (vla-startundomark acDoc)
  7. (defun *error* (msg)
  8.    (and
  9.      msg
  10.      (not (wcmatch (strcase msg) "*CANCEL*,*QUIT*,*EXIT*"))
  11.      (princ (strcat "\nError: " msg))
  12.      )
  13.    (vla-endundomark acDoc)
  14.    (princ)
  15.    )
  16. (if
  17.    (setq ss (ssget '((0 . "INSERT"))))
  18.    (progn
  19.      (repeat (setq i (sslength ss))
  20.        (setq e (vlax-ename->vla-object (ssname ss (setq i (1- i))))
  21.              p (vlax-get e 'InsertionPoint)
  22.              a (vlax-invoke e 'GetAttributes)
  23.              pn nil pp nil
  24.              )
  25.        (foreach x a
  26.          (cond
  27.            ((eq (vla-get-tagstring x) "POLE_NUM")
  28.             (setq pn (vla-get-textstring x))
  29.             )
  30.            ((eq (vla-get-tagstring x) "PREV_POLE")
  31.             (setq pp (vla-get-textstring x))
  32.             )
  33.            )
  34.          )
  35.        (if pn (setq pole_list (cons (list pn pp p) pole_list))
  36.          (if pp (setq prev_list (cons (list pp p) prev_list)))
  37.          )
  38.        )
  39.      (foreach p2 pole_list
  40.        (if
  41.          (or
  42.            (setq p1 (assoc (cadr p2) pole_list))
  43.            (setq p1 (assoc (cadr p2) prev_list))
  44.            )
  45.          (progn
  46.            (setq p1 (last p1) p2 (last p2)
  47.                  a  (angle p1 p2)
  48.                  a  (if (< (* pi 0.5) a (* pi 1.25)) (- a (/ pi 2.0)) (+ a (/ pi 2.0)))
  49.                  pt (polar (mapcar '(lambda (a b) (* (+ a b) 0.5)) p1 p2) a (* ht 2.0))
  50.                  )
  51.            (entmake (list '(0 . "LINE") (cons 10 p1) (cons 11 p2)))
  52.            (setq txt (vla-addtext ms (rtos (distance p1 p2) 2 0) (vlax-3D-point 0.0 0.0 0.0) ht))
  53.            (vla-put-alignment txt acalignmentmiddlecenter)
  54.            (vla-put-textalignmentpoint txt (vlax-3D-point pt))
  55.          )
  56.        )
  57.      )
  58.    )
  59. )
  60. (vla-endundomark acDoc)
  61. (princ)
  62. )
回复

使用道具 举报

1

主题

9

帖子

8

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 19:32:58 | 显示全部楼层
斯特凡,
 
 
这真是难以置信。它工作得很好。您可以将其更改为绘制多段线和测量二维点吗?我们正在测量跨度长度,需要2D距离。如果线宽可以是1,那就太好了。此外,我们可以将文本大小更改为10并添加ft标记(')后缀吗?如果没有,是否可以将文字更改为标注文字,并使用dimstyle添加ft标记?
 
 
非常感谢你的帮助。这将节省很多时间。
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

铜币
-7
发表于 2022-7-5 19:36:38 | 显示全部楼层
不客气,tj。
 
您可以考虑完成文本高度和英尺标记。
我之前的帖子解释了我为什么用台词。但是,我可以切换到0.0高程的多段线,但每个多段线只有一段(意味着它们不在单个对象中连接)。这对你有好处吗?
回复

使用道具 举报

1

主题

9

帖子

8

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 19:40:17 | 显示全部楼层
完美的是的,请切换到多段线。我们希望它们是单独的部分,而不是一个实体。再次感谢你的帮助。
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

铜币
-7
发表于 2022-7-5 19:45:07 | 显示全部楼层
那么图层、颜色呢?
回复

使用道具 举报

1

主题

9

帖子

8

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 19:46:26 | 显示全部楼层
我喜欢它目前的设置方式。它将线条和文字放置在当前层中。
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

铜币
-7
发表于 2022-7-5 19:51:36 | 显示全部楼层
给你。。。
  1. (defun c:pole_line ( / *error* acDoc ms ht ss i e p a pn pp pole_list prev_list p1 p2 pt txt)
  2. (setq acDoc (vla-get-activedocument (vlax-get-acad-object)))
  3. (setq ms (getvar 'ctab))
  4. (vla-startundomark acDoc)
  5. (defun *error* (msg)
  6.    (and
  7.      msg
  8.      (not (wcmatch (strcase msg) "*CANCEL*,*QUIT*,*EXIT*"))
  9.      (princ (strcat "\nError: " msg))
  10.      )
  11.    (vla-endundomark acDoc)
  12.    (princ)
  13.    )
  14. (if
  15.    (setq ss (ssget '((0 . "INSERT"))))
  16.    (progn
  17.      (repeat (setq i (sslength ss))
  18.        (setq e (vlax-ename->vla-object (ssname ss (setq i (1- i))))
  19.              p (reverse (cdr (reverse (vlax-get e 'InsertionPoint))))
  20.              a (vlax-invoke e 'GetAttributes)
  21.              pn nil pp nil
  22.              )
  23.        (foreach x a
  24.          (cond
  25.            ((eq (vla-get-tagstring x) "POLE_NUM")
  26.             (setq pn (vla-get-textstring x))
  27.             )
  28.            ((eq (vla-get-tagstring x) "PREV_POLE")
  29.             (setq pp (vla-get-textstring x))
  30.             )
  31.            )
  32.          )
  33.        (if pn (setq pole_list (cons (list pn pp p) pole_list))
  34.          (if pp (setq prev_list (cons (list pp p) prev_list)))
  35.          )
  36.        )
  37.      (foreach p2 pole_list
  38.        (if
  39.          (or
  40.            (setq p1 (assoc (cadr p2) pole_list))
  41.            (setq p1 (assoc (cadr p2) prev_list))
  42.            )
  43.          (progn
  44.            (setq p1 (last p1) p2 (last p2)
  45.                  a  (angle p1 p2)
  46.                  a  (if (< (* pi 0.5) a (* pi 1.25)) (- a (/ pi 2.0)) (+ a (/ pi 2.0)))
  47.                  pt (polar (mapcar '(lambda (a b) (* (+ a b) 0.5)) p1 p2) a 15.0)
  48.                  )
  49.            (entmake
  50.              (list
  51.                '(0 . "LWPOLYLINE")
  52.                '(100 . "AcDbEntity")
  53.                (cons 410 ms)
  54.                '(100 . "AcDbPolyline")
  55.                '(90 . 2)
  56.                '(70 . 0)
  57.                (cons 10 p1)
  58.                '(40 . 1.0)
  59.                '(41 . 1.0)
  60.                (cons 10 p2)
  61.                '(40 . 1.0)
  62.                '(41 . 1.0)
  63.                '(210 0.0 0.0 1.0)
  64.              )
  65.            )
  66.            (entmake
  67.              (list
  68.                '(0 . "TEXT")
  69.                '(100 . "AcDbEntity")
  70.                (cons 410 ms)
  71.                '(100 . "AcDbText")
  72.                (cons 10 pt)
  73.                '(40 . 10.0)
  74.                (cons 1 (strcat (rtos (distance p1 p2) 2 0) "'"))
  75.                '(50 . 0.0)
  76.                (cons 7 (getvar "textstyle"))
  77.                '(72 . 1)
  78.                (cons 11 pt)
  79.                '(73 . 2)
  80.              )
  81.            )
  82.          )
  83.        )
  84.      )
  85.    )
  86. )
  87. (vla-endundomark acDoc)
  88. (princ)
  89. )

 
等待评论,TJ。。。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-12 14:01 , Processed in 0.600200 second(s), 70 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表