乐筑天下

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

[编程交流] Quantise LISP工作正常,但m

[复制链接]

56

主题

256

帖子

230

银币

后起之秀

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

铜币
253
发表于 2022-7-5 17:48:59 | 显示全部楼层 |阅读模式
这是David Forbus最初编写的代码(顺便说一句,谢谢)。如果能帮我解决舱口问题,我们将不胜感激。谢谢
  1. ;;; QUANTALL
  2. ;;; Written by David Forbus 09_dec_2008
  3. ;;; QUANTALL prompts a user for a Quantize Value
  4. ;;; QUANTALL then prompts a user for a selection set and then
  5. ;;; modifies the INSERTION POINTS of TEXT, MTEXT, CIRCLES, BLOCKS, LINES and LWPOLYLINES within that selection set so they all "snap" to quantized coordinates.
  6. ;;; Modified by 3dwannab (get OSNAP settings) 14.06.02
  7. (defun QUANTLN ()
  8. (setq SP-X (/ (cadr (assoc 10 CURENT)) QUANT-VALUE ))
  9. (setq SP-Y (/ (caddr (assoc 10 CURENT)) QUANT-VALUE ))
  10. (setq SP-Z (/ (cadddr (assoc 10 CURENT)) QUANT-VALUE ))
  11. (setq EP-X (/ (cadr (assoc 11 CURENT)) QUANT-VALUE ))
  12. (setq EP-Y (/ (caddr (assoc 11 CURENT)) QUANT-VALUE ))
  13. (setq EP-Z (/ (cadddr (assoc 11 CURENT)) QUANT-VALUE ))
  14. (if (>= (- SP-X (fix SP-X)) 0.5) (setq SP-X (* QUANT-VALUE (+ 1.0 (fix SP-X)))) (setq SP-X (* QUANT-VALUE (fix SP-X))))
  15. (if (>= (- SP-Y (fix SP-Y)) 0.5) (setq SP-Y (* QUANT-VALUE (+ 1.0 (fix SP-Y)))) (setq SP-Y (* QUANT-VALUE (fix SP-Y))))
  16. (if (>= (- SP-Z (fix SP-Z)) 0.5) (setq SP-Z (* QUANT-VALUE (+ 1.0 (fix SP-Z)))) (setq SP-Z (* QUANT-VALUE (fix SP-Z))))
  17. (if (>= (- EP-X (fix EP-X)) 0.5) (setq EP-X (* QUANT-VALUE (+ 1.0 (fix EP-X)))) (setq EP-X (* QUANT-VALUE (fix EP-X))))
  18. (if (>= (- EP-Y (fix EP-Y)) 0.5) (setq EP-Y (* QUANT-VALUE (+ 1.0 (fix EP-Y)))) (setq EP-Y (* QUANT-VALUE (fix EP-Y))))
  19. (if (>= (- EP-Z (fix EP-Z)) 0.5) (setq EP-Z (* QUANT-VALUE (+ 1.0 (fix EP-Z)))) (setq EP-Z (* QUANT-VALUE (fix EP-Z))))
  20. (setq CURENT (subst (list 10 SP-X SP-Y SP-Z) (assoc 10 CURENT) CURENT ))
  21. (setq CURENT (subst (list 11 EP-X EP-Y EP-Z) (assoc 11 CURENT) CURENT ))
  22. (entmod CURENT)
  23. )
  24. (defun QUANTPOLY ()
  25. (setq COUNTER2 1)
  26. (setq POLY-NEW (list))
  27. (while (< COUNTER2 (length CURENT))
  28. (setq VRTX-PNT (nth COUNTER2 CURENT))
  29. (if (= 10 (car VRTX-PNT))
  30. (progn
  31. (setq SP-X (/ (cadr VRTX-PNT) QUANT-VALUE ))
  32. (setq SP-Y (/ (caddr VRTX-PNT) QUANT-VALUE ))
  33. (if (>= (- SP-X (fix SP-X)) 0.5) (setq SP-X (* QUANT-VALUE (+ 1.0 (fix SP-X)))) (setq SP-X (* QUANT-VALUE (fix SP-X))))
  34. (if (>= (- SP-Y (fix SP-Y)) 0.5) (setq SP-Y (* QUANT-VALUE (+ 1.0 (fix SP-Y)))) (setq SP-Y (* QUANT-VALUE (fix SP-Y))))
  35. (setq POLY-NEW (append POLY-NEW (list (list 10 SP-X SP-Y)))))
  36. (if (= 330 (car VRTX-PNT)) nil (if (= 5 (car VRTX-PNT)) nil (setq POLY-NEW (append POLY-NEW (list VRTX-PNT))))
  37. )
  38. )
  39. (setq COUNTER2 (+ COUNTER2 1))
  40. )
  41. (entmake POLY-NEW)
  42. (entdel CURENT-NAME)
  43. )
  44. (defun QUANTREG ()
  45. (setq SP-X (/ (cadr (assoc 10 CURENT)) QUANT-VALUE ))
  46. (setq SP-Y (/ (caddr (assoc 10 CURENT)) QUANT-VALUE ))
  47. (setq SP-Z (/ (cadddr (assoc 10 CURENT)) QUANT-VALUE ))
  48. (if (>= (- SP-X (fix SP-X)) 0.5) (setq SP-X (* QUANT-VALUE (+ 1.0 (fix SP-X)))) (setq SP-X (* QUANT-VALUE (fix SP-X))))
  49. (if (>= (- SP-Y (fix SP-Y)) 0.5) (setq SP-Y (* QUANT-VALUE (+ 1.0 (fix SP-Y)))) (setq SP-Y (* QUANT-VALUE (fix SP-Y))))
  50. (if (>= (- SP-Z (fix SP-Z)) 0.5) (setq SP-Z (* QUANT-VALUE (+ 1.0 (fix SP-Z)))) (setq SP-Z (* QUANT-VALUE (fix SP-Z))))
  51. (setq CURENT (subst (list 10 SP-X SP-Y SP-Z) (assoc 10 CURENT) CURENT ))
  52. (entmod CURENT)
  53. )
  54. (defun QUANTXT ()
  55. (setq TXT-HORZ (cdr (assoc 72 CURENT)))
  56. (setq TXT-VERT (cdr (assoc 73 CURENT)))
  57. (if (= TXT-HORZ 0)
  58. (if (= TXT-VERT 0)
  59. (progn
  60. (setq SP-X (/ (cadr (assoc 10 CURENT)) QUANT-VALUE ))
  61. (setq SP-Y (/ (caddr (assoc 10 CURENT)) QUANT-VALUE ))
  62. (setq SP-Z (/ (cadddr (assoc 10 CURENT)) QUANT-VALUE ))
  63. (if (>= (- SP-X (fix SP-X)) 0.5) (setq SP-X (* QUANT-VALUE (+ 1.0 (fix SP-X)))) (setq SP-X (* QUANT-VALUE (fix SP-X))))
  64. (if (>= (- SP-Y (fix SP-Y)) 0.5) (setq SP-Y (* QUANT-VALUE (+ 1.0 (fix SP-Y)))) (setq SP-Y (* QUANT-VALUE (fix SP-Y))))
  65. (if (>= (- SP-Z (fix SP-Z)) 0.5) (setq SP-Z (* QUANT-VALUE (+ 1.0 (fix SP-Z)))) (setq SP-Z (* QUANT-VALUE (fix SP-Z))))
  66. (setq CURENT (subst (list 10 SP-X SP-Y SP-Z) (assoc 10 CURENT) CURENT ))
  67. )
  68. (progn (setq SP-X (/ (cadr (assoc 11 CURENT)) QUANT-VALUE ))
  69. (setq SP-Y (/ (caddr (assoc 11 CURENT)) QUANT-VALUE ))
  70. (setq SP-Z (/ (cadddr (assoc 11 CURENT)) QUANT-VALUE ))
  71. (if (>= (- SP-X (fix SP-X)) 0.5) (setq SP-X (* QUANT-VALUE (+ 1.0 (fix SP-X)))) (setq SP-X (* QUANT-VALUE (fix SP-X))))
  72. (if (>= (- SP-Y (fix SP-Y)) 0.5) (setq SP-Y (* QUANT-VALUE (+ 1.0 (fix SP-Y)))) (setq SP-Y (* QUANT-VALUE (fix SP-Y))))
  73. (if (>= (- SP-Z (fix SP-Z)) 0.5) (setq SP-Z (* QUANT-VALUE (+ 1.0 (fix SP-Z)))) (setq SP-Z (* QUANT-VALUE (fix SP-Z))))
  74. (setq CURENT (subst (list 11 SP-X SP-Y SP-Z) (assoc 11 CURENT) CURENT ))
  75. )
  76. )
  77. (progn (setq SP-X (/ (cadr (assoc 11 CURENT)) QUANT-VALUE ))
  78. (setq SP-Y (/ (caddr (assoc 11 CURENT)) QUANT-VALUE ))
  79. (setq SP-Z (/ (cadddr (assoc 11 CURENT)) QUANT-VALUE ))
  80. (if (>= (- SP-X (fix SP-X)) 0.5) (setq SP-X (* QUANT-VALUE (+ 1.0 (fix SP-X)))) (setq SP-X (* QUANT-VALUE (fix SP-X))))
  81. (if (>= (- SP-Y (fix SP-Y)) 0.5) (setq SP-Y (* QUANT-VALUE (+ 1.0 (fix SP-Y)))) (setq SP-Y (* QUANT-VALUE (fix SP-Y))))
  82. (if (>= (- SP-Z (fix SP-Z)) 0.5) (setq SP-Z (* QUANT-VALUE (+ 1.0 (fix SP-Z)))) (setq SP-Z (* QUANT-VALUE (fix SP-Z))))
  83. (setq CURENT (subst (list 11 SP-X SP-Y SP-Z) (assoc 11 CURENT) CURENT ))
  84. ))
  85. (entmod CURENT)
  86. )
  87. (defun QUANTARC ()
  88. (setq SP-X (/ (cadr (assoc 10 CURENT)) QUANT-VALUE ))
  89. (setq SP-Y (/ (caddr (assoc 10 CURENT)) QUANT-VALUE ))
  90. (setq SP-Z (/ (cadddr (assoc 10 CURENT)) QUANT-VALUE ))
  91. (if (>= (- SP-X (fix SP-X)) 0.5) (setq SP-X (* QUANT-VALUE (+ 1.0 (fix SP-X)))) (setq SP-X (* QUANT-VALUE (fix SP-X))))
  92. (if (>= (- SP-Y (fix SP-Y)) 0.5) (setq SP-Y (* QUANT-VALUE (+ 1.0 (fix SP-Y)))) (setq SP-Y (* QUANT-VALUE (fix SP-Y))))
  93. (if (>= (- SP-Z (fix SP-Z)) 0.5) (setq SP-Z (* QUANT-VALUE (+ 1.0 (fix SP-Z)))) (setq SP-Z (* QUANT-VALUE (fix SP-Z))))
  94. (setq CURENT (subst (list 10 SP-X SP-Y SP-Z) (assoc 10 CURENT) CURENT ))
  95. (setq RAD-R (/ (cdr (assoc 40 CURENT)) QUANT-VALUE ))
  96. (if (>= (- RAD-R (fix RAD-R)) 0.5) (setq RAD-R (* QUANT-VALUE (+ 1.0 (fix RAD-R)))) (setq RAD-R (* QUANT-VALUE (fix RAD-R))))
  97. (setq CURENT (subst (cons 40 RAD-R) (assoc 40 CURENT) CURENT ))
  98. (entmod CURENT)
  99. )
  100. (defun c:Fix_Quantize_All ( / osnap ) ;;3dwannab fix
  101. (setvar "cmdecho" 0)
  102. (setq OSNAP (getvar "osmode")) ;;3dwannab fix
  103. (setvar "osmode" 0)
  104. (setq QUANT-VALUE (getreal "\nEnter Quantize Value: "))
  105. (setq SELECT-SET (ssget))
  106. (setq COUNTER0 (1- (sslength SELECT-SET )))
  107. (while (> COUNTER0 -1.0)
  108. (setq CURENT (entget (ssname SELECT-SET COUNTER0)))
  109. (setq CURENT-NAME (ssname SELECT-SET COUNTER0))
  110. (if (= (cdr (assoc 0 CURENT)) "LINE") (QUANTLN))
  111. (if (= (cdr (assoc 0 CURENT)) "TEXT") (QUANTXT))
  112. (if (= (cdr (assoc 0 CURENT)) "MTEXT") (QUANTREG))
  113. (if (= (cdr (assoc 0 CURENT)) "INSERT") (QUANTREG))
  114. (if (= (cdr (assoc 0 CURENT)) "CIRCLE") (QUANTREG))
  115. (if (= (cdr (assoc 0 CURENT)) "ARC") (QUANTARC))
  116. (if (= (cdr (assoc 0 CURENT)) "LWPOLYLINE") (QUANTPOLY))
  117. (setq COUNTER0 (1- COUNTER0))
  118. )
  119. (princ)
  120. (setvar "osmode" OSNAP)
  121. )
  122. (princ "\nType "Fix_Quantize_All" to Quantize the INSERTION POINTS of TEXT, MTEXT, CIRCLES, ARCs, BLOCKS, LINES and LWPOLYLINES to the round off value.")
回复

使用道具 举报

56

主题

256

帖子

230

银币

后起之秀

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

铜币
253
发表于 2022-7-5 18:47:23 | 显示全部楼层
我发现是有一条多段线作为图案填充边界的对象。
 
 
从LISP中可以看出,它创建了一条新的多段线,因此破坏了相关的图案填充。是否可以像在“属性”对话框中那样修改多段线?
 
 
抱歉撞到你了
184903opavpp50a45hvg53.jpg
回复

使用道具 举报

56

主题

256

帖子

230

银币

后起之秀

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

铜币
253
发表于 2022-7-5 19:11:25 | 显示全部楼层
编辑:这不是更新图案填充。
 
我不知道这是否是一个已知的错误,但当这个脚本运行时,图案填充不会随它一起出现,即使它仍然是关联的。
 
之后手动使用CONVERTPOLY命令可以正常工作,但我想知道是否可以在下面的LISP中使用。
 
旧帖子:
这里有不同的脚本https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/round-xyz-by-decimal-precision/m-p/1231665#M171900这正是我想要的,不创建新的多段线并去掉图案填充关联。它使用SNAPUNIT变量。
 
我稍微修改了它,以便可以在运行命令之前输入所需的SNAPUNIT。感谢用户bruno。valsecchi在另一个论坛上。
 
其工作原理如下:
  1. "FACE3D,ARC,ATTDEF,ATTRIB,CIRCLE,ELLIPSE,INSERT,LINE,POLYLINE,LWPOLYLINE,*TEXT,POINT,SHAPE,SOLID,TRACE"
  1. (defun round_number (xr n / )
  2.    (* (fix (atof (rtos (* xr n) 2 0))) (/ 1.0 n))
  3. )
  4. (defun c:Fix_Round_Numbers ( / js n_count ent dxf_ent dxf_lst)
  5. (setq su (getvar 'SNAPUNIT))
  6. (princ "Enter the tolerance in X,Y...\n")
  7. (command "SNAPUNIT" pause "")
  8. (setq js (ssget '((0 . "FACE3D,ARC,ATTDEF,ATTRIB,CIRCLE,ELLIPSE,INSERT,LINE,POLYLINE,LWPOLYLINE,*TEXT,POINT,SHAPE,SOLID,TRACE"))) n_count -1)
  9. (cond
  10.    (js
  11.    (setvar "cmdecho" 0)
  12.    (command "_.undo" "_group")
  13.        (while (setq ent (ssname js (setq n_count (1+ n_count))))
  14.        (setq dxf_ent (entget ent))
  15.        (cond
  16.            ((eq (cdr (assoc 0 dxf_ent)) "LWPOLYLINE")
  17.                (setq dxf_lst (cdr dxf_ent) dxf_ent (list (car dxf_ent)))
  18.                (while (cdr dxf_lst)
  19.                    (if (eq 10 (caar dxf_lst))
  20.                        (setq dxf_ent (cons (cons 10 (mapcar '(lambda (x p) (round_number x (/ 1 p))) (cdar dxf_lst) (getvar "SNAPUNIT"))) dxf_ent))
  21.                        (setq dxf_ent (cons (car dxf_lst) dxf_ent))
  22.                    )
  23.                    (setq dxf_lst (cdr dxf_lst))
  24.                )
  25.                (setq dxf_ent (reverse dxf_ent))
  26.            )
  27.            ((eq (cdr (assoc 0 dxf_ent)) "POLYLINE")
  28.                (while (eq (cdr (assoc 0 (setq dxf_ent (entget (entnext (cdar dxf_ent)))))) "VERTEX")
  29.                    (setq dxf_ent (subst (cons 10 (mapcar '(lambda (x p) (round_number x (/ 1 p))) (cdr (assoc 10 dxf_ent)) (append (getvar "SNAPUNIT") (list (car (getvar "SNAPUNIT")))))) (assoc 10 dxf_ent) dxf_ent))
  30.                    (entmod dxf_ent)
  31.                )
  32.            )
  33.            (T
  34.                (foreach n dxf_ent
  35.                    (if (member (car n) '(10 11 12 13 40))
  36.                        (if (listp (cdr n))
  37.                            (setq dxf_ent (subst (cons (car n) (mapcar '(lambda (x p) (round_number x (/ 1 p))) (cdr n) (append (getvar "SNAPUNIT") (list (car (getvar "SNAPUNIT")))))) (assoc (car n) dxf_ent) dxf_ent))
  38.                            (setq dxf_ent (subst (cons (car n) (round_number (cdr n) (/ 1 (car (getvar "SNAPUNIT"))))) (assoc (car n) dxf_ent) dxf_ent))
  39.                        )
  40.                    )
  41.                )
  42.            )
  43.        )
  44.        (entmod dxf_ent)
  45.        (entupd ent)
  46.    )
  47.    (command "_.undo" "_end")
  48.    (setvar "cmdecho" 1)
  49.    (setvar "SNAPUNIT" su)
  50.    (princ (strcat "\n" (itoa n_count) " transformed objects (s)."))
  51.    )
  52.    (T (princ "\nNo found valid object ."))
  53. )
  54. (prin1)
  55. )
  56. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 00:07 , Processed in 0.807012 second(s), 60 queries .

© 2020-2025 乐筑天下

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