明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: citykunan

将viewport中的内复制到modle中

  [复制链接]
发表于 2004-4-22 10:02:00 | 显示全部楼层

1. 在select object時輸入all是不是不經過過濾了或是選的更加多了?

->ALL選項會得到所有LWPOLYLINE,VIEWPORT(當然有過濾)

->沒有附帶VIEWPORTLWPOLYLINE也在其中(你要改進這一點)

->所有圖紙空間的VIEWPORT也在其中(69碼的判斷把它解決了)

2. DXF69是Viewport ID , (69 . 1)就是圖紙空間

下到程序列出所有VIEWPORT的ENTGET

(setq SS (ssget "X" '((0 . "VIEWPORT")))

N 0

)

(repeat (sslength SS)

(print (entget (ssname SS N)))

(setq N (1+ N))

)

3. 重點: ALL選項打破了LWPOLYLINE後續是附帶VIEWPORT的規則(難怪!我從未聽說過,不要再用這不穩定的規則)

(setq SS (ssget "X" '((0 . "LWPOLYLINE,VIEWPORT")))

N 0

)

(repeat (sslength SS)

(print (entget (ssname SS N)))

(setq N (1+ N))

)

PS:結論:你再想辦法吧!不行我再來!

发表于 2004-5-14 13:41:00 | 显示全部楼层
;;以圖塊方式從模型空間轉圖紙空間(PLINE VIEWPORT)
;;不含炸開圖塊後保持原樣(指尺寸標註)
;;BY 龍龍仔(LUCAS)
(defun C:M_VIEW (/ LPT RPT VP HOLDECHO
HOLDOSMODE SS_I SS_P SS_V I
SSD_P A N BOX
)
(vl-load-com)
(defun DO_IT1 (VP FLAG / WDXF XP W10 W12 W40 W69 SS AA)
(setq WDXF (entget VP))
(setq XP (/ (cdr (assoc 41 WDXF)) (cdr (assoc 45 WDXF))))
;;-------45號碼是什麼用的?好像是個比例因數,我研究下來發現可以得到viewport的比例
;;經多次研究發現41號碼除以45號碼總能得到viewport的比例
(setq W10 (cdr (assoc 10 WDXF))) ;viewport視圖的中點
(setq W12 (cdr (assoc 12 WDXF))) ;wcs下的目標點
(setq W40 (cdr (assoc 40 WDXF))) ;視圖的高度
(setq W41 (cdr (assoc 41 WDXF))) ;視圖的寬度
(setq W69 (cdr (assoc 69 WDXF))) ;app:視口的表示字
(if (> W69 1)
(progn
(DO_IT W10)
(if FLAG
(progn
(command "_.rectang" LPT RPT)
(setq BOX (entlast))
)
)
(command "zoom" LPT RPT)
(setq W40 (/ W40 XP))
(setq W41 (/ W41 XP))
(command "_.MSPACE")
(setvar "cvport" W69)
(command "_.ucs" "v")
(DO_IT W12) ;得到相應大小的矩形框。
(setq SS (ssget "c" RPT LPT))
(if SS
(progn
(setq AA (rtos (* (getvar "CDATE") 1E8))) ;做塊名
(command "_.block" AA W12 SS "")
(command "_.oops") ;undo erase
(command "_.pspace")
(command "_.insert" AA W10 XP "" "")
(command "_.xclip" (entlast) "" "N" "S" BOX)
)
) ;end if
)
)
(command "_.pspace")
) ;end progn (defun DO_IT (CEN / VCTRX VCTRY)
(setq VCTRX (car CEN))
(setq VCTRY (cadr CEN))
(setq LPT (list (- VCTRX (/ W40 2.0)) (- VCTRY (/ W41 2.0))))
(setq RPT (list (+ VCTRX (/ W40 2.0)) (+ VCTRY (/ W41 2.0))))
) ;得出矩形兩個角點座標 (setq HOLDECHO (getvar "cmdecho"))
(setq HOLDOSMODE (getvar "osmode"))
(setvar "cmdecho" 0)
(command "_.undo" "be")
(setvar "osmode" 0)
(command "_.PSPACE")
(setq SS_I (ssget '((0 . "LWPOLYLINE,VIEWPORT"))))
(if SS_I
(progn
(setq SS_V (ssget "P" '((0 . "VIEWPORT"))))
(command "_.SELECT" SS_I "")
(setq SS_P (ssget "P" '((0 . "LWPOLYLINE"))))
(command "_.VIEW" "S" "M_VIEW")
)
)
(if SS_P
(progn
(setq N 0
SSD_P (ssadd)
)
(repeat (sslength SS_P)
(setq A (ssname SS_P N))
(if
(and
(= (cdr (assoc 0 (entget A))) "LWPOLYLINE")
(= (cdr
(assoc 0
(entget (setq VP (cdr (assoc 330 (entget A)))))
)
)
"VIEWPORT"
)
)
(progn
(entmake
(vl-remove-if '(lambda (X) (= 330 (car X))) (entget A))
)
(setq BOX (entlast))
(DO_IT1 VP NIL)
)
(ssadd A SSD_P)
)
(setq N (1+ N))
)
(command "_.ERASE" SS_P "R" SSD_P "")
)
)
(if SS_V
(progn
(setq N 0)
(repeat (sslength SS_V)
(setq VP (ssname SS_V N))
(if (entget VP)
(DO_IT1 VP t)
)
(setq N (1+ N))
)
(command "_.ERASE" SS_V "")
)
)
(command "_.VIEW" "R" "M_VIEW")
(command "_.VIEW" "D" "M_VIEW")
(setvar "osmode" HOLDOSMODE)
(setvar "cmdecho" HOLDECHO)
(command "_.undo" "e")
(princ)
)
(prompt "\nType M_VIEW to run")
(princ)
;;反向操作,從VIEWPORT中也有DXF340碼記錄了VIEWPORT是由某LWPOLYLINE建成
;;程序可否再寫一次
;;By 龍龍仔(LUCAS)
(defun C:M_VIEW_LAI (/ LPT RPT HOLDECHO HOLDOSMODE
SS_I SS_D SS_V I A BOX WDXF
XP W10 W12 W40 W41 W69 SS
ENT
) (defun DO_IT (CEN / VCTRX VCTRY)
(setq VCTRX (car CEN))
(setq VCTRY (cadr CEN))
(setq
LPT (list (- VCTRX (/ W40 2.0)) (- VCTRY (/ W41 2.0)))
)
(setq
RPT (list (+ VCTRX (/ W40 2.0)) (+ VCTRY (/ W41 2.0)))
)
) (setq HOLDECHO (getvar "cmdecho"))
(setq HOLDOSMODE (getvar "osmode"))
(setvar "cmdecho" 0)
(setvar "osmode" 0)
(command "_.undo" "be")
(command "_.PSPACE")
(setq SS_I (ssget '((0 . "LWPOLYLINE,VIEWPORT"))))
(setq SS_V (ssget "P" '((0 . "VIEWPORT") (-4 . ">") (69 . 1))))
(setq I 0
SS_D (ssadd)
)
(if SS_V
(progn
(command "_.VIEW" "S" "M_VIEW")
(while (< I (sslength SS_V))
(setq A (ssname SS_V I)
BOX NIL
)
(if (setq ENT (assoc 340 (entget A)))
(progn
(entmake (vl-remove-if
'(lambda (X) (= 330 (car X)))
(entget (cdr ENT))
)
)
(setq BOX (entlast))
(ssadd (cdr ENT) SS_D)
)
)
(setq WDXF (entget A))
(setq XP (/ (cdr (assoc 41 WDXF)) (cdr (assoc 45 WDXF))))
(setq W10 (cdr (assoc 10 WDXF)))
(setq W12 (cdr (assoc 12 WDXF)))
(setq W40 (cdr (assoc 40 WDXF)))
(setq W41 (cdr (assoc 41 WDXF)))
(setq W69 (cdr (assoc 69 WDXF)))
(DO_IT W10)
(if (not BOX)
(progn
(command "_.rectang" LPT RPT)
(setq BOX (entlast))
)
)
(command "zoom" LPT RPT)
(setq W40 (/ W40 XP))
(setq W41 (/ W41 XP))
(command "_.MSPACE")
(setvar "cvport" W69)
(command "_.ucs" "v")
(DO_IT W12)
(setq SS (ssget "c" RPT LPT))
(if SS
(progn
(setq AA (rtos (* (getvar "CDATE") 1E8)))
(command "_.block" AA W12 SS "")
(command "_.oops")
(command "_.pspace")
(command "_.insert" AA W10 XP "" "")
(command "_.xclip" (entlast) "" "N" "S" BOX)
)
)
(command "_.pspace")
(setq I (+ I 1))
)
(command "_.ERASE" SS_D SS_V "")
(command "_.VIEW" "R" "M_VIEW")
(command "_.VIEW" "D" "M_VIEW")
)
)
(setvar "osmode" HOLDOSMODE)
(setvar "cmdecho" HOLDECHO)
(command "_.undo" "e")
(princ)
)
(prompt "\nType M_VIEW to run")
(princ)
 楼主| 发表于 2004-5-14 14:32:00 | 显示全部楼层
谢谢斑主,让我先研究一下。
发表于 2006-2-23 07:14:00 | 显示全部楼层
请问(rtos (* (getvar "CDATE") 1E8)))这段程序中的 1E8 所代表涵义为何呢
烦请各位可以解答一下
谢谢
发表于 2006-2-23 08:46:00 | 显示全部楼层
1e8=1*10^8
发表于 2006-2-27 10:55:00 | 显示全部楼层

Express Tools 菜单下的CHSPACE命令,很管用

 

发表于 2013-9-3 16:35:07 | 显示全部楼层
04年高手就在这里对决了,很了不起
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-26 10:12 , Processed in 0.183129 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表