masterlong 发表于 2021-10-22 15:24:20

没太理解你的意思
CCV的功能
就是在两个视口(其实是两个区域)之间进行复制
肯定是要获取当前视口ID的
建议你先使用QG、GG命令
确认两个区域的设置是正确的
再使用CCV命令进行测试
如果还是有问题
把出错的dwg发上来

masterlong 发表于 2021-10-22 15:48:08

或许是下面这一种可能?

QG设定了双视口以后
恢复成单视口
后又使用CAD命令分双视口
然后使用CCV命令

如果是这样
前后两组双视口的ID有可能不一致
导致相对坐标错误

不管你的错误是不是这个原因
我会在空闲的时候解决掉这个问题

AndyWang 发表于 2021-10-29 17:05:52

masterlong 发表于 2021-10-22 15:48
或许是下面这一种可能?

QG设定了双视口以后


好的,回头我也试试是不是您说的导致的。没有收到消息,现在才给您回复,抱歉!

AndyWang 发表于 2021-12-18 10:22:09

masterlong 发表于 2021-10-22 15:48
或许是下面这一种可能?

QG设定了双视口以后


大神,请问那个同步复制错乱的问题修复了吗?

masterlong 发表于 2021-12-27 18:52:10

本帖最后由 masterlong 于 2022-1-4 11:44 编辑

尝试修复BUG
不过没时间测试
先放这里供有兴趣的同学试用
若没有问题
再更新到顶楼

附件传不上来
代码格式又不玩不溜 ------ IE的问题?用google chrome就可以了
就这样吧



;;QG```````模型中指定两点,记录相对坐标后切分为左右双视口````根据两点位置关系自动对应视口
;;GG```````根据相对坐标,“同步”两个视口
;;CCV``````提取以上相对坐标为基点终点,选择对象既完成视口间复制````自动以当前视口向另一视口进行复制


;|
【关于CCV】
这个程序后期我可能会再做一些调整
若当前模型非“左右均分双视口”时
执行CCV仅将模型设为“左右均分双视口”
也就是相当于GG命令的功能
再调用CCV时才允许选择图元执行双向复制
这样应该不容易出现误操作
|;

;000`````````GG```````根据相对坐标,“同步”两个视口
(defun c:gg()
(c:gg_main)
)
(defun c:gg_main()
(princ "\nQG```模型中指定两点,记录相对坐标后切分为双视口\nGG```根据相对坐标,“同步”两个视口")
(setq *acad* (vlax-get-acad-object))

(if (null gg#viewlist)
(c:qg)
(if (= (strcase (getvar "ctab")) "MODEL")
   ;;改为只要是模型,一律改为左右均分双视口。不管原来是单独视口还是多视口,或者双视口(双视口也可能是上下或不等分视口)
   (progn
    (command "undo" "g")
   
    ;;(set2vp_lr);;设定模型为左右均分双视口
    (if (= 2 (length (vports)))
   (progn
      (setq afw (cdr (car (vports))))
      (if (not (or (equal afw '((0.0 0.0) (0.5 1.0))) (equal afw '((0.5 0.0) (1.0 1.0)))))
       (command "-vports" "si" "-vports" "2" "v")
      )
   )
   (command "-vports" "si" "-vports" "2" "v")
    )
   
    ;;根据(vports)特征值,判断当前视口在左还是右
    (setq 999cvid (getvar "cvport"))
    (setq 999vdat (cdr (assoc 999cvid (vports))))
    (setq 999jjj(apply '+ (car 999vdat)))
    ;;当前为右视口时,ggbiao = gg#viewlist;当前为左视口时,ggbiao = (mapcar '- gg#viewlist)
    (if (= 999jjj 0)
   (setq ggbiao gg#viewlist)
   (setq ggbiao (mapcar '- gg#viewlist))
    )
      
    (setq 0cvid(getvar "cvport"))
    (setq 0cvctr   (u2w (getvar "viewctr")))
    (setq 0cvsize(getvar "viewsize"))
    (setq 9pt (vlax-3d-point (w2u (mapcar '+ 0cvctr ggbiao))))
    (setvar "cvport" (car (car (reverse (vports)))))
    (vla-ZoomCenter *acad* 9pt 0cvsize)
    (princ "\n已根据记录“同步”两个视口")
   
    (command "undo" "e")
   )
   (princ "\n本命令用于在【模型·双视口】时,按相对位置快速同步两个视口。\n当前空间非模型,不能执行本命令")
)
)
(princ)
)

;000`````````QG```````模型中指定两点,记录相对坐标后切分为左右双视口````根据两点位置关系自动对应视口
(defun c:QG()
(c:QG_main)
)
(defun c:QG_main()
(princ "\nQG```模型中指定两点,记录相对坐标后切分为左右双视口\nGG```根据相对坐标,“同步”两个视口")
(setq *acad* (vlax-get-acad-object))
         
;;此代码提至前面————加强程序体验:指定点时,可能视窗面积较大
(setq 9cvsize(getvar "viewsize"))
(if (= (strcase (getvar "ctab")) "MODEL")
(if (and
   (setq apt (getpoint "\n指定第1视口的中心点 : "))
   (setvar "orthomode" 1)
   (setq bpt (getpoint apt "\n指定第2视口的中心点 : "))
   )
   (progn
   ;;根据两点坐标比较,确定0pt(始终左视口)1pt(始终右视口)
   (setq apt (u2w apt)
       bpt (u2w bpt)
   )   
   (if (= (car apt) (car bpt))
      (if (> (cadr apt) (cadr bpt))
       (setq 0pt apt   1pt bpt)
       (setq 0pt bpt   1pt apt)
      )
      (if (< (car apt) (car bpt))
       (setq 0pt apt   1pt bpt)
       (setq 0pt bpt   1pt apt)
      )
   )
   
   ;;(set2vp_lr);;设定模型为左右均分双视口
   (if (= 2 (length (vports)))
      (progn
       (setq afw (cdr (car (vports))))
       (if (not (or (equal afw '((0.0 0.0) (0.5 1.0))) (equal afw '((0.5 0.0) (1.0 1.0)))))
      (command "-vports" "si" "-vports" "2" "v")
       )
      )
      (command "-vports" "si" "-vports" "2" "v")
   )
   
   ;;根据(vports)特征值,判断当前视口在左还是右
   (setq 999cvid (getvar "cvport"))
   (setq 999vdat (cdr (assoc 999cvid (vports))))
   (setq 999jjj(apply '+ (car 999vdat)))
   ;;当前为左视口时,切换到右视口
   (if (/= 999jjj 0)
      (setvar "cvport" (car (car (reverse (vports)))))
   )
   
   ;;左右视口分别按0pt、1pt缩放窗口
   (vla-ZoomCenter *acad* (vlax-3d-point 0pt) 9cvsize)
   (setvar "cvport" (car (car (reverse (vports)))))
   (vla-ZoomCenter *acad* (vlax-3d-point 1pt) 9cvsize)
   (gq_save)
   )
   (princ "未指定两点。程序退出")
)
(progn
   (princ "\n当前空间为布局,本命令只能用于模型,现在切换至模型")
   (setvar "ctab" "model")
   (c:qg)
)
)
(princ)
)
(defun gq_save()
(setq gg#viewlist (mapcar '- 1pt 0pt))

   ;;可屏蔽代码`````设置所有打开文档共享此列表
   (vl-propagate 'gg#viewlist)
)

;000`````````CCV``````提取以上相对坐标为基点终点,选择对象既完成视口间复制````自动以当前视口向另一视口进行复制
(defun c:ccv()
(c:ccv_main)
)
(defun c:ccv_main()
(princ "\nccv```视口同步复制————————两个视口“同步”以后,以相对坐标进行复制")
(setq *acad* (vlax-get-acad-object))

(if (null gg#viewlist)
(progn
   (princ "\n要使用本命令,必须首先指定双视口的相对坐标")
   (c:qg)
)
(progn
   (command "undo" "g")
   
   ;;(set2vp_lr);;设定模型为左右均分双视口
   (if (= 2 (length (vports)))
    (progn
   (setq afw (cdr (car (vports))))
   (if (not (or (equal afw '((0.0 0.0) (0.5 1.0))) (equal afw '((0.5 0.0) (1.0 1.0)))))
      (command "-vports" "si" "-vports" "2" "v")
   )
    )
    (command "-vports" "si" "-vports" "2" "v")
   )
   (if (setq ss (ssget))
    (progn
   ;;根据(vports)特征值,判断当前视口在左还是右
   (setq 999cvid (getvar "cvport"))
   (setq 999vdat (cdr (assoc 999cvid (vports))))
   (setq 999jjj(apply '+ (car 999vdat)))
   ;;当前为右视口时,ggbiao = gg#viewlist;当前为左视口时,ggbiao = (mapcar '- gg#viewlist)
   (if (= 999jjj 0)
      (setq ggbiao gg#viewlist)
      (setq ggbiao (mapcar '- gg#viewlist))
   )
   
   (setq ent (entlast))
   (command "copy" ss "" "non" '(0 0)"non" ggbiao)
   (princ "\n预设点快速复制已完成")
   (setq newss (entbackss ent))
   
       ;;以下为个人使用习惯,可屏蔽-----复制后对象形成“上一选择集”
       (oldss2act newss)
       ;;以下代码可屏蔽,将取消复制以后视口“同步”的效果
       (progn
      (setq 0cvid(getvar "cvport"))
      (setq 0cvctr   (u2w (getvar "viewctr")))
      (setq 0cvsize(getvar "viewsize"))
      (setq 9pt (vlax-3d-point (w2u (mapcar '+ 0cvctr ggbiao))))
      (setvar "cvport" (car (car (reverse (vports)))))
      (vla-ZoomCenter *acad* 9pt 0cvsize)
       )
       ;;以下代码可屏蔽,将取消选择集复制后的亮显
       (ssdraw ss 3)
       (ssdraw newss 3)
   
   (setvar "cvport" 999cvid)
    )
   )
   
   (command "undo" "e")
)
)
(princ)
)









;999公共函数
;;坐标WCS=>UCS
(defun w2u( pt )
(trans pt 0 1)
)
;999公共函数
;;坐标UCS=>WCS
(defun u2w( pt )
(trans pt 1 0)
)
;999公共函数
;;一个已存在的选择集,设置成当前选择集
(defun oldss2act( oldss )
(sssetfirst Nil oldss);;将选择集设为夹点显示模式
(ssget "i")
(sssetfirst nil nil)
)
;999公共函数
;;按指定的模式重画一个选择集的全部物体<改模式时,需要先反绘。1-2 3-4.(1->4=1->2->4)>    【支持模型多视口,支持布局中视口】
;;1:显示2:消隐3:高亮4:低亮
(defun ssdraw( ss mode / i ent )
(if (= (strcase (getvar "ctab")) "MODEL")
(if (member mode '(1 2 3 4))
   (foreach vp (reverse (vports))
    (setvar "cvport" (car vp))
    (cond
   ((= (type ss) 'PICKSET)
      (foreach ent (ss2list ss)
       (redraw ent mode)
      )
   )
   ((= (type ss) 'list)
      (foreach ent ss
       (redraw ent mode)
      )
   )
   ((= (type ss) 'ename)
      (redraw ss mode)
   )
    )
   )
)
(cond
   ((= (type ss) 'PICKSET)
    (foreach ent (ss2list ss)
   (redraw ent mode)
    )
   )
   ((= (type ss) 'list)
    (foreach ent ss
   (redraw ent mode)
    )
   )
   ((= (type ss) 'ename)
    (redraw ss mode)
   )
)
)
(princ)
)
;999```公共函数
;;获取在图元 ent 之后产生的图元的选择集 ,ent不存在时返回nil
(defun entbackss ( ent / backss)
(if (and ent (vlax-Ename->Vla-Object ent))
(progn
   (setq backss (ssadd))
   (while (setq ent (entnext ent))
    (if (not (member (cdr (assoc 0 (entget ent))) '("ATTRIB" "VERTEX" "SEQEND")))
   (setq backss (ssadd ent backss))
    )
   )
   (if (zerop (sslength backss))
    (setq backss NIL)
   )
   backss
)
)
)






etoxp 发表于 2021-12-28 10:04:53

优秀、实用、很好很好!!!!

AndyWang 发表于 2021-12-29 14:53:54

masterlong 发表于 2021-12-27 18:52
尝试修复BUG
不过没时间测试
先放这里供有兴趣的同学试用


Bug解决了,CCV部分少个函数。现在完美使用

masterlong 发表于 2021-12-29 15:09:59

少了啥直接说出来么
省的我找啦

masterlong 发表于 2021-12-29 15:12:01

好像是entbackss
35楼已补

零度 发表于 2021-12-30 10:08:48

楼主顶一个
页: 1 2 3 [4] 5
查看完整版本: 发个小程序,设置两点,快速同步【模型·双视口】~~~【20211227尝试修复BUG】