将文本信息解析为
我想到了一个autolisp例程。我想选择具有方向角和距离(当然是公制单位)的文字或多行文字对象,并生成一个可以粘贴到其中的paste\u片段。即。:
[列表=1]
[*]我单击一个文本,该文本的文本内容为12%%d01'10”。
[*]我点击一个文本,文本内容为10.01。
[*]对其他段重复
[*]我按c或esc结束输入。
[*]我在鼠标光标上得到了一个“漂亮”的粘贴U剪辑,其中我指定了插入点(第一条线段的方向为12°01'10”,长度为10.01)
[/列表]
作为一个新手autolisp程序员,有人能给我指出正确的方向吗?我有一些输出文本、线条和点的经验,但这有点难。多段线更好,但我不介意在这个阶段也有一系列的线。 嗨,荣,欢迎来到论坛
那么你要一个一个地点击粘贴?
还要粘贴到哪里?便条簿?
解析意味着用度符号替换%%d?
(defun %%d (str)
(vl-string-subst (chr 176)
(substr str (1+ (vl-string-search "%" str)) 3)
str))
参数字符串
(%%d "12%%d01'10")
;retval= "12°01'10"
我的建议是更快地使用(ssget)选择 有几种方法。编写临时文件和读取文件可能比使用复制粘贴更容易。第二种方法是创建一个两对列表,通过一行接一行地写来循环它们,或者strcat它们,然后保存为一个长列表。
(("12°01'10" 10.01)("15°01'10" 22.12))
("12°01'10 10.01" "15°01'10 22.12")
第三,如果你画的线是正确的,为什么还要麻烦文本呢?只需要选择线或普林斯等。 谢谢你的回复。从这些回复来看,我认为我没有说清楚。我为此道歉。我的意思是,携带方位和距离信息的文本或多行文字对象已经存在于cad图纸上。
线条不一定按比例绘制,甚至不一定按正确的方向绘制。历史、舍入、计划易读性和法律原因。别问我为什么。我在同一条船上。我要说的是,文本信息是具有法律意义的信息。这就是为什么,很多地籍工作都在检查和重新绘制文本信息。
通过仅基于单击多行文字对象创建线,我希望节省输入line/pline/arc命令的时间。我希望这对我为什么要写这篇文章有所帮助。 如果我理解正确,作为起点:
(defun c:demo (/ A ANG B C D S)
(if (setq c (getpoint "\nEnter the line startpoint: "))
(while (and (princ "\nSelect the text with the direction: ")
(setq a (ssget "_+.:E:S" '((0 . "TEXT,MTEXT"))))
(princ "\nSelect the text with the distance: ")
(setq b (ssget "_+.:E:S" '((0 . "TEXT,MTEXT"))))
)
(if (and (setq s (strcase (cdr (assoc 1 (entget (ssname a 0))))))
(setq ang (angtof (strcat (substr (vl-string-subst "d" "%%D" s) 1 (- (strlen s) 1)))
3
)
)
)
(if (setq d (atof (cdr (assoc 1 (entget (ssname b 0))))))
(entmake (list (cons 0 "LINE")
(cons 10 c)
(cons 11
(setq c (polar c ang d))
)
)
)
)
)
)
)
(princ)
)
希望有帮助
亨里克 如果您手动选择,则可能是人为错误,例如选择了错误的文本等。。除非可以反转操作/撤消。
你的第一个帖子项目#5插入文字?或者可以附着dwg?
Thanx BIGAL的想法可以更好地输出到csv或表格中。 假设用户只选择2个文本实体,并且只有1个包含%%d,您可以避免每次手动选择每个文本实体,而不是让代码隐藏过滤SSLENGTH=2,然后进行WCMATCH或VL-STRING-SEARCH查询%%d。
我的0.02美元
干杯 经过深思熟虑!
(defun c:demo1 (/ _test a b lst pt ss)
(defun _test (x y / ang d)
(if (and (wcmatch x "*%%D*")
(setq ang
(angtof (strcat (substr (vl-string-subst "d" "%%D" x) 1 (- (strlen x) 1)))
3
)
)
(setq d (atof y))
(/= d 0.0)
)
(list ang d)
)
)
(if (setq pt (getpoint "\nEnter the line startpoint: "))
(while (and (princ "\nSelect the texts with the direction and the distance: ")
(setq ss (ssget '((0 . "TEXT,MTEXT"))))
(= 2 (sslength ss))
(setq a (strcase (cdr (assoc 1 (entget (ssname ss 0))))))
(setq b (strcase (cdr (assoc 1 (entget (ssname ss 1))))))
(or (setq lst (_test a b))
(setq lst (_test b a))
)
)
(entmake (list (cons 0 "LINE")
(cons 10 pt)
(cons 11
(setq pt (polar pt (car lst) (cadr lst)))
)
)
)
)
)
(princ)
)
干杯
亨里克
你这么说真好,亨里克;非常感谢。
也可以使用ActiveDocument的ActiveSelectionSet对象的Count属性代替SSLENGTH,并在同一个对象上使用VLAX-FOR代替SSNAME,因为SSNAME已经提供了VLA-*UNDOMARK调用所需的对象。
干杯 这是一个好方法。
但正如OP所说:
我认为最好保持代码尽可能简单,以便于理解。。。
干杯
亨里克
页:
[1]
2