Lisp不工作
我有一个很快的问题,为什么我的Lisp程序程序不起作用。运行以下代码时,我收到错误“error.bad function.0.5”:奇怪的是,这应该是一个非常简单的例行程序,我不明白为什么我的0.5距离不起作用。 快速浏览后,更改:
(command "._OffsetFeature" ("0.5" ss pause "0.5" ""))
收件人:
(command "._OffsetFeature" "0.5" ss pause "0.5" "") 谢谢李,我知道这是一个愚蠢的错误。最近我花了很多时间在visual lisp中写作,现在我在AutoLISP中犯了愚蠢的错误哈哈。 因此,当我在这方面做得更多的时候,我决定让用户能够更改其偏移的距离并升高路缘。我很好奇如何制作一个ssget函数,它不只是说“选择对象”,而是做“选择对象或[设置]”,类似于命令行版本对许多不同命令的工作方式。 所以我决定使用entsel函数,尽管它会产生更复杂的if语句。我的问题是,当我输入设置时,我会得到“错误:错误参数类型:consp”设置,如果我选择一条要素线,则表示未选择任何内容。我想知道这是否与我在设置中使用getreal有关,但我不知道为什么我选择要素线时它无法识别。
(defun CheckorGetSurface ()
(while
(not
(and
(setq SurfaceDefaultAdd
(car
(entsel
"\rSelect the Main Surace you to be the default: "
)
)
)
(= "AECC_TIN_SURFACE"
(cdr (assoc 0 (entget SurfaceDefaultAdd)))
)
)
)
)
)
(defun c:makeparkingcurb (/ ss ss1 *error*)
(defun *error* (msg)
(if (not
(member msg '("Function cancelled" "quit / exit abort"))
)
(princ (strcat "\nError: " msg))
)
(princ)
)
(if (not SurfaceDefaultAdd)
(CheckorGetSurface)
)
(initget 1 "Settings")
(setq ss
(car
(entsel
"\n Select the feature line you want to offset : "
)
)
)
(if ss
(if (= ss "Settings")
(progn
(setq offsetdist (cond ( (getreal "\nOffset Distance <0.5>: ") ) ( "0.5" )))
(setq offsetheight (cond ( (getreal "\nOffset Distance <0.5>: ") ) ( "0.5" )))
)
)
(progn
(setq entlist (entget ss))
(if (= "AECC_FEATURE_LINE" (cdr (assoc 0 entlist)))
(progn
(command "._OffsetFeature" offsetdist ss)
(princ "\nSpecify side to offset: ")
(command pause offsetheight "")
(setq ss1 (entlast))
(command "._AddSurfaceBreaklines" SurfaceDefaultAdd ss1 "")
)
)
(princ "\nNot a feature line")
)
)
(princ "\nNothing selected")
(princ)
) 你的代码有几件事有点奇怪。如果我能提几个建议。
1.如果您使用的是实体名称,可能您的setq ss应该是setq ent。这使阅读您的代码的人能够快速识别您使用的是实体名称,而不是选择集。
2.Offsetdist和OffsetEight默认不设置。如果我第一次运行这段代码,并且没有运行设置,那么offsetdist为零。
3.您应该循环原始提示,这样,如果您进行设置,它会将您带回原始提示。
4.ss1也应该是ent1。否则,看起来ss1应该是一个选择集,而不是。 我喜欢使用getcfg和setcfg来存储和检索我的程序默认值。我还将创建一个处理设置的子例程和一个处理选择的子例程。通过这种方式,您可以从设置的末尾调用选择,以提供我所描述的循环。 Civ3D中最难看的事情之一是关闭选择等,所以我写了一个工具栏界面和一个拨号选择保存到工具空间,所以在你的代码上面的拨号将出现允许默认曲面设置的好处是,如果你只有一个曲面,它将设置为defualt,而不需要选择。如果您查看图像,可以看到轮廓作为工具栏项,包括黑色sq关闭的三角形。欢迎使用代码。拉链里有自述文件。
Chtourstolbar。拉链
(entsel)在选择关键字时返回字符串;在这种情况下,(car(entsel))将出错,因为(car)仅在列表上操作。 Hippe013,非常感谢你的建议。我试图将它们合并到代码中(我忘了添加以检查变量是否已创建,谢谢!)。比格尔,那个工具栏太棒了!李,谢谢你提供关于恩塞尔和汽车的信息。然而,我一直在搞乱代码,现在我得到了错误”;错误:错误的COND语法:(ENT((…)( ... ) ( ... )) (( ... ) ( ... )) (( ... ) ( ... ) ( ... )))“而且代码不会加载。我对LISP还是很陌生,所以我不知道如何在无法加载的情况下调试代码。我的新代码如下:
(defun CheckorGetSurface ()
(while
(not
(and
(setq SurfaceDefaultAdd
(car
(entsel
"\rSelect the Main Surace you to be the default: "
)
)
)
(= "AECC_TIN_SURFACE"
(cdr (assoc 0 (entget SurfaceDefaultAdd)))
)
)
)
)
)
(defun c:makeparkingcurb (/ ent ent1 *error*)
(defun *error* (msg)
(if (not
(member msg '("Function cancelled" "quit / exit abort"))
)
(princ (strcat "\nError: " msg))
)
(princ)
)
(if (not SurfaceDefaultAdd)
(CheckorGetSurface)
)
(if (not *offsetdistans*)
(setq *offsetdistans* 0.5)
)
(if (not *offsetheightans*)
(setq *offsetheightans* 0.5)
)
(setq whilestop t)
(while whilestop
(initget 1 "Settings eXit")
(setq ent (entsel
"\n Select the feature line you want to offset : "
)
)
(cond
ent
((= ent "Settings")
(setq *offsetdistans*
(cond
((getreal "\nOffset Distance" "" (*offsetdistans*) ":")
)
(*offsetdistans*)
)
)
(setq *offsetheightans*
(cond
((getreal "\nOffset Distance" "" (*offsetheightans*) ":")
)
(*offsetheightans*)
)
)
)
((= ent "Settings")
(setq whilestop nil))
((setq entlist (entget ent))
(cond (= "AECC_FEATURE_LINE" (cdr (assoc 0 entlist)))
(command "._OffsetFeature" *offsetdistans* ent)
(princ "\nSpecify side to offset: ")
(command pause *offsetheightans* "")
(setq ent1 (entlast))
(command "._AddSurfaceBreaklines" SurfaceDefaultAdd ent1 "")
)
(princ "\nNot a feature line")
)
)
)
(princ "\nNothing selected")
(princ)
)
页:
[1]
2