ripuz 发表于 2022-7-5 19:49:35

思维方式

你好
 
我想防止绘制图层,我找到了几种方法,但哪种方法最好?
 
 
 
 
1.

(command "_.-layer" "p" "n" "LAYERNAME" "")
2。

(defun PlotLayer2 (layerName bool / en output)
(if (setq en (tblobjname "LAYER" layerName))
(progn
(entmod (subst (cons 290 (if bool 1 0)) (assoc 290 (entget en)) (entget en)))
(setq output T)
)
)
output
)
3。
我知道它在这个例子中没有起到很大作用,但理论上哪种编程技术最好?
是否需要释放PlotLayer3中的对象?
 
提前感谢!

Tharwat 发表于 2022-7-5 20:00:41

处理Vanilla AutoLISP要比命令调用和Visual Lisp方法快得多。
 
看看我重写代码的方式。
 

(defun PlotLayer2 (layerName bool / en )
(if (setq en (tblobjname "LAYER" layerName ))
(entmod (subst (cons 290 (if bool 1 0)) (assoc 290 (entget en)) (entget en)))
)
)

Lee Mac 发表于 2022-7-5 20:11:27

 
小心你的和表达式-注意,如果“bool”参数为nil,该函数将不会对层进行任何修改。
 
也许以下几点就足够了:
4

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

 
这已经讨论了几年了-普遍的共识是,AutoCAD将自动释放从AutoCAD应用程序对象派生的ActiveX对象;AutoCAD对象模型之外的对象(例如,从Excel应用程序对象或某些其他界面派生的ActiveX对象)必须使用vlax release对象从内存中“手动”释放。

Tharwat 发表于 2022-7-5 20:27:40

 
正确,我更新了代码。
 
非常感谢。

ripuz 发表于 2022-7-5 20:36:19

 
我能看到你所做的一切就是删除了答案部分?!
在您的defun中,您将得到nil或entmod答案作为函数的答案,而不是T/nil。
我还看到你有一个恒定的layername,但我想这只是一个失误。
 
我试图找到Vanilla AutoLISP和Visual Lisp的定义。
我是否正确理解这一点:
Vanilla AutoLISP=处理实体的函数(代码类似于原始帖子中的nr 2)?
Visual Lisp=处理vla对象(vla、vlax等)的函数?
 
那么,这是一般规则吗
如果你可以用enities(如entmod等)做你想做的事情,那么使用vla对象来做不是一个好主意?

ripuz 发表于 2022-7-5 20:48:49

 
 
这也是我的经历。
如果不使用vlax release object释放对象,则在关闭AutoCAD之前,Excel和其他外部对象不会被释放。
更难确定内部对象是否真的被释放。
 
 
李,谢谢你抽出时间。

BIGAL 发表于 2022-7-5 20:52:54

有一种说法是关于劈头发,如果你用命令做一行,你真的会进入微秒级。这里重要的是我的意见是vlax版本。如果你玩10000个物体,速度开始缓慢下降。然后方法真的开始走到前面,就我而言,我已经开始使用更多的Vl get&puts,因为我不必担心记住dxf代码,而是使用变量名,知道我想要更改什么。正如已经指出的那样,使用entmod要快得多。我能检测到速度的差异吗?您需要查看任务并做出决策,将lisp与进行比较。net的代码行只会增加,但你是否可以通过数千个对象提高速度。
页: [1]
查看完整版本: 思维方式