乐筑天下

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

[编程交流] 在每个项目前添加“\P”

[复制链接]

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 17:38:45 | 显示全部楼层 |阅读模式
大家好,
今天,我想出了一个想法,在将多行文字插入绘图之前“创建”多行文字。
我对单行多行文字使用类似的lisp(仅键入并拾取插入点),因为我讨厌先定义多行文字框,然后键入的标准命令。
 
然而,这一点不同,因为它允许用户键入每一行,并在完成后插入它。构建了一个列表,其中每个项目代表一个新行,但我对每个项目前面的“\P”添加有问题,我无法生成“多行”多行文字:
  1. ; Attempt to type MTEXT:
  2. ; Construct list of strings, when done add "\P" between items, then entmake mtext with content of that list
  3. ; In user-speaking language: type rows for the mtext until done, then insert the mtext
  4. (defun c:test ( / ans mtxt-list pt1)
  5. (setq cont T)
  6. (setq mtxt-list (list))
  7. (initget "Finish")
  8. ; how to loop to type mtexts and pick points? (loop the loop)
  9. (while cont ; loop to type rows
  10.         (setq ans (getstring t "\nType a row for mtext or [Finish] : ")) ; ask for content of the row
  11.         (cond
  12.                 ( (or (and (= ans "Finish") mtxt-list ) (and (= ans "FINISH") mtxt-list ) (and (= ans "F") mtxt-list ) (and (= ans "f") mtxt-list ) ) ; check if the list is not nil
  13.                         (setq cont F) ; stop loop for typing rows
  14.                         (setq pt1 (getpoint "\nSpecify insertion point for the mtext:"))
  15.                         (M-Text pt1 (substr (vl-princ-to-string (reverse mtxt-list)) 2 (- (strlen (vl-princ-to-string mtxt-list)) 2)) ) ; removed first and last syntax
  16.                 )
  17.                 (t
  18.                         (setq mtxt-list (cons (strcat (substr "x\P" 2) ans) mtxt-list)) ; how to add "\P" infornt each item?
  19.                         (print (reverse mtxt-list))(princ (strcat ", " (itoa (length mtxt-list)) " rows."))
  20.                 ); t
  21.         );cond
  22. );while
  23. (princ)
  24. );defun       
  25. ; LM
  26. (defun M-Text (pt str)
  27. (entmakex
  28.         (list
  29.                 (cons 0 "MTEXT")         
  30.                 (cons 100 "AcDbEntity")
  31.                 (cons 100 "AcDbMText")
  32.                 (cons 10 pt)
  33.                 (cons 1 str)
  34.                 (cons 71 5)
  35.         )
  36. )
  37. )

我遇到的下一个(不是那么大)问题是,我正在尝试循环整个过程,因此在输入多行文字后,用户会提示输入一行新的多行文字。(以此类推..键入多行文字行、拾取点..以此类推)。
 
我已经对部分代码进行了注释,以便您更容易理解我在那里做的事情。提前感谢!
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 17:50:12 | 显示全部楼层
有一些想法需要思考。
 
  1. (defun c:test (/ go lst ans p)
  2. (setq go t lst "")
  3. (while (and go (setq ans (getstring t "\nType a row for mtext or [Enter to Finish] :")))
  4.    (cond ((and (/= ans "") (eq (type ans) 'str))
  5.           (setq lst (strcat lst ans "\\P"))
  6.           )
  7.          ((and (eq ans "")
  8.                (/= lst "")
  9.                (setq p (getpoint "\nSpecify insertion point for the mtext:"))
  10.                )
  11.           (entmakex (list '(0 . "MTEXT")
  12.                           '(100 . "AcDbEntity")
  13.                           '(100 . "AcDbMText")
  14.                     (cons 10 (trans p 1 0))
  15.                     (cons 1 lst)
  16.                     '(71 . 5)
  17.                     ))
  18.           (setq go nil))
  19.          ((= ans "") (setq go nil))
  20.          )
  21.    )
  22. (princ)
  23. )
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 17:52:06 | 显示全部楼层
我做了一个快速的尝试,似乎奏效了,稍后我会更仔细地分析它,并尝试找出如何循环这个循环。
乍一看,我看到您将substr和vl princ跳过为字符串函数,因此将为我提供新信息。
再次感谢你,塔瓦!
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:02:30 | 显示全部楼层
祝你好运
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 18:05:19 | 显示全部楼层
就这么做了,把整个事情循环起来:
 
  1. (defun c:test (/ go2 go lst ans p)
  2. (setq go2 T)
  3. (while go2
  4.         (setq go T)
  5.         (setq lst "")
  6.         (while (and go (setq ans (getstring t "\nType a row for mtext or [Enter to Finish] :")))
  7.                 (cond
  8.                         ( (and (/= ans "") (eq (type ans) 'str))
  9.                                 (setq lst (strcat lst ans "\\P"))
  10.                         )
  11.                        
  12.                         ( (and (eq ans "") (/= lst "") (setq p (getpoint "\nSpecify insertion point for the mtext:")))
  13.                                 (if (and
  14.                                         (entmakex
  15.                                                 (list
  16.                                                         '(0 . "MTEXT")
  17.                                                         '(100 . "AcDbEntity")
  18.                                                         '(100 . "AcDbMText")
  19.                                                         (cons 10 (trans p 1 0))
  20.                                                         (cons 1 lst)
  21.                                                         '(71 . 5)
  22.                                                 )
  23.                                         )
  24.                                         (setq go nil)
  25.                                 )
  26.                                 (setq go2 T)
  27.                                 )
  28.                         )
  29.                         ( (= ans "")
  30.                                 (setq go nil)
  31.                                 (setq go2 F)
  32.                         )
  33.                 ); cond
  34.         ); sub-while
  35. ); main while
  36. (princ)
  37. );defun

可能存在一些不合逻辑的情况,但一切正常。
令我印象深刻的是,你竟然想到使用假列表,在用“\\P”分隔输入的同时构造一个很长的字符串!
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 18:11:09 | 显示全部楼层
Grr有一个帖子,添加颜色,字体风格等李和我张贴可能会有用的未来。
 
找到了http://www.cadtutor.net/forum/showthread.php?92585-帮助仅更改多行文字中数字的颜色&高亮显示=多行文字
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 18:20:39 | 显示全部楼层
这是一条有趣的线索,比格尔
我通常不会格式化我的文本/多行文字对象,但我会看看是否可以从这些代码中学习到新的东西。
发布在那里的解决方案(代码)似乎变得越来越复杂,并且总是有这些额外的修改请求(供个人使用)。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 18:24:39 | 显示全部楼层
由于其中一个表达式等于nil,上述and函数将不会返回true。
 
 
我认为将变量设置为nil比将其设置为null符号更好。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 18:30:39 | 显示全部楼层
根据Tharwats的评论,对代码进行了更正:
  1. (defun c:test (/ go2 go lst ans p)
  2. (setq go2 T)
  3. (while go2
  4.         (setq go T)
  5.         (setq lst "")
  6.         (while (and go (setq ans (getstring t "\nType a row for mtext or [Enter to Finish] :")))
  7.                 (cond
  8.                         ( (and (/= ans "") (eq (type ans) 'str))
  9.                                 (setq lst (strcat lst ans "\\P"))
  10.                         )
  11.                        
  12.                         ( (and (eq ans "") (/= lst "") (setq p (getpoint "\nSpecify insertion point for the mtext:")))
  13.                                 (if
  14.                                         (entmakex
  15.                                                 (list
  16.                                                         '(0 . "MTEXT")
  17.                                                         '(100 . "AcDbEntity")
  18.                                                         '(100 . "AcDbMText")
  19.                                                         (cons 10 (trans p 1 0))
  20.                                                         (cons 1 lst)
  21.                                                         '(71 . 5)
  22.                                                 )
  23.                                         )
  24.                                         (progn
  25.                                                 (setq go nil)
  26.                                                 (setq go2 T)
  27.                                         )
  28.                                 )
  29.                         )
  30.                         ( (= ans "")
  31.                                 (setq go nil)
  32.                                 (setq go2 nil)
  33.                         )
  34.                 ); cond
  35.         ); sub-while
  36. ); main while
  37. (princ)
  38. );defun
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 18:41:18 | 显示全部楼层
 
很好的发现!
我不习惯这种编写代码的方式(像progn一样编写setq函数),不知道为什么会这样-也许我自己更容易跟踪(如果代码有问题)。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 03:25 , Processed in 0.892198 second(s), 83 queries .

© 2020-2025 乐筑天下

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