ColinHolloway 发表于 2022-7-5 13:20:53

Lisp反应堆用于检测长安

大家好,
 
我正在试验基于某些图形特性的上下文功能区菜单,并试图找到是否可以设置一个反应器,该反应器将在您使用切换窗口或单击图形选项卡更改图形时进行检测。
 
非常感谢您对这个问题的任何意见:-)
 
科林·霍洛韦
澳大利亚昆士兰布里斯班。

Lt Dan's l 发表于 2022-7-5 13:27:53


(vlr-DocManager-Reactor "test"
'((:vlr-documentToBeDeactivated . test)))

(defun test ( own args )
(and (eq 'VLA-OBJECT (type (car args)))
   (alert (strcat (vla-get-fullname (car args)) " is now active"))
)
)

 
 
http://knowledge.autodesk.com/support/autocad-mechanical/getting-started/caas/CloudHelp/cloudhelp/2015/ENU/AutoCAD-AutoLISP/files/GUID-6C371938-A51E-43C8-B4A7-365A595DAB11-htm.html

ColinHolloway 发表于 2022-7-5 13:29:17

非常感谢!这正是我想要的。
 
感谢您的快速回复:-)
 
科林

Lt Dan's l 发表于 2022-7-5 13:33:02

别担心

Jef! 发表于 2022-7-5 13:44:04

你好,3dwannab!
这是我第一次挖掘反应堆。以下是我对您的问题的了解:当您更改活动的dwg时,您的反应堆被点燃4次。一次由:vlr document激活,三次由:vlr documentBecameCurrent激活。
第一点:你不需要用documentToBeDeactivated“在你离开的时候”触发它,因为你在回来的时候触发了它。因此:vlr文档可以完全删除。
第二点:我不太清楚为什么:VLR documentBecameCurrent会触发它3次,但当我查看help(2015)时,描述如下:“当前文档已更改。这并不一定意味着文档已被激活…”我没有发现这3次之间有任何区别,无论我在哪里看(vlr类型,vlr数据,vlr反应),所以我的感觉是,它可能会被dwg对“失去焦点”的反应触发一次,一次是“恢复焦点”,第三次是在激活时。我不知道为什么它是这样设计的,因为除此之外,如果我还没有找到一种方法来区分这3个回调,我真的想知道如果它触发3次,它会有什么用处。我试图改用:vlr documentToBeActivated,但出现了一个错误,可能是因为该文档即将成为当前文档,并且尚未激活。好消息!我找到了让反应堆点火的方法(而且只有一次!)使用:vlr sysvarchanged更改活动图形,并监视“*ONLINEFILEID”变量中的更改。老实说,我很困惑为什么每个dwg不触发两次,就像反应堆在dwg A中是活动的一样,它应该检测活动dwg从A到B和从B到A的两个变化,但它没有。见图。
 
因此,我只修改了_SwitchTabsReactor代码,使其能够与新反应堆一起工作,我没有修改任何其他内容。对于zoome,要么您发布了部分代码,要么zoome的来源有一些残余,因为在两个地方有一个“foreach n rac”,并且rac没有定义。代码存储原始反应器,将其全部删除,添加rac反应器“foreach n rac”,然后重新激活原始反应器。根据所做的动作和反应堆的性质,可能需要失活/再激活以避免循环,但在这种情况下,它是无用的。你也有(打印n)在2个地方,使零出现在标签的变化。由于使用zoome/_开关来处理rev云的大小,我会考虑像使用zereac一样使用_swreac作为全局,并在starte和stope中添加vlr添加/vlr删除它们。由你决定!无需进一步说明,这里没有地毯车上的臭虫。
告诉我它的行为是否符合预期

Grrr 发表于 2022-7-5 13:48:19

这还不够吗:
2

rlx 发表于 2022-7-5 13:50:11

很好的一个Grrr,尽管我不确定我必须做什么才能通过第一个if语句。如果我切换到pspace V是6,cvport是1,如果我切换到mspace V是300,cvport是2,但这可能是因为我没有合适的图纸。但反应堆机制的作用应该是这样的
gr.Rlxr

Grrr 发表于 2022-7-5 13:53:12

 
我也是,Rlx-我刚刚翻译了3dwannab的代码,所以机制应该是一样的,我也没有测试图。
无论如何,我认为应该更好地使用LayoutSwitched事件,而不是SysVarSwitched事件。
 
顺便说一句,在DocumentBecameCurrent事件中几乎没有进行测试,事实上这是真的:
我的意思是,如果我有3个打开的文档,我只在第一个文档中定义我的反应器,当我
[列表]
[*]从第一个切换到第二个,回调函数触发一次
[*]从第一个切换到第三个,回调函数触发一次
[*]从2st切换到3nd,回调函数不会启动
[*]从第二个或第三个切换到第一个,回调函数触发一次
[*]从第二个切换到第三个,反之亦然,最后我切换到第一个,回调函数触发两次(我认为每个文档开关触发一次)
[/列表]
我看到他们为你添加了一个特殊的表情符号

rlx 发表于 2022-7-5 13:57:07

对我对这个新的emoje很满意
 
我自己只使用文档becamecurrent reactor。它在我的工具栏上切换一个按钮(更改位图),所以我总是能看到我是处于SDI还是MDI模式。我使用了很多脚本,对于一些命令,SDI工作得最好,其他情况下更喜欢MDI。在剩下的时间里,我尽量不使用反应堆,因为在同一个房间里有很多反应堆时,它们的性质是不可预测的。
 
祝你周末愉快!
 
  

3dwannab 发表于 2022-7-5 14:03:07

你好
 
很抱歉延迟回复,但似乎其中一个解决方案没有按预期工作@Grrr适用于切换布局选项卡。但图形选项卡是导致循环问题的原因。
 
脚本:
[列表]
[*]我打开了两张图纸。       
[*]模型空间中的当前值,300设置为rev cloud min和max size
[*]和另一个在paperspace中。       
[*]我将绘图选项卡更改为paperspace中的选项卡,不幸的是,@rlx您的代码没有更改任何内容。
[/列表]
页: [1] 2
查看完整版本: Lisp反应堆用于检测长安