明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1297|回复: 4

[已解答] 由多段线的端点向另一条线求垂足,避免出现无效垂足

[复制链接]
发表于 2016-3-24 01:18 | 显示全部楼层 |阅读模式
   这几天的工作任务是做一个宗地图的标注,要求把界址线上的点求得与下行线间的垂直距离,因为下行线分了好几条,而界址线贯穿一张图,我现在找到的代码出现的错误就是当界址线的水平长度和下行线长度一致时获得的垂足坐标是对的,但是代码默认是通过与界址点的下行线上最近一个点确定垂足,所以出现了有多个界址点得到的垂足坐标是下行线最末的端点,不知道代码怎么改合适呢?还有这样得到的垂足坐标(即程序中的pd)x和y值是2位或3位小数点,没有规律的,怎么设定一下使得精度能够自己设定呢?
  1. (defun c:tes4 ( / pt sl pd ds )
  2. (if (null vlax-dump-object) (vl-load-com)) ;;加载vlax扩展函数
  3.   (setq ptd (HH:PTlists(car (entsel))));获得下行线的顶点串行
  4. (setq ptb (HH:PTlists(car (entsel))));获得界址线的顶点串行
  5.       (princ "\n点的数量:")(princ (length ptb))
  6.   (setq sl (entsel "\n选择直线:")) ;;选择点和线)
  7. (setq i 0)
  8. (setq sl (vlax-ename->vla-object (car sl))) ;;转换直线为vla对象
  9. (repeat (length ptb)
  10.     (setq pt (nth i ptb))
  11.       (setq pd (vlax-curve-getclosestpointto sl pt)) ;;求出直线上距选择点最近的点
  12.       (command "_.line" pt pd "") ;;绘制出最短的距离线
  13.       (setq ds (distance pt pd)) ;;求出两点距离
  14.       (princ (strcat "\n点到该直线的最短距离是:< " (rtos ds) " >")) ;;输出最短距离
  15.       (setq i (+ i 1))      
  16.   )   
  17. (princ) ;;静默退出
  18. )
发表于 2016-3-24 08:21 | 显示全部楼层
  1. (defun c:tt ()
  2.   (vl-load-com)
  3.   (setq s1  (car (entsel "\n选择界址线: "))
  4.         s2  (car (entsel "\n选择下行线: "))
  5.         ptn (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget s1))
  6.   )
  7.   (foreach pt (mapcar 'cdr ptn)
  8.     (setq p1 (vlax-curve-getclosestpointto s2 pt t))
  9.     (command "_.line" "non" pt "non" p1 "")
  10.   )
  11.   (princ)
  12. )
 楼主| 发表于 2016-3-24 12:33 | 显示全部楼层
xyp1964 发表于 2016-3-24 08:21

ptn (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget s1))
  )
请问这句是什么意思呀?
我贴了你的代码,发现界址线所有端点都和下行线外的一点连线了,所以想知道这句的意思

点评

在(entget s1)的表中,移除不是群码10的元素,剩余就是群码为10的元素,即顶点坐标集  发表于 2016-3-25 09:17
发表于 2016-3-24 14:15 | 显示全部楼层
返回由所提供表中的所有能通过测试函数的元素组成的表

(vl-remove-if-not  predicate-function list)
参数

predicate-function

测试函数。它可以是任何一个这样的函数:接受单一参数,且对任何用户指定条件均返回 T。predicate-function 的值可以采用如下格式:

符号 (函数名)  
'(LAMBDA (A1 A2) ...)
(FUNCTION (LAMBDA (A1 A2) ...))
list

要测试的表。

返回值

表,其中包含 list 中的所有使 predicate-function 返回非 nil 值的元素。

示例

_$ (vl-remove-if-not 'vl-symbolp (list pi t 0 "abc"))
(T)
引自明经函数参考
 楼主| 发表于 2016-4-3 16:56 | 显示全部楼层
多谢各位的帮助
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-28 19:25 , Processed in 0.362292 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表