motee-z 发表于 2022-7-5 18:44:10

根据距离对三维多段线排序

你好,朋友们
我试图根据实体名称列表在多段线上的位置对其进行排序
(defun c:nn(/ )   
(princ "\n Select 3d polyline :")
(setq entlst'())
(setq sel (ssget'((0 . "POLYLINE"))))
(repeat (setq idx (sslength sel))
         (setq ent (ssname sel (setq idx (- idx 1)))
                     enx (entget ent)
               )
   (setq name(cdr(assoc -1 enx)))
   (setq entlst(cons name entlst))
   )
)
存储在entlst中的实体名称列表
我想根据列表在多段线上的位置对其进行排序
如附图所示
我稍后的目标是通过一次选择所有三维多段线来绘制横截面
谢谢
图纸2.dwg

Tharwat 发表于 2022-7-5 18:50:42

嗨,莫蒂,
 
青色的LWpolyline远离红色的3DPolyline,因此如何知道哪个点是位置上距离LWpolyline最近的点?
 
换句话说,您需要至少有相互相交的对象(如示例中所示),才能获得相交点,并根据每个点在多段线上的位置对其进行排序。

motee-z 发表于 2022-7-5 18:54:00

嗨tharwat
是的,仅对红色的三维多段线进行排序
列表中的第一项是其在青色线上的距离为0的第一条三维多段线
第二项距离为5个单位

Tharwat 发表于 2022-7-5 18:57:08

根本没有相交,每个多段线有许多坐标点,那么哪个点应该被视为位置点?
 
将图形的视图更改为右视图,以查看我指示的内容。

motee-z 发表于 2022-7-5 18:58:57

由于二维多段线上的偏移,有没有办法对实体名称进行排序
我不知道是否可以检索2d poline和3d poline之间的明显交点
或者可以将三维多边形的副本展平,然后获取交点,然后在删除此副本后计算位置

Tharwat 发表于 2022-7-5 19:02:47

是的,如果您展平所有目标多段线,那么这是可能的。
 
如果这符合您的需要,那么您可以使用以下程序,变量“data”应该包含已排序的实体。
 

(defun c:Test (/ s o d ss i p sn lst _lst l r pts data)
(princ "\nPick LWpolyline :")
(if (setq s (ssget "_+.:S:E" '((0 . "LWPOLYLINE"))))
   (progn
   (setq o (vlax-ename->vla-object (ssname s 0))
         d (vlax-get-acad-object)
         )
   (vla-getboundingbox o 'l 'r)
   (vla-zoomwindow d r l)
   (setq pts (mapcar 'vlax-safearray->list (list l r)))
   (if (setq ss (ssget "_C" (car pts) (cadr pts) '((0 . "POLYLINE"))))
       (repeat (setq i (sslength ss))
         (if (setq p (vlax-invoke
                     o
                     'intersectwith
                     (vlax-ename->vla-object
                         (setq sn (ssname ss (setq i (1- i))))
                         )
                     acextendnone
                     )
                   )
         (setq lst (cons (list (vlax-curve-getdistatpoint o p)
                                 (cdr (assoc -1 (entget sn)))
                                 )
                           lst
                           )
               )
         )
         )
       )
   (if lst
       (setq _lst (vl-sort lst '(lambda (j k) (< (car j) (car k))))
             data (mapcar 'cadr _lst)
             )
       )
   (vla-zoomprevious d)
   )
   )
(princ)
) (vl-load-com)

motee-z 发表于 2022-7-5 19:07:16

谢谢你,谢谢
我会测试Lisp程序并通知你

marko_ribar 发表于 2022-7-5 19:11:16

也许这个。。。
 
(defun c:sortenamesbyfenceselectionofpickedcurve ( / curve d fd n k p pl ss1 sss ss2 ss enames )

(vl-load-com)

(setq curve (car (entsel "\nPick selecting curve...")))
(while (or (not curve) (vl-catch-all-error-p (vl-catch-all-apply 'vlax-curve-getstartpoint (list curve))))
   (prompt "\nMissed or picked entity doesn't belong to curves... Please try picking correct curve entity again...")
   (setq curve (car (entsel)))
)
(initget 7)
(setq fd (getdist (strcat "\nPick or specify fence distance for selecting by fence along picked curve in interval from 0.0 to " (rtos (setq d (vlax-curve-getdistatparam curve (vlax-curve-getendparam curve))) 2 50) " : ")))
(setq n (1+ (fix (/ d fd))))
(setq fd (/ d n))
(setq k -1)
(repeat (1+ n)
   (setq p (vlax-curve-getpointatdist curve (* fd (setq k (1+ k)))))
   (setq pl (cons p pl))
)
(setq pl (reverse pl))
(if (equal (car pl) (vlax-curve-getstartpoint curve) 1e-6) (setq pl (subst (vlax-curve-getstartpoint curve) (car pl) pl)))
(if (equal (last pl) (vlax-curve-getendpoint curve) 1e-6) (setq pl (subst (vlax-curve-getendpoint curve) (last pl) pl)))
(setq ss1 (ssget "_C" (mapcar '- (car pl) '(1e-3 1e-3)) (mapcar '+ (car pl) '(1e-3 1e-3))))
(ssdel curve ss1)
(setq sss (ssget "_F" pl))
(ssdel curve sss)
(setq ss2 (ssget "_C" (mapcar '- (last pl) '(1e-3 1e-3)) (mapcar '+ (last pl) '(1e-3 1e-3))))
(ssdel curve ss2)
(setq ss (acet-ss-union (list ss1 sss ss2)))
(setq enames (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
(foreach ename enames
   (redraw ename 2)
   (if (or (eq ename (car enames)) (eq ename (last enames)))
   (repeat 750 (redraw))
   (repeat 250 (redraw))
   )
   (redraw ename 1)
)
(princ)
)

(defun c:sebfspc nil (c:sortenamesbyfenceselectionofpickedcurve))
HTH,M.R。

motee-z 发表于 2022-7-5 19:13:17

马库钢筋谢谢你的回复
图形中挤满了其他实体,但我清除了所有不需要的实体
因此,这种方法不是首选方法,用户没有选择与三维多段线相关的选项,所有与二维多边形相交的内容都将计算出来
tharwat我看不到我提到的实体名称列表,我想选择2dpolyline,然后选择所有三维polyline,然后获取实体名称列表

Tharwat 发表于 2022-7-5 19:17:11

 
如前所述,已排序的实体将保留在变量名“data”下,因此要查看这些名称,只需在变量结束的地方直接添加以下内容:
 

(princ data)

 
无需选择3Dpolyline,因为程序将代表您处理此问题。
页: [1] 2
查看完整版本: 根据距离对三维多段线排序