bsimpson 发表于 2022-7-6 07:20:01

在p上创建直线

你好
 
我参考了随附的由等距线段组成的多段线草图。我需要一个lisp文件,将最适合直线到多段线。随附的是两条多段线的图纸。洋红色多段线应采用lisp例程,最好用直线拟合。
 
谢谢
BSimpson公司
多段线到多段线。pdf
长截面1。图纸

marko_ribar 发表于 2022-7-6 08:17:25

以下是我写的内容-创建最适合选定二维多段线的绿线:
 

;;-------------------=={ List Difference }==------------------;;
;;                                                            ;;
;;Returns items appearing exclusively in one list but not   ;;
;;another, i.e. the relative complement: l1 \ l2            ;;
;;------------------------------------------------------------;;
;;Author: Lee Mac, Copyright © 2011 - www.lee-mac.com       ;;
;;------------------------------------------------------------;;
;;Arguments:                                                ;;
;;l1,l2 - lists for which to return the difference          ;;
;;------------------------------------------------------------;;
;;Returns:List of items appearing exclusively in list l1;;
;;------------------------------------------------------------;;

(defun LM:ListDifference ( l1 l2 )
(vl-remove-if '(lambda ( x ) (member x l2)) l1)
)

(defun prelst ( lst el / f )
(vl-remove-if '(lambda ( a ) (or f (setq f (equal a el 1e-))) lst)
)

(defun suflst ( lst el )
(cdr (vl-member-if '(lambda ( a ) (equal a el 1e-) lst))
)

(defun c:plbestfit ( / osm q ss pl vert pt ptlst anglst danglst uanglst nths ptlstn p1 p2 p3 p4 p linplst sss )
(setq osm (getvar 'osmode))
(setvar 'osmode 0)
(prompt "\nPick 2d polyline")
(setq q T)
(while q
   (setq ss (ssget "_+.:E:S:L" '((0 . "*POLYLINE"))))
   (if ss
   (if (eq (cdr (assoc 100 (reverse (entget (ssname ss 0))))) "AcDb3dPolyline") (setq q T) (setq q nil))
   (setq q nil)
   )
)

(if (eq (cdr (assoc 0 (entget (setq pl (ssname ss 0))))) "POLYLINE")
   (progn
   (setq vert (entnext pl))
   (setq pt (cdr (assoc 10 (entget vert))))
   (setq ptlst (cons pt ptlst))
   (while (eq (cdr (assoc 0 (entget (setq vert (entnext vert))))) "VERTEX")
       (setq pt (cdr (assoc 10 (entget vert))))
       (setq ptlst (cons pt ptlst))
   )
   (setq ptlst (reverse ptlst))
   )
)

(if (eq (cdr (assoc 0 (entget (setq pl (ssname ss 0))))) "LWPOLYLINE")
   (progn
   (command "_.convertpoly" "H" pl "")
   (setq vert (entnext pl))
   (setq pt (cdr (assoc 10 (entget vert))))
   (setq ptlst (cons pt ptlst))
   (while (eq (cdr (assoc 0 (entget (setq vert (entnext vert))))) "VERTEX")
       (setq pt (cdr (assoc 10 (entget vert))))
       (setq ptlst (cons pt ptlst))
   )
   (setq ptlst (reverse ptlst))
   (command "_.convertpoly" "L" pl "")
   )
)

(setq ptlst (acet-list-remove-duplicates ptlst 1e-2))

(setq anglst (mapcar '(lambda (a b) (angle a b)) ptlst (cdr ptlst)))

(foreach ang anglst
   (cond ((<= (* 1.5 pi) ang (* 2.0 pi)) (setq danglst (cons ang danglst)))
         ((<= 0.0 ang (* 0.5 pi)) (setq uanglst (cons ang uanglst)))
   )
)

(setq danglst (reverse danglst) uanglst (reverse uanglst))

(defun nthsegang ( anglst danglst uanglst / seglst1 seg1ang s1 seglst2 seg2ang s2 )
   (if (equal (car danglst) (car anglst) 1e- (setq seglst1 (prelst anglst (car uanglst))))
   (if (equal (car uanglst) (car anglst) 1e- (setq seglst2 (prelst anglst (car danglst))))
   (setq s1 (length seglst1) s2 (length seglst2))
   (setq sss (+ (if (null sss) 0 sss) s1 s2))
   (if seglst1 (setq seg1ang (car (vl-sort seglst1 '<=))))
   (if seglst2 (setq seg2ang (car (vl-sort seglst2 '>=))))
   (if seglst1 (setq danglst (LM:ListDifference danglst seglst1) anglst (LM:ListDifference anglst seglst1)))
   (if seglst2 (setq uanglst (LM:ListDifference uanglst seglst2) anglst (LM:ListDifference anglst seglst2)))
   (if seglst1 (if (null nths) (setq nths (cons (+ (length (prelst seglst1 seg1ang)) 1) nths)) (setq nths (cons (+ sss (- s1) (- s2) (length (prelst seglst1 seg1ang)) 1) nths))))
   (if seglst2 (if (null nths) (setq nths (cons (+ (length (prelst seglst2 seg2ang)) 1) nths)) (setq nths (cons (+ sss (- s1) (- s2) (length (prelst seglst2 seg2ang)) 1) nths))))
   (if anglst (nthsegang anglst danglst uanglst))
   nths
)

(setq nths (reverse (nthsegang anglst danglst uanglst)))

(foreach n nths
   (setq ptlstn (cons (nth (- n 1) ptlst) ptlstn) ptlstn (cons (nth n ptlst) ptlstn))
)

(setq ptlstn (reverse ptlstn))

(while (> (length ptlstn) 2)
   (setq p1 (car ptlstn) p2 (cadr ptlstn) p3 (caddr ptlstn) p4 (cadddr ptlstn))
   (setq p (inters p1 p2 p3 p4 nil))
   (setq linplst (cons p linplst))
   (setq ptlstn (cddr ptlstn))
)

(setq linplst (reverse linplst))

(while (> (length linplst) 1)
   (setq p1 (car linplst) p2 (cadr linplst))
   (entmake (list '(0 . "LINE") '(62 . 3) (cons 10 p1) (cons 11 p2)))
   (setq linplst (cdr linplst))
)
   
(setvar 'osmode osm)
(princ)
)

 
或者,您可以将直线转换为多段线-pedit、multiple、select lines、join。。。
 
M、 R。

bsimpson 发表于 2022-7-6 08:44:58

你好,Marco_ribar,
 
lisp工作得很好,但当我尝试更长的多段线时,我得到了以下错误消息;
 
选择对象:找到1个
选择对象:转换1个多段线对象。
命令:_。convertpoly输入多段线转换选项[重/轻]:L
选择对象:找到1个
选择对象:转换1个多段线对象。
命令:发生硬错误***
达到内部堆栈限制(模拟)
页: [1]
查看完整版本: 在p上创建直线