明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1664|回复: 9

如何找一般线段的各顶点(附图)

[复制链接]
发表于 2004-1-18 19:47:00 | 显示全部楼层 |阅读模式
我要根据如图竖线与折线的交点(该交点可以通过拾取得到其坐标)分别往左右两边找折线的各顶点坐标,怎么搞?请帮帮忙!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2004-1-18 19:52:00 | 显示全部楼层
选中须查找的线段,输入“list“查看就行了
 楼主| 发表于 2004-1-18 20:50:00 | 显示全部楼层
要的是自动得出坐标啊,只要拾取那个交点后,就能得到左右两边的各个顶点,不用再在图上点了
发表于 2004-1-19 08:46:00 | 显示全部楼层
你所谓的折线并不是折线,只是一些线段组成的。。。是否都这样?
还有,竖线是否都会在某个顶点上?
 楼主| 发表于 2004-1-19 09:11:00 | 显示全部楼层
对,就是这样。是一些线段的组成并且竖线肯定在某个顶点上。
发表于 2004-1-19 09:35:00 | 显示全部楼层

  1. (defun c:GetPt( / ent pt1 pt2 ss i ptL1 ptL2 pts)
  2.   (setq ent (car (entsel "选择竖线...")))
  3.   (setq pt1 (cdr (assoc 10 (entget ent))))
  4.   (setq pt2 (cdr (assoc 11 (entget ent))))
  5.   (setq ss (ssget "f" (list pt1 pt2) '((0 . "line"))))
  6.   (ssdel ent ss)
  7.   (setq i 0)
  8.   (repeat (sslength ss)
  9.     (setq ent (ssname ss i))
  10.     (setq ptL1 (cdr (assoc 10 (entget ent))))
  11.     (setq ptL2 (cdr (assoc 11 (entget ent))))
  12.     (setq ptInter (inters pt1 pt2 ptL1 ptL2))
  13.     (if (equal ptL1 ptInter 0.00001)
  14.       (setq pts (append pts (list ptL2)))
  15.       (setq pts (append pts (list ptL1)))
  16.     )
  17.     (setq i (1+ i))
  18.   )
  19.   pts
  20. )
  21.   
 楼主| 发表于 2004-1-19 12:41:00 | 显示全部楼层
为什么只找到两个点啊,左边一个,右边一个,都是离交点最近的那个点。我需要的是所有线段的顶点啊?
发表于 2004-1-19 14:11:00 | 显示全部楼层

  1. (defun c:GetPt( / ss pt x i pt1 pt2 ptLs ptRs ent)
  2.   (setq ss (ssget "x" '((0 . "line"))))
  3.   (setq pt (cdr (assoc 10 (entget (car (entsel "选择竖线..."))))))
  4.   (setq x (car pt))
  5.   (setq i 0)
  6.   (setq ptLs nil
  7.         ptRs nil)
  8.   (repeat (sslength ss)
  9.     (setq ent (ssname ss i))
  10.     (setq pt1 (cdr (assoc 10 (entget ent))))
  11.    
  12.     (cond
  13.       ((< (car pt1) x) (if (not (member pt1 ptLs)) (setq ptLs (append ptLs (list pt1)))))
  14.       ((> (car pt1) x) (if (not (member pt1 ptRs)) (setq ptRs (append ptRs (list pt1)))))
  15.     )
  16.     (setq pt2 (cdr (assoc 11 (entget ent))))
  17.     (cond
  18.       ((< (car pt2) x) (if (not (member pt2 ptLs)) (setq ptLs (append ptLs (list pt2)))))
  19.       ((> (car pt2) x) (if (not (member pt2 ptRs)) (setq ptRs (append ptRs (list pt2)))))
  20.     )
  21.    
  22.     (setq i (1+ i))
  23.   )
  24.   (list ptLs ptRs)
  25. )
 楼主| 发表于 2004-1-19 17:33:00 | 显示全部楼层
ok了,谢谢
发表于 2004-1-19 20:04:00 | 显示全部楼层
本帖最后由 作者 于 2004-1-19 20:33:50 编辑


  1. ;|pts=按分界点列左右直线点表并排序--------------------------------无痕.2004.1
  2. 测试:
  3. Command: pts
  4. 选分界点:
  5. -> (((10628.5 9484.92 0.0) (14627.4 13324.7 0.0) (16925.9 10523.5 0.0) (19602.4 12632.2 0.0))
  6.     ((26214.7 9012.82 0.0) (27789.1 12474.9 0.0) (32354.8 9107.24 0.0) (37140.8 12065.7 0.0) (38085.5 10114.4 0.0)))
  7. |;
  8. [color=blue]
  9. (defun c:pts ( / pt ss ssv ptlst1 ptlst2)
  10.   (setq ptlst1 nil ptlst2 nil
  11.         pt  (getpoint "\n选分界点:")
  12.         ss  (ssget "x" '((0 . "LINE")))
  13.         ssv (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))
  14.   (vlax-for obj ssv
  15.         (foreach n (list (vlax-get obj 'startpoint) (vlax-get obj 'endpoint))
  16.            (cond  ((and (< (car n) (car pt))(not (member n ptlst1))) (setq ptlst1 (cons n ptlst1)))
  17.                   ((and (> (car n) (car pt))(not (member n ptlst2))) (setq ptlst2 (cons n ptlst2)))
  18.            )
  19.   )   )
  20.   (list (vl-sort ptlst1 (setq sortlst '(lambda (x y) (< (car x)(car y))))) (vl-sort ptlst2 sortlst))
  21. )[/color]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-10-2 03:25 , Processed in 0.177527 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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