试试看,以前在R14下试过没问题。
另,这段代码好像参考了陈老师书中的类似代码,特别说明一下。
- (defun c:patm (/ str_pat str_desc ss1 f_id index obj ent1 typ
- pt_start pt_end ang1 dis1 shift_x shift_y
- dis_space w1$ q0 lst_hatch np_x np_y
- x_wk y_wk grid_num)
- (setq grid_num 100)
- (setq str_pat "" str_desc "")
- (while (not (and (/= "" (setq str_pat (getstring "\nPattern name (file name): "))
- (< 9 (strlen str_pat))
- ))));while
- (while (= "" (setq str_desc (getstring "\nDescription: " t))))
- (princ "\nSelect unit pattern entities...")
- (while (not (setq ss1 (ssget))))
-
- (princ "\n PATMaker analysing entities....")
- (setq f_id (open (strcat str_pat ".pat") "w"))
- (princ (strcat "*" str_pat) f_id)
- (write-line (strcat "," str_desc) f_id)
- (setq index 0
- ss1_len (sslength ss1))
- (while (< index ss1_len)
- (setq obj (ssname ss1 index)
- ent1 (entget obj)
- typ (dxf 0 ent1)
- index (1+ index))
- (setq do_id 0)
- (cond
- ((= typ "POINT") (setq w1$ (strcat "0," (rtos (car (dxf 10 ent1)) 2 6) ","
- (rtos (cadr (dxf 10 ent1)) 2 6)
- ",0,1,0,-1"
- ))
- (prompt (strcat "\n" w1$))
- (write-line w1$ f_id)
- )
- ((= typ "LINE")
- (setq pt_start (dxf 10 ent1)
- pt_end (dxf 11 ent1)
- ang1 (angle pt_start pt_end)
- ang2 (angle pt_end pt_start)
- dis1 (distance pt_start pt_end)
- );setq
-
- ;----------------------------------
- (cond
- ( (or (QAEC_EQ (car pt_start)(car pt_end))
- (QAEC_EQ (cadr pt_start)(cadr pt_end)))
- (setq shift_x 0.0
- shift_y 1.0
- dis_space (- dis1 1))
- ); V line
- ( T
- (if (> (car pt_start)(car pt_end))
- (setq p_wk pt_end
- pt_end pt_start
- pt_start p_wk)
- );if
- (setq ang1 (angle pt_start pt_end)
- );setq
- ; ------------ find space -------------------
- (setq np_x (- (car pt_end)(car pt_start))
- np_y (- (cadr pt_end)(cadr pt_start)))
- (if (>= np_x 0)
- (setq np_x (fix (+ (* np_x grid_num) 0.5)))
- (setq np_x (fix (- (* np_x grid_num) 0.5)))
- );if
- (if (>= np_y 0)
- (setq np_y (fix (+ (* np_y grid_num) 0.5)))
- (setq np_y (fix (- (* np_y grid_num) 0.5)))
- );if
- (setq lst2 (get_simple np_x np_y))
-
- (setq np_x (car lst2) np_y (cadr lst2))
- (setq np_x (+ np_x (car pt_start))
- np_y (+ np_y (cadr pt_start)))
- (setq dis_w (distance pt_start (list np_x np_y)))
- (setq dis_space (- dis1 dis_w))
-
- ;---------------- Find shift distance -------------------
- ; when angle equal to 45 or 315
- (if (or (equal ang1 (* 0.25 pi) 0.01)
- (equal ang1 (* 1.75 pi) 0.01))
- (if (> (cadr pt_start)(cadr pt_end))
- (setq shift_x (cos (+ pi ang1))
- shift_y (sin (+ pi ang1)))
- (setq shift_x (cos (- pi ang1))
- shift_y (sin (- pi ang1)))
- );if
- (progn ; other angles
- (setq x (car lst2) y (cadr lst2) y1 (abs y) y_wk dis_w)
- (setq n 1 ptt_x (car pt_start) ptt_y (cadr pt_start))
- (repeat x
- (if (> y 0)
- (setq m 1)
- (setq m -1)
- );if
- (repeat y1
- (setq pt_wk (list (+ n ptt_x)(+ m ptt_y))
- ang3 (angle pt_start pt_wk)
- dis3 (distance pt_start pt_wk)
- y_wk1 (* dis3 (sin (- ang3 ang1)))
- );steq
- (if (< (abs y_wk1) (abs y_wk))
- (if (not (and (= n x)(= m y)))
- (setq y_wk y_wk1
- pt_keep pt_wk
- x_wk (* dis3 (cos (- ang3 ang1)))
- );setq
- );if
- );if
- (if (> y 0)
- (setq m (1+ m))
- (setq m (1- m))
- );if
- );repeat
- (setq n (1+ n))
- );repeat
- (setq shift_x x_wk shift_y y_wk)
- );progn - all other angles
- );if
- ); Other lines
- );cond
- ;-------------------------------------
- (setq w1$ (strcat (angtos ang1 0 3) ","
- (rtos (car pt_start) 2 6) ","
- (rtos (cadr pt_start) 2 6) ","
- (rtos shift_x 2 6) ","
- (rtos shift_y 2 6) ","
- (rtos dis1 2 6) ","
- (rtos dis_space 2 6)
- ))
- ;(princ (strcat "\n" w1$))
- (write-line w1$ f_id)
- ) ;type line end
- (T
- (princ (strcat typ " skipped,"))
- )
- )
- )
- (write-char 26 f_id)
- (close f_id)
-
- (princ " finished!")
- (alert (strcat "OK!\n\n File <" str_pat ".pat> created in current directory. "))
- (princ)
- )
- (princ)
- (defun dxf (num lst)
- (cdr (assoc num lst))
- )
- ; 求最简分数
- (defun get_simple (num1 num2 / py px n_w swich_id m out_lst)
- (setq px (abs num1) py (abs num2))
- (if (< py px)
- (setq n_w px px py py n_w swich_id T)
- (setq swich_id nil)
- );if
-
- (setq m 2)
- (while (<= m px)
- (if (and (eq (rem py m) 0)(eq (rem px m) 0))
- (progn
- (setq py (/ py m)
- px (/ px m)
- m 2)
- );progn
- (setq m (1+ m))
- );if
- );while
- (if swich_id
- (setq n_w px px py py n_w swich_id nil)
- );if
- (if (< num1 0)(setq px (- 0 px)))
- (if (< num2 0)(setq py (- 0 py)))
-
- (list px py)
- );end
- (princ "\n**PATMaker v1.0 loaded! Type 'PATM' to start.")
- (princ)
|