pBe 发表于 2022-7-6 09:34:43

打开多个图形标题栏

我对如何开始这一常规有点问题
我有一个布局上有多个绘图标题的绘图
 
这样地

 
注释是在纸上完成的。
我需要在同一张图纸上将这些内容分离到它自己的布局选项卡中
创建布局,本例还有3个
检查每个选项卡,删除每个选项卡中四个选项卡中的三个。
 
这样行吗?
 
这些图纸有近2000张
 
有什么想法吗?

Organic 发表于 2022-7-6 09:43:47

这听起来像是一场噩梦。不过,你上面的方法听起来确实是“最好的”
-复制文件,然后在新文件中将每个布局再复制3次,然后删除每个布局上的所有相关区域(a、b、c、d),然后调整页面布局大小
 
每张图纸的纸张大小是否相同,或者图纸之间的纸张大小是否不同?

BlackBox 发表于 2022-7-6 09:47:05

考虑在Layouts集合上使用Add方法,然后使用CopyObjects方法将适当的项放置在新创建的布局上(可能需要Move方法?),然后是(从原始布局)复制的对象的删除方法。
 
编辑-在采取任何操作之前,我会先制作一个无效的图形副本*(使用vl文件副本),更不用说使用保存/另存为方法了!

pBe 发表于 2022-7-6 09:52:26

 
幸运的是,对于特定的图纸,纸张大小都是相同的
这意味着,如果B-size Tblock,则对于该单个图形,其余为B-size。
 
另一件事是,一些布局可能有多达10个TBlock(9个以上的布局选项卡)
 
我无法想象如何开始为此编写代码。曾想过使用ODBX,但又一次。我可能需要通过ssget选择一个窗口,这对ODBX来说是不可能的
 
哦,好吧,我会继续挖掘
 
谢谢Dink87522

BlackBox 发表于 2022-7-6 10:01:35

 
由于所有尺寸都相同(每个图形),因此这为您的例程中预定义的尺寸、距离等提供了所需的条件过滤器。
 
 
我已经在我之前帖子中列出的函数中为您提供了一个起点。
 
有两种方法可以通过Visual LISP实现这一点-使用或不使用ODBX。无论如何,您首先需要一个工作函数。
 
这就是说,vlax for方法将需要在with选项中单步遍历布局的块对象,而ssget“_x”可以在with选项中使用。
 
我建议您先编写一个不使用ODBX的函数,因为这样会更简单,并且允许使用命令。

pBe 发表于 2022-7-6 10:03:11

 
将遵守。谢谢Renderman

pBe 发表于 2022-7-6 10:08:34

这是草稿:
 
(defun SepLayout (blkname / adoc LayoutColl pt_list NewLayoutTab space ObjToMove safObjects MoveToLayout)
(vl-load-com)
(cond ((and
(setq adoc (vla-get-activedocument (vlax-get-acad-object)))
       (= (vla-get-activespace adoc) 0)
(= (vla-get-count (setq LayoutColl (vla-get-layouts adoc))) 2)
(vlax-for
   objs (vla-get-paperspace adoc)
    (cond
      ((and
         (eq (vla-get-objectname objs) "AcDbBlockReference")
         (eq (vla-get-name objs) blkname)
         (setq pt_list
            (cons
            (vlax-safearray->list
                (variant-value
                  (vlax-get-property objs 'insertionpoint)
                )
            )
            pt_list
            )
         )
       )
      )
    ) T
)
(repeat (setq i (1- (length pt_list)))
(vla-add LayoutColl (setq NLNAme (strcat "NLayout " (itoa (setq i (1- i)))))
          )
   (setq NewLayoutTab (cons NLNAme NewLayoutTab ))
)
(foreach SpaceToMove NewLayoutTab
   (setq space (vla-item LayoutColl SpaceToMove))
   (ssget "_W"(car pt_list)
(mapcar '+ (car pt_list) '(36.0 24.0)));<---size of Tblock
   (vlax-for x (setq ObjToMove (vla-get-activeselectionset aDoc))
         (setq MoveToLayout (cons x MoveToLayout)))
   (vla-delete ObjToMove)
(vla-CopyObjects ADoc
          (vlax-make-variant
            (vlax-safearray-fill
            (vlax-make-safearray
                vlax-vbObject
                (cons 0 (1- (length MoveToLayout)))
            )
            MoveToLayout
            )
          )
          (vla-get-block space)
      )
(foreach O MoveToLayout (vla-delete O))
   (setq pt_list (cdr pt_list) MoveToLayout nil)
    )
   )
      )
)
)
 
键入“LayoutCutter”开始。

Lee Mac 发表于 2022-7-6 10:15:18

 
很好,我的朋友,我唯一要做的就是把上面的一行从“C”改成“W”
 
包围盒的方法是聪明的李。
 
现在告诉我,我的代码中缺少了什么,它没有复制视口对象
 
它复制除VPs之外的所有其他内容。有什么好处?(教!教!)
 
谢谢李

pBe 发表于 2022-7-6 10:23:01

 
谢谢pBe,很高兴对你有用
 
 
您在SelectionSet中的所有对象上使用CopyObjects方法的方法是正确的,但是,每个布局都有一个PaperSpace视口(布局块定义中的第一项)-对与查看PaperSpace中的对象相关的视图进行编码。因此,以编程方式创建新布局时,必须创建/复制其关联的图纸空间视口。
 
另外,请注意,我使用CopyFrom方法也复制打印/页面设置设置。
 
当做
 

Lee Mac 发表于 2022-7-6 10:28:59

 
谢谢李,现在一切都有意义了
 
顺便说一句:ODBX不会在这一个工作,不是吗?那我只好将就一下剧本了
 
再次感谢
页: [1] 2
查看完整版本: 打开多个图形标题栏