Happy Hobbit 发表于 2022-7-5 18:34:19

如果线型存在

我正在编写一个lisp,它调用来自Acadiso的自定义线型。林
 
线型在大多数用户计算机上不存在,但在某些计算机上存在。
 
我想在代码中输入如下内容:
 

(If (linetype "DASHED2.5" exists)
(progn
(command "._linetype" "_load" "DASHED2.5" "Acadiso.lin" ""); then
(command "-layer" "M" "BOX" "L" "DASHED2.5" "" "LW" "0.5" "" "C" "6" "" "" )
);end prong
(progn
((command "._linetype" "_load" "hidden2" "Acadiso.lin" ""); else
(command "-layer" "M" "BOX" "L" "hidden2" "" "LW" "0.5" "" "C" "6" "" "" )
);end progn
)
);end if

 
线型“DASHED2.5”优于标准线型“hidden2”

Lee Mac 发表于 2022-7-5 18:41:39

请参阅我的Load Linetypes功能。

Happy Hobbit 发表于 2022-7-5 18:44:14

 
你好,李
 
这需要添加很多代码
 
我的Lisp程序已经超过260行了,我希望能再短一点
 
另外,我不完全理解你的代码,因为它没有注释

Lee Mac 发表于 2022-7-5 18:47:36

如果要测试激活图形中是否已定义线型,请使用:
(if (tblsearch "ltype" "YourLinetypeHere")
   ...
)
“我的加载线型”功能包括两个选项,用于测试线型是否在*中定义。lin文件:LM:ltdefined-p函数将读取一个。具有给定文件名的lin文件,如果在文件中定义了具有提供名称的线型,则返回T。
 
或者,表达式:
(vl-some
'(lambda ( lin )
       (vl-catch-all-apply 'vla-load (list ltc typ lin))
       (tblsearch "ltype" typ)
   )
   lst
)
将在所有的集合上迭代。在所有支持文件搜索路径(已分配给变量“lst”)中找到lin文件,并将尝试从每个文件加载目标线型,如果成功,则停止。

Happy Hobbit 发表于 2022-7-5 18:49:28

Sooo,使用第一个选项如下:
 
(defun c:test2 ()
(setvar "Expert" 3)
(if (tblsearch "ltype" "noddy")
(progn
      (command "._linetype" "_load" "Noddy" "Acadiso.lin" "")
      (command "-layer" "M" "Big-Ears" "L" "Noddy" "" "LW" "0.5" "" "C" "6" "" "" )
(princ "\n Linetype Noddy Loaded")       
)
(progn
      (command "._linetype" "_load" "DASHED2.5" "Acadiso.lin" "")
      (command "-layer" "M" "Big-Ears" "L" "DASHED2.5" "" "LW" "0.5" "" "C" "6" "" "" )
(princ "\n Linetype DASHED2.5 Loaded")
)
)
(setvar "Expert" 3)
(princ)
)
 
这似乎奏效了!
 
我希望我能更好地理解第二种选择
 
附言
 
实际上,我没有一个叫做Noddy的线型,这是一种将if语句转到“else”的好方法

Lee Mac 发表于 2022-7-5 18:53:13

请注意,表达式(tblsearch“ltype”“YourLinetypeHere”)将仅测试给定线型是否在活动图形中定义,而不会检查给定线型是否在中定义。lin文件(这似乎是您想要测试的,因为您随后将加载线型)。

Happy Hobbit 发表于 2022-7-5 18:57:19

真奇怪,李
 
因为我只是在一个没有加载线型的图形中运行它&lisp加载了它。

Lee Mac 发表于 2022-7-5 19:03:49

 
您的代码当前设置为加载任何一种情况下的线型-简单来说,您的代码表示:
IF Noddy linetype is already defined
THEN:
   Load Noddy linetype from acadiso.lin
   Create Big-Ears layer and assign various properties
   Print message
ELSE:
   Load DASHED2.5 linetype from acadiso.lin
   Create Big-Ears layer and assign various properties
   Print message

Happy Hobbit 发表于 2022-7-5 19:07:10

我懂了。。。
 
像这样的事情能解决吗?
 

(vl-some
'(lambda ( lin )
       (vl-catch-all-apply 'vla-load (list ltc typ lin))
       (tblsearch "DASHED2.5" typ)
   )
   lst
)
(if (/= lst t)
(progn
    (vl-some
   '(lambda ( lin )
      (vl-catch-all-apply 'vla-load (list ltc typ lin))
      (tblsearch "hidden2" typ)
    )
    lst
   )
      ;My create layer macro here for DASHED2.5
   )
    ;My create layer macro here for hidden2
)
(vl-load-com)

BIGAL 发表于 2022-7-5 19:08:59

你需要回到IF工作原理的基础
 
如果事情是真的
做这行
如果不这样做
 
你对诺迪的寻找将返回False,因此运行IF的第二部分“else”
 

(if (= (tblsearch "ltype" "noddy")T)
(PRINC "LINE 1")
(PRINC "LINE 2")
)
页: [1] 2
查看完整版本: 如果线型存在