下面是代码示例,可以实现上述功能。
(defun c:countPolyline (/ ss objects data result)
(setq ss (ssget "X" '((0 . "LWPOLYLINE"))))
(if ss
(progn
(setq objects (vl-remove-if-not 'vla-get-Linetype
(mapcar 'vlax-ename->vla-object
(vl-remove-if-not 'listp
(mapcar 'cadr
(ssnamex ss))))))
(setq data (mapcar (lambda (x)
(list (vla-get-Linetype x)
(vlax-curve-Stats (vlax-ename->vla-object (vla-get-Entity x)))))
objects))
(setq result
(sort (apply 'append
(mapcar (lambda (x)
(list (car x) (apply '+ (mapcar 'cadr x)))))
(mapcar (lambda (x)
(remove-duplicates (mapcar 'car x)
:test 'string-equal)))
(mapcar 'cdr
(group-objects-by 'car data)))
)
(lambda (x y) (string< (car x) (car y))))))
(princ "\n没有找到多段线")
)
(if result
(progn
(princ "\n多段线按线型求和:")
(foreach item result
(princ (strcat "\n线型:" (car item) " 数量:" (rtos (cadr item) 2 0))))
)
(princ "\n没有找到多段线")
)
(princ)
)
(defun group-objects-by (field list / hash)
(setq hash (mapcar (lambda (x) (list (funcall field x) x)) list))
(mapcar (lambda (k) (mapcar 'cdr (vl-remove-if-not (lambda (x) (equal k (car x))) hash)))
(remove-duplicates (mapcar 'car hash) :test 'equal)))
该代码包含了 c:countPolyline
函数和 group-objects-by
函数。 c:countPolyline
函数通过选择多段线实体并计算他们的数量并按线型排序进行求和。 group-objects-by
函数用于将对象分组并按字段进行排序。
运行该函数会返回多段线数量总和以及每个线型的数量。