乐筑天下

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

[编程交流] 将文本信息解析为

[复制链接]

2

主题

9

帖子

4

银币

初来乍到

Rank: 1

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

    使用道具 举报

    5

    主题

    956

    帖子

    963

    银币

    初来乍到

    Rank: 1

    铜币
    35
    发表于 2022-7-5 22:25:53 | 显示全部楼层
    嗨,荣,欢迎来到论坛
    那么你要一个一个地点击粘贴?
    还要粘贴到哪里?便条簿?
    解析意味着用度符号替换%%d?
    1. (defun %%d (str)
    2. (vl-string-subst (chr 176)
    3. (substr str (1+ (vl-string-search "%" str)) 3)
    4. str))

    参数字符串
    1. (%%d "12%%d01'10")
    2. ;retval= "12°01'10"

    我的建议是更快地使用(ssget)选择
    回复

    使用道具 举报

    106

    主题

    1万

    帖子

    101

    银币

    顶梁支柱

    Rank: 50Rank: 50

    铜币
    1299
    发表于 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")
     
    第三,如果你画的线是正确的,为什么还要麻烦文本呢?只需要选择线或普林斯等。
    回复

    使用道具 举报

    2

    主题

    9

    帖子

    4

    银币

    初来乍到

    Rank: 1

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

    使用道具 举报

    1

    主题

    475

    帖子

    481

    银币

    初来乍到

    Rank: 1

    铜币
    5
    发表于 2022-7-5 22:35:32 | 显示全部楼层
    如果我理解正确,作为起点:
    1. (defun c:demo (/ A ANG B C D S)
    2. (if (setq c (getpoint "\nEnter the line startpoint: "))
    3.    (while (and (princ "\nSelect the text with the direction: ")
    4.                (setq a (ssget "_+.:E:S" '((0 . "TEXT,MTEXT"))))
    5.                (princ "\nSelect the text with the distance: ")
    6.                (setq b (ssget "_+.:E:S" '((0 . "TEXT,MTEXT"))))
    7.           )
    8.      (if (and (setq s (strcase (cdr (assoc 1 (entget (ssname a 0))))))
    9.               (setq ang (angtof (strcat (substr (vl-string-subst "d" "%%D" s) 1 (- (strlen s) 1)))
    10.                                 3
    11.                         )
    12.               )
    13.          )
    14.        (if (setq d (atof (cdr (assoc 1 (entget (ssname b 0))))))
    15.          (entmake (list (cons 0 "LINE")
    16.                         (cons 10 c)
    17.                         (cons 11
    18.                               (setq c (polar c ang d))
    19.                         )
    20.                   )
    21.          )
    22.        )
    23.      )
    24.    )
    25. )
    26. (princ)
    27. )

     
    希望有帮助
    亨里克
    回复

    使用道具 举报

    5

    主题

    956

    帖子

    963

    银币

    初来乍到

    Rank: 1

    铜币
    35
    发表于 2022-7-5 22:39:51 | 显示全部楼层
    如果您手动选择,则可能是人为错误,例如选择了错误的文本等。。除非可以反转操作/撤消。
    你的第一个帖子项目#5插入文字?或者可以附着dwg?
    Thanx BIGAL的想法可以更好地输出到csv或表格中。
    回复

    使用道具 举报

    44

    主题

    3166

    帖子

    2803

    银币

    中流砥柱

    Rank: 25

    铜币
    557
    发表于 2022-7-5 22:43:11 | 显示全部楼层
    假设用户只选择2个文本实体,并且只有1个包含%%d,您可以避免每次手动选择每个文本实体,而不是让代码隐藏过滤SSLENGTH=2,然后进行WCMATCH或VL-STRING-SEARCH查询%%d。
     
    我的0.02美元
     
     
     
    干杯
    回复

    使用道具 举报

    1

    主题

    475

    帖子

    481

    银币

    初来乍到

    Rank: 1

    铜币
    5
    发表于 2022-7-5 22:45:42 | 显示全部楼层
    经过深思熟虑!
    1. (defun c:demo1 (/ _test a b lst pt ss)
    2. (defun _test (x y / ang d)
    3.    (if (and (wcmatch x "*%%D*")
    4.             (setq ang
    5.                    (angtof (strcat (substr (vl-string-subst "d" "%%D" x) 1 (- (strlen x) 1)))
    6.                            3
    7.                    )
    8.             )
    9.             (setq d (atof y))
    10.             (/= d 0.0)
    11.        )
    12.      (list ang d)
    13.    )
    14. )
    15. (if (setq pt (getpoint "\nEnter the line startpoint: "))
    16.    (while (and (princ "\nSelect the texts with the direction and the distance: ")
    17.                (setq ss (ssget '((0 . "TEXT,MTEXT"))))
    18.                (= 2 (sslength ss))
    19.                (setq a (strcase (cdr (assoc 1 (entget (ssname ss 0))))))
    20.                (setq b (strcase (cdr (assoc 1 (entget (ssname ss 1))))))
    21.                (or (setq lst (_test a b))
    22.                    (setq lst (_test b a))
    23.                )
    24.           )
    25.      (entmake (list (cons 0 "LINE")
    26.                     (cons 10 pt)
    27.                     (cons 11
    28.                           (setq pt (polar pt (car lst) (cadr lst)))
    29.                     )
    30.               )
    31.      )
    32.    )
    33. )
    34. (princ)
    35. )

     
    干杯
    亨里克
    回复

    使用道具 举报

    44

    主题

    3166

    帖子

    2803

    银币

    中流砥柱

    Rank: 25

    铜币
    557
    发表于 2022-7-5 22:48:37 | 显示全部楼层
     
    你这么说真好,亨里克;非常感谢。
     
    也可以使用ActiveDocument的ActiveSelectionSet对象的Count属性代替SSLENGTH,并在同一个对象上使用VLAX-FOR代替SSNAME,因为SSNAME已经提供了VLA-*UNDOMARK调用所需的对象。
     
    干杯
    回复

    使用道具 举报

    1

    主题

    475

    帖子

    481

    银币

    初来乍到

    Rank: 1

    铜币
    5
    发表于 2022-7-5 22:52:34 | 显示全部楼层
    这是一个好方法。
    但正如OP所说:
    我认为最好保持代码尽可能简单,以便于理解。。。
     
     
    干杯
    亨里克
    回复

    使用道具 举报

    发表回复

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

    本版积分规则

    • 微信公众平台

    • 扫描访问手机版

    • 点击图片下载手机App

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

    GMT+8, 2025-3-11 06:23 , Processed in 0.480809 second(s), 72 queries .

    © 2020-2025 乐筑天下

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