判断图元选择集中的X坐标的最小值
本帖最后由 作者 于 2005-9-19 13:27:55 编辑 <br /><br /> <P> 这是我编的LISP程序判断那个图元X坐标最小,先选择图元集(里面有直线和圆弧),再判断那个图元上的点在最左边,也就是X坐标最小,X坐标最小我已求出,但它的Y 坐标怎么求,请高人指点.谢谢!</P><P>(defun c:BDXZ (/ X1 X2 I X SST N SA EA)<BR> (setvar "cmdecho" 0)<BR> (setq sst (ssget))<BR> (setq n (sslength sst))<BR> (setq I 0)<BR> (setq X 10000)<BR> (setq X1 10001)<BR> (setq X2 10002)<BR> (while (< I n)<BR> (setq ety (entget (ssname sst I)))<BR> (setq name (cdr (assoc 0 ety)))<BR> (cond ((= name "LINE")<BR> (setq x1 (car (cdr (assoc 10 ety)))) <BR> (setq x2 (car (cdr (assoc 11 ety)))))<BR> ((= name "ARC")<BR> (setq Sa (cdr (assoc 50 ety)))<BR> (setq ea (cdr (assoc 51 ety)))<BR> (IF (OR (>= EA PI) (= SA PI))<BR> (setq X1 (- (car (cdr (assoc 10 ety))) (cdr (assoc 40 ety)))))(= X1 10000))<BR> (T (princ "\n 请重新选择")))<BR> (SETQ I (+ I 1))<BR> (setq X (MIN X X1 X2)))<BR> (PRINC "\n 坐标最小点 X=")<BR> (princ X)<BR> (PRIN1)<BR> )</P> 第一次运行只有 x1 或 x2 ,(min x1 x2) 错误<br> 2楼你说的话我不明白,你能否给我讲透彻一点, <P><STRONG>判断图元选择集中的X坐标的最小值</STRONG><BR>请大家批评指正:</P>
<P>(defun c:test (/ x x1 x2)<BR> (vl-load-com)<BR> (setq *AcadDocument* (vla-get-ActiveDocument (vlax-Get-Acad-Object)))<BR> (if (ssget '((0 . "line,arc")))<BR> (progn<BR> (setq x nil)<BR> (setq ss (vla-Get-ActiveSelectionset *AcadDocument*))<BR> (vlax-for en ss<BR> (setq x1 (car (vlax-safearray->list (vlax-variant-value (vla-get-startpoint en))))<BR> x2 (car (vlax-safearray->list (vlax-variant-value (vla-get-endpoint en))))<BR> )<BR> (if (null x)<BR> (setq x (min x1 x2))<BR> (setq x (min x1 x2 x))<BR> )<BR> )<BR> (princ (strcat "\n The left point_X= " (rtos x 2 4)))<BR> )<BR> )<BR> (prin1)<BR>)</P> 4楼的朋友我是初学LISP,对visual.lisp是一点也不懂,所以我希望谁能用LISP编写这个程序,不过我还是要谢谢你.另外我还有一个程序麻烦大家,就是求选择集中的两个端点坐标.不明白可看附件.谢谢!
(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)
)
<P> 六楼的朋友你是把它变成一条多段线 但还是没有求出来啊,你是不是要求再去选取它用Cdr函数来求的,我的意思是一次选取啊,其它的就要程序自己去算了</P>
<P> </P> <P>新下载了你的图文件,看了一下,我想没有 Vlisp 函数是不好搞的</P>
<P>我也是会一点点的 Vlisp 函数,下面的程序这个应该可以满足你的要求</P>
<P>请你测试!!有问题再说....</P>
<P>(defun c:test (/ tmp pt vn LineObj LeftPt)<BR> (vl-load-com)<BR> (setq *AcadDocument* (vla-get-ActiveDocument (vlax-Get-Acad-Object)))<BR> (if (ssget '((0 . "line,arc")))<BR> (progn<BR> (setq tmp (GetMinX))<BR> (setq pt (cadr tmp)<BR> vn (car tmp)<BR> )<BR> (setq old_cmdecho (getvar "cmdecho")<BR> old_osmode (getvar "osmode")<BR> )<BR> (setvar "cmdecho" 0)<BR> (setvar "osmode" 0)<BR> (command ".line" pt (polar pt (* pi 1.5) 1) "")<BR> (setq LineObj (vlax-ename->vla-object (entlast)))<BR> (setq LeftPt (vlax-safearray->list (vlax-variant-value (vla-intersectwith LineObj vn acExtendBoth))))<BR> (vla-erase LineObj)<BR> (setq LeftPt (list (atof (rtos (car LeftPt) 2 4)) (atof (rtos (cadr LeftPt) 2 4)) 0))<BR> (command "circle" leftpt 1)<BR> (princ (strcat "\n The LeftPt =" (rtos (car LeftPt) 2 4) " , " (rtos (cadr LeftPt) 2 4)))<BR> (setvar "cmdecho" old_cmdecho)<BR> (setvar "osmode" old_osmode)<BR> )<BR> )<BR> (prin1)<BR>)<BR>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<BR>(defun GetMinX (/ ss x1 y1 x y vn)<BR> (setq ss (vla-get-ActiveSelectionset *AcadDocument*))<BR> (vlax-for en ss<BR> (vla-GetBoundingBox en 'MinPt 'MaxPt)<BR> (setq x1 (car (vlax-safearray->list MinPt))<BR> y1 (cadr (vlax-safearray->list MinPt))<BR> )<BR> (if (null x)<BR> (setq x x1<BR> y y1<BR> vn en<BR> )<BR> (progn<BR> (setq y (min y y1))<BR> (if (> x x1)<BR> (setq x x1<BR> vn en<BR> )<BR> )<BR> )<BR> )<BR> )<BR> (vla-put-color vn acGreen)<BR> (list vn (list (+ x 0.00000001) y))<BR>)<BR></P> 本帖最后由 作者 于 2005-9-18 16:43:02 编辑 <br /><br /> <P>谢谢,加载后一却搞定,送你一朵鲜花</P> <P>晕,搞得我又花了半天时间,怎么查都没查到问题。</P>
<P>不过总算搞定就好了!</P>
<P>希望你下次再发这种问题,好让我也提高提高一下了!</P>
页:
[1]
2