明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: caoyin

【活动结束】LISP知识测试问卷--第三期[难度指数[★★★☆]

  [复制链接]
发表于 2011-12-30 16:34:48 | 显示全部楼层
打个酱油占个位,反正别人不知道,哈哈!
发表于 2011-12-31 16:30:36 | 显示全部楼层
  1. ;1.【选择集处理】8分
  2. ;  已知一个选择集,要求从选择集中筛选出符合下列描述的对象:
  3. ;  (1)圆环(由2个半圆组成的封闭多段线)、矩形(由多段线构成的封闭的直角平行四边形);
  4. ;  (2)忽略LWEIGHT命令概念的线宽,多段线线宽为0;
  5. ;  (3)起点、终点重合即可被认为封闭。
  6. (defun iscpl (ent / 42lst entlst entype obj ptlst pw x y)
  7.   (setq obj (gps->e2o ent) entlst (entget ent) entype (cdr(assoc 0 entlst)))
  8.   (if
  9.     (and
  10.       (= entype "LWPOLYLINE")
  11.       (VLAX-CURVE-ISCLOSED obj)
  12.       (not(vl-catch-all-error-p(setq pw(vl-catch-all-apply 'vla-get-ConstantWidth(list obj)))))
  13.       (zerop pw)
  14.     )
  15.     (progn
  16.       (setq 42lst (vl-remove-if-not '(lambda(x)(= 42(car x)))entlst))
  17.       (cond     
  18.         ((= 2 (length 42lst)) ;圆环
  19.           (not(apply 'or (mapcar '(lambda(y)(zerop(cdr y)))42lst)))               
  20.         )
  21.         ((or (= 4 (length 42lst)) (= 5 (length 42lst))) ;矩形
  22.          (setq ptlst (mapcar 'cdr (vl-remove-if-not '(lambda(x)(= 10(car x)))entlst)))
  23.          (and
  24.            (apply 'and (mapcar '(lambda(y)(zerop(cdr y)))42lst))
  25.            (=
  26.              (abs(- (angle(nth 1 ptlst)(nth 2 ptlst))(angle(nth 1 ptlst)(nth 0 ptlst))))
  27.              (abs(- (angle(nth 2 ptlst)(nth 3 ptlst))(angle(nth 2 ptlst)(nth 1 ptlst))))
  28.              (* 0.5 pi)
  29.            )
  30.          )
  31.         )
  32.         (T nil)
  33.       )
  34.     )
  35.   )
  36. )
  37. (defun test (ss / ent lst n)
  38.   (repeat (setq n (sslength ss))
  39.    (setq ent (ssname ss (setq n (1- n))))
  40.    (if (not(iscpl ent))(setq lst (cons ent lst)))
  41.   )
  42.   (foreach n lst(ssdel n ss))
  43.   (sssetfirst nil ss)
  44.   ss
  45. )
  46. ;|
  47. 2.【几何运算】9分
  48.   已知一条端点为A和B的直线,将该直线以A端点为基点旋转89度,再以B端点为基点
  49.   缩放3.5倍,用几何方法求出直线的2个新端点。禁用polar、command、vl-cmdf函数
  50. |;
  51. (defun test(a b / ang len x+ y+)
  52.   (setq len(distance a b)ang(+(angle a b)(*(/ 89 180.0)pi)))
  53.   (setq x+(* len(cos ang))y+(* len (sin ang)))
  54.   (list
  55.     (mapcar '+ a(list x+ y+ 0))
  56.     (mapcar '- a(list(* 2 x+)(* 2 y+)0))
  57.   )
  58. )
  59. ;3.【点集处理】15分
  60. ;   已知一个包含若干个三维点的表,若表中相邻两个点之间的距离大于100,则
  61. ;   在两点之间添加中点,直到表中相邻两个点之间距离小于或等于100。
  62. ;   限用递归法
  63. (defun newptlst(lst / mid pt1 pt2)
  64. (cond ((<(length lst)2)lst)
  65.        (T
  66.          (setq pt1 (car lst) pt2 (cadr lst))
  67.          (if (<= (distance pt1 pt2) 100)
  68.             (cons pt1 (newptlst (cdr lst)))
  69.             (progn
  70.               (setq mid(mapcar '(lambda(x y)(* 0.5(+ x y)))pt1 pt2))
  71.               (setq lst(append(list pt1 mid)(cdr lst)))
  72.               (newptlst lst)
  73.             )  
  74.          )      
  75.      )
  76. )
  77. )
  78. ;4.【图形对象操作】8分
  79. ;??已知一个云线(由REVCLOUD命令绘制的包含若干弧段的多段线),用VLISP方法
  80. ;??将云线翻转(即把弧段的凸度方向调整为反方向),禁用command、vl-cmdf函数
  81. (defun RevCloud (ent / newlst)         
  82.     (foreach n (entget ent)
  83.        (if (and(=(car n)42)(not(zerop(cdr n))))
  84.          (setq newlst (cons(cons 42(-(cdr n)))newlst))
  85.          (setq newlst (cons n newlst))
  86.        )
  87.      )
  88.    (entmod (reverse newlst))   
  89. )

  90. ;5.【非图形对象操作】20分
  91. ;? ?在禁用炸开命令的前提下,将将MLINE转换为LINE。

  92. ;;;多线样式
  93. (defun Kdub:Mlinestyle-Get (Name / mlsty-DICT MLSty)
  94.   (if (setq mlsty-DICT (dictsearch (Namedobjdict) "ACAD_MLINESTYLE"))
  95.     (while
  96.       (and mlsty-DICT
  97.         (not (setq MLSty (if (and (assoc 3 mlsty-DICT) (= (strcase (cdr (assoc 3 mlsty-DICT))) (strcase Name)))
  98.         (list (strcase Name) (cdr (cadr (member (assoc 3 mlsty-DICT) mlsty-DICT))))
  99.         )
  100.         )
  101.         )
  102.       )
  103.       (setq mlsty-DICT (cdr (member (assoc 3 mlsty-DICT) mlsty-DICT)))
  104.     )
  105.   )
  106.   MLSty
  107. )
  108. ;;  Expects pts to be a list of 2D or 3D points
  109.   (defun makePline (spc pts)
  110.     (if (= (length (car pts)) 2) ; 2d point list
  111.       (setq pts (apply 'append pts))
  112.       (setq
  113.         pts (apply 'append (mapcar '(lambda (x) (list (car x) (cadr x))) pts))
  114.       )
  115.     )
  116.     (setq
  117.       pts (vlax-make-variant
  118.             (vlax-safearray-fill
  119.               (vlax-make-safearray vlax-vbdouble (cons 0 (1- (length pts))))
  120.               pts
  121.             )
  122.           )
  123.     )
  124.     (vla-addlightweightpolyline spc pts)
  125.   )
  126. ;;;基本完成了,没有考虑图层,线型.
  127. (defun exmline (ent / dq entlst n obj plst spc)
  128.    (setq entlst (entget ent))  
  129.    (foreach n entlst
  130.      (if (member (car n) '(10 11))
  131.        (setq plst (cons (cdr n) plst))
  132.      )
  133.    )   
  134.   (setq  dq (cdr(assoc 70 entlst)) bl (cdr(assoc 40 entlst)))   
  135.   (setq  obj (makePline (vla-get-modelspace(vla-get-ActiveDocument(vlax-get-acad-object))) plst))   
  136.   (setq mstyle (Kdub:Mlinestyle-Get(vla-get-stylename (gps->e2o ent)) ))  
  137.   (setq mstylelst (entget (cadr mstyle)))   
  138.   (setq dis (apply '+ (mapcar '(lambda(x)(if(=(car x)49)(abs(cdr x))0))mstylelst)))
  139.   (cond
  140.     ((= dq 0)
  141.       (vla-Offset obj (* -1 dis bl))
  142.       )
  143.     ((= dq 1)   
  144.       (vla-Offset obj (* 0.5 dis bl))
  145.       (vla-Offset obj (* -0.5 dis bl))
  146.       (vla-delete obj)
  147.     )
  148.     ((= dq 2)
  149.       (vla-Offset obj (* dis bl))
  150.     )
  151.   )
  152.   (entdel ent)
  153.   (princ)
  154. )
  155.   
  156. ;6.【曲线计算】10分
  157. ;   已知共面且不相交的一直线和一圆弧,求两个对象之间的最小距离。

  158. (vlax-curve-getClosestPointTo obj pt)
  159. ;有空再写吧.


  160. ;7.【非图形对象操作】10分
  161. ;分解图元所在编组(GROUP),即清除编组定义。禁用command、vl-cmdf函数。
  162. ;炸开图中所有组  
  163. ;同一个物体可能在几个不同的组
  164. (defun explodeGroups(obj / e g lst vla-groups)
  165.   (setq vla-groups(vla-get-Groups(vla-get-activedocument(vlax-get-acad-object))))  
  166.   (vlax-for g vla-groups
  167.     (vlax-for e g
  168.      (if (equal(vla-get-ObjectID e)(vla-get-ObjectID Obj))
  169.       (setq lst (cons g lst))
  170.      )   
  171.     )  
  172.    )
  173.   (foreach g lst
  174.     (princ (strcat "\n 对象所在 "(vla-get-Name g)" 组被分解!"))
  175.     (vla-delete g)
  176.   )   
  177.   (vlax-release-object vla-groups)  
  178.   (princ)
  179. )
  180.    
  181. ;8.【实用技巧】20分
  182. ;   找出指定fas程序文件中的所有命令(C:开头的函数)。
  183. ;   提示:fas可能已加载。测试文件见附件test.fas。   
  184. (defun c:Compare( / #newatoms #oldatoms file n ret str x)
  185.   (vl-load-com)     
  186.   (defun atoms(str)
  187.     (vl-remove-if-not
  188.       (function(lambda(n)(wcmatch n str)))
  189.       (atoms-family 1)
  190.     )
  191.   )
  192.   (setq #oldatoms (mapcar '(lambda(x)(list x(eval(read x))))(atoms "C:*")))  
  193.   (if (setq file (getfiled "选择加载文件" "" "fas;lsp;vlx" 2  ))
  194.     (progn
  195.       (load file "")
  196.       (setq #newatoms(mapcar '(lambda(x)(list x(eval(read x))))(atoms "C:*")))  
  197.       (setq ret(vl-remove 'nil (mapcar '(lambda(x)(if(equal(assoc(car x)#oldatoms)x)nil (car x)))#newatoms)))   
  198.       (princ ret)
  199.     )
  200.   )
  201.   (princ)
  202. )  

评分

参与人数 1明经币 +3 收起 理由
caoyin + 3

查看全部评分

发表于 2012-1-1 00:57:40 | 显示全部楼层
怎么都占了沙发?
 楼主| 发表于 2012-1-1 05:01:08 | 显示全部楼层
本帖最后由 caoyin 于 2012-1-1 06:42 编辑

先做两题简单的
;;;第1题
  1. (defun TEST-1 (SS / IsCircle IsRectang I EN OBJ LST CW)
  2.   ;;判断对象是否构成是圆--凸度法
  3.   (defun IsCircle (PlObj / BLG LST)
  4.     (setq BLG -1)
  5.     (vl-catch-all-apply '(lambda ()
  6.       (while (setq LST (cons (vla-GetBulge PLOBJ (setq BLG (1+ BLG))) LST)))
  7.     ))
  8.     (and (= (length LST) 2) (apply '= LST) (zerop (apply '- LST)))
  9.   )
  10.   ;;判断对象是否是矩形--对角线法
  11.   (defun IsRectang (PLOBJ / N PP P LST)
  12.     (setq N (fix (vlax-curve-getEndParam PLOBJ)) PP N)
  13.     (while (and PP (setq P (vlax-curve-getPointAtParam PLOBJ PP)))
  14.       (if (or (= PP N) (zerop (vla-GetBulge PLOBJ PP)))
  15.         (setq LST (cons P LST) PP (1- PP))
  16.         (setq PP nil)
  17.       )
  18.     )
  19.     (and PP
  20.          (= (length LST) 5)
  21.          (equal (distance (car LST) (caddr LST))
  22.                 (distance (cadr LST) (cadddr LST))
  23.                 1E-6
  24.          )
  25.     )
  26.   )
  27.   (repeat (setq I (sslength SS))
  28.     (setq EN  (ssname SS (setq I (1- I)))
  29.           OBJ (vlax-ename->vla-object EN)
  30.     )
  31.     (if (and (= (vla-get-objectname OBJ) "AcDbPolyline")
  32.              (not (vl-catch-all-error-p
  33.              (vl-catch-all-apply
  34.                '(lambda () (setq CW (vla-get-ConstantWidth OBJ)))
  35.              )))
  36.              (zerop CW)
  37.              (equal (vlax-curve-getstartPoint OBJ)
  38.                     (vlax-curve-getendPoint OBJ)
  39.                     1E-6
  40.              )
  41.              (or (IsCircle OBJ) (IsRectang OBJ))
  42.         )
  43.       (setq LST (cons EN LST))
  44.     )
  45.   )
  46.   LST
  47. )
;;;第4题
;;;(test4 (vlax-ename->vla-object (car(entsel))))
  1. (defun TEST-4 (OBJ / N)
  2.   (repeat (setq N (fix (vlax-curve-getEndParam OBJ)))
  3.     (setq N (1- N))
  4.     (vla-setBulge OBJ N (- (vla-getBulge OBJ N)))
  5.   )
  6. )

发表于 2012-1-5 12:38:34 | 显示全部楼层
建议文字表述算法,具体代码可以多种实现
发表于 2012-1-5 13:08:46 | 显示全部楼层
第8题可以讨论下,我的代码如下:
  1. (defun getcommandname (file         /           acadapp   documents
  2.                        actdoc         mnlfile   tmpfile   tmpf
  3.                        value     str1
  4.                       )
  5.   (vl-load-com)
  6.   (setq        acadapp          (vlax-get-acad-object)
  7.         documents (vla-get-documents acadapp)
  8.         actdoc          (vla-get-activedocument acadapp)
  9.   )
  10.   (setq        mnlfile        (findfile "acad.mnl")
  11.         tmpfile        (strcat (vl-filename-directory mnlfile) "\\tmpfile.lsp")
  12.         tmpf        (open tmpfile "w")
  13.   )
  14.   (princ (vl-prin1-to-string
  15.            '(defun
  16.              findfunc
  17.              (file / abcdoc lst1 lst2 lst3)
  18.              (vl-load-com)
  19.              (setq
  20.               abcdoc
  21.               (vla-get-activedocument (vlax-get-acad-object))
  22.              )
  23.              (mapcar
  24.               '(lambda (x)
  25.                  (if (or (wcmatch x "C:*")
  26.                          (wcmatch x "c:*")
  27.                      )
  28.                    (setq lst1 (cons x lst1))
  29.                  )
  30.                )
  31.               (atoms-family 1)
  32.              )
  33.              (load file (princ))
  34.              (mapcar
  35.               '(lambda (x)
  36.                  (if (or (wcmatch x "C:*")
  37.                          (wcmatch x "c:*")
  38.                      )
  39.                    (setq lst2 (cons x lst2))
  40.                  )
  41.                )
  42.               (atoms-family 1)
  43.              )
  44.              (mapcar
  45.               '(lambda (x)
  46.                  (if (not (member x lst1))
  47.                    (setq lst3 (cons x lst3))
  48.                  )
  49.                )
  50.               lst2
  51.              )
  52.              (vl-bb-set 'a lst3)
  53.              (vla-close abcdoc)
  54.             )
  55.          )
  56.          tmpf
  57.   )
  58.   (princ (strcat "\n(findfunc " (vl-prin1-to-string file) " )")
  59.          tmpf
  60.   )
  61.   (close tmpf)
  62.   ;;;从头到尾依次读取指定文件的每一行,
  63.   ;;;如果文件存在指定的字符串,就返回这
  64.   ;;;条字符串,并停止搜索,否则返回nil。
  65.   (defun readeveryline (fd string / str)
  66.     (if        (setq str (read-line fd))
  67.       (if (/= string str)
  68.         (readeveryline fd string)
  69.         str
  70.       )
  71.     )
  72.   )
  73.   (setq tmpf (open mnlfile "r")
  74.         str1 (strcat "(load " (vl-prin1-to-string tmpfile) " (princ))")
  75.         )
  76.   (if (readeveryline tmpf str1)
  77.     (close tmpf)
  78.     (progn (close tmpf)
  79.            (setq tmpf (open mnlfile "a"))
  80.            (princ (strcat "\n" str1) tmpf)
  81.            (close tmpf)
  82.     )
  83.   )
  84.   (vla-add documents "")
  85.   (setq value (vl-bb-ref 'a))
  86.   (vl-bb-set 'a nil)
  87.   (vl-file-delete tmpfile)
  88.   value
  89. )
只不过有点问题,以前就没发上来
问题是没把新建的文档给关闭

评分

参与人数 1明经币 +1 收起 理由
caoyin + 1

查看全部评分

发表于 2012-1-5 13:56:41 | 显示全部楼层
本帖最后由 nzl1116 于 2012-1-6 09:39 编辑

自己能解决了,在第二文档里激活第一个文档,在第一个文档里再关闭第二个文档
思路:考虑到当前文档有可能已经加载test.fas,于是就新建一个文档,在新建的文档里获取test.fas文件的C:*命令名,然后通过黑板变量来传递返回值。
  1. ;;;8.【实用技巧】20分                                      
  2. ;;;   找出指定fas程序文件中的所有命令(C:开头的函数)。      
  3. ;;;   提示:fas可能已加载。测试文件见附件test.fas         
  4. ;;;-----------------------------------------------------;;;
  5. ;;;---------------- getcommandname file ----------------;;;
  6. ;;; (getcommandname file)                               ;;;
  7. ;;; 获取指定文件中定义的C:*命令名                       ;;;
  8. ;;;-----------------------------------------------------;;;
  9. (defun getcommandname (file   /     acadapp   documents
  10.                                          actdoc   mnlfile   tmpfile   tmpf
  11.                                         value     str1      abcDoc
  12.                                          )
  13.   (vl-load-com)
  14.   (setq  acadapp    (vlax-get-acad-object)
  15.            documents (vla-get-documents acadapp)
  16.               actdoc    (vla-get-activedocument acadapp)
  17.   )
  18.   ;;寻找自动加载的"acad.mnl"文件,并在同目录下创建"tmpfile.lsp"文件
  19.   (setq  mnlfile  (findfile "acad.mnl")
  20.            tmpfile  (strcat (vl-filename-directory mnlfile) "\\tmpfile.lsp")
  21.            tmpf  (open tmpfile "w")
  22.   )
  23.   ;;在tmpfile.lsp"文件里写入 findfunc 函数定义
  24.   (princ (vl-prin1-to-string
  25.               '(defun findfunc (file / lst1 lst2 lst3)
  26.               (mapcar
  27.                 '(lambda (x)
  28.                    (if (or (wcmatch x "C:*")
  29.                            (wcmatch x "c:*")
  30.                       )
  31.                    (setq lst1 (cons x lst1))
  32.                  )
  33.                )
  34.         (atoms-family 1)
  35.        )
  36.        (load file (princ))
  37.        (mapcar
  38.         '(lambda (x)
  39.      (if (or (wcmatch x "C:*")
  40.        (wcmatch x "c:*")
  41.          )
  42.        (setq lst2 (cons x lst2))
  43.      )
  44.          )
  45.         (atoms-family 1)
  46.        )
  47.        (mapcar
  48.         '(lambda (x)
  49.      (if (not (member x lst1))
  50.        (setq lst3 (cons x lst3))
  51.      )
  52.          )
  53.         lst2
  54.        )
  55.        (vl-bb-set 'a lst3)
  56.       ) ;_ 结束defun
  57.    ) ;_ 结束 vl-princ1-to-string
  58.    tmpf
  59.   ) ;_ 结束 princ
  60.   ;;在文件的后面添加两行代码
  61.   ;;(findfunc file) ;_ 执行自定义函数
  62.   ;;(vl-load-com) ;_ 在第二个文档的名称空间里加载ActiveX支持[?这一步不知道是否需要]
  63.   ;;(vla-Activate actDoc) ;_ 激活前一个文档,把控制权交还给它
  64.   (princ (strcat "\n(findfunc " (vl-prin1-to-string file) " )")
  65.    tmpf
  66.   )
  67.   (princ "\n(vl-load-com)" tmpf)
  68.   (princ "\n(vla-Activate actdoc)" tmpf)
  69.   ;;关闭"tmpfile.lsp"文件
  70.   (close tmpf)
  71.   ;;从头到尾依次读取指定文件的每一行,
  72.   ;;如果文件存在指定的字符串,就返回这
  73.   ;;条字符串,并停止搜索,否则返回nil。
  74.   (defun readeveryline (fd string / str)
  75.     (if  (setq str (read-line fd))
  76.       (if (/= string str)
  77.   (readeveryline fd string)
  78.   str
  79.       )
  80.     )
  81.   )
  82.   ;;打开"acad.mnl"文件,依次读取每一行
  83.   ;;寻找是不是存在(load tmpfile (princ))这一行代码
  84.   ;;若不存在,就在文件里添加
  85.   (setq  tmpf (open mnlfile "r")
  86.   str1 (strcat "(load " (vl-prin1-to-string tmpfile) " (princ))")
  87.   )
  88.   (if (readeveryline tmpf str1)
  89.     (close tmpf)
  90.     (progn (close tmpf)
  91.      (setq tmpf (open mnlfile "a"))
  92.      (princ (strcat "\n" str1) tmpf)
  93.      (close tmpf)
  94.     )
  95.   )
  96.   ;;新建一个文档,同时,把控制权交给它
  97.   (setq abcDoc (vla-add documents ""))
  98.   ;;第二个文档执行完所有的代码后,自动把控制权交还给第一个文档
  99.   ;;第一个文档得到控制权后,就关闭第二个文档
  100.   (vla-close abcDoc)
  101.   ;;从黑板读取变量值
  102.   (setq value (vl-bb-ref 'a))
  103.   ;;删除黑板的变量
  104.   (vl-bb-set 'a nil)
  105.   ;;删除文件
  106.   (vl-file-delete tmpfile)
  107.   value
  108. )

评分

参与人数 1明经币 +1 收起 理由
caoyin + 1

查看全部评分

发表于 2012-1-5 22:52:25 | 显示全部楼层
还是G版强悍啊,这么多源码,研究透了可不得了
发表于 2012-1-6 01:50:34 | 显示全部楼层
本帖最后由 highflybir 于 2012-1-6 02:23 编辑

只解答最后一道题目:

(defun c:test(/ FunLst name)
  (setq FunLst nil)
  (foreach name (ATOMS-FAMILY 1)
    (if (= "C:" (substr name 1 2))
      (setq funlst (cons (eval (read name)) funlst))
    )
  )
  ;;这时候再重新装载程序
  (load "d:\\tddownload\\test.fas") ;目录依据情况而定
  (princ "\ntest.fas含有C:开头函数是:")
  (foreach name (atoms-family 1)
    (if (= "C:" (substr name 1 2))
      (if (not (member (eval (read name)) funLst))
        (princ (strcat "\n函数名:" name))
      )
    )
  )
   
  (princ)
)

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
Gu_xl + 1 赞一个!直接比较函数,简洁多了!

查看全部评分

发表于 2012-1-6 02:24:43 | 显示全部楼层
本帖最后由 狂刀lxx 于 2012-1-6 11:54 编辑

看了gu_xl的第一题答案,觉得程序写的很长。提出另外一种思路,抛砖引玉。思路是用vlax-curve-getendparam 判断段数,用面积公式判断是否是圆或矩形。
  1. ;| by dreamskylxx-2012.1.6适用lwpolyline,polyline
  2. 适用外观闭合(不论最后一段是否是通过CL参数来进行闭合)
  3. 圆环适用于两端圆环不一定是半圆
  4. 排除多段线重合情况(如看似一个完整圆环,但是实际上有≥3段圆弧段组成)
  5. |;
  6. (defun tt1 (ss / AA C D1 D2 E I L1 L2 O PA SS1 SS2)
  7.   (setq i -1)
  8.   (while (setq e (ssname ss (setq i(1+ i))))
  9.     (setq o (vlax-ename->vla-object e))
  10.     (if(wcmatch (vla-get-objectname o) "*Polyline")
  11.       (setq pa(vlax-curve-getendparam o)))
  12.     (cond
  13.       ((= 2.0 pa)
  14.        (setq c(vla-get-length o)
  15.              aa(vlax-curve-getarea o))
  16.        (if (equal aa (/ (* c c)(* 4. PI)) 1e-6)
  17.          ;;(and (equal aa (/ (* c c)(* 4. PI)) 1e-6)  ;;如果一定要判断是完整的半圆组成
  18.          ;;     (equal c (* 2. (vlax-curve-getdistatparam O 1.)) 1e-6))
  19.          (setq ss1 (cons e ss1)))
  20.        )
  21.       ((= 4.0 pa)
  22.        (setq d1(vlax-curve-getdistatparam O 1.)
  23.              d2(vlax-curve-getdistatparam O 2.)
  24.              l1 d1
  25.              l2 (- d2 d1)
  26.              aa(vlax-curve-getarea o))
  27.        (if (equal aa (* l1 l2) 1e-6)
  28.          (setq ss2 (cons e ss2)))
  29.        )
  30.       (T nil)
  31.     )
  32.   )
  33.   (list ss1 ss2)
  34. )
  35. ;;;; 以下是测试程序.
  36. (defun c:ttt();;测试矩形多义线
  37.   (setq ss(ssget)
  38.         fss (tt1 ss))
  39.   (SETQ SSS(SSADD))
  40.   (MAPCAR '(LAMBDA(X)(SSADD X SSS))(caDr fss))
  41.   (sssetfirst NIL SSS)
  42.   )
  43. (defun c:ttt2();;测试圆环多义线
  44.   (setq ss(ssget)
  45.         fss (tt1 ss))
  46.   (SETQ SSS(SSADD))
  47.   (MAPCAR '(LAMBDA(X)(SSADD X SSS))(car fss))
  48.   (sssetfirst NIL SSS)
  49.   )



第2题,其实polar是很好用的,不能用这个函数,难道不能写一个替代函数么?呵呵
思路是不违反题目要求前提下,写一个替代polar功能的函数,从而使程序代码和结构简洁明了。
测试代码同 gu_lx中的c:tt2(gu_lx的我测试了一下,是不是忘了缩放比例了?)
  1. ;|2.【几何运算】9分  已知一条端点为A和B的直线,将该直线以A端点为基点旋转89度,再以B端点为基点
  2.   缩放3.5倍,用几何方法求出直线的2个新端点。禁用polar、command、vl-cmdf函数|;
  3. (defun tt2 (LINE ANG SCALE FLAG / ent pt1 pt2 len an pt2x pt1x) ;;by dreamskylxx-2012.1.6
  4.   (setq ent (entget LINE)
  5.         pt1 (cdr(assoc 10 ent))
  6.         pt2 (cdr(assoc 11 ent))
  7.         len (distance pt1 pt2))
  8.   (if (not flag)(setq pt pt1 pt1 pt2 pt2 pt));;对调
  9.   (setq an (angle pt1 pt2)                pt2x(polarx pt1 (+ ang an) len)
  10.         pt1x(polarx pt2x (angle pt2x pt1 ) (* len scale))
  11.         ent (SUBST (cons 10 pt1x)(assoc 10 ent)ent)
  12.         ent (SUBST (cons 11 pt2x)(assoc 11 ent)ent))
  13.   (entmod ent)
  14. )
  15. ;; 替代polar函数.
  16. (defun polarx (pt an di)
  17.   (setq x (* di (cos an))
  18.         y (* di (sin an)))
  19.   (mapcar '+ (list x y (nth 2 pt)) pt)
  20. )

第3题, 参照gu_xl的思路,用更紧凑和通俗的格式重写一次,比较纯粹。今晚太晚了,明天有空再玩玩
  1. ;;///////////第3题//////////////////////////////////////////;;
  2. ;|3.【点集处理】15分
  3.    已知一个包含若干个三维点的表,若表中相邻两个点之间的距离大于100,则
  4.    在两点之间添加中点,直到表中相邻两个点之间距离小于或等于100。
  5.    限用递归法。
  6. |;
  7. ;(TT3x (list '(0 0 0) '(200 0 0) '(250 0 0) '(450 0 0) '(600 0 0)))
  8. ;->((0 0 0) (100.0 0.0 0.0) (200 0 0) (250 0 0) (350.0 0.0 0.0) (450 0 0) (525.0 0.0 0.0) (600 0 0))
  9. (defun tt3x (pts / p1 p2)
  10.   (if (cdr pts)
  11.     (progn
  12.       (setq p1 (car pts)
  13.             p2 (cadr pts)
  14.       )
  15.       (if (<= (distance p1 p2) 100)
  16.         (cons p1 (tt3x (cdr pts)))
  17.         (tt3x (cons p1 (cons (mapcar '(lambda (a b) (* 0.5 (+ a b))) p1 p2) (cdr pts))))
  18.       )
  19.     )
  20.     (car pts)
  21.   )
  22. )








点评

第一题代码确实很长,我主要是考虑了园和矩形是由任意多顶点组成,不仅仅是两个点或四个点组成!我的第二题当选择直线末点时更新直线组码10和11有误!所以造成没有缩放,现以纠正!  发表于 2012-1-6 13:14

评分

参与人数 1明经币 +2 收起 理由
Gu_xl + 2 赞一个!我的第二题当选择直线末点时更新直线.

查看全部评分

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

本版积分规则

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

GMT+8, 2025-7-18 02:53 , Processed in 0.188744 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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