e2002 发表于 2003-9-17 16:40:00

发现一个问题:
layout命令生成的NewLayout保持了和SourceLayout相同的系统变量psltscale的值
程序生成的NewLayout如果不作一些工作,系统变量psltscale的值是系统默认值1

这看起来系统变psltscale是随Layout对象保存的?
如果是,Layout对象怎么没有这个属性?也就是没有方法通过Layout对象来设定这个值?

龙龙仔 发表于 2003-9-17 17:09:00

再試試看

;|
(setq *ACADOBJECT* (vlax-get-acad-object))
(setq *CDOC* (vla-get-activedocument *ACADOBJECT*))
(setq *SOURCELAYOUT* (vla-get-activelayout *CDOC*))
(setq SNEWLAYOUTNAME "LAI")
(setq *LAYOUTS* (vla-get-layouts *CDOC*))
|;

;;(LKPT:LAYOUT:MULTICOPY:COPYFROM *SOURCELAYOUT* SNEWLAYOUTNAM)

(defun LKPT:LAYOUT:MULTICOPY:COPYFROM (SOURCELAYOUT SNEWLAYOUTNAM)
(setq        SOURCELAYOUTBLOCK
       (vla-get-block SOURCELAYOUT)
;;; iCount (vla-get-Count SourceLayoutBlock)
;;; SourceLayoutBlock-Objects-list '()
)
;;;(vlax-for item SourceLayoutBlock
;;;    (setq SourceLayoutBlock-Objects-list (cons item SourceLayoutBlock-Objects-list))
;;;)
(setq        NEWLAYOUT      (vla-add *LAYOUTS* SNEWLAYOUTNAME)
        NEWLAYOUTBLOCK (vla-get-block NEWLAYOUT)
)
;;;(vla-copyobjects
;;;    CDoc
;;;    (vlax-safearray-fill
;;;      (vlax-make-safearray
;;; vlax-vbobject
;;; (cons 0 (1- iCount))
;;;      )
;;;      SourceLayoutBlock-Objects-list
;;;    )
;;;    NewLayoutBlock
;;;)

(vlax-for ITEM SOURCELAYOUTBLOCK
    (vla-copyobjects
      *CDOC*
      (vlax-safearray-fill
        (vlax-make-safearray vlax-vbobject '(0 . 0))
        (list ITEM)
      )
      NEWLAYOUTBLOCK
    )
)

(vla-copyfrom NEWLAYOUT SOURCELAYOUT)
(mapcar 'vlax-release-object
          (list SOURCELAYOUTBLOCK NEWLAYOUTBLOCK NEWLAYOUT)
)
)

e2002 发表于 2003-9-17 17:29:00

这个CopyObjects不是复制多个对象吗?
怎么不能把多个对象fill到SafeArray中来作呢?
一定要一个一个来for ?

龙龙仔 发表于 2003-9-18 09:55:00

;;TRY因看來也不會比較快!

(defun TTT (NEWLAYOUTNAME)
(setq ACADOBJECT (vlax-get-acad-object))
(setq CDOC (vla-get-activedocument ACADOBJECT))
(setq LAYOUTS (vla-get-layouts CDOC))
(setq CLAYOUT (vla-get-activelayout CDOC))
(setq CLAYOUT_BLK (vla-get-block CLAYOUT))
(setq NEWLAYOUT (vla-add LAYOUTS NEWLAYOUTNAME))
(setq NEWLAYOUT_BLK (vla-get-block NEWLAYOUT))
(setq ELIST '())
(setq        SSARRAY        (vlax-safearray-fill
                  (vlax-make-safearray
                  vlax-vbobject
                  (cons 0 (- (vla-get-count CLAYOUT_BLK) 1))
                  )
                  (vlax-for ENT        CLAYOUT_BLK
                  (setq ELIST (cons ENT ELIST))
                  )
                )
)
(vla-copyobjects CDOC SSARRAY NEWLAYOUT_BLK)
(vla-copyfrom NEWLAYOUT CLAYOUT)
(princ)
)

e2002 发表于 2003-9-20 10:34:00

e2002发表于2003-9-17 16:40:00static/image/common/back.gif发现一个问题:
layout命令生成的NewLayout保持了和SourceLayout相同的系统变量psltscale的值
程序生成的NewLayout如果不作一些工作,系统变量psltscale的值是系统默认值1

这看起来系统变


看书上这一节终于明白了....
"AutoCAD 2000 对象开发从入门到精通" 真是绝版好书!
原版书名 : Mastering AutoCAD 2000 Objects
作者 : Dietmar Rudolph
书号 : isbn7-5053-6172-4/TP.3312

自贡黄明儒 发表于 2014-10-23 14:08:41

顶起来 ,这么好的东西不能被人遗忘了。

liuhaixin88 发表于 2014-10-23 14:57:18

自贡黄明儒 发表于 2014-10-23 14:08 static/image/common/back.gif
顶起来 ,这么好的东西不能被人遗忘了。

呵呵,黄大哥又发现好东西了,具体有什么作用呢?
页: 1 [2]
查看完整版本: [求助]如何才能用VL创建一个现存的Layout的Copy ?