明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2567|回复: 8

[提问] 请问DCL与lsp合并该怎么做

[复制链接]
发表于 2016-6-19 17:14:30 | 显示全部楼层 |阅读模式
就是想把DCL文件里面的代码复制粘贴到lsp里面,让两者合二为一,成为一个含DCL的lsp文件
 楼主| 发表于 2016-6-19 17:19:32 | 显示全部楼层
这有一个据说可以将dc代码转为lsp格式的程序,,,,,几经摸索仍不得要领

;;;=================================================================*
;;;                                                                 *
;;;功能:将dcl文件转换为一个lisp函数。                              *
;;;      函数的功能是,生成临时dcl,返回临时文件的路径全名。        *
;;;      摆脱dcl文件位置的束缚。                                    *
;;;                                                                 *
;;;=================================================================*
;;;测试
(defun c:tt () (c:dcl2lsp))
;;;=================================================================*
(defun c:dcl2lsp (/ filename_dcl lst_str filename_lsp f str)
  (and
    ;; 1、选择原始dcl文件
    (setq filename_dcl
           (getfiled "选择dcl文件"
                     ""
                     "dcl"
                     4
           )
    )
    ;; 2、生成lisp源码
    (setq lst_str (zl-dcl->lsp filename_dcl))
    ;; 3、输出lsp文件
    (setq filename_lsp (strcat filename_dcl ".lsp"))
    (setq f (open filename_lsp "w"))
    (foreach str lst_str (princ "\n" f) (princ str f))
    (not(close f))
    ;; 4、用记事本显示,lsp文件内容
    (startapp "notepad" filename_lsp)
  )
  (princ)
)
;;;=================================================================*
;;;      通用函数                                                   *
;;;功能:
;;;参数:filename_dcl  -----原始dcl文件名。                         *
;;;返回:字符串表。内容组合为lsp函数定义。                          *
(defun zl-dcl->lsp (filename_dcl / f lst_str0 lst_str1 lst_str2)

  ;; 1、读取dcl文件内容
  (if (setq f (open filename_dcl "r"))
    (progn
      (setq lst_str1 '())
      (while (setq str (read-line F))
        (setq str      (vl-prin1-to-string str)
              lst_str1 (cons str lst_str1)
        )
      )
      (setq lst_str1 (reverse lst_str1))
      (close f)
    )
  )
  ;; 2、定义前缀
  (setq        lst_str0
          (list
            ";;;=================================================================*"
            (strcat ";;;生成日期:" (rtos (getvar "cdate") 2 6))
            ";;;本文件由程序自动生成。                                           *"
            ";;;程序生成完成后需将主代码“*.lsp”文件中的语句中的     *"
            ";;; (load_dialog 双引号*.Dcl双引号)改为(load_dialog (make-dcl)) 方可用            *"
            ";;;修改后的代码可编辑到主LISP程序后方运行                                                                 *"
            ";;;=================================================================*"
            ";;;为能让多个有本程序生成的DCL.lsp可以同时使用,生成程序后应将对话框名 (make-dcl)改名   *"
            ";;;供需修改两处地方,一处为加载的地方(load_dialog (???-make-dcl)) ,另一处为       *"
            ";;;对话框主程序名(defun ???-make-dcl    ,一定要一致                      *"
            ";;;示例:(make-dcl)                                                 *"
            "(defun make-dcl  (/ lst_str str file f)"
            "\t\t(setq lst_str '("
          )
  )
  ;; 3、定义后缀
  (setq        lst_str2
         '("                    )"
           "    )"
           "    (setq file (vl-filename-mktemp \"DclTemp.dcl\"))"
           "    (setq f (open file \"w\"))"
           "    (foreach str lst_str"
           "        (princ \"\\n\" f)"
           "        (princ str f)"
           "    )"
           "    (close f)"
           "    ;;返回"
           "    file"
           ")"
           ";;;=================================================================*"
           "(princ)"
          )
  )
  ;; 4、返回
  (append lst_str0 lst_str1 lst_str2)
)
发表于 2016-6-19 19:29:15 | 显示全部楼层
是的这个可以生成为LSP的
 楼主| 发表于 2016-6-19 22:21:43 | 显示全部楼层
tangjunasd58 发表于 2016-6-19 19:29
是的这个可以生成为LSP的

你好,帮我看看这个怎么编辑好吗


;;;=================================================================*
;;;生成日期:20160619.221814
;;;本文件由程序自动生成。                                           *
;;;程序生成完成后需将主代码“*.lsp”文件中的语句中的     *
;;; (load_dialog 双引号*.Dcl双引号)改为(load_dialog (make-dcl)) 方可用            *
;;;修改后的代码可编辑到主LISP程序后方运行                                                                 *
;;;=================================================================*
;;;为能让多个有本程序生成的DCL.lsp可以同时使用,生成程序后应将对话框名 (make-dcl)改名   *
;;;供需修改两处地方,一处为加载的地方(load_dialog (???-make-dcl)) ,另一处为       *
;;;对话框主程序名(defun ???-make-dcl    ,一定要一致                      *
;;;示例:(make-dcl)                                                 *
(defun make-dcl  (/ lst_str str file f)
                (setq lst_str '(
"punch:dialog{"
"        label=\"**金丰冲床规格表**\";"
"        spacer;"
" :boxed_row{"
"  :column{"
"    label=\"机台规格\";"
"    :text{label=\"OCP-25;\";}"
"    :text{label=\"OCP-35;\";}"
"    :text{label=\"OCP-45;\";}"
"    :text{label=\"OCP-60;\";}"
"    :text{label=\" G1 - 80;\";} "
"    :text{label=\" G1- 110;\";}"
"    :text{label=\" G1- 160;\";}"
"    :text{label=\" G2- 160;\";}"
"    :text{label=\" G1- 200;\";}"
"    :text{label=\" G2- 200;\";}  "
"    :text{label=\" G2- 250;\";} "
"    :text{label=\"油压机-100;\";}"
"    :text{label=\"OCP -260;\";}}"
"  :column {"
"    label=\"闭 模 高 度\";"
"    :text{label=\"150~200;\";}  "
"    :text{label=\"470~550;\";}"
"    :text{label=\"180~240;\";}"
"    :text{label=\"225~300;\";}  "
"    :text{label=\"250~320;\";}"
"    :text{label=\"290~340;\";}"
"    :text{label=\"380~440;\";}"
"    :text{label=\"350~450;\";}"
"    :text{label=\"370~440;\";}"
"    :text{label=\"390~500;\";}"
"    :text{label=\"430~550;\";}"
"    :text{label=\"550~900;\";}  "
"    :text{label=\"380~500;\";}}"
"  :column {"
"    label=\"连续模下模高度\";"
"    :text{label=\"**********\";}"
"    :text{label=\"140~200;\";}   "
"    :text{label=\"140~200;\";}"
"    :text{label=\"**********\";} "
"    :text{label=\"140~200;\";}"
"    :text{label=\"200~290;\";} "
"    :text{label=\"200~290;\";}"
"    :text{label=\"200~290;\";}   "
"    :text{label=\"200~290;\";}"
"    :text{label=\"200~290;\";} "
"    :text{label=\"200~290;\";}"
"    :text{label=\"200~290;\";}  "
"    :text{label=\"200~290;\";}}"
"    }"
"    ok_only;"
"       }"
                    )









(defun c:press ()
  (if (= outline nil)
    (load "outline")
  )
  (setq        nn 3
        long 0
  )
  (while (>= nn 2)
    (setq dcl-id (load_dialog "press"))
    (if        (null (new_dialog "press" dcl-id))
      (exit)
    )
    (setq thick (atof (get_tile "thick")))
    (if        long
      (set_tile "L" (rtos long 2 2))
    )
    (if        (setq thick (Xrecord-out "press"))
      (progn
        (set_tile "thick" thick)
        (setq thick (atof thick))
      )
    )
    (if        (>= thick 3)
      (set_tile "KX" "0.2")
    )
    (action_tile
      "ls"
      "(Xrecord-in(get_tile \"thick\")\"press\")(done_dialog 4)"
    )
    (action_tile "accept" "(press-ok)")
    (setq nn (start_dialog))
    (unload_dialog dcl-id)
    (if        (= nn 4)
      (press-select)
    )
  )
  (princ)
)
(defun press-select ()
  (princ "\n请选择料带上的冲裁轮廓.")
  (setq        ss   (ssget '((-4 . "<or")
                      (0 . "line")
                      (0 . "circle")
                      (0 . "arc")
                      (0 . "lwpolyline")
                      (-4 . "or>")
                     )
             )
        long 0
        j    -1
  )
  (if ss
    (progn
      (repeat (sslength ss)
        (setq en (entget (setq sa (ssname ss (setq j (+ j 1))))))
        (if (= (setq en-name (cdr (assoc 0 en))) "LWPOLYLINE")
          (progn
            (command "area" "o" sa)
            (setq long1 (getvar "PERIMETER"))
          )
          (if (= en-name "LINE")
            (progn
              (command "pedit" sa "y" "j" sa "" "")
              (command "area" "o" (entlast))
              (setq long1 (getvar "PERIMETER"))
            )
            (progn
              (command "list" sa "")
              (setq r1 (cdr (assoc 40 en)))
              (setq long1 (* pi (* 2 r1)))
            )
          )
        )
        (setq long (+ long long1))
      )
    )
    (setq long 0)
  )
)
(defun press-ok        ()
  (setq L (atof (get_tile "L")))
  (setq A (atof (get_tile "A")))
  (setq K (atof (get_tile "K")))
  (setq thick (atof (get_tile "thick")))
  (setq p0 (/ (* thick L A) 1000))
  (setq px (* p0 (atof (get_tile "KX"))))
  (set_tile "P0" (rtos p0 2 2))
  (set_tile "PX" (rtos pX 2 2))
  (set_tile "PU" (rtos (+ (* K p0) px) 2 2))
  (Xrecord-in (rtos thick 2 2) "press")
)
 楼主| 发表于 2016-6-19 22:23:38 | 显示全部楼层

;;;=================================================================*
;;;生成日期:20160619.221814
;;;本文件由程序自动生成。                                           *
;;;程序生成完成后需将主代码“*.lsp”文件中的语句中的     *
;;; (load_dialog 双引号*.Dcl双引号)改为(load_dialog (make-dcl)) 方可用            *
;;;修改后的代码可编辑到主LISP程序后方运行                                                                 *
;;;=================================================================*
;;;为能让多个有本程序生成的DCL.lsp可以同时使用,生成程序后应将对话框名 (make-dcl)改名   *
;;;供需修改两处地方,一处为加载的地方(load_dialog (???-make-dcl)) ,另一处为       *
;;;对话框主程序名(defun ???-make-dcl    ,一定要一致                      *
;;;示例:(make-dcl)                                                 *
(defun make-dcl  (/ lst_str str file f)
                (setq lst_str '(
"punch:dialog{"
"        label=\"**金丰冲床规格表**\";"
"        spacer;"
" :boxed_row{"
"  :column{"
"    label=\"机台规格\";"
"    :text{label=\"OCP-25;\";}"
"    :text{label=\"OCP-35;\";}"
"    :text{label=\"OCP-45;\";}"
"    :text{label=\"OCP-60;\";}"
"    :text{label=\" G1 - 80;\";} "
"    :text{label=\" G1- 110;\";}"
"    :text{label=\" G1- 160;\";}"
"    :text{label=\" G2- 160;\";}"
"    :text{label=\" G1- 200;\";}"
"    :text{label=\" G2- 200;\";}  "
"    :text{label=\" G2- 250;\";} "
"    :text{label=\"油压机-100;\";}"
"    :text{label=\"OCP -260;\";}}"
"  :column {"
"    label=\"闭 模 高 度\";"
"    :text{label=\"150~200;\";}  "
"    :text{label=\"470~550;\";}"
"    :text{label=\"180~240;\";}"
"    :text{label=\"225~300;\";}  "
"    :text{label=\"250~320;\";}"
"    :text{label=\"290~340;\";}"
"    :text{label=\"380~440;\";}"
"    :text{label=\"350~450;\";}"
"    :text{label=\"370~440;\";}"
"    :text{label=\"390~500;\";}"
"    :text{label=\"430~550;\";}"
"    :text{label=\"550~900;\";}  "
"    :text{label=\"380~500;\";}}"
"  :column {"
"    label=\"连续模下模高度\";"
"    :text{label=\"**********\";}"
"    :text{label=\"140~200;\";}   "
"    :text{label=\"140~200;\";}"
"    :text{label=\"**********\";} "
"    :text{label=\"140~200;\";}"
"    :text{label=\"200~290;\";} "
"    :text{label=\"200~290;\";}"
"    :text{label=\"200~290;\";}   "
"    :text{label=\"200~290;\";}"
"    :text{label=\"200~290;\";} "
"    :text{label=\"200~290;\";}"
"    :text{label=\"200~290;\";}  "
"    :text{label=\"200~290;\";}}"
"    }"
"    ok_only;"
"       }"
                    )
    )
    (setq file (vl-filename-mktemp "DclTemp.dcl"))
    (setq f (open file "w"))
    (foreach str lst_str
        (princ "\n" f)
        (princ str f)
    )
    (close f)
    ;;返回
    file
)
;;;=================================================================*
(princ)
 楼主| 发表于 2016-6-19 22:24:14 | 显示全部楼层
(defun c:press ()
  (if (= outline nil)
    (load "outline")
  )
  (setq        nn 3
        long 0
  )
  (while (>= nn 2)
    (setq dcl-id (load_dialog "press"))
    (if        (null (new_dialog "press" dcl-id))
      (exit)
    )
    (setq thick (atof (get_tile "thick")))
    (if        long
      (set_tile "L" (rtos long 2 2))
    )
    (if        (setq thick (Xrecord-out "press"))
      (progn
        (set_tile "thick" thick)
        (setq thick (atof thick))
      )
    )
    (if        (>= thick 3)
      (set_tile "KX" "0.2")
    )
    (action_tile
      "ls"
      "(Xrecord-in(get_tile \"thick\")\"press\")(done_dialog 4)"
    )
    (action_tile "accept" "(press-ok)")
    (setq nn (start_dialog))
    (unload_dialog dcl-id)
    (if        (= nn 4)
      (press-select)
    )
  )
  (princ)
)
(defun press-select ()
  (princ "\n请选择料带上的冲裁轮廓.")
  (setq        ss   (ssget '((-4 . "<or")
                      (0 . "line")
                      (0 . "circle")
                      (0 . "arc")
                      (0 . "lwpolyline")
                      (-4 . "or>")
                     )
             )
        long 0
        j    -1
  )
  (if ss
    (progn
      (repeat (sslength ss)
        (setq en (entget (setq sa (ssname ss (setq j (+ j 1))))))
        (if (= (setq en-name (cdr (assoc 0 en))) "LWPOLYLINE")
          (progn
            (command "area" "o" sa)
            (setq long1 (getvar "PERIMETER"))
          )
          (if (= en-name "LINE")
            (progn
              (command "pedit" sa "y" "j" sa "" "")
              (command "area" "o" (entlast))
              (setq long1 (getvar "PERIMETER"))
            )
            (progn
              (command "list" sa "")
              (setq r1 (cdr (assoc 40 en)))
              (setq long1 (* pi (* 2 r1)))
            )
          )
        )
        (setq long (+ long long1))
      )
    )
    (setq long 0)
  )
)
(defun press-ok        ()
  (setq L (atof (get_tile "L")))
  (setq A (atof (get_tile "A")))
  (setq K (atof (get_tile "K")))
  (setq thick (atof (get_tile "thick")))
  (setq p0 (/ (* thick L A) 1000))
  (setq px (* p0 (atof (get_tile "KX"))))
  (set_tile "P0" (rtos p0 2 2))
  (set_tile "PX" (rtos pX 2 2))
  (set_tile "PU" (rtos (+ (* K p0) px) 2 2))
  (Xrecord-in (rtos thick 2 2) "press")
)
 楼主| 发表于 2016-6-19 22:25:23 | 显示全部楼层
tangjunasd58 发表于 2016-6-19 19:29
是的这个可以生成为LSP的

你好,帮我看看楼上两个怎么合并好吗
 楼主| 发表于 2016-6-19 22:34:18 | 显示全部楼层
操作失误,事后才发现发了重复内容,抱歉,,给管理员添乱了
发表于 2021-7-12 11:00:50 | 显示全部楼层
皇上快溜 发表于 2016-6-19 17:19
这有一个据说可以将dc代码转为lsp格式的程序,,,,,几经摸索仍不得要领

;;;======================== ...

老哥,效果不错,但是能不能直接获取dcl文件的名称,然后转出来的lsp文件的load_dialog直接引用获取的dcl文件名,那样的话就不用再修改load_dialog名称了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-29 05:20 , Processed in 0.227449 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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