明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3710|回复: 14

判断图元选择集中的X坐标的最小值

  [复制链接]
发表于 2005-9-16 20:16:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2005-9-19 13:27:55 编辑

     这是我编的LISP程序判断那个图元X坐标最小,先选择图元集(里面有直线和圆弧),再判断那个图元上的点在最左边,也就是X坐标最小,X坐标最小我已求出,但它的Y 坐标怎么求,请高人指点.谢谢!

(defun c:BDXZ (/ X1 X2 I X SST N SA EA)
 (setvar "cmdecho" 0)
 (setq sst (ssget))
 (setq n (sslength sst))
 (setq I 0)
 (setq X 10000)
 (setq X1 10001)
 (setq X2 10002)
 (while (< I n)
  (setq ety (entget (ssname sst I)))
  (setq name (cdr (assoc 0 ety)))
  (cond ((= name "LINE")
       (setq x1 (car (cdr (assoc 10 ety))))
       (setq x2 (car (cdr (assoc 11 ety)))))
       ((= name "ARC")
       (setq Sa (cdr (assoc 50 ety)))
        (setq ea (cdr (assoc 51 ety)))
       (IF (OR (>= EA PI) (= SA PI))
       (setq X1 (- (car (cdr (assoc 10 ety))) (cdr (assoc 40 ety)))))(= X1 10000))
       (T (princ "\n 请重新选择")))
  (SETQ I (+ I 1))
  (setq X (MIN X X1 X2)))
  (PRINC "\n 坐标最小点 X=")
  (princ X)
  (PRIN1)
  )

本帖子中包含更多资源

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

x
发表于 2005-9-16 20:43:00 | 显示全部楼层
第一次运行只有 x1 或 x2 ,(min x1 x2) 错误
 楼主| 发表于 2005-9-16 21:03:00 | 显示全部楼层
2楼你说的话我不明白,你能否给我讲透彻一点,
发表于 2005-9-16 23:28:00 | 显示全部楼层

判断图元选择集中的X坐标的最小值
请大家批评指正:

(defun c:test (/ x x1 x2)
  (vl-load-com)
  (setq *AcadDocument* (vla-get-ActiveDocument (vlax-Get-Acad-Object)))
  (if (ssget '((0 . "line,arc")))
    (progn
      (setq x nil)
      (setq ss (vla-Get-ActiveSelectionset *AcadDocument*))
      (vlax-for en ss
 (setq x1 (car (vlax-safearray->list (vlax-variant-value (vla-get-startpoint en))))
       x2 (car (vlax-safearray->list (vlax-variant-value (vla-get-endpoint en))))
 )
 (if (null x)
   (setq x (min x1 x2))
   (setq x (min x1 x2 x))
 )
      )
      (princ (strcat "\n The left point_X= " (rtos x 2 4)))
    )
  )
  (prin1)
)

 楼主| 发表于 2005-9-17 06:26:00 | 显示全部楼层
4楼的朋友我是初学LISP,对visual.lisp是一点也不懂,所以我希望谁能用LISP编写这个程序,不过我还是要谢谢你.另外我还有一个程序麻烦大家,就是求选择集中的两个端点坐标.不明白可看附件.谢谢!

本帖子中包含更多资源

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

x
发表于 2005-9-17 09:46:00 | 显示全部楼层
  1. (defun c:tt (/ ss)
  2.   (if (setq ss (ssget '((0 . "line,arc"))))
  3.     (progn
  4.       (command ".undo" "m")
  5.       (command ".pedit" "m" ss "" "y" "j" "")
  6.       (list (vlax-curve-getstartpoint (entlast))
  7.         (vlax-curve-getendpoint (entlast))
  8.       )
  9.       (command ".undo" "e")
  10.       (command ".undo" "")
  11.     )
  12.   )
  13.   (princ)
  14. )
 楼主| 发表于 2005-9-17 11:25:00 | 显示全部楼层

   六楼的朋友你是把它变成一条多段线 但还是没有求出来啊,你是不是要求再去选取它用Cdr函数来求的,我的意思是一次选取啊,其它的就要程序自己去算了

 

发表于 2005-9-18 12:12:00 | 显示全部楼层

新下载了你的图文件,看了一下,我想没有 Vlisp 函数是不好搞的

我也是会一点点的 Vlisp 函数,下面的程序这个应该可以满足你的要求

请你测试!!有问题再说....

(defun c:test (/ tmp pt vn LineObj LeftPt)
  (vl-load-com)
  (setq *AcadDocument* (vla-get-ActiveDocument (vlax-Get-Acad-Object)))
  (if (ssget '((0 . "line,arc")))
    (progn
      (setq tmp (GetMinX))
      (setq pt (cadr tmp)
     vn (car tmp)
      )
      (setq old_cmdecho (getvar "cmdecho")
     old_osmode (getvar "osmode")
      )
      (setvar "cmdecho" 0)
      (setvar "osmode" 0)
      (command ".line" pt (polar pt (* pi 1.5) 1) "")
      (setq LineObj (vlax-ename->vla-object (entlast)))
      (setq LeftPt (vlax-safearray->list (vlax-variant-value (vla-intersectwith LineObj vn acExtendBoth))))
      (vla-erase LineObj)
      (setq LeftPt (list (atof (rtos (car LeftPt) 2 4)) (atof (rtos (cadr LeftPt) 2 4)) 0))
      (command "circle" leftpt 1)
      (princ (strcat "\n The LeftPt =" (rtos (car LeftPt) 2 4) " , " (rtos (cadr LeftPt) 2 4)))
      (setvar "cmdecho" old_cmdecho)
      (setvar "osmode" old_osmode)
    )
  )
  (prin1)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun GetMinX (/ ss x1 y1 x y vn)
  (setq ss (vla-get-ActiveSelectionset *AcadDocument*))
  (vlax-for en ss
    (vla-GetBoundingBox en 'MinPt 'MaxPt)
    (setq x1 (car (vlax-safearray->list MinPt))
   y1 (cadr (vlax-safearray->list MinPt))
    )
    (if (null x)
      (setq x  x1
     y  y1
     vn en
      )
      (progn
 (setq y (min y y1))
 (if (> x x1)
   (setq x  x1
  vn en
   )
 )
      )
    )
  )
  (vla-put-color vn acGreen)
  (list vn (list (+ x 0.00000001) y))
)

 楼主| 发表于 2005-9-18 14:32:00 | 显示全部楼层
本帖最后由 作者 于 2005-9-18 16:43:02 编辑

谢谢,加载后一却搞定,送你一朵鲜花

发表于 2005-9-18 17:13:00 | 显示全部楼层

晕,搞得我又花了半天时间,怎么查都没查到问题。

不过总算搞定就好了!

希望你下次再发这种问题,好让我也提高提高一下了!

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

本版积分规则

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

GMT+8, 2025-6-1 23:05 , Processed in 0.194749 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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