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
楼主顶一个