找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 715|回复: 8

[讨论]:如何判断点选的位置

[复制链接]
发表于 2004-2-15 19:57:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
通过点选,可选中矩形,同时还要判断出点选的位置是处于矩形的什么位置(如:左边)。
矩形可能是用 line  、pliner  、 ectang 三种情况画出的,line画的矩形就不管了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 4个

财富等级: 恭喜发财

发表于 2004-2-15 20:03:48 | 显示全部楼层
求出矩形的型心,根据选择点和型心的关系(x和y的坐标值)不就知道了吗
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-2-15 21:07:16 | 显示全部楼层

  1. ;;获取图元的各个结点的坐标,适用于PLINE和rectang(BOX)
  2. (defun c:tools1        ()                       
  3.   (vl-load-com)
  4.   (setq nlist nil)
  5.   (princ "获取图元的各个结点的坐标,命令:tools1")
  6.   (setq en (entsel "\n选择线: "))
  7.   (setq pt0 (osnap (cadr en) "nea"))        ;按追踪方式设点,
  8. ;;(setq obj (car (entsel "\nSelect a Polyline: ")))
  9.   (setq obj (car en))
  10.   (if (= obj nil)
  11.     (princ "\n没有选中图元")
  12.     (MASSOC 10 (entget obj))
  13.   )
  14.   (pd)
  15.   (prin1)
  16. )
  17. (defun massoc (key alist /)
  18.   (setq iii 0)
  19.   (foreach x alist
  20.     (if        (eq key (car x))
  21.       (progn (setq iii (1+ iii))
  22.              (setq nlist (cons (cdr x) nlist))
  23.       )                                        ;end if
  24.     )
  25.   )
  26. )
  27. (defun pd ()
  28.   (setq ii 0)
  29.   (while (< ii iii)
  30.     (if        (< (car (nth ii nlist)) (car pt0))
  31.       (progn (princ "在右边") (setq ii (+ iii 1)))
  32.     )
  33.     (if        (> (car (nth ii nlist)) (car pt0))
  34.       (progn (princ "在左边") (setq ii (+ iii 1)))
  35.     )
  36.     (setq ii (1+ ii))
  37.   )
  38. )



我是这么写的,感觉不够好,请大家完善!


再看这段代码,用质心来判断,但命令行中列出一大串参数,如果这样作程序就显得太难看了。


  1. (defun c:ss ()
  2.   (setvar "cmdecho" 0)
  3.   (setq en (entsel "\n选择线: "))
  4.   (setq pt0 (osnap (cadr en) "nea"));按追踪方式设点,
  5.   (Command "massprop" en "" "y" "c:\\00")
  6.   (SetQ cpfn (Open "c:\\00.mpr" "r"))
  7.   (Repeat 7 (Read-Line cpfn))
  8.   (SetQ        cpfx (Last (Read (StrCat "(" (Read-Line cpfn) ")")))
  9.                                         ;提取质量中心X位置
  10.         cpfy (Last (Read (StrCat "(" (Read-Line cpfn) ")")))
  11.                                         ;提取质量中心Y位置
  12.   )
  13.   (Close cpfn)

  14.   (if (< cpfx (car pt0))(progn (princ "在右边")(setq ii (+ iii 1))))
  15.   (if (> cpfx (car pt0))(progn (princ "在左边")(setq ii (+ iii 1))))
  16. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-2-16 06:42:01 | 显示全部楼层
1 左右是相对的,你选择的时候在屏幕上看不见吗?! 如果程序仅仅提示个左右编程的意义在什么地方?

2 对程序而言,图示矩形的情况是最简单的,还要考虑UCS情况,矩形绘制的起点情况,Pline中的组码 10 是OCS。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-16 13:00:51 | 显示全部楼层
我也觉得旋,这种方法不是一种有效的方法
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-2-16 19:58:08 | 显示全部楼层
“如果程序仅仅提示个左右编程的意义在什么地方?”
这只是为了方便测试。

我只作平面图,UCS基本上不用考虑。
我用质心,只是决得不方便。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-2-16 22:15:10 | 显示全部楼层
用massprop要先做成region,solid。
如果不考虑ucs,为什么不用实体包围盒?

  1. (defun x_boxcen (eobj )
  2.   (if (= 'ENAME (type eobj)) (setq eobj (vlax-ename->vla-object eobj)))
  3.   (vla-GetBoundingBox eobj 'minpt 'maxpt)
  4.   (setq pt1 (vlax-safearray->list minpt)
  5.         pt3 (vlax-safearray->list maxpt))
  6.    (mapcar '(lambda (x y) (/ (+ x y) 2))(list pt1 pt3)) ;求包围盒中心
  7. )
  8. (defun c:test ()
  9. (setq el (entsel "\n选择实体边:"))
  10. (if (< (car (cadr el)) (car (x_boxcen (car el)))
  11.     (princ "\n在左边.")
  12.     (princ "\n在右边.")
  13. )
  14. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-4 11:09:45 | 显示全部楼层
最初由 陌生人 发布
[B]用massprop要先做成region,solid。
如果不考虑ucs,为什么不用实体包围盒?... [/B]


这个程序有错!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-4 12:37:46 | 显示全部楼层
sorry,修正如下:
[php]
(defun x_boxcen ( eobj )
  (if (= 'ENAME (type eobj)) (setq eobj (vlax-ename->vla-object eobj)))
  (vla-GetBoundingBox eobj 'minpt 'maxpt)
  (setq pt1 (vlax-safearray->list minpt)
        pt3 (vlax-safearray->list maxpt))
   (mapcar '(lambda (x y) (/ (+ x y) 2)) pt1 pt3) ;求包围盒中心
)
(defun c:test ()
(setq el (entsel "\n选择实体边:"))
(if (< (car (cadr el)) (car (x_boxcen (car el))))
    (princ "\n在左边.")
    (princ "\n在右边.")
)(princ)
)

[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-27 00:16 , Processed in 0.242021 second(s), 49 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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