帮助:将缩放到的LISP
是否有人拥有一个LISP,可以根据其中一个打开的图形缩放到所有打开图形的特定位置?意思
1) 我打开图纸1,图纸2。。。。。。。。。图纸100。
2) 在图1中,我缩放到了一个特定的位置。
从这里,我想激活一个LISP的图纸2到图纸100缩放到同一个位置。
此外,任何打开的后续图形也将缩放到同一位置,直到我停用LISP。
谢谢 提示:
'视图大小
'屏幕大小
vl传播
谢谢将对此进行更多搜索。 如果pBe可以为我们指出正确的方向,如何自动完成这项工作-使用(vla激活)。。。问题是,当新文档被激活时,CAD跳转到它并继续在启动的文档中(而不是在切换的新文档中)评估lisp。。。我唯一能写的是这行,但实际上如果你有100个DWG,你必须手动做100次。。。因此,如果有人知道我们在这里遗漏了什么,请向我们展示一些信息。。。
(defun c:setcurrentviewtoalldwgs ( / v c uo ux uy vd pe )
(setq v (getvar 'viewsize) c (getvar 'viewctr))
(setq uo (trans '(0.0 0.0 0.0) 1 0))
(setq ux (trans '(1.0 0.0 0.0) 1 0))
(setq uy (trans '(0.0 1.0 0.0) 1 0))
(if (eq (getvar 'cvport) 1)
(progn
(mapcar 'vl-propagate (list 'v 'c 'uo 'ux 'uy))
(setq fn (open "c:/processdoc.lsp" "w"))
(write-line "(vl-load-com)" fn)
(write-line "(setq d (vla-get-activedocument (vlax-get-acad-object)))" fn)
(write-line "(vla-regen d acactiveviewport)" fn)
(write-line "(if" fn)
(write-line "(not" fn)
(write-line "(and" fn)
(write-line "(equal uo '(0.0 0.0 0.0))" fn)
(write-line "(equal ux '(1.0 0.0 0.0))" fn)
(write-line "(equal uy '(0.0 1.0 0.0))" fn)
(write-line ")" fn)
(write-line ")" fn)
(write-line "(progn" fn)
(write-line "(setq ucs (vla-add (vla-get-usercoordinatesystems d) (vlax-3d-point uo) (vlax-3d-point ux) (vlax-3d-point uy) \"{ UCS }\"))" fn)
(write-line "(vla-put-activeucs d ucs)" fn)
(write-line "(command \"_.UCS\" \"_W\")" fn)
(write-line "(vla-delete ucs)" fn)
(write-line "(command \"_.UCS\" \"_P\")" fn)
(write-line ")" fn)
(write-line "(command \"_.UCS\" \"_W\")" fn)
(write-line ")" fn)
(write-line "(command \"_.ZOOM\" \"_C\" c v)" fn)
(write-line "(if ucs (setq ucs nil))" fn)
(write-line "(if d (setq d nil))" fn)
(write-line "(mapcar '(lambda ( x ) (set x nil)) (list 'v 'c 'uo 'ux 'uy))" fn)
(write-line "(princ)" fn)
(close fn)
)
(progn
(setq vd (trans (getvar 'viewdir) 1 0 t))
(setq pe (getvar 'perspective))
(mapcar 'vl-propagate (list 'v 'c 'uo 'ux 'uy 'vd 'pe))
(setq fn (open "c:/processdoc.lsp" "w"))
(write-line "(vl-load-com)" fn)
(write-line "(setq d (vla-get-activedocument (vlax-get-acad-object)))" fn)
(write-line "(command \"_.DVIEW\" \"\" \"_PO\" \"0,0,0\" vd \"\")" fn)
(write-line "(vla-regen d acactiveviewport)" fn)
(write-line "(if" fn)
(write-line "(not" fn)
(write-line "(and" fn)
(write-line "(equal uo '(0.0 0.0 0.0))" fn)
(write-line "(equal ux '(1.0 0.0 0.0))" fn)
(write-line "(equal uy '(0.0 1.0 0.0))" fn)
(write-line ")" fn)
(write-line ")" fn)
(write-line "(progn" fn)
(write-line "(setq ucs (vla-add (vla-get-usercoordinatesystems d) (vlax-3d-point uo) (vlax-3d-point ux) (vlax-3d-point uy) \"{ UCS }\"))" fn)
(write-line "(vla-put-activeucs d ucs)" fn)
(write-line "(command \"_.UCS\" \"_W\")" fn)
(write-line "(vla-delete ucs)" fn)
(write-line "(command \"_.UCS\" \"_P\")" fn)
(write-line ")" fn)
(write-line "(command \"_.UCS\" \"_W\")" fn)
(write-line ")" fn)
(write-line "(command \"_.ZOOM\" \"_C\" c v)" fn)
(write-line "(setvar 'perspective pe)" fn)
(write-line "(if ucs (setq ucs nil))" fn)
(write-line "(if d (setq d nil))" fn)
(write-line "(mapcar '(lambda ( x ) (set x nil)) (list 'v 'c 'uo 'ux 'uy 'vd 'pe))" fn)
(write-line "(command \"_.-PURGE\" \"_B\" \"DVIEWBLOCK\" \"_N\")" fn)
(write-line "(princ)" fn)
(close fn)
)
)
(prompt "\nSwitch to each opened DWG, and type (load \"c:/processdoc.lsp\") and when finished return to master DWG and type (vl-file-delete \"c:/processdoc.lsp\")")
(textscr)
(princ)
)
(defun c:scvtad nil (c:setcurrentviewtoalldwgs))
M.R。 不太清楚OP是什么意思
如果您的意思是不打开图形文件?[ODBX;
我想到的是获得所需的坐标,并通过vl传播传递值,使用一个短代码,使用打开的图形中的前一个值。
@vernonlee公司
(setq var "Banana Cake")
(vl-propagate 'var)
这些值将在绘图任务中浮动,直到用户将这些值设置为零。将处理新图纸和新打开的图纸
var变量的值为“全局”
打开现有图形
命令:!风险值
“香蕉蛋糕”
你好,pBe。
为了澄清这一情况:-
1) 打开dwg A、dwg B和dwg C
2) 在dwg A(活动dwg)中,我将缩放到左下角(在图纸空间中)
(此时,我将激活LISP,当我转到dwg B和dwg C时,它们的视图将缩放到左下角(在图纸空间中),就像dwg A一样。
忽略第3步。这只会让事情变得更复杂
因此,对于我的100幅画,我希望做的是:-
1) 打开20个图纸,
2) 在dwg 1(活动dwg)中,我只需缩放到该位置,然后激活LISP,其余19个dwg将跟随。
我只需要重复这个步骤5次&我已经画了100张了。
这比放大100倍要好,对吗? 感谢marko_ribar提出的LISP。
我会试试的。如果这涵盖了第2步,那么我准备好了。 这真的很容易vernonlee即使没有任何花哨的编码,告诉我,你要打开全部20个文件吗?
编辑:是的,最好试试Marko_ribar的代码,这可能很适合你的要求。我看到马尔科也考虑了UCS条件。我现在没有cad pBe,是的,它可以工作,但您仍然需要手动切换到打开的DWG,并在每个不同的DWG中手动粘贴行:(load“c:/processdoc.lsp”)。。。所以如果有100个,我想这肯定不会节省时间。。。我们仍然需要将命令行传递给打开的DWG,并在之前以某种不同的方式激活它们-自动(可能我错了,但我认为这是不可能的-即使我们可以通过(vl传播)函数传递完整的函数,我们在切换DWG后如何执行它??) 一个简单的代码[加载/acaddoc.lsp或其他]
[未测试]
(defun c:dew ()
(if (or OneCorner (setq OneCorner (getpoint "\nPick Lower left corner")))
(progn (command "_Zoom" "_Window" "_non" OneCorner "_non"
(if OtherCorner OtherCorner
(setq OtherCorner (getcorner OneCorner "\nSpecify opposite corner:"))))
(vl-propagate 'OneCorner)
(vl-propagate 'OtherCorner))))
(Defun c:rdew ()
(setq OneCorner nil
OtherCorner nil)
(c:dew)
)
页:
[1]
2