iconeo 发表于 2022-7-5 17:48:27

lisp帮助-添加(ssget)

lisp只需获取一个对象并将其发送到“现有”层。
 
我希望能够通过选择单个对象或一组对象来运行此lisp,但我不确定一旦有了对象,如何浏览对象列表。感谢您的帮助。
 
附加:我想如果可以通过选择对象然后运行lisp或运行lisp然后选择对象来运行lisp,那将是一件好事。。。这有意义吗?
 
;;load the visual lisp extensions
(vl-load-com)

(defun c:sendtoexisting        (/ object)

;;check for selection
(while
   (setq
   sset
      (car (entsel "\nSelect object to move to existing layer:")
      )
   )

    ;;convert to vl object
    (setq sset (vlax-ename->vla-object sset))
    ;;get current layer of object
    (setq clayer (vla-get-layer sset))
    (if (= nil (vl-string-search "EXST" clayer))
      (progn

;;set existing layer
(setq elayer (strcat "S-EXST" (substr clayer 2)))

;;create the existing layer
(_createlayer
   elayer
   155
   (cdr (assoc 6 (tblsearch "LAYER" clayer)))
)

;;move the object to the existing layer      
(vla-put-layer sset elayer)

;;set the object's color to ByLayer
(vla-put-color sset 256)

      )
      (princ "\nObject is already on an EXISTING layer.")
    )
)
)

(defun _createlayer (name colour linetype)
(if (null (tblsearch "LAYER" name))
   (entmake
   (list
'(0 . "LAYER")
'(100 . "AcDbSymbolTableRecord")
'(100 . "AcDbLayerTableRecord")
'(70 . 0)
(cons 2 name)
(cons 6 linetype)
(cons 62 colour)
   )
   )
)
)

Tharwat 发表于 2022-7-5 18:03:35

你好
 
试试这个未经测试的快速mods。

(vl-load-com)
(defun c:sendtoexisting(/ ss i obj clay nlay)
(princ "\nSelect objects to move to existing layer:")
(if (setq ss (ssget "_:L"))
(repeat (setq i (sslength ss))
    (setq obj (vlax-ename->vla-object (ssname ss (setq i (1- i))))
          clayer (vla-get-layer obj)
          )
    (if (not (vl-string-search "EXST" clay))
      (progn
      (setq nlay (strcat "S-EXST" (substr clay 2)))
      (_createlayer nelayer 155 (cdr (assoc 6 (tblsearch "LAYER" clay))))
      (vla-put-layer obj nlay)
      (vla-put-color obj 256)
      )
      (princ "\nObject is already on an EXISTING layer.")
      )
    )
)
(princ)
)

(defun _createlayer(name colour linetype)
(if (null (tblsearch "LAYER" name))
   (entmake
   (list
       '(0 . "LAYER")
       '(100 . "AcDbSymbolTableRecord")
       '(100 . "AcDbLayerTableRecord")
       '(70 . 0)
       (cons 2 name)
       (cons 6 linetype)
       (cons 62 colour)
       )
   )
   )
)

David Bethel 发表于 2022-7-5 18:19:38

或者在vanilla AutoLisp中使用更强大的力量:
 

(defun c:exlayer (/ ln ss i en ed vn vd)

(setq ln "EXISTING")

(if (not (tblsearch "LAYER" ln))
   (command "_.LAYER" "_N" ln ""))

(princ (strcat "\nSelect Entities To Change To Layer " ln))
(while (not ss)
      (setq ss (ssget)))

(setq i 0)
(while (setq en (ssname ss i))
      (setq ed (entget en))
      (if (= 1 (cdr (assoc 66 ed)))
            (progn
            (setq vn (entnext en)
                  vd (entget vn))
            (while (/= "SEQEND" (cdr (assoc 0 vd)))
                     (entmod (subst (cons 8 ln) (assoc 8 vd) vd))
                     (setq vn (entnext vn)
                           vd (entget vn)))
            (entupd en))
         (entmod (subst (cons 8 ln) (assoc 8 ed) ed)))
      (setq i (1+ i)))

(prin1))

 
-大卫

iconeo 发表于 2022-7-5 18:35:59

谢谢你们俩的帮助。最后一个问题。
 
我添加了只选择一个对象或整个层的选项,但是在我处理对象的情况下,如何将初始entsel从initget添加到ss选择集。基本上,我必须双击我现在想要选择的第一个项目,这是我想要避免的。
 
谢谢
 
;; by Chau Huh 2015-10-21

;;load the visual lisp extensions
(vl-load-com)

(defun c:sendtoexisting
      (/ ss i obj clayer nlayer ans TargEnt TargLayer)
;;;(princ "\nSelect objects to move to existing layer:")

(initget 1 "Object lAyer")
(setq ans (entsel (strcat "Select by <Object>: ")))

(if (= ans "lAyer")
   (progn
   (princ "\nSelect layer to move to existing: ")
   (setq TargEnt (car (entsel "\nSelect object on layer: ")))
   (setq TargLayer (assoc 8 (entget TargEnt)))
   (sssetfirst nil (ssget "_X" (list TargLayer)))
   (princ)
   )
)

(if (setq ss (ssget "_:L"))
   (repeat (setq i (sslength ss))
   (setq obj           (vlax-ename->vla-object (ssname ss (setq i (1- i))))
    clayer (vla-get-layer obj)
   )
   (if (not (vl-string-search "EXST" clayer))
(progn
(setq nlayer (strcat "S-EXST" (substr clayer 2)))
(_createlayer
    nlayer
    155
    (cdr (assoc 6 (tblsearch "LAYER" clayer)))
)
(vla-put-layer obj nlayer)
(vla-put-color obj 256)
)
(princ "\nObject is already on an EXISTING layer.")
   )
   )
)

(princ)
)

(defun _createlayer (name colour linetype)
(if (null (tblsearch "LAYER" name))
   (entmake
   (list
'(0 . "LAYER")
'(100 . "AcDbSymbolTableRecord")
'(100 . "AcDbLayerTableRecord")
'(70 . 0)
(cons 2 name)
(cons 6 linetype)
(cons 62 colour)
   )
   )
)
)

broncos15 发表于 2022-7-5 18:46:40

利用ssadd功能。

David Bethel 发表于 2022-7-5 18:59:29

您要更改的图层上是否已经选择了实体?
页: [1]
查看完整版本: lisp帮助-添加(ssget)