乐筑天下

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

[编程交流] 按部分处理实体

[复制链接]

28

主题

118

帖子

95

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2022-7-5 16:22:56 | 显示全部楼层 |阅读模式
我把下面的代码放在一起,它给了我以下错误:
 
 
错误:错误的参数类型:lentyp
 
 
按图层名称的数字部分处理实体:
 
  1. (defun c:DEMO (/ z s i e ln w)
  2. (vl-load-com)
  3. (defun numbers-from-string (str)
  4. (defun num-char-p (char)
  5.    (< 48 char 57)
  6. ) ;_ end of defun
  7. (vl-list->string
  8.    (vl-remove-if-not
  9.      'num-char-p
  10.      (vl-string->list str)
  11.    ) ;_ end of vl-remove-if-not
  12. ) ;_ end of vl-list->string
  13. ) ;_ end of defun
  14. (setq z '(100 125 150 175 200 225 250 275 300))
  15. (if (setq s (ssget ":L" '((0 . "LWPOLYLINE"))))
  16.   (repeat (setq i (sslength s))
  17.      (setq e (entget (ssname s (setq i (1- i)))))
  18.      (setq ln (cdr (assoc 8 e))
  19.         w  (* (car (member (atoi (numbers-from-string ln)) z)) 0.001)
  20.      ) ;_ end of setq
  21.      (vla-put-ConstantWidth (vlax-ename->vla-object e) w )
  22.   
  23.      (ssdel e s)
  24.   
  25.    ) ;_ end of repeat
  26. ) ;_ end of if
  27. (princ)
  28. ) ;_ end of defun

有人能帮忙吗?
 
 
提前感谢
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 16:33:11 | 显示全部楼层
试试这个,vlax ename不喜欢entget
 
  1. (setq obj (vlax-ename->vla-object (ssname s (setq i (1- i)))))
  2. (setq ln (vla-get-layer obj)
  3. ;    (setq ln  ln (cdr (assoc 8 (entget e)))
  4.         w  (* (car (member (atoi (numbers-from-string ln)) z)) 0.001)
  5.      ) ;_ end of setq
  6. (vla-put-ConstantWidth obj w )
回复

使用道具 举报

28

主题

118

帖子

95

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2022-7-5 16:36:48 | 显示全部楼层
 
 
 
完美的
 
 
谢谢BIGAL
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 16:46:33 | 显示全部楼层
不用担心,即使过了30年,我仍在学习
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 16:54:17 | 显示全部楼层
顺便说一句,我仍然认为NumbersFromString子函数应该这样写:
 
  1. ;_$ (mapcar 'cadr
  2. ;   (vl-sort
  3. ;     (vl-remove 'nil
  4. ;       (mapcar '(lambda (x / n) (if (setq n (NumberFromString x T)) (list n x) (list 0 x)) )
  5. ;         '("A1B" "ABC" "A17" "AB14.5B.C" "DEF" "A1.5B" "A16.BC")
  6. ;       )
  7. ;     )
  8. ;     '(lambda (a b) (< (car a) (car b)))
  9. ;   )
  10. ; )
  11. ; -> ("ABC" "DEF" "A1B" "A1.5B" "AB14.5B.C" "A16.BC" "A17")
  12. ; _$ (NumberFromString "12345" nil) -> 12345
  13. ; _$ (NumberFromString "12345" T) -> 12345
  14. ; _$ (NumberFromString "A.B.C,D,E" nil) -> nil
  15. ; _$ (NumberFromString "A.B.C,D,E" T) -> nil
  16. ; _$ (NumberFromString "A1.B2.C3,D4,E5" nil) -> 12345
  17. ; _$ (NumberFromString "A1.B2.C3,D4,E5" T) -> 1.2345
  18. (defun NumberFromString ( s RetainFirstDot )
  19. (cond
  20.    ( (not (eq 'STR (type s))) )
  21.    ( (not (vl-some (function (lambda (x) (< 47 x 58))) (vl-string->list s))) (setq s nil) )
  22.    (RetainFirstDot
  23.      (setq s (vl-list->string (vl-remove-if-not (function (lambda (x) (or (= x 46) (< 47 x 58)))) (vl-string->list s))))
  24.      (while (or (= "" s) (and (vl-some (function (lambda (x) (< 47 x 58))) (vl-string->list s)) (not (numberp (read s))))) ; attempt to retain the very first dot, but can return ".."
  25.        (setq s (vl-list->string (reverse (vl-string->list (vl-string-subst "" "." (apply 'strcat (reverse (mapcar 'chr (vl-string->list s)))))))))
  26.      ); while
  27.    ); RetainFirstDot
  28.    ( (setq s (vl-list->string (vl-remove-if-not (function (lambda (x) (< 47 x 58))) (vl-string->list s)))) )
  29. ); cond
  30. (cond ((not s) s) ((vl-every '(lambda (x) (= x 46)) (vl-string->list s)) nil)((= "" s) nil) (s (read s)))
  31. ); defun NumberFromString

 
如果它具有字母数字字符串排序目的,则至少是这样。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 16:56:50 | 显示全部楼层
下面是“字符串中的数字”函数的另一个版本:解析数字-尽管某些输入的预期结果可能取决于应用程序。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:05:24 | 显示全部楼层
 
仔细想想,你是对的。
让我想弄清楚这样的函数:
  1. _$ (foo "1abc-2.3b4cdef56")
  2. (1 "abc" -2.3 "b" 4 "cdef" 56)

这样可以更广泛地使用它,因此可以排除/使用哪个(第n个)项。
回复

使用道具 举报

28

主题

118

帖子

95

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2022-7-5 17:14:21 | 显示全部楼层
谢谢大家的帮助。
 
 
李/Grrr,
 
 
例如,由于输出层名称仅包含数字的一次出现;“THIS-IS-LAYER-125”。我只需要解析那个单一出现,我只需要数字(0-9),而不需要数学运算符或特殊字符。
 
 
李,我确实试过你的解析数函数,但是,它包括数学运算符,比如“-”(负号)。我不想开始破解你的代码。
 
 
比加尔,
经过李的Visual Lisp ActiveX教程的学习和帮助(http://www.lee-mac.com/selsetprocessing.html#activex),我已将代码更新为VLA,以避免需要将每个实体转换为其等效的VLA对象表示。很棒的教程,李!
 
 
  1. (defun c:DEMO (/ z s ln w)
  2. (vl-load-com)
  3. (defun numbers-from-string (str)
  4.    (defun num-char-p (char)
  5.      (< 47 char 57)
  6.    ) ;_ end of defun
  7.    (vl-list->string
  8.      (vl-remove-if-not
  9. 'num-char-p
  10. (vl-string->list str)
  11.      ) ;_ end of vl-remove-if-not
  12.    ) ;_ end of vl-list->string
  13. ) ;_ end of defun
  14. (setq z '(100 125 150 175 200 225 250 275 300))
  15. (if (setq s (ssget "_:L" '((0 . "LWPOLYLINE"))))
  16.    (progn
  17.      (vlax-for o (setq
  18.      s (vla-get-activeselectionset
  19.   (vla-get-activedocument (vlax-get-acad-object))
  20.        ) ;_ end of vla-get-activeselectionset
  21.    ) ;_ end of setq
  22. (setq ln (vla-get-layer o)
  23.       w  (* (car (member (atoi (numbers-from-string ln)) z)) 0.001)
  24. ) ;_ end of setq
  25. (vla-put-ConstantWidth o w)
  26.      ) ;_ end of vlax-for
  27.      (vla-delete s)
  28.    ) ;_ end of progn
  29. ) ;_ end of if
  30. (princ)
  31. ) ;_ end of defun
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:22:13 | 显示全部楼层
abra CAD abra,
 
你不需要“破解”李的代码,只需稍微操作一下输出:
  1. _$ (LM:parsenumbers "THIS-IS-LAYER-125")
  2. (-125)
  3. _$ (abs (last (LM:parsenumbers "THIS-IS-LAYER-125")))
  4. 125
  5. _$ (LM:parsenumbers "Pipes300-Layer-125")
  6. (300 -125)
  7. _$ (abs (last (LM:parsenumbers "Pipes300-Layer-125")))
  8. 125

 
然后你可以使用:
  1. (setq w (* (car (member (abs (last (LM:parsenumbers ln))) z)) 1e-3))

 
然而,对于您描述的情况,如果没有Lee的函数,您的代码应该可以正常工作。只需注意图层上没有数字引用的多段线:
 
  1. (and
  2. (setq ln (vla-get-Layer o))
  3. (setq w (numbers-from-string ln)) ; _$ (numbers-from-string "layer") -> ""
  4. (/= "" w) ; _$ (atoi "") -> 0
  5. (setq w (* (car (member (atoi w) z)) 0.001))
  6. (vla-put-ConstantWidth o w)
  7. ); and
回复

使用道具 举报

28

主题

118

帖子

95

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2022-7-5 17:23:30 | 显示全部楼层
 
 
谢谢你的帮助和建议,Grrr。我将更新代码,以允许层上的多段线不出现数字。
 
 
干杯
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-8-20 23:36 , Processed in 3.774715 second(s), 73 queries .

© 2020-2025 乐筑天下

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