zhh101 发表于 2005-9-16 20:16:00

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

本帖最后由 作者 于 2005-9-19 13:27:55 编辑 <br /><br /> <P>&nbsp;&nbsp;&nbsp;&nbsp; 这是我编的LISP程序判断那个图元X坐标最小,先选择图元集(里面有直线和圆弧),再判断那个图元上的点在最左边,也就是X坐标最小,X坐标最小我已求出,但它的Y 坐标怎么求,请高人指点.谢谢!</P>
<P>(defun c:BDXZ (/ X1 X2 I X SST N SA EA)<BR>&nbsp;(setvar "cmdecho" 0)<BR>&nbsp;(setq sst (ssget))<BR>&nbsp;(setq n (sslength sst))<BR>&nbsp;(setq I 0)<BR>&nbsp;(setq X 10000)<BR>&nbsp;(setq X1 10001)<BR>&nbsp;(setq X2 10002)<BR>&nbsp;(while (&lt; I n)<BR>&nbsp; (setq ety (entget (ssname sst I)))<BR>&nbsp; (setq name (cdr (assoc 0 ety)))<BR>&nbsp; (cond ((= name "LINE")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq x1 (car (cdr (assoc 10 ety)))) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq x2 (car (cdr (assoc 11 ety)))))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((= name "ARC")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq Sa (cdr (assoc 50 ety)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq ea (cdr (assoc 51 ety)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (IF (OR (&gt;= EA PI) (= SA PI))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq X1 (- (car (cdr (assoc 10 ety))) (cdr (assoc 40 ety)))))(= X1 10000))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (T (princ "\n 请重新选择")))<BR>&nbsp; (SETQ I (+ I 1))<BR>&nbsp; (setq X (MIN X X1 X2)))<BR>&nbsp; (PRINC "\n 坐标最小点 X=")<BR>&nbsp; (princ X)<BR>&nbsp; (PRIN1)<BR>&nbsp; )</P>

Ea 发表于 2005-9-16 20:43:00

第一次运行只有 x1 或 x2 ,(min x1 x2) 错误<br>

zhh101 发表于 2005-9-16 21:03:00

2楼你说的话我不明白,你能否给我讲透彻一点,

HuaiYu 发表于 2005-9-16 23:28:00

<P><STRONG>判断图元选择集中的X坐标的最小值</STRONG><BR>请大家批评指正:</P>
<P>(defun c:test (/ x x1 x2)<BR>&nbsp; (vl-load-com)<BR>&nbsp; (setq *AcadDocument* (vla-get-ActiveDocument (vlax-Get-Acad-Object)))<BR>&nbsp; (if (ssget '((0 . "line,arc")))<BR>&nbsp;&nbsp;&nbsp; (progn<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq x nil)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq ss (vla-Get-ActiveSelectionset *AcadDocument*))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vlax-for&nbsp;en ss<BR>&nbsp;(setq x1 (car (vlax-safearray-&gt;list (vlax-variant-value (vla-get-startpoint en))))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x2 (car (vlax-safearray-&gt;list (vlax-variant-value (vla-get-endpoint en))))<BR>&nbsp;)<BR>&nbsp;(if (null x)<BR>&nbsp;&nbsp; (setq x (min x1 x2))<BR>&nbsp;&nbsp; (setq x (min x1 x2 x))<BR>&nbsp;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (princ (strcat "\n The left point_X= " (rtos x 2 4)))<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp; )<BR>&nbsp; (prin1)<BR>)</P>

zhh101 发表于 2005-9-17 06:26:00

4楼的朋友我是初学LISP,对visual.lisp是一点也不懂,所以我希望谁能用LISP编写这个程序,不过我还是要谢谢你.另外我还有一个程序麻烦大家,就是求选择集中的两个端点坐标.不明白可看附件.谢谢!

Ea 发表于 2005-9-17 09:46:00


(defun c:tt (/ ss)
(if (setq ss (ssget '((0 . "line,arc"))))
    (progn
      (command ".undo" "m")
      (command ".pedit" "m" ss "" "y" "j" "")
      (list (vlax-curve-getstartpoint (entlast))
      (vlax-curve-getendpoint (entlast))
      )
      (command ".undo" "e")
      (command ".undo" "")
    )
)
(princ)
)

zhh101 发表于 2005-9-17 11:25:00

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

HuaiYu 发表于 2005-9-18 12:12:00

<P>新下载了你的图文件,看了一下,我想没有 Vlisp 函数是不好搞的</P>
<P>我也是会一点点的 Vlisp 函数,下面的程序这个应该可以满足你的要求</P>
<P>请你测试!!有问题再说....</P>
<P>(defun c:test (/ tmp pt vn LineObj LeftPt)<BR>&nbsp; (vl-load-com)<BR>&nbsp; (setq *AcadDocument* (vla-get-ActiveDocument (vlax-Get-Acad-Object)))<BR>&nbsp; (if (ssget '((0 . "line,arc")))<BR>&nbsp;&nbsp;&nbsp; (progn<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq tmp (GetMinX))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq pt (cadr tmp)<BR>&nbsp;&nbsp;&nbsp;&nbsp; vn (car tmp)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq old_cmdecho&nbsp;(getvar "cmdecho")<BR>&nbsp;&nbsp;&nbsp;&nbsp; old_osmode&nbsp;(getvar "osmode")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setvar "cmdecho" 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setvar "osmode" 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command ".line" pt (polar pt (* pi 1.5) 1) "")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq LineObj (vlax-ename-&gt;vla-object (entlast)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq LeftPt (vlax-safearray-&gt;list (vlax-variant-value (vla-intersectwith LineObj vn acExtendBoth))))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (vla-erase LineObj)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq LeftPt (list (atof (rtos (car LeftPt) 2 4)) (atof (rtos (cadr LeftPt) 2 4)) 0))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (command "circle" leftpt 1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (princ (strcat "\n The LeftPt =" (rtos (car LeftPt) 2 4) " , " (rtos (cadr LeftPt) 2 4)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setvar "cmdecho" old_cmdecho)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setvar "osmode" old_osmode)<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp; )<BR>&nbsp; (prin1)<BR>)<BR>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<BR>(defun GetMinX (/ ss x1 y1 x y vn)<BR>&nbsp; (setq ss (vla-get-ActiveSelectionset *AcadDocument*))<BR>&nbsp; (vlax-for en ss<BR>&nbsp;&nbsp;&nbsp; (vla-GetBoundingBox en 'MinPt 'MaxPt)<BR>&nbsp;&nbsp;&nbsp; (setq x1 (car (vlax-safearray-&gt;list MinPt))<BR>&nbsp;&nbsp; y1 (cadr (vlax-safearray-&gt;list MinPt))<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; (if&nbsp;(null x)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq x&nbsp; x1<BR>&nbsp;&nbsp;&nbsp;&nbsp; y&nbsp; y1<BR>&nbsp;&nbsp;&nbsp;&nbsp; vn en<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn<BR>&nbsp;(setq y (min y y1))<BR>&nbsp;(if (&gt; x x1)<BR>&nbsp;&nbsp; (setq&nbsp;x&nbsp; x1<BR>&nbsp;&nbsp;vn en<BR>&nbsp;&nbsp; )<BR>&nbsp;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<BR>&nbsp;&nbsp;&nbsp; )<BR>&nbsp; )<BR>&nbsp; (vla-put-color vn acGreen)<BR>&nbsp; (list vn (list (+ x 0.00000001) y))<BR>)<BR></P>

zhh101 发表于 2005-9-18 14:32:00

本帖最后由 作者 于 2005-9-18 16:43:02 编辑 <br /><br /> <P>谢谢,加载后一却搞定,送你一朵鲜花</P>

HuaiYu 发表于 2005-9-18 17:13:00

<P>晕,搞得我又花了半天时间,怎么查都没查到问题。</P>
<P>不过总算搞定就好了!</P>
<P>希望你下次再发这种问题,好让我也提高提高一下了!</P>
页: [1] 2
查看完整版本: 判断图元选择集中的X坐标的最小值