lingduwx 发表于 2013-10-13 11:17:51

请求高手帮忙修改一下,谢谢!!!

本帖最后由 lingduwx 于 2013-10-16 13:46 编辑

希望高手帮忙修改一下,红色文字的需要的要求,谢谢!!!
(这个是图块批量放大程序,他原来的操作是输入命令之后选择哪些图块种类,然后输入缩放倍数,然后再框选区域内的图块放大,我现在的想法是在选择图块种类的时候增加一个功能就是不选择的情况下输入放大倍数,然后选择区域,则此区域内的图块均被缩放)
具体操作过程
命令: bf

请选择需缩放的块:
选择对象: 指定对角点: 找到 5 个(希望这一步增加一个功能,就是不选择对象的情况下可以直接右键继续下一步操作)

选择对象:

请输入缩放倍数:2(接上一步操作,就是不选择图块种类的情况下直接输入缩放倍数)

选择对象: 指定对角点: 找到 5 个(然后选择区域,则区域内被选择的图块均可以被缩放)

选择对象:
; 错误: 参数类型错误: stringp nil(这个原文件最后缩放成功,但是不知道怎么会有这个错误的提示)


下面是论坛里找的源码
————————————————————————————————————————————————————————————
;;;****************************************************
;;;                bsc--多块同时缩放.lsp
;;;****************************************************
(defun c:bf ()
    (command "_.undo" "_begin")
    (setq old_err *error* *error* Sb_err)
    (if (and
          (princ "\n请选择需缩放的块:")
          (setq ss (ssget '((0 . "INSERT"))))
      )
      (progn
      (setq i 0 bnm (cdr(assoc 2 (entget(ssname ss 0)))))
      (repeat (1- (sslength ss))
          (setq ent (entget(ssname ss (setq i (1+ i))))
                bnm (strcat bnm "," (cdr(assoc 2 ent))))
      )
      (initget 7)
      (setq blkfactor (getreal "\n请输入缩放倍数:"))
      (setq blksset (ssget (list (cons 0 "INSERT") (cons 2 bnm))))
      (setq donecount 0)
      (repeat (sslength blksset)
          (setq temp (ssname blksset donecount))
          (setq templist (entget temp))
          (setq blkbasept (cdr (assoc 10 templist)))
          (command "scale" temp "" blkbasept blkfactor ^c)
          (setq donecount (1+ donecount))
      )
      (princ
          (strcat
            "\n完成缩放 "
            (itoa donecount)
            " 个名称为\""
            blkname "\"的块."

    ) ) ) )
    (command "_.undo" "_end")
    (princ)
)


(defun Bs_err (s)
    (princ "\n命令中止!")
    (setq *error* old_err)
    (princ)
)
(princ)



lingduwx 发表于 2013-10-14 09:33:58

帖子沉的好快啊

fl202 发表于 2013-10-14 13:33:09

右键是干吗?结束程序还是下一个循环?
(command "scale" temp "" blkbasept blkfactor )

WKSTUDIO 发表于 2013-10-14 15:36:06

没细看程序。不设置局部变量,就会有程序间变量相互影响而导致出错风险。
这样的程序我喜欢用 entmod

lingduwx 发表于 2013-10-15 09:11:09

fl202 发表于 2013-10-14 13:33 static/image/common/back.gif
右键是干吗?结束程序还是下一个循环?
(command "scale" temp "" blkbasept blkfactor )

右键之后继续下一步操作

fl202 发表于 2013-10-16 08:50:40

lingduwx 发表于 2013-10-15 09:11 static/image/common/back.gif
右键之后继续下一步操作

你这不是废话?
我问你中午吃啥?你说吃饭!!!我问多大了?你说二十多!!!

下一步什么操作啊?你原初衷想让这个程序实现哪些功能?详细叙述,详细!

lingduwx 发表于 2013-10-16 13:41:36

fl202 发表于 2013-10-16 08:50 static/image/common/back.gif
你这不是废话?
我问你中午吃啥?你说吃饭!!!我问多大了?你说二十多!!!



不好意思,可能是我没有讲完
上面我想讲的是具体操作过程想怎么样做,可能表述有点不准确,下面的内容是我的想法(不知道表述清楚了没有):
这个是图块批量放大程序,他原来的操作是输入命令之后选择哪些图块种类,然后输入缩放倍数,然后再框选区域内的图块放大,我现在的想法是在选择图块种类的时候增加一个功能就是不选择图块的情况下输入放大倍数,然后选择区域,则此区域内的图块均被缩放

fl202 发表于 2013-10-17 09:37:49

本帖最后由 fl202 于 2013-10-17 09:40 编辑

lingduwx 发表于 2013-10-16 13:41 static/image/common/back.gif
不好意思,可能是我没有讲完
上面我想讲的是具体操作过程想怎么样做,可能表述有点不准确,下面的内容是 ...
原句上修改:在第一次选择到块时,缩放该类块;在选择空时,缩放第二次选择范围内所有的块。
其实这样还是不太好,我感觉这种选择方式有可能误选不需要缩放的块。
另:也可以做成dcl的,会更好用。(defun c:bf1 ()
    (command "_.undo" "_begin")
    ;(setq old_err *error* *error* Sb_err)
    (setq ss nil bnm nil)
    (if (and
          (princ "\n请选择需缩放的块:")
          (setq ss (ssget '((0 . "INSERT"))))
      )
      (progn
      (setq i 0 bnm (cdr(assoc 2 (entget(ssname ss 0)))))
      (repeat (1- (sslength ss))
          (setq ent (entget(ssname ss (setq i (1+ i))))
                bnm (strcat bnm "," (cdr(assoc 2 ent))))
      )
         ) )
      (initget 7)
      (setq blkfactor (getreal "\n请输入缩放倍数:"))
      (if bnm
      (setq blksset (ssget (list (cons 0 "INSERT") (cons 2 bnm))))
      (setq blksset (ssget (list (cons 0 "INSERT") )))
      )
      (setq donecount 0)
      (setvar "osmode" 0)
      (repeat (sslength blksset)
          (setq temp (ssname blksset donecount))
          (setq templist (entget temp))
          (setq blkbasept (cdr (assoc 10 templist)))
          (command "scale" temp "" blkbasept blkfactor)(princ (list blkbasept blkfactor))
          ;(command "scale" temp "" blkbasept blkfactor ^c)
          (setq donecount (1+ donecount))
      )
      (setvar "osmode" 767)
      (princ   (strcat   "\n完成缩放 "   (itoa donecount) " 个名称为\""bnm "\"的块."    ) )
   
    (command "_.undo" "_end")
    (princ)
)
有点不对啊,怎么3k分,49个明经币的还要我帮助???给我点!

lingduwx 发表于 2013-10-17 09:51:49

fl202 发表于 2013-10-17 09:37 static/image/common/back.gif
原句上修改:在第一次选择到块时,缩放该类块;在选择空时,缩放第二次选择范围内所有的块。
其实这样还 ...

非常感谢,偶本来想给你10币的,但是提示24小时评分太频繁,不知道怎么回事,等明天给你哈,呵呵
平时偶主要逛一下论坛,但是一直对lsp搞不懂啊,呵呵

lingduwx 发表于 2013-10-17 09:58:54

fl202 发表于 2013-10-17 09:37 static/image/common/back.gif
原句上修改:在第一次选择到块时,缩放该类块;在选择空时,缩放第二次选择范围内所有的块。
其实这样还 ...

大哥想再麻烦请教一下,我保存的时候选择的“Unicode”这个编码格式,在CAD加载出现错误,不知道怎么回事 啊?
提示如下:
命令: ap APPLOAD 已成功加载 新建文本文档 (5).lsp。


命令: ; 错误: 读入的 (八进制) 字符不正确: 0
页: [1] 2
查看完整版本: 请求高手帮忙修改一下,谢谢!!!