明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 16025|回复: 48

[源码] 块拉伸2.2.LSP增加个简单设置功能

    [复制链接]
发表于 2017-11-22 16:13:06 | 显示全部楼层 |阅读模式
;;; ==================================================================
;;; <块拉伸 V2.2>    扩展stretch拉伸命令,对含多个普通块选择集进行拉伸
;;;                  原理是打散块,拉伸后重新建块,2.2版增加个设置功能
;;; 作者:langjs      命令:kls                      日期:2017年11月9日
;;; ==================================================================
(defun c:kls (/ #errkls $orr $sz1 bb dcl_pt dcl_re dclname ent f i j kname lst name pt pt1 pt2 pt3 pt4 pt5 ss ss1 ss2 xun)
  (defun #errkls (s)
    (command ".UNDO" "E") (command ".UNDO" "") (setq *error* $orr)
  )
  (defun emkunameblk (ss pt / i name)  ; 生成无名块
    (entmake (list '(0 . "block") '(2 . "*U") '(70 . 1) (cons 10 pt)))
    (repeat (setq i (sslength ss)) (entmake (cdr (entget (ssname ss (setq i (1- i)))))))
    (setq name (entmake '((0 . "ENDBLK"))))
    (command "_.erase" ss "")
    (entmake (list '(0 . "INSERT") (cons 2 name) (cons 10 pt)))
    name)
  (setq $orr *error*  *error* #errkls )
  (setvar "cmdecho" 0)
  (command ".UNDO" "BE")
  (setq lst '()        ss2 (ssadd) xun t )
  (while xun
    (initget "S ")
    (if (= (setq pt1 (getpoint "\n窗交对象:指定角点 [设置(S)]:")) "S")
      (progn
        (setq dclname (vl-filename-mktemp "KLS.dcl")  f (open dclname "w"))
        (write-line "KLS:dialog {" f)
        (write-line " label = \"块拉伸 V2.2 \" ; " f)
        (write-line ":boxed_radio_column {  label = \"设置\";" f)
        (write-line ":radio_button {label = \"同名图块同步拉伸\";key =\"e01\"; mnemonic = \"1\"; } " f)
        (write-line ":radio_button {label = \"选定图块图元拉伸\";  key = \"e02\";   } }" f)
        (write-line " ok_cancel ; } " f)
        (close f)
        (setq dcl_re (load_dialog dclname))
        (new_dialog "KLS" dcl_re "" dcl_pt)
        (if $sz  (set_tile "e02" "1") (set_tile "e01" "1"))
        (action_tile "e01" "( setq  $sz1 nil ) ")
        (action_tile "e02" "( setq  $sz1 t )")
        (action_tile "accept" "(setq dcl_pt (done_dialog 2))")
        (action_tile "cancel" "(setq dcl_pt (done_dialog 3))")
        (setq bb (start_dialog))
        (unload_dialog dcl_re)
        (vl-file-delete dclname)
        (if (= bb 2) (setq $sz $sz1))
      )
      (setq xun nil)
    ))
  (if (not (atom pt1))
    (if (setq pt2 (getcorner pt1 "\n窗交对象:指定对角点:"))
      (if (setq ss (ssget "c" pt1 pt2))
        (progn
          (repeat (setq i (sslength ss))
            (setq name (ssname ss (setq i (1- i)))  ent (entget name))
            (if (and (= (cdr (assoc 0 ent)) "INSERT") (not (assoc 66 ent)))
              (progn
                (setq pt3 (cdr (assoc 10 ent)))
                (entmake (list '(0 . "POINT") (cons 10 pt3)))
                (ssadd (entlast) ss2)
                (command ".explode" name)
                (setq ss1 (ssget "p")  lst (cons (list pt3 (assoc 2 ent) ss1 (assoc 8 ent)) lst))
                (repeat (setq j (sslength ss1)) (redraw (ssname ss1 (setq j (1- j))) 3))
              )
              (redraw name 3)
            ))
          (sssetfirst nil ss2)
          (while (not (setq pt4 (getpoint "\n指定基点:"))))
          (command "erase" ss2 "")
          (princ "\n指定第二个点,或相对基点位移:")
          (command "_.stretch" "c" pt1 pt2 "" pt4 pause)
          (setq pt5 (getvar "lastpoint"))
          (if (/= (distance pt4 pt5) 0.0)
            (repeat (setq i (length lst))
              (setq name (nth (setq i (1- i)) lst ) pt3 (car name) kname (cdadr name))
              (if (and
                    (<= (* (- (car pt3) (car pt1)) (- (car pt3) (car pt2))) 0)
                    (<= (* (- (cadr pt3) (cadr pt1)) (- (cadr pt3) (cadr pt2))) 0))
                (setq pt3 (polar pt3 (angle pt4 pt5) (distance pt4 pt5))))
              (if (or  $sz  (wcmatch kname "\*U*"))
                (setq kname (emkunameblk (caddr name) pt3))
                (command "block" kname "y" pt3 (caddr name) ""))
              (entmake (list '(0 . "INSERT") (cons 2 kname) (cons 10 pt3) (cadddr name))))
            (#errkls)
          )))))
  (command ".UNDO" "E")
  (setq *error* $orr)
  (princ)
)


点评

有天正图元的图块,拉伸出错,,比如画个矩形,用天正标注一下尺寸,做块放大两倍!!!  发表于 2020-11-18 16:28
把填充拉伸功能也加进去就牛了!  发表于 2020-3-23 00:58
在位编辑也可以吧?  发表于 2017-11-23 09:07

评分

参与人数 1明经币 +1 收起 理由
USER2128 + 1 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-2-11 16:20:58 | 显示全部楼层
zj20190405 发表于 2020-2-19 15:39
;;; ==================================================================
;;;     扩展stretch拉伸命令 ...

如果用  (command ".explode" name)炸开块,有点卡顿,我试了一下,
删除     (redraw (ssname ss1 (setq j (1- j))) 3)    和    (redraw name 3)  这两句话, 也就是不亮显刚炸开的块,就可以避免卡顿。
另外,如果用vla-explode炸开块,也可以避免卡顿,但我还不会用vla-explode去修改。希望高手来修改一下。
回复 支持 1 反对 0

使用道具 举报

发表于 2017-11-23 17:40:56 | 显示全部楼层
同楼上  

命令: KLS
窗交对象:指定角点 [设置(S)]:
窗交对象:指定对角点:
指定基点:
指定第二个点,或相对基点位移:

*无效选择*
需要点或 窗口(W)/上一个(L)/窗交(C)/框(BOX)/全部(ALL)/栏选(F)/圈围(WP)/圈交(CP)/编组(G)/添加(A)/删除(R)/多个(M)/前一个(P)/放弃(U)/自动(AU)/单个(SI)/子对象(SU)/对象(O)

原因:函数被取消 位置-> 行:68 列:12
选择对象: *取消*
回复 支持 0 反对 1

使用道具 举报

发表于 2020-2-19 15:39:11 | 显示全部楼层
;;; ==================================================================
;;; <块拉伸 V2.2>    扩展stretch拉伸命令,对含多个普通块选择集进行拉伸
;;;                  原理是打散块,拉伸后重新建块,2.2版增加个设置功能
;;; 作者:langjs      命令:kls                      日期:2017年11月9日
;;; ==================================================================
(defun c:s (/ #errkls $orr $sz1 bb dcl_pt dcl_re dclname ent f i j kname lst name pt pt1 pt2 pt3 pt4 pt5 ss ss1 ss2 xun)
  (defun #errkls (s)
    (command ".UNDO" "E") (command ".UNDO" "") (setq *error* $orr)
  )
  (defun emkunameblk (ss pt / i name)  ; 生成无名块
    (entmake (list '(0 . "block") '(2 . "*U") '(70 . 1) (cons 10 pt)))
    (repeat (setq i (sslength ss)) (entmake (cdr (entget (ssname ss (setq i (1- i)))))))
    (setq name (entmake '((0 . "ENDBLK"))))
    (command "_.erase" ss "")
    (entmake (list '(0 . "INSERT") (cons 2 name) (cons 10 pt)))
    name)
  (setq $orr *error*  *error* #errkls )
  (setvar "cmdecho" 0)
  (command ".UNDO" "BE")
  (setq lst '()        ss2 (ssadd) xun t )
  (while xun
    (initget "S ")
    (if (= (setq pt1 (getpoint "\n窗交对象:指定角点 [设置(S)]:")) "S")
      (progn
        (setq dclname (vl-filename-mktemp "KLS.dcl")  f (open dclname "w"))
        (write-line "KLS:dialog {" f)
        (write-line " label = \"块拉伸 V2.2 \" ; " f)
        (write-line ":boxed_radio_column {  label = \"设置\";" f)
        (write-line ":radio_button {label = \"同名图块同步拉伸\";key =\"e01\"; mnemonic = \"1\"; } " f)
        (write-line ":radio_button {label = \"选定图块图元拉伸\";  key = \"e02\";   } }" f)
        (write-line " ok_cancel ; } " f)
        (close f)
        (setq dcl_re (load_dialog dclname))
        (new_dialog "KLS" dcl_re "" dcl_pt)
        (if $sz  (set_tile "e02" "1") (set_tile "e01" "1"))
        (action_tile "e01" "( setq  $sz1 nil ) ")
        (action_tile "e02" "( setq  $sz1 t )")
        (action_tile "accept" "(setq dcl_pt (done_dialog 2))")
        (action_tile "cancel" "(setq dcl_pt (done_dialog 3))")
        (setq bb (start_dialog))
        (unload_dialog dcl_re)
        (vl-file-delete dclname)
        (if (= bb 2) (setq $sz $sz1))
      )
      (setq xun nil)
    ))
  (if (not (atom pt1))
    (if (setq pt2 (getcorner pt1 "\n窗交对象:指定对角点:"))
      (if (setq ss (ssget "c" pt1 pt2))
        (progn
          (repeat (setq i (sslength ss))
            (setq name (ssname ss (setq i (1- i)))  ent (entget name))
            (if (and (= (cdr (assoc 0 ent)) "INSERT") (not (assoc 66 ent)))
              (progn
                (setq pt3 (cdr (assoc 10 ent)))
                (entmake (list '(0 . "POINT") (cons 10 pt3)))
                (ssadd (entlast) ss2)
                (command ".explode" name)
                (setq ss1 (ssget "p")  lst (cons (list pt3 (assoc 2 ent) ss1 (assoc 8 ent)) lst))
                (repeat (setq j (sslength ss1)) (redraw (ssname ss1 (setq j (1- j))) 3))
              )
              (redraw name 3)
            ))
          (sssetfirst nil ss2)
          (while (not (setq pt4 (getpoint "\n指定基点:"))))
          (command "erase" ss2 "")
          (princ "\n指定第二个点,或相对基点位移:")
          (command "_.stretch" "c" pt1 pt2 "" pt4 pause)
          (setq pt5 (getvar "lastpoint"))
          (if (/= (distance pt4 pt5) 0.0)
            (repeat (setq i (length lst))
              (setq name (nth (setq i (1- i)) lst ) pt3 (car name) kname (cdadr name))
              (if (and
                    (<= (* (- (car pt3) (car pt1)) (- (car pt3) (car pt2))) 0)
                    (<= (* (- (cadr pt3) (cadr pt1)) (- (cadr pt3) (cadr pt2))) 0))
                (setq pt3 (polar pt3 (angle pt4 pt5) (distance pt4 pt5))))
              (if (or  $sz  (wcmatch kname "\*U*"))
                (setq kname (emkunameblk (caddr name) pt3))
                (command "block" kname "y" pt3 (caddr name) ""))
              (entmake (list '(0 . "INSERT") (cons 2 kname) (cons 10 pt3) (cadddr name))))
            (#errkls)
          )))))
  (setq e1 (entlast))
  (command "ERASE" E1 "")
  (command ".UNDO" "E")
  (setq *error* $orr)
  (princ)
)
发表于 2017-11-22 16:34:01 | 显示全部楼层
一进来就看到大师的杰作,收藏了,谢谢。
发表于 2017-11-23 07:09:05 | 显示全部楼层
感谢 langjs 大师分享程序,学习了!
发表于 2017-11-23 08:16:05 | 显示全部楼层
很好的程序,我一直用得着这个程序,感谢狼大师!
发表于 2017-11-23 10:02:17 | 显示全部楼层
这个功能,牛,大师棒
发表于 2017-11-23 14:26:41 | 显示全部楼层
不能用啊,拉伸块就散了
发表于 2017-11-24 10:31:36 | 显示全部楼层
我在07里试的,可以用
发表于 2017-11-24 20:04:23 | 显示全部楼层
貌似不太会用,有个gif就好了
发表于 2017-11-24 22:57:51 来自手机 | 显示全部楼层
不错,就是怎么只能在俯视图里使用呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-23 03:13 , Processed in 0.206131 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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