明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5704|回复: 9

用oDCL.lsp 和lsp生成的vlx为什么还需要.ODCL文件?

[复制链接]
发表于 2012-3-23 10:40:14 | 显示全部楼层 |阅读模式
用oDCL.lsp 和lsp生成的vlx为什么还需要.ODCL文件?如果只用.vlx文件会提示“项目加载失败,文件未找到或读取时发成错误”
请问怎么个情况啊?
发表于 2012-3-23 12:20:01 来自手机 | 显示全部楼层
你加载的语句应该有误
 楼主| 发表于 2012-3-25 16:59:06 | 显示全部楼层
本帖最后由 taocitc 于 2012-3-25 17:00 编辑
aytxq 发表于 2012-3-23 12:20
你加载的语句应该有误

(defun c:hello (/)
  (command "OPENDCL")
  (dcl_Project_Load "hello.oDCL" T)
  (setq bFlag t)
  (princ)
  (while bFlag
    (setq bFlag nil)
    (dcl_Form_Show hello_Form1)
  )
)


然后把odcl另存为.lsp

;;; Visual LISP 生成文件 [V1.0] hello saved to:[C:/Program Files/AutoCAD 2010/KSteel] at:[3/25/12]
(PRV-DEF (:target . "hello.VLX")
  (:active-x . T)
  (:separate-namespace)
  (:protected . T)
  (:load-file-list (:lsp "hello.LSP"))
  (:require-file-list (:lsp "hello.odcl.lsp"))
  (:ob-directory)
  (:tmp-directory)
  (:optimization . st)
)
;; EOF

哪里有问题啊?
最后删掉odcl和odcl.lsp就白搭了

本帖子中包含更多资源

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

x
 楼主| 发表于 2012-3-27 15:36:14 | 显示全部楼层
谁知道啊。捣鼓了好几天了白搭,看那个例子也看不明白
发表于 2013-1-3 17:21:59 | 显示全部楼层
编译vlx的时候不要用专家,用普通方式编译
发表于 2013-10-11 12:32:15 | 显示全部楼层
yewuqiang 发表于 2013-1-3 17:21
编译vlx的时候不要用专家,用普通方式编译

能说详细一点吗?是把.odcl文件再加上后缀名变成.odcl.lsp这样吗?
发表于 2013-10-11 12:32:58 | 显示全部楼层
; 编译终止
; 错误: 编译器发现致命错误 "MDocLabel.odcl.lsp"
_$
发表于 2013-10-11 14:41:15 | 显示全部楼层
可能是方法有问题,把odcl文件存为lsp虽然可以编译进vlx,但是这样作的后果是程序运行时找不到ODCL文件,所以出错。
一个笨的方法是把ODCL的后缀名改为*.txt的形式,然后打包进vlx中,程序运行时还原ODCL文件到指定路径中,然后加载,应该可以正常运行了。具体怎么还原ODCL文件,可以参考下面的代码。
这个代码是从其他论坛找来的。
  1. ;;|因为用vl-get-resource读出的文本是用"\r\n"(分行回车)符分隔的,因此可以利用zhy_string_tok函数来生成字符串表。
  2. 然后根据表的内容来复原对话框。
  3. |;;
  4. (defun odc_make (odc_name odc_txt / fn fn2 fn_lst n m fn_txt)
  5.   (setq fn2 (open odc_name "w"));odc_name为要生成的对话框
  6.   (setq fn (vl-get-resource odc_txt));odc_txt为打包到vlx中的文本名,(不要扩展名)
  7.   (strlen fn)
  8.   (setq fn_lst (zhy_string_tok fn "\r\n"));根据读出的文本生成字符串表
  9.   (setq n (length fn_lst))
  10.   (setq m 0)
  11.   (while (< m n)
  12.     (setq fn_txt (nth m fn_lst))
  13.     (write-line fn_txt fn2)
  14.     (setq m (1+ m))
  15.     )
  16.   (close fn2)
  17. )
  18. (defun zhy_string_tok (sstring sstr / n1 n2 m2 str_1)
  19.   (setq string_list '())
  20.   (setq n1 (strlen sstring))
  21.   (setq n2 (strlen sstr))
  22.   (while (setq m2 (vl-string-search sstr sstring))
  23.     (setq str_1 (substr sstring 1 m2))
  24.     (setq sstring (substr sstring (+ 1 m2 n2)))     
  25.     (if    (/= str_1 "")
  26.       (setq string_list (cons str_1 string_list))
  27.     )
  28.     (if (= (substr sstring 1 n2) sstr)
  29.       (setq string_list (cons "" string_list))
  30.     )
  31.   )
  32.   (if (/= sstring "")
  33.     (setq string_list (cons sstring string_list))
  34.   )
  35.   (reverse string_list)
  36. )
发表于 2013-10-11 14:52:10 | 显示全部楼层
大概的意思就是:打开odcl的文件——在odcl里选择文件另存为——另存的文件以*.lsp做后缀——会得到一个lsp文件,文件的内容是个list表——在你原来的lisp文件中把(dcl_Project_Load "**")这句话替换为(setq project aaaa)及(dcl_project_import project nil nil)这两句,其中aaaa是刚才通过odcl文件得到的lsp文件内的那个表——保存,接下去就是把这个lisp文件按照普通的lisp文件编译就好了,不需要管对话框的那个文件了

这个方法可行
发表于 2021-2-24 15:17:30 | 显示全部楼层
做个记号!学习中!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-17 00:43 , Processed in 0.195899 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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