yaojing38 发表于 2023-5-4 19:28:20

动态移动转换坐标

当前坐标系,动态移动的点怎么准确获取当前坐标,代码是论坛大佬的,有大佬帮看下?矩阵不太会。。。。移动的时候鼠标与对应点分离了。。。谢谢!(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)
)

飞雪神光 发表于 2023-5-4 19:36:32

乱七八糟的

yaojing38 发表于 2023-5-4 19:46:16

本帖最后由 yaojing38 于 2023-5-4 19:47 编辑

飞雪神光 发表于 2023-5-4 19:36
乱七八糟的
说的不是很明白,,就是用户坐标系,获取鼠标的准确世界坐标系点位置,动态获取,动态转换成世界坐标位置。。。。 不转换移动物体的时候,物体跟鼠标点的位置会偏离。。。

飞雪神光 发表于 2023-5-4 20:23:08

本帖最后由 飞雪神光 于 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的你是不是视图不是俯视啊

yaojing38 发表于 2023-5-4 20:45:00

飞雪神光 发表于 2023-5-4 20:23
用户坐标系就很麻烦 不可以先转成世界坐标吗 试试这个不用command的你是不是视图不是俯视啊

是俯视视图,谢谢您!可以用了。。。我加上了转换,,,(setq pt (trans (cadr gr) 1 0)),可能我的有距离的问题吧。。。
页: [1]
查看完整版本: 动态移动转换坐标