乐筑天下

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

[编程交流] 转义字符串

[复制链接]

15

主题

315

帖子

361

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-7-5 21:09:24 | 显示全部楼层
好的,我感兴趣的是最后一个函数:逃逸。
 
我添加了一个带有几个属性块的dwg。
命令是BLOCKS(我喜欢将客户端可访问的函数作为最后一个函数编写)
 
这会将数据导出到“block_export.txt”,与dwg位于同一文件夹中(因此请不要在未保存的图形上使用此选项)
 
要求:值中的每个双引号必须在中转义。txt文件,以便将其解析为lisp数据
 
  1. (vl-load-com)
  2. (defun blocks ( / iterations i block attString content_string)
  3. ;; select blocks (all blocks in the dwg)
  4. (setq
  5.    blocks (ssget "X" (list
  6.      '(0 . "INSERT")
  7.    ))
  8.    iterations (sslength blocks)                                        ;; number of iterations
  9.    i 0                                                                 
  10.    block nil                                                           
  11.    content_string ""                                                   ;; this is the variable containing the content we will save to file
  12. )
  13. (repeat iterations                                                    ;; loop over blocks
  14.    (setq block (ssname blocks i))
  15.    ;; attributes
  16.    (setq attString "")
  17.    (foreach att (vlax-invoke (vlax-ename->vla-object block) 'GetAttributes)
  18.      (setq attVal (vla-get-TextString att))
  19.      (setq tag (vla-get-TagString att))
  20.      (setq attVal (escape attVal))
  21.      (setq attString (strcat attString "("" tag "" ""  attval "") "))
  22.    )
  23.    (setq content_string (strcat content_string "("  attString ")\n" ))
  24.    (setq i (+ 1 i))
  25. )
  26. ;; this prints the contents to file.  The file is "block_export.txt" , in the same folder as the dwg.
  27. ;; Notice: save the dwg before using this
  28. (file_put_contents (strcat (getvar 'dwgprefix) "block_export.txt") content_string)
  29. )
  30. ;; http://forums.autodesk.com/t5/visual...e/td-p/3732910
  31. (defun replace (newstr oldstr str / localstr)
  32. (setq localstr str)
  33. (while (vl-string-search oldstr localstr)
  34.    (setq localstr (vl-string-subst newstr oldstr localstr))
  35.    (replace newstr oldstr localstr)
  36. )
  37. localstr
  38. )
  39. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  40. ;; file IO.  
  41. ;; made to look like the php-functions file_put_contents & file_get_contents
  42. ;; (Not sure where I found these and how much of it I wrote my self)
  43. ;; saves a string to file
  44. (defun file_put_contents (file_name content / result f)
  45. (setq result T)
  46. (if (setq f (open file_name "w"))                                    
  47.    (progn
  48.      (write-line content f)                                            
  49.      (close f)                                                         
  50.    )
  51.    (progn
  52.      (setq result NIL)
  53.    )
  54. )
  55. result
  56. )
  57. ;; read file as string
  58. (defun file_get_contents (file_name / content)
  59. (setq content "")
  60. (if(setq fp (open file_name "r"))                                     ; file pointer
  61.    (progn
  62.      (while (setq txtLine(read-line fp))                              
  63.        (setq content (strcat content "\n" txtLine))                    
  64.      )
  65.      (close fp)                                                        
  66.      content                                                           ; return content
  67.    )
  68.    (progn
  69.      NIL                                                               ; return false
  70.    )
  71. )
  72. )
  73. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  74. (defun _add:slash (st)
  75. (if (wcmatch st "*"")
  76.    (strcat (substr st 1 (1- (strlen st))) (chr 92) (chr 34))
  77. )
  78. st
  79. )
  80. (defun escape(str / )
  81. ;;(replace """ "\\"" str)
  82. (_add:slash str)
  83. )
  84. (defun c:blocks ( / )
  85. (blocks)
  86. (princ)
  87. )

 
注意:
-函数替换目前未使用。
-file\u get\u内容根本没有使用;但是因为我提供了file\u put\u内容,所以我也可以提供file\u get\u内容。
图纸2.dwg
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 21:14:01 | 显示全部楼层
试试这个,让我知道。
 
  1. (defun c:test (/ _add:slash ss i block l f o)
  2. ;; Tharwat 18.12.2014        ;;
  3. (defun _add:slash (st)
  4.    (if (wcmatch st "*"")
  5.      (setq
  6.        st (strcat (substr st 1 (1- (strlen st))) (chr 92) (chr 34))
  7.      )
  8.      st
  9.    )
  10.    st
  11. )
  12. (if (setq ss (ssget "_X" '((0 . "INSERT"))))
  13.    (progn
  14.      (setq f (strcat (getvar 'dwgprefix) "block_export22.txt")
  15.            o (open f "w")
  16.      )
  17.      (repeat (setq i (sslength ss))
  18.        (foreach x
  19.                 (vlax-invoke
  20.                   (vlax-ename->vla-object (ssname ss (setq i (1- i))))
  21.                   'getattributes
  22.                 )
  23.          (setq l (cons (strcat "("
  24.                                (chr 34)
  25.                                (vla-get-tagstring x)
  26.                                (chr 34)
  27.                                " "
  28.                                (chr 34)
  29.                                (_add:slash (vla-get-textstring x))
  30.                                (chr 34)
  31.                                ")"
  32.                        )
  33.                        l
  34.                  )
  35.          )
  36.        )
  37.        (write-line (vl-princ-to-string l) o)
  38.        (setq l nil)
  39.      )
  40.      (close o)
  41.    )
  42. )
  43. (princ)
  44. )(vl-load-com)
回复

使用道具 举报

15

主题

315

帖子

361

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-7-5 21:17:45 | 显示全部楼层
它适用于属性,其中“是最后一个字符;谢谢。
当“在字符串中间的某个地方时,它仍然不起作用。
 
但我很确定从现在起我能找到答案。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 21:22:52 | 显示全部楼层
 
很好,听到这个消息我很高兴。
 
 
祝你好运,不要犹豫,如果你坚持任何。
 
注意:我只是为了测试而更改了txt文件的名称,但忘记了按原样返回,所以只需从标题中删除两个2号即可。
 
当做
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 21:24:42 | 显示全部楼层
顺便说一句,最好添加过滤器(66.1),使其仅在选择集中包含属性块。
回复

使用道具 举报

15

主题

315

帖子

361

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-7-5 21:30:37 | 显示全部楼层
是的,我知道,但我也需要没有属性的块。正如我所说,这是代码的一个简短版本,整个程序做了一些额外的事情。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-3 20:26 , Processed in 0.733888 second(s), 62 queries .

© 2020-2025 乐筑天下

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