Tharwat 发表于 2022-7-6 10:29:07

如何使用ssget?

你好
 
我想知道如何将(entsel函数)替换为(ssget函数)!!!
 

(vl-load-com)
(setq LINE (car (entsel "\n Select a Line: ")))
(setq Myline (vlax-ename->vla-object LINE))
(vla-get-length Myline)

 
非常感谢。
 
塔瓦特

Lee Mac 发表于 2022-7-6 10:34:07

对于单个选择,可能是这样的?
 
(ssget "_+.:E:S" '((0 . "LINE")))
 
对于多个,您需要逐步完成集合:
 

(if (setq i -1 ss (ssget '((0 . "LINE"))))
(while (setq e (ssname ss (setq i (1+ i))))
   (print (vla-get-length (vlax-ename->vla-object e)))
)
)

 
或者可以使用vlax for单步遍历VL中的ActiveSelectionSet(或者实际上,您可以在VL中获取SelectionSet)。

Tharwat 发表于 2022-7-6 10:37:29

谢谢李。
 
当你提到“也许”时,我很惊讶。
 
但是当你把剩下的加进去时,我深深地吸了一口气。因此,代码目前运行良好。
 

(vl-load-com)
(if (setq i -1
ss (ssget '((0 . "LINE"))))
(while
   (setq e (ssname ss (setq i (1+ i))))
   (setq obj (vlax-ename->vla-object e))
   (setq len (vla-get-length obj))
       ))

 
为什么以下功能不能正确响应代码?
(setq start (vla-get-startpoint obj))
(setq end (vla-get-endpoint obj))

 
非常感谢。

Lee Mac 发表于 2022-7-6 10:38:54

请记住,vla get startpoint/endpoint返回变量需要转换为safearrays,然后列出是否计划将其用作普通数据类型,例如:
 
或者,为了避免这种转换:
 
(vlax-get <VLA-Object> 'StartPoint)

Lee Mac 发表于 2022-7-6 10:42:33

也许为了其他人的利益,您可以这样在VL中完全获得相同的选择集:
 

(defun c:test

   ( /
       _SafearrayVariant
       _GetUniqueKey

       SelSet
       SelSets
   )

(vl-load-com)
;; © Lee Mac 2010

(defun _SafearrayVariant ( datatype data )
   (vlax-make-variant
   (vlax-safearray-fill
       (vlax-make-safearray datatype (cons 0 (1- (length data))))
       data
   )   
   )
)

(defun _GetUniqueKey ( collection seed )
   (
   (lambda ( i / key )
       (while
         (not
         (vl-catch-all-error-p
             (vl-catch-all-apply 'vla-item
               (list collection
               (setq key
                   (strcat seed
                     (itoa
                     (setq i (1+ i))
                     )
                   )
               )
               )
             )
         )
         )
       )
       key
   )
   0
   )
)

(vla-SelectonScreen
   (setq SelSet
   (vla-Add
       (setq SelSets
         (vla-get-SelectionSets
         (vla-get-ActiveDocument
             (vlax-get-acad-object)
         )
         )
       )
       (_GetUniqueKey SelSets "SelSet")
   )
   )
   (_SafearrayVariant vlax-vbinteger '(0))
   (_SafearrayVariant vlax-vbvariant '("LINE"))
)

(if (< 0 (vla-get-Count SelSet))
   (vlax-for o SelSet
   (print (vla-get-length o))
   )
)

(vla-delete SelSet)

(princ)
)

或所有AutoLISP。。。
(defun c:Test (/ ss)
(if (setq ss (ssget '((0 . "LINE"))))
   (progn
   (vlax-for x (setq ss (vla-get-activeselectionset
                            (vla-get-activedocument (vlax-get-acad-object))
                        )
               )
       (print (vla-get-length x))
   )
   (vla-delete ss)
   )
)
(princ)
)

alanjt 发表于 2022-7-6 10:47:01

谢谢Alanjt。
 
请告诉我以下两种代码之间的区别是什么。。
第一
(defun c:Test (/ i ss e l)
(if (setq i-1
         ss (ssget '((0 . "LINE")))
   )
   (while (setq e (ssname ss (setq i (1+ i))))
   (print (distance (cdr (assoc 10 (setq l (entget e)))) (cdr (assoc 11 l))))
   )
)
(princ)
)
第二

(vl-load-com)
(setq i -1
ss (ssget '((0 . "LINE"))))
(progn
   (setq e (ssname ss (setq i (1+ i))))
   (setq obj (vlax-ename->vla-object e))
   (print (vla-get-length obj))
       ))

 
非常感谢

Tharwat 发表于 2022-7-6 10:51:08

 
非常感谢。
 
假设我想得到起点和终点,我应该重复转换两次来得到这两个点吗?
示例。

(vl-load-com)
(setq ss (ssget '((0 . "LINE"))))
   (progn
   (vlax-for x (setq ss (vla-get-activeselectionset
                            (vla-get-activedocument (vlax-get-acad-object))
                        )
               )
       (print (vla-get-length x))
   )
   (vla-delete ss)
   )

 
当做

Tharwat 发表于 2022-7-6 10:52:38

如果您希望以这种方式继续,请在转换后设置变量,因此:
 

(vl-load-com)
(if (setq i -1 ss (ssget '((0 . "LINE"))))
   (progn
      (setq e (ssname ss (setq i (1+ i))))
      (setq obj (vlax-ename->vla-object e))
         (vlax-safearray->list
            (vlax-variant-value
      (setq start (vla-get-StartPoint obj))                  
             )
       )
   (vlax-safearray->list
            (vlax-variant-value
      (setq end (vla-get-endPoint obj))
        )
   )
   ))

 
否则,您可以同样使用:
 

(setq start
(vlax-safearray->list
   (vlax-variant-value
   (vla-get-StartPoint obj)
   )
)
)

 

Lee Mac 发表于 2022-7-6 10:55:58

你真了不起,李。
 
非常感谢你。这真的很吸引人。
 
塔瓦特

Tharwat 发表于 2022-7-6 10:58:43


(setq Start (vlax-get obj 'StartPoint))
页: [1] 2
查看完整版本: 如何使用ssget?