tryhi 发表于 2013-10-11 16:09:44

如何将窗口定位到最后生成的图形上面

本帖最后由 tryhi 于 2013-10-11 16:24 编辑

(defun c:ccd()
(command"_pasteclip" "0,0" "")
)




我弄一句“粘贴到原坐标”的命令,请问粘贴后如何快速定位到


我在别的图使用
(defun c:ccc()
(setq a(ssget))
(command"_copybase" "0,0" a ""))

也就是带基点复制,基点是0,0
然后在别的图带基点粘贴,基点也是0,0,想粘贴之后窗口定位到图形上面

llsheng_73 发表于 2013-10-11 16:09:45

本帖最后由 llsheng_73 于 2013-11-6 09:48 编辑

经过实验,可以在粘贴前得到最后一个图元(setq a1(entlast))

粘贴后
(while(entnext(car a1))(setq a1(append (list(entnext(car a1))) a1)))(setq a1(cdr(reverse a1)))
这样就得到了全部粘贴进来的图元,现在我们可以对它求包容盒,这个可以用黄瓜兄的图元表求包容盒函数
这样可以求出a1的左下角和右上角,就能够用zoom 的w选项把屏幕放到了刚好能完全显示粘贴进去的图元

(defun enlstbox(enlst / enma enmi ll ur);图元名表包围盒
(mapcar'(lambda(x)
   (vla-getboundingbox (vlax-ename->vla-object x) 'll 'ur)
   (setq enma (cons (vlax-safearray->list ll) enma)
    enmi (cons (vlax-safearray->list ur) enmi)))enlst)
(mapcar'(lambda(a b)(apply'mapcar(cons a b)))'(max min)(list enma enmi))
);;;该函数由wowan1314分享


(defun c:TT()
   (command "U")
   (command "pasteorig")
   (setq a1(list(entlast))
   (while(entnext(car a1))(setq a1(append (list(entnext(car a1))) a1)))
       ;;;这里可以加入对它们的一些处理方法如亮显等....
       (setq a1(cdr(reverse a1))
   )
(setq pt(enlstbox a1))
(commad "ZOOM" "W" (car pt)(cadr pt))
)

自贡黄明儒 发表于 2013-10-11 16:30:49

你是想窗口显示最后粘贴的对象?如果是这样,先取得最后粘贴的对象ss,然后(command "zoom" "ob" ss "")

namezg 发表于 2013-10-11 19:49:41

(defun c:ccd()
(command"_pasteclip" "0,0" "")
(command "zoom" "o" a "")
)

tryhi 发表于 2013-10-12 09:54:36

本帖最后由 tryhi 于 2013-10-12 09:56 编辑

namezg 发表于 2013-10-11 19:49 static/image/common/back.gif
(defun c:ccd()
(command"_pasteclip" "0,0" "")
(command "zoom" "o" a "")

我记得zoom是有个o参数,可在CAD2004中却没有

VBALISPER 发表于 2013-10-12 16:12:21

那就计算最小,最大X,Y坐标,然后ZOOM W吧

llsheng_73 发表于 2013-10-18 16:16:42

这个想法不错,值得研究下,看能不有快速简单的计算出所选对象的位置,或者在一个窗口得到另一个窗口的视口坐标,能解决其中之一,也就能实现了

llsheng_73 发表于 2013-11-2 09:51:09

本帖最后由 llsheng_73 于 2013-11-2 11:04 编辑

       最简单有效的可以通过(entlast)去得到最后的那个图元,从而得到该图元矩形包围框的大小和中心位置。
    但对于一次粘贴多个图元的情况,而这是最常见的,这样却不能全部得到它们,显然应该有另外的办法。至少不管我们一次性粘贴多少图元,取消它们只需要一个"U"就行了,那么,CAD它自己是怎么记住这些东东的,难道是剪切板?
    这样就有办法了,我们可以在刚执行了粘贴之后,接着(commad"PASTEBLOCK" '(0 0 0))
   (vla-getboundingbox (vlax-ename->vla-object(entlast)) 'll 'ur)(command "U" "")(setq pt(mapcar 'vlax-safearray->list (list ll ur)))就能得到它的两个对角点了,这两个对象点定义了刚才所粘贴对象的大小,但是位置却不是我们需要的。那应该把刚才PASTEBLOCK的时候那个坐标点改为粘贴到原坐标所得到的最后一个图元的的左下角,这样得到的 对角点虽然还不能保证和粘贴对象的位置相同,但一般情况下会比较接近,最后整理一下思路得到
(vla-getboundingbox (vlax-ename->vla-object(entlast)) 'll 'ur)
(command"pasteblock"(car(mapcar'vlax-safearray->list(list ll ur)))
(vla-getboundingbox (vlax-ename->vla-object(entlast)) 'll 'ur)
(command "U")
(setq pt(mapcar 'vlax-safearray->list(list ll ur)))
(command "ZOOM""W"(car pt)(cadr pt))

期待高人指点,得到粘贴之后所有对象的最在包容盒,就真正解决了楼主的问题,我自己觉得是摸到边了,但限于水平得不到最终结果
               

yoyoho 发表于 2016-4-30 23:45:16

;;;0,0基点复制                  
(defun c:COPY00()               
(setq a(ssget))                  
(command"_copybase" "0,0" a ""))

;;;粘贴到0,0
(defun c:past00()
;(command "LINE" "0,0" "1,1" "")
(setq en (entlast))
(command "_pasteclip" "0,0")
(sssetfirst nil (setq ss (sslast en)))
(command "zoom" "o" SS "")
)

(defun sslast (en / ss)            ;获取在图元 en 之后产生的选择集 ;by caoyin
(if en                         ;;如果en存在
(progn
(setq ss (ssadd))            ;;建立空集
(while (setq en (entnext en));;当en后有对像时
(if (not (member (cdr (assoc 0 (entget en))) '("ATTRIB" "VERTEX" "SEQEND")))
(ssadd en ss))               ;;把en后的对像加入到空集
)
(if (zerop (sslength ss)) (setq ss nil)) ;;如果SS为0,设置SS为nil
ss
)
(ssget "_x")
)
)
页: [1]
查看完整版本: 如何将窗口定位到最后生成的图形上面