乐筑天下

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

[编程交流] 将列表转换为Strin

[复制链接]

15

主题

67

帖子

55

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 08:08:05 | 显示全部楼层 |阅读模式
你好,
 
我是这里新铸造的AutoLISP noob。我的老板问我是否可以编写一个LISP,它的维数为10000,然后将其改为10000。这是一个很好的小锻炼,拓展了我的技能,但我遇到了一个我想不出办法的障碍。
 
我已经将维度转换为一个列表,该列表可以转换为字符串,但我似乎无法做到这一点。我试过STRCAT,但总是出错。
 
有人能帮忙吗?我相信我可以把它变成一个ENTMOD并完成剩下的部分,但我只需要解决这部分。它需要没有()或“”标记。
 
谢谢以下是我所做的,
 
 
(定义c:DIMCHG()
 
(defun GetDim()
(setq DIMEN(car(entsel)))
(setq OLDDIMEN(entget dimen))
(setq变更(assoc 42 OLDDIMEN))
(setq变更2(cdr变更))
(setq CHANGE3(fix CHANGE2))
(setq DIMLTH(strlen(itoa变更3)))
(setq变更4(itoa变更3))
)                                        ;结束GetDim
 
(defun分解()
(setq位置1)
(setq BrkDwn nil);完成编码后删除
(重复DIMLTH
(setq BrkDwn(cons(substr CHANGE4位置1)BrkDwn))
(setq BrkDwn(cons”“BrkDwn))
(setq位置(+1位置))
)                                        ;结束重复
)                                        ;端部故障
(defun ReAsmbl()
(setq RSMBL nil)
(BrkDwn时
(条件
(=位置4)
(setq RSMBL(cons”“RSMBL))
(setq位置1)
)
((=(car BrkDwn)“”(setq BrkDwn(cdr BrkDwn)))
((/=(car BrkDwn)”“”)
(setq RSMBL(cons(car BrkDwn)RSMBL))
(setq BrkDwn(cdr BrkDwn))
(setq位置(+位置1))
)
)                                        ;结束条件
)                                        ;结束时
)                                        ;结束REASML
(定义ltos()
(setq gfile(打开“acad.grp”“w”);打开磁盘上的文件
(写入行RSMBL gfile);将列表打印到文件
(关闭gfile);关闭文件
(setq gfile(打开“acad.grp”“r”);打开文件
(setq strname(读取gfile行));从文件读取列表
(关闭gfile);关闭文件
strname;返回已转换列表
)
(GetDim)
(细分)
(setq位置1)
(REASML)
(vl princ到字符串Rsmbl);我从网上得到的,但看起来还是不对
)
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-6 08:12:15 | 显示全部楼层
也许,试试这个:
 
  1. (defun c:dimch ( / dimss n dim dimval d dimvalstr dimvalstrnew )
  2. (setq dimss (ssget '((0 . "DIMENSION")) ))
  3. (repeat (setq n (sslength dimss))
  4.    (setq dim (ssname dimss (setq n (1- n))))
  5.    (setq dimval (cdr (assoc 42 (setq d (entget dim)))))
  6.    (setq dimvalstr (rtos dimval))
  7.    (setq dimvalstrnew (vl-string-translate "." " " dimvalstr))
  8.    (entmod (subst (cons 1 dimvalstrnew) (assoc 1 d) d))
  9. )
  10. (princ)
  11. )

 
M、 R。
回复

使用道具 举报

15

主题

67

帖子

55

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 08:17:35 | 显示全部楼层
 
世界跆拳道联盟。。。我正在努力理解你所做的一半,我担心我需要一段时间来研究和理解它。。。你已经知道我要做什么的要点了。我正试图将其四舍五入,这样就不会出现小数点。它被分成三组。。。例如,尺寸显示:
 
9785642.34将变为9 785 642
 
恐怕我的编码还是很基础的,因为我还没有完全掌握autolisp中的任何东西。。。你的就像AutoLISP魔法。
 
银色斗篷
回复

使用道具 举报

15

主题

67

帖子

55

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 08:21:38 | 显示全部楼层
哦,酷,我想我明白了,你用了选择集。非常巧妙,我从未想过这样做。虽然,我从未听说过vl字符串翻译。我想我知道你想做什么了。
 
我真的很喜欢这样更安全和整洁。非常感谢。你能告诉我如何把维度分解成三个不带小数点的组吗?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:23:44 | 显示全部楼层
这很快就写好了,毫无疑问有更好的方法添加分隔符:
 
  1. (defun c:fixdim ( / e i s x ) (vl-load-com)
  2.    (if (setq s (ssget "_:L" '((0 . "DIMENSION"))))
  3.        (repeat (setq i (sslength s))
  4.            (setq e (entget (ssname s (setq i (1- i)))) x 0)
  5.            (entmod
  6.                (list (assoc -1 e)
  7.                    (cons 1
  8.                        (vl-string-left-trim " "
  9.                            (vl-list->string
  10.                                (reverse
  11.                                    (apply 'append
  12.                                        (mapcar
  13.                                            (function
  14.                                                (lambda ( c )
  15.                                                    (if (zerop (rem (setq x (1+ x)) 3))
  16.                                                        (list c 32)
  17.                                                        (list c)
  18.                                                    )
  19.                                                )
  20.                                            )
  21.                                            (reverse (vl-string->list (rtos (cdr (assoc 42 e)) 2 0)))
  22.                                        )
  23.                                    )
  24.                                )
  25.                            )
  26.                        )
  27.                    )
  28.                )
  29.            )
  30.        )
  31.    )
  32.    (princ)
  33. )

 
请注意,到目前为止,所有解决方案都使用标注文字替代,因此修改标注时不会更新标注值。
 
理想情况下,标注样式需要允许数千分隔符选项。
回复

使用道具 举报

15

主题

67

帖子

55

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
80
发表于 2022-7-6 08:29:38 | 显示全部楼层
 
你太棒了!!!这正是我拍摄的目的。谢谢你,现在我来复习一下,学习一下你是怎么做到的。再次感谢所有提供帮助的人,请随时添加您的想法。我想学习并变得更好。
 
 
银色斗篷
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:31:41 | 显示全部楼层
 
欢迎使用Silver斗篷-如果您对代码有任何问题,请提问。
 
顺便说一句,我已经更新了上面的帖子和代码,为维度值修剪前导空格
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

铜币
-7
发表于 2022-7-6 08:37:47 | 显示全部楼层
另一种方式,不需要代码:
-要在Windows中设置数字格式,请转到
控制面板->区域和语言->格式[选项卡]->附加设置和设置数字分组符号的空间。
-在AutoCAD中,打开“DimStyle”对话框,编辑DimStyle,然后在“单位”选项卡中,将“单位格式”设置为Windows桌面。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:41:49 | 显示全部楼层
 
我知道一定有比文本覆盖更好的方法-很好的一个Stefan
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:43:47 | 显示全部楼层
@银色斗篷:
 
你可能想阅读论坛代码发布指南,并编辑你的第一篇文章来构建你的代码。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-9 09:31 , Processed in 0.351835 second(s), 72 queries .

© 2020-2025 乐筑天下

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