waders 发表于 2022-7-6 07:23:45

连接2个命令

好的,这看起来很简单。我该如何连接这两个命令,这样无论直线是直线还是pline。谢谢

(defun c:heal2(/ block ll ur p1 p2)
   (vl-load-com)
   (setq block (car (entsel "\nSelect Block:")))
   (vla-getboundingbox (vlax-ename->vla-object block) 'll 'ur)
   (command "_.erase" block "")
   (command
         "_.pedit"
         "_m"
         (ssget "C"
                  (setq p1 (vlax-safearray->list ll))
                  (setq p2 (vlax-safearray->list ur)))
         ""
         "_join" "_Joint" "_Both"
         (distance p1 p2)
         "")
   (princ)
   )


(defun c:HEAL (/ block ll ur objecttojoin)
   (vl-load-com)
   (setq block (car (entsel "\nSelect Block:")))
   (vla-getboundingbox (vlax-ename->vla-object block) 'll 'ur)
   (command "_.erase" block "")
   (setq objecttojoin
                (ssget "C"
                     (vlax-safearray->list ll)
                     (vlax-safearray->list ur)))
   (command
         "_.join"
         (ssname objecttojoin 0)
         (ssname objecttojoin 1)
         "")
   )

pBe 发表于 2022-7-6 07:37:08

如果您不介意将线转换为PLINE,那么如果将PEDITACEPT设置为1,则可以同时使用heal2
 
(defun c:heal2(/ block pea ll ur p1 p2)
    (vl-load-com)
   (setq pea (getvar 'Peditaccept))
    (setvar 'PeditAccept 1)
    (setq block (car (entsel "\nSelect Block:")))
    (vla-getboundingbox (vlax-ename->vla-object block) 'll 'ur)
    (command "_.erase" block "")
    (command
          "_.pedit"
          "_m"
          (ssget "C"
               (setq p1 (vlax-safearray->list ll))
               (setq p2 (vlax-safearray->list ur)))
          ""
          "_join" "_Joint" "_Both"
          (distance p1 p2)
          "")
    (setvar 'PeditAccept pea)
    (princ)
    )

waders 发表于 2022-7-6 07:40:32

首先感谢pBe的关注。
如果我有选择的话,我想把普林斯转换成直线连接。但我不应该添加一个:

(cond
((= $ent2 line)(c:heal))
((= $ent2 lwpolyline)(c:heal2))
)
$ent2将是选中的挂起的直线或lwpolyline。

pBe 发表于 2022-7-6 07:50:30

 
它要么你分解选择,把它变成线,然后加入或使用heal2然后分解。
 
 
(defun c:heald(/ pea block ll ur objs p1 p2)
    (vl-load-com)
(setq pea (getvar 'Peditaccept))
    (setvar 'PeditAccept 1)
    (setq block (car (entsel "\nSelect Block:")))
    (vla-getboundingbox (vlax-ename->vla-object block) 'll 'ur)
    (command "_.erase" block "")
    (setq objs (ssget "C"
               (setq p1 (vlax-safearray->list ll))
               (setq p2 (vlax-safearray->list ur))))
(if (eq (cdr (assoc 0 (entget (ssname objs 0)))) "LWPOLYLINE")          
    (command "_.pedit" "_m" objs "" "_join" "_Joint" "_Both"
          (distance p1 p2) "")
    (command "_.join" (ssname objs 0) (ssname objs 1) "")
    )
(setvar 'PeditAccept pea)
(princ)
)

waders 发表于 2022-7-6 07:55:15

谢谢pBe。这很有效。我知道你是怎么做到的,但我知道我只需要弄清楚你是怎么想到的。我要看看我是否能想出如何过滤出只选择块。如果我这样做,我会重新发布。再次感谢你的帮助。

pBe 发表于 2022-7-6 08:01:47

 
对你很好,希望你能从中学习。毕竟这是你的代码。
 
 
如果你的意思是一次多选。是的,可以做到。你肯定会自己解决的。随时向我们通报
 
干杯

waders 发表于 2022-7-6 08:09:14

好的,我得到了,所以我只能选择一个街区。但如果我选择多个区块,它只对一个区块有效,而忽略其他区块。我该如何使其对选择集中的每个项目运行?谢谢
 

(defun c:ee (/ pea $blk block ll ur objs p1 p2)
(vl-load-com)
(setq pea (getvar 'Peditaccept))
(setvar 'PeditAccept 1)
(setq $blk (ssget '((0 . "insert"))))
(setq block (ssname $blk 0))
(vla-getboundingbox (vlax-ename->vla-object block) 'll 'ur)
(command "_.erase" block "")
(setq objs (ssget "C"
   (setq p1 (vlax-safearray->list ll))
   (setq p2 (vlax-safearray->list ur))
   )
)
(if (eq (cdr (assoc 0 (entget (ssname objs 0)))) "LWPOLYLINE")
   (command "_.pedit"
   "_m"
   objs
   ""
   "_join"
   "_Joint"
   "_Both"
   (distance p1 p2)
   ""
   )
   (command "_.join" (ssname objs 0) (ssname objs 1) "")
)
(setvar 'PeditAccept pea)
(princ)
)

pBe 发表于 2022-7-6 08:23:24

让我们试试
 
(defun c:hint ()
(if        (setq ss (ssget '((0 . "INSERT"))))
                (repeat (setq i (sslength ss))
                  (setq pt(cdr
                       (assoc10
                           (entget
                             (setq e (ssname ss (setq i (1- i))))
                           ))))
                  (command "_rotate" e "" "_non" pt "180")
          )
    )(princ)
)

Scroll down when you're ready
|||
|||
|||
\    /
\/




















(defun c:ee (/ pea $blk block i ll ur objs p1 p2)
(vl-load-com)
(setq pea (getvar 'Peditaccept))
(setvar 'PeditAccept 1)
(if (setq $blk (ssget '((0 . "insert"))))
(repeat (setq i (sslength $blk))
            (setq e (ssname$blk (setq i (1- i))))
        (vla-getboundingbox (vlax-ename->vla-object e) 'll 'ur)
            (entdel e)
(setq objs (ssget "C"
      (setq p1 (vlax-safearray->list ll))
      (setq p2 (vlax-safearray->list ur))
      )
)
(if (eq (cdr (assoc 0 (entget (ssname objs 0)))) "LWPOLYLINE")
          (command "_.pedit""_m"objs
                   """_join" "_Joint"
                   "_Both" (distance p1 p2)
                   "" )
          (command "_.join" (ssname objs 0) (ssname objs 1) "")
        )
    )
   (princ "\nNo Blocks Selected")
   )
(setvar 'PeditAccept pea)
(princ)
)

 
看看你能不能把它作为参考。
这毕竟是CAD导师

waders 发表于 2022-7-6 08:24:17

嘿,pbe,我想我不太明白为什么我们需要我们sslength并得到块的插入点。但它确实有效。非常感谢您抽出时间。
 

(defun c:ee (/ pea $blk block ll ur objs p1 p2)
(vl-load-com)
(setq pea (getvar 'Peditaccept))
(setvar 'PeditAccept 1)
(if (setq $blk (ssget '((0 . "insert"))))
(repeat (setq i (sslength $blk))
   (setq pt (cdr
   (assoc 10
      (entget
       (setq block (ssname $blk (setq i (1- i))))
   ))))
   (vla-getboundingbox (vlax-ename->vla-object block) 'll 'ur)
   (command "_.erase" block "")
   (setq objs (ssget "C"
(setq p1 (vlax-safearray->list ll))
(setq p2 (vlax-safearray->list ur))
)
   )
   (if (eq (cdr (assoc 0 (entget (ssname objs 0)))) "LWPOLYLINE")
(command "_.pedit"
"_m"
objs
""
"_join"
"_Joint"
"_Both"
(distance p1 p2)
""
)
(command "_.join" (ssname objs 0) (ssname objs 1) "")
   )
   );repeat
);if
(setvar 'PeditAccept pea)
(princ)
)
页: [1]
查看完整版本: 连接2个命令