Silvercloak 发表于 2022-7-6 08:08:05

将列表转换为Strin

你好,
 
我是这里新铸造的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);我从网上得到的,但看起来还是不对
)

marko_ribar 发表于 2022-7-6 08:12:15

也许,试试这个:
 

(defun c:dimch ( / dimss n dim dimval d dimvalstr dimvalstrnew )
(setq dimss (ssget '((0 . "DIMENSION")) ))
(repeat (setq n (sslength dimss))
   (setq dim (ssname dimss (setq n (1- n))))
   (setq dimval (cdr (assoc 42 (setq d (entget dim)))))
   (setq dimvalstr (rtos dimval))
   (setq dimvalstrnew (vl-string-translate "." " " dimvalstr))
   (entmod (subst (cons 1 dimvalstrnew) (assoc 1 d) d))
)
(princ)
)

 
M、 R。

Silvercloak 发表于 2022-7-6 08:17:35

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

Silvercloak 发表于 2022-7-6 08:21:38

哦,酷,我想我明白了,你用了选择集。非常巧妙,我从未想过这样做。虽然,我从未听说过vl字符串翻译。我想我知道你想做什么了。
 
我真的很喜欢这样更安全和整洁。非常感谢。你能告诉我如何把维度分解成三个不带小数点的组吗?

Lee Mac 发表于 2022-7-6 08:23:44

这很快就写好了,毫无疑问有更好的方法添加分隔符:
 
(defun c:fixdim ( / e i s x ) (vl-load-com)
   (if (setq s (ssget "_:L" '((0 . "DIMENSION"))))
       (repeat (setq i (sslength s))
         (setq e (entget (ssname s (setq i (1- i)))) x 0)
         (entmod
               (list (assoc -1 e)
                   (cons 1
                     (vl-string-left-trim " "
                           (vl-list->string
                               (reverse
                                 (apply 'append
                                       (mapcar
                                           (function
                                             (lambda ( c )
                                                   (if (zerop (rem (setq x (1+ x)) 3))
                                                       (list c 32)
                                                       (list c)
                                                   )
                                             )
                                           )
                                           (reverse (vl-string->list (rtos (cdr (assoc 42 e)) 2 0)))
                                       )
                                 )
                               )
                           )
                     )
                   )
               )
         )
       )
   )
   (princ)
)
 
请注意,到目前为止,所有解决方案都使用标注文字替代,因此修改标注时不会更新标注值。
 
理想情况下,标注样式需要允许数千分隔符选项。

Silvercloak 发表于 2022-7-6 08:29:38

 
你太棒了!!!这正是我拍摄的目的。谢谢你,现在我来复习一下,学习一下你是怎么做到的。再次感谢所有提供帮助的人,请随时添加您的想法。我想学习并变得更好。
 
 
银色斗篷

Lee Mac 发表于 2022-7-6 08:31:41

 
欢迎使用Silver斗篷-如果您对代码有任何问题,请提问。
 
顺便说一句,我已经更新了上面的帖子和代码,为维度值修剪前导空格

Stefan BMR 发表于 2022-7-6 08:37:47

另一种方式,不需要代码:
-要在Windows中设置数字格式,请转到
控制面板->区域和语言->格式[选项卡]->附加设置和设置数字分组符号的空间。
-在AutoCAD中,打开“DimStyle”对话框,编辑DimStyle,然后在“单位”选项卡中,将“单位格式”设置为Windows桌面。

Lee Mac 发表于 2022-7-6 08:41:49

 
我知道一定有比文本覆盖更好的方法-很好的一个Stefan

Lee Mac 发表于 2022-7-6 08:43:47

@银色斗篷:
 
你可能想阅读论坛代码发布指南,并编辑你的第一篇文章来构建你的代码。
页: [1] 2
查看完整版本: 将列表转换为Strin