乐筑天下

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

[编程交流] 自动绘制多段线

[复制链接]

20

主题

338

帖子

323

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-5 23:46:55 | 显示全部楼层 |阅读模式
大家好!
 
我最近在这里创建了这个例程,希望与大家分享!
到目前为止,我有它与ACAD点工作,并有一个单独的副本与Civil 3D点工作。
 
  1. ;Created by B. Hippe
  2. ;October 2011
  3. ;Select points you wish to snap to.
  4. ;Click button to start.
  5. ;Hover mouse over the selected points in the order you wish to have them drawn.
  6. [color="red"](vl-load-com)[/color]
  7. (defun c:AutoPL ()
  8. (setq *ModSpc (vlax-get-property (setq *ActDoc (vlax-get-property (setq *acad (vlax-get-acad-object)) 'ActiveDocument)) 'ModelSpace))
  9. (princ "\nSelect Point Objects:")
  10. (setq ss (ssget '(( 0 . "POINT"))))
  11. (setq sslen (sslength ss))
  12. (setq drawn nil)
  13. (setq junk (getpoint "\nClick to Start:"))
  14. (setq done nil)
  15. (while
  16.    (and (= 5 (car (setq pnt (grread T 1 0)))) (= done nil))
  17.    (setq ep (is_nearest ss (nth 1 pnt)))
  18.    (cond
  19.      ((= drawn nil)(progn
  20.        (setq drawn (list (car ep)))
  21.        (drx (vlax-safearray->list (vlax-variant-value (vlax-get-Property (vlax-ename->vla-object (car ep)) 'Coordinates))))))
  22.      ((= (length drawn) 1)(if (not (is_drawn (car ep)))
  23.        (progn
  24.          (setq drawn (cons (car ep) drawn))
  25.          (drx (vlax-safearray->list (vlax-variant-value (vlax-get-Property (vlax-ename->vla-object (car ep)) 'Coordinates)))))))
  26.      ((>= (length drawn) 2)(if (not (is_drawn (car ep)))
  27.         (progn
  28.    (setq drawn (cons (car ep) drawn))
  29.    (drx (vlax-safearray->list (vlax-variant-value (vlax-get-Property (vlax-ename->vla-object (car ep)) 'Coordinates)))))))
  30.      )
  31.    (if (= sslen (length drawn))
  32.      (setq done T))
  33.    )
  34. (setq pl-obj (vlax-invoke-method *ModSpc 'Addpolyline (pl->var (drawn->pntlist))))
  35. (princ)
  36. )
  37. ;Returns a list (entity . distance) of the closest entity (point) to the givin point
  38. ;Closest being the 2D distance
  39. (defun is_nearest (ss opnt)
  40. (setq ss-len (sslength ss))
  41. (setq li '(0))
  42. (setq n 0)
  43. (repeat ss-len
  44.    (setq ent (ssname ss n))
  45.    (setq pnt (vlax-safearray->list (vlax-variant-value (vlax-get-property (vlax-ename->vla-object ent) 'Coordinates))))
  46.    (setq dist (distance (list (nth 0 opnt)(nth 1 opnt))(list (nth 0 pnt)(nth 1 pnt))))
  47.    (setq pair (cons ent dist))
  48.    (setq li (cons pair li))
  49.    (setq n (1+ n))
  50.    )
  51. (setq li (cdr (reverse li)))
  52. (setq li (vl-sort li (function (lambda (x y) (< (cdr x)(cdr y))))))
  53. (setq near-pair (nth 0 li))
  54. )
  55. ;graphically draws an X at a givin point
  56. (defun drx (ctr)
  57. (setq vs (getvar "viewsize"))
  58. (setq xs (/ vs 20))
  59. (setq xs2 (/ xs 2))
  60. (setq cor1 (polar ctr (* pi 0.25) xs2))
  61. (setq cor2 (polar ctr (* pi 0.75) xs2))
  62. (setq cor3 (polar ctr (* pi 1.25) xs2))
  63. (setq cor4 (polar ctr (* pi 1.75) xs2))
  64. (grdraw ctr cor1 2 0)
  65. (grdraw ctr cor2 2 0)
  66. (grdraw ctr cor3 2 0)
  67. (grdraw ctr cor4 2 0)
  68. )
  69. ;Determines if a givin entity is a member of the "drawn" list
  70. (defun is_drawn (ent)
  71. (/= nil (member ent drawn)))
  72. ;create a list of coordinates for each entity in the list "drawn"
  73. (defun drawn->pntlist ()
  74. (setq plist (mapcar '(lambda (ent) (vlax-safearray->list (vlax-variant-value (vlax-get-Property (vlax-ename->vla-object ent) 'Coordinates)))) drawn))
  75. (setq li '("x"))
  76. (setq n 0)
  77. (repeat (length plist)
  78.    (setq p (nth n plist))
  79.    (setq li (cons (nth 2 p) li))
  80.    (setq li (cons (nth 1 p) li))
  81.    (setq li (cons (nth 0 p) li))
  82.    (setq n (1+ n))
  83.    )
  84. (setq li (reverse (cdr (reverse li))))
  85. )
  86. ;Givin a point list returns the list in variant form
  87. (defun PL->VAR ( pl / pl ub sa var)
  88. (setq ub (- (length [color=red]pl[/color]) 1))
  89. (setq sa (vlax-make-safearray vlax-vbdouble (cons 0 ub)))
  90. (setq var (vlax-make-variant (setq sa (vlax-safearray-fill sa pl))))
  91. )

 
*请注意,我没有包括任何错误捕捉。我认为这个例程可以改进,添加功能、错误捕捉等等。对想法、评论和批评持开放态度。(如果有人想创建这个命令的一个很酷的动画,那也太酷了!)
 
当做
Hippe013
回复

使用道具 举报

62

主题

466

帖子

404

银币

后起之秀

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

铜币
310
发表于 2022-7-5 23:50:33 | 显示全部楼层
尝试:
  1. (setq obj (vlax-ename->vla-object (car (entsel "\nSelect a polyline: "))))
  2. (vlax-get obj 'Coordinates)

 
请添加(vl load com)
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 23:55:40 | 显示全部楼层
如果用户没有选择实体怎么办??
回复

使用道具 举报

20

主题

338

帖子

323

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-5 23:58:14 | 显示全部楼层
 
嗯。。。你试过代码了吗?
我创建它是为了绘制一条点到点的多段线。点对点点击几百个点可能会很乏味。这段代码允许您只选择要捕捉到的点,然后只需将鼠标悬停在这些点上。
 
不过我很感谢你的意见
 
当做
回复

使用道具 举报

20

主题

338

帖子

323

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 00:01:38 | 显示全部楼层
 
嗯???那么,你有什么建议?
我想现在只要再喝一口咖啡,再下一次命令就行了。
您是否认为可以在mid命令中向选择集添加点?
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 00:04:32 | 显示全部楼层
 
我向Dan的帖子指出,如果用户选择nothing(无),该帖子将导致例程崩溃。
 
在调用代码时,最好将变量本地化,以避免代码转到其他地方。
回复

使用道具 举报

62

主题

466

帖子

404

银币

后起之秀

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

铜币
310
发表于 2022-7-6 00:08:31 | 显示全部楼层
希望你不介意
 
  1. (defun c:test ( / ss->lst addpolyline *error* ss pt gr )
  2. (defun ss->lst ( ss flag / id lst )
  3.    (if (eq 'PICKSET (type ss))
  4.      (repeat (setq id (sslength ss))
  5.        (
  6.          (lambda ( name )
  7.            (setq lst
  8.              (cons
  9.                (if flag (vlax-ename->vla-object name)
  10.                  name
  11.                )lst
  12.              )
  13.            )
  14.          )(ssname ss (setq id (1- id)))
  15.        )
  16.      )
  17.    )
  18. )
  19. (defun addpolyline ( pointslst layer closed flag / e )
  20.    (setq e
  21.      (entmakex
  22.        (append
  23.          (list
  24.            (cons 0 "LWPOLYLINE")
  25.            (cons 100 "AcDbEntity")
  26.            (cons 100 "AcDbPolyline")
  27.            (cons 90 (length pointslst))
  28.            (cons 70 (if closed 1 0))
  29.            (cons 8 layer)
  30.            (cons 43 0.0)
  31.          )
  32.          (mapcar
  33.            (function
  34.              (lambda ( x )
  35.                (if (listp x)(cons 10 x)
  36.                  (cons 42 x)
  37.                )
  38.              )
  39.            ) pointslst
  40.          )
  41.        )
  42.      )
  43.    )
  44.    (if (and e flag)
  45.      (vlax-ename->vla-object e) e
  46.    )
  47. )
  48. (defun *error* ( msg )
  49.    (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  50.         (princ (strcat "\n** Error: " msg " **"))
  51.    )
  52.    (princ)
  53. )
  54. (if
  55.    (and
  56.      (setq ss (ss->lst (ssget '((0 . "point"))) t))
  57.      (setq pt (getpoint "\nSpecify starting point: "))
  58.      (not
  59.        (vla-highlight
  60.          (car
  61.            (ss->lst (ssget pt '((0 . "point"))) t)
  62.          ) 1
  63.        )
  64.      )
  65.      (setq pt (list pt))
  66.    )
  67.    (progn
  68.      (while (eq 5 (car (setq gr (grread t 5))))
  69.        (foreach x (ss->lst (ssget (cadr gr) '((0 . "point"))) t)
  70.          (if
  71.            (and (vl-position x ss)
  72.              (not
  73.                (vl-position (vlax-get x 'coordinates)
  74.                  pt
  75.                )
  76.              )
  77.            )
  78.            (progn (vla-highlight x 1)
  79.              (setq pt (cons (vlax-get x 'coordinates) pt))
  80.            )
  81.          )
  82.        )
  83.      )
  84.      (addpolyline (reverse pt) (getvar 'clayer) nil nil )
  85.    )
  86. ) (vla-regen (ad) acactiveviewport)(princ)
  87. )
回复

使用道具 举报

62

主题

466

帖子

404

银币

后起之秀

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

铜币
310
发表于 2022-7-6 00:11:41 | 显示全部楼层
我的第一个建议仅用于测试。我想我应该注意到
回复

使用道具 举报

20

主题

338

帖子

323

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 00:13:22 | 显示全部楼层
  1. ;Created by B. Hippe
  2. ;October 2011
  3. ;Select points you wish to snap to.
  4. ;Click button to start.
  5. ;Hover mouse over the selected points in the order you wish to have them drawn.
  6. [color="red"](vl-load-com)[/color]
  7. (defun c:AutoPL ( / *ModSpc *ActDoc *acad ss sslen junk done pnt ep )
  8. (setq *ModSpc (vlax-get-property (setq *ActDoc (vlax-get-property (setq *acad (vlax-get-acad-object)) 'ActiveDocument)) 'ModelSpace))
  9. (princ "\nSelect Point Objects:")
  10. (setq ss (ssget '(( 0 . "POINT"))))
  11. (if (or (= ss nil)(= (sslength ss) 1))
  12.    (progn
  13.      (princ "\nOops! Little to Nothing has been Selected.")
  14.      (exit)
  15.      )
  16.    )
  17. (setq sslen (sslength ss))
  18. (setq drawn nil)
  19. (setq junk (getpoint "\nClick to Start:"))
  20. (setq done nil)
  21. (while
  22.    (and (= 5 (car (setq pnt (grread T 1 0)))) (= done nil))
  23.    (setq ep (is_nearest ss (nth 1 pnt)))
  24.    (cond
  25.      ((= drawn nil)(progn
  26.        (setq drawn (list (car ep)))
  27.        (drx (vlax-safearray->list (vlax-variant-value (vlax-get-Property (vlax-ename->vla-object (car ep)) 'Coordinates))))))
  28.      ((= (length drawn) 1)(if (not (is_drawn (car ep)))
  29.        (progn
  30.          (setq drawn (cons (car ep) drawn))
  31.          (drx (vlax-safearray->list (vlax-variant-value (vlax-get-Property (vlax-ename->vla-object (car ep)) 'Coordinates)))))))
  32.      ((>= (length drawn) 2)(if (not (is_drawn (car ep)))
  33.         (progn
  34.    (setq drawn (cons (car ep) drawn))
  35.    (drx (vlax-safearray->list (vlax-variant-value (vlax-get-Property (vlax-ename->vla-object (car ep)) 'Coordinates)))))))
  36.      )
  37.    (if (= sslen (length drawn))
  38.      (setq done T))
  39.    )
  40. (setq pl-obj (vlax-invoke-method *ModSpc 'Addpolyline (pl->var (drawn->pntlist))))
  41. (princ)
  42. )
  43. ;Returns a list (entity . distance) of the closest entity (point) to the givin point
  44. ;Closest being the 2D distance
  45. (defun is_nearest (ss opnt / ss-len li n ent pnt dist pair near-pair)
  46. (setq ss-len (sslength ss))
  47. (setq li '(0))
  48. (setq n 0)
  49. (repeat ss-len
  50.    (setq ent (ssname ss n))
  51.    (setq pnt (vlax-safearray->list (vlax-variant-value (vlax-get-property (vlax-ename->vla-object ent) 'Coordinates))))
  52.    (setq dist (distance (list (nth 0 opnt)(nth 1 opnt))(list (nth 0 pnt)(nth 1 pnt))))
  53.    (setq pair (cons ent dist))
  54.    (setq li (cons pair li))
  55.    (setq n (1+ n))
  56.    )
  57. (setq li (cdr (reverse li)))
  58. (setq li (vl-sort li (function (lambda (x y) (< (cdr x)(cdr y))))))
  59. (setq near-pair (nth 0 li))
  60. )
  61. ;graphically draws an X at a givin point
  62. (defun drx (ctr / vs xs xs2 cor1 cor2 cor3 cor4 ctr)
  63. (setq vs (getvar "viewsize"))
  64. (setq xs (/ vs 20))
  65. (setq xs2 (/ xs 2))
  66. (setq cor1 (polar ctr (* pi 0.25) xs2))
  67. (setq cor2 (polar ctr (* pi 0.75) xs2))
  68. (setq cor3 (polar ctr (* pi 1.25) xs2))
  69. (setq cor4 (polar ctr (* pi 1.75) xs2))
  70. (grdraw ctr cor1 2 0)
  71. (grdraw ctr cor2 2 0)
  72. (grdraw ctr cor3 2 0)
  73. (grdraw ctr cor4 2 0)
  74. )
  75. ;Determines if a givin entity is a member of the "drawn" list
  76. (defun is_drawn (ent)
  77. (/= nil (member ent drawn)))
  78. ;create a list of coordinates for each entity in the list "drawn"
  79. (defun drawn->pntlist ( / plist ent li n )
  80. (setq plist (mapcar '(lambda (ent) (vlax-safearray->list (vlax-variant-value (vlax-get-Property (vlax-ename->vla-object ent) 'Coordinates)))) drawn))
  81. (setq li '("x"))
  82. (setq n 0)
  83. (repeat (length plist)
  84.    (setq p (nth n plist))
  85.    (setq li (cons (nth 2 p) li))
  86.    (setq li (cons (nth 1 p) li))
  87.    (setq li (cons (nth 0 p) li))
  88.    (setq n (1+ n))
  89.    )
  90. (setq li (reverse (cdr (reverse li))))
  91. )
  92. ;Givin a point list returns the list in variant form
  93. (defun PL->VAR ( pl / ub sa var)
  94. (setq ub (- (length [color=red]pl[/color]) 1))
  95. (setq sa (vlax-make-safearray vlax-vbdouble (cons 0 ub)))
  96. (setq var (vlax-make-variant (setq sa (vlax-safearray-fill sa pl))))
  97. )

 
局部变量,为零选择集添加了错误陷阱。
 
我的一个问题是,我有不同的子例程,将利用列表“绘制”。我应该如何处理这个问题?它不能本地化,或者可以吗?如果我让它成为本地的,其他例程可以使用它吗?
 
谢谢
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 00:20:47 | 显示全部楼层
可能是多边形内的某种形式,但多边形是通过使用多边形宽度因子绘制初始线来创建的。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-10 22:05 , Processed in 0.364930 second(s), 72 queries .

© 2020-2025 乐筑天下

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