明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: xyp1964

[讨论] 【e派】工具箱函数再揭秘及应用实例

    [复制链接]
发表于 2012-7-21 09:54 | 显示全部楼层
好代码,谢谢院长
发表于 2012-7-21 09:59 | 显示全部楼层
这个,必须好好学习~~
发表于 2012-7-21 10:07 | 显示全部楼层
院长真是大师风范啊!
 楼主| 发表于 2012-7-21 10:20 | 显示全部楼层
本帖最后由 xyp1964 于 2020-11-19 23:31 编辑

  1. ;; xyp-CheckPtn 点表集含fuzz的处理 (xyp-CheckPtn ptn fuzz mode) mode:>=<等
  2. ;; 删除重复点 (xyp-CheckPtn ptn fuzz >=)
  3. ;; 删除范围外点 (xyp-CheckPtn ptn fuzz <)
  4. (defun xyp-CheckPtn (ptn fuzz mode / lst p1 lst-t pt)
  5.   (setq lst '())
  6.   (while (>= (length ptn) 1)
  7.     (setq p1        (car ptn)
  8.           ptn (cdr ptn)
  9.           lst (cons p1 lst)
  10.           lst-t '()
  11.     )
  12.     (foreach pt ptn
  13.       (if (mode (distance p1 pt) fuzz)
  14.         (setq lst-t (cons pt lst-t))
  15.       )
  16.     )
  17.     (setq ptn (reverse lst-t))
  18.   )
  19.   lst
  20. )
发表于 2012-7-21 11:18 | 显示全部楼层
请问院长是哪个院的?
发表于 2012-7-21 11:24 | 显示全部楼层
见到院长放源码肯定得支持,用过院长几个函数,相当不错的!可是工具箱一直没用,CAD用的不是很多,为一两各功能,不习惯加载这么大一个工具箱!
发表于 2012-7-21 11:24 | 显示全部楼层
本帖最后由 x_s_s_1 于 2012-7-21 12:42 编辑

对于xyp-SubUpd 函数的测试,
(setq ss (ssget '((0 . "line"))))
(repeat (sslength SS) (setq i 0 lst (cons (ssname ss i)lst) i (1+ i)))
(mapcar '(lambda (x)(xyp-SubUpd x 62 1)) lst)
以上代码只可对第一个图元起作用,但是
(xyp-SubUpd ss 62 1)可对全部图元起作用,请院长讲解一下,谢谢
经查,我的那个repeat用错了,lst 值不对,函数没问题,不好意思

点评

(setq i 0)的位置严重错误  发表于 2012-7-21 12:43
[CODE] (setq ss (ssget '((0 . "line"))) i -1 ) (repeat (sslength SS) (setq lst (cons (ssname ss (setq i (1+ i))) lst)) ) (xyp-SubUpd lst 62 1)[/CODE]  发表于 2012-7-21 12:42
发表于 2012-7-21 11:45 | 显示全部楼层
希望有更多的源代码及使用图片。
发表于 2012-7-21 12:56 | 显示全部楼层
支持院长。
 楼主| 发表于 2012-7-21 13:25 | 显示全部楼层
本帖最后由 xyp1964 于 2020-11-19 23:32 编辑

  1. ;; xyp-get-Vertexs多义线顶点集
  2. ;; (setq ptn (xyp-get-Vertexs ename mode))
  3. ;; mode:
  4. ;; 0 T nil 所有顶点
  5. ;; 1不含重复顶点
  6. ;; 2不含直线段中间顶点
  7. ;; 3不含封闭直线段中间顶点
  8. (defun xyp-get-Vertexs (ename mode / ptn i pt0 j ac pte pts et pt10 pt1 pt2 pt3)
  9.   (cond ((xyp-etype ename "*polyline")
  10.   (setq ptn (xyp-get-Coordinates ename))
  11. )
  12. ((xyp-etype ename "line,arc")
  13.   (setq ptn (list (vlax-curve-getstartPoint ename)
  14.     (vlax-curve-getendPoint ename)
  15.      )
  16.   )
  17. )
  18. ((xyp-etype ename "spline")
  19.   (setq ptn '()
  20.         et  (entget ename)
  21.   )
  22.   (while (or (setq ac (assoc 11 et))
  23.       (setq ac (assoc 10 et))
  24.   )
  25.     ;;11 拟合点 10 控制点 均在 WCS 中
  26.     (setq et (member ac et)
  27.    pt10 (cdr (car et))
  28.    et   (cdr et)
  29.    ptn  (cons pt10 ptn)
  30.     )
  31.   )
  32.   (setq ptn (reverse ptn))
  33. )
  34.   )
  35.   (cond ((= mode 0) (princ))  ;所有点
  36. ((= mode 1)   ;取消0长线段的角点
  37.   (setq ptn (xyp-Ptlst-Test ptn))
  38. )
  39. ;;取消0长线段的角点,删除多段线中直线段上的多余节点
  40. ((= mode 2)
  41.   (setq ptn (xyp-Ptlst-Test ptn)
  42.         ptn (xyp-get-VertexsTrue ptn)
  43.   )
  44. )
  45. ;;取消0长线段的角点,删除多段线中直线段上的多余节点,如果原线闭合或首尾相连判断首尾部分是否直线
  46. ((= mode 3)
  47.   (setq ptn (xyp-Ptlst-Test ptn)
  48.         ptn (xyp-get-VertexsTrue ptn)
  49.         pt1 (nth 0 ptn)
  50.         pt2 (last ptn)
  51.         pt3 (nth (- (length ptn) 2) ptn)
  52.   )
  53.   (while (< (abs (- (angle pt1 pt2) (angle pt2 pt3))) 1e-4)
  54.     (setq ptn (vl-remove pt2 ptn)
  55.    pt1 (nth 0 ptn)
  56.    pt2 (last ptn)
  57.    pt3 (nth (- (length ptn) 2) ptn)
  58.     )
  59.   )
  60.   (setq pt2 (nth 0 ptn)
  61.         pt1 (nth 1 ptn)
  62.         pt3 (last ptn)
  63.   )
  64.   (while (< (abs (- (angle pt1 pt2) (angle pt2 pt3))) 1e-4)
  65.     (setq ptn (vl-remove pt2 ptn)
  66.    pt2 (nth 0 ptn)
  67.    pt1 (nth 1 ptn)
  68.    pt3 (last ptn)
  69.     )
  70.   )
  71. )
  72. ((or (= mode nil) T) (princ))
  73.   )
  74.   ptn
  75. )
  76. ;; xyp-E2O 将 AutoLISP 类型的对象名转换为 VLA 对象 ename为实体名称 = (car(entsel))
  77. (defun xyp-E2O (ename) (vlax-ename->vla-object ename))
  78. (defun xyp-O2E (oname) (vlax-vla-object->ename oname))
  79. ;; xyp-get-VertexsTrue 删除多段线中直线段上的多余节点
  80. (defun xyp-get-VertexsTrue (ptn / ptn1 p1 p2 p3)
  81.   (setq ptn1 '())
  82.   (while (>= (length ptn) 3)
  83.     (setq p1 (nth 0 ptn)
  84.    p2 (nth 1 ptn)
  85.    p3 (nth 2 ptn)
  86.     )
  87.     (if (< (abs (- (angle p1 p2) (angle p2 p3))) 1e-6)
  88.       (setq ptn (vl-remove p2 ptn))
  89.       (setq ptn1 (cons (car ptn) ptn1)
  90.      ptn  (cdr ptn)
  91.       )
  92.     )
  93.   )
  94.   (append (reverse ptn1) ptn)
  95. )
  96. ;; xyp-Ptlst-Test 取消0长线段的角点 (xyp-Ptlst-Test ptn)
  97. (defun xyp-Ptlst-Test (ptn / i p0 p1 tmp)
  98.   (setq i   0
  99. p0  (car ptn)
  100. tmp (list p0)
  101.   )
  102.   (while (setq p1 (nth (setq i (1+ i)) ptn))
  103.     (if (not (equal p1 p0 1e-5))
  104.       (setq tmp (cons p1 tmp)
  105.      p0 p1
  106.       )
  107.     )
  108.   )
  109.   (reverse tmp)
  110. )
  111. ;; xyp-List-Div 拆分表 (xyp-List-Div plist 子表数量)
  112. ;; (xyp-List-Div '(0 1 2 3 4 5 6 7 8 9) 3)→((0 1 2) (3 4 5) (6 7 8) (9))
  113. (defun xyp-List-Div (lst num / ptn1 ptn2)
  114.   (while (> (length lst) num)
  115.     (repeat num
  116.       (setq ptn1 (cons (car lst) ptn1)
  117.      lst  (cdr lst)
  118.       )
  119.     )
  120.     (setq ptn2 (cons (reverse ptn1) ptn2)
  121.    ptn1 '()
  122.     )
  123.   )
  124.   (if (>= (length lst) 1)
  125.     (setq ptn2 (cons lst ptn2))
  126.   )
  127.   (reverse ptn2)
  128. )
  129. ;; xyp-get-LispValue vl数据列表 (xyp-get-LispValue safearray)
  130. (defun xyp-get-LispValue (Value)
  131.   (vlax-safearray->list (vlax-variant-value Value))
  132. )
  133. ;; xyp-get-Coordinates mesh或pl实体顶点表 (xyp-get-Coordinates ename)
  134. (defun xyp-get-Coordinates (ename / ob ptn lst n)
  135.   (setq ob  (xyp-e2o ename)
  136. ptn (vla-get-Coordinates ob)
  137. lst '("AcDbPolygonMesh" "AcDbPolyFaceMesh" "AcDb3DPoly" "AcDbLeader" "AcDbPoint" "AcDbSolid" "AcDbTrace" "AcDb2dPolyline" "AcDb3dPolyline")
  138. n   (if (member (vla-get-objectname ob) lst)
  139.        3
  140.        2
  141.      )
  142.   )
  143.   (XYP-LIST-DIV (xyp-Get-LispValue ptn) n)
  144. )
  145. ;; xyp-Etype 检查实体类型 (xyp-Etype ename etype)
  146. (defun xyp-Etype (ename etype)
  147.   (wcmatch (xyp-get-dxf 0 ename) (strcase etype))
  148. )

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

本版积分规则

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

GMT+8, 2024-4-18 12:49 , Processed in 0.293060 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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