wing 发表于 2022-7-5 22:22:32

将文本信息解析为

我想到了一个autolisp例程。我想选择具有方向角和距离(当然是公制单位)的文字或多行文字对象,并生成一个可以粘贴到其中的paste\u片段。
 
即。:
 
[列表=1]
[*]我单击一个文本,该文本的文本内容为12%%d01'10”。
[*]我点击一个文本,文本内容为10.01。
[*]对其他段重复
[*]我按c或esc结束输入。
[*]我在鼠标光标上得到了一个“漂亮”的粘贴U剪辑,其中我指定了插入点(第一条线段的方向为12°01'10”,长度为10.01)
[/列表]
 
作为一个新手autolisp程序员,有人能给我指出正确的方向吗?我有一些输出文本、线条和点的经验,但这有点难。多段线更好,但我不介意在这个阶段也有一系列的线。

hanhphuc 发表于 2022-7-5 22:25:53

嗨,荣,欢迎来到论坛
那么你要一个一个地点击粘贴?
还要粘贴到哪里?便条簿?
解析意味着用度符号替换%%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)选择

BIGAL 发表于 2022-7-5 22:31:38

有几种方法。编写临时文件和读取文件可能比使用复制粘贴更容易。第二种方法是创建一个两对列表,通过一行接一行地写来循环它们,或者strcat它们,然后保存为一个长列表。
 
(("12°01'10" 10.01)("15°01'10" 22.12))
("12°01'10 10.01" "15°01'10 22.12")
 
第三,如果你画的线是正确的,为什么还要麻烦文本呢?只需要选择线或普林斯等。

wing 发表于 2022-7-5 22:34:58

谢谢你的回复。从这些回复来看,我认为我没有说清楚。我为此道歉。我的意思是,携带方位和距离信息的文本或多行文字对象已经存在于cad图纸上。
 
线条不一定按比例绘制,甚至不一定按正确的方向绘制。历史、舍入、计划易读性和法律原因。别问我为什么。我在同一条船上。我要说的是,文本信息是具有法律意义的信息。这就是为什么,很多地籍工作都在检查和重新绘制文本信息。
 
通过仅基于单击多行文字对象创建线,我希望节省输入line/pline/arc命令的时间。我希望这对我为什么要写这篇文章有所帮助。

hmsilva 发表于 2022-7-5 22:35:32

如果我理解正确,作为起点:
(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)
)
 
希望有帮助
亨里克

hanhphuc 发表于 2022-7-5 22:39:51

如果您手动选择,则可能是人为错误,例如选择了错误的文本等。。除非可以反转操作/撤消。
你的第一个帖子项目#5插入文字?或者可以附着dwg?
Thanx BIGAL的想法可以更好地输出到csv或表格中。

BlackBox 发表于 2022-7-5 22:43:11

假设用户只选择2个文本实体,并且只有1个包含%%d,您可以避免每次手动选择每个文本实体,而不是让代码隐藏过滤SSLENGTH=2,然后进行WCMATCH或VL-STRING-SEARCH查询%%d。
 
我的0.02美元
 
 
 
干杯

hmsilva 发表于 2022-7-5 22:45:42

经过深思熟虑!

(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)
)
 
干杯
亨里克

BlackBox 发表于 2022-7-5 22:48:37

 
你这么说真好,亨里克;非常感谢。
 
也可以使用ActiveDocument的ActiveSelectionSet对象的Count属性代替SSLENGTH,并在同一个对象上使用VLAX-FOR代替SSNAME,因为SSNAME已经提供了VLA-*UNDOMARK调用所需的对象。
 
干杯

hmsilva 发表于 2022-7-5 22:52:34

这是一个好方法。
但正如OP所说:
我认为最好保持代码尽可能简单,以便于理解。。。
 
 
干杯
亨里克
页: [1] 2
查看完整版本: 将文本信息解析为