lownote1980 发表于 2022-7-6 10:32:47

基本Lisp

大家好,
我正在编写我的第一个Lisp例程,这是非常基本的。
 
我的目标是拥有一个lisp,当用户定义的点被选中时,它将在某一层上绘制一个点,并在另一层上绘制z值。
 
我有点卡住了,如果有人能给我指出正确的方向,我可能需要一些关于我哪里出错的指导。
 
我在代码旁边加入了注释,以突出我认为自己在编程的内容!
 
提前感谢
 
低音符
廷列夫。lsp

Lt Dan's l 发表于 2022-7-6 10:37:42

(defun C:tinlev (/ pt1 z)
(setq pt1 (getpoint "\nSpecify point on tin: ")
       z   (caddr pt1)
)
(entmake (list (cons 0 "point")(cons 8 "cross")(cons 10 pt1)))
(entmake (list (cons 0 "text")(cons 1 (rtos z))(cons 8 "detail")(cons 10 pt1)(cons 40 0.4)))
(princ)
)

Tharwat 发表于 2022-7-6 10:40:47

这是根据你的结构。。。。

(defun C:tinlev (/ pt1 z)
   (setq pt1 (getpoint "\nPick point on TIN....")
      z(caddr pt1)
   )
   (command "_.-layer" "_s" cross "" "")
   (command "_.point" pt1 )
   (command "_.-layer" "_s" "lev" "" "")
   (command "_.text" "s" "DETAIL" "J" "MR" pt1 "0.4" "0" (rtos z 2 2 ))
(princ)
)

 
任何其他变化都可以问。
 
当做
 
塔瓦特

lownote1980 发表于 2022-7-6 10:45:02

谢谢Dans Legs和Tharwat中尉。
我可以在更基于宏的编程Tharwat中看到逻辑。我将把宏函数与Lisp函数进行比较,找出每个cons括号的作用。
 
亲切的问候
低音符

Tharwat 发表于 2022-7-6 10:47:21

 
请记住,在Lisp编程中不能像使用(dt)而不是(text)那样使用命令缩写
和(-la)而不是(-layer)。。。。。。等等。
 
祝你好运

Lt Dan's l 发表于 2022-7-6 10:51:17

(defun C:tinlev (/ pt1 z)
(setq pt1 (getpoint "\nSpecify point on tin: ")
       z   (caddr pt1)
)
(entmake
   (list
   (cons 0 "point");;create a point
   (cons 8 "cross");;set the layer
   (cons 10 pt1);;set the insertion point
   )
);;set the insertion point
(entmake
   (list
   (cons 0 "text");;create a text
   (cons 1 (rtos z));;content's of text
   (cons 8 "detail");;set the layer
   (cons 10 pt1);;set the insertion point
   (cons 40 0.4);;set the text height
   )
)
(princ)
)

lownote1980 发表于 2022-7-6 10:52:45

谢谢Dan中尉的腿,
网络在工作中崩溃了,但我认为这是编码过程中发生的事情。我无法让AutocAD通过插入点零件识别lisp,但稍后将重试。
 
我确实设法让Lisp用于插入由定义的集合块。csv文件条目,因此所有内容都没有丢失!
廷列夫。txt文件

Tharwat 发表于 2022-7-6 10:55:34

首先,丹中尉在第6号帖子中很好地解释了所有代码。因此,没有必要重新描述它们。
第二,你的文件中有两个偏执缺失。txt,再次查看。

                                                                                        ;picklev.lsp. Monumental as this is Lownote's first LISP application.

(DEFUN C:tinlev (/ pt1 z)                                                                        ;set local variables to be used ie.pt1

(setq pt1 (getpoint "\nPick point on TIN:")                                                         ;set value for pt1 by asking user to define

z (caddr pt1)                                                                                ;set value for variable 'z' is z coord of picked point
            )                                                                                        ;close parenth and end define function

(entmake (list (cons 0 "point")(cons 8 "cross")(cons 10 pt1)))                                         ;makes an point entity (not sure what the list is for), assigns it to layer cross and assigns value of variable z
   
(entmake (list (cons 0 "text") (cons 1 (rtos z))(cons 8 "lev") (cons 10 pt1)(cons 40 0.4)))         ;makes an text entity, gives it the value of z, assigns it to layer lev, (not sure on cons 10 or cons 40)
       (princ)                                                                                 ; exits quietly
       )                                                                                 ;closes last parenth
   


 
当做

Tharwat 发表于 2022-7-6 10:58:29

如果您想添加一个点,我认为最好更改或将Sys Var“pdmode”添加到代码中,以便能够
清楚地看到这一点。
 
当做

David Bethel 发表于 2022-7-6 11:02:54

这里有一些更强大的功能:
 

(defun c: tinelv (/ pt1 z)
(initget 1)
(setq pt1 (getpoint "\nPick Point on TIN:   "))
(setq z (caddr pt1))

(entmake (list (cons 0 "POINT")
                (cons 6 "BYLAYER")
                (cons 8 "CROSS")
                (cons 10 (trans pt1 1 0))
                (cons 39 0.0)
                (cons 62 256)))

(entmake (list (cons 0 "TEXT")
                (cons 1 (rtos z 2 4))
                (cons 6 "BYLAYER")
                (cons 7 (getvat "TEXTSTYLE"))
                (cons 8 "0")
                (cons 10 pt1)
                (cons 11 pt1)
                (cons 39 0.0)
                (cons 40 (getvar "TEXTSIZE"))
                (cons 62 256)))

(prin1))

 
(initget)强制用户输入,否则它将在空输入上崩溃
点图元仅使用WCS点值。(trans)呼叫解决了这个问题
组6、39和62都默认为其当前系统变量状态,因此在调用(entmake)之前,清楚地调用其值或设置其系统变量是一个好习惯
 
与组7、8、40相同,但其设置更难配置。
 
基于任何文本的先验存在,对文本使用(命令)可能很棘手。如果dwg中没有现有文字图元,则需要额外输入1个(高度)
 
使用(命令)需要对层的当前状态进行一些错误检查。即,当层使用冻结或不存在时,不能将其设置为层。
 
 
看到有人试图创建宏,然后寻求帮助,而不是相反,这总是很好的
 
祝你好运-大卫
页: [1] 2
查看完整版本: 基本Lisp