尘缘一生 发表于 2019-6-12 20:08:04

实体选择集-->旋转-->新选择集问题

如题:


    1: 如果构件选择集(setq s(ssget))后,对实体旋转或移动,操作完成后,发现,其中各个实体名,是不变的。
    2:既然实体名没有变,那么继续用 选择集 S,进行后续编程,为什么失效呢?


如之奈何????
    如果这样不可以用选择集 S ;那么,如何取得旋转、移动之后,这部分实体的新的选择集?

   经验证:下面的方法亦然不会奏效。。。。。

[*];;;;(setq ss1 (entlast)) ;;;;;;构造最后一个实体选择集
[*]
[*];;;;;;;(setq s (last_ent ss1));;;;;;;旋转定位后,产生的选择集

尘缘一生 发表于 2019-6-12 22:15:25

看来大家不积极,那么我发段没调试成功的代码吧。希望有人能发现这段代码要解决的啥问题?解决了是很有用的。


[*]
[*];;; ---------------------------------------------------------
[*](defun c:CCJ (/ s ss pt1 pt2 nam n p ang)
[*](command)
[*](setq s (ssget))
[*](princ "\n选择要旋转的对象:")
[*](setq pt2 (nth 1 (grread 5)))
[*](setq pt1 90)
[*]
[*](setq e (entlast));最后一个图元
[*](setq ss (ssadd))
[*](command "ROTATE" s "" pt2 pt1 "")
[*](command "MOVE" s "" pt2)
[*](while (setq e (entnext e));把旋转后的图元,逐一加进选择集
[*]    (setq ss (ssadd e ss))
[*])
[*];;;;;;;;;以下更新旋转、移动后实体表,重新构件新选择集SS
[*];;;;;;;(setq s (last_ent ss1));;;;;;;旋转定位后,产生的选择集
[*](setq p (sslength ss))
[*](setq n 0)
[*](setq p (- p 1))
[*](while (<= n p)
[*]    (setq nam (ssname ss n))
[*]    (setq pt1 (entget nam))
[*]    (if(OR (="TEXT" (cdr(assoc 0 pt1)))(="MTEXT" (cdr(assoc 0 pt1))))
[*]      (progn
[*]      (command ".JUSTIFYTEXT" nam "" "M")
[*]      (setq ang (cdr(assoc 50 pt1)))
[*]      (if (and (>= ang (/ pi 2)) (<= ang pi)) ;;;;;第二象限
[*]          (setq ang (+ pi ang ))
[*]      )
[*]      (if (and (> angpi) (<= ang (* 1.5 pi))) ;;;;;第三象限
[*]          (setq ang (- ang pi))
[*]      )
[*]      (setq pt1 (subst (cons 50 ang) (assoc 50 pt1) pt1));;;;;实体表更新【角度】
[*]      (entmod pt1)
[*]      (entupd nam)
[*]      (command ".JUSTIFYTEXT" nam "" "L");;;;;;改回文字为左定位
[*]      )
[*]    )
[*]    (setq n (+ 1 n))
[*])
[*])

尘缘一生 发表于 2019-6-12 22:22:20

看来大家不积极,那么我发段没调试成功的代码吧。希望有人能发现这段代码要解决的啥问题?解决了是很有用的。
;;; ---------------------------------------------------------
(defun c:CCJ (/ s ss pt1 pt2 nam n p ang)
(command)
(setq s (ssget))
(princ "\n选择要旋转的对象:")
(setq pt2 (nth 1 (grread 5)))
(setq pt1 90)

(setq e (entlast));最后一个图元
(setq ss (ssadd))
(command "ROTATE" s "" pt2 pt1 "")
(command "MOVE" s "" pt2)
(while (setq e (entnext e));把旋转后的图元,逐一加进选择集
(setq ss (ssadd e ss))
)
;;;;;;;;;以下更新旋转、移动后实体表,重新构件新选择集SS
;;;;;;;(setq s (last_ent ss1));;;;;;;旋转定位后,产生的选择集
(setq p (sslength ss))
(setq n 0)
(setq p (- p 1))
(while (<= n p)
    (setq nam (ssname ss n))
    (setq pt1 (entget nam))
    (if(OR (="TEXT" (cdr(assoc 0 pt1)))(="MTEXT" (cdr(assoc 0 pt1))))
      (progn
      (command ".JUSTIFYTEXT" nam "" "M")
      (setq ang (cdr(assoc 50 pt1)))
      (if (and (>= ang (/ pi 2)) (<= ang pi)) ;;;;;第二象限
          (setq ang (+ pi ang ))
      )
      (if (and (> angpi) (<= ang (* 1.5 pi))) ;;;;;第三象限
          (setq ang (- ang pi))
      )
      (setq pt1 (subst (cons 50 ang) (assoc 50 pt1) pt1));;;;;实体表更新【角度】
      (entmod pt1)
      (entupd nam)
      (command ".JUSTIFYTEXT" nam "" "L");;;;;;改回文字为左定位
      )
    )
    (setq n (+ 1 n))
)
)

Bao_lai 发表于 2019-6-13 00:02:58

试试ssget "P"

菜卷鱼 发表于 2019-6-13 08:40:24

给你参考一下

(defun c:rt ( / sspp pt ss)(princ "快速旋转<90°逆时针>")
(setq ss(ssget ":s"))
(if(= ss nil)(setq ss sso)(setq sso ss))
(if(= sso nil)(princ "\n没有选择对象"))
(setq pt (centerp sso))       ;;;;centerp 包围盒的中心
(setq pt (trans pt 0 1))
(setvar 'cmdecho 0)
(command "_.rotate" sso "" "NON" pt -90)
(setvar 'cmdecho 1)
(prin1))

296715530 发表于 2019-12-31 13:31:22

菜卷鱼 发表于 2019-6-13 08:40
给你参考一下

不能 用啊,缺少函数

菜卷鱼 发表于 2020-1-4 08:45:09

296715530 发表于 2019-12-31 13:31
不能 用啊,缺少函数

;;;;;centerp 包围盒的中心
没发这个函数,论坛里很多

296715530 发表于 2020-1-5 22:04:27

菜卷鱼 发表于 2020-1-4 08:45
;;;;;centerp 包围盒的中心
没发这个函数,论坛里很多

不懂函数,发个完整的呗,

菜卷鱼 发表于 2020-1-6 08:28:18

296715530 发表于 2020-1-5 22:04
不懂函数,发个完整的呗,

http://bbs.mjtd.com/forum.php?mod=viewthread&tid=109639&fromuid=399892

296715530 发表于 2020-1-14 13:34:22

菜卷鱼 发表于 2020-1-6 08:28
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=109639&fromuid=399892

选择对象: 指定对角点:
; 错误: 参数类型错误: lentityp <Selection set: 1120>
命令:
页: [1]
查看完整版本: 实体选择集-->旋转-->新选择集问题