将列表转换为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);我从网上得到的,但看起来还是不对
) 也许,试试这个:
(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。
世界跆拳道联盟。。。我正在努力理解你所做的一半,我担心我需要一段时间来研究和理解它。。。你已经知道我要做什么的要点了。我正试图将其四舍五入,这样就不会出现小数点。它被分成三组。。。例如,尺寸显示:
9785642.34将变为9 785 642
恐怕我的编码还是很基础的,因为我还没有完全掌握autolisp中的任何东西。。。你的就像AutoLISP魔法。
银色斗篷 哦,酷,我想我明白了,你用了选择集。非常巧妙,我从未想过这样做。虽然,我从未听说过vl字符串翻译。我想我知道你想做什么了。
我真的很喜欢这样更安全和整洁。非常感谢。你能告诉我如何把维度分解成三个不带小数点的组吗? 这很快就写好了,毫无疑问有更好的方法添加分隔符:
(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)
)
请注意,到目前为止,所有解决方案都使用标注文字替代,因此修改标注时不会更新标注值。
理想情况下,标注样式需要允许数千分隔符选项。
你太棒了!!!这正是我拍摄的目的。谢谢你,现在我来复习一下,学习一下你是怎么做到的。再次感谢所有提供帮助的人,请随时添加您的想法。我想学习并变得更好。
银色斗篷
欢迎使用Silver斗篷-如果您对代码有任何问题,请提问。
顺便说一句,我已经更新了上面的帖子和代码,为维度值修剪前导空格 另一种方式,不需要代码:
-要在Windows中设置数字格式,请转到
控制面板->区域和语言->格式[选项卡]->附加设置和设置数字分组符号的空间。
-在AutoCAD中,打开“DimStyle”对话框,编辑DimStyle,然后在“单位”选项卡中,将“单位格式”设置为Windows桌面。
我知道一定有比文本覆盖更好的方法-很好的一个Stefan @银色斗篷:
你可能想阅读论坛代码发布指南,并编辑你的第一篇文章来构建你的代码。
页:
[1]
2