乐筑天下

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

[编程交流] 直线上最近的点

[复制链接]

23

主题

89

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
115
发表于 2022-7-6 07:58:39 | 显示全部楼层 |阅读模式
我前阵子从李那里得到了这个代码,它工作得很好,但我需要做一些调整,我不知道怎么做。我可以理解代码,但修改它对我来说是一项艰巨的任务。我所需要的是:如果块名为“Block1”,将线放在“Layer1”的层上,“Block2”到“Layer2”层上。
再次感谢。
 
 
 
  1. ;;;by lee-mac ;;nearest point on a line
  2. (defun c:test ( / d1 d2 el en in l1 l2 p2 p3 ss )
  3.    (if (setq ss (ssget '((0 . "INSERT,LINE"))))
  4.        (progn
  5.            (repeat (setq in (sslength ss))
  6.                (setq en (ssname ss (setq in (1- in)))
  7.                      el (entget en)
  8.                )
  9.                (if (eq "LINE" (cdr (assoc 0 el)))
  10.                    (setq l1 (cons en l1))
  11.                    (setq l2 (cons (trans (cdr (assoc 10 el)) en 0) l2))
  12.                )
  13.            )
  14.            (foreach p1 l2
  15.                (setq p2 (vlax-curve-getclosestpointto (car l1) p1)
  16.                      d1 (distance p1 p2)
  17.                )
  18.                (foreach en (cdr l1)
  19.                    (setq p3 (vlax-curve-getclosestpointto en p1)
  20.                          d2 (distance p1 p3)
  21.                    )
  22.                    (if (< d2 d1) (setq d1 d2 p2 p3))
  23.                )
  24.                (entmake (list '(0 . "LINE") (cons 10 p1) (cons 11 p2)))
  25.            )
  26.        )
  27.    )
  28.    (princ)
  29. )
  30. (vl-load-com) (princ)
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 08:17:05 | 显示全部楼层
不精确,但给出了需要“if a block”并使用assoc 2=块名的想法
 
  1. (if (eq "LINE" (cdr (assoc 0 el)))
  2.                    (setq l1 (cons en l1))
  3. (if (eq "INSERT" (cdr (assoc 0 el)))
  4.                    (setq blockname (cdr (assoc 2 el)))
  5. then you need to find out block "2" so can do a (setvar "clayer" "layer2")
  6. )
  7. You need a end of text as numbers 01 etc lisp do it as a defun in main code I need this also Lee I think has a routine for this.
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:24:43 | 显示全部楼层
稍微调整一下:
 
  1. ;; Nearest point on a line  -  Lee Mac
  2. (defun c:test ( / d1 d2 el en in l1 l2 la p2 p3 ss )
  3.    (if (setq ss (ssget '((0 . "INSERT,LINE"))))
  4.        (progn
  5.            (repeat (setq in (sslength ss))
  6.                (setq en (ssname ss (setq in (1- in)))
  7.                      el (entget en)
  8.                )
  9.                (if (eq "LINE" (cdr (assoc 0 el)))
  10.                    (setq l1 (cons en l1))
  11.                    (setq l2 (cons (list (trans (cdr (assoc 10 el)) en 0) (cdr (assoc 2 el))) l2))
  12.                )
  13.            )
  14.            (foreach p1 l2
  15.                (setq la (cadr p1)
  16.                      p1 (car  p1)
  17.                      p2 (vlax-curve-getclosestpointto (car l1) p1)
  18.                      d1 (distance p1 p2)
  19.                )
  20.                (foreach en (cdr l1)
  21.                    (setq p3 (vlax-curve-getclosestpointto en p1)
  22.                          d2 (distance p1 p3)
  23.                    )
  24.                    (if (< d2 d1) (setq d1 d2 p2 p3))
  25.                )
  26.                (entmake
  27.                    (list
  28.                       '(0 . "LINE")
  29.                        (cons 8 (vl-string-subst "Layer" "Block" la))
  30.                        (cons 10 p1)
  31.                        (cons 11 p2)
  32.                    )
  33.                )
  34.            )
  35.        )
  36.    )
  37.    (princ)
  38. )
  39. (vl-load-com) (princ)
回复

使用道具 举报

23

主题

89

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
115
发表于 2022-7-6 08:36:10 | 显示全部楼层
太棒了效果完美。再次感谢Bigal&Lee。
 
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:40:56 | 显示全部楼层
非常欢迎你学习,我希望我的修改是明确的
回复

使用道具 举报

23

主题

89

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
115
发表于 2022-7-6 08:53:57 | 显示全部楼层
是的,很清楚。我可以理解你的代码,但我认为我不能在不久的将来编写这样的代码,或者可能永远不会。为我剖析代码是学习lisp的最好方法。谢谢李。
 
 
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:03:28 | 显示全部楼层
 
永不言败!你永远不知道你能做什么!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-9 20:40 , Processed in 0.399093 second(s), 77 queries .

© 2020-2025 乐筑天下

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