乐筑天下

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

[编程交流] 查找最近的多段线,创建

[复制链接]

6

主题

19

帖子

13

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 15:37:03 | 显示全部楼层 |阅读模式
大家好,
 
我正在尝试编写一个LISP例程,该例程将完成以下任务:
1、选择图纸上的块参照
2.从该块参照中查找最近的多段线和该多段线上的最近点
3.在该点上创建顶点,并将该点的坐标保存到变量中以供进一步使用
4.从该块参考中提取对象数据,如SerialNo(请参阅随附的屏幕截图)
5.每个块参考的回路
6.将先前保存的点坐标及其对应的序列号导出为txt或csv,如下所示:
X_coord,Y_coord,序列号
 
E、 g.85.4535、18.7903、09I4E5Q2104022719
或85.4535、18.7903、09I4E5Q2104022311、09I4E5Q2104022719(如果其具有多个块参考)
 
输出文件被解释为在该特定点上具有负载的电线。
 
以下是我迄今为止发现/借用的有帮助的内容:
用于在此线程上创建DeviceG提供的顶点程序
 
  1. ;; Design by Gabo CALOS DE VIT from CORDOBA ARGENTINA
  2. ;;;    Copyleft 1995-2018 by Gabriel Calos De Vit
  3. ;; DEVITG@GMAIL.COM   
  4. ; Hecho por  Gabo CALOS DE VIT de CORDOBA ARGENTINA
  5. ;;;    Copyleft 1995-2018 por Gabriel Calos De Vit
  6. ;; DEVITG@GMAIL.COM
  7. ; no error check.
  8. ;; no nothing
  9. (vl-load-com)
  10. (DEFUN C:EXAMPLE_ADDVERTEX  ( /
  11. ACADOBJ
  12. BLK-REF-XYZ
  13. BLK-REFERENCE
  14. DOC
  15. LSTPOINT
  16. MODELSPACE
  17. NEWVERTEX
  18. PARAM-AT-CLOSEST-POINT
  19. PLINE
  20. PLINE-OBJ
  21. POINT-AT-PARAM
  22. VERTEX-POINT
  23.                             )
  24. (SETQ ACADOBJ (VLAX-GET-ACAD-OBJECT))
  25. (SETQ DOC (VLA-GET-ACTIVEDOCUMENT ACADOBJ))
  26. (SETQ MODELSPACE (VLA-GET-MODELSPACE DOC))
  27. (SETQ PLINE (ENTSEL "\nSelect Polyline: "))
  28. (SETQ PLINE-OBJ (VLAX-ENAME->VLA-OBJECT (CAR PLINE)))
  29. (SETQ BLK-REFERENCE (CAR (ENTSEL "\Select the block-reference")))
  30. (SETQ BLK-REF-XYZ (CDR (ASSOC 10 (ENTGET BLK-REFERENCE))))
  31. ;;;  (VL-CMDF "POINT" BLK-REF-XYZ "")
  32. (SETQ LSTPOINT (VLAX-CURVE-GETCLOSESTPOINTTO PLINE-OBJ BLK-REF-XYZ))
  33. (SETQ PARAM-AT-CLOSEST-POINT (VLAX-CURVE-GETPARAMATPOINT PLINE-OBJ LSTPOINT))
  34. (SETQ POINT-AT-PARAM (VLAX-CURVE-GETPOINTATPARAM PLINE-OBJ PARAM-AT-CLOSEST-POINT))
  35. (SETQ VERTEX-POINT (LIST (CAR POINT-AT-PARAM) (CADR POINT-AT-PARAM)))
  36. ;;;  (VL-CMDF "POINT" VERTEX-POINT "")
  37. (SETQ NEWVERTEX (VLAX-MAKE-SAFEARRAY VLAX-VBDOUBLE '(0 . 1)))
  38. (VLAX-SAFEARRAY-FILL NEWVERTEX VERTEX-POINT)
  39. (VLA-ADDVERTEX PLINE-OBJ (1+ (FIX PARAM-AT-CLOSEST-POINT)) NEWVERTEX)
  40. (VLA-UPDATE PLINE-OBJ)
  41. )

 
它工作得很好,但现在需要修改以在循环中工作
 
对于提取对象数据,BlackBox在此线程上提供的答案可能会有所帮助
 
随附样品图
 
谢谢你的帮助
非常感谢。
 
当做
Jes G公司
 
 
示例图。图纸
163708kg7dj9smthfrmf46.jpg
回复

使用道具 举报

28

主题

118

帖子

95

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
136
发表于 2022-7-5 15:51:24 | 显示全部楼层
jes\u g,
 
这是我周五下午的尝试。
 
假设您的数据(序列号?)包含在每个块的属性中;
提取第一个属性值(序列号);
 
1选择多段线;然后
2选择块。
 
将(在选定的多段线上)在每个块的最近点处放置一个点;和
数据将保存到CSV文件中
 
  1. (defun C:ODATA (/ pl s fn opn i e de dp )
  2. (vl-load-com)
  3. (setvar 'pdmode 3)
  4.      (while
  5. (progn
  6.   (setvar 'errno 0)
  7.   (setq pl
  8.   (car (entsel "\nSelect Polyline: ")
  9.   ) ;_ end of car
  10.   ) ;_ end of setq
  11.   (cond
  12.     ((= 7 (getvar 'errno))
  13.      (princ "\nMissed, Please Try Again.")
  14.     )
  15.     ((/= "LWPOLYLINE" (cdr (assoc 0 (entget pl))))
  16.      (princ
  17.        "\nThe Selected Entity is not a LWPOLYLINE."
  18.      ) ;_ end of princ
  19.     )
  20.   ) ;_ end of cond
  21. ) ;_ end of progn
  22.      ) ;_ end of while
  23. (prompt "\nSelect **Attributed** Blocks to Process: ")
  24. (if (and (setq s (ssget "_:L" '((0 . "INSERT") (66 . 1))))
  25.    (setq fn (getfiled "Save Block Data to CSV File"
  26.         (vl-filename-base (getvar 'dwgname))
  27.         "csv"
  28.         1
  29.      ) ;_ end of getfiled
  30.    ) ;_ end of setq
  31.    (setq opn (open fn "w"))
  32.      ) ;_ end of and
  33.   
  34.    (progn
  35.      (write-line
  36. (strcat
  37.   "SERIAL NUMBER (ATTRIBUTE)"
  38.   ","
  39.   "ELEC LINE VERTEX EASTING"
  40.   ","
  41.   "ELEC LINE VERTEX NORTHING"
  42.   ","
  43.   "BLOCK INSERTION EASTING"
  44.   ","
  45.   "BLOCK INSERTION NORTHING"
  46.     ) ;_ end of strcat
  47.     opn
  48.   ) ;_ end of write-line
  49.   
  50.      (close opn)
  51.      (setq opn (open fn "a"))
  52.      (repeat (setq i (sslength s))
  53. (setq e (vlax-ename->vla-object (ssname s (setq i (1- i)))))
  54. (setq
  55.   de (vlax-get e 'insertionpoint)
  56.   dp (vlax-curve-getclosestpointto pl de)
  57. ) ;_ end of setq
  58. (vl-cmdf "_.point" dp "")
  59. (write-line
  60.   (strcat
  61.     (vla-get-textstring (car (vlax-invoke e 'getattributes)))
  62.     ","
  63.     (rtos (car dp) 2 4)
  64.     ","
  65.     (rtos (cadr dp) 2 4)
  66.     ","
  67.     (rtos (car de) 2 4)
  68.     ","
  69.     (rtos (cadr de) 2 4)
  70.   ) ;_ end of strcat
  71.   opn
  72. ) ;_ end of write-line
  73.      ) ;_ end of repeat
  74.    ) ;_ end of progn
  75. ) ;_ end of if
  76. (close opn)
  77. (princ)
  78. ) ;_ end of defun

 
 
我不是专家,但希望这能让你更接近你想要的解决方案。
 
干杯
奥达塔。lsp
回复

使用道具 举报

6

主题

19

帖子

13

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 15:54:36 | 显示全部楼层
 
谢谢你的回复。我运行这段代码,当我尝试选择块参照时,它们不会被选中。非常感谢。
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 16:03:03 | 显示全部楼层
这里有一个快速的开始。我已经发表了评论,所以你可以编辑代码,以完全满足你的需要。
  1. (defun c:foo (/ _writefile d od out p p2 s s1 tmp x)
  2. ;; RJP - 2.2.2018
  3. (defun _writefile (file l / fo)
  4.    (cond ((and (eq 'str (type file)) (setq fo (open file "w")))
  5.    (foreach x l (write-line (vl-princ-to-string x) fo))
  6.    (close fo)
  7.    file
  8.   )
  9.    )
  10. )
  11. (if (= 'exrxsubr (type ade_odgettables))
  12.    (if        (and ;; All the meters
  13.      (setq s (ssget "_x" '((0 . "insert") (2 . "tempmeter"))))
  14.      ;; All the lwpoly[line]s on layer *Phase
  15.      (setq s1 (ssget "_x" '((0 . "lwpolyline,line") (8 . "*phase"))))
  16.      ;; Convert block to list of enames
  17.      (setq s (mapcar 'cadr (ssnamex s)))
  18.      ;; Convert lwpoly[line]s to list of enames
  19.      (setq s1 (mapcar 'cadr (ssnamex s1)))
  20. )
  21.      ;; For each meter
  22.      (progn
  23. (foreach b s
  24.   ;; Get meter basepoint
  25.   (setq p (cdr (assoc 10 (entget b))))
  26.   ;; List of '((<closepoint> <distance> <ename>)...)
  27.   (setq        d
  28.          (mapcar
  29.            '(lambda (x) (list (setq p2 (vlax-curve-getclosestpointto x p)) (distance p p2) x))
  30.            s1
  31.          )
  32.   )
  33.   ;; Sort by closest distance and retrieve first item
  34.   (setq d (car (vl-sort d '(lambda (r j) (< (cadr r) (cadr j))))))
  35.   ;; Get serial number
  36.   (setq od (ade_odgetfield b (car (ade_odgettables b)) "SerialNo" 0))
  37.   ;; If the serial number is blank  change to "OHNOES!!!!!NoSerial!"
  38.   (and (= "" od) (setq od "OHNOES!!!!!NoSerial!"))
  39.   ;; Create point on closest pline
  40.   (entmakex (list '(0 . "point") '(8 . "MeterClosePoint") (cons 10 (car d))))
  41.   ;; Create line for visual check
  42.   (entmakex (list '(0 . "line") '(8 . "Check") (cons 10 p) (cons 11 (car d))))
  43.   ;; Create a vertex if it passes checks
  44.   (and (= "LWPOLYLINE" (cdr (assoc 0 (entget (setq o (caddr d))))))
  45.        (vlax-write-enabled-p (setq o (vlax-ename->vla-object o)))
  46.        (setq i (vlax-curve-getparamatpoint o (setq p2 (car d))))
  47.        (or (= 0 (fix i)) (/= 0 (rem (fix i) i)))
  48.        (vlax-invoke o 'addvertex (1+ (fix i)) (list (car p2) (cadr p2)))
  49.   )
  50.   ;; Gather results
  51.   (if (setq tmp (assoc (car d) out))
  52.     ;; Point in list exists so append entry
  53.     (setq out (subst (append tmp (list (strcat "," od))) tmp out))
  54.     ;; New point just add item
  55.     (setq out (cons (list (car d) od) out))
  56.   )
  57. )
  58. ;; Write file to current directory
  59. (_writefile
  60.   (strcat (getvar 'dwgprefix) "MeterStuff.csv")
  61.   (mapcar
  62.     '(lambda (x)
  63.        (apply
  64.          'strcat
  65.          (append (mapcar '(lambda (y) (strcat (vl-princ-to-string y) ",")) (car x)) (cdr x))
  66.        )
  67.      )
  68.     out
  69.   )
  70. )
  71.      )
  72.    )
  73.    (print "Civil3D needed for this code...")
  74. )
  75. (princ)
  76. )
回复

使用道具 举报

6

主题

19

帖子

13

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 16:12:44 | 显示全部楼层
 
哇!这看起来很完美!谢谢
我唯一需要的是在多段线上创建新的顶点,其中最近的点如图所示。您建议如何修改?
163710dl8cicl3fuei3luu.jpg
 
非常感谢。非常感谢你的帮助
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 16:21:48 | 显示全部楼层
我更新了代码。。试试看。记得给服务员小费。
回复

使用道具 举报

6

主题

19

帖子

13

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 16:34:43 | 显示全部楼层
 
最后一件事。希望你没有厌倦
如何在图片上显示的多段线上创建新顶点?
163712xmj0d0293qd220j2.jpg
 
谢谢
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 16:39:46 | 显示全部楼层
查看您的个人信息。。我已经解决了这个问题。
163713ellw4jf6fm9l4mzl.jpg
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-14 21:04 , Processed in 1.010150 second(s), 72 queries .

© 2020-2025 乐筑天下

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