CAD怎么自己编lisp程序

CAD怎么自己编lisp程序,第1张

做了隐藏和显示两个命令

我编写的简单,功能不太全你看着用吧

复制下列代码,创建acadlsp放在在CAD安装目录第一层文件夹下,可自动加载啊:

;在命令行输入该命令hidsel,然后选择图元,结果没选的被改到隐藏层

(defun C:hidsel(/ all;所有图元

xs;非隐藏图元

yc;隐藏图元

n nam dat)

(setvar "CMDECHO" 0);关闭命令回显

(command "_layer" "n" "临时隐藏图层" "")(command "_layer" "off" "临时隐藏图层" "")

(setvar "CMDECHO" 1)

(setq all (ssget "x"));选择所有

(setq xs (ssget));选择非隐藏图元

(setq n -1 yc all);运算隐藏图元

(repeat (sslength xs)

(setq n (+ n 1))

(setq nam (ssname xs n));返回第N个图元的名称

(setq yc (ssdel nam yc))

)

(setq N -1);隐藏

(repeat (sslength yc)

(setq N (+ n 1))

(setq nam (ssname yc n));返回第N个图元的名称

(setq dat (entget nam));DAT储存第N个图元数据

(entmod (subst (cons 8 "临时隐藏图层") (Assoc 8 dat) dat));将yc集合隐藏

)

(setq all nil xs nil yc nil n nil nam nil dat nil);清除数据占用内存

(princ)

)

;显示所有图元

(defun c:shoal(/ all n nam dat)

(setq all (ssget "x"));选择所有

(setq N -1);隐藏

(repeat (sslength all)

(setq N (+ n 1))

(setq nam (ssname all n));返回第N个图元的名称

(setq dat (entget nam));DAT储存第N个图元数据

(entmod (subst (cons 8 "0") (Assoc 8 dat) dat));将yc集合隐藏

)

(setvar "CMDECHO" 0)

(COMMAND "PURGE" "LA" "临时隐藏图层" "Y" "Y" "")

(setvar "CMDECHO" 1)

(setq all nil n nil nam nil dat nil);清除数据占用内存

(princ)

)

图层锁定或解锁,代码如下。

;图层锁定及解锁

(defun c:tes ( / ent lay1)

 (vl-load-com)

 (while (and (setq ent (entsel "\n请选择要锁定或解锁的图元")) (setq lay1 (cdr (assoc 8 (entget (car ent))))))

  (w1712251 lay1)

 )

 (princ)

)

(defun w1712251 (lay1 / lay lay1)

 (vlax-for lay (vla-get-layers (vla-get-activedocument  (vlax-get-acad-object)))

  (if (= (vla-get-name lay) lay1)

   (progn

    (if (= (vla-get-lock lay) :vlax-true);如果图层锁定

     (vla-put-lock lay :vlax-false) ;解锁

     (vla-put-lock lay :vlax-true) ;锁定

    )

   )

  )

 )

)

AutoLISP语言是在普通的LISP语言基础上,又扩充了许多适用于CAD应用的功能而形成的一种程序设计语言。它是一种解释性求值语言,速度较慢,难以保密,可用任何文字编辑软件编辑,用纯文本的格式保存。例如:

(setq

i

1);就是代码i值是1

(command

"CIRCLE"

'(0

0)

100);命令在坐标原点绘制半径100的圆。

AutoLISP语言中的一切成分都是以函数形式给出的,它没有语句概念或其他语法结构。执行AutoLISP程序就是执行一些函数,再调用其它函数。例如:

(setq

pt1

(getpoint

"\n请选择圆心插入点"))

(command

"CIRCLE"

pt1

100);命令这个插入点绘制圆,半径为100

AutoLISP把数据和程序统一表达为表结构,故可把程序当作数据来处理,也可把数据当作程序来执行。

例如:一条直线,起点坐标'(0

0),端点坐标'(1000

0),图层为0层,颜色为1红色这个是一条直线的一些数据,怎么执行变为程序代码如下:

(entmake

(list

'(0

"LINE")

'(8

"0")

'(62

1)

'(10

0

0)

'(11

1000

0)))

以上可以直观的看数据,也可以粘贴到AutoCAD的命令行,就绘制出以上要求的直线。

AutoLISP语言中程序运行过程就是对函数求值的过程,是在对函数求值的过程中实现函数的功能。在AutoCAD里面,所有的对象可以看成是由无数的点构成,每个点都有自己的坐标,函数的运行就是计算出这些点的数值,根据得到的数值进行判断。

AutoLISP语言的主要控制结构是采用递归方式。递归方式的使用,使得程序设计简单易懂。例如:

(setq

&k1

(entsel));选择对象

(setq

&k1

(car

&k1));提取图元

(setq

#g1

(entget

&k1));取得属性列表

(setq

c0

(cdr

(assoc

0

#g1)));取得图元名称

以上是一个个的写下来,可以写成以下:

(setq

c0

(cdr

(assoc

0

(entget

(car

(entsel))))));简单易懂

由于autolisp简单,容易,所以上手很快。编写程序后,可以大大的提高绘图效率,有名的天正插件,就是绘图的好帮手。

autolisp程序也有不足的地方,如提取坐标,这个只能在图元属性里面提取,这样的话会有局限性,法向坐标1与-1的坐标值相同,但是图形的位置不同,造成计算坐标的困难,所以提取坐标值,最好使用VLAX函数来提取。

当然可以,有以下思路:

先确定一点

框选文字

对选择的文字进行分析,取得最近的文字

(defun c:sx4 ( / @p1 &kw &k1 #k1 @p2 dis1 i &k2 #k2 @p3 dis2)

 (setq @p1 (getpoint "\n请点击一点"))

 (princ "\n请选择文字")

 (setq &kw (ssget (list (cons 0 "TEXT"))));选择文字

 (if (/= &kw nil);如果有选择了文字

  (progn

   (setq &k1 (ssname &kw 0);取得第一个图元

         #k1 (entget &k1);取得文字属性列表

         @p2 (cdr (assoc 10 #k1));取得文字坐标

         dis1 (distance @p1 @p2);取得文字坐标与点的距离

         i 1

   )

   (repeat (- (sslength &kw) 1);循环判断

    (setq &k2 (ssname &kw i);取得下一个文字

          #k2 (entget &k2)

          @p3 (cdr (assoc 10 #k2))

          dis2 (distance @p1 @p3)

    )

    (if (< dis2 dis1) (setq &k1 &k2) );如果这个文字距离比第一个近就选择这个

    (setq i (+ i 1))

   )

   (setq &k2 (ssadd) &k2 (ssadd &k1 &k2));加入选择集

   (sssetfirst nil &k2);亮显最近的文字

  )

 )

 (prin1)

);程序复制到计算本,以《SX4lsp》命名,加载到AutoCAD就可以找到离点最近的文字

以上就是关于CAD怎么自己编lisp程序全部的内容,包括:CAD怎么自己编lisp程序、求一个cad lisp命令!、Auto cad中的LISP语言是什么有怎样的用途等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9578616.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存