动态移动转换坐标
当前坐标系,动态移动的点怎么准确获取当前坐标,代码是论坛大佬的,有大佬帮看下?矩阵不太会。。。。移动的时候鼠标与对应点分离了。。。谢谢!(defun zyyd (entpp1 /ANGPCURSOR->PCURSOR_LAST;自由移动ent
ANGSSMOVE CODE DISSSMOVE
MODE PCURSOR
PCURSOR_LAST PSSMOVE PSSMOVE_LAST
SS7 SSVLA
)
(vl-load-com)
;(setq ent (entsel))
(setq ss7 (ssadd) ss7 (ssadd ent ss7))
;(setqP1 (cadr ent))
;(setq p1 (XD::Pnts:SetZ (getvar "VIEWCTR") 0)) ;3D -> 2D
;(setq pt1 (trans pt1 1 0))
;;;----------------------------------------------------------------------
(vl-cmdf "move" ss7 "" '(0 0) '(0 0));使用选择集ss处于激活状态,供下面的grread使用
;;;----------------------------------------------------------------------
(setq PssMove_Lastpp1)
(setq PCursor_last(cadr (grread T 15 2))) ;PCursor_last为鼠标此时的位置,在grread中为鼠标移动时上一次的位置
(while (and (setq mode (grread 't))
(/= 3 (car mode)) ;若点击左键则grread中断。mode=3:鼠标左键
)
(setq code (car mode))
(setq PCursor (cadr mode))
(if(and PCursor (= 5 code));mode=5:鼠标移动
(progn
(vlax-for e ;vlax-for:遍历对象集
(setq ;把选择集ss转为vla集合
ssVla
(vla-get-activeselectionset
;vla-get-activeselectionset:取得图形激活的选择集。
(cond (*AcadDoc*)
((setq
*AcadDoc* (vla-get-activedocument
;vla-get-activedocument:取得激活的文件(图形文件),即当前的dwg文件。
(vlax-get-acad-object)
;vlax-get-acad-object:检索当前 AutoCAD 任务中的顶层 AutoCAD应用程序对象
)
)
)
)
)
)
(progn
(setq AngPcursor->Pcursor_Last (angle Pcursor_Last Pcursor))
;鼠标上次位置点 至 本此位置点 的角度
(setq AngSSMove AngPcursor->Pcursor_Last)
;ss要移动的方向(与P1、P2正交)(与DisSSMove配合得到方向的正反)
(setq DisSSMove ;ss中图元e 在本次鼠标移动时 要移动到距离
(* (distance Pcursor_Last Pcursor)
(cos (- AngPcursor->Pcursor_Last AngSSMove ))
;cos用来控制每次移动的距离大小,
;使得鼠标总在P1、P2连线的方向上,而不是ss与鼠标的距离越来越远难以控制。
)
)
(setq PssMove (polar PssMove_Last AngSSMove DisSSMove))
;ss中图元e 在本次鼠标移动时 要移动到的位置点
(vla-move e ;移动图元e
(vlax-3d-point PssMove_Last)
;vlax-3d-point:把list点表转为(变体)点表
(vlax-3d-point PssMove)
)
)
)
(setq PCursor_Last
PCursor
PssMove_Last PssMove
)
)
)
)
(princ)
)
乱七八糟的 本帖最后由 yaojing38 于 2023-5-4 19:47 编辑
飞雪神光 发表于 2023-5-4 19:36
乱七八糟的
说的不是很明白,,就是用户坐标系,获取鼠标的准确世界坐标系点位置,动态获取,动态转换成世界坐标位置。。。。 不转换移动物体的时候,物体跟鼠标点的位置会偏离。。。 本帖最后由 飞雪神光 于 2023-5-4 20:29 编辑
(defun zyyd (ent / code e gr loop pt pt0 ty)
(vl-load-com)
(setq ty(car ent))
(setq pt0(cadr ent))
(setq e(vlax-ename->vla-object ty))
(setq loop t)
(while loop
(setq gr (grread t 15 0))
(setq pt (cadr gr))
(cond
((= 5 (car gr))
(vla-move e (vlax-3d-point pt0)(vlax-3d-point pt))
(setq pt0 pt)
)
((or (= 3 (car gr)) (= 32 (cadr gr)))
(setq loop nil)
)
)
)
(princ)
)
(zyyd (entsel))
用户坐标系就很麻烦 不可以先转成世界坐标吗 试试这个不用command的你是不是视图不是俯视啊
飞雪神光 发表于 2023-5-4 20:23
用户坐标系就很麻烦 不可以先转成世界坐标吗 试试这个不用command的你是不是视图不是俯视啊
是俯视视图,谢谢您!可以用了。。。我加上了转换,,,(setq pt (trans (cadr gr) 1 0)),可能我的有距离的问题吧。。。
页:
[1]