找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3092|回复: 4

[分享]:整理了一些常用的函数,有一些用得比较频繁,陆续增加中

[复制链接]

已领礼包: 3个

财富等级: 恭喜发财

发表于 2006-4-22 20:07:20 | 显示全部楼层 |阅读模式

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

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

×
对一些函数进行了升级,再增加了几个函数



  1. ;;目录:


  2. ;;1
  3. ;;以字符串为分隔符把行文字读入表中
  4. ;;例:(read->biao "jksdi,kkik,oo" ",")
  5. ;;返回:("jksdi" "kkik" "oo")

  6. ;;2生成cad图元:TEXT\LINE\PLINE\CIRCLE

  7. ;;3
  8. ;;返回两曲线交点坐标

  9. ;;4
  10. ;;判断一点是否在一封闭区域内

  11. ;;5
  12. ;;表排序通用函数

  13. ;;6
  14. ;;取得实体外矩形框

  15. ;;7
  16. ;;取弧的  ( <起點> <中點> <終點>)

  17. ;;8
  18. ;;判断点在直线上的位置:上、左、右

  19. ;;9
  20. ;;由全路径返回盘符

  21. ;;10
  22. ;;由全路径返回扩展名

  23. ;;11
  24. ;;由全路径和文件名返回不带扩展名的文件名

  25. ;;12
  26. ;;由全路径及文件名返回局部的文件名

  27. ;;13
  28. ;;由全路径和文件名返回局部的路径

  29. ;;14
  30. ;;将一个字符串按BASE的做为基数的进制转换为十进制的整数值

  31. ;;15
  32. ;;将一个整数转换成一个按BASE基数指定的进制的字符串值

  33. ;;16
  34. ;;返回多义线顶点的坐标

  35. ;;17
  36. ;;判断多义线是顺时针还是逆时针

  37. ;;18
  38. ;;从点列表(point list)得到坐标范围(coordinate extents).

  39. ;;19
  40. ;;取得当前绘图区屏幕的左下角和右上角的坐标

  41. ;;20
  42. ;;表中指定位置插入新元素或删除指定位置元素

  43. ;;21
  44. ;;对表按指定索引重新排序




  45. ;;Visual LISP 扩展功能加载到 AutoLISP
  46. (vl-load-com)

  47. ;;1
  48. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  49. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  50. ;;By Longxin 明经通道 2006.03
  51. ;;以字符串为分隔符把行文字读入表中
  52. ;;例:(read->biao "jksdi,kkik,oo" ",")
  53. ;;返回:("jksdi" "kkik" "oo")
  54. (defun read->biao (str fgf / biao s1 i)
  55.   (setq biao nil)
  56.   (setq i (vl-string-search fgf str))
  57.   (while i
  58.     (setq s1 (substr str 1 i))
  59.     (setq str (substr str (+ 2 i)))
  60.     (setq biao (append biao (list s1)))
  61.     (setq i (vl-string-search fgf str))
  62.   )
  63.   (append biao (list str))
  64. )


  65. ;;2
  66. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  67. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  68. ;;By Longxin 明经通道 2006.04
  69. ;;;生成一个TEXT实体
  70. ;;例:(maketext 文字 三维点 字高 旋转角度 宽高比 倾斜 对齐样式 字型)
  71. ;;,对齐样式:0 : 中心,11:左上,12:左中,13:左下,21:中上,22:正中,23:中下,31:右上,32:右中 ,33:右下
  72. ;;旋转角度与倾斜:以(度)为单位
  73. (defun maketext        (text pt zg ang kgb qx dqys zx / p1 p2 y1 y2)
  74.   (setq        p2   (append '(10) pt)
  75.         p1   (append '(11) pt)
  76.         zg   (cons '40 zg)
  77.         text (cons '1 text)
  78.         qx   (cons '51 (* pi (/ qx 180.0)))
  79.         ang  (cons '50 (* pi (/ ang 180.0)))
  80.         kgb  (cons '41 kgb)
  81.   )
  82.   (if (not zx)
  83.     (setq zx "standard")
  84.   )
  85.   (setq zx (cons '7 zx))
  86.   
  87.   (cond        ((= dqys 0)
  88.          (setq y1 (cons 72 4)
  89.                y2 (cons 73 0)
  90.          )
  91.         )

  92.         ((= dqys 11)
  93.          (setq y1 (cons 72 0)
  94.                y2 (cons 73 3)
  95.          )
  96.         )
  97.         ((= dqys 12)
  98.          (setq y1 (cons 72 0)
  99.                y2 (cons 73 2)
  100.          )
  101.         )
  102.         ((= dqys 13)
  103.          (setq y1 (cons 72 0)
  104.                y2 (cons 73 1)
  105.          )
  106.         )
  107.         ((= dqys 21)
  108.          (setq y1 (cons 72 1)
  109.                y2 (cons 73 3)
  110.          )
  111.         )
  112.         ((= dqys 22)
  113.          (setq y1 (cons 72 1)
  114.                y2 (cons 73 2)
  115.          )
  116.         )
  117.         ((= dqys 23)
  118.          (setq y1 (cons 72 1)
  119.                y2 (cons 73 1)
  120.          )
  121.         )
  122.         ((= dqys 31)
  123.          (setq y1 (cons 72 2)
  124.                y2 (cons 73 3)
  125.          )
  126.         )
  127.         ((= dqys 32)
  128.          (setq y1 (cons 72 2)
  129.                y2 (cons 73 2)
  130.          )
  131.         )
  132.         ((= dqys 33)
  133.          (setq y1 (cons 72 2)
  134.                y2 (cons 73 1)
  135.          )
  136.         )
  137.   )

  138.   (entmake (list
  139.              '(0
  140.                .
  141.                "TEXT"
  142.               )
  143.              p2
  144.              text
  145.              zg
  146.              ang
  147.              kgb
  148.              qx
  149.              zx
  150.              '(71
  151.                .
  152.                0
  153.               )
  154.              y1
  155.              y2
  156.              p1
  157.            )
  158.   )
  159.   ;;(command "point" pt)
  160. )

  161. ;;生成一个LINE
  162. ;;参数:pt1:起点,pt2:终点,均为三维点,即(x y z)
  163. (DEFUN MAKELINE        (PT1 PT2 /)
  164.   (setq        pT1 (append '(10) pt1)
  165.         pT2 (append '(11) pt2)
  166.   )
  167.   (entmake (list
  168.              '(0
  169.                .
  170.                "LINE"
  171.               )
  172.              pT1
  173.              PT2
  174.            )
  175.   )
  176. )

  177. ;;生成一条pline
  178. ;;参数:
  179. ;;plist:坐标点表,如:((x1 y1 z1) (x2 y2 z2) (x2 y2 z2))或((x1 y1) (x2 y2) (x2 y2))
  180. ;;tudulist:各点之间的凸度表,与plist相对应,可为nil
  181. ;;bg:标高
  182. ;;clo:是否闭合,1:闭合,0:不闭合
  183. ;;(defun c:test ()
  184. ;;(setq        a '((102.946 68.6354 3) (112.102 97.4851 3) (125.484 59.4879 3) (103.651 52.4513 3))
  185. ;;        b '(-1.02092 -0.485629 0 -1.31201)
  186. ;;)
  187. ;;(makepline a b 211 1)
  188. ;;)

  189. (defun makepline (plist clo bg tudulist / dxf n i pt)
  190.   (setq        bg  (cons 38 bg)
  191.         i   0
  192.         n   (length plist)
  193.         dxf nil
  194.   )

  195.   (if (= clo 1)
  196.     (entmake (list '(0 . "POLYLINE") '(66 . 1) '(70 . 1) bg))
  197.     (entmake (list '(0 . "POLYLINE") '(66 . 1) bg))
  198.   )
  199.   (repeat n
  200.     (setq pt (nth i plist)
  201.           pt (list (nth 0 pt) (nth 1 pt))
  202.     )
  203.     (if        tudulist
  204.       (entmake (list (cons 0 "VERTEX")
  205.                      (cons 10 pt)
  206.                      (cons 42 (nth i tudulist))
  207.                )
  208.       )
  209.       (entmake (list (cons 0 "VERTEX")
  210.                      (cons 10 pt)
  211.                )
  212.       )
  213.     )
  214.     (setq i (1+ i))
  215.   )
  216.   (entmake '((0 . "SEQEND")))
  217.   (princ)
  218. )

  219. ;;生成一条circle
  220. ;;参数:pt:圆心(三维点即(x y z)),r:半径
  221. (DEFUN MAKEcircle (PT r /)
  222.   (setq        pT (append '(10) pt)
  223.         r  (cons 40 r)
  224.   )
  225.   (entmake (list
  226.              '(0
  227.                .
  228.                "circle"
  229.               )
  230.              pT
  231.              r
  232.            )
  233.   )
  234. )


  235. ;;3
  236. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  237. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  238. ;;By Mccad 明经通道
  239. ;;返回两曲线交点坐标
  240. ;;例:(GetInterPointlist objet1 objet2)
  241. ;;返回:((x1 y1 z1) (x2 y2 z2) (x3 y3 z3))
  242. (defun GetInterPointlist (ent_1           ent_2    /             ent1     ent2
  243.                           ax_ent_1 ax_ent_2 intpoints              i
  244.                           j           k            disp     int_list
  245.                          )
  246.                                         ;(setq ent1 (entsel "\n选择第一条曲线:"))
  247.                                         ;(setq ent2 (entsel "\n选择第二条曲线:"))
  248.                                         ;(setq ent_1 (car ent1)
  249.                                         ;ent_2 (car ent2)
  250.                                         ;)
  251.   (setq int_list nil)
  252.   (setq        ax_ent_1 (vlax-ename->vla-object ent_1)
  253.         ax_ent_2 (vlax-ename->vla-object ent_2)
  254.   )
  255.   (setq intpoints (vla-intersectwith ax_ent_1 ax_ent_2 acextendnone))
  256.   (setq intpoints (vlax-variant-value intpoints))
  257.   (if (> (vlax-safearray-get-u-bound intpoints 1) 0)
  258.     (progn
  259.       (setq i 0)
  260.       (setq j 0)
  261.       (setq disp "")
  262.       (repeat
  263.         (/ (+ 1
  264.               (- (vlax-safearray-get-u-bound intpoints 1)
  265.                  (vlax-safearray-get-l-bound intpoints 1)
  266.               )
  267.            )
  268.            3
  269.         )
  270.          (setq
  271.            disp        (list
  272.                   (vlax-safearray-get-element intpoints j)

  273.                   (vlax-safearray-get-element intpoints (+ 1 j))

  274.                   (vlax-safearray-get-element intpoints (+ 2 j))
  275.                 )
  276.          )
  277.          (setq i (+ 2 i)
  278.                j (+ 3 j)
  279.          )
  280.          (setq int_list (append int_list (list disp)))
  281.       )
  282.     )
  283.   )
  284.   (setq int_list int_list)
  285. )
  286. ;;注意 ,如果两条均为spline,则反回的交点数只有一半



  287. ;;4
  288. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  289. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  290. ;;By Xiao_longxin 明经通道
  291. ;;有一不规则多边形由点a1(x1,y1)、a2(x2,y2).....an(xn,yn)依次连接而成,如何求证点p(x,y)是在多边形内还是多边形外?
  292. ;;将直线PAi记作ki.将ki旋转到ki+1(令kn+1=k1)的角记为βi(规定逆时针为正,顺时针为负,如果βi大于180就变成βi-360)。
  293. ;;从直观上看有下面的结论
  294. ;;若P在形内,诸β的代数和为360度;
  295. ;;若P在形外,诸β的代数和为0。

  296. ;;pt_list 为((x y z) (x y z)......(x y z))即围成多边形的表
  297. ;;pt 为要判断的点
  298. ;;自相交多边形适用,不适用于曲线
  299. (defun inorout (pt_list pt / e1 pt n i j va va_count)
  300.   (setq        i         0
  301.         va_count 0
  302.         n         (length pt_list)
  303.         pt_list         (append pt_list (list (car pt_list)))
  304.   )
  305.   (repeat n
  306.     (setq va (-        (angle pt (nth i pt_list))
  307.                 (angle pt (nth (1+ i) pt_list))
  308.              )
  309.     )
  310.     (cond ((> va pi) (setq va (- va pi)))
  311.           ((< va (* -1 pi)) (setq va (+ va pi)))
  312.     )
  313.     (setq va_count (+ va_count va)
  314.           i           (1+ i)
  315.     )
  316.   )
  317.   (if (< (abs (- (abs va_count) pi)) 0.000001)
  318.     't
  319.     'nil
  320.   )
  321. )

  322. ;;另一种算法
  323. ;;By Longxin 明经通道 2006.04
  324. ;;;;;判断一点是否在一个封闭的区域内,支持曲线(pline拟合、spline、圆、椭圆)
  325. ;;算法:设曲线为逆时针
  326. ;;如果一点p在封闭曲线内,则过点p的曲线的法线与曲线交于p',可得法线方位角p-p'=ang1
  327. ;;求得p'点在曲线上的切线p'-p1,方位角为ang2
  328. ;;则法线与切线的方位角之差为:pi/2
  329. ;;依此方法,可求得在封闭曲线内的点
  330. ;;参数:ename,曲线图无名
  331. ;;      pt,三维点
  332. ;;返回:t---pt点在曲线内
  333. ;;      nil--pt点在曲线上或者外
  334. (defun inorout_s (ename pt / obj ptnear parm yspt1 yspt2 ang1 ang2)
  335.   ;;(command "point" pt)
  336.   (setq        obj    (vlax-ename->vla-object ename)
  337.         ptnear (vlax-curve-getClosestPointTo obj pt)
  338.                                         ;取得点到曲线的最近点
  339.   )
  340.   ;;(command "point" ptnear)
  341.   (setq        ang1  (angle ptnear pt)                ;最近点在曲线上的法线方位角
  342.         parm  (vlax-curve-getParamAtPoint obj ptnear)
  343.                                         ;最近点在曲线上的参数
  344.         yspt1 (vlax-curve-getFirstDeriv obj parm)
  345.                                         ;取得该点的第一衍生,即切线的衍生方向增量
  346.         yspt1 (list (+ (nth 0 ptnear) (nth 0 yspt1))
  347.                     (+ (nth 1 ptnear) (nth 1 yspt1))
  348.                     (nth 2 ptnear)
  349.               )
  350.         ang2  (angle ptnear yspt1)        ;最近点在曲线上的切线方位角
  351.         ang1  (- ang1 ang2)
  352.   )
  353.   (if (< ang1 0)
  354.     (setq ang1 (+ (* 2 pi) ang1))        ;使值恒为正
  355.   )
  356.   ;;(print ang1)
  357.   ;;(if (PlineCCW_obj ename)
  358.   ;;(print "\n逆")
  359.   ;;(print "\n顺")
  360.   ;;)
  361.   (if (PlineCCW_obj ename)                ;判断曲线的顺、逆
  362.     (if        (< ang1 pi)
  363.       t                                        ;如果曲线为逆时针,且法线与切线角度之差小于180度
  364.       nil                                ;如果曲线为逆时针,且法线与切线角度之差大于180度
  365.     )
  366.     (if        (< ang1 pi)
  367.       nil                                ;如果曲线不为逆时针,且法线与切线角度之差小于180度
  368.       t                                        ;如果曲线不为逆时针,且法线与切线角度之差大于180度
  369.     )
  370.   )
  371. )



  372. ;;5
  373. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  374. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  375. ;;By Longxin 明经通道 2005.06
  376. ;;表排序通用函数
  377. ;;例:(order_LIST TJ 表 条件)
  378. ;;返回:排序后的表

  379. ;;;主程序
  380. (defun order (coord_list tj / coord_ord        coord_I        i j k n        tj_ tj_c tj_1
  381.               tj_2)

  382.   (setq n (length coord_list))
  383.   (setq k (length tj))
  384.   (setq tj_ "(cond ((")

  385.   (setq tj_1 (nth 0 (nth 0 tj)))
  386.   (setq tj_2 tj_1)
  387.   (setq tj_1 (strcat tj_1 " p1"))
  388.   (setq tj_2 (strcat tj_2 " p2"))
  389.   (repeat (nth 1 (nth 0 tj))
  390.     (setq tj_1 (strcat tj_1 ")"))
  391.     (setq tj_2 (strcat tj_2 ")"))
  392.   )
  393.   (setq tj_ (strcat tj_ (nth 2 (nth 0 tj)) " " tj_1 tj_2 ") t) "))

  394.   (setq tj_c "((and ")
  395.   (setq i 1)
  396.   (repeat (- k 1)
  397.     (setq tj_c (strcat tj_c "(= " tj_1 " " tj_2 ")"))

  398.     (setq tj_1 (nth 0 (nth i tj)))
  399.     (setq tj_2 tj_1)
  400.     (setq tj_1 (strcat tj_1 " p1"))
  401.     (setq tj_2 (strcat tj_2 " p2"))
  402.     (repeat (nth 1 (nth i tj))
  403.       (setq tj_1 (strcat tj_1 ")"))
  404.       (setq tj_2 (strcat tj_2 ")"))
  405.     )

  406.     (setq tj_ (strcat tj_
  407.                       tj_c
  408.                       "("
  409.                       (nth 2 (nth i tj))
  410.                       " "
  411.                       tj_1
  412.                       tj_2
  413.                       ")) t) "
  414.               )
  415.     )

  416.     (setq i (1+ i))
  417.   )
  418.   (setq tj_ (strcat tj_ "(t nil))"))

  419.   (setq
  420.     coord_i
  421.      (vl-sort-i        coord_list
  422.                 (function (lambda (p1 p2)
  423.                             (eval (read tj_))
  424.                           )
  425.                 )

  426.      )
  427.   )

  428.   (setq j 0)
  429.   (repeat n
  430.     (setq
  431.       coord_ord        (append        coord_ord
  432.                         (list (nth (nth j coord_i) coord_list))
  433.                 )
  434.     )
  435.     (setq j (1+ j))
  436.   )
  437.   (setq coord_ord coord_ord)
  438. )
  439. ;;;;测试程序
  440. ;;(defun c:test (/ coord tt)
  441. ;;  (setq        coord
  442. ;;         '(
  443. ;;           (1 (1 . 2) 3 ("kkj" 4) (3 0))
  444. ;;           (1 (1 . 4) 1 ("skj" 45) (2 3))
  445. ;;           (1 (1 . 2) 3 ("Aej" 45) (7 1))
  446. ;;           (1 (2 . 3) 2 ("ser" 4) (9 2))
  447. ;;           (2 (6 . 2) 2 ("Serj" 9) (1 4))
  448. ;;           (3 (3 . 5) 1 ("kkjsd" 35) (7 6))
  449. ;;           (2 (4 . 7) 2 ("Akjdd" 3) (5 4))
  450. ;;           (3 (3 . 3) 3 ("sekj" 446) (3 4))
  451. ;;           (2 (2 . 2) 2 ("serj" 9) (1 4))
  452. ;;           (1 (8 . 2) 2 ("wggj" 46) (2 4))
  453. ;;           (1 (1 . 4) 1 ("kkj" 9) (4 4))
  454. ;;           (3 (3 . 3) 3 ("sekj" 446) (3 4))
  455. ;;           (1 (8 . 2) 2 ("wggj" 46) (2 4))
  456. ;;          )
  457. ;;  )

  458. ;;每个条件的第一项为要排序的依据,注意后面的括号没有,第二项即为后括号的个数,第三项为按升还是降排序
  459. ;;  (setq        tt '(
  460. ;;           ("(nth 0 (nth 3 " 2 ">")    ;;第一条件,依据数据("kkj" 4)中的'kkj'
  461. ;;             ("(nth 0" 1 "<")       ;;第二条件,依据数据'1'
  462. ;;             ("(car (nth 1 " 2 "<")    ;;第三条件,依据数据(1 . 4)中的 1
  463. ;;             ("(nth 1 (nth 4 " 2 ">")    ;;第四条件,依据数据(3 0)中的 0
  464. ;;             ("(nth 1 (nth 3" 2 ">")    ;;第五条件,依据数据("kkj" 4)中的 4
  465. ;;            )
  466. ;;  )
  467. ;;  (order coord tt)
  468. ;;)




  469. ;;6
  470. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  471. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  472. ;;By Longxin 明经通道 2005.06
  473. ;;取得实体外矩形框
  474. ;;例:(getbox 图元名)
  475. ;;返回:((x1 y1 z1)_min (x2 y2 z2)_max)
  476. (defun getbox (e1 / obj minpoint maxpoint)
  477.   (setq obj (vlax-ename->vla-object e1)) ;转换图元名
  478.   (vla-GetBoundingBox obj 'minpoint 'maxpoint)
  479.                                         ;取得包容图元的最大点和最小点
  480.   (setq minpoint (vlax-safearray->list minpoint)) ;把变体数据转化为表
  481.   (setq maxpoint (vlax-safearray->list maxpoint)) ;把变体数据转化为表
  482.   ;;(command "box" minpoint maxpoint 2)
  483.   (setq obj (list minpoint maxpoint))
  484. )



  485. ;;7
  486. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  487. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  488. ;;取弧的  ( <起點> <中點> <終點>)
  489. ;;Date 2004-05-13
  490. ;;make by BDYCAD
  491. ;;例:(arc_3point (CAR(ENTSEL)))
  492. ;;参数:图元名
  493. ;;返回值:( <起點> <中點> <終點>)  
  494. (defun arc_3point (a / cenp radius STP ENPmp arcmidpoint)
  495.   (setq cenp (cdr (assoc 10 (entget a))))
  496.   (setq radius (cdr (assoc 40 (entget a))))
  497.   (setq STP (vlax-curve-getPointAtParam A (vlax-curve-getstartparam A)))
  498.   (setq ENP (vlax-curve-getPointAtParam A (vlax-curve-getEndParam A)))
  499.   (setqarcmidpoint
  500.     (polar
  501.       (polar stp (angle stp enp) (/ (distance STP ENP) 2.0))
  502.       (angle cenp
  503.              (polar stp (angle stp enp) (/ (distance STP ENP) 2.0))
  504.       )
  505.       (- radius
  506.          (distance (polar stp (angle stp enp) (/ (distance STP ENP) 2.0))
  507.                    cenp
  508.          )
  509.       )
  510.     )
  511.   )
  512.   (list stp enp arcmidpoint)
  513. )


  514. ;;8
  515. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  516. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  517. ;;判断点在直线上的位置
  518. ;;语法:(pntonline p1 p2 p3 wc)  
  519. ;;参数  
  520. ;;p1,p2:直线上的两点,例如直线上的起点和端点,三维点
  521. ;;p3:所要判断的点  ,三维点
  522. ;;wc:阀值,即当三点的夹角小于WC值时认为P3点在线上,以秒为单位
  523. ;;返回值  :实数
  524. ;;等于0时点在线上,大于0时点在线的左侧,小于0时点在线的右侧  
  525. (defun pntonline (p1 p2 p3 wc / p c B C P z)
  526.   (setq p p3)

  527.   (setq        z (apply '+
  528.                  (mapcar '(lambda (b)
  529.                             (setq c (- (* (car p) (cadr b)) (* (cadr p) (car b)))
  530.                                   p b
  531.                             )
  532.                             c
  533.                           )
  534.                          (list p1 p2 p3)
  535.                  )
  536.           )
  537.   )
  538.   (if (< (abs z) (* wc 0.0614658))
  539.     (setq z 0)
  540.     (setq z z)
  541.   )
  542. )


  543. ;;9
  544. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  545. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  546. ;;由全路径返回盘符
  547. ;;语法  
  548. ;;(JustDrive cFileName)  
  549. ;;参数  
  550. ;;cFileName:str 要检查的文件完整路径  
  551. ;;返回值  
  552. ;;[STR]  
  553. ;;样例  
  554. ;;(setq a "C:\\MyFolder\\MyFile.txt")
  555. ;;; (JustDrive a) ; 返回 "C:"  
  556. (defun JustDrive (cFileName / return)
  557.   (if (> (strlen cFileName) 1)                ; 查看第二个字符是否为“:”
  558.     (progn
  559.       (setq return (substr cfileName 1 2))
  560.       (if (not (= ":" (substr return 2 1)))
  561.         (setq return "")
  562.       ) ;_ end of if
  563.     ) ;_ end of progn
  564.     (setq return "")
  565.   ) ;_ end of if
  566.   return
  567. ) ;_ end of defun  


  568. ;;10
  569. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  570. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  571. ;;由全路径返回扩展名
  572. ;;语法  
  573. ;;(JustExt cFileName)  
  574. ;;参数  
  575. ;;cFileName:str 要检查的全路径  
  576. ;;返回值  
  577. ;;[STR]  
  578. ;;样例  
  579. ;;(setq a "C:\\MyFolder\\MyFile.txt")
  580. ;;(JustExt a) ; 返回 "txt"
  581. (defun JustExt (cFileName / dotLoc)
  582.   (setq dotLoc (rat "." cfileName))
  583.   (if (> dotLoc 0)
  584.     (substr cFilename (1+ dotLoc))
  585.     ""
  586.   ) ;_ end of if
  587. ) ;_ end of defun  


  588. ;;11
  589. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  590. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  591. ;;由全路径和文件名返回不带扩展名的文件名
  592. ;;语法  
  593. ;;(JustStem cFileName)  
  594. ;;参数  
  595. ;;cFileName:str 要检查的完整路径  
  596. ;;返回值  
  597. ;;[STR]  
  598. ;;样例  
  599. ;;(setq a "C:\\MyFolder\\MyFile.txt")
  600. ;;(JustStem a) ; 返回 "MyFile"  
  601. (defun JustStem        (cFileName / fName DotLoc)
  602.   (setq fName (justFName cFileName))
  603.   (setq DotLoc (rat "." fName))
  604.   (if (> DotLoc 0)
  605.     (substr fName 1 (1- DotLoc))
  606.     fName
  607.   ) ;_ end of if
  608. ) ;_ end of defun  


  609. ;;12
  610. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  611. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  612. ;;由全路径及文件名返回局部的文件名
  613. ;;语法  
  614. ;;(JustFName cFileName)  
  615. ;;参数  
  616. ;;cFileName:str 要全的完整路径  
  617. ;;返回值  
  618. ;;[STR]  
  619. ;;样例  
  620. ;;(setq a "C:\\MyFolder\\MyFile.txt")
  621. ;;(JustStem a) ; 返回 "MyFile.txt"
  622. (defun JustFName (cFileName / bsLoc ColonLoc)
  623.   ;; Check for BackSlash
  624.   (setq bsLoc (rat "\" cfileName))
  625.   (if (> bsLoc 0)
  626.     (substr cFilename (1+ bsLoc))
  627.     (progn
  628.       ;; 检查盘号 ":"
  629.       (setq ColonLoc (rat ":" cfileName))
  630.       (if (> ColonLoc 0)
  631.         (substr cFilename (1+ ColonLoc))
  632.         cFileName
  633.       ) ;_ end of if
  634.     ) ;_ end of progn
  635.   ) ;_ end of if
  636. ) ;_ end of defun  


  637. ;;13
  638. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  639. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  640. ;;由全路径和文件名返回局部的路径
  641. ;;语法  
  642. ;;(JustPath cFileName)  
  643. ;;参数  
  644. ;;cFileName:检查的字符串  
  645. ;;返回值  
  646. ;;[STR]  
  647. ;;样例  
  648. ;;(setq a "C:\\MyFolder\\MyFile.txt")
  649. ;;(JustPath a) ; 返回 "C:\MyFolder"  
  650. (defun JustPath        (cFileName / bsLoc)
  651.   (setq bsLoc (rat "\" cfileName))
  652.   (if (> bsLoc 0)
  653.     (substr cFilename 1 (1- bsLoc))
  654.     ""
  655.   ) ;_ end of if
  656. ) ;_ end of defun  


  657. ;;14
  658. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  659. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  660. ;;将一个字符串按BASE的做为基数的进制转换为十进制的整数值
  661. ;;语法  
  662. ;;(baseToDecimal base val )  
  663. ;;参数  
  664. ;;base:一个代表所要转换的进制(BASE2、BASE8等)基数整数。
  665. ;;val:一个进行转换的字符串。  
  666. ;;返回值  
  667. ;;十进制的整数值  
  668. ;;样例  
  669. ;;(baseToDecimal 16 "FA")  
  670. (defun baseToDecimal (base val / pos power result tmp)
  671.   (setqpos (1+ (strlen val))
  672.            power
  673.            -1
  674.            result
  675.            0
  676.            val
  677.            (strcase val)
  678.   )
  679.   (while (> (setq pos (1- pos)) 0)
  680.     (setq result
  681.            (+
  682.              result
  683.              (*        (if (> (setq tmp (ascii (substr val pos 1))) 64)
  684.                   (- tmp 55)
  685.                   (- tmp 48)
  686.                 )
  687.                 (expt base (setq power (1+ power)))
  688.              )
  689.            )
  690.     )
  691.   )
  692.   result
  693. )


  694. ;;15
  695. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  696. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  697. ;;将一个整数转换成一个按BASE基数指定的进制的字符串值
  698. ;;语法  
  699. ;;(decimalToBase base val )  
  700. ;;参数  
  701. ;;base:一个代表所要转换的进制(BASE2、BASE8等)基数整数。
  702. ;;val:一个要转换的整数。
  703. ;;返回值  
  704. ;;字符串  
  705. ;;样例  
  706. ;;(decimalToBase 16 250)  
  707. (defun decimalToBase (base val / result tmp)
  708.   (setq result "")
  709.   (while (> val 0)
  710.     (setq result (strcat (if (> (setq tmp (rem val base)) 9)
  711.                            (chr (+ tmp 55))
  712.                            (itoa tmp)
  713.                          )
  714.                          result
  715.                  )
  716.           val         (fix (/ val base))
  717.     )
  718.   )
  719.   result
  720. )


  721. ;;16
  722. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  723. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  724. ;;By Longxin 明经通道 2001.08
  725. ;;返回多义线顶点的坐标
  726. ;;语法  
  727. ;;(coords ename )  
  728. ;;参数  
  729. ;;ename:图元名
  730. ;;返回值  
  731. ;;坐标列表  ,三维点
  732. (defun coords (ename / dxf type_line xy_count)
  733.   (setq        dxf          (entget ename)
  734.         TYPE_LINE (CDR (ASSOC 0 DXF))
  735.   )
  736.   (COND        ((= TYPE_LINE "POLYLINE")
  737.          (SETQ XY_COUNT (POL_coord eNAME))
  738.         )
  739.         ((= TYPE_LINE "LWPOLYLINE")
  740.          (SETQ XY_COUNT (LW_coord ename))
  741.         )
  742.         ((= TYPE_LINE "LINE")
  743.          (SETQ XY_COUNT (LINE_coord DXF))
  744.          )
  745.   )
  746. )
  747. ;;;;;;;
  748. (defun line_coord (dxf / pt1 pt2 count_xy)
  749.   (setq pt1 (cdr (assoc 10 dxf))
  750.         pt2 (cdr (assoc 11 dxf))
  751.         count_xy (list pt1 pt2)
  752.   )
  753.   )
  754. ;;;;;;;;;;;;;;;;;;;
  755. (defun POL_coord        (E1 / dxf XY E2 count_xy pd)
  756.   (setq        count_xy nil
  757.         dxf
  758.          (entget e1)
  759.         DXF
  760.          (MEMBER (ASSOC 330 DXF) DXF)
  761.         E2
  762.          (ENTNEXT E1)
  763.         DXF
  764.          (ENTGET E2)
  765.   )

  766.   (setq e1 (cdr (assoc 0 dxf)))
  767.   (while (= e1 "VERTEX")
  768.     (setq e1 (cdr (assoc 10 dxf)))
  769.     (setq pd (cdr (assoc 70 dxf)))
  770.     (if        (/= pd 16)
  771.       (setq count_xy (cons e1 count_xy))
  772.     )
  773.     (setq e1 e2)
  774.     (SETQ E2  (ENTNEXT E1)
  775.           DXF (ENTGET E2)
  776.           e1  (cdr (assoc 0 dxf))
  777.     )
  778.   )
  779.   (setq COUNT_XY (reverse count_xy))
  780. )
  781. ;;;;;;;;;;;;;;;;;;;;;;;
  782. (defun LW_coord (e1 / dxf XY COUNT_XY h)
  783.   (setq        dxf         (entget e1)
  784.         xy         (ASSOC 10 DXF)
  785.         h         (list (cdr (ASSOC 38 DXF)))
  786.         COUNT_XY nil
  787.   )
  788.   (WHILE XY
  789.     (SETQ DXF           (MEMBER XY DXF)
  790.           XY           (CDR (ASSOC 10 DXF))
  791.           DXF           (CDR DXF)
  792.           COUNT_XY (CONS (append XY h) COUNT_XY)
  793.           XY           (ASSOC 10 DXF)
  794.     )
  795.   )
  796.   (setq COUNT_XY (reverse COUNT_XY))
  797. )

  798. ;;17
  799. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  800. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  801. ;;判断多义线或者坐标例表是否逆时针
  802. ;;语法:(PlineCCW pline)
  803. ;;参数:
  804. ;;pline:多义线图元名 或者坐标例表如((x1 y1 z1) (x2 y2 z2))\((x1 y1) (x2 y2))
  805. ;;返回值:T OR nil
  806. ;;T:逆时针
  807. ;;NIL:顺时针

  808. (defun PlineCCW        (pline /)
  809.   (if (= (type pline) 'LIST)
  810.     (PlineCCW_list pline)                ;如果pline为坐标例表,则调用LIST处理函数
  811.     (PlineCCW_obj pline)                ;否则调用obj处理函数
  812.   )
  813. )

  814. ;;;;;
  815. (defun GEO_CCW (p0 p1 p2 p3 / ang1 ang2 ang3)
  816.   (setq ang1 (angle p0 p1))
  817.   (setq ang2 (angle p0 p2))
  818.   (setq ang1 (- ang2 ang1))
  819.   (if (> (abs ang1) pi)
  820.     (setq ang1 (+ (* -2 pi (/ ang1 (abs ang1))) ang1))
  821.   )
  822.   (setq ang3 (angle p0 p3))
  823.   (setq ang2 (- ang3 ang2))
  824.   (if (> (abs ang2) pi)
  825.     (setq ang2 (+ (* -2 pi (/ ang2 (abs ang2))) ang2))
  826.   )
  827.   (if (> (* ang1 ang2) 0)
  828.     (/ ang1 (abs ang1))
  829.     (cond
  830.       ((> (abs ang1) (abs ang2))
  831.        (if (= ang2 0)
  832.          0
  833.          (/ ang2 (abs ang2))
  834.        )
  835.       )
  836.       ((<= (abs ang1) (abs ang2))
  837.        (if (= ang1 0)
  838.          0
  839.          (/ ang1 (abs ang1))
  840.        )
  841.       )
  842.     )
  843.   )
  844. )
  845. ;;;;;图元名的处理函数
  846. (defun PlineCCW_obj
  847.                     (pline   /             pline   step    param   nParam
  848.                      pt             pt1     pt2     ptc     i             mp
  849.                      CCWLST  new_pline
  850.                     )

  851.   (setq step 100)
  852.   (setq        mp (vla-get-modelspace
  853.              (vla-get-activedocument (vlax-get-acad-object))
  854.            )
  855.   )

  856.   ;;求得PLINE外围矩形的中心坐标
  857.   (vla-getboundingbox
  858.     (vlax-ename->vla-object pline)
  859.     'pt1
  860.     'pt2
  861.   )
  862.   (setq        pt1 (vlax-safearray->list pt1)
  863.         pt2 (vlax-safearray->list pt2)
  864.         ptc (list (/ (+ (car pt1) (car pt2)) 2.0)
  865.                   (/ (+ (cadr pt1) (cadr pt2)) 2.0)
  866.             )
  867.   )
  868.   ;;end求得PLINE外围矩形的中心坐标
  869.   (setq        param (/ (vlax-curve-getDistAtParam
  870.                    pline
  871.                    (vlax-curve-getEndParam pline)
  872.                  )
  873.                  step
  874.               )
  875.   )
  876.   (setq i 0)
  877.   (repeat (1- step)
  878.     (setq nParam (* i param))
  879.     (setq pt (vlax-curve-getPointAtdist pline nParam))
  880.     (setq pt1 (vlax-curve-getPointAtdist
  881.                 pline
  882.                 (+ (* (/ 0.5 step) param) nParam)
  883.               )
  884.     )
  885.     (setq pt2 (vlax-curve-getPointAtdist
  886.                 pline
  887.                 (+ (* (/ 1.0 step) param) nParam)
  888.               )
  889.     )
  890.     (setq CCWLST (append CCWLST (list (GEO_CCW ptc pt pt1 pt2))))
  891.     (setq i (1+ i))
  892.   )

  893.   (if (> (length (vl-remove 1.0 CCWLST))
  894.          (length (vl-remove -1.0 CCWLST))
  895.       )
  896.     nil
  897.     t
  898.   )
  899. )                                        ;end defun PlineCCW_obj
  900. ;;;;;;坐标例表的处理函数
  901. (defun plineccw_list (plist / temp new)
  902.   (makepline plist 1 0 nil)
  903.   (setq        new  (entlast)
  904.         temp (PlineCCW_obj new)
  905.   )
  906.   (entdel new)
  907.   temp
  908. )
  909.                                         ;end defun PlineCCW_list

  910. ;;18
  911. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  912. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  913. ;;//王咣生
  914. ;;从点列表(point list)得到坐标范围(coordinate extents).
  915. ;;例如: (GetExtents '((1 0 0) (2 2 0) (1 2 0)))
  916. ;;;;返回:((x1 y1 z1)_min (x2 y2 z2)_max)
  917. (defun GetExtents (plist /)
  918.   (list
  919.     (apply 'mapcar (cons 'min plist))
  920.     (apply 'mapcar (cons 'max plist))
  921.   )
  922. )


  923. ;;19
  924. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  925. ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  926. ;;取得当前绘图区屏幕的左下角和右上角的坐标
  927. ;;返回:((x1 y1 z1)_min (x2 y2 z2)_max)
  928. (defun coord_screen (/ c03 c08 c04 c05 c07 c06 c09 c01 c02)
  929.   (setq        c03 (getvar "viewctr")
  930.         c03 (trans c03 1 2)
  931.         c08 (getvar "viewsize")
  932.         c04 (getvar "screensize")
  933.         c07 (car c04)
  934.         c06 (cadr c04)
  935.         c09 (/ (* c08 c07) c06)
  936.         c01 (list (- (car c03) (* 0.5 c09)) (- (cadr c03) (* 0.5 c08)))
  937.         c02 (list (+ (car c03) (* 0.5 c09)) (+ (cadr c03) (* 0.5 c08)))
  938.         c01 (trans c01 2 1)
  939.         c02 (trans c02 2 1)
  940.   )
  941.   (list c01 c02)
  942. )


  943. ;;20
  944. ;| (xl-subi lst ilst nlst)---------作  者: 狂刀 [[url]www.xdcad.net[/url]]
  945. 功  能   : 表中指定位置插入新元素或删除指定位置元素
  946. 参  数   : lst = 表 ;
  947.            ilst = 索引值或索引值表;
  948.            nlst = 插入的元素或对应索引值表数量的插入元素表,nil 时为删除;
  949. 返回值   : 成功返回新表,否则返回原表;
  950. 注  意   : 1 插入/删除位置为相对原表的位置,从 0 计数;
  951. 实 例  :
  952. (xl-subi '(1 2 3 4 5 6) '(1 4) '(0 0) ) ;;->(1 0 2 3 4 0 5 6)
  953. (xl-subi '(1 2 3 4 5 6) '(1 4) '(0 nil)) ;;->(1 0 2 3 4 6)
  954. (xl-subi '(1 2 3 4 5 6) '(1 4) '(0 )) ;;->(1 0 2 3 4 6)
  955. (xl-subi '(1 2 3 4 5 6) '(1 4) nil);;->(1 3 4 6)
  956. (xl-subi '(1 2 3 4 5 6)  2 0);;->(1 2 0 3 4 5 6)
  957. (xl-subi '(1 2 3 4 5 6) 2 nil);;->(1 2 4 5 6)
  958. |;
  959. (defun xl-subi (lst ilst nlst / i a) ;; by 狂刀.2005.8
  960. (if (/= 'LIST (type ilst))(setq ilst (list ilst)))
  961. (if (/= 'LIST (type nlst))(setq nlst (list nlst)))
  962. (apply 'append (mapcar '(lambda(x)
  963.                           (setq i (if i (1+ i) 0))
  964.                           (if (= (car ilst) i)
  965.                             (progn
  966.                               (setq ilst (cdr ilst)
  967.                                     a    (car nlst)
  968.                                     nlst (cdr nlst))
  969.                               (if a (list a x)nil)
  970.                              )
  971.                             (list x)
  972.                            )
  973.                           )
  974.                        lst)
  975. )
  976. )

  977. ;;21
  978. ;;对表按指定索引重新排序
  979. ;;如:(order-i '(1 3 6 2 3) 1)---->(3 6 2 3 1)

  980. (defun order-i (lst i / n j mi)
  981.   (setq n (length lst)
  982.         j i)
  983.   (repeat (- n i)
  984.    (setq mi (append mi (list (nth j lst)))
  985.          j (1+ j))
  986.   )
  987.   (setq j 0)
  988.   (repeat  i
  989.     (setq mi (append mi (list (nth j lst)))
  990.           j (1+ j))
  991.   )
  992.   mi
  993. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-5-2 22:46:23 | 显示全部楼层
希望能继续...
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2006-5-7 18:32:20 | 显示全部楼层
返回两曲线交点的函数为什么我这里用不了啊?
每次都反回nil
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-6-29 17:13:24 | 显示全部楼层
希望搂主继续贴常用的函数!顶了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-20 07:41 , Processed in 0.545798 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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