;;;  ===============================================;;;   快速剖切线绘制2(带折点);;;   作者:langjs      命令:pq  日期:2014年7月14日;;;  ===============================================(defun c:pq (/ a an ans b bi bu code data dcl_re dclname dlg ent ent1 ent2 enttx enttx1 enttx2 filen gr h i loop lst n p1 p2 p3 pt               pt1 pt2 pt3 r r0 r1 r2 r3 r4 s ss tex w1 w2 w3 w4 x            )  (defun #err002 (s)    (setq loop nil)    (command ".UNDO" "E")    (command ".UNDO" "")    (setq *error* $orr)  )  (defun reent (ent lst / n x)               ; 按点表顺序更新多段线顶点,无须更换的顶点用nil代替。by:langjs    (mapcar      '(lambda (x)         (setq n (car lst))         (if (= (car x) 10)           (if (/= nil n t (setq lst (cdr lst)))             (cons 10 n)             x           )           x         )       )      ent    )  )  (defun emod (ent i n)    (subst      (cons i n)      (assoc i ent)      ent    )  )  (defun get3ptang (p1 p2 p3 / ans a b an)    (setq ans (list (angle p1 p2) (angle p3 p2))          a (apply              'min              ans            )          b (apply              'max              ans            )          an (- b a)    )    (if (= a (car ans))      an      (- (* 2 pi) an)    )  )  (defun mktext (pt tex h)    (regapp "POQIR")    (entmake (list '(0 . "TEXT") '(62 . 3) (cons 10 pt) (cons 40 h) (cons 1 tex) '(41 . 0.8) '(72 . 1) (cons 11 pt) '(73 . 2)                   (list -3 (list "POQIR" (cons 1000 tex)))             )    )    (entlast)  )  (defun mkpolyline2 (pt1 pt2 h)    (entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(62 . 4) '(100 . "AcDbPolyline") (cons 90 2) (cons 10 pt1)                   (cons 43 h) (cons 10 pt2) (cons 43 h)             )    )    (entlast)  )  (defun mkpolyline3 (pt1 w1 w2 pt2 w3 w4 pt3)    (entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(62 . 4) '(100 . "AcDbPolyline") '(90 . 3) (cons 10 pt1) (cons 40 w1)                   (cons 41 w2) (cons 10 pt2) (cons 40 w3) (cons 41 w4) (cons 10 pt3)             )    )    (entlast)  )  (setvar "cmdecho" 0)  (command ".UNDO" "BE")  (setq $orr *error*)  (setq *error* #err002)  (if (setq ss (ssget "X" (list '(0 . "TEXT") '(1 . "[A-Z]") '(-3 ("POQIR")))))    (progn      (setq lst '())      (repeat (setq i (sslength ss))        (setq lst (cons (cdr (assoc 1 (entget (ssname ss (setq i (1- i)))))) lst))      )      (setq tex (chr (1+ (ascii (car (vl-sort lst '>))))))    )    (setq tex "A")  )  (if (null bi)    (setq bi (getvar "DIMSCALE"))  )  (while (progn           (initget "S")           (if (= (setq s (getpoint (strcat "\n指定起点,或捕捉对齐点,或[设置(S)]: <符号: " tex " >")))                  "S"               )             (progn               (setq dclname (vl-filename-mktemp "re-dcl-tmp.dcl"))               (setq filen (open dclname "w"))               (write-line "RENAME:dialog {" filen)               (write-line "    label = \"设置\" ;" filen)               (write-line "        :edit_box {  label = \" 符号内容:\";    key = \"e05\" ;  }" filen)               (write-line "        :edit_box {  label = \" 文字高度:\";    key = \"e03\" ;  }" filen)               (write-line "        :edit_box {  label = \" 箭头大小:\";    key = \"e04\" ;  }" filen)               (write-line "    :row {" filen)               (write-line "        :button {is_default = true ; key = \"e02\" ; label = \"确认\" ; }" filen)               (write-line "        :button { is_cancel = true ; key = \"btn_cancle\" ; label = \"取消\" ; }" filen)               (write-line "         }}" filen)               (close filen)               (setq dcl_re (load_dialog dclname))               (new_dialog "RENAME" dcl_re)               (set_tile "e03" (rtos (* bi 4) 2 1))               (set_tile "e04" "同字高")               (set_tile "e05" tex)               (action_tile "e02" "(setq bi ( * 0.25 (atof (get_tile \"e03\"))))(done_dialog )")               (action_tile "e05" "(setq tex (get_tile \"e05\"))(done_dialog )")               (setq dlg (start_dialog))               (unload_dialog dcl_re)               (vl-file-delete dclname)             )             (setq pt s)           )           (= s "S")         )  )  (if (ssget "c" pt pt)    (setq pt (getpoint pt "\n指定起点,或<捕捉对齐点>:"))  )  (setq lst (list pt))  (princ "\n指定折点,或<结束选点>:")  (while (setq pt (getpoint pt))    (setq lst (cons pt lst))    (if (= (length lst) 2)      (mkpolyline2 (cadr lst) (polar (cadr lst) (angle (cadr lst) pt) (* bi 4)) (* bi 0.3))    )    (if (>= (length lst) 2)      (progn        (if ent          (progn            (entmod (reent ent (list (polar (cadr lst) (angle (cadr lst) pt) (* bi 2)))))            (setq r0 (get3ptang (caddr lst) (cadr lst) (car lst)))            (if (<= r0 pi)              (setq r0 (+ pi (* 0.5 r0) (angle (cadr lst) (caddr lst))))              (setq r0 (+ (* 0.5 r0) (angle (cadr lst) (caddr lst))))            )            (if (null enttx)              (setq enttx (entget (mktext (polar (cadr lst) r0 (* bi 4)) tex (* bi 4))))              (entmake (cdr (emod enttx 11 (polar (cadr lst) r0 (* bi 4)))))            )          )        )        (setq ent (entget (mkpolyline3 pt (* bi 0.3) (* bi 0.3) pt (* bi 0.3) (* bi 0.3) (polar pt (angle pt (cadr lst)) (* bi 2)))))      )    )  )  (entmod (reent ent (list nil nil (polar (car lst) (angle (car lst) (cadr lst)) (* bi 4)))))  (setq ent1 (entget (mkpolyline3 (car lst) 0.0 0.0 (car lst) (* bi 1.3) 0.0 (car lst))))  (setq ent2 (entget (mkpolyline3 (last lst) 0.0 0.0 (last lst) (* bi 1.3) 0.0 (last lst))))  (setq loop t        bu 1  )  (princ "\n移动鼠标,指定箭头方向:")  (while loop    (setq gr (grread t 15 0)          code (car gr)          data (cadr gr)    )    (cond      ((= code 3)        (if (= bu 1)          (progn            (entmake (list '(0 . "TEXT") '(62 . 3) (cons 10 data) (cons 40 (* bi 4)) (cons 1 (strcat tex "-" tex)) '(41 . 0.8)))            (setq enttx (entget (entlast)))            (setq ent1 (entget (mkpolyline2 data data (* bi 0.3))))            (setq ent2 (entget (mkpolyline2 data data 0.0)))            (setq bu 2)          )          (progn            (setq loop nil)            (command ".UNDO" "E")          )        )      )      ((= code 5)        (cond          ((= bu 1)            (setq r0 (get3ptang (cadr lst) (car lst) data))            (if (<= r0 pi)              (setq r (+ (angle (car lst) (cadr lst)) (setq r0 (* 0.5 pi)))                    r2 (+ (angle (car lst) (cadr lst)) (setq r3 (* 0.83 pi)))              )              (setq r (+ (angle (car lst) (cadr lst)) (setq r0 (* -0.5 pi)))                    r2 (+ (angle (car lst) (cadr lst)) (setq r3 (* -0.83 pi)))              )            )            (if (null enttx1)              (progn                (if (null enttx)                  (progn                    (setq enttx (entget (mktext (polar (car lst) r2 (* bi 4)) tex (* bi 4))))                    (setq enttx1 enttx)                  )                  (progn                    (entmake (cdr (emod enttx 11 (polar (car lst) r2 (* bi 4)))))                    (setq enttx1 (entget (entlast)))                  )                )              )              (entmod (emod enttx1 11 (polar (car lst) r2 (* bi 4))))            )            (entmod (reent ent1 (list nil (polar (car lst) r (* bi 4)) (polar (car lst) r (* bi 8)))))            (setq lst (reverse lst)                  r1 (angle (car lst) (cadr lst))                  r (+ r0 r1 pi)            )            (entmod (reent ent2 (list nil (polar (car lst) r (* bi 4)) (polar (car lst) r (* bi 8)))))            (setq r4 (- r1 r3))            (if enttx2              (progn                (entmod (emod enttx2 11 (polar (car lst) r4 (* bi 4))))              )              (progn                (entmake (cdr (emod enttx 11 (polar (car lst) r4 (* bi 4)))))                (setq enttx2 (entget (entlast)))              )            )            (setq lst (reverse lst))          )          ((= bu 2)            (entmod (emod enttx 10 data))            (setq p1 (car (textbox enttx)))            (setq p2 (cadr (textbox enttx)))            (entmod (reent ent1 (list (list (+ (car data) (car p1)) (- (cadr data) bi)) (list (+ (car data) (car p2)) (-                                                                                                                         (cadr data)                                                                                                                         bi                                                                                                                      )                                                                                        )                                )                    )            )            (entmod (reent ent2 (list (list (+ (car data) (car p1)) (- (cadr data) (* 1.7 bi))) (list (+ (car data) (car p2))                                                                                                      (- (cadr data) (* 1.7 bi))                                                                                                )                                )                    )            )          )        )      )      ((or         (= code 11)         (= code 25)       )        (setq loop nil)        (command ".UNDO" "E")      )    )  )  (setq *error* $orr)  (princ))
