Shawndoe 发表于 2022-7-6 11:55:59

将屏幕大小sysvar强制为upd

你好
 
我正在运行一个第三方程序,该程序通过缩放到范围,然后创建显示的DWF来发布图形。这会导致随机缩放和放置问题。为了解决这个问题,我运行了一个例程,在发布之前调整屏幕大小以固定纵横比。
 
问题是,在完全退出AutoLISP并返回命令行之前,screensize系统变量不会更新。
 
问题1。有没有办法在设置窗口后强制更新屏幕大小系统变量
 
问题2。我可以在打开图纸之前更改屏幕大小吗?我听说这在ObjDBX中是可能的,但我不确定如何实现。
 
谢谢你的帮助。
肖恩

ollie 发表于 2022-7-6 12:02:50

http://www.cadtutor.net/forum/showthread.php?t=43436
 
页面上的最后一篇文章由李·麦克发布。
 
合适选项列表

Shawndoe 发表于 2022-7-6 12:14:49

你好
 
感谢您的帮助,我尝试了您的解决方案,它与其他zoom和regen解决方案存在相同的问题。它们都需要重置屏幕大小系统变量,但只有完全离开AutoLISP并坐在命令提示符前,才会发生这种情况。我提供了窗口大小调整功能和一个小测试功能来突出这个问题。
 

(defun ACADWindowSize (Width Height Doc_ID /)
(vla-put-width Doc_ID Width);1660
(vla-put-height Doc_ID Height);1059
(Print)(princ "Window Set: ")
;(vla-put-windowstate Doc_ID acMax)
;(vla-put-windowstate Doc_ID acNorm)
); ACADWindowSize
;
;
;
(defun test ()
(setq Doc_ID (vla-get-ActiveDocument (vlax-get-Acad-Object)))
(ACADWindowSize 830 564 Doc_ID);1660 1059 +34 for Top and Bottom headers
(vla-zoomextents (vlax-get-acad-object))
(print)(princ (getvar "SCREENSIZE"))
(print)(Prompt "Press enter to Exit. ")(print)
(getpoint)
)

 
如果你能想到我错过了什么,请告诉我。
 
再次感谢你的帮助,新年快乐。
肖恩

Shawndoe 发表于 2022-7-6 12:18:12

只是给它一个颠簸。

ollie 发表于 2022-7-6 12:22:52

如果将函数一分为二并使用vla send命令
 
例子:
 

(defun t1()
   (setvar "sysvarname" val)
   (setq adoc (vla-get-activedocument(vlax-get-acad-object))
   (vla-sendcommandadoc "(t2)\r")
)

(defun t2()
   Do something......
)

 
这将在启动第二个lisp函数之前退出lisp函数
 
或者,使用该函数发送“setvar\rscreensize\r值”或类似内容
 
希望有帮助
奥利

Shawndoe 发表于 2022-7-6 12:33:54

你好
 
不幸的是,我试过了,但运气不好。Vla sendcommand类似于直线LISP中的(command),它允许您运行ACAD命令,但实际上不是命令行,您仍然在LISP中。在从vla sendcommand返回并退出T1之前,您不会退出LISP。
 
屏幕大小sysvar在那之前不会更新,不幸的是它是只读的,所以我不能只设置它。
 
也许李有一个想法,但我想我可能需要写我的第一段ARX代码来设置这个在图纸打开之前。
 
再次感谢你的帮助。
 
祝你过得愉快。
肖恩

ollie 发表于 2022-7-6 12:38:47

我测试了以下内容
我在没有vla sendcommand的情况下也尝试过同样的方法,但没有任何运气
 
不过,您需要考虑宽/高纵横比
 
没有意识到系统变量是只读的,但是vla sendcommand从调用它的函数异步运行,并且在list函数结束之前不会部署。例如
我不会容忍使用vla sendcommand功能,但这是一个合适的解决方法。在我的acad编程早期,我曾使用它在vba和autolisp之间切换:)
 
编辑:可能不需要vla regen语句。在添加vla put height之前,我试过了。你可能会逃脱以下惩罚
 
vla放置高度
vla发送命令
 
希望这有帮助
奥利

Shawndoe 发表于 2022-7-6 12:42:46

你好
 
这是我学到的。在激活图形上使用vla sendcommand时,在调用该命令的例程完成之前,AutoCAD不会执行该命令。
 
4
 
如果你看看发生了什么,它在执行之前一直到调用例程的末尾。接近但没有雪茄。
 
再次感谢。
肖恩

ollie 发表于 2022-7-6 12:52:26

 
我一定是误解了这个问题:
 
高度差200.0
因此,在函数之间更新了值
 
这不是你希望实现的吗?
 
话虽如此,您可能需要考虑命令控制台的高度来计算所需的更改
 
奥利

Shawndoe 发表于 2022-7-6 12:58:03

您好,
 
如果您运行我上次发布的内容,您会注意到(test2)是在消息之后执行的,即使它是在消息发送到命令行之前调用的。
 
这意味着,如果运行将vla命令发送到当前图形的例程,则在调用例程的其余部分完成之前,vla命令不会运行。您可以看到下面的示例,注意在vla sendcommand之前消息是如何执行的。
 
 
这可能与批处理例程的运行方式有关,它从不在处理过的图形中留下LISP。其工作原理如下:
 
*Drawing1运行批处理例程。
*批打开要处理的图形。
*S::Start-up寻找要执行的LISPs,并这样做。(我所做的一切都发生在这里。)
*S::启动结束,焦点转移回drawing1。
*图形已保存。
*下一张图纸。
 
我注意到,如果我从drawing1向工作图发送命令,则焦点会转移并与工作图保持一致。这对我的日常生活不好。
 
再次感谢,如果我有任何解决方案,我会发送给你。
肖恩
页: [1]
查看完整版本: 将屏幕大小sysvar强制为upd