明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 18398|回复: 36

[源码] [lostbalance]我的通用函数库wyb-函数

    [复制链接]
发表于 2018-9-2 10:41:59 | 显示全部楼层 |阅读模式
本帖最后由 lostbalance 于 2021-8-2 17:27 编辑

个人在用的函数库,部分自己编的,部分抄袭、借鉴明经或网上大神的。论坛中我发布的程序,需要的源码可以在这里找找。

(说明下,关于函数名wyb,仅是为了便于个人编程查找引用方便,在函数版次中注明了原作者,如有问题请联系我。)


首先是预定义的几个全局参数。
论坛的代码模块好像有点问题,显示不正常,我占个二楼放吧。

目录
  1. (wyb-get-box ename)//4.2. 取得图元外矩形框
  2. (wyb-get-mBox ss)//4.2.2 取得选择集内不重叠的外矩形框
  3. (wyb-sort-lst lst key fuzz func)//4.4. 列表排序基础函数(方向判断)
  4. (wyb-sort-ssPts sspts key fuzz)//4.4.1 图元排序
  5. (wyb-sort-pts pts dir xyz fuzz)//4.4.2 点列表排序
  6. (wyb-get-entDxf dxf ent)//4.11. 获取对象dxf码
  7. (wyb-lst-position a lst)//4.18. a在表lst中的位置 or nil
  8. (wyb-sublst lst start len)//4.21. 提取列表的一部分,类似substr(迭代法)
  9. (wyb-substNth new n lst)//4.22. 替换列表中指定位置的项
  10. (wyb-file-getFolder msg)//4.38. 获取文件夹
  11. (wyb-getDesktop)//4.48. 获取桌面desktop的路径
  12. (wyb-subst ent dxf new_item)//6.5 替换新旧列表后的列表
  13. (wyb-findSupportFolder folder)//9.24. 在支持目录中查找文件夹路径
  14. (wyb-get-lastEnt ent)//3.17. 获取ent之后的所有对象
  15. (wyb-substMod ent dxf new_item)//5.10.1 替换并更新新旧列表后的列表
  16. (wyb-subst ent dxf new_item)//5.10. 替换新旧列表后的列表
  17. (wyb-name obj)//9.6. 对象名称
  18. (wyb-listCollectionMemberNames collection)//9.11. 返回集合成员名称列表
  19. (wyb-listLayers)//9.13. 返回层集合成员名称列表
复制代码


20181214 补充wyb-if类的函数,见本贴13楼
20181217 增加wyb-findSupportFolder
                 PS,生命在于折腾,前阵子整理了一下函数库,重新分类梳理了编号,有极个别函数的名称也调整了下,有问题请留言
20190530 补充wyb-subst v1.0,wyb-substMod v1.0,wyb-get-lastEnt v1.0
20191216 补充wyb-name v1.0, wyb-listCollectionMemberNames v1.0, wyb-listLayers v1.020200916 补充wyb-lst-insertNth v1.0
20210802 补充wyb-sort-str v1.0


本帖子中包含更多资源

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

x

评分

参与人数 8明经币 +6 金钱 +12 收起 理由
tigcat + 1 很给力!
孤人旧梦 + 6 很给力!
水吉空 + 6 很给力!
Bao_lai + 1 赞一个!
xshrimp + 1 很给力!
BaoWSE + 1 赞一个!
pannelchen + 1 赞一个!
USER2128 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

 楼主| 发表于 2018-9-2 10:46:34 | 显示全部楼层
;|=====WYB函数库=====
--------------------------------------------------------------------------------
本函数库的源码,有部分源自明经论坛、晓东论坛等处
由于各种原因,导致部分源码的作者信息不完整或丢失,深感歉意
感谢自贡黄明儒、highflybir、llsheng-73、edata、不死猫等明经er和leemac等
--------------------------------------------------------------------------------
====================|;
(vl-load-com)
;===0. 常数
(setq ;;常用VLA对象、集合
    0.5pi   (* 0.5 pi)
    1.5pi   (* 1.5 pi)
    2pi     (+ pi pi)
    *ACAD*  (vlax-get-acad-object) ;;AutoCAD任务中的顶层 AutoCAD应用程序对象,即获取AutoCAD程序本身
    *DOC*   (vla-get-ActiveDocument *ACAD*) ;;是在autocad程序下面运行的当前文档对象
    *LOUT*  (vla-get-ActiveLayout *DOC*) ;;激活的布局
    *DOCS*  (vla-get-Documents *ACAD*)
    *MS*    (vla-get-modelSpace *DOC*)
    *PS*    (vla-get-paperSpace *DOC*)
    *BLKS*  (vla-get-Blocks *DOC*)
    *LAYS*  (vla-get-Layers *DOC*)
    *LTS*   (vla-get-Linetypes *DOC*)
    *TSS*   (vla-get-TextStyles *DOC*)
    *GRPS*  (vla-get-groups *DOC*)
    *DIMS*  (vla-get-DimStyles *DOC*)
    *LOUTS* (vla-get-Layouts *DOC*)
    *VPS*   (vla-get-Viewports *DOC*)
    *VS*    (vla-get-Views *DOC*)
    *DICS*  (vla-get-Dictionaries *DOC*)
    *PLTCS* (vla-get-PlotConfigurations *DOC*)
    *RAPPS* (vla-get-RegisteredApplications *DOC*)
    ;;常用的几个外部接口对象
    *FSO*   (vlax-get-or-create-object "Scripting.FileSystemObject")
    *WSH*   (vlax-get-or-create-object "wscript.shell")
    *SHELL* (vlax-get-or-create-object "Shell.Application")
    *SCR*   (vlax-get-or-create-object "ScriptControl")
    *WBEM*  (vlax-get-or-create-object "WbemScripting.SWbemLocator")
    *VBS*   (vlax-get-or-create-object "VBScript.regexp")
    *HTMLF* (vlax-get-or-create-object "htmlfile")
    ;;全局参数
    *wyb_ini* "WYB-Tools.ini"
)
回复 支持 2 反对 3

使用道具 举报

发表于 2018-9-4 19:41:13 | 显示全部楼层
如能合并就方便了
你真好
回复 支持 3 反对 1

使用道具 举报

 楼主| 发表于 2018-12-14 20:32:40 | 显示全部楼层
补充wyb-if类的函数。
都算是比较简单和通用的函数,就不挂附件了,直接贴出来。
  1. ;|= 3.5. 判断是否val对象
  2. @== (wyb-if-vlaObject obj)
  3. #== return: t / nil
  4. ====================|;
  5. (defun wyb-if-vlaObject (@obj)
  6.     (equal (type @obj) 'vla-object)
  7. )
  8. ;|= 3.6. 判断是否字符串
  9. @== (wyb-if-string x)
  10. #== return: t / nil
  11. ====================|;
  12. (defun wyb-if-string (@x)
  13.     (equal (type @x) 'str)
  14. )
  15. ;|= 3.7. 判断是否实数
  16. @== (wyb-if-real x)
  17. #== return: t / nil
  18. ====================|;
  19. (defun wyb-if-real (@x)
  20.     (equal (type @x) 'real)
  21. )
  22. ;|= 3.8. 判断是否ename对象
  23. @== (wyb-if-ename x)
  24. #== return: t / nil
  25. ====================|;
  26. (defun wyb-if-ename (@x)
  27.     (equal (type @x) 'ename)
  28. )
  29. ;|= 3.9. 判断是否变体
  30. @== (wyb-if-variant x)
  31. #== return: t / nil
  32. ====================|;
  33. (defun wyb-if-variant (@x)
  34.     (equal (type @x) 'variant)
  35. )
  36. ;|= 3.10. 判断是否是选择集且长度不为0
  37. @== (wyb-if-ssp ss)
  38. #== return: t / nil
  39. ====================|;
  40. (defun wyb-if-ssp (@ss)
  41.     (and (= (type @ss) 'PICKSET) (> (sslength @ss) 0))
  42. )
  43. ;|= 3.11. 判断是否为点对表
  44. @== (wyb-if-consp lst)
  45. #== return: t / nil
  46. ====================|;
  47. (defun wyb-if-consp (@lst)
  48.     (and (vl-consp @lst)(not (vl-list-length @lst)))
  49. )
  50. ;|= 3.12. 判断是否为整数
  51. @== (wyb-if-int x)
  52. #== return: t / nil
  53. ====================|;
  54. (defun wyb-if-int (@x)
  55.     (= (type @x) 'INT)
  56. )
  57. ;|= 3.13. 判断是否为整数或整实数
  58. @== (wyb-if-int2 x)
  59. #== return: t / nil
  60. ====================|;
  61. (defun wyb-if-int2 (@x)
  62.     (= (fix @x) @x)
  63. )
  64. ;|= 3.14. 判断字符串首字符是否中文字符
  65. @== (wyb-if-chiCh str)
  66. #== return: T / nil
  67. par:
  68. sample:
  69.     (wyb-if-chiCh "好")  ;;return: T
  70.     (wyb-if-chiCh "1")   ;;return: nil
  71. ver:
  72.     [1.0] by woyb 20170425
  73. ====================|;
  74. (defun wyb-if-chiCh (@str)
  75.     (> (ascii (substr @str 1 1)) 127)
  76. )



回复 支持 3 反对 0

使用道具 举报

发表于 2018-9-4 21:51:58 | 显示全部楼层
悟性不达标,先收藏之有时间再慢慢琢磨参悟!
回复 支持 3 反对 0

使用道具 举报

发表于 2018-9-4 17:07:57 | 显示全部楼层
dear sir

wow its amazing

thanks for sharing
回复 支持 2 反对 1

使用道具 举报

发表于 2018-9-4 11:51:56 | 显示全部楼层
如能合并就方便了
你真好
回复 支持 3 反对 0

使用道具 举报

发表于 2018-9-4 10:12:01 | 显示全部楼层
收藏以后学习用.
回复 支持 3 反对 0

使用道具 举报

发表于 2018-9-2 17:16:00 | 显示全部楼层
感谢分享学习!!!!!
回复 支持 2 反对 1

使用道具 举报

发表于 2022-12-9 15:52:56 | 显示全部楼层
优化内容:
1、单个图元无法创建包围框。
2、如果有多行文字时,多行文字外框超过文字内容时,无法准确识别(见截图代码下面的截图)。

优化后代码:
部分代码取自:KozMos AnnoQuarX Functions
  1. (defun c:mBox (/ A B BOX C ent FLAG INTERSECT L L1 N RECTANG SS)
  2.   (defun box (e / b enx h j l lst n o obj p1 p2 p3 p4 r w xylst)
  3.     (setq enx (entget e))
  4.     (if (or (= "MTEXT" (cdr (assoc 0 enx))) (= "TEXT" (cdr (assoc 0 enx))))
  5.       (progn
  6.         (setq  l
  7.           (cond
  8.             ((= "TEXT" (cdr (assoc 0 enx)))
  9.               (setq
  10.                 b (cdr (assoc 10 enx))
  11.                 r (cdr (assoc 50 enx))   
  12.                 l (textbox enx)      
  13.                 n (cdr (assoc 210 enx))   
  14.               )
  15.               (list
  16.                 (list (caar l) (cadar l))   
  17.                 (list (caadr l) (cadar l))
  18.                 (list (caadr l) (cadadr l))
  19.                 (list (caar l) (cadadr l))
  20.               )
  21.             )
  22.             ((= "MTEXT" (cdr (assoc 0 enx)))
  23.               (setq
  24.                 n (cdr (assoc 210 enx))
  25.                 b (trans (cdr (assoc 10 enx)) 0 n)
  26.                 r (angle '(0.0 0.0 0.0) (trans (cdr (assoc 11 enx)) 0 n))
  27.                 w (cdr (assoc 42 enx))
  28.                 h (cdr (assoc 43 enx))
  29.                 j (cdr (assoc 71 enx))
  30.                 o (list
  31.                     (cond
  32.                       ((member j '(2 5 8)) (/ w -2.0))
  33.                       ((member j '(3 6 9)) (- w))
  34.                       (0.0)
  35.                     )
  36.                     (cond
  37.                       ((member j '(1 2 3)) (- h))
  38.                       ((member j '(4 5 6)) (/ h -2.0))
  39.                       (0.0)
  40.                      
  41.                     )
  42.                   )
  43.               )
  44.               (list
  45.                 (list (car o) (cadr o))
  46.                 (list (+ (car o) w) (cadr o))
  47.                 (list (+ (car o) w) (+ (cadr o) h))
  48.                 (list (car o) (+ (cadr o) h))
  49.               )
  50.             )
  51.           )
  52.         )
  53.         (setq l
  54.           (
  55.             (lambda (m)
  56.               (mapcar
  57.                 '(lambda (p)
  58.                    (mapcar '+ (mapcar '(lambda (r) (apply '+ (mapcar '* r p))) m) b)
  59.                  )
  60.                 l
  61.               )
  62.             )
  63.             (list
  64.               (list (cos r) (sin (- r)) 0.0)
  65.               (list (sin r) (cos r) 0.0)
  66.               '(0.0 0.0 1.0)
  67.             )
  68.           )
  69.         )
  70.         (setq
  71.           xylst (apply 'mapcar (cons 'list (mapcar '(lambda (x) (trans x n 0)) l)))
  72.           p1 (list (apply 'min (car xylst)) (apply 'min (cadr xylst)))
  73.           p3 (list (apply 'max (car xylst)) (apply 'max (cadr xylst)))
  74.         )
  75.       )
  76.       (progn
  77.         (setq obj (vlax-ename->vla-object e))
  78.         (vla-GetBoundingBox obj 'p1 'p3)
  79.         (setq p1 (vlax-safearray->list p1)
  80.           p3 (vlax-safearray->list p3)
  81.           p2 (list (car p1) (cadr p3) (caddr p1))
  82.           p4 (list (car p3) (cadr p1) (caddr p1))
  83.         )
  84.         (if  (= "SPLINE" (cdr (assoc 0 enx)))
  85.           (progn
  86.             (setq lst
  87.               (mapcar '(lambda(a b)
  88.                          (vlax-curve-getClosestPointToProjection e a b t)
  89.                        )
  90.                 (list p1 p2 p3 p4)
  91.                 '((1.0 0 0) (0 -1.0 0) (-1.0 0 0) (0 1.0 0))
  92.               )
  93.             )
  94.             (setq
  95.               p1 (apply 'mapcar (cons 'min lst))
  96.               p3 (apply 'mapcar (cons 'max lst))
  97.             )
  98.           )
  99.         )
  100.       )
  101.     )
  102.     (list p1 p3)
  103.   )
  104.   (defun intersect (a b)
  105.     (if
  106.       (or
  107.         (and
  108.           (<= (caar a) (caar b) (caadr a))
  109.           (<= (cadar a) (cadar b) (cadadr a))
  110.         )
  111.         (and
  112.           (<= (caar a) (caar b) (caadr a))
  113.           (<= (cadar a) (cadadr b) (cadadr a))
  114.         )
  115.         (and
  116.           (<= (caar a) (caadr b) (caadr a))
  117.           (<= (cadar a) (cadadr b) (cadadr a))
  118.         )
  119.         (and
  120.           (<= (caar a) (caadr b) (caadr a))
  121.           (<= (cadar a) (cadar b) (cadadr a))
  122.         )
  123.       )
  124.       (list
  125.         (apply 'mapcar (cons 'min (append a b)))
  126.         (apply 'mapcar (cons 'max (append a b)))
  127.       )
  128.     )
  129.   )
  130.   (defun rectang (a b)
  131.     (if (not (tblsearch "LAYER" "批量打印层"))
  132.       (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") '(70 . 0) '(62 . 1) '(6 . "Continuous") (cons 2 "批量打印层")))
  133.     )
  134.     (entmake
  135.       (list
  136.         '(0 . "LWPOLYLINE")
  137.         '(100 . "AcDbEntity")
  138.         '(8 . "批量打印层")
  139.         '(62 . 1)
  140.         '(100 . "AcDbPolyline")
  141.         '(90 . 4)
  142.         '(70 . 1)
  143.         (cons 10 a)
  144.         (list 10 (car a) (cadr b))
  145.         (cons 10 b)
  146.         (list 10 (car b) (cadr a))
  147.       )
  148.     )
  149.   )
  150.   (if (setq ss (ssget))
  151.     (cond
  152.       ((> (sslength ss) 1)
  153.         (setq n -1)
  154.         (while (setq ent (ssname ss (setq n (1+ n))))
  155.           (setq l (cons (box ent) l))
  156.         )
  157.         (setq l
  158.           (vl-sort
  159.             l
  160.             '(lambda(a b)
  161.                (if (equal (caar a) (caar b) 1e-3)
  162.                  (if  (equal (cadar a) (cadar b) 1e-3)
  163.                    (if (equal (caadr a) (caadr b) 1e-3)
  164.                      (< (cadadr a) (cadadr b))
  165.                      (< (caadr a) (caadr b))
  166.                    )
  167.                    (< (cadar a) (cadar b))
  168.                  )
  169.                  (< (caar a) (caar b))
  170.                )
  171.              )
  172.           )
  173.         )
  174.         (setq a (car l) l (cdr l))
  175.         (while l
  176.           (setq l1 nil flag nil)
  177.           (while l
  178.             (setq  b (car l) l (cdr l))
  179.             (if (setq c (intersect a b))
  180.               (setq a c flag t)
  181.               (setq l1 (cons b l1))
  182.             )
  183.           )
  184.           (setq l (reverse l1))
  185.           (if (not flag)
  186.             (progn
  187.               (rectang (car a) (cadr a))
  188.               (setq a (car l)
  189.                 l (cdr l)
  190.               )
  191.             )
  192.           )
  193.           (if (not l) (rectang (car a) (cadr a)))
  194.         )
  195.       )
  196.       (T
  197.         (setq a (box (ssname ss 0)))
  198.         (rectang (car a) (cadr a))
  199.       )
  200.     )
  201.   )
  202.   (princ)
  203. )

本帖子中包含更多资源

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

x
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-19 06:40 , Processed in 0.177490 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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