乐筑天下

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

[编程交流] mdist lisp

[复制链接]

1

主题

5

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:08:48 | 显示全部楼层 |阅读模式
你好
在测量时,我遇到了一个将osnapz固定为1的问题。
此外,我需要一个错误处理,以确保在程序中断或退出后再次将osnapz设置为1。
 
解释:
我将osnapz设置为1,以避免测量三维点,从而在从二维视图测量时破坏我的结果。
 
  1. (defun c:mdist (/ )
  2. (setvar "osnapz" 1)
  3. (command "_dist" PAUSE "p")
  4. (setvar "osnapz" 0)
  5. )

 
这段代码将在我进行测量时将Var osnapz设置为0,所以这不好;(如何保持测量,并在lisp结束时将VAR osnapz设置为0(或在处理错误时,中断退出…)?
 
我知道还有其他lisp,但我喜欢在测量时使用默认的dist命令来查看直线。
 
谢谢你的帮助。
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 17:16:07 | 显示全部楼层
我建议这样做(如果您想在例程开始之前将osnapz设置为0,这样您可以确保在中断或终止时,osnapz将返回0;否则,如果已经设置为1,则将保留1,并在终止后保留)。。。
 
  1. (defun c:mdist ( / *error* osz )
  2. (defun *error* ( m )
  3.    (if osz
  4.      (setvar 'osnapz osz)
  5.    )
  6.    (if m
  7.      (prompt m)
  8.    )
  9.    (princ)
  10. )
  11. (setq osz (getvar 'osnapz))
  12. (setvar 'osnapz 1)
  13. (command "_.DIST" "\" "_P")
  14. (*error* nil)
  15. )
回复

使用道具 举报

1

主题

5

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:20:25 | 显示全部楼层
谢谢你的回复。
 
启动代码时,您的代码确实会将osnapz激活为1(这就是我想要的)。
但当我点击第一个测量点时,osnapz返回到0;(
 
但至少感谢您对错误的处理。
(顺便提一下,我从代码中删除了下划线bebore the P。在法语中,它用于多个)
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 17:22:16 | 显示全部楼层
这是:
http://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/reactors-with-lwpolyline/m-p/4315713/highlight/true#M312846
 
我个人使用单距离检查,但精度很高。。。
  1. (defun c:dii ( / p1 p2 d dx dy dz v dxw dyw dzw w ax vprim vprimd axy )
  2. (while (not p1) (setq p1 (getpoint "\nPick or specify start point : ")))
  3. (while (not p2) (setq p2 (getpoint p1 "\nPick or specify end point : ")))
  4. (setq d (distance p1 p2))
  5. (setq dx (car (setq v (mapcar '- p2 p1))))
  6. (setq dy (cadr v))
  7. (setq dz (caddr v))
  8. (setq dxw (car (setq w (mapcar '- (trans p2 1 0) (trans p1 1 0)))))
  9. (setq dyw (cadr w))
  10. (setq dzw (caddr w))
  11. (setq ax (cvunit (atan dy dx) "radians" "degrees"))
  12. (setq vprim (list (car v) (cadr v) 0.0))
  13. (setq vprimd (distance '(0.0 0.0 0.0) vprim))
  14. (setq axy (cvunit (atan (caddr v) vprimd) "radians" "degrees"))
  15. (prompt "\nDistance : ")(princ (rtos d 2 50))
  16. (prompt "\n\nDX in UCS : ")(princ (rtos dx 2 50))
  17. (prompt "\nDY in UCS : ")(princ (rtos dy 2 50))
  18. (prompt "\nDZ in UCS : ")(princ (rtos dz 2 50))
  19. (prompt "\n\nDX in WCS : ")(princ (rtos dxw 2 50))
  20. (prompt "\nDY in WCS : ")(princ (rtos dyw 2 50))
  21. (prompt "\nDZ in WCS : ")(princ (rtos dzw 2 50))
  22. (prompt "\n\nAngle around Z axis from X axis as 0.0 degree reference : ")(princ (rtos ax 2 50))(prompt " degrees")
  23. (prompt "\nAngle of picked points vector to XY plane : ")(princ (rtos axy 2 50))(prompt " degrees")
  24. (princ)
  25. )

 
HTH,M.R。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:29:48 | 显示全部楼层
请尝试以下操作:
  1. (defun c:mdist ( / *error* osz pnt )
  2.    (defun *error* ( msg )
  3.        (if osz (setvar 'osnapz osz))
  4.        (if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
  5.            (princ (strcat "\nError: " msg))
  6.        )
  7.        (princ)
  8.    )
  9.    
  10.    (if (setq osz (getvar 'osnapz))
  11.        (setvar 'osnapz 1)
  12.    )
  13.    (if (setq pnt (getpoint "\nSpecify first point: "))
  14.        (progn
  15.            (command "_.dist" "_non" pnt "_m")
  16.            (while (= 1 (logand 1 (getvar 'cmdactive))) (command "\"))
  17.        )
  18.    )
  19.    (if osz (setvar 'osnapz osz))
  20.    (princ)
  21. )
回复

使用道具 举报

12

主题

395

帖子

384

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-5 17:34:11 | 显示全部楼层
你为什么不一起摆脱命令调用呢?
 
  1. (defun c:mdist ( / totaldist pnt1 nextpoint)
  2. (setq totaldist 0)
  3. (if (and (setq pnt1 (getpoint "\nSpecify first point: "))
  4.    (setq pnt1 (reverse (cdr (reverse pnt1)))))
  5.    (while (setq nextpoint (getpoint pnt1 "\nSpecify next point: "))
  6.      (setq totaldist (+ totaldist (distance pnt1 (setq pnt1 (reverse (cdr (reverse nextpoint))))))))
  7.    )
  8.    (if (< 0 totaldist)
  9.      (princ (strcat "\nDistance = " (rtos totaldist))))
  10. (princ)
  11. )
回复

使用道具 举报

12

主题

395

帖子

384

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-5 17:36:42 | 显示全部楼层
我应该学会阅读。你喜欢这条线。苏。。。。
 
  1. (defun c:mdist ( / totaldist pnt1 nextpoint)
  2. (defun totaldist (distlist / )
  3.    (if (> (length distlist) 1)
  4.    (+ (distance (car distlist) (cadr distlist)) (totaldist (cdr distlist)))
  5.      0)
  6.    )
  7. (defun grdrawlist (pointlist1 / )
  8.    (if (> (length pointlist1) 1)
  9.      (append (list 1 (car pointlist1) (cadr pointlist1)) (grdrawlist (cdr pointlist1)))))
  10. (if (and (setq pnt1 (getpoint "\nSpecify first point: "))
  11.    (setq pnt1 (reverse (cdr (reverse pnt1))))
  12.    (setq pointlist (list pnt1)))
  13.    (while (setq nextpoint (getpoint (car (reverse pointlist)) "\nSpecify next point: "))
  14.      (setq pointlist (append pointlist (list (reverse (cdr (reverse nextpoint))))))
  15.      (redraw)
  16.      (grvecs (grdrawlist pointlist))
  17.      
  18.    ))
  19.    (if (< 0 (setq totaldist (totaldist pointlist)))
  20.      (princ (strcat "\nDistance = " (rtos totaldist))))
  21. (redraw)
  22. (princ)
  23. )
回复

使用道具 举报

1

主题

5

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:40:49 | 显示全部楼层
谢谢你,李,一如既往
事实上,如果osnapz已经为1(在启动代码之前),那么在完成或退出时它将保持该值(我希望在命令结束时将其恢复为0)。但它已经很棒了。谢谢
 
Commandobill,谢谢你,但我更愿意留在dist command。
回复

使用道具 举报

37

主题

264

帖子

236

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
185
发表于 2022-7-5 17:43:10 | 显示全部楼层
不错的代码;-)
就我个人而言,我喜欢一个马尔科里巴使用。
为了我自己的需要对它进行了进一步的调整。
当然需要画一条线。。
干杯,汉斯
 
 
 
 
  1. (defun c:dii ( / x1 y1 z1 x2 y2 z2 p1 p2 d ducs dx dy dz v dxw dyw dzw w ax vprim vprimd axy )
  2. (while (not p1) (setq p1 (getpoint "\nPick or specify start point : ")))
  3. (while (not p2) (setq p2 (getpoint p1 "\nPick or specify end point : ")))
  4. (setq d (distance p1 p2))
  5. (grdraw p1 p2 6 1)      ; halam
  6. (setq dx (car (setq v (mapcar '- p2 p1))))
  7. (setq dy (cadr v))
  8. (setq ducs (sqrt (+ (* dx dx) (* dy dy))))   ; halam
  9. (setq dz (caddr v))
  10. (setq dxw (car (setq w (mapcar '- (trans p2 1 0) (trans p1 1 0)))))
  11. (setq dyw (cadr w))
  12. (setq dzw (caddr w))
  13. (setq ax (cvunit (atan dy dx) "radians" "degrees"))
  14. (setq vprim (list (car v) (cadr v) 0.0))
  15. (setq vprimd (distance '(0.0 0.0 0.0) vprim))
  16. (setq axy (cvunit (atan (caddr v) vprimd) "radians" "degrees"))
  17. (prompt "\nDistance WCS : ")(princ (rtos d 2 50))
  18. (prompt "\nDistance UCS : ")(princ (rtos ducs 2 50))
  19. (prompt "\n\nDX in UCS : ")(princ (rtos dx 2 50))
  20. (prompt "\nDY in UCS : ")(princ (rtos dy 2 50))
  21. (prompt "\nDZ in UCS : ")(princ (rtos dz 2 50))
  22. (prompt "\n\nDX in WCS : ")(princ (rtos dxw 2 50))
  23. (prompt "\nDY in WCS : ")(princ (rtos dyw 2 50))
  24. (prompt "\nDZ in WCS : ")(princ (rtos dzw 2 50))
  25. (prompt "\n\nAngle around Z axis from X axis as 0.0 degree reference : ")(princ (rtos ax 2 50))(prompt " degrees")
  26. (prompt "\nAngle of picked points vector to XY plane : ")(princ (rtos axy 2 50))(prompt " degrees")
  27. (setq        x1  (car p1) ; halam
  28.        y1  (cadr p1) ; halam
  29.        z1  (caddr p1))  ; halam
  30. (setq        x2  (car p2) ; halam
  31.        y2  (cadr p2) ; halam
  32.        z2  (caddr p2))  ; halam
  33. (setq stringid1 (strcat "\nID pt1 : "(rtos x1 2 3) "," (rtos y1 2 3) "," (rtos z1 2 3))) ; halam
  34. (setq stringid2 (strcat "\nID pt2 : "(rtos x2 2 3) "," (rtos y2 2 3) "," (rtos z2 2 3))) ; halam
  35. (setq string1 (strcat "\n\nDistance UCS : " (rtos ducs 2 3)))
  36. (setq string2 (strcat "\nDX in UCS : " (rtos dx 2 3)))         
  37. (setq string3 (strcat "\nDY in UCS : " (rtos dy 2 3)))
  38. (setq string4 (strcat "\nDZ in UCS : " (rtos dz 2 3)))
  39. (setq string5 (strcat "\nAngle in UCS plane : " (rtos axy 2 3) " degrees"))
  40. (setq string6 (strcat "\n"))
  41. (setq string7 (strcat "\nDistance WCS : " (rtos d 2 3)))
  42. (setq string8 (strcat "\nDX in WCS : " (rtos dxw 2 3)))
  43. (setq string9 (strcat "\nDY in WCS : " (rtos dyw 2 3)))
  44. (setq string10 (strcat "\nDZ in WCS : " (rtos dzw 2 3)))
  45. (setq string11 (strcat "\nAngle around Z axis as plane : " (rtos ax 2 3)" degrees"))
  46. (setq alertstring (strcat stringid1 stringid2 string1 string2 string3 string4 string5 string6 string7 string8 string9 string10 string11))
  47. (alert alertstring)
  48. (princ))
  49. (defun C:D  ()  (c:dii)) ;halam
回复

使用道具 举报

17

主题

1274

帖子

25

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
260
发表于 2022-7-5 17:50:08 | 显示全部楼层
我想我会扔掉我的一个旧的,关于方位、距离、三角洲海拔和坡度:
  1. ;|      By Tom Beauford:
  2. Dst.lsp will prompt the user to pick the first point, then pick the next point,
  3. then display the distance picked by with a colored line, every distance measured
  4. shows a different color. the bearing & horizontal distance will be displayed in
  5. the left corner of the status line and the bearing, horizontal distance, difference
  6. in elevation and slope will be displayed on the command line.
  7.   Macro: ^P(or C:DST (load "DST.lsp"));DST
  8.   Command line: (load "DST.lsp") DST
  9. |;
  10. (defun C:DST ( / *ERROR* 2DIST fact str1 tw CNTR PT1 PT2 ang DST PDST Pang)
  11. (defun *ERROR* (s)                    ; If an error (such as CTRL-C) occurs
  12.                                      ; while this command is active...
  13. (if (/= s "Function cancelled")
  14.    (princ (strcat "\nError: " s))
  15. )
  16. (grtext -1 "")                      ; Clear status line.
  17. (vl-cmdf "redraw")
  18. (princ)
  19. )
  20. (defun 2DIST (PT)
  21.    (list (car pt)(cadr pt))
  22. ) ;defun
  23. (setq fact nil)
  24. (if(and(= 1 (getvar "cvport"))(trans '(1 0 0) 2 3 0))
  25.    (progn
  26.      (setq fact (car (trans '(1 0 0) 2 3 0)))
  27.      (princ "\nPS:MS == 1:")
  28.      (princ(/ 1 fact))
  29.      (setvar "NOMUTT" 1)
  30.      (command "mspace")
  31.      (setq tw (- (* 2 pi)(cdr(assoc 51(entget(acet-currentviewport-ename))))))
  32.      (command "pspace")
  33.      (setvar "NOMUTT" 0)
  34.    )
  35. )
  36. (setq CNTR 0 ;INITIALIZE COUNTER
  37.        PT1 (getpoint "\nPick First Point") ;PROMPT FOR FIRST POINT
  38.        PT2 PT1
  39. )
  40. (while PT2 ;IF YES OR ENTER
  41.    (setq PT2 (getpoint "\nPick Next Point" PT1)) ;PROMPT FOR NEXT POINT
  42.    (if PT2
  43.      (progn
  44.        (if fact
  45.          (progn
  46.            (setq DST (/ (distance (2DIST PT1)(2DIST PT2))fact) ;CONVERT TO STRING
  47.                  PDST (distance (2DIST PT1)(2DIST PT2)) ;CONVERT TO STRING
  48.                  CNTR (1+ CNTR) ;ADD TO COUNTER FOR COLOR CHANGE
  49.                  Pang (angtos (angle pt1 pt2)4 4)
  50.                  ang (angtos (+(angle pt1 pt2)tw)4 4)
  51.                  deltaz  (/ (- (car(cddr pt2)) (car(cddr pt1)))fact)
  52.                  slope   (/ deltaz DST)
  53.            )
  54.            (if(eq Pang ang)
  55.              (setq DST(strcat "MS Bearing= "ang ", Dist= " (rtos DST 2 2) "', PS Dist= " (rtos PDST 2 2) """))
  56.              (setq DST(strcat "MS Bearing= "ang ", Dist= " (rtos DST 2 2) "', PS Bearing= "Pang ", Dist= " (rtos PDST 2 2) """))
  57.            );if
  58.          );progn
  59.          (setq DST (distance (2DIST PT1)(2DIST PT2))
  60.                CNTR (1+ CNTR)
  61.                ang (angtos (angle pt1 pt2)4 4)
  62.                deltaz  (- (car(cddr pt2)) (car(cddr pt1)))
  63.                slope   (/ deltaz DST)
  64.                DST     (strcat "Bearing= "ang ", Dist= " (rtos DST 2 2) "'")
  65.          )
  66.        );if fact
  67.        (if (/= 0 deltaz)
  68.          (progn
  69.            (cond
  70.            ((equal (abs slope) (/ 1.0 2) 0.0001)(setq slope "2:1"))
  71.            ((equal (abs slope) (/ 1.0 3) 0.0001)(setq slope "3:1"))
  72.            ((equal (abs slope) (/ 1.0 4) 0.0001)(setq slope "4:1"))
  73.            ((equal (abs slope) (/ 1.0 5) 0.0001)(setq slope "5:1"))
  74.            ((equal (abs slope) (/ 1.0 6) 0.0001)(setq slope "6:1"))
  75.            ((equal (abs slope) (/ 1.0 7) 0.0001)(setq slope "7:1"))
  76.            ((equal (abs slope) (/ 1.0  0.0001)(setq slope "8:1"))
  77.            ((equal (abs slope) (/ 1.0 9) 0.0001)(setq slope "9:1"))
  78.            ((equal (abs slope) (/ 1.0 10) 0.0001)(setq slope "10:1"))
  79.            ((equal (abs slope) (/ 1.0 12) 0.0001)(setq slope "12:1"))
  80.            ((equal (abs slope) (/ 1.0 15) 0.0001)(setq slope "15:1"))
  81.            ((equal (abs slope) (/ 1.0 20) 0.0001)(setq slope "20:1"))
  82.            ((equal (abs slope) (/ 1.0 30) 0.0001)(setq slope "30:1"))
  83.            ((equal (abs slope) (/ 1.0 40) 0.0001)(setq slope "40:1"))
  84.            ((equal (abs slope) (/ 1.0 50) 0.0001)(setq slope "50:1"))
  85.            ((equal (abs slope) (/ 1.0 100) 0.0001)(setq slope "100:1"))
  86. ;            ((equal (abs slope) (/ 0.25 12) 0.0001)(setq slope "1/4"=1'"))
  87.            (T(setq slope (strcat (rtos (* slope 100) 2 4) "%")))
  88.            )
  89.            (setq DST (strcat DST "  Delta elev= "(rtos deltaz) "  Slope= " slope))
  90.          );progn
  91.        );if
  92.        (prompt (strcat "\n" DST)) ;Print the distance to command line
  93.        (grtext -1 DST) ;Print distance in status line
  94.        (grdraw PT1 PT2 CNTR 2) ;Draw a colored line between points
  95.        (setq PT1 PT2) ;Change start point
  96.      ) ;end progn
  97.    ) ;end if PT2
  98. ) ;end while PT2
  99. (grtext -1 "") ;Clear status line
  100. (vl-cmdf "redraw")
  101. (princ)
  102. ) ;end fun
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 09:08 , Processed in 1.152076 second(s), 83 queries .

© 2020-2025 乐筑天下

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