SolidWorks机械工程师网——最大的SolidWorks学习平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

好品数字
好品数字
查看: 713|回复: 4
打印 上一主题 下一主题

请教.lsp文件中代码的意思和作用

  [复制链接]

1

主题

49

帖子

256

金币

堂主

Rank: 4

积分
910

最佳新人活跃会员宣传达人

跳转到指定楼层
楼主
 楼主| 发表于 2022-8-17 12:31:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
(defun c:vt ()
(if     (= 0 (getvar "tilemode"))
        (progn  (setq tm 0)
                (command "mspace")
                (princ "\nSelect layer to UNfreeze on current viewport: "))
        (progn  (setq tm 1)
                (command "layer" "on" "*" "")
                (princ "\nALL ON for Select objects/layer to display :")))
(setq p (ssget))
(if p   (progn
        (setq l 0)
        (setq ck nil)
        (setq c (getvar "clayer"))
        (setq n (sslength p))
        (setq vt "")
        (while  (< l n)
                (setq va (cdr (assoc 8 (setq e (entget (ssname p l))))))
                (if (= c va)(setq ck 1))
                (setq vt (strcat vt va ","))
                (setq l (1+ l)))
        (setq exp(getvar "expert"))
        (setvar "expert" 1)
        (if     (= tm 1)        
                (progn  (setq ml(getvar "users2"))
                        (if (tblsearch "layer" ml)(setq vt(strcat vt ml)))      
                        (if (null ck)(command "layer" "s" va "off" "*" "on" vt "")
                                     (command "layer" "off" "*" "on" vt ""))
                )
                (progn  (command "layer" "s" va "")
                        (command "vplayer" "f" "*" "" "t" vt "" ""))
                )
        (if     (null ck)
                (princ (strcat "\nThe current layer change to : " va)))
        (setvar "expert" exp))
)

(princ))
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享教程|习题|模型|技巧 点赞点赞 拍砖拍砖
SolidWorks机械工程师网
提示:建议使用谷歌浏览器浏览本网站!如单击这里下载!否则,可能无法下载附件文件!(支持大多数版本的谷歌浏览器,支持360和QQ浏览器的极速模式,即谷歌内核模式,使用IE和Edge浏览器,浏览个别网页以及下载文件时,会误报“***不安全”,此时需要单击“继续访问此不安全站点(不推荐)”才可以继续下载,另外,本网站不含任何不安全的文件,已联系微软公司解决,纯属IE和Edge浏览器误报)
回复

使用道具 举报

2

主题

24

帖子

189

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
323
QQ
推荐
发表于 2022-8-19 11:14:01 | 只看该作者
AutoCAD的Diesel语言函数详解及示例解读  在AutoCAD中,DIESEL是Direct Interpretively Evaluated String Expression Language(直接解释求值字符串表达式语言)的缩写,它是一种宏语言,今天隆重推荐。本人多年以前在研究AutoCAD的菜单文件时,看到菜单中有“$”开头的字符串,不明所以,也未进一步研究,直到前段时间研究Diesel语言才终于明白就是它。对于大多数一般AutoCAD使用者而言,Diesel语言相当陌生。实际上,对于能够在字段、菜单和按钮等位置灵活运用Diesel表达式的设计人员而言,将带来很大的便利。
  在Diesel表达式中,'$()'告诉AutoCAD,括号中包含的以下字符串需要由Diesel解释器进行评估。"$"是CAD中Diesel语言形成的宏的标记,而后面的"()"则是表达式语言的标记,跟AutoLisp一样,操作符前置。Diesel表达式也可以嵌套。它可以在菜单、按钮中应用,也可以在“字段”中应用,还可以用来修改状态行。
  Diesel 表达式的函数、错误消息以及应用具体介绍如下,也可以参见Autodesk Knowledge Network官网(虽然为中文,但注意是机器翻译):
  一、DIESEL 函数参考
  所有的函数最多只能包含 10 个参数,包括函数名本身。函数基本形式为:$(函数名, 参数1, 参数2, …, 参数9)。参数若含“[ ]”,说明参数可选。
  1、四则运算
  四则运算包括+(加)、-(减)、*(乘)、/(除)4种。
  $(+, val1 [, val2, …, val9]) ,返回数字 val1 、 val2 、…、 val9 的和。
  $(-, val1 [, val2, …, val9]) ,返回数字 val1 减去  val2 、…、 val9 的结果。
  $(*, val1 [, val2, …, val9]) ,返回数字 val1 、 val2 、…、 val9 的积。
  $(/, val1 [, val2, …, val9]) ,返回数字 val1 除以 val2 、…、 val9 的结果。
  2、比较运算
  比较运算符包括 =(等于)、<(小于)、>(大于)、!=(不等于)、<=(小于或等于)、>=(大于或等于)6种。所有比较运算函数形式均相同,参数个数均为2个,结果为真,返回1,否则返回0。如 $(!=, val1, val2) ,如果数字 val1 和 val2 不相等,则字符串返回 1;否则,返回 0。
  3、逻辑运算
  逻辑运算符包括and(与)、or(或)、xor(异或)3种。所有逻辑运算函数形式均相同,参数均为整数,最多可以有9个参数。如 $(xor, val1 [, val2,…, val9]),返回整数 val1 到 val9 的按位逻辑异或。
  4、函数
  函数包括 angtos、edtime、eq、eval、fix、getenv、getvar、if、index、nth、rtos、strlen、substr、upper 等14个。具体说明如下:
  $(angtos,value[,mode,precision]) 按指定的格式和精度返回角度值。可应用以下 mode值:0(表示度)、1(表示度/分/秒)、2(表示百分度)、3(表示弧度)、4(表示勘测单位)。
  $(edtime, time, picture) 返回基,于指定图片的格式化的日期和时间。
  $(eq, val1, val2) 如果字符串 val1 和 val2 相同,则字符串返回 1;否则,返回 0。
  $(eval,str) 将字符串 str 传给 DIESEL 计算器,并返回计算结果。
  $(fix, value) 通过舍弃小数部分,将实数数字值 截断为整数。
  $(getenv, varname) 返回环境变量 varname 的值。
  $(getvar, varname) 返回具有给定 varname 的系统变量的值。
  $(if,expr, dotrue [, dofalse]) 如果 expr 为非零,则进行计算并返回 dotrue 。否则,进行计算并返回 dofalse 。
  $(index, which, string) 返回以逗号分隔的字符串中的指定成员。which 参数第一项编号为 0;
  $(nth, which, arg0 [, arg1,…, arg7])  计算并返回由 which 选定的参数。如果 which 为 0,则 nth 返回 arg0 ,依此类推。
  $(rtos, value [, mode, precision])  按指定的格式和精度返回实数值。
  $(strlen,string) 返回 string 的字符长度。
  $(substr, string, start [, length])  返回 string 的子串,该子串从字符 start 开始,长度为 length 。字符串中的字符从 1 开始编号。如果省略 length ,则返回所有剩余字符串。
  $(upper, string) 返回 string 按当前地区的规则转换为大写的结果。
  二、DIESEL 错误消息参考
  通常,如果 Diesel 表达式中存在错误,AutoCAD会根据错误的性质,DIESEL 在输出流中嵌入一个错误指示。四种错误提示如下:
  1、$? :语法错误(通常是由于括号不匹配或字符串太长);
  2、 $(func,??) :func 的参数错误;
  3、$(func)?? :未知函数func;
  4、$(++) :输出字符串太长 — 计算被截断;
  三、应用
  1、在菜单或按钮中使用。要在菜单宏中使用Diesel表达式,需在Diesel表达式前加上“$M=”。该字串后面所有内容都发送到DIESEL解释器,结果用作宏。如AutoCAD的 UCS 图标按钮,是一个开关按钮,通过Diesel表达式实现UCSICON图标的打开与关闭切换,其宏定义为$M=$(if,$(and,$(getvar,ucsicon),1),^C^C_ucsicon _off,^C^C_ucsicon _on)。具体解读如下:

  ⑴ $(getvar,ucsicon) 函数为获得系统变量UCSICON的值,当UCSICON图标打开,返回值为1;当UCSICON图标关闭,返回值为0;
  ⑵ $(and, $(getvar,ucsicon),1) 将$(getvar,ucsicon)返回值与1求逻辑与,当返回值为1,该逻辑与结果为真;当返回值为0,该逻辑与结果为假;
  ⑶ $(if,$(and,$(getvar,ucsicon),1),^C^C_ucsicon _off,^C^C_ucsicon _on) 该条件判断函数,当逻辑与为真时,执行 “^C^C_ucsicon _off” 将已打开的UCSICON图标关闭,当逻辑与返回假时,执行 “^C^C_ucsicon _on” 将已关闭的UCSICON图标打开;
  ⑷ 命令中 ^C 是特殊字符,功能是取消活动的命令或命令选项,相当于按一次 Esc 键。两个^C 是确保终止上一个命令。
  有编程经验的设计人员,对用好Diesel表达式有优势。当然,Diesel语法简单,对于一般设计人员而言,也可以深入研究Diesel函数及其各种用途,让工作省时省力。欢迎一起探讨!



SolidWorks机械工程师网
提示:建议使用谷歌浏览器浏览本网站!如单击这里下载!否则,可能无法下载附件文件!(支持大多数版本的谷歌浏览器,支持360和QQ浏览器的极速模式,即谷歌内核模式,使用IE和Edge浏览器,浏览个别网页以及下载文件时,会误报“***不安全”,此时需要单击“继续访问此不安全站点(不推荐)”才可以继续下载,另外,本网站不含任何不安全的文件,已联系微软公司解决,纯属IE和Edge浏览器误报)
回复 支持 1 反对 0

使用道具 举报

1

主题

36

帖子

100

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
218
QQ
板凳
发表于 2022-8-19 11:07:41 | 只看该作者
.lsp是AutoCAD软件的Lisp脚本文件.当打开AutoCAD图形dwg文件时会自动运行相同文件夹中的名为acad.lsp的脚本文件。这使得.lsp文件成为计算机病毒在装有AutoCAD软件的电脑之间传播的一种方式。
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

2

主题

30

帖子

192

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
334
QQ
地板
发表于 2022-8-19 11:17:17 | 只看该作者
DIESEL(DirectInterpretivelyEvaluatedStringExpressionLanguage)是指“直接解释求值的字符串表达式语言”。使用的DIESEL可以控制AutoCAD系统变量MODEMACRO的值,也可用来编写菜单宏,但只能用来处理字符串。
DIESEL的宏表达式格式如下:
$(字符串函数名,函数参数1,函数参数2…)
其中,根据函数的不同,函数参数的个数可以为零或者多个,但最多为9个。在宏表达式的不同元素之间,不可以有任何空格。所有的宏表达式都必须以“$”符号开头。
可以在DIESEL中使用的函数如表35-1所示。
表35-1DIESEL函数一览表

函数名

格式

说明

$( ,val1,val2,…)

返回字符串为全部数字之和



$(-,val1,val2,…)

返回字符串为val1减去其他所有数字之差

*

$(*,val1,val2,…)

返回字符串为全部数字之积

/

$(/,val1,val2,…)

返回字符串为val1除以其他所有数字之商

=

$(=,val1,val2)

如果两个数字val1和val2相等,则返回字符串为1,否则为0

<

$(<,val1,val2)

如果数字val1小于数字val2,则返回字符串为1,否则为0

>

$(>,val1,val2)

如果数字val1大于数字val2,则返回字符串为1,否则为0

!=

$(!=,val1,val2)

如果两个数字val1和val2不相等,则返回字符串为1,否则为0

<=

$(<=,val1,val2)

如果数字val1小于等于数字val2,则返回字符串为1,否则为0

>=

$(>=,val1,val2)

如果数字val1大于等于数字val2,则返回字符串为1,否则为0

and

$(and,val1[,val2,…,val9])

返回整数val1~val9的按位逻辑与

angtos

$(angtos,value[,mode,precision])

按指定的格式和精度返回角度值(注1)

表35-1DIESEL函数一览表

edtime

$(edtime,time,picture)

返回基于指定图片的格式化的日期和时间(注2)

eq

$(eq,str1,str2)

如果两个字符串str1和str2相同,则字符串返回1;否则返回0

eval

$(eval,str)

将一个字符串传给DIESEL计算器,并返回计算结果

fix

$(fix,value)

返回一个实数数字的整数部分

getenv

$(getenv,varname)

返回环境变量varname的当前值;对于未定义的环境变量,则返回空字符串

getvar

$(getvar,varname)

返回系统变量varname的值

if

$(if,expr,dotrue[,dofalse])

如果expr非零,则计算并返回dotrue的值;否则,计算并返回dofalse的值

index

$(index,which,string)

返回由which选定的、以逗号分隔的字符串中指定的成员,其中第一项编号为0

linelen

$(linelen)

返回用户所能见到的最长状态栏的字符长度。

nth

$(nth,which,arg0[,arg1,…,arg7])

计算并返回由which选定的参数的值,其中第一项编号为0

or

$(or,val1[,val2,…,val9])

返回整数val1~val9的按位逻辑或

rtos

$(rtos,value[,mode,precision])

按指定的格式和精度返回实数值

strlen

返回字符串的字符长度

substr

$(substr,string,tart[,length])

返回字符串string的子串,该子串从字符start开始,长度为length。

字符串中的字符从1开始编号;如果length被省略,则返回从字符start开始、到string末尾为止的子串

upper

$(upper,string)

返回字符串string的大写

xor

$(xor,val1[,val2,…,val9])

返回整数val1~val9的按位逻辑异或

注1该函数根据参数“mode”和“precision”指定的格式,给定的参数“value”作为角度值进行编辑,如果参数“mode”和“precision”被省略,则使用由“unites”命令指定的当前值。参数“mode”的取值及其含义见表35-2。
表35-2“mode”的取值及其含义

Mode值

字符串格式

0


1
度/分/秒

2
百分度

3
弧度

4
勘测单位

注2该函数返回基于指定图片的格式化的日期和时间。
其中,“time”参数为给定的AutoCAD日期,通常使用函数“$(getvar,date)”来获取;
“picture”参数由日期和时间的特定表示法替代的格式短语组成。格式短语的定义如表35-3所示。所有不能解释为格式短语的字符将被完整地复制到函数返回结果中。
表35-3“edtime”函数格式短语定义

格式

输出示例

格式

输出示例

D

9

H

5

DD

09

HH

05

DDD

Tue

MM

47

DDDD

Tuesday

SS

17

^M

6

MSEC

506

MO

06

AM/PM

AM

MON

Jun

am/pm

pm

MONTH

June

A/P

P

YY

01

a/p

p

YYYY

2001

例如以如下格式使用该函数:下例使用上表中的日期和时间。
$(edtime,$(getvar,date),DDD”,”DDMONYYYY-H:MMam/pm)
它可能的返回结果为:
Tue,9Jun2001-5:47pm
注意“picture”参数中逗号必须放在引号中,否则它将被当作参数分隔符。
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

4

主题

24

帖子

549

金币

堂主

Rank: 4

积分
807
QQ
5#
发表于 2022-8-19 11:24:35 | 只看该作者

   经典案例图书
DIESEL表达式的调试.doc (30.5 KB, 下载次数: 48, 售价: 5 金币)
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭 卷起
关闭 卷起

手机版|小黑屋| GMT+8, 2024-5-6 14:36 , Processed in 0.136394 second(s), 38 queries .

SolidWorks机械工程师网 ( 鲁ICP备14025122号-2 ) 鲁公网安备 37028502190335号

声明:本网言论纯属发表者个人意见,与本网立场无关。
如涉版权,可发邮件: admin@swbbsc.com

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