明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1465|回复: 8

[LISP],各位高手请帮忙!

[复制链接]
发表于 2005-4-21 17:32 | 显示全部楼层 |阅读模式
各位高手:


你好!如何通过LISP获取一段线或圆弧的中间点?


有劳帮忙,多谢!
发表于 2005-4-21 17:47 | 显示全部楼层
这些基本的东西,论坛里都有,多搜索搜索
  1. ;;T. Tanzillo
  2. (defun xplist (KEY LST)
  3.    (mapcar 'cdr
  4.      (vl-remove-if-not
  5.          '(lambda (E) (eq (car E) KEY))
  6.          LST
  7.      )
  8.    )
  9. )
  10. (defun c:plpt (/ ent entlist ptList)
  11.    (vl-load-com)
  12.    (setq ent (car (entsel)))
  13.    (setq entlist (entget ent))
  14.    (while (assoc 10 entlist)
  15.        (setq ptList (append ptList (list (cdr (assoc 10 entlist)))))
  16.        (setq entlist (vl-remove (assoc 10 entlist) entlist))
  17.    )
  18.    ptList
  19. (mapcar '(lambda(e1 e2) (command "_.pline" e1 e2 "")) (reverse (cdr (reverse ptlist))) (cdr ptlist))
  20.    );将所选择的line或arc串成多义线(defun c:ddx (/ ssa ssa-ent ent-p i)
  21.    (command "undo" "be");设置返回起始点
  22.    (setq ssa (ssget))
  23.    (setq i 0)
  24.    (while (< i (sslength ssa))
  25.        (setq ssa-ent (ssname ssa i))
  26.        (setq ent-p (cdr(assoc 0 (entget ssa-ent))))
  27.        (if (not (null ent-p));判断原图元是否已串入多义线
  28.            (if (or (= ent-p "LWPOLYLINE") (= ent-p "POLYLINE"));判断原图元属性
  29.                  (command "pedit" ssa-ent   "j" ssa "" "")
  30.                  (command "pedit" ssa-ent   "y" "j" ssa "" "")
  31.        ))
  32.        (setq i (1+ i))
  33.    )
  34.    (command "undo" "e");设置返回终止点
  35.    (princ)
  36. )
  37. ;; By Richard L
  38. ;; Parker Hannifin Ltd (NZ).
  39. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 判断多义线是否3D多义线
  40. (defun is3dpline (ename)   
  41.    (setq obj (vlax-ename->vla-object ename))
  42.    (if (= (vla-get-objectname obj) "AcDb3dPolyline")
  43.        (setq 3d T)
  44.        (setq 3d nil)
  45.    )
  46.    3d
  47. )
  48. ;; 判断多义线是否闭合
  49. (defun isclosed (ename)                     
  50.    (setq obj (vlax-ename->vla-object ename))
  51.    (vla-get-closed obj)
  52. )
  53. ;; 判断多义线是PLINE还是SPLINE
  54. (defun plineorspline (ename)   
  55.    (setq obj (vlax-ename->vla-object ename))
  56.    (cond
  57.        ((or (= (vla-get-objectname obj) "AcDbPolyline")
  58.                  (= (vla-get-objectname obj) "AcDb3dPolyline"))
  59.            (setq pl T))
  60.        ((= (vla-get-objectname obj) "AcDbSpline")
  61.          (setq pl nil))
  62.        (T (alert "It is neither Polyline nor Spline! "))
  63.    )
  64.    pl
  65. )
  66. ;; 返回多义线的面积
  67. (defun getarea (ename)  
  68.    (setq obj (vlax-ename->vla-object ename))
  69.    (vla-get-area obj)
  70. );
  71. ; 返回多义线的各顶点
  72. (defun vertexs (ename / plist pp n)               
  73.    (setq obj (vlax-ename->vla-object ename))
  74.    (setq plist (vlax-safearray->list
  75.     (vlax-variant-value
  76.        (vla-get-coordinates obj))))
  77.    (setq n 0)
  78.    (repeat (/ (length plist) 2)
  79.        (setq pp (append pp (list (list (nth n plist)(nth (1+ n) plist)))))
  80.        (setq n (+ n 2))
  81.    )
  82.    pp
  83. )
  84. ;;判断多义线是否有圆弧(凸度/=0)的子段
  85. (defun checkarc (ename)      
  86.    (setq obj (vlax-ename->vla-object ename))
  87.    (setq plist (vlax-safearray->list
  88.     (vlax-variant-value
  89.        (vla-get-coordinates obj))))
  90.    (setq n 0 bu nil)
  91.    (repeat (/ (length plist) 2)
  92.        (if (/= (vla-getbulge obj n) 0)
  93.            (setq bu T)
  94.          )
  95.        (setq n (+ n 1))
  96.    )
  97.    bu
  98. )
  99. ;; 返回多义线子段的数量
  100. (defun numbersofseg (ename)   
  101.    (setq obj (vlax-ename->vla-object ename))
  102.    (setq plist (vlax-safearray->list
  103.     (vlax-variant-value
  104.        (vla-get-coordinates obj))))
  105.    (1- (/ (length plist) 2))
  106. )
  107. ;; 返回多义线第n点的坐标
  108. (defun coodsofnumpoint (ename n)
  109.    (setq obj (vlax-ename->vla-object ename))
  110.    (setq plist (vlax-safearray->list
  111.     (vlax-variant-value
  112.        (vla-get-coordinates obj))))
  113.    (list (nth (* n 2) plist)(nth (1+ (* n 2)) plist))
  114. )
  115. ;; 返回多义线第n子段的端点坐标
  116. (defun coodsofsegbynum (obj n)   
  117.    (vlax-safearray->list
  118.                            (vlax-variant-value
  119.                                (vla-get-coordinate obj 2)))
  120. )
  121. ;; 返回多义线所点击子段的端点坐标
  122. (defun coordsofsegbypick (ename p)   
  123.    (setq obj (vlax-ename->vla-object ename)
  124.                  pp (vlax-curve-getclosestpointto obj (trans p 1 0))
  125.                    n (fix (vlax-curve-getparamatpoint obj pp)))
  126.    (segcoord obj n)
  127. )
  128. ;;返回多义线第n个子段的长度
  129.   (defun lengthofsegbynum (ename n)   
  130.    (setq obj (vlax-ename->vla-object ename))
  131.    (- (vlax-curve-getdistatparam obj (1+ n))
  132.          (vlax-curve-getdistatparam obj n))
  133. );
  134. ;; 返回多义线所点击子段的长度
  135. (defun lengthofseg (ename p)   
  136.    (setq obj (vlax-ename->vla-object ename)
  137.                  pp (vlax-curve-getclosestpointto obj (trans p 1 0))
  138.                    n (fix (vlax-curve-getparamatpoint obj pp)))
  139.    (- (vlax-curve-getdistatparam obj (1+ n))
  140.          (vlax-curve-getdistatparam obj n))
  141. )
  142. ;;返回多义线第n个子段的宽度
  143.   (defun widthofsegbynum (ename n)   
  144.    (setq obj (vlax-ename->vla-object ename))
  145.    (vla-getwidth obj n 'ws 'wd)
  146.    (list ws wd)
  147. )
  148. ;; 返回多义线所点击子段的宽度
  149. (defun widthofsegbypick (ename p)   
  150.    (setq obj (vlax-ename->vla-object ename)
  151.                  pp (vlax-curve-getclosestpointto obj (trans p 1 0))
  152.                    n (fix (vlax-curve-getparamatpoint obj pp)))
  153.    (vlax-invoke-method obj 'getwidth n 'ws 'wd)
  154.    (list ws wd)
  155. );
  156. ;;COPY多义线所点击的子段
  157. (defun segmentcopy (ename p)   
  158.    (vl-cmdf "explode" ename "")
  159.    (vl-cmdf "copy" (ssget "c" (polar p (/ pi 4) 0.01)(polar p (* 1.25 pi) 0.01))
  160.                        "" p (getpoint "\nSecond point:") "")
  161.    (setq entl (entget (entlast)))
  162.    (vl-cmdf "undo" 2 "")
  163.    (entmake (cdr entl))
  164. )
  165. ;; OFFSET多义线所点击的子段
  166. (defun segmentoffset (ename p)      
  167.    (setq oo (getdist "\nValue of offset:"))
  168.    (vl-cmdf "explode" ename "")
  169.    (vl-cmdf "offset" oo p
  170.      ; (ssname (ssget "c" (polar p (/ pi 4) 0.01)(polar p (* 1.25 pi) 0.01)) 0)
  171.            (getpoint "\nInput offset point:") "")
  172.    (setq entl (entget (entlast)))
  173.    (vl-cmdf "undo" 2 "")
  174.    (entmake (cdr entl))
  175. )
  176. ;;修改多义线第n个子段的凸度
  177. (defun bulgebynum (ename n)   
  178.    (setq obj (vlax-ename->vla-object ename))
  179.    (setq   bu (getreal "\nNew Bugle Value: "))
  180.    (vla-setbulge obj n bu)
  181. )
  182. ;; 修改多义线所点击子段的凸度
  183. (defun bulgebypick (ename p)   
  184.    (setq obj (vlax-ename->vla-object ename)
  185.                  pp (vlax-curve-getclosestpointto obj (trans p 1 0))
  186.                    n (fix (vlax-curve-getparamatpoint obj pp)))
  187.    (setq   bu (getreal "\nNew Bugle Value: "))
  188.    (vla-setbulge obj n bu)
  189. )
  190. ;; 给多义线添加顶点
  191. (defun addvertex (ename p)                             
  192.    (setq obj (vlax-ename->vla-object ename)
  193.                  pp (vlax-curve-getclosestpointto obj (trans p 1 0))
  194.                    n (fix (vlax-curve-getparamatpoint obj pp))
  195.                  pn (getpoint "\nPick a Point: ")
  196.                  pn (list (car pn)(cadr pn))
  197.              newv (vlax-safearray-fill (vlax-make-safearray vlax-vbDouble '(0 . 1)) pn))
  198.    (vla-addvertex obj (1+ n) newv)
  199. )
 楼主| 发表于 2005-4-21 18:10 | 显示全部楼层
侠之大者:


多谢!有没更简单的?
发表于 2005-4-21 18:23 | 显示全部楼层
(defun c:test ()
(setq
splineobj (vlax-ename->vla-object (car (entsel "\n选择一物体:")))
)
(setq stparameter (vlax-curve-getStartParam splineObj))
(setq endparameter (vlax-curve-getEndParam splineObj))
(setq midpoint (vlax-curve-getPointAtParam
splineObj
(+ (/ (- endparameter stparameter) 2) stparameter)
)
)
(prompt "所选物体的中点坐标为: ")
(print midpoint)
(princ)
)
发表于 2005-4-22 08:29 | 显示全部楼层
建议楼主好好看看2楼的东西,虽然我没有看到楼主要的中点程序(是不是我没看清楚?),不过这些东西比较实用的好东西啊,,,对楼主的学习也是有很大的帮助的
发表于 2005-4-22 14:25 | 显示全部楼层
ljpnb发表于2005-4-21 18:23:00(defun c:test () (setq splineobj (vlax-ename->vla-object (car (entsel \"\n选择一物体:\"))) ) (setq stparameter (vlax-curve-getS...
改用距离会好一些,Param对某些线(ellipse弧)会不对

发表于 2005-4-24 10:07 | 显示全部楼层
厉害,有学到不少知识
发表于 2005-4-25 01:27 | 显示全部楼层
请各位大侠帮忙!小弟刚学CAD不久,想求同一图层内的N条直线,进行累加求和!但苦于不知如何实现!还请多帮忙!
发表于 2005-4-25 15:00 | 显示全部楼层
(defun c:test( / ss l i ssn ssd p1 p2 d1 dt)


                 (setq ss(ssget) l(sslength ss) i 0 dt 0.0)


                 (repeat l


                                                         (setq ssn(ssname ss i))


                                                 (setq ssd(entget ssn))


                                                         (if (= (cdr (assoc 0 ssd)) "LINE")


                                                                                         (progn


                                                                                                                         (setq p1(cdr (assoc 10 ssd)))


                                                                                                                         (setq p2(cdr (assoc 11 ssd)))


                                                                                                                         (setq d1(distance p1 p2))


                                                                                                                         (setq dt(+ dt d1))


                                                                                        )


                                                        )


                                         (setq i(1+ i))


         )


         (princ (strcat "Total lengthen:" (rtos dt 2 3)))


         (prin1)


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

本版积分规则

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

GMT+8, 2024-5-17 16:58 , Processed in 0.167539 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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