乐筑天下

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

[编程交流] 将多段线长度提取到

[复制链接]

1

主题

11

帖子

10

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:39:36 | 显示全部楼层 |阅读模式
你好我正在寻找一种LISP,它允许选择多条多段线,将其长度提取到属性标记(“长度”)块作为字段,
知道在多段线的每一端是有问题的块(属性标记在哪里)。我找到了一个LISP Lee Mac,但它不符合我的期望,因为我必须逐个选择每个字符串和每个属性。
 
  1. (defun c:Len2Fld ( / *error* tables doc spc p s q ExitFlag )
  2. (vl-load-com)
  3.      (while
  4. (defun *error* ( msg )
  5.    (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  6.        (princ (strcat "\n** Error: " msg " **")))
  7.    (princ)
  8. )
  9. (setq tables (LM:ss->vla (ssget "_X" '((0 . "ACAD_TABLE")))))
  10. (LM:ActiveSpace 'doc 'spc)   
  11. (cond
  12.    (
  13.      (setq p
  14.        (LM:Selectif
  15.          (lambda ( x )
  16.            (vlax-property-available-p
  17.              (vlax-ename->vla-object x) 'Length
  18.            )
  19.          )
  20.          "\nMétré longeur, Selectionner cable: " nil
  21.        )
  22.      )
  23.      (setq s
  24.        (strcat "%<\\AcObjProp Object(%<\\_ObjId "
  25.          (LM:GetObjectID doc (vlax-ename->vla-object p)) ">%).Length \\f "%lu6">%"
  26.        )
  27.      )         
  28.      (while
  29.        (progn
  30.          (or ExitFlag
  31.            (progn
  32.              (initget "Point")
  33.              (setq p (nentsel "\nSelect Text, MText or Attribute for Result [Point] <Exit> : "))
  34.            )
  35.          )
  36.         
  37.          (cond
  38.            (
  39.              ExitFlag nil
  40.            )
  41.            (
  42.              (vl-consp p)
  43.            
  44.              (if (wcmatch (cdr (assoc 0 (entget (car p)))) "ATTRIB,*TEXT")
  45.                (vla-put-TextString (vlax-ename->vla-object (car p)) s)
  46.                (princ "\n** Object Must be Text, MText or Attribute **")
  47.              )
  48.            )
  49.          )
  50.        )
  51.      )
  52.    )
  53. )
  54. (vla-regen doc AcActiveViewport)
  55. (princ)
  56. )
  57. )  
  58. (defun LM:ActiveSpace ( *doc *spc )
  59. (set *spc
  60.    (if
  61.      (or
  62.        (eq AcModelSpace
  63.          (vla-get-ActiveSpace
  64.            (set *doc
  65.              (vla-get-ActiveDocument
  66.                (vlax-get-acad-object)
  67.              )
  68.            )
  69.          )
  70.        )
  71.        (eq :vlax-true (vla-get-MSpace (eval *doc)))
  72.      )
  73.      (vla-get-ModelSpace (eval *doc))
  74.      (vla-get-PaperSpace (eval *doc))
  75.    )
  76. )
  77. )
  78. (defun LM:Selectif ( foo str nest / e )
  79.    (while
  80.    (progn
  81.      (setq e (car ((if nest nentsel entsel) str)))
  82.      
  83.      (cond
  84.        (
  85.          (eq 'ENAME (type e))
  86.          (if (not (foo e)) (princ "\n** Invalid Object Selected **"))
  87.        )
  88.      )
  89.    )
  90. )
  91. e
  92. )
  93. (defun LM:GetObjectID ( doc obj )
  94. (if (eq "X64" (strcase (getenv "PROCESSOR_ARCHITECTURE")))
  95.    (vlax-invoke-method (vla-get-Utility doc) 'GetObjectIdString obj :vlax-false)
  96.    (itoa (vla-get-Objectid obj))
  97. )
  98. )
  99. (defun LM:ss->vla ( ss )
  100.   (if ss
  101.    (
  102.      (lambda ( i / e l )
  103.        (while (setq e (ssname ss (setq i (1+ i))))
  104.          (setq l (cons (vlax-ename->vla-object e) l))
  105.        )
  106.        l
  107.      )
  108.      -1
  109.    )
  110. )
  111. )
我想减少运算次数,如有任何帮助,将不胜感激。
这是我想要的结果
 
示例dwg
Cablage VDI 3。图纸
 
提前谢谢(对不起我的英语)
Cablage VDI 2。图纸
回复

使用道具 举报

1

主题

475

帖子

481

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:45:13 | 显示全部楼层
你好,塔马里兹,欢迎来到CADTutor!
 
如果可能,发布一个带有几个多段线和几个块的样例dwg以进行处理。
 
亨里克
回复

使用道具 举报

1

主题

11

帖子

10

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:49:00 | 显示全部楼层
谢谢
例如,我在上一篇文章中添加了dwg
回复

使用道具 举报

1

主题

475

帖子

481

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:51:21 | 显示全部楼层
选择洋红色LW多段线。。。
  1. (vl-load-com)
  2. (defun c:demo (/ attlst blk doc en_pt obj ss ss1 ss2 st_pt)
  3. (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  4. (if (setq ss (ssget '((0 . "LWPOLYLINE"))))
  5.    (repeat (setq i (sslength ss))
  6.      (setq obj   (vlax-ename->vla-object (ssname ss (setq i (1- i))))
  7.            st_pt (vlax-curve-getStartPoint obj)
  8.            en_pt (vlax-curve-getEndPoint obj)
  9.      )
  10.      (command "_.zoom" "_C" st_pt "")
  11.      (setq ss1 (ssget "_C"
  12.                       (polar st_pt (* 0.25 pi) 0.1)
  13.                       (polar st_pt (* 1.25 pi) 0.1)
  14.                       '((0 . "INSERT") (2 . "RJ45CAT6") (66 . 1))
  15.                )
  16.      )
  17.      (command "_.zoom" "_C" en_pt "")
  18.      (setq ss2 (ssget "_C"
  19.                       (polar en_pt (* 0.25 pi) 0.1)
  20.                       (polar en_pt (* 1.25 pi) 0.1)
  21.                       '((0 . "INSERT") (2 . "RJ45CAT6") (66 . 1))
  22.                )
  23.      )
  24.      (cond (ss1
  25.             (setq blk (vlax-ename->vla-object (ssname ss1 0)))
  26.            )
  27.            (ss2
  28.             (setq blk (vlax-ename->vla-object (ssname ss2 0)))
  29.            )
  30.      )
  31.      (if blk
  32.        (progn
  33.          (setq attlst (vlax-invoke blk 'GetAttributes))
  34.          (foreach a attlst
  35.            (if (= (vla-get-TagString a) "LENGTH")
  36.              (vla-put-TextString
  37.                a
  38.                (strcat "%<\\AcObjProp Object(%<\\_ObjId "
  39.                        (LM:GetObjectID doc obj)
  40.                        ">%).Length \\f "%lu6">%"
  41.                )
  42.              )
  43.            )
  44.          )
  45.        )
  46.      )
  47.    )
  48. )
  49. (vla-regen doc AcActiveViewport)
  50. (princ)
  51. )
  52. (defun LM:GetObjectID (doc obj)
  53. (if (eq "X64" (strcase (getenv "PROCESSOR_ARCHITECTURE")))
  54.    (vlax-invoke-method
  55.      (vla-get-Utility doc)
  56.      'GetObjectIdString
  57.      obj
  58.      :vlax-false
  59.    )
  60.    (itoa (vla-get-Objectid obj))
  61. )
  62. )

 
亨里克
回复

使用道具 举报

1

主题

11

帖子

10

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:53:14 | 显示全部楼层
太神了谢谢
回复

使用道具 举报

1

主题

11

帖子

10

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:56:06 | 显示全部楼层
Lisp程序很好用
我刚刚添加了两个命令,因为我有一个项目,我的UCS与世界不同
  1. (vl-load-com)
  2. (defun c:demo (/ attlst blk doc en_pt obj ss ss1 ss2 st_pt)
  3. (command "_.ucs" "_world")
  4. (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  5. (if (setq ss (ssget '((0 . "LWPOLYLINE"))))
  6.    (repeat (setq i (sslength ss))
  7.      (setq obj   (vlax-ename->vla-object (ssname ss (setq i (1- i))))
  8.            st_pt (vlax-curve-getStartPoint obj)
  9.            en_pt (vlax-curve-getEndPoint obj)
  10.      )
  11.      (command "_.zoom" "_C" st_pt "")
  12.      (setq ss1 (ssget "_C"
  13.                       (polar st_pt (* 0.25 pi) 0.1)
  14.                       (polar st_pt (* 1.25 pi) 0.1)
  15.                       '((0 . "INSERT") (2 . "etiquetteVDI") (66 . 1))
  16.                )
  17.      )
  18.      (command "_.zoom" "_C" en_pt "")
  19.      (setq ss2 (ssget "_C"
  20.                       (polar en_pt (* 0.25 pi) 0.1)
  21.                       (polar en_pt (* 1.25 pi) 0.1)
  22.                       '((0 . "INSERT") (2 . "etiquetteVDI") (66 . 1))
  23.                )
  24.      )
  25.      (cond (ss1
  26.             (setq blk (vlax-ename->vla-object (ssname ss1 0)))
  27.            )
  28.            (ss2
  29.             (setq blk (vlax-ename->vla-object (ssname ss2 0)))
  30.            )
  31.      )
  32.      (if blk
  33.        (progn
  34.          (setq attlst (vlax-invoke blk 'GetAttributes))
  35.          (foreach a attlst
  36.            (if (= (vla-get-TagString a) "LONGUEUR")
  37.              (vla-put-TextString
  38.                a
  39.                (strcat "%<\\AcObjProp Object(%<\\_ObjId "
  40.                        (LM:GetObjectID doc obj)
  41.                        ">%).Length \\f "%lu6">%"
  42.                )
  43.              )
  44.            )
  45.          )
  46.        )
  47.      )
  48.    )
  49. )
  50. (command "UCS" "P")
  51. (vla-regen doc AcActiveViewport)
  52. (princ)
  53. )
  54. (defun LM:GetObjectID (doc obj)
  55. (if (eq "X64" (strcase (getenv "PROCESSOR_ARCHITECTURE")))
  56.    (vlax-invoke-method
  57.      (vla-get-Utility doc)
  58.      'GetObjectIdString
  59.      obj
  60.      :vlax-false
  61.    )
  62.    (itoa (vla-get-Objectid obj))
  63. )
  64. )
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 18:00:39 | 显示全部楼层
我只是想知道,既然你在第一篇文章的视频中有一个节目,为什么你还要要求一个节目呢!
回复

使用道具 举报

1

主题

11

帖子

10

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 18:03:56 | 显示全部楼层
这只是一个视频编辑,我在填充(手动)字段的地方剪切序列
这是为了更好地理解我的要求(我的英语很差)
回复

使用道具 举报

1

主题

11

帖子

10

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 18:06:15 | 显示全部楼层
还有一个问题:
如何修改lisp以用简单文本替换字段?
我正在写一个lisp,有两个选项(字段和文本)
回复

使用道具 举报

1

主题

475

帖子

481

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 18:09:00 | 显示全部楼层
也许是这样的
亨里克
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 03:51 , Processed in 0.375688 second(s), 72 queries .

© 2020-2025 乐筑天下

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