乐筑天下

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

[编程交流] 拉伸多基点po

[复制链接]

4

主题

21

帖子

18

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 17:19:06 | 显示全部楼层 |阅读模式
大家好,
 
这是否可以将具有多个基点的多段线拉伸到不同距离但方向相同?
M4rdy公司
 
 
181909dkk7un7qq31u1qlu.jpg
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:30:08 | 显示全部楼层
快速回答是,使用lisp等
 
询问移动哪一点,您的示例将是vertice 2
使用“intersectwith”红色和绿色的新pt交点
重做调整x、y的样条线顶点
 
代码对不起没有任何东西。需要一些时间,其他人可能会加入。
回复

使用道具 举报

4

主题

21

帖子

18

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 17:37:21 | 显示全部楼层
我仍在努力,花了很多时间寻找解决方案。
但还是没有运气。
 
  1. (defun c:Test1 (/ ent lst)
  2. (if
  3.    (and (setq toLine (vlax-ename->vla-object (car (entsel "\nSelect Line: "))))
  4.     (setq p1 (getpoint "\nSpecify First Point: "))
  5.     (setq p2 (getpoint "\nSpecify Second Point: " p1))
  6.     (setq ss (apply 'ssget
  7.                           (append (list "_C")
  8.                                   (mapcar '(lambda (foo) (apply 'mapcar (cons foo (list p1 p2))))
  9.                                           '(min max)
  10.                                   )
  11.                                   (list '((0 . "*LINE")))
  12.                           )
  13.                    )
  14.           )
  15.    
  16.           (setq lst0 ((lambda (l / i)
  17.                        (setq i (lm:getobjintersectionsinss l ss))
  18.                        (vla-delete l)
  19.                        i
  20.                      )
  21.                       (vlax-ename->vla-object
  22.                         (entmakex (list (cons 0 "LINE") (cons 10 p1) (cons 11 p2)))
  23.                       )
  24.                     )
  25.           )
  26.    )
  27.     (progn
  28.       (setq lst1 (mapcar 'cons (mapcar 'cadr (ssnamex ss)) lst0))
  29.       (setq i 0)
  30.       (repeat (sslength ss)
  31.     (setq e (ssname ss i))
  32.     (setq lst (cadr (at:segment int_f)))
  33.     (setq Pintobj (LM:GetIntersections
  34.             toLine
  35.             (vlax-ename->vla-object e)
  36.               )
  37.     )
  38.     (vl-cmdf "_.stretch"
  39.          ss
  40.          ""
  41.          "_non"
  42.          (trans lst 0 1)
  43.          (trans (car Pintobj) 0 1)
  44.     )
  45.     (setq i (1+ i))
  46.       )
  47.     )
  48. )
  49. (princ)
  50. )
  51. (defun lm:getobjintersectionsinss (obj ss)
  52. ;; © Lee Mac 2010
  53. ((lambda (i / j a b ilst)
  54.     (while (setq e (ssname ss (setq i (1+ i))))
  55.       (setq ilst (append ilst
  56.                          (lm:groupbynum (vlax-invoke obj
  57.                                                      'intersectwith
  58.                                                      (vlax-ename->vla-object e)
  59.                                                      acextendnone
  60.                                         )
  61.                                         3
  62.                          )
  63.                  )
  64.       )
  65.     )
  66.   )
  67.    -1
  68. )
  69. )
  70. (defun AT:Segment (entPnt)
  71. ;; Retreive segment number and Start & End points
  72. ;; entPnt - List with entity (ENAME or VLA-OBJECT) & point
  73. ;; Alan J. Thompson, 11.10.09 / 08.19.10 / 11.15.11
  74. (if (vl-consp entPnt)
  75.    ((lambda (e p / n)
  76.       (if (setq n (vlax-curve-getPointAtParam e (1+ p)))
  77.         (list p (list (vlax-curve-getPointAtParam e p) n))
  78.         (list p (list (vlax-curve-getPointAtParam e (1- p)) (vlax-curve-getPointAtParam e p)))
  79.       )
  80.     )
  81.      (car entPnt)
  82.      (fix (vlax-curve-getParamAtPoint
  83.             (car entPnt)
  84.             (vlax-curve-getClosestPointToProjection
  85.               (car entPnt)
  86.               (trans (cadr entPnt) 1 (car entPnt))
  87.               '(0. 0. 1.)
  88.             )
  89.           )
  90.      )
  91.    )
  92. )
  93. )
回复

使用道具 举报

4

主题

21

帖子

18

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 17:46:45 | 显示全部楼层
最终它成功了,尽管还远远不够完美。
 
  1. (defun c:Test2 (/ toLine p1 p2 ss lst0 lst1 Pintobj vtx_pline list_vtx_pline)
  2. (if
  3.    (and (setq toLine
  4.        (vlax-ename->vla-object (car (entsel "\nSelect Line: ")))
  5.     )
  6.     (setq p1 (getpoint "\nSpecify First Point: "))
  7.     (setq p2 (getpoint "\nSpecify Second Point: " p1))
  8.     (setq ss
  9.        (apply
  10.          'ssget
  11.          (append
  12.            (list "_C")
  13.            (mapcar
  14.              '(lambda (foo) (apply 'mapcar (cons foo (list p1 p2))))
  15.              '(min max)
  16.            )
  17.            (list '((0 . "*LINE")))
  18.          )
  19.        )
  20.     )
  21.     (setq
  22.       lst0    ((lambda (l / i)
  23.           (setq i (lm:getobjintersectionsinss l ss))
  24.           (vla-delete l)
  25.           i
  26.         )
  27.          (vlax-ename->vla-object
  28.            (entmakex
  29.              (list (cons 0 "LINE") (cons 10 p1) (cons 11 p2))
  30.            )
  31.          )
  32.        )
  33.     )
  34.    ) ;_and
  35.     (progn
  36.       ;; Find intersection between line and selection
  37.       (setq Pintobj (lm:getobjintersectionsinss toLine ss))
  38.       ;;(princ Pintobj) ;_for testing
  39.       (setq cadrm (mapcar 'cadr (ssnamex ss)))
  40.       ;; Make list (ename point_intersection)
  41.       (setq lst1 (mapcar 'list cadrm lst0))
  42.       (foreach    n lst1
  43.     (setq p (fix
  44.           (vlax-curve-getparamatpoint
  45.             (car n)
  46.             (vlax-curve-getclosestpointtoprojection
  47.               (car n)
  48.               (trans (cadr n) 1 0)
  49.               '(0.0 0.0 1.0)
  50.             )
  51.           )
  52.         )
  53.     ) ;_setq p
  54.     (setq vtx_pline
  55.        (list
  56.          (trans (vlax-curve-getpointatparam (car n) p) 0 1)
  57.        )
  58.     )
  59.     ;;(princ vtx_pline) ;_for testing
  60.     (setq list_vtx_pline (append list_vtx_pline vtx_pline)) ;_This is Start point of Selected Segment PLINES as base point of STRETCH:
  61.       ) ;_foreach
  62.       ;;(princ list_vtx_pline) ;_for testing
  63.       (setq data (mapcar 'list cadrm list_vtx_pline pintobj))
  64.       (foreach    m data
  65.     (vl-cmdf "_.stretch"
  66.          (car m)
  67.          ""
  68.          "_non"
  69.          (cadr m)
  70.          (caddr m)
  71.     )
  72.       )
  73.     ) ;_progn
  74. ) ;_if
  75. (princ)
  76. ) ;_defun
  77. (defun lm:getobjintersectionsinss (obj ss)
  78. ;; © Lee Mac 2010
  79. ((lambda (i / j a b ilst)
  80.     (while (setq e (ssname ss (setq i (1+ i))))
  81.       (setq ilst (append ilst
  82.              (lm:groupbynum
  83.                (vlax-invoke
  84.                  obj
  85.                  'intersectwith
  86.                  (vlax-ename->vla-object e)
  87.                  acextendnone
  88.                )
  89.                3
  90.              )
  91.          )
  92.       )
  93.     )
  94.   )
  95.    -1
  96. )
  97. )
  98. ;;  Author: Lee Mac, Copyright © 2010 - www.lee-mac.com       ;;
  99. (defun LM:GroupByNum (l n / r)
  100. (if l
  101.    (cons
  102.      (reverse (repeat n
  103.         (setq r (cons (car l) r)
  104.               l (cdr l)
  105.         )
  106.         r
  107.           )
  108.      )
  109.      (LM:GroupByNum l n)
  110.    )
  111. )
  112. )
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 18:01:56 | 显示全部楼层
仔细想想,我几乎把它缩短了很多,但它有两个缺陷,要求垂直位置,第二个更重要的是,一旦柱脚旋转,需要完全不同的方法。现在考虑使用UCS可以解决这个问题。还需要选择要移动的末端是向左还是向右?这可以很容易地通过反转pline垂直顺序来实现,它是否超过了新的int点。
 
这里有一个更好的方法来做选线部分,我猜这是一条临时线,如果它已经存在,那么只需选线并使用围栏。再加上一种不同的开始方式。
 
  1. (setq pt1 (getpoint "Pick 1st crossing point"))
  2. (setq pt2 (getpoint Pt1 "Pick 2nd crossing point"))
  3. (setq vert (getint "Enter vertice position 2+ etc ")) ; do a left or right here pick end instead.
  4. (setq ss (ssget "F" (list pt1 pt2))) ; selection set of plines
  5. (command "Line" pt1 pt2 "") ; do after select or else line is added
  6. (setq objL (vlax-Ename->Vla-Object (entlast))) ; saves line object for intersect erase at end.

 
  1. ; pline co-ords example
  2. ; By Alan H
  3. (defun getcoords (ent)
  4. (vlax-safearray->list
  5.    (vlax-variant-value
  6.      (vlax-get-property
  7.    (vlax-ename->vla-object ent)
  8.    "Coordinates"
  9.      )
  10.    )
  11. )
  12. )
  13. ; work in progress
  14. (repeat (setq K (sslength ss)) ; loop through
  15. (setq co-ords (getcoords (ssname ss (setq k (- k 1))))) ; pline co-ords ; uses getcoords defun
  16. (setq objpl (vlax-Ename->Vla-Object (ssname ss k)))
  17. (setq intpt1 (vlax-invoke objpl 'intersectWith objL acExtendThisEntity))
  18. (setq x (car intpt1))
  19. (setq y (cadr intpt1))
  20. ; do the ucs bit here erase line UCS OB then oops does it work
  21. (setq newlst '())
  22. (setq len2 (length co-ords))
  23. (repeat vert
  24. (setq newlst (cons (list x (nth (setq len2 (- len2 1)) co-ords)) newlst))
  25. ) ; repeat vert
  26. ; add remaining pts
  27. (repeat (- len2 vert)
  28. (setq newlst (cons (list x (nth (setq len2 (- len2 1)) co-ords)) newlst))
  29. ) ; repeat remainder
  30. ; erase pline and draw new pline
  31. (setq J 0)
  32. (command "pline"
  33. (repeat (length newlst)
  34. (list (nth J newlst)(nth (+ J 1) newlst))
  35. (setq J (+ J  2))
  36. )
  37. ) ;repeat ss
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 18:07:04 | 显示全部楼层
一个更普遍的方法会更好,所以我们不会得到下一个帖子,“它可以被改变为在角度上”。
181910j0vh3wvfg3gixvw0.jpg
回复

使用道具 举报

4

主题

21

帖子

18

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 18:17:40 | 显示全部楼层
嗨,比格尔,
 
谢谢你的帮助。
我不知道我是否遗漏了什么,但如果我运行您的代码,“命令”Pline“”上有错误。
 
  1. (defun c:Test2 (/ pt1 pt2 vert ss objL K co-ords objpl intpt1 x y newlst len2)
  2. ;; http://www.cadtutor.net/forum/showthread.php?97882-Stretch-multiple-base-point-polylines-to-different-distance
  3. ;; BIGAL
  4. (setq pt1 (getpoint "Pick 1st crossing point"))
  5. (setq pt2 (getpoint Pt1 "Pick 2nd crossing point"))
  6. (setq vert (getint "Enter vertice position 2+ etc ")) ;_ do a left or right here pick end instead.
  7. (setq ss (ssget "F" (list pt1 pt2))) ;_ selection set of plines
  8. (command "Line" pt1 pt2 "") ;_ do after select or else line is added
  9. (setq objL (vlax-Ename->Vla-Object (entlast))) ;_ saves line object for intersect erase at end.
  10. ;; pline co-ords example
  11. ;; By Alan H
  12. (defun getcoords (ent)
  13.    (vlax-safearray->list
  14.      (vlax-variant-value
  15.    (vlax-get-property
  16.      (vlax-ename->vla-object ent)
  17.      "Coordinates"
  18.    ) ;_end of vlax-get-property
  19.      ) ;_end of vlax-variant-value
  20.    ) ;_end of vlax-safearray->list
  21. ) ;_end of defun
  22. ;; work in progress
  23. (repeat (setq K (sslength ss)) ;_ loop through
  24.    (setq co-ords (getcoords (ssname ss (setq k (- k 1))))) ;_ pline co-ords ; uses getcoords defun
  25.    (setq objpl (vlax-Ename->Vla-Object (ssname ss k)))
  26.    (setq intpt1 (vlax-invoke objpl 'intersectWith objL acExtendThisEntity))
  27.    (setq x (car intpt1))
  28.    (setq y (cadr intpt1))
  29.    ;; do the ucs bit here erase line UCS OB then oops does it work
  30.    (setq newlst '())
  31.    (setq len2 (length co-ords))
  32.    (repeat vert
  33.      (setq newlst (cons (list x (nth (setq len2 (- len2 1)) co-ords))
  34.             newlst
  35.           ) ;_end of cons
  36.      ) ;_end of setq
  37.    ) ;_ repeat vert
  38.    ;; add remaining pts
  39.    (repeat (- len2 vert)
  40.      (setq newlst (cons (list x (nth (setq len2 (- len2 1)) co-ords))
  41.             newlst
  42.           ) ;_end of cons
  43.      ) ;_end of setq
  44.    ) ;_ repeat remainder
  45.    ;; erase pline and draw new pline
  46.    (setq J 0)
  47.    (command "pline"
  48.         (repeat (length newlst)
  49.           (list (nth J newlst) (nth (+ J 1) newlst))
  50.           (setq J (+ J 2))
  51.         ) ;_end of repeat
  52.    ) ;_end of command
  53. ) ;_repeat ss
  54. (princ)
  55. ) ;_defun

 
 
下一个“使命召唤”。。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 18:26:44 | 显示全部楼层
就像上面说的“一项正在进行的工作”一样,我知道我有一项工作没有完成,但必须做一些真正的工作。周末会有时间,因为他们预计下雨,看看我能做什么。
 
两个规则/问题pline是否总是基本相同的形状,都有4分v的1分和3分等
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 08:45 , Processed in 0.576091 second(s), 71 queries .

© 2020-2025 乐筑天下

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