明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2167|回复: 19

[提问] 新手诚心求教,关于command的使用问题,有别的办法替代command操作实体吗?

[复制链接]
发表于 2021-6-16 13:13:31 | 显示全部楼层 |阅读模式
这是我根据大佬的指点写的,但是在command的使用上卡壳了,死活达不到效果。
我的目的是,把创建出来的直线ZX,ENT13,ENT24,以ZX的端点为起点,ENT13的端点为终点,进行平移操作,代码如下,

先是创建三条直线,然后根据http://bbs.mjtd.com/forum.php?mo ... mp;highlight=grread提供的grread使用方法,进行按键及时反馈的操作,可是它始终不执行……

;;;
(defun C:cxz1 (/ code loop ss L1 L2 KU PT1 PT2 PT3 PT4 ZX ENT13 ENT24 zP1 zP2 )
  (setq OLD_CMDECHO (getvar "CMDECHO"))
  (setq CL (getvar "clayer"))
  (setq plwidth (getvar "PLINEWID"))
  (setvar "CMDECHO" 0)
  (setvar "EDGEMODE" 1)
  (setvar "PLINEWID" 30)
  (command "-layer" "m" "fjgj" "C" "1" "" "")

  (setq L1 (getpoint))
  (setq L2 (getpoint L1))
  (setq KU (angle L1 L2))
  (setq PT1 (polar L1 (+ KU (* 0.5 pi)) 75))
  (setq PT2 (polar L1 (+ KU (* 1.5 pi)) 75))
  (setq PT3 (polar L2 (+ KU (* 0.5 pi)) 75))
  (setq PT4 (polar L2 (+ KU (* 1.5 pi)) 75))

  (command "line" "non" L1 "non" L2 "")
  (setq ZX (entlast))
  (command "line" "non" PT1 "non" PT3 "")
  (setq ENT13 (entlast))
  (command "line" "non" PT2 "non" PT4 "")
  (setq ENT24 (entlast))

  (setq  loop T )
  (prompt "\n 偏移(A)/退出(空格)]:")
  (while loop
    (setq code (grread T 8))
    (cond
      ((equal code '(2 97))
       (setq zP1 (cdr (assoc 10 (entget ZX))))
       (setq zP2 (cdr (assoc 10 (entget ENT13))))
       (setq dsa (distance zP1 zP2))
       ()
;;;       (command "line" zP1 zP2 "")  这个创建两点间直线的语句我注释掉了,如果不注释的话,这个是可执行的,真能达到效果,我安一次A就能造出一条直线,按一次造一次。说明我前面写的都没有问题,就后面那句command错了
      (command "move" ZX ENT13 ENT24  "" zP1 zP2)       ;;;;;这句话我真的不知道哪错了呀,我就想把这三条直线,以zP1为基点,一块儿平移到zP2
      )
      ((equal code '(2 32))
       (setq loop nil)
      )
    )
  )

  (setvar "clayer" CL)
  (setvar "CMDECHO" OLD_CMDECHO)
  (setvar "PLINEWID" plwidth)
  (princ)
)
;;;
发表于 2021-6-16 15:35:09 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 1 反对 0

使用道具 举报

发表于 2021-6-18 09:24:54 | 显示全部楼层
本帖最后由 yshf 于 2021-6-18 09:38 编辑

;ActiveX方式
(defun C:cxz2 (/ OLD_CMDECHO CL L1 L2 doc layers layer modelSpace KU PT1 PT2 PT3 PT4 objlist loop zp1 zp2)
  (setq OLD_CMDECHO (getvar "CMDECHO"))
  (setq CL (getvar "clayer"))
  (setvar "CMDECHO" 0)
  (setvar "EDGEMODE" 1)

  (if (setq L1 (getpoint "\起点:"))
      (If (setq L2 (getpoint L1 " 止点:"))
          (progn
              (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
              (setq layers (vlax-get-property doc "layers"))
              (setq modelSpace (vla-get-ModelSpace doc))
              ;新建图层
              (If (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list layers "fjgj")))
                  (progn
                      (setq layer (vla-Add layers "fjgj"))
                      (vlax-put-property layer "color" 6)
                  )
             )
             (setvar "clayer" "fjgj")

             ;计算出第2、3条直线的端点
             (setq KU (angle L1 L2))
             (setq PT1 (polar L1 (+ KU (* 0.5 pi)) 75))
             (setq PT2 (polar L1 (+ KU (* 1.5 pi)) 75))
             (setq PT3 (polar L2 (+ KU (* 0.5 pi)) 75))
             (setq PT4 (polar L2 (+ KU (* 1.5 pi)) 75))
             ;绘三段直线
             (setq objlist (mapcar '(lambda(p1 p2)
                                        (vla-AddLine modelSpace (vlax-3d-point p1) (vlax-3d-point p2))
                                    )
                                    (list L1 pt1 pt2)
                                    (list L2 pt3 pt4)
                            )
             )
             (setq pts (list (vlax-get-property (car  objlist) "StartPoint")
                             (vlax-get-property (car  objlist) "EndPoint")
                       )
             )
             ;偏移直线
             (setq loop T)
             (prompt "\n 往左偏移(A)/往右偏移(B)/删除或恢复中线(E)/<退出>:")
             (while (not (member (setq code (grread T 8)) '((2 32) (2 13))))
                 (cond ((equal code '(2 97) 0.1)
                           ;A键向左偏移
                           (setq zp1 (vlax-get-property (car  objlist) "StartPoint"))
                           (setq zp2 (vlax-get-property (cadr objlist) "StartPoint"))
                           (mapcar '(lambda(obj) (vla-Move Obj zp1 zp2)) objlist )
                           (setq pts (list (vlax-get-property (car objlist) "StartPoint")
                                           (vlax-get-property (car objlist) "EndPoint")
                                     )
                           )
                       )
                       ((equal code '(2 98) 0.1)
                           ;B键向右偏移
                           (setq zp1 (vlax-get-property (car  objlist) "StartPoint"))
                           (setq zp2 (vlax-get-property (last objlist) "StartPoint"))
                           (mapcar '(lambda(obj) (vla-Move Obj zp1 zp2)) objlist )
                           (setq pts (list (vlax-get-property (car objlist) "StartPoint")
                                           (vlax-get-property (car objlist) "EndPoint")
                                     )
                           )                          
                       )
                       ((equal code '(2 101) 0.1)
                           ;E键删除或恢复中线
                           (cond ((= (length objlist) 3)
                                     (vla-delete (car objlist))
                                     (setq objlist (vl-remove (car objlist) objlist))
                                 )
                                 ((= (length objlist) 2)
                                     (setq objlist (cons (vla-AddLine modelSpace (car pts) (cadr pts))
                                                         objlist
                                                   )
                                     )
                                 )
                           )
                       )
                  )
             )
             ;释放对象
             (mapcar '(lambda(obj)
                           (If (/= obj nil)
                               (progn (vlax-release-object obj)(setq obj nil))
                           )
                      )
                      (list layer layers modelSpace doc)
             )
          )
      )
  )

  (setvar "clayer" CL)
  (setvar "CMDECHO" OLD_CMDECHO)
  (princ)
)
发表于 2021-6-16 15:47:31 | 显示全部楼层
不用command,用纯lisp实现:

  1. (defun C:cxz1 (/ ANG CL        CODE DSA ELIST ENT13 ENT24 KU L1 L2 LOOP OLD_CMDECHO PLWIDTH PT1 PT2 PT3 PT4 X ZP1 ZP2 ZX)
  2.   (setq OLD_CMDECHO (getvar "CMDECHO"))
  3.   (setq CL (getvar "clayer"))
  4.   (setq plwidth (getvar "PLINEWID"))
  5.   (setvar "CMDECHO" 0)
  6.   (setvar "EDGEMODE" 1)
  7.   (setvar "PLINEWID" 30)
  8. ;;;  (command "-layer" "m" "fjgj" "C" "1" "" "")
  9.   (if (not (tblsearch "layer" "fjgj"))
  10.     (entmakex '((0 . "LAYER")
  11.                 (100 . "AcDbSymbolTableRecord")
  12.                 (100 . "AcDbLayerTableRecord")
  13.                 (2 . "fjgj")
  14.                 (70 . 0)
  15.                 (62 . 1)
  16.                )
  17.     )
  18.   )
  19.   (setvar "clayer" "fjgj")


  20.   (setq L1 (getpoint))
  21.   (setq L2 (getpoint L1))
  22.   (setq KU (angle L1 L2))
  23.   (setq PT1 (polar L1 (+ KU (* 0.5 pi)) 75))
  24.   (setq PT2 (polar L1 (+ KU (* 1.5 pi)) 75))
  25.   (setq PT3 (polar L2 (+ KU (* 0.5 pi)) 75))
  26.   (setq PT4 (polar L2 (+ KU (* 1.5 pi)) 75))

  27. ;;;  (command "line" "non" L1 "non" L2 "")
  28. ;;;  (setq ZX (entlast))
  29. ;;;  (command "line" "non" PT1 "non" PT3 "")
  30. ;;;  (setq ENT13 (entlast))
  31. ;;;  (command "line" "non" PT2 "non" PT4 "")
  32. ;;;  (setq ENT24 (entlast))
  33.   (setq zx (entmakex (list '(0 . "LINE") (cons 10 l1) (cons 11 l2))))
  34.   (setq ENT13 (entmakex (list '(0 . "LINE") (cons 10 pt1) (cons 11 pt3))))
  35.   (setq ENT24 (entmakex (list '(0 . "LINE") (cons 10 pt2) (cons 11 pt4))))



  36.   (setq loop T)
  37.   (prompt "\n 偏移(A)/<退出>:")
  38.   (while (not (member (setq code (grread T 8)) '((2 32) (2 13))))
  39.     (if        (equal code '(2 97) 0.1)
  40.       (progn
  41.         (setq zP1 (cdr (assoc 10 (entget ZX))))
  42.         (setq zP2 (cdr (assoc 10 (entget ENT13))))
  43.         (setq dsa (distance zP1 zP2))
  44.         (setq ang (angle zP1 zP2))
  45. ;;;       (command "line" zP1 zP2 "")  这个创建两点间直线的语句我注释掉了,如果不注释的话,这个是可执行的,真能达到效果,我安一次A就能造出一条直线,按一次造一次。说明我前面写的都没有问题,就后面那句command错了
  46. ;;;       (command "move" ZX ENT13 ENT24 "" zP1 zP2)
  47. ;;;;;这句话我真的不知道哪错了呀,我就想把这三条直线,以zP1为基点,一块儿平移到zP2
  48.         (mapcar        '(lambda (x)
  49.                    (setq elist (entget x))
  50.                    (setq elist (subst (cons 10 (polar (cdr (assoc 10 elist)) ang dsa))
  51.                                       (assoc 10 elist)
  52.                                       elist
  53.                                )
  54.                    )
  55.                    (setq elist (subst (cons 11 (polar (cdr (assoc 11 elist)) ang dsa))
  56.                                       (assoc 11 elist)
  57.                                       elist
  58.                                )
  59.                    )
  60.                    (entmod elist)
  61.                  )
  62.                 (list ZX ENT13 ENT24)
  63.         )
  64.       )
  65.     )
  66.   )

  67.   (setvar "clayer" CL)
  68.   (setvar "CMDECHO" OLD_CMDECHO)
  69.   (setvar "PLINEWID" plwidth)
  70.   (princ)
  71. )
发表于 2021-6-16 13:43:46 | 显示全部楼层
测试代码注释和不注释都可以运行。
 楼主| 发表于 2021-6-16 15:27:54 来自手机 | 显示全部楼层
ssyfeng 发表于 2021-6-16 13:43
测试代码注释和不注释都可以运行。

啥意思呀,没看懂
command画zp1,zp2的连线那个可以运行;但是command move那个不能运行…
发表于 2021-6-16 15:33:58 | 显示全部楼层
本帖最后由 aihuyujian 于 2021-6-16 15:35 编辑

(setq ss nil ss (ssadd))
(ssadd ZX ss)
(ssadd ENT13 ss)
(ssadd ENT24 ss)
(command "move" ss  "" "none" zP1 "none" zP2)

发表于 2021-6-16 15:35:55 | 显示全部楼层
是可以运行,但不知道是不是你要的结果
发表于 2021-6-16 15:50:49 来自手机 | 显示全部楼层
学习一下,谢谢楼上
发表于 2021-6-16 18:04:38 | 显示全部楼层
截个图说明比较好,估计是没关捕捉
 楼主| 发表于 2021-6-16 19:56:00 | 显示全部楼层
非常非常感谢各位大佬的指点!接下来我一一拜读一下~
尤其是学习一下如果不使用command命令会怎样
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-2-21 03:07 , Processed in 0.254011 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表