CADLISP 如何实现命令可以默认参数执行,同时可以按需求修改参数,例如CAD自带的倒角命令?

CADLISP 如何实现命令可以默认参数执行,同时可以按需求修改参数,例如CAD自带的倒角命令

    定义函数:首先,定义一个函数用于执行所需的操作。例如,假设我们要实现一个名为"CUSTOM_FILLET"的自定义倒角命令。

    定义参数:在函数中定义参数,其中某些参数可以设置默认值。例如,倒角命令可能需要两个参数:要倒角的对象和倒角半径。可以将半径参数设置为可选,默认值为1个单位。



    处理参数:在函数内部,使用(setq 变量 值)语句来处理传入的参数。对于可选参数,可以使用条件语句(例如if)来检查是否提供了该参数值。如果未提供,则使用默认值。

    调用函数:现在,可以通过调用函数来执行命令。当不提供参数时,函数将使用默认值执行操作。如果需要修改参数,可以在调用函数时提供新的参数值。

通过以上步骤,你可以实现具有默认参数并允许根据需要修改参数的CADLISP命令,类似于CAD自带的倒角命令。请注意,具体实现可能会因CAD软件版本和相关LISP环境的不同而有所变化。

追问

问题是在写“选择点或修改参数”语句时
点需要用getpoint,修改参数需要用getstring
如何解决这个冲突

温馨提示:答案为网友推荐,仅供参考
第1个回答  2023-06-15
在CAD的LISP编程中,可以通过定义函数的方式来实现自定义命令。对于需要添加默认参数并支持用户修改的情况,可以使用下面两种方法之一来实现:
1. 使用可选参数
在定义函数时,可以使用可选参数来实现默认参数和自定义参数的功能。例如:
```lisp
(defun c:mycommand (/ arg1 arg2)
(setq arg1 (or arg1 10)) ; 如果未指定 arg1,则将其设置为默认值 10
(setq arg2 (or arg2 "default")) ; 如果未指定 arg2,则将其设置为默认值 "default"
(princ (strcat "arg1: " (itoa arg1) ", arg2: " arg2))
)
```
在这个例子中,我们定义了一个 `mycommand` 命令,它包含两个可选参数 `arg1` 和 `arg2`。如果用户没有指定这些参数,则会使用默认值 10 和 "default"。如果用户修改了其中一个或两个参数,则会使用用户定义的值。
2. 使用对话框
除了使用可选参数外,还可以使用对话框来实现同样的功能。当用户运行命令时,可以弹出一个对话框,让用户输入所需的参数值,并且可以默认填写一些值。
例如,在AutoCAD中内置的Fillet命令就使用了这种方法。当用户运行Fillet命令时,会弹出一个对话框,允许用户在默认的选项上修改半径、模式等参数,如果用户不修改,则使用默认选项。
总的来说,这两种方法都可以实现默认参数和自定义参数的功能。如果需要使用默认参数的值,可以使用可选参数的方式。如果需要让用户自行输入相关参数,可以使用对话框的方式。
第2个回答  2023-06-04
在 CADLISP 中支持默认参数并允许用户修改参数的方法,是通过在定义命令时,在形参列表中使用可选参数。
以倒角命令为例,其定义代码可能如下所示:
(defun c:CHAMFER (/ dist ang osm)

(setq dist (getdist "

Distance 1"))

(if (not dist)

(return))

(setq ang (getangle "

Angle"

(/ pi 4.0)))

(if (not ang)

(return))

(setq osm (getvar "osmode"))

(setvar "osmode" 512)

(command "_.chamfer" "_d" dist ang "")

(setvar "osmode" osm)

(princ)

)

在这个例子中,dist和ang是可选的参数。如果用户没有指定这些参数,则会显示一个输入提示,要求用户输入这些参数的值;如果用户不想修改这些参数就直接按回车,对应的默认值则会被使用。
例如,当执行命令 C:CHAMFER 后,会首先询问用户第一个参数——即折线距离(distance),如果用户在这里直接按回车,则使用默认值;如果用户输入了一个值,则将该值作为参数传递给命令操作,并继续询问下一个参数(即折线角度)。 如果用户没有输入此参数,则继续使用默认值。
希望这可以回答您的问题!
第3个回答  2023-06-16
实现命令有默认参数,同时也允许按需修改参数的方法有很多种,下面提供一种可能的实现方法:
以做简单倒角命令为例:
定义一个函数,函数的形参列表包括需要接收的参数,如"起点"、“终点”、“角度”、"半径"等。在函数体内部,对这些参数进行处理,生成倒角实体,最后将其加入到图形数据库中。实例如下:
(defun mychamfer (pt1 pt2 angle rad / line theta pl1 pl2)
(setq line (entmakex (list '(0 . "LINE")
(cons 10 pt1)
(cons 11 pt2))))
(setq theta (/ (* pi angle) 180.0))
(setq pl1 (polar pt1 theta rad))
(setq pl2 (polar pt2 (- pi theta) rad))
(entmakex (list '(0 . "POLYLINE")
'(66 . 1)
(cons 10 pt1)
(cons 11 pl1)
(cons 11 pl2)
(cons 11 pt2))));
在命令函数内,判断输入来源。如果是交互式输入,则提示用户按照默认值进行输入,并且如果用户重新输入任意参数,则使用用户输入值代替默认值;否则,如果不是交互式输入,就直接使用默认值执行。代码示例如下:
(defun c:mychamfer (/ pt1 pt2 angle rad)
(setq pt1 (getpoint "\n指定第一个点: "))
(setq pt2 (getpoint pt1 "\n指定第二个点: "))
(if (not (getvar 'cmdecho))
(setq angle 45 rad 1.0)
(setq angle (getreal "\n请输入倒角角度<45.0>: " 45.0)
rad (getreal "\n请输入倒角半径<1.0>: " 1.0)))
(mychamfer pt1 pt2 angle rad))
上面这个示例中,如果用户不进行任何输入,那么倒角命令会使用默认的角度和半径值,如果用户想修改角度和半径值,则可以在提示符后输入新的值。
希望这个方法可以帮助你实现你想要的功能。
相似回答