乐筑天下

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

[编程交流] 沿多段线复制?

[复制链接]

5

主题

10

帖子

6

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-7-6 07:47:33 | 显示全部楼层 |阅读模式
我以前搜索过这个,但没有找到我想要的。我希望能够沿着多段线复制块,因此结果如下所示: 084736dmoxm1i3z2i1jjj8.jpg
在水平方向上,应沿多段线每隔单位宽度(1.5)插入块,直到强制其与多段线同步。当强制步进时,它水平步进块宽度的一半(0.75)。垂直方向上,块应为一个块单元(1.33),因为它遵循多段线。
 
目前,我正在使用“running bond pattern”并使用copym命令覆盖多段线的范围。然后我使用fastsel命令来选择所有与poyline接触的块。问题是它并不是一直都很有效,我也不能使用一个命令同时执行这两个操作。
 
谢谢你的帮助!
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-6 08:07:06 | 显示全部楼层
这并不完全是你想要的,但结果大致相同。。。
 
  1. (vl-load-com)
  2. (defun c:copysquarealongpline ( / osm a +a -a ss pl stpt enpt loop ptint d )
  3. (setq osm (getvar 'osmode))
  4. (setvar 'osmode 0)
  5. (setq a (getdist "\nDimension of edge of square : "))
  6. (setq +a a)
  7. (setq -a (- a))
  8. (while (not ss)
  9.    (prompt "\nSelect 2d polyline witch vertices are oriented from left to right to perform copym of square along it")
  10.    (setq ss (ssget ":L" '((0 . "*POLYLINE"))))
  11. )
  12. (setq pl (ssname ss 0))
  13. (setq stpt (vlax-curve-getstartpoint pl))
  14. (setq enpt (vlax-curve-getendpoint pl))
  15. (if (> (cadr stpt) (cadr enpt))
  16.    (progn
  17.      (setq loop T)
  18.      (while loop
  19.        (setq ptint (vlax-curve-getclosestpointtoprojection pl (list (car stpt) (+ (cadr stpt) a) (caddr stpt)) '(1.0 0.0 0.0)))
  20.        (setq d (- (car ptint) (car stpt)))
  21.        (if (not (eq a -a))
  22.          (vl-cmdf "_.rectangle" stpt "d" +a +a (list (+ (car stpt) 1.0) (+ (cadr stpt) 1.0) (caddr stpt)))
  23.          (vl-cmdf "_.rectangle" stpt "d" +a +a (list (+ (car stpt) 1.0) (- (cadr stpt) 1.0) (caddr stpt)))
  24.        )
  25.        (if ptint
  26.          (repeat (fix (/ d +a))
  27.            (vl-cmdf "_.copy" (entlast) "" '(0.0 0.0 0.0) (list +a 0.0 0.0) "")
  28.          )
  29.        )
  30.        (if (eq a +a)
  31.          (if (eq (cadr ptint) (+ (cadr stpt) a))
  32.            (setq stpt ptint)
  33.            (progn
  34.              (vl-cmdf "_.pedit" pl "r" "")
  35.              (setq ptint nil a 0.0)
  36.            )
  37.          )
  38.        )
  39.        (if (eq a 0.0)
  40.          (if (eq (cadr ptint) (cadr stpt))
  41.            (setq stpt ptint a -a)
  42.          )
  43.        )
  44.        (if (and (not (equal stpt ptint 1e-) (eq a -a))
  45.          (progn
  46.            (if (equal ptint enpt 1e-
  47.              (progn
  48.                (setq d (- (car enpt) (car stpt)))
  49.                (setq loop nil)
  50.              )
  51.            )
  52.            (if (eq (cadr ptint) (+ (cadr stpt) a))
  53.              (setq stpt ptint)
  54.            )
  55.          )
  56.        )
  57.      )
  58.      (vl-cmdf "_.pedit" pl "r" "")
  59.    )
  60.    (progn
  61.      (vl-cmdf "_.pedit" pl "r" "")
  62.      (setq stpt (vlax-curve-getstartpoint pl))
  63.      (setq enpt (vlax-curve-getendpoint pl))
  64.      (setq loop T)
  65.      (while loop
  66.        (setq ptint (vlax-curve-getclosestpointtoprojection pl (list (car stpt) (+ (cadr stpt) a) (caddr stpt)) '(1.0 0.0 0.0)))
  67.        (setq d (- (- (car ptint) (car stpt))))
  68.        (if (not (eq a -a))
  69.          (vl-cmdf "_.rectangle" stpt "d" +a +a (list (- (car stpt) 1.0) (+ (cadr stpt) 1.0) (caddr stpt)))
  70.          (vl-cmdf "_.rectangle" stpt "d" +a +a (list (- (car stpt) 1.0) (- (cadr stpt) 1.0) (caddr stpt)))
  71.        )
  72.        (if ptint
  73.          (repeat (fix (/ d +a))
  74.            (vl-cmdf "_.copy" (entlast) "" '(0.0 0.0 0.0) (list -a 0.0 0.0) "")
  75.          )
  76.        )
  77.        (if (eq a +a)
  78.          (if (eq (cadr ptint) (+ (cadr stpt) a))
  79.            (setq stpt ptint)
  80.            (progn
  81.              (vl-cmdf "_.pedit" pl "r" "")
  82.              (setq ptint nil a 0.0)
  83.            )
  84.          )
  85.        )
  86.        (if (eq a 0.0)
  87.          (if (eq (cadr ptint) (cadr stpt))
  88.            (setq stpt ptint a -a)
  89.          )
  90.        )
  91.        (if (and (not (equal stpt ptint 1e-) (eq a -a))
  92.          (progn
  93.            (if (equal ptint enpt 1e-
  94.              (progn
  95.                (setq d (- (car enpt) (car stpt)))
  96.                (setq loop nil)
  97.              )
  98.            )
  99.            (if (eq (cadr ptint) (+ (cadr stpt) a))
  100.              (setq stpt ptint)
  101.            )
  102.          )
  103.        )
  104.      )
  105.    )
  106. )
  107. (setvar 'osmode osm)
  108. (princ)
  109. )
  110. (defun c:csapl nil (c:copysquarealongpline))
  111. (prompt "\nShortcut to c:copysquarealongpline is c:csapl")
  112. (princ)

 
您好,M.R。
P、 S.多段线必须有一个顶部。。。如果多段线有底部,则沿X轴镜像多段线,执行例程,并沿X轴镜像回结果。。。还请注意,直线段必须上升到顶部,然后段必须不断下降,直到结束。。。只允许一段上升和一段下降,但段之间的角度可能不同。。。
回复

使用道具 举报

5

主题

10

帖子

6

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-7-6 08:21:37 | 显示全部楼层
 
谢谢,M.R.有几项我不知道如何在LISP中执行,我相信您可以在代码中解决这些问题。我将尝试实现我的算法,看看我的结果如何。
回复

使用道具 举报

5

主题

10

帖子

6

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-7-6 08:33:01 | 显示全部楼层
我想我会在这里回答,因为这与我最初的常规目标有关。
 
我使用此例程获取选定多段线的顶点(从AfraLISP):
 
  1. (defun c:coord (/ e len n e1)
  2. (setq e (entget (car (entsel))))
  3. ;get the entity list
  4. (setq len (length e))
  5. ;get the length of the list
  6. (setq n 0)
  7. ;set counter to zero
  8. (repeat len
  9. ;repeat for the length of the entity list
  10.   (setq e1 (car (nth n e)))
  11.   ;get each item in the entity list
  12.   ;and strip the entity code number
  13.   (if (= e1 10)
  14.   ;check for code 10 (vertex)
  15.     (progn
  16.     ;if it's group 10 do the following
  17.         (terpri)
  18.           ;new line
  19.                  (setq pt (cdr (nth n e))) ;; my code starts here
  20.           (cdr (reverse (setq lst (list pt lst))))
  21.           (reverse (cdr lst)) ;; my code ends here
  22.     );progn
  23.   );if
  24.   (setq n (1+ n))
  25.   ;increment the counter
  26. );repeat
  27. (princ)
  28. );defun
  29. (princ)

 
我需要的不是打印的顶点,而是一个列表。我在那里插入了我认为有效的内容,但它将一个列表放在一个列表中。。。有人能帮我吗?谢谢
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:46:42 | 显示全部楼层
你好,rjohnson42,
 
下面是五个示例,演示如何从LWPolyline图元中检索顶点列表。
 
以下每个函数都需要一个参数:LWPolyline图元,并将返回所提供LWPolyline的顶点列表(以OCS表示)。
 
下面包含一个测试功能,用于测试。
 
  1. ([color=BLUE]defun[/color] LM:LW-Vertices ( ent [color=BLUE]/[/color] _lwvertices )
  2.    ([color=BLUE]defun[/color] _lwvertices ( en [color=BLUE]/[/color] pair )
  3.        ([color=BLUE]if[/color] ([color=BLUE]setq[/color] pair ([color=BLUE]assoc[/color] 10 en))
  4.            ([color=BLUE]cons[/color] ([color=BLUE]cdr[/color] pair) (_lwvertices ([color=BLUE]cdr[/color] ([color=BLUE]member[/color] pair en))))
  5.        )
  6.    )
  7.    (_lwvertices ([color=BLUE]entget[/color] ent))
  8. )

 
  1. ([color=BLUE]defun[/color] LM:LW-Vertices ( ent )
  2.    ([color=BLUE]apply[/color] '[color=BLUE]append[/color] ([color=BLUE]mapcar[/color] '([color=BLUE]lambda[/color] ( x ) ([color=BLUE]if[/color] ([color=BLUE]=[/color] 10 ([color=BLUE]car[/color] x)) ([color=BLUE]list[/color] ([color=BLUE]cdr[/color] x)))) ([color=BLUE]entget[/color] ent)))
  3. )

 
  1. ([color=BLUE]defun[/color] LM:LW-Vertices ( ent [color=BLUE]/[/color] lst )
  2.    ([color=BLUE]foreach[/color] pair ([color=BLUE]entget[/color] ent)
  3.        ([color=BLUE]if[/color] ([color=BLUE]=[/color] 10 ([color=BLUE]car[/color] pair))
  4.            ([color=BLUE]setq[/color] lst ([color=BLUE]cons[/color] ([color=BLUE]cdr[/color] pair) lst))
  5.        )
  6.    )
  7.    ([color=BLUE]reverse[/color] lst)
  8. )

 
  1. ([color=BLUE]defun[/color] LM:LW-Vertices ( ent [color=BLUE]/[/color] _group2 )
  2.    ([color=BLUE]defun[/color] _group2 ( lst )
  3.        ([color=BLUE]if[/color] lst
  4.            ([color=BLUE]cons[/color] ([color=BLUE]list[/color] ([color=BLUE]car[/color] lst) ([color=BLUE]cadr[/color] lst)) (_group2 ([color=BLUE]cddr[/color] lst)))
  5.        )
  6.    )
  7.    (_group2 ([color=BLUE]vlax-get[/color] ([color=BLUE]vlax-ename->vla-object[/color] ent) 'coordinates))
  8. )

 
  1. ([color=BLUE]defun[/color] LM:LW-Vertices ( ent )
  2.    ([color=BLUE]mapcar[/color] '[color=BLUE]cdr[/color] ([color=BLUE]vl-remove-if-not[/color] '([color=BLUE]lambda[/color] ( x ) ([color=BLUE]=[/color] 10 ([color=BLUE]car[/color] x))) ([color=BLUE]entget[/color] ent)))
  3. )

 
下面是一个测试函数,展示了如何调用上述任何函数:
  1. ([color=BLUE]defun[/color] c:test ( [color=BLUE]/[/color] e )
  2.    ([color=BLUE]if[/color]
  3.        ([color=BLUE]and[/color]
  4.            ([color=BLUE]setq[/color] e ([color=BLUE]car[/color] ([color=BLUE]entsel[/color] [color=MAROON]"\nSelect LWPolyline: "[/color])))
  5.            ([color=BLUE]eq[/color] [color=MAROON]"LWPOLYLINE"[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 0 ([color=BLUE]entget[/color] e))))
  6.        )
  7.        (LM:LW-Vertices e)
  8.    )
  9. )
回复

使用道具 举报

5

主题

10

帖子

6

银币

初来乍到

Rank: 1

铜币
25
发表于 2022-7-6 08:48:05 | 显示全部楼层
谢谢你,李。我想我知道我现在做错了什么——我的列表语法错了。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-9 22:09 , Processed in 0.351125 second(s), 67 queries .

© 2020-2025 乐筑天下

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