乐筑天下

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

[编程交流] [LISP]仅缩放“x”an

[复制链接]

11

主题

44

帖子

33

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
55
发表于 2022-7-5 15:44:53 | 显示全部楼层 |阅读模式

 
我希望编写一个lisp例程,其中包括创建一个块并在x和y方向(而不是z方向)缩放它(这是客户端坐标转换的要求)。。。我还没弄明白。
 
我的想法是在命令中添加一种中断,用户可以单击块并手动更改比例,但我不知道如何添加这种中断。以下是我的尝试:
 
  1. (DEFUN C:CC ()
  2. (COMMAND
  3.    "_.SCALE"
  4.    "_ALL"
  5.    ""
  6.    '(0 0)
  7.    3.28084
  8.    "_BLOCK"
  9.    "1"
  10.    '(0 0)
  11.    "_ALL"
  12.    ""
  13.    (prompt "change x and y scale of block to 1.025")
  14.    break
  15.    "_.explode"
  16.    )
  17. )

 
任何帮助都将不胜感激。
 
谢谢
 
CR公司
回复

使用道具 举报

1

主题

80

帖子

79

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 15:48:49 | 显示全部楼层
像这样的怎么样?
 
  1. (defun c:cc ( / newscl)
  2.    (setq blk (car (entsel "\nSelect the block to change the X and Y to 1.025 : ")))
  3.        (setq newscl 1.025)
  4.        (entmod
  5.            (subst
  6.                (cons 41 newscl)
  7.                (assoc 41 (entget blk))
  8.                (entget blk)
  9.            )
  10.        )
  11.        (entmod
  12.            (subst
  13.                (cons 42 newscl)
  14.                (assoc 42 (entget blk))
  15.                (entget blk)
  16.            )
  17.        )
  18.            (entupd blk)
  19. (princ)
  20. )

 
你希望所有的东西都先从公制缩放到英制,还是仅仅是块?不管怎样,我都会单独运行。
 
在中断时,您是否希望允许用户手动覆盖1.025默认值?
回复

使用道具 举报

11

主题

44

帖子

33

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
55
发表于 2022-7-5 15:53:33 | 显示全部楼层
 
我希望所有的东西都先缩放。
 
我正在寻找用户以某种方式选择创建的块实体,并在不缩放z的情况下缩放x轴和y轴。目前我知道的唯一方法是将轮廓制作成块,通过属性缩放x轴和y轴,然后分解块。
 
此外,如果你能逐行了解每个命令的含义以及你决定走这条路的原因。。。这里是初学者。
 
谢谢
 
CR公司
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 15:55:23 | 显示全部楼层
CheSyn,您可以将代码缩短为以下内容。此外,最好使用if函数检查none nil返回值
从第一个变量。
 
  1. (defun c:Test (/ blk newscl)
  2. (if (setq blk (car (entsel "\nSelect the block to change the X and Y to 1.025 : ")))
  3.    (entmod (append (entget blk)
  4.                    (list (cons 41 1.025) (cons 42 1.025))
  5.            )))
  6. (princ)
  7. )
回复

使用道具 举报

1

主题

80

帖子

79

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 15:59:40 | 显示全部楼层
谢谢塔瓦的提醒!我还为if函数添加了一个提示。
 
我没有意识到append和list可以与entmod结合使用;看起来干净多了。是否有首选“subst”的时间/地点,如果是,为什么/在哪里?
 
Chiimayred,我在下面附上了一些评论。我仍然觉得从公制到英制的缩放最好在单独的命令中完成。现在,该块将在命令完成后爆炸。
 
  1. (defun c:cc ( / blk newscl)
  2.    (if
  3.        (setq blk (car (entsel "\nSelect the block to change : ")))
  4.        (progn
  5.            (setq newscl
  6.                (getreal ; set newscl as a real number
  7.                    (strcat "\nSpecify the scale factor < 1.025 > : "); string prompt
  8.                )
  9.            )
  10.                (if ; if newscl does not have a value associated with it, set the value as 1.025
  11.                    (=
  12.                        nil
  13.                        newscl
  14.                    )
  15.                        (setq newscl 1.025)
  16.                )
  17.                (entmod ; modifies the properties of the entity
  18.                    (append ; combines the list
  19.                        (entget blk); indicates what entity to edit
  20.                        (list ; create a list of properties to change
  21.                            (cons 41 newscl)
  22.                            (cons 42 newscl)
  23.                        )
  24.                    )
  25.                )
  26.                    (entupd blk); updates the block
  27.                (command "_.explode" blk "")
  28.        )
  29.        (prompt "\nNo selection made!")
  30.    )
  31. (princ)
  32. )
回复

使用道具 举报

11

主题

44

帖子

33

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
55
发表于 2022-7-5 16:02:09 | 显示全部楼层
我想我可能被误解了。
 
在缩放图形后,我将整个图形制作成一个块。因此,我不需要选择块,因为整个图形是一个块。我正在寻找一种方法来缩放该块的X轴和Y轴,因为在转换过程中,Z不能在这一点上缩放。
 
我不太明白41号和42号是怎么做到的,但这似乎是可行的。
 
我只需要找出如何选择一个块,缩放cons 41和cons 42,然后分解并清除块。
 
谢谢
 
CR公司
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 16:07:09 | 显示全部楼层
 
不客气。
 
 
 
每个函数都有自己的性能,我使用了append函数,因为我有多个替代dxf代码来
否则我会立即使用subst函数。
回复

使用道具 举报

1

主题

80

帖子

79

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 16:10:12 | 显示全部楼层
Tharwat对LISP有些陌生,我担心使用列表。看看它们有多有用,我会更深入地研究它们。
 
Chiimayred、cons 41和42指的是DXF代码41和42。DXF 41表示X比例,DXF 42表示Y比例,DXF 43表示Z比例。我没有包括DXF 43,因为你不想改变它。
 
您希望添加/更改发布的LISP中具体缺少什么?
回复

使用道具 举报

11

主题

44

帖子

33

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
55
发表于 2022-7-5 16:12:40 | 显示全部楼层
 
谢谢Chesyn,我将不得不研究DXF代码。
 
与其从用户那里获取输入,不如直接选择创建的块并缩放它。
 
谢谢你们到目前为止的帮助
 
CR公司
回复

使用道具 举报

1

主题

80

帖子

79

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 16:14:56 | 显示全部楼层
如果这是你要找的,请告诉我。
 
  1. (defun c:cc ( / sset blk newscl)
  2.    (if
  3.            (setq sset (ssget "_x" (list '(0 . "INSERT") (cons 410 (getvar "ctab")))))
  4.        (progn
  5.     (setq blk (ssname sset 0))
  6.                (entmod ; modifies the properties of the entity
  7.                    (append ; combines the list
  8.                        (entget blk); indicates what entity to edit
  9.                        (list ; create a list of properties to change
  10.                            (cons 41 1.025)
  11.                            (cons 42 1.025)
  12.                        )
  13.                    )
  14.                )
  15.                    (entupd blk); updates the block
  16.                (command "_.explode" blk "")
  17.        )
  18.        (prompt "\nNo blocks in drawing!")
  19.    )
  20. (princ)
  21. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 00:25 , Processed in 1.232564 second(s), 72 queries .

© 2020-2025 乐筑天下

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