明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1188|回复: 2

[提问] 有请Gu_xl版主和各位高手进来看看

[复制链接]
发表于 2014-5-17 13:23 | 显示全部楼层 |阅读模式
本帖最后由 Jack_PC 于 2014-5-17 13:40 编辑

       今天在论坛看到Gu_xl版主写的"多选物体画框"的程序,由于LISP还不熟练,程序有些地方没有看懂,希望Gu_xl版主或能够看懂的各位高手在这里讲一讲这个程序实现的原理.

;;框选物体画框 By Gu_xl 明经通道 2014.05.12
(defun c:mBox (/ BOX INTERSECT RECTANG SS N L A L1 FLAG B C)
  (defun box (e / p1 p2 p3 p4 obj)
    (setq obj (vlax-ename->vla-object e))
    (vla-GetBoundingBox obj 'p1 'p3)
    (setq p1 (vlax-safearray->list p1)
    p3 (vlax-safearray->list p3)
    p2 (list (car p1) (cadr p3) (caddr p1))
    p4 (list (car p3) (cadr p1) (caddr p1))
    )
    (if  (= "SPLINE" (cdr (assoc 0 (entget e))))
      (progn
  (SETQ lst
         (mapcar '(lambda  (a b)
        (vlax-curve-getClosestPointToProjection e a b t)
      )
           (list p1 p2 p3 p4)
           '((1.0 0 0) (0 -1.0 0) (-1.0 0 0) (0 1.0 0))
         )
  )
  (list
    (apply 'mapcar (cons 'min lst))
    (apply 'mapcar (cons 'max lst))
  )
      )
      (list p1 p3)
    )
  )
  (defun intersect (a b)
    (if
      (or
  (and
    (<= (caar a) (caar b) (caadr a))
    (<= (cadar a) (cadar b) (cadadr a))
  )
  (and
    (<= (caar a) (caar b) (caadr a))
    (<= (cadar a) (cadadr b) (cadadr a))
  )
  (and
    (<= (caar a) (caadr b) (caadr a))
    (<= (cadar a) (cadadr b) (cadadr a))
  )
  (and
    (<= (caar a) (caadr b) (caadr a))
    (<= (cadar a) (cadar b) (cadadr a))
  )
      )
       (list
   (apply 'mapcar (cons 'min (append a b)))
   (apply 'mapcar (cons 'max (append a b)))
       )
    )
  )
  (defun rectang (a b)
    (entmake
      (list
  '(0 . "LWPOLYLINE")
  '(100 . "AcDbEntity")
  '(8 . "0")
  '(62 . 1)
  '(100 . "AcDbPolyline")
  '(90 . 4)
  '(70 . 1)
  (cons 10 a)
  (list 10 (car a) (cadr b))
  (cons 10 b)
  (list 10 (car b) (cadr a))
      )
    )
  )
  (if (setq ss (ssget))
    (progn
      (repeat (setq n (sslength ss))
  (setq l (cons (box (ssname ss (setq n (1- n)))) l))
      )
      (setq l
       (vl-sort
         l
         '(lambda  (a b)
      (if (equal (caar a) (caar b) 1e-3)
        (if  (equal (cadar a) (cadar b) 1e-3)
          (if (equal (caadr a) (caadr b) 1e-3)
      (< (cadadr a) (cadadr b))
      (< (caadr a) (caadr b))
          )
          (< (cadar a) (cadar b))
        )
        (< (caar a) (caar b))
      )
    )
       )
      )
      (setq a (car l)
      l (cdr l)
      )
      (while l
  (setq l1   nil
        flag nil
  )
  (while l
    (setq  b (car l)
    l (cdr l)
    )
    (if (setq c (intersect a b))
      (setq a c
      flag t
      )
      (setq l1 (cons b l1))
    )
  )
  (setq l (reverse l1))
  (if (not flag)
    (progn
      (rectang (car a) (cadr a))
      (setq a (car l)
      l (cdr l)
      )
    )
  )
  (if (not l)
    (rectang (car a) (cadr a))
  )
      )
    )
  )
  (princ)
)
 楼主| 发表于 2014-5-17 23:47 | 显示全部楼层
期待中...
发表于 2015-9-2 02:13 | 显示全部楼层
我也正在看这个源码,想要实现非极轴画框
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-5 13:31 , Processed in 0.386109 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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