vernonlee 发表于 2022-7-5 20:01:42

帮助:将缩放到的LISP

是否有人拥有一个LISP,可以根据其中一个打开的图形缩放到所有打开图形的特定位置?
 
意思
1) 我打开图纸1,图纸2。。。。。。。。。图纸100。
2) 在图1中,我缩放到了一个特定的位置。
从这里,我想激活一个LISP的图纸2到图纸100缩放到同一个位置。
 
此外,任何打开的后续图形也将缩放到同一位置,直到我停用LISP。
 
谢谢

pBe 发表于 2022-7-5 20:05:25

提示:
'视图大小
'屏幕大小
vl传播

vernonlee 发表于 2022-7-5 20:10:58

 
谢谢将对此进行更多搜索。

marko_ribar 发表于 2022-7-5 20:12:14

如果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。

pBe 发表于 2022-7-5 20:15:04

不太清楚OP是什么意思
 
 
如果您的意思是不打开图形文件?[ODBX;
 
我想到的是获得所需的坐标,并通过vl传播传递值,使用一个短代码,使用打开的图形中的前一个值。
 
 
@vernonlee公司
(setq var "Banana Cake")
(vl-propagate 'var)
 
这些值将在绘图任务中浮动,直到用户将这些值设置为零。将处理新图纸和新打开的图纸
var变量的值为“全局”
 
打开现有图形
命令:!风险值
“香蕉蛋糕”
 

vernonlee 发表于 2022-7-5 20:18:37

 
你好,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倍要好,对吗?

vernonlee 发表于 2022-7-5 20:21:37

感谢marko_ribar提出的LISP。
 
我会试试的。如果这涵盖了第2步,那么我准备好了。

pBe 发表于 2022-7-5 20:24:46

这真的很容易vernonlee即使没有任何花哨的编码,告诉我,你要打开全部20个文件吗?
 
编辑:是的,最好试试Marko_ribar的代码,这可能很适合你的要求。我看到马尔科也考虑了UCS条件。我现在没有cad

marko_ribar 发表于 2022-7-5 20:28:43

pBe,是的,它可以工作,但您仍然需要手动切换到打开的DWG,并在每个不同的DWG中手动粘贴行:(load“c:/processdoc.lsp”)。。。所以如果有100个,我想这肯定不会节省时间。。。我们仍然需要将命令行传递给打开的DWG,并在之前以某种不同的方式激活它们-自动(可能我错了,但我认为这是不可能的-即使我们可以通过(vl传播)函数传递完整的函数,我们在切换DWG后如何执行它??)

pBe 发表于 2022-7-5 20:31:57

一个简单的代码[加载/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
查看完整版本: 帮助:将缩放到的LISP