找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: leochen

[讨论]:如何把lsp程序加入dwg文件中,并可以自动运行?

[复制链接]
发表于 2004-4-19 12:00:46 | 显示全部楼层
lsp文件已经下载了,不过还是没弄明白怎么使用?
图完工后,运行这个lsp,保存图形后,在其他机器上打开该dwg文件就会将自己编写的lsp写到那部机器中吗?
可以详细的讲解一下原理吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

发表于 2004-4-19 14:24:15 | 显示全部楼层
转贴。。。。。。
先给不了解LSP的同志稍微铺垫一下。

ACAD有个很大的优点,就是开放性,它有很多开放的接口,这给用户自定义以及第三方二次开发提供了极大的方便。ACAD用户化门槛不算高,只要有兴趣、有些耐心,你总可以亲自动手不同程度地进行自定义。

马上要讨论的是关于启动自动化的AUTOLISP接口,这个接口现在被人用来搞了点恶作剧。

在ACAD启动或开图时会被自动加载的LSP文件
浅见,这种LSP包括:
ACAD.LSP,新装的纯ACAD里面没有这个文件。一般由用户自己编写或者第三方软件提供,放在ACAD目录或SUPPORT子夹都可以。
ACADR$.LSP,$是系统版本号,比如ACADR14.LSP,在SUPPORT子夹。
还有一种先不说了.

加载时自动运行的由defun函数定义的函数名
就一种,S::STARTUP,它和ACAD.LSP配套,同时不支持其他扩展名为LSP的文件
可能是因为这个原因,目标被定位于ACAD.LSP? 不知道了,其实不一定非用S::STARTUP,用了那就说明这位大虾是个追求完美的人~

铺垫好了,来看看这个病毒acad.lsp的作用~

{00.定义自动函数S::STARTUP

{01.获取CMDECHO变量,改设为0,一般程序最后会再改回去,
目的是悄悄地进村打枪地不要.大家都喜欢这么干 }

{02.通过搜索base.dcl文件,获取ACAD安装路径(support子夹) }

{03.获取菜单文件完整路径和名称,后来又没用~}

{04.获取当前图形文件完整路径和名称,截取当前工作路径}

{05.获取当前首选ACAD.LSP文件完整路径和名称,截取其路径}

{06.预设程序标记变量LSPBJ为0,意思是假设还没得手}

{07.用只读方式打开support中的ACAD.LSP,如文件不存在则建立同名文件
逐行检查此ACAD.LSP文件内容,一旦发现某行开头为(load "acadapp")
则设程序标记变量LSPBJ为1,表示已经得手过
只读任务结束,关闭文件}

{08.如果找到的ACAD.LSP路径和当前工作路径不同,
并且不在ACAD\support里面,则
{如果LSPBJ为0,也即尚未得手,那么
就在ACAD\support\acad.lsp文件末尾添加(load "acadapp")(princ),
即ACAD启动或开图时自动加载acadapp.lsp并隐蔽命令行反应。
然后同路径创建acadapp.lsp文件,作为刚改过的acad.lsp的备份. }
{如果LSPBJ为1,即已得手,且当前绘图不是未命名的新绘图任务,则
用复写ACAD\support\acadapp.lsp的方式
在当前工作路径创建acad.lsp. }
}
;注:到此为止,ACAD启动时必搜的程序文件路径里面都放好了此acad.lsp!

{09.程序开始做真正让大家不愉快的事情,
它取消了3个系统预设的命令名: 不止explode, 还有xref和xbind
可能因为Xref和xbind不是每个人都常用,所以好象报案的不多,
而explode几乎是所有用ACAD画图的人都难以避免使用的,就显得很典型}

S::STARTUP函数定义结束}

还没完,前面取消了那3个命令的定义,现在要重新定义它们,幸好这位大虾良心不算坏,只是让命令不起作用或者改成其他加法命令,并没写成破坏性函数或OS命令

EXPLODE的新功能和交互情况是:
command: EXPLODE
Seltct objects: 200 found
Select objects:
200 was not able to be explode
command:

随你怎么选,它就是说炸不了

然后XREF和XBIND这对难兄难弟双双被改成了insert,交互响应制作很不精良,根本就是空白,可能大虾忽然觉得倦了吧.

最后,它还重新定义了BONUS和EXPRESS TOOLS工具集里面提供的BURST命令,其实是个外部函数(c:burst)
BURST原来的用途是"Explode Attributes to Text",把属性文本炸成text类物体
被重新定义后这样:
command: BURST
BURST----将图块中的文字炸开后成为实体
Select objects: 200 found
Select objects:
command:

完了,全完了. 就这么完了,还是啥都不干,连通知也免了.
…… ……

卧虎藏龙之地,小的献丑了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-19 16:30:01 | 显示全部楼层
谢谢tuger
找到网址了
http://www.68d.net/article2.0/ReadNews.asp?NewsID=233
还有反病毒软件下载:http://www.68d.net/download/soft.asp?id=37
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-20 08:29:28 | 显示全部楼层
这并没有将LSP镶入DWG文件中!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-21 18:20:03 | 显示全部楼层

请教楼主一个问题!!!!!!!!!

请问一下楼主,autolisp语言能与foxpro连接吗!!!!
如果能,怎么实现啊!!!!
呵呵,在下谢谢拉!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-23 08:39:33 | 显示全部楼层
转贴-----------------------------------------------

AutoCAD 处理非图形数据的高招--图形词典
作者:FAW/Autodesk CTC 陈伯雄  

一、概论

大家知道,图形数据库是AutoCAD在图形生成和编辑中使用的数据库。它存放的主要内容是所生成图形的几何信息和其它有关信息,以 *.DWG文件存盘。 这个数据库的结构允许用户建立自己的“非图形信息”数据,以便在一个DWG中封装尽可能完整的设计数据。比如标了一个粗糙度符号(图形信息),再组合上粗糙度的值(非图形信息)。想在将来从该图中顺畅的提取这类信息,供工艺设计之用,就必然有建立非图形数据的要求。类似的有:元件型号、地块面积等。 笔者认为,无论是对 AutoCAD,还是其他的 CAD 软件,都应当提出一个最基本的,也是最根本的要求:有能力独立建立设计信息数据库,如果你是个真正再进行设计的工程师,而不仅仅是个绘图员。 因此,对DWG的比较准确称呼应当是:设计信息数据库。 图形数据的建立是在绘图过程中,由 AutoCAD 按照你的操作,填充有关的数据库内容。可见,这些内容具体结果如何,与你的绘图过程有直接联系。所以,打印输出结果相同的图样,数据结构可能存在这种大的差别。如果你是个真正再进行设计的工程师,而不仅仅是个绘图员,这个差别对你来说将是十分重要的。从 CAD 本意来说,看起来正确的图形,并不一定具有正确的图形数据。 非图形数据是那些无法用图形表达的设计信息。例如:计算过程和结论、设计构思说明、局部结构特殊的工艺要求、泵阀的参数、甚至是从属于这个图形对象的应用程序等等。这种数据的建立,以前主要是用“属性”和“扩展的对象数据库”。但是,属性只能容纳字符类型数据,扩展的对象数据又有16K数据大小的限制,使用起来有一点不痛快,不能全面覆盖非图形数据的操做要求。另外,老的非图形数据处理功能,必须将这些数据关联到、甚至放置到某个图形对象上,不能对整个图形文件添加非图形数据,这也比较遗憾。 在 Visual LISP 中,新的“图形词典”功能,彻底解放了用户设计数据&#0;&#0;非图形数据的处理限制,是Autodesk在数据库结构上的有一个重大突破。图形词典*的主要特点是: 可用数据类型相当丰富,几乎所有的 AutoLISP 能处理的数据都可以使用。 相关程序编写相当简单,你怎么想,就怎么写。 数据量可以相当大。我曾经给一个圆附加了6兆大小的非图形数据。 可以与图档相关(附加到图档),也可以与某条图线相关(附加到对象上)。 在一个图档中,可以并存许多个图形词典,在一个图形词典中,可以有许多纪录。 非图形数据提取和定义简单明晰。  相关的函数有:(VLAX-LData-Put VLA对象 词典关键字 数据) 向指定的图形词典中加入用户数据。 (VLAX-LData-List VLA对象) 从指定的图形词典中列出用户数据。 (VLAX-LData-Get VLA对象 词典关键字 [默认数据] [独立变量]) 从图形词典中提取用户数据。 (VLAX-LData-Delete VLA对象 词典关键字 [独立变量]) 从图形词典中删除用户数据。 (VLAX-LData-Test 用户数据) 判断<用户数据>是否可以在图形词典中存取

二、基本的程序写法

① 给整个图形添加或提取非图形数据 这样的数据保存在当前图形中,依附于当前图形文件,并随图保存。 典型程序描述如下: (VLAX-LData-Put "UserDict" "UKey1" ‘(1 2 3 4.5 "用户")) 其中: "UserDict" 字串确定了自定义图形字典的名称。 "UKey1" 字串确定了数据项的操作关键字 ‘(1 2 3 4.5 "用户") 是具体的数据 实际上,同一个图形词典中可以含有若干个具体数据,例如: (VLAX-LData-Put "UserDict" "UKey1" '(1 2 3 4.5 "用户")) (VLAX-LData-Put "UserDict" "UKey2" "字符数据类型") (VLAX-LData-Put "UserDict" "UKey3" 3.1415926) 提取这样的数据是相当简单的,只要知道了图形字典和数据的关键字即可: (SetQ udata1 (VLAX-LData-Get "UserDict" "UKey1")

② 给某个图形对象添加或提取非图形数据的方法 与上边的方法仅有一个不同:在图形词典名的位置,写上转换成VLA对象的对象名: (SetQ en (Car (EntSel "\n要加入用户数据的图形对象: ")) en (VLAX-Ename->VLA-Object en) ) (VLAX-LData-Put en "UKey2" "用户数据") (SetQ en (Car (EntSel "\n要提取用户数据的图形对象: ")) en (VLAX-Ename->VLA-Object en) udata2 (VLAX-LData-Get en "UKey2") )

③ 给某个图形对象添加或提取非图形数据的例程 (Defun C:TDPut () (SetQ en (Car (EntSel "\n要加入用户数据的图形对象: ")) en (VLAX-Ename->VLA-Object en) ) (VLAX-LData-Put en "UKey2" "用户数据2") ) (Defun C:TDGet () (SetQ en (Car (EntSel "\n要提取用户数据的图形对象: ")) en (VLAX-Ename->VLA-Object en) ) (SetQ udata2 (VLAX-LData-Get en "UKey2")) )

④ 给一个图形对象添加 AutoLISP 表达式 给一个图形对象添加 AutoLISP 表达式,就是将这些表达式“附着”在指定的图形对象上,随对象保存。之后用简单的函数,就可以激活这些表达式,并且执行他们。 例如下面的例程: (Defun C:TDPut1 () (SetQ en (Car (EntSel "\n要加入应用程序(1)的图形对象: ")) en (VLAX-Ename->VLA-Object en) a (GetReal "\nReal: ") ) (VLAX-LData-Put en "UKey1" a) (VLAX-LData-Put en "UKey2" '(Alert (StrCat "这个数的平方=" (RToS (* a a)))) ) ) (Defun C:TDPut2 () (SetQ en (Car (EntSel "\n要加入应用程序(2)的图形对象: ")) en (VLAX-Ename->VLA-Object en) a (GetString "\nString: ") ) (VLAX-LData-Put en "UKey1" a) (VLAX-LData-Put en "UKey2" '(Alert (StrCat "附加说明: " a))) ) (Defun C:TDGet () (SetQ en (Car (EntSel "\n要运行应用程序的图形对象: ")) en (VLAX-Ename->VLA-Object en) ) (SetQ a (VLAX-LData-Get en "UKey1")) (Eval (VLAX-LData-Get en "UKey2")) ) 对不同的图形对象执行 C:TDPut1或C:TDPut2 函数,就可以将有关数据和程序表达式附着在对象上。在以后的使用中,只要用公用的 C:TDGet 函数指定这个对象,就能自动执行附着的程序表达式,从而产生不同的处理结果。 可见,这是 AutoLISP 表达式一种新的定义和保存模式。用一个公用的函数,可以激活不同对象上所附加的不同的表达式,完成不同的操作。在某种意义上讲,这样的程序运行结果,也是一种“对象反应器”,却没有对象反应器程序中的许多限制。同时,将应用程序“封装”在对象中,或者“封装”在图档中,无论如何是个有趣的、也是有实用价值的技术方法。

⑤ 测试用户的数据是否可以在图形词典中存取 并不是所有的 AutoLISP 数据都可以被 VLAX-LData-xxx 函数操作的。应当使用 (VLAX-LData-Test) 函数,测试指定的数据是否可以放到图形词典中、或者添加给图形对象,并且能够被提取。(由于支持文档作者的失误,在 AutoCAD 2000 中这个函数的功能被描述成:“确定数据是否能越任务边界保存”,这是不准确的) 例如: (SetQ lin (EntMake '((0 . "LINE") (10 1 1 1) (11 20 20 20))) fnm (Open "mmm.out" "W") ) (Defun fun () (Alert "LData...") (List 1 2 3)) 这样,下列表达式将返回T:

(VLAX-LData-Test 10)(VLAX-LData-Test 10.01) (VLAX-LData-Test 'fun) (VLAX-LData-Test "AutoCAD2000") (VLAX-LData-Test lin) (VLAX-LData-Test (list 1 "a" 'fun lin)) (VLAX-LData-Test (Cons 8 "Layer1"))  可见,大多数数据类型都可以在图形词典中使用,甚至是函数、对象数据表。但是,下列表达式将返回nil: (VLAX-LData-Test fun)(VLAX-LData-Test fnm)   因为,函数应当在它的名称前缀一个“’”,才能区别于变量名;而文件操作符不能在图形词典中使用。 三、在 AutoCAD R14 和 AutoCAD 2000 中应用的区别 Visual LISP 在 AutoCAD R14 中,是贴在 AutoCAD 上的一个程序包。图形词典函数属于 Visual LISP 的扩展函数,不是 AutoLISP 的标准函数,因此,原则上不能脱离 Visual LISP 使用这些函数,即使将程序编译成了 ARX/FAS/VLX。 实际上,我们可以用一套“特殊”的方法,在 AutoCAD R14 中使用这样的程序: 在 Visual LISP 中生成、调试成功有关程序。 将程序编译成 ARX,注意下面的事项: 成员文件中要包括 VLARTS.LSP 或者 VLRTS.LSP,这两个程序可以在 Visual LISP 的安装路径下找到。也可以不包括上述程序,而是在程序头部加入下面的描述: (Defun VL () (VL-Init)) 使编译参数: ARX with ActiveX Automation 有效。不要管在程序中是否真的用了 ActiveX。 在 AutoCAD R14 中用 ARXLoad 命令加载这个程序。 使用这个程序。 再次编译某程序,如果曾经加载过,先要用 ARXLoad 将这个ARX 程序卸载。  这个问题在 AutoCAD 2000 中已经圆满解决了,由于是真正嵌入了 Visual LISP,只要在程序中事先引用了 (VL-Load-Com) 函数,所有的扩展函数都能在 AutoCAD 下正确引用。本文中的例程,在 AutoCAD R14 中应当通过 Visual LISP 加载,而在 AutoCAD 2000 中就没有什么限制了。   四、应用实例 打开一个图形,自动装入这个图形自用的应用程序,就会最精确地实现 AutoCAD 的用户化和专业化。用图形词典就能顺利而简单地实现这个要求。由于 AutoCAD 2000 嵌入了 Visual LISP,可以顺利使用扩展函数,下面的程序在 AutoCAD 2000 中才能正确运行。 运行下面的程序,将专用应用程序作为图形词典数据添加到当前图中。 (VL-Load-Com) (Defun C:AppL () (SetQ apl '()) (While (SetQ apn (GetFileD "选定要加载的应用程序..." "" "lsp" 4)) (SetQ apl (Cons apn apl)) ) (VLAX-LData-Put "UserApp" "PName" (Reverse apl)) (Alert "当前的应用程序名已经纪录到图档之中\n可以存盘了...") (PrinC) ) 将这个图存盘 将下面的程序段,添加到 ACAD.LSP或者*.MNL中。 (VL-Load-Com)  (If (SetQ apl (VLAX-LData-Get "UserApp" "PName"))(ForEach apn apl (Load apn)) ) 这样,每当打开这个图形时,将会自动执行一次3〉中的表达式,搜索图形词典中的相关数据(UserApp 中的 Pname),并且分别加载这些程序。这样,专业设计图形就总是与它们的专业支持程序捆在一起,自动加载。 综上可见,VLAX-LData-xxx 族函数,是在向对象和图形文件添加自定义的属性。这说明Visual LISP也具有相当程度的ObjectARX编程能力。因此,AutoCAD用户现在可以充分利用 Visual LISP 开发相当完整和专业化设计功能相当强大的应用程序。

作者:FAW/Autodesk CTC 陈伯雄
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-23 10:32:31 | 显示全部楼层
哪它是不是可以代替扩展数据呢?
扩展数据还有必要用吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2004-4-23 15:19:46 | 显示全部楼层
我感觉扩展数据是针对于R14以前的版本的,对于R2000后VLISP都可以用图形词典,而且方便,不易出错!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-23 17:30:25 | 显示全部楼层
引自
http://www.cadstudy.net/show.asp?id=1351
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-24 08:39:07 | 显示全部楼层
镶嵌的程序如何自动运行?(不要借助于任何其他程序)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-8 17:50:52 | 显示全部楼层
VISUAL LISP程序设计--技巧与范例
这本书华储网余书出清,一本不到30元
有兴趣的可到特价书区选购
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-8 19:24:22 | 显示全部楼层
看了21楼楼主转贴的陈伯雄老师的“AutoCAD 处理非图形数据的高招--图形词典”文章,我觉得按此思路还是不能解决1楼楼主所提的问题!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-9 07:16:01 | 显示全部楼层
9494
讨论了一年,一句话:没解决问题。^_^
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-28 05:26 , Processed in 0.558072 second(s), 49 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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