乐筑天下

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

[编程交流] 延伸或修剪到正交

[复制链接]

6

主题

25

帖子

19

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 17:53:51 | 显示全部楼层 |阅读模式
请问有没有人有点Lisp程序的延伸/修剪?
这肯定是以前做过,但我找不到它,尽管谷歌搜索彻底。
这是我的第一篇帖子&我希望我正确地添加了jpg
功能:
选择点(var pickpt)
将选定线延伸或修剪到pickpt的正交投影
终止
在图片中,黄色虚线是pickpt的正交投影,洋红是要延伸/修剪的线。
我希望实际的扩展修剪通过重复循环完成,新端点通过极轴函数创建,列表创建,然后子函数创建
(subst lst(assoc 10 linedxf)

(subst lst(assoc 11 linedxf)
取决于assoc 10或assoc 11是否更接近拾取点
我目前的代码:
  1. (defun c:triangle (/ adj1 ang dist1 hyp1 hyp2 list1 ncos npt p1 p2 P3 pickpt)
  2. (Setq pickpt (getpoint"\nSelect Pickpoint"))
  3. (Setq p1 (getpoint"\nSelect Point 1"))
  4. (Setq p2 (getpoint"\nSelect Point 2"))
  5. (setq ang (angle p1 p2))
  6. (setq list1 (list (car pickpt) (cadr p2) 0.0))
  7. (setq hyp1 (distance p1 p2))
  8. (setq dist1 (distance p2 list1))
  9. (setq adj1 (* hyp1 (cos ang)))
  10. (if (< adj1 0.0)
  11.    (setq adj1 (* adj1 -1))
  12. )
  13. (setq ncos (cos ang))
  14. (setq hyp2 (/ dist1 ncos))
  15. (if (< hyp2 0.0)
  16.    (setq hyp2 (* hyp2 -1))
  17. )   
  18. (if (< ncos 0.0)
  19.    (setq ncos (*(cos ang)-1))
  20. )
  21. (setq npt (polar p2 ang hyp2))
  22. (princ (strcat "\n npt is: "(rtos(car npt)) ", " (rtos(cadr npt)) ", " "0.0")); for testing
  23. (princ)
  24. )

 
 
但最后我在三角游戏中迷路了:-(
185352lnzsxdxxxdawpli7.jpg
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 18:01:15 | 显示全部楼层
我不太确定,但测试一下。。。
 
  1. (defun c:exttrimtoptucs ( / *adoc* *error* ucsf ss xr yr i li p1 p2 )
  2. (vl-load-com)
  3. (setq *adoc* (vla-get-activedocument (vlax-get-acad-object)))
  4. (defun *error* ( m )
  5.    (if ucsf
  6.      (command "_.UCS" "_P")
  7.    )
  8.    (if (entget xr)
  9.      (entdel xr)
  10.    )
  11.    (if (entget yr)
  12.      (entdel yr)
  13.    )
  14.    (vla-endundomark *adoc*)
  15.    (if m
  16.      (prompt m)
  17.    )
  18.    (princ)
  19. )
  20. (vla-startundomark *adoc*)
  21. (if (= 0 (getvar 'worlducs))
  22.    (progn
  23.      (command "_.UCS" "_W")
  24.      (setq ucsf t)
  25.    )
  26. )
  27. (prompt "\nSelect LINEs to extend/trim to picked point...")
  28. (cond
  29.    ( (setq ss (ssget "_:L" '((0 . "LINE"))))
  30.      (prompt "\nPick or specify point and choose X axis orientation : ")
  31.      (command "_.UCS")
  32.      (while (< 0 (getvar 'cmdactive))
  33.        (command "\")
  34.      )
  35.      (command "_.RAY" "_non" '(0.0 0.0 0.0) "_non" '(1.0 0.0 0.0) "")
  36.      (setq xr (entlast))
  37.      (command "_.RAY" "_non" '(0.0 0.0 0.0) "_non" '(0.0 1.0 0.0) "")
  38.      (setq yr (entlast))
  39.      (repeat (setq i (sslength ss))
  40.        (setq li (ssname ss (setq i (1- i))))
  41.        (setq p1 (vlax-invoke (vlax-ename->vla-object li) 'intersectwith (vlax-ename->vla-object xr) acextendthisentity))
  42.        (if (null p1)
  43.          (setq p1 (vlax-invoke (vlax-ename->vla-object li) 'intersectwith (vlax-ename->vla-object xr) acextendnone))
  44.        )
  45.        (setq p2 (vlax-invoke (vlax-ename->vla-object li) 'intersectwith (vlax-ename->vla-object yr) acextendthisentity))
  46.        (if (null p2)
  47.          (setq p2 (vlax-invoke (vlax-ename->vla-object li) 'intersectwith (vlax-ename->vla-object yr) acextendnone))
  48.        )
  49.        (cond
  50.          ( (and p1 (not p2)
  51.              (equal (distance (cdr (assoc 10 (entget li))) (cdr (assoc 11 (entget li)))) (+ (distance (cdr (assoc 10 (entget li))) p1) (distance p1 (cdr (assoc 11 (entget li))))) 1e-6)
  52.              (> (car (trans (cdr (assoc 10 (entget li))) 0 1)) 0)
  53.              (> (cadr (trans (cdr (assoc 10 (entget li))) 0 1)) 0)
  54.            )
  55.            (entupd (cdr (assoc -1 (entmod (subst (cons 11 p1) (assoc 11 (entget li)) (entget li))))))
  56.          )
  57.          ( (and p1 (not p2)
  58.              (equal (distance (cdr (assoc 10 (entget li))) (cdr (assoc 11 (entget li)))) (+ (distance (cdr (assoc 10 (entget li))) p1) (distance p1 (cdr (assoc 11 (entget li))))) 1e-6)
  59.              (> (car (trans (cdr (assoc 11 (entget li))) 0 1)) 0)
  60.              (> (cadr (trans (cdr (assoc 11 (entget li))) 0 1)) 0)
  61.            )
  62.            (entupd (cdr (assoc -1 (entmod (subst (cons 10 p1) (assoc 10 (entget li)) (entget li))))))
  63.          )
  64.          ( (and (not p1) p2
  65.              (equal (distance (cdr (assoc 10 (entget li))) (cdr (assoc 11 (entget li)))) (+ (distance (cdr (assoc 10 (entget li))) p2) (distance p2 (cdr (assoc 11 (entget li))))) 1e-6)
  66.              (> (car (trans (cdr (assoc 10 (entget li))) 0 1)) 0)
  67.              (> (cadr (trans (cdr (assoc 10 (entget li))) 0 1)) 0)
  68.            )
  69.            (entupd (cdr (assoc -1 (entmod (subst (cons 11 p2) (assoc 11 (entget li)) (entget li))))))
  70.          )
  71.          ( (and (not p1) p2
  72.              (equal (distance (cdr (assoc 10 (entget li))) (cdr (assoc 11 (entget li)))) (+ (distance (cdr (assoc 10 (entget li))) p2) (distance p2 (cdr (assoc 11 (entget li))))) 1e-6)
  73.              (> (car (trans (cdr (assoc 11 (entget li))) 0 1)) 0)
  74.              (> (cadr (trans (cdr (assoc 11 (entget li))) 0 1)) 0)
  75.            )
  76.            (entupd (cdr (assoc -1 (entmod (subst (cons 10 p2) (assoc 10 (entget li)) (entget li))))))
  77.          )
  78.          ( (and p1 (not p2)
  79.              (equal (distance (cdr (assoc 11 (entget li))) p1) (+ (distance (cdr (assoc 11 (entget li))) (cdr (assoc 10 (entget li)))) (distance (cdr (assoc 10 (entget li))) p1)) 1e-6)
  80.            )
  81.            (entupd (cdr (assoc -1 (entmod (subst (cons 10 p1) (assoc 10 (entget li)) (entget li))))))
  82.          )
  83.          ( (and p1 (not p2)
  84.              (equal (distance (cdr (assoc 10 (entget li))) p1) (+ (distance (cdr (assoc 10 (entget li))) (cdr (assoc 11 (entget li)))) (distance (cdr (assoc 11 (entget li))) p1)) 1e-6)
  85.            )
  86.            (entupd (cdr (assoc -1 (entmod (subst (cons 11 p1) (assoc 11 (entget li)) (entget li))))))
  87.          )
  88.          ( (and (not p1) p2
  89.              (equal (distance (cdr (assoc 11 (entget li))) p2) (+ (distance (cdr (assoc 11 (entget li))) (cdr (assoc 10 (entget li)))) (distance (cdr (assoc 10 (entget li))) p2)) 1e-6)
  90.            )
  91.            (entupd (cdr (assoc -1 (entmod (subst (cons 10 p2) (assoc 10 (entget li)) (entget li))))))
  92.          )
  93.          ( (and (not p1) p2
  94.              (equal (distance (cdr (assoc 10 (entget li))) p2) (+ (distance (cdr (assoc 10 (entget li))) (cdr (assoc 11 (entget li)))) (distance (cdr (assoc 11 (entget li))) p2)) 1e-6)
  95.            )
  96.            (entupd (cdr (assoc -1 (entmod (subst (cons 11 p2) (assoc 11 (entget li)) (entget li))))))
  97.          )
  98.          ( (and p1 p2
  99.              (equal (distance (cdr (assoc 11 (entget li))) p1) (+ (distance (cdr (assoc 11 (entget li))) (cdr (assoc 10 (entget li)))) (distance (cdr (assoc 10 (entget li))) p1)) 1e-6)
  100.            )
  101.            (entupd (cdr (assoc -1 (entmod (subst (cons 10 p1) (assoc 10 (entget li)) (entget li))))))
  102.            (entupd (cdr (assoc -1 (entmod (subst (cons 11 p2) (assoc 11 (entget li)) (entget li))))))
  103.          )
  104.          ( (and p1 p2
  105.              (equal (distance (cdr (assoc 10 (entget li))) p1) (+ (distance (cdr (assoc 10 (entget li))) (cdr (assoc 11 (entget li)))) (distance (cdr (assoc 11 (entget li))) p1)) 1e-6)
  106.            )
  107.            (entupd (cdr (assoc -1 (entmod (subst (cons 11 p1) (assoc 11 (entget li)) (entget li))))))
  108.            (entupd (cdr (assoc -1 (entmod (subst (cons 10 p2) (assoc 10 (entget li)) (entget li))))))
  109.          )
  110.          ( (and p1 p2
  111.              (equal (distance (cdr (assoc 11 (entget li))) p2) (+ (distance (cdr (assoc 11 (entget li))) (cdr (assoc 10 (entget li)))) (distance (cdr (assoc 10 (entget li))) p2)) 1e-6)
  112.            )
  113.            (entupd (cdr (assoc -1 (entmod (subst (cons 10 p2) (assoc 10 (entget li)) (entget li))))))
  114.            (entupd (cdr (assoc -1 (entmod (subst (cons 11 p1) (assoc 11 (entget li)) (entget li))))))
  115.          )
  116.          ( (and p1 p2
  117.              (equal (distance (cdr (assoc 10 (entget li))) p2) (+ (distance (cdr (assoc 10 (entget li))) (cdr (assoc 11 (entget li)))) (distance (cdr (assoc 11 (entget li))) p2)) 1e-6)
  118.            )
  119.            (entupd (cdr (assoc -1 (entmod (subst (cons 11 p2) (assoc 11 (entget li)) (entget li))))))
  120.            (entupd (cdr (assoc -1 (entmod (subst (cons 10 p1) (assoc 10 (entget li)) (entget li))))))
  121.          )
  122.          ( (and p1 p2
  123.              (equal (distance p1 p2) (+ (distance p1 (cdr (assoc 10 (entget li)))) (distance (cdr (assoc 10 (entget li))) p2)) 1e-6)
  124.              (equal (distance p1 p2) (+ (distance p1 (cdr (assoc 11 (entget li)))) (distance (cdr (assoc 11 (entget li))) p2)) 1e-6)
  125.              (< (distance (cdr (assoc 10 (entget li))) p1) (distance (cdr (assoc 11 (entget li))) p1))
  126.              (< (distance (cdr (assoc 11 (entget li))) p2) (distance (cdr (assoc 10 (entget li))) p2))
  127.            )
  128.            (entupd (cdr (assoc -1 (entmod (subst (cons 10 p1) (assoc 10 (entget li)) (entget li))))))
  129.            (entupd (cdr (assoc -1 (entmod (subst (cons 11 p2) (assoc 11 (entget li)) (entget li))))))
  130.          )
  131.          ( (and p1 p2
  132.              (equal (distance p1 p2) (+ (distance p1 (cdr (assoc 10 (entget li)))) (distance (cdr (assoc 10 (entget li))) p2)) 1e-6)
  133.              (equal (distance p1 p2) (+ (distance p1 (cdr (assoc 11 (entget li)))) (distance (cdr (assoc 11 (entget li))) p2)) 1e-6)
  134.              (< (distance (cdr (assoc 10 (entget li))) p2) (distance (cdr (assoc 11 (entget li))) p2))
  135.              (< (distance (cdr (assoc 11 (entget li))) p1) (distance (cdr (assoc 10 (entget li))) p1))
  136.            )
  137.            (entupd (cdr (assoc -1 (entmod (subst (cons 10 p2) (assoc 10 (entget li)) (entget li))))))
  138.            (entupd (cdr (assoc -1 (entmod (subst (cons 11 p1) (assoc 11 (entget li)) (entget li))))))
  139.          )
  140.        )
  141.      )
  142.      (command "_.UCS" "_P")
  143.    )
  144.    ( t (prompt "\nEmpty sel.set... Retry routine next time..."))
  145. )
  146. (*error* nil)
  147. )

 
HTH,M.R。
向所有76岁的一代(我也是)。。。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:10:22 | 显示全部楼层
请尝试以下操作:
[code](defunc:orthextrim(/enx ept idx lst pnt sel spt vec)(ifsetqsel(ssget'((0.“LINE”)))(setqpnt(=MAROON]“\n指定点:”)))(repeat[setq[[color]idx(sslength[[color]sel))(setq[[color]enx(entget[[color](ssname[[color]sel(setq[[color]idx(1-idx)))spt(cdr[[color](assoc[[color]10 enx))ept(cdr[[color](assoc[color]11 enx)vec(mapcar[color]'-spt ept)(ifcdrsetqlst(vl sortvl remove if(lambda(x)(或[
回复

使用道具 举报

6

主题

25

帖子

19

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 18:15:45 | 显示全部楼层
我试图通过三角测量/三角法&一个极函数来求解它,似乎是找错了方向。我刚刚测试了你的代码Lee Mac&它运行得很好,非常感谢。也谢谢你,马克,我试过你的,但挂了几次。
 
 
-西蒙
回复

使用道具 举报

21

主题

155

帖子

135

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
105
发表于 2022-7-5 18:21:26 | 显示全部楼层
这是个好主意,不幸的是,我两个代码都无法运行,我使用的是plain 2014。李的代码也停止了,它扩展或修剪了一行,但忽略了其他选定的行。在VLIDE中,它显示带括号的光标,就像等待AutoCAD执行某些操作一样。同上Markos代码。你是怎么让它工作的simon1976?
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 18:27:57 | 显示全部楼层
我的代码适用于我。。。何时发生悬挂?。。。您知道必须为UCS X、Y轴提供方向吗?。。。你所要做的就是选择线和拾取点,然后用第二个拾取提供X轴的方向(Y轴始终与X成逆时针90度),所以如果你想像图中那样,你应该在-90度处拾取第二个点,这样XDIR为(0-1)和YDIR(1 0)。。。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:31:48 | 显示全部楼层
 
非常欢迎你,西蒙,这是一个很有趣的节目。
回复

使用道具 举报

6

主题

25

帖子

19

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-5 18:41:09 | 显示全部楼层
你好,Marko
 
 
UCS总是世界级的&我从不更改它,lisp不会提示选择点来修剪/延伸直线(参见上图)&它似乎以错误的方式延伸直线
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 18:45:53 | 显示全部楼层
有没有可能没有人理解写的代码。。。我已经解释了lisp的工作原理,您必须选择直线,然后选择2个点(X轴方向的基点和秒)。。。然后,Lisp正在构造要计算修剪/延伸的2个光线实体。。。最后,UCS返回到以前的方向,并删除光线,使线图元修改(修剪/扩展)为完全先前定义的光线(UCS的方向)。。。所以它的作用与图片中相同,您只需要提供正确的方向XDIR(0-1)YDIR(1 0)。。。更重要的是,你可以指定任何其他你想要执行动作的方向,因此,我的版本比李的更一般。。。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 18:51:56 | 显示全部楼层
嗨,西蒙,
我刚刚测试了Marko的代码。
首先,你需要选择你的台词,
然后,为了指定原点,在示例中选择“PICKPT”
然后指定第二个点,就像在示例中创建这些假想线之一一样
对于第三个点,点击这两条假想线之间的某个区域。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 00:36 , Processed in 1.219877 second(s), 75 queries .

© 2020-2025 乐筑天下

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