home *** CD-ROM | disk | FTP | other *** search
- (defun opmerr(s)
- (if (/= s "Function cancelled")
- (princ (strcat "\nError:" s))
- )
- (command "undo" "end")
- (command "layer" "s" "0" "")
- (setvar "cmdecho" 1)
- (setq *error* oer)
- (princ)
- )
-
- (defun c:opm(/ oer ss ssl sn en ename elay q10 q11 q12 q13 yx10 yx11 yx12 yx13 qz10 qz11 qz12 qz13 cnt n0
- pl03 pl12 ssa ssb p10 p11 p12 p13 xy10 xy11 xy12 xy13 z10 z11 z12 z13 sns minv maxv pl03s pl12s loop n1
- 03s n2 a2 b2 a1 b1 a0 ecol enl q70 f71 f72)
- (setvar "cmdecho" 0)
- (setq oer *error* *error* opmerr)
- (command "undo" "g")
- (setq ss (ssget))
- (if ss (progn
- (setq ssl (sslength ss) n 0 cnt 0)
- (princ "\nProcessing ......")
- (while (> ssl 0)
- (if (setq sn (ssname ss n)) (progn
- (setq en (entget sn) ename (cdr (assoc 0 en)) elay (cdr (assoc 8 en)))
- (cond ((and (= "TWALL" elay) (= "3DFACE" ename))
- (setq q10 (cdr (assoc 10 en)) q11 (cdr (assoc 11 en)))
- (setq q12 (cdr (assoc 12 en)) q13 (cdr (assoc 13 en)))
- (setq q70 (cdr (assoc 70 en)) ecol (cdr (assoc 62 en)))
- (setq yx10 (list (car q10) (cadr q10)) qz10 (caddr q10))
- (setq yx11 (list (car q11) (cadr q11)) qz11 (caddr q11))
- (setq yx12 (list (car q12) (cadr q12)) qz12 (caddr q12))
- (setq yx13 (list (car q13) (cadr q13)) qz13 (caddr q13))
- (setq cnt (1+ cnt))
- (if (and (equal yx10 yx13 1) (equal yx11 yx12 1)) (progn
- (setq n0 0 pl03 () pl12 () ssa nil ssa (ssadd) ssb nil ssb (ssadd))
- (setq pl03 (cons qz10 pl03) pl03 (cons qz13 pl03))
- (setq pl12 (cons qz11 pl12) pl12 (cons qz12 pl12))
- (while (< n0 ssl)
- (if (and (setq sns (ssname ss n0))(not (eq sns sn)))(progn
- (setq ens (entget sns) enames (cdr (assoc 0 ens)) elays (cdr (assoc 8 ens)))
- (if (and (= "TWALL" elays) (= "3DFACE" enames)) (progn
- (setq p10 (cdr (assoc 10 ens)) p11 (cdr (assoc 11 ens)))
- (setq p12 (cdr (assoc 12 ens)) p13 (cdr (assoc 13 ens)))
- (setq xy10 (list (car p10) (cadr p10)) z10 (caddr p10))
- (setq xy11 (list (car p11) (cadr p11)) z11 (caddr p11))
- (setq xy12 (list (car p12) (cadr p12)) z12 (caddr p12))
- (setq xy13 (list (car p13) (cadr p13)) z13 (caddr p13))
- (if (and (equal yx10 xy10 1) (equal yx10 xy13 1) (equal yx11 xy11 1) (equal yx11 xy12 1)) (progn
- (setq pl03 (cons z10 pl03) pl03 (cons z13 pl03))
- (setq pl12 (cons z11 pl12) pl12 (cons z12 pl12))
- (ssadd sns ssa)
- ))
- )(ssadd sns ssb))
- ))
- (setq n0 (1+ n0))
- ) ;end while
- ;(princ "\n$1")(princ pl03)
- ;(princ "\n$2")(princ pl12)
- (if (and (> (length pl03) 2) (not (= pl03 ()))) (progn
- (setq l (length pl03) minv -999999.0 pl03s () pl12s ())
- (repeat l
- (setq maxv (apply 'max pl03))
- (setq loop t n1 0)
- (while (and loop (< n1 l))
- (if (= maxv (nth n1 pl03)) (setq loop nil) (setq n1 (1+ n1)))
- )
- (setq 03s () n2 (1- n1))
- (while (>= n2 0) (setq 03s (cons (nth n2 pl03) 03s) n2 (1- n2)))
- (setq pl03 (append 03s (list minv) (cdr (member maxv pl03))))
- (setq pl03s (cons maxv pl03s) pl12s (cons (nth n1 pl12) pl12s))
- ) ;rep
- ;(princ "\n*1")(princ pl03s)
- ;(princ "\n*2")(princ pl12s)
- (setq l (length pl03s) n0 0 pl03 () pl12 () a0 nil)
- (setq a2 pl03s b2 pl12s)
- (while (< n0 l)
- (setq a1 (car a2) a2 (cdr a2))
- (setq b1 (car b2) b2 (cdr b2))
- (if (and (not (= a1 a0))(not (member a1 a2))) (setq pl03 (cons a1 pl03) pl12 (cons b1 pl12)))
- (setq a0 a1 n0 (1+ n0))
- )
- (setq pl03 (reverse pl03) pl12 (reverse pl12) l0 l l (length pl03))
- (if (and (< l l0) (= (* (/ l 2.0) 2) l)) (progn
- (entdel sn) (command "erase" ssa "")
- (if (not (= (getvar "clayer") elay)) (command "layer" "s" elay ""))
- (if (not (= ecol (getvar "cecolor"))) (if (not (= ecol nil)) (command "color" ecol) (command "color" "bylayer")))
- (setq n0 0)
- (repeat (/ l 2)
- (command "3dface" (append yx10 (list (nth n0 pl03))) (append yx11 (list (nth n0 pl12))) (append yx12 (list (nth (1+ n0) pl12))) (append yx13 (list (nth (1+ n0) pl03))) "")
- (setq enl (entget (entlast)))
- (setq q70 (logior (logand q70 10) 5))
- (if (= n0 0) (setq q70 (logior (logand q70 10) 4)))
- (if (= n0 (- l 2)) (setq q70 (logior (logand q70 10) 1)))
- (if (= l 2) (setq q70 (logand q70 10)))
- (setq enl (subst (cons 70 q70) (assoc 70 enl) enl))
- (entmod enl)
- (setq n0 (+ n0 2))
- )
- ))
- )) ;= pl03 nil
- )) ;endif vertical face
- ) ;cond1
- ((= ename "POLYLINE")
- (setq f71 (cdr (assoc 71 en)) f72 (cdr (assoc 72 en)))
- (if (and (> f71 0) (> f72 0)) (progn
- (command "explode" sn)
- )))
- ) ;end cond
- (ssdel sn ss)
- (setq n0 0)
- (if ssb
- (repeat (sslength ssb) (ssdel (ssname ssb n0) ss) (setq n0 (1+ n0))))
- (setq n0 0)
- (if ssa
- (repeat (sslength ssa) (ssdel (ssname ssa n0) ss) (setq n0 (1+ n0))))
- (setq ssl (sslength ss) n -1)
- )) ;endif sn
- (setq n (1+ n))
- ) ;end while
- )) ;endif ss
- (command "layer" "s" "0" "")
- (command "undo" "end")
- (setq *error* oer)
- (setvar "cmdecho" 1)
- (princ cnt) (princ " done.") (princ)
- )