乐筑天下

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

[编程交流] 缩放选定项目

[复制链接]

16

主题

70

帖子

54

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 08:41:00 | 显示全部楼层 |阅读模式
尊敬的各位:,
 
我想使lisp与对话框,让用户选择哪一层要缩放2倍的圆圈。我不知道如何编写能够存储所选项目的代码,并重复该命令。谁能教我如何完成代码?谢谢
  1. (defun sc2 ()
  2. (if
  3. (= item1 1) (setq sset (ssget "x"  '(8 . "layer1" ) (0 . "CIRCLE")(cons 410 (getvar "CTAB"))))
  4. (= item2 1) (setq sset (ssget "x"  '(8 . "layer2" ) (0 . "CIRCLE")(cons 410 (getvar "CTAB"))))
  5. (= item3 1) (setq sset (ssget "x"  '(8 . "layer3" ) (0 . "CIRCLE")(cons 410 (getvar "CTAB"))))
  6. (setq sset (vlax-safearray-list sset))
  7. );if
  8. (repeat sset
  9. (command "scale" ssget 2 "")
  10.      
  11. );repeat
  12. );defun
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 08:49:04 | 显示全部楼层
也许是这样的。。。
 
  1. (defun sc2 ()
  2. (cond
  3.      ((= item1 1) (setq sset (ssget "x"  (list '(8 . "layer1" ) '(0 . "CIRCLE")(cons 410 (getvar "CTAB"))))))
  4.      ((= item2 1) (setq sset (ssget "x"  (list '(8 . "layer2" ) '(0 . "CIRCLE")(cons 410 (getvar "CTAB"))))))
  5.      ((= item3 1) (setq sset (ssget "x"  (list '(8 . "layer3" ) '(0 . "CIRCLE")(cons 410 (getvar "CTAB"))))))
  6.      )
  7. (if sset
  8.    (repeat (setq i (sslength sset))
  9.      (setq sn (ssname sset (setq i (1- i))))
  10.      (entmod (subst (cons 40 (* (cdr (assoc 40 (setq e (entget sn)))) 4.)) (assoc 40 e) e))
  11.    )
  12. )
  13. (princ)
  14. )
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 08:53:32 | 显示全部楼层
  1. (defun c:test (/ ss ent)
  2. (setq ss (ssget "_X"
  3.    (list '(0 . "CIRCLE") (cons 410 (getvar "CTAB")))
  4.    )
  5. )
  6. (repeat (sslength ss)
  7.    (setq ent (ssname ss 0))
  8.    (if (member (strcase (cdr (assoc 8 (entget ent))))
  9. '("LAYER1" "LAYER2" "LAYER3")
  10. )
  11.      (command "_scale"
  12.        ent
  13.        ""
  14.        "_non"
  15.        (cdr (assoc 10 (entget ent)))
  16.        "2"
  17.      )
  18.    )
  19.    (ssdel ent ss)
  20. )
  21. )
回复

使用道具 举报

16

主题

70

帖子

54

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 08:57:29 | 显示全部楼层
感谢您的快速回复,如果我选择了多个项目(即项目1、项目3),并且第1层和第3层有多个圆圈。如何使这个Lisp程序可以重复呢?
 
 
回复

使用道具 举报

16

主题

70

帖子

54

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 08:59:29 | 显示全部楼层
感谢您的快速响应,此lisp将在所有圆上缩放2倍。因为我将通过对话框选择界面选择要缩放2倍的层。
 
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 09:08:41 | 显示全部楼层
 
我用entmod更新了我的代码,它更好更快。
 
关于你的问题,我没有明白,你能带上你的代码或例子吗?
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 09:10:33 | 显示全部楼层
 
那么好吧。使用对话框函数的结果值在列表上指定图层名称,例如,从lsit框中选择“LAYER1”和“LAYER3”。用这两个名称构造一个列表,即(“LAYER1”“LAYER3”),并将其作为参数传递给此子对象。
 
  1. (defun [b][color=blue]ScleCir  (lst[/color][/b] / ss ent)
  2. (setq ss (ssget "_X"
  3.    (list '(0 . "CIRCLE") (cons 410 (getvar "CTAB")))
  4.    )
  5. )
  6. (repeat (sslength ss)
  7.    (setq ent (ssname ss 0))
  8.    (if (member (strcase (cdr (assoc 8 (entget ent))))
  9. [b][color=blue] lst[/color][/b]
  10. )
  11.      [b][color=blue](entmod[/color][/b]
  12. [b][color=blue] (subst (cons 40 (* (cdr (assoc 40 (setq e (entget ent)))) 2))[/color][/b]
  13. [b][color=blue] (assoc 40 e)[/color][/b]
  14. [b][color=blue] e[/color][/b]
  15. [b][color=blue] )[/color][/b]
  16. )
  17.    )
  18.    (ssdel ent ss)
  19. )
  20. )

 

 
  1. (defun [color=blue]ScleCir (lst[/color] / ss ent)
  2. (setq
  3.    ss (ssget
  4. "_X"
  5. (list
  6.    '(0 . "CIRCLE")
  7.    (cons 410 (getvar "CTAB"))
  8.    [b][color=blue](cons
  9.      2
  10.      (apply 'strcat (mapcar '(lambda (j) (strcat "," j)) lst))
  11.    )
  12. [/color][/b]  )
  13.       )
  14. )
  15. (repeat (sslength ss)
  16.    (setq ent (ssname ss 0))
  17.    (entmod
  18.      (subst (cons 40 (* (cdr (assoc 40 (setq e (entget ent)))) 2))
  19.      (assoc 40 e)
  20.      e
  21.      )
  22.    )
  23.    (ssdel ent ss)
  24. )
  25. )

 
编辑:是的。使用entmod方法,如tharwats代码,而不是命令调用。
回复

使用道具 举报

16

主题

70

帖子

54

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 09:16:43 | 显示全部楼层
谢谢Tharwat!这里是我的代码,如果第1层和第3层有多个圆,你的lisp能处理吗?
 
  1. (defun chkToggle ()
  2.    (setq item1(atoi(get_tile "item1")))
  3. (setq item2(atoi(get_tile "item2")))  
  4. (setq item3(atoi(get_tile "item3")))
  5. )
  6. (defun s1()
  7. (setq dcl_id (load_dialog "sub.dcl"))
  8. (if (not (new_dialog "sub" dcl_id) ) (exit))
  9. (action_tile "item1" "(chkToggle)")   
  10. (action_tile "item2" "(chkToggle)")   
  11. (action_tile "item3" "(chkToggle)")   
  12. (action_tile "accept" "(setq ddiag 2)(done_dialog)")
  13. (action_tile "cancel" "(setq ddiag 1)(done_dialog)")
  14. (start_dialog)                                                                                                                                                                          
  15. (unload_dialog dcl_id)
  16. (if(= ddiag 1)
  17.    (princ "\nCancelled!")
  18. )
  19. (if (= ddiag 2)
  20. (sc2)
  21.   
  22.   )
  23.   );defun
  24.   
  25.   
  26. (defun sc2 ()
  27. (cond
  28.      ((= item1 1) (setq sset (ssget "x"  (list '(8 . "layer1" ) '(0 . "CIRCLE")(cons 410 (getvar "CTAB"))))))
  29.      ((= item2 1) (setq sset (ssget "x"  (list '(8 . "layer2" ) '(0 . "CIRCLE")(cons 410 (getvar "CTAB"))))))
  30.      ((= item3 1) (setq sset (ssget "x"  (list '(8 . "layer3" ) '(0 . "CIRCLE")(cons 410 (getvar "CTAB"))))))
  31.      )
  32. (if sset
  33.    (repeat (setq i (sslength sset))
  34.      (setq sn (ssname sset (setq i (1- i))))
  35.      (entmod (subst (cons 40 (* (cdr (assoc 40 (setq e (entget sn)))) 4.)) (assoc 40 e) e))
  36.    )
  37. )
  38. (princ)
  39. );defun
  40.   

 
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 09:20:17 | 显示全部楼层
 
是的,它可以。
 
张贴DCL文件的代码。
回复

使用道具 举报

16

主题

70

帖子

54

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 09:26:15 | 显示全部楼层
谢谢这是我的DCL文件代码。如果我同时选择了第1层和第3层。这个lisp能够同时缩放两层圆吗?
  1. sub : dialog {
  2.          label = "Select layer for scale circle";
  3.           :column {
  4.            : boxed_column {
  5.             :text {
  6.     key = "text";
  7.                value ="nothing selected";
  8.    }
  9.     }
  10.          : boxed_column  {
  11.      key = "mylist";
  12.              : toggle {
  13.                key = "item1";
  14.                label = "layer1";
  15.                 value = "0";
  16.              }
  17.              : toggle {
  18.                key = "item2";
  19.                label = "layer2";
  20.                 value = "0";
  21.              }
  22.     : toggle {
  23.                key = "item3";
  24.                label = "layer3";
  25.                 value = "0";
  26.              }
  27.            }
  28.            : boxed_row {
  29.    : button {
  30.                key = "accept";
  31.                label = " Okay ";
  32.                is_default = true;
  33.              }   
  34.              : button {
  35.                key = "cancel";
  36.                label = "Close";
  37.                is_default = true;
  38.                is_cancel = true;
  39.              }
  40.            }   
  41.          }
  42. }
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 09:24 , Processed in 0.334932 second(s), 72 queries .

© 2020-2025 乐筑天下

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