明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5157|回复: 12

[LISP]請教一個LISP打印程序問題!!!

  [复制链接]
发表于 2003-11-30 17:48:00 | 显示全部楼层 |阅读模式
我是一名繪圖員,嚐試在編制一些小程序來提高AutoCAD的工作效率,近日在編制一個
小程序時遇到一個問題,請各位高手指教!
我廠是個家具廠,廠裡的習慣是先在一個文件裡面畫出主三視圖,然後在同一個文件
畫出配件圖,配件已經根據名稱分好圖層,便於拷貝出來畫配件圖,配件沒有進行縮
放而是對標准圖框進行縮放來適配配件,我想編一個程序,在事先指定好打印配件文
件A4.pc3後,只需框遷圖框便可用不同的比例打印A4幅面的圖紙,可是下面的程序好
像總是出毛病,特別是(del_tempview) 函數,只要運行它,就會導致AutoCAD 2004
退出,不知何故,請各位指點一下!
(程序默認打印方向為Landscape, 默認打印類型表為monchrome,可以更改)

;c:pw3
;have a4.pc3 file
;can specify polt dirction and polt style table (acad or monchrome)                 ;

;;;;;;;;;;;;;;;;;;;
;;(get_plot_color)

(defun get_plot_color ()
  (initget "Acad Monochrome")
  (setq        plot_color
         (getkword
           "\nSpecify plot style table [Acad/Monochrome] <M>:"
         )
  )
  (if (null plot_color)
    (setq plot_color "Monochrome")
  )
  (get_plot_set)
)

;;;;;;;;;;;;;;;;;;;;;;;;
;;(get_plot_dir)

(defun get_plot_dir ()
  (initget "ortrait Landscape" )
  (setq        plot_dir
         (getkword
           "\nSpecify plot dirction [Portrait/Landscape] <L>: "
         )
  )
  (if (null plot_dir)
    (setq plot_dir "Landscape")
  )
    (get_plot_set)
)

;;;;;;;;;;;;;;;;;;;;;;;;
;;(get_plot_window)
(defun get_plot_window ()
  ;;save a tmpview for plot windows
  (setq pwPT1 (getpoint "\nSpecify plot window first corner:"))
  (setq pwPT2
         (getcorner "\nSpecify plot window opposite corner:" Pwpt1)
  )
  (command "-VIEW" "Window" "tmpview" pwPT1 pwPT2)
)

;;;;;;;;;;;;;;
(defun del_tempview ()
  (command "-VIEW" "Delete" "tmpview")
)

;;;;;;;;;;;;;;;;
(defun start_plot()
(command "-plot"   "y"       "model"         "a4.pc3"  "a4"
           "Millimeters"       plot_dir         "no"           "view"    "tmpview"
           "fit"     "center"  "yes"         plot_color "yes"     ""
           ""             ""               "Y"
          )
)

;;
;;(get_plot_set)
(defun get_plot_set()
(psave)save sys var
   (Setvar "cmdecho" 0)
  (initget "c d")
  (setq        plot_set
         (getkword
           "\n Change plot setting [Dirction/depend Color]:"
         )
  )
;;;  ;
  (if (null plot_set)
    (get_plot_window)
    (start_plot)
  )
;;;  ;
  (if (= plot_set "c")
    (get_plot_color)
  )
;;;  ;
   (if (= plot_set "d")
    (get_plot_dir)
  )

  (prestore);restore sys var
  (princ)
  )


;;
(defun c:pw3 ();Specify
   (setq plot_dir "Landscape")
(setq plot_color "Monochrome")
(get_plot_set)
(get_plot_window)
  (start_plot)
;(del_tempview)
  (princ)
  )
发表于 2003-12-1 08:37:00 | 显示全部楼层
程序很乱,下面这个函数未给出(这个还不重要)
(prestore)
这句话也不知道什么意思
(psave)save sys var

还有这里,如果选择了C或D,将执行(start_plot),都已经还是打印了,那后面的语句还有什么意义吗?而且你的主函数里还有打印,这样不就两次打印了。建议这里使用cond函数
  (if (null plot_set)
    (get_plot_window)
    (start_plot)
  )
发表于 2003-12-1 09:27:00 | 显示全部楼层
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=11253
 楼主| 发表于 2003-12-1 09:47:00 | 显示全部楼层
不好意思,應該是 (psave);save sys var,少了一個注釋符號";"
(psave)是一個全局保存系統變量函數
(prestore)是一個全局恢復系統變量函數

下面是我以前的打印程序,只能指定打印方向,不能指定打印類型表,
因為在A4打印方式下,我經常需要更改的只有打印方向和打印類型表
我的目的是啟動命令後,直接回車後可窗選打印,或指定兩種設置,可以
直接告訴我應該怎麼實現的源碼嗎?

關於(del_tempview)函數會導致AutoCAD退出還請指教,謝謝!!!


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun get_plot_window ()
  ;;save a tmpview for plot windows
  (setq pwPT1 (getpoint "\nSpecify plot window first corner:"))
  (setq pwPT2
         (getcorner "\nSpecify plot window opposite corner:" Pwpt1)
  )
  (command "-VIEW" "Window" "tmpview" pwPT1 pwPT2)
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun del_tempview ()
  (command "-VIEW" "Delete" "tmpview")
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun c:pw ()
  (psave)
  (Setvar "cmdecho" 0)
  (initget "ortrait Landscape")
  (setq        plot_dir
         (getkword
           "\nSpecify plot dirction [Portrait/Landscape] <L>: "
         )
  )
  (if (null plot_dir)
    (setq plot_dir "Landscape")
  )
(get_plot_window)
  (command "-plot"   "y"       "model"         "a4.pc3"  "a4"
           "Millimeters"       plot_dir         "no"           "view"    "tmpview"
           "fit"     "center"  "yes"         ""           "yes"     ""
           ""             ""               "Y"
          )
                                        ;(del_tempview)
  (prestore)
  (princ)
)
发表于 2003-12-1 10:10:00 | 显示全部楼层
试试这个,也许比你期望的更多~~~:)

使用上如有不明可以按“帮助"

这个程序是用vl的activex功能写的,与你的命令行方式完全不同。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2003-12-1 10:37:00 | 显示全部楼层
謝謝秋楓,但我由於工作原因,用的是繁體系統,不能正確顯示BatchPlot對話框,能不能給個
英文的
发表于 2003-12-1 12:38:00 | 显示全部楼层
这是源代码,你打开batchplot.dcl文件自己改改吧~~~~~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1威望 +2 金钱 +8 贡献 +8 激情 +8 收起 理由
龙龙仔 + 2 + 8 + 8 + 8 【好评】奖励好程序

查看全部评分

发表于 2003-12-3 07:52:00 | 显示全部楼层
發現程序問題
(defun SetDefaultValues ()
    (setq
      dclvalues        (list (cons 'Frame "LzFrameRadio")
                      (cons 'BlockName (cdr (assoc 2 (tblnext "block" T))))

;;-----------------------------------------------------
;;由於圖檔中第一個圖塊為無名圖塊
;;指令: (tblnext "block" t)
;;((0 . "BLOCK") (2 . "*U3") (70 . 1) (4 . "") (10 0.0 0.0 0.0) (-2 . <圖元名稱:
;;400f5120>))
;;由於(2 . "*U3")以至下列程序出錯
;; (defun SetDlgValues        ()
;;      (if blocklist
;;        (progn (start_list "BlockNameEdit")
;;               (foreach blockname blocklist (Add_list blockname))
;;               (end_list)
;;        )
;;     )
;;      (if (getvalue 'Blockname)
;;這裡出錯(set_tile "BlockNameEdit" (itoa (vl-position (getvalue 'Blockname) Blocklist)))
;;     )
;;-----------------------------------------------------
                  
                      (cons 'Output "lotRadio")
                      (cons 'FrameCount 0)
                      (cons 'PlotScale "Auto")
                      (cons 'Copies "1")
                      (cons 'LayoutPrefix "BP_")
                      (cons 'PlotFilePrefix (strcat (vl-filename-base (getvar "dwgname")) "_"))
                      (cons 'PlotFileFolder (getvar "dwgprefix"))
                      (cons 'DeletePlotFile "0")
                      (cons 'DeleteLayout "0")
                      (cons 'MSLineScale "1")
                      (cons 'SelectedFrames nil)
                )
    )
  )


由於程序使用了(vl-catch-all-apply 'SetDlgValues nil)
錯誤訊息便沒有了,這個BUG可真花了點時間!
发表于 2003-12-3 18:53:00 | 显示全部楼层
本帖最后由 作者 于 2003-12-3 21:55:42 编辑

龙龙仔发表于2003-12-3 7:52:00發現程序問題
(defun SetDefaultValues ()
     (setq
       dclvalues (list (cons &#39;Frame &quot;LzFrameRadio&quot;)
                       (cons &#39;BlockName (cdr (assoc 2



非常感谢~~~送你鲜花~

我调试程序的时候的确是去掉vl-catch-all-apply调的
加个这个是为了出错处理方便一点,可以保证出错后后面的代码仍然可以得到执行,比如(command "U" "end")之类的必须执行的代码,使用传统的方式很麻烦。

我个人很喜欢这个函数, 有点类似其它高级语言中的“异常(exception)”处理。
发表于 2004-3-22 00:36:00 | 显示全部楼层
我用objectdcl也写了一个



上面的女人是把图拽进去预览的




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-2 14:54 , Processed in 0.209383 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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