乐筑天下

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

[编程交流] 使用choosen在X轴上拉伸

[复制链接]

56

主题

256

帖子

230

银币

后起之秀

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

铜币
253
发表于 2022-7-5 17:17:13 | 显示全部楼层
我真的希望有人能帮我。我不希望你的努力白费。我在LISP中的限制是有限的,因为最初的fn是第一次尝试使用LISP。
 
我很乐意帮你,但我的知识还不够。
 
希望罗伊043的回答有一些用处。
 
我确实喜欢拉伸的工作方式,像正常行为一样,它与CP一起工作。但我注意到,虽然在拾取pt1后,它不会像正常的ACAD拉伸那样从一个点开始断裂。
 
太挑剔了!我只想让它的核心功能发挥作用。
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:18:37 | 显示全部楼层
我将使用一个函数来重新计算相对于pt1的pt2。
  1. ; Round half towards pos. or neg. infinity.
  2. (defun Round (num)
  3. (fix ((if (minusp num) - +) num 0.5))
  4. )
  5. ; Recalculate pt so that the X, Y and Z distance to base are n times dim.
  6. (defun ModularizePoint (pt base dim)
  7. (mapcar
  8.    '(lambda (coorPt coorBase)
  9.      (+ coorBase (* dim (Round (/ (- coorPt coorBase) (float dim)))))
  10.    )
  11.    pt
  12.    base
  13. )
  14. )
  15. (defun c:bsx (/ *error* vl ov ss pt1 pt2 gridx ansx)
  16. (defun *error* (msg)
  17.    (if ov (mapcar 'setvar vl ov))
  18.    (if (not (wcmatch (strcase msg) "*CANCEL*,*EXIT*"))
  19.      (princ (strcat "\n<< Error: " msg " >>"))
  20.    )
  21.    (princ)
  22. )
  23. (setq vl '("CMDECHO"))
  24. (setq ov (mapcar 'getvar vl))
  25. (mapcar 'setvar vl '(0))
  26. (if
  27.    (and
  28.      (princ "\nSelect entities to stretch by crossing-window or crossing-polygon: ")
  29.      (setq ss (ssget))
  30.      (setq pt1 (getpoint "\nSelect Base Point: "))
  31.      (setq pt2 (getpoint pt1 "\nSelect Second Point: "))
  32.    )
  33.    (progn
  34.      (initget "215mm 225mm 235mm Custom LockXOnly")
  35.      (setq ansx (getkword "\nX Brick Size ? [215mm/225mm/235mm/Custom/LockXOnly] <225mm>: "))
  36.      (cond
  37.        ((or (not ansx) (= "215mm" ansx))
  38.          (setq gridx 215)
  39.        )
  40.        ((= "225mm" ansx)
  41.          (setq gridx 225)
  42.        )
  43.        ((= "235mm" ansx)
  44.          (setq gridx 235)
  45.        )
  46.        ((= "Custom" ansx)
  47.          (setq gridx (getint))
  48.        )
  49.      )
  50.      (if gridx (setq pt2 (ModularizePoint pt2 pt1 gridx)))
  51.      (command "_.stretch" ss "" "_non" pt1 "_non" (list (car pt2) (cadr pt1)))
  52.      (princ
  53.        (strcat
  54.          "\nLocked axis dim " (if gridx "ON " "OFF ")
  55.          "\nStretched on X: " (rtos (- (car pt2) (car pt1))) " "
  56.        )
  57.      )
  58.    )
  59. )
  60. (mapcar 'setvar vl ov)
  61. (princ)
  62. )
回复

使用道具 举报

56

主题

256

帖子

230

银币

后起之秀

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

铜币
253
发表于 2022-7-5 17:22:29 | 显示全部楼层
谢谢Roy_043。
 
对不起,我没有早点回来。我生病了。
 
这是Grrrs lisp的不同变体。但不幸的是,它不能根据CO-或CO+来增加或减少10mm。
 
在拾取对象之前,是否可以添加拉伸选项,使拉伸跨越到所选砖层的增量?
 
我附加了一个dwg,以更清楚地说明我希望拉伸如何工作。
砖拉伸试验。图纸
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:25:48 | 显示全部楼层
试试这个:
  1. (vl-load-com)
  2. ; Round half towards pos. or neg. infinity.
  3. (defun Round (num)
  4. (fix ((if (minusp num) - +) num 0.5))
  5. )
  6. ; Recalculate pt so that the X, Y and Z distance to base are n times module plus joint.
  7. (defun ModularizePoint (pt base module joint)
  8. (mapcar
  9.    '(lambda (coordPt coordBase)
  10.      (+ coordBase joint (* module (Round (/ (- coordPt coordBase) (float module)))))
  11.    )
  12.    pt
  13.    base
  14. )
  15. )
  16. (defun c:bsx (/ *error* doc ansx gridx jointx pt1 pt2 ss)
  17. (defun *error* (msg)
  18.    (setvar 'cmdecho 1)
  19.    (vla-endundomark doc)
  20.    (if (not (wcmatch (strcase msg) "*CANCEL*,*EXIT*"))
  21.      (princ (strcat "\n<< Error: " msg " >>"))
  22.    )
  23.    (princ)
  24. )
  25. (setq doc (vla-get-activedocument (setq cad (vlax-get-acad-object))))
  26. (vla-endundomark doc)
  27. (vla-startundomark doc)
  28. (if
  29.    (and
  30.      (princ "\nSelect entities to stretch by crossing-window or crossing-polygon: ")
  31.      (setq ss (ssget))
  32.      (setq pt1 (getpoint "\nSelect Base Point: "))
  33.      (setq pt2 (getpoint pt1 "\nSelect Second Point: "))
  34.    )
  35.    (progn
  36.      (setvar 'cmdecho 0)
  37.      (initget "Stand Min Plus Custom None")
  38.      (setq ansx (getkword "\nX Brick Size (Standard=112.5 Joint=10)? [stand/stand Min joint/stand Plus joint/Custom/None] <Stand>: "))
  39.      (cond
  40.        ((or (not ansx) (= "Stand" ansx))
  41.          (setq gridx 112.5)
  42.          (setq jointx 0.0)
  43.        )
  44.        ((= "Min" ansx)
  45.          (setq gridx 112.5)
  46.          (setq jointx -10.0)
  47.        )
  48.        ((= "Plus" ansx)
  49.          (setq gridx 112.5)
  50.          (setq jointx 10.0)
  51.        )
  52.        ((= "Custom" ansx)
  53.          (setq gridx (getreal "\nCustom size: "))
  54.          (setq jointx 0.0)
  55.        )
  56.      )
  57.      (if gridx (setq pt2 (ModularizePoint pt2 pt1 gridx jointx)))
  58.      (command "_.stretch" ss "" "_non" pt1 "_non" (list (car pt2) (cadr pt1)))
  59.      (princ
  60.        (strcat
  61.          "\nModular dimension: " (if gridx "ON " "OFF ")
  62.          "\nStretched on X: " (rtos (- (car pt2) (car pt1))) " "
  63.        )
  64.      )
  65.      (setvar 'cmdecho 1)
  66.    )
  67. )
  68. (vla-endundomark doc)
  69. (princ)
  70. )
回复

使用道具 举报

56

主题

256

帖子

230

银币

后起之秀

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

铜币
253
发表于 2022-7-5 17:28:56 | 显示全部楼层
谢谢太好了,这是朝着正确方向迈出的一步。
 
当它在负X轴上拉伸时会出现问题。请参阅附图以查看问题。
 
大体上在X正方向拉伸有效,但在负方向拉伸与预期结果相反。如果我选择+10mm选项,则为-10mm,如果为-10mm,则为+10mm接头。
 
是否有任何可能的方法来选择关节类型,然后拉伸捕捉到增量?如果没有,也没问题。这样可以更容易地看到拉伸的最终位置。
砖拉伸问题。图纸
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:34:17 | 显示全部楼层
捕捉到增量是有问题的。如果关节不为零,则需要根据拉伸方向更改snapbase。下面的代码显示网格(不考虑关节)。
 
  1. (vl-load-com)
  2. ; Round half towards pos. or neg. infinity.
  3. (defun Round (num)
  4. (fix ((if (minusp num) - +) num 0.5))
  5. )
  6. ; Recalculate pt so that the X, Y and Z distance to base are n times module plus joint.
  7. (defun ModularizePoint (pt base module joint)
  8. (mapcar
  9.    '(lambda (coordPt coordBase / delta)
  10.      (setq delta (* module (Round (/ (- coordPt coordBase) (float module)))))
  11.      (cond
  12.        ((zerop delta)  coordBase)
  13.        ((minusp delta) (+ coordBase delta (- joint)))
  14.        (T              (+ coordBase delta joint))
  15.      )
  16.    )
  17.    pt
  18.    base
  19. )
  20. )
  21. (defun SetVars (lst)
  22. (mapcar
  23.    '(lambda (sub / old)
  24.      (setq old (getvar (car sub)))
  25.      (if (cadr sub) (setvar (car sub) (cadr sub)))
  26.      (list (car sub) old)
  27.    )
  28.    lst
  29. )
  30. )
  31. (defun c:bsx (/ *error* doc ansx gridx jointx pt1 pt2 ss vars)
  32. (defun *error* (msg)
  33.    (if vars (SetVars vars))
  34.    (vla-endundomark doc)
  35.    (if (not (wcmatch (strcase msg) "*CANCEL*,*EXIT*"))
  36.      (princ (strcat "\n<< Error: " msg " >>"))
  37.    )
  38.    (princ)
  39. )
  40. (setq doc (vla-get-activedocument (setq cad (vlax-get-acad-object))))
  41. (vla-endundomark doc)
  42. (vla-startundomark doc)
  43. (if
  44.    (and
  45.      (princ "\nSelect entities to stretch by crossing-window or crossing-polygon: ")
  46.      (setq ss (ssget))
  47.      (progn
  48.        (initget "Stand Minus Plus Custom None")
  49.        (setq ansx (getkword "\nX Brick Size (Standard=112.5 Joint=10)? [stand/stand Minus joint/stand Plus joint/Custom/None] <Stand>: "))
  50.        (cond
  51.          ((or (not ansx) (= "Stand" ansx))
  52.            (setq gridx 112.5)
  53.            (setq jointx 0.0)
  54.          )
  55.          ((= "Minus" ansx)
  56.            (setq gridx 112.5)
  57.            (setq jointx -10.0)
  58.          )
  59.          ((= "Plus" ansx)
  60.            (setq gridx 112.5)
  61.            (setq jointx 10.0)
  62.          )
  63.          ((= "Custom" ansx)
  64.            (setq gridx (getreal "\nCustom size: "))
  65.            (setq jointx 0.0)
  66.          )
  67.        )
  68.        T
  69.      )
  70.      (setq pt1 (getpoint "\nSelect Base Point: "))
  71.      (setq vars
  72.        (SetVars
  73.          (if (= "None" ansx)
  74.            '((cmdecho 0))
  75.            (list
  76.              '(cmdecho 0)
  77.              (list 'snapbase pt1)
  78.              '(griddisplay 1)
  79.              '(gridmode 1)
  80.              (list 'gridunit (list gridx gridx))
  81.            )
  82.          )
  83.        )
  84.      )
  85.      (setq pt2 (getpoint pt1 "\nSelect Second Point: "))
  86.    )
  87.    (progn
  88.      (if gridx (setq pt2 (ModularizePoint pt2 pt1 gridx jointx)))
  89.      (command "_.stretch" ss "" "_non" pt1 "_non" (list (car pt2) (cadr pt1)))
  90.      (princ
  91.        (strcat
  92.          "\nModular dimension: " (if gridx "ON " "OFF ")
  93.          "\nStretched on X: " (rtos (- (car pt2) (car pt1))) " "
  94.        )
  95.      )
  96.    )
  97. )
  98. (if vars (SetVars vars))
  99. (vla-endundomark doc)
  100. (princ)
  101. )
回复

使用道具 举报

56

主题

256

帖子

230

银币

后起之秀

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

铜币
253
发表于 2022-7-5 17:34:47 | 显示全部楼层
我现在不在AutoCAD,但在周末,我痛苦地试图让你的代码正常工作。
 
我试图将网格设置为共测量,如果选择了任何砖块选项,则拉伸将遵循该选项,并根据命令开始时选择的值,然后将拉伸减去或添加10mm。
 
初始网格不一定要考虑关节,因为它只是一个粗略的引导,但最终拉伸将。
回复

使用道具 举报

56

主题

256

帖子

230

银币

后起之秀

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

铜币
253
发表于 2022-7-5 17:39:25 | 显示全部楼层
 
出现错误:
  1. Select Base Point:
  2. << Error: AutoCAD variable setting rejected: SNAPBASE (452.5 4278.5 0.0) >>

 
如果它能像17号岗位那样工作。我不介意扣子是否与砖层的选择不符。
 
看见http://www.cadtutor.net/forum/showthread.php?99652-X轴拉伸-带-choosen-value-in-they-increments&p=678648&viewfull=1#post678648
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:41:48 | 显示全部楼层
 
Snapbase需要二维点:
替换:
  1. (list 'snapbase pt1)

使用:
  1. (list 'snapbase (reverse (cdr (reverse pt1))))

 
  1. [s](list 'snapbase (vl-remove (last pt1) pt1))[/s]
  1. _$ (setq pt (getpoint))
  2. (0.0 0.0 0.0)
  3. _$ (vl-remove (last pt) pt)
  4. nil
  5. _$
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 17:44:46 | 显示全部楼层
谢谢Grrr。BricsCAD在此处接受三维点:
  1. : (setvar 'snapbase '(1 2 3))
  2. (1 2 3)
  3. : (getvar 'snapbase)
  4. (1.0 2.0)
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-8-24 15:16 , Processed in 2.616612 second(s), 71 queries .

© 2020-2025 乐筑天下

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