明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: lostbalance

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

    [复制链接]
发表于 2021-11-9 09:18 | 显示全部楼层
本帖最后由 fangmin723 于 2021-11-9 09:22 编辑

识别还不是很准确,基本上是可以用的

本帖子中包含更多资源

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

x
发表于 2021-12-7 14:55 | 显示全部楼层
写代码的时候,怎么预加载函数库啊
 楼主| 发表于 2021-12-20 16:35 | 显示全部楼层
fangmin723 发表于 2021-11-9 09:18
识别还不是很准确,基本上是可以用的

你说的不是很准确是指哪个?

你第一张截图里,所有黄箭头所指的都不对吗?粗看,除了最大的图框的斜线有问题,其他文字和图形的斜线看起来没什么问题啊。

图框这个,你是不是用块?块的基准点在图形外的话,容易出现这样的情况。
发表于 2021-12-23 10:21 | 显示全部楼层
感谢分享学习!!!!!
发表于 2022-12-9 15:52 | 显示全部楼层
优化内容:
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
发表于 2022-12-9 22:27 | 显示全部楼层
感谢大佬分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 11:03 , Processed in 0.265821 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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