marko_ribar 发表于 2022-7-5 23:01:55

 
不客气。。。如果你没有2011+,也许可以试试这个代码。。。拾取的多段线必须是正确的偏移对(顶点数相同)。。。它应该可以工作,在其他一些UCS中,只需将UCS设置为与参考多段线平行。。。
 

(defun c:cenoffpls ( / chkoff _sel es ed pes ped off n k )

(defun chkoff ( es ed fuzz / member-fuzz esd edd pes ped eld edd10-42 k kk mm edd10-42g eddr10-42g eld10-42 eld10-42g ) (vl-load-com)

   (defun member-fuzz ( e l f )
   (vl-member-if '(lambda ( x ) (and (equal (car e) (car x) f) (equal (cadr e) (cadr x) f))) l)
   )

   (setq esd (entget es))
   (setq edd (entget ed))
   (setq pes (vlax-curve-getpointatparam es 0.5))
   (setq ped (vlax-curve-getclosestpointto ed pes))
   (command "_.OFFSET" "_T" es (trans ped 0 1) "")
   (setq eld (entget (entlast)))
   (entdel (entlast))
   (setq edd10-42 (vl-remove-if-not '(lambda ( x ) (or (eq (car x) 10) (eq (car x) 42))) edd))
   (setq k -1)
   (repeat (/ (length edd10-42) 2)
   (setq kk (* (setq k (1+ k)) 2))
   (setq mm (1+ kk))
   (setq edd10-42g (cons (list (nth kk edd10-42) (nth mm edd10-42)) edd10-42g))
   )
   (setq edd10-42g (reverse edd10-42g))
   (if (eq 0 (logand (cdr (assoc 70 edd)) 1)) (entupd (cdr (assoc -1 (entmod (append (if (assoc 91 edd) (reverse (cdddr (reverse edd))) (reverse (cddr (reverse edd)))) (if (assoc 91 edd) (list (cadadr (reverse edd10-42g)) (cadr (reverse edd)) (last edd)) (list (cadadr (reverse edd10-42g)) (last edd)))))))))
   (setq edd (entget ed))
   (setq edd10-42g nil)
   (setq edd10-42 (vl-remove-if-not '(lambda ( x ) (or (eq (car x) 10) (eq (car x) 42))) edd))
   (setq k -1)
   (repeat (/ (length edd10-42) 2)
   (setq kk (* (setq k (1+ k)) 2))
   (setq mm (1+ kk))
   (setq edd10-42g (cons (list (nth kk edd10-42) (nth mm edd10-42)) edd10-42g))
   )
   (setq edd10-42g (reverse edd10-42g))
   (setq eddr10-42g (mapcar '(lambda ( x y ) (list (car x) (cons 42 (- (cdadr y))))) (reverse edd10-42g) (reverse (cons (if (eq 1 (logand (cdr (assoc 70 edd)) 1)) (last edd10-42g) (car edd10-42g)) (reverse (cdr (reverse edd10-42g)))))))
   (setq eld10-42 (vl-remove-if-not '(lambda ( x ) (or (eq (car x) 10) (eq (car x) 42))) eld))
   (setq k -1)
   (repeat (/ (length eld10-42) 2)
   (setq kk (* (setq k (1+ k)) 2))
   (setq mm (1+ kk))
   (setq eld10-42g (cons (list (nth kk eld10-42) (nth mm eld10-42)) eld10-42g))
   )
   (setq eld10-42g (reverse eld10-42g))
   (if (or
         (vl-every '(lambda ( x ) (member-fuzz x edd10-42g fuzz)) eld10-42g)
         (vl-every '(lambda ( x ) (member-fuzz x eddr10-42g fuzz)) eld10-42g)
       )
       t
       nil
   )
)

(defun _sel ( msg etype / e )
   (setq e (car (entsel msg)))
   (cond
   ( (null e)
       (prompt "\nMissed... Try again...")
       (_sel msg etype)
   )
   ( (/= (cdr (assoc 0 (entget e))) etype)
       (prompt "\nPicked wrong entity type... Try again...")
       (_sel msg etype)
   )
   ( (= 4 (logand (cdr (assoc 70 (tblsearch "LAYER" (cdr (assoc 8 (entget e)))))) 4))
       (prompt "\nPicked entity is on locked layer... Try again...")
       (_sel msg etype)
   )
   ( (eq (cdr (assoc 0 (entget e))) etype)
       e
   )
   )
)

(vl-load-com)

(setq es (_sel "\nPick first LWPOLYLINE..." "LWPOLYLINE"))
(setq ed (_sel "\nPick second LWPOLYLINE..." "LWPOLYLINE"))
(if (chkoff es ed 1e-4)
   (progn
   (setq pes (vlax-curve-getpointatparam es 0.5))
   (setq ped (vlax-curve-getclosestpointto ed pes))
   (setq off (distance ped (vlax-curve-getclosestpointto es ped)))
   (initget 6)
   (setq n (getint "\nSpecify number of offsets <1> : "))
   (if (null n) (setq n 1))
   (setq off (/ off (1+ n)))
   (setq k 0)
   (repeat n
       (command "_.OFFSET" (* off (setq k (1+ k))) es (trans ped 0 1) "")
   )
   )
   (alert "Picked LWPOLYLINES don't belong to offset pair...")
)
(princ)
)
HTH,M.R。

suryacad 发表于 2022-7-5 23:05:30

谢谢marko_ribar,工作顺利。!现在我有两个Lisp程序的中心线。适合交叉检查。
一个问题,而不是先选择第一行,然后选择第二行。可以修改为同时选择两行吗?这将大大节省时间。
由于需要进行大量放大和缩小,因此需要单独平移和拾取,以防需要拾取数千行。

marko_ribar 发表于 2022-7-5 23:08:07

 
我不认为这会让事情变得更快。。。你必须用你的头脑来决定你应该选择什么实体-必须是正确的偏移对和解锁层上正确的实体类型。。。如果您选择,您的选择可能包含2个以上的实体,如果选择中有2个实体,它也可能有错误的偏移对。。。它可以稍微快一点。。。我补充说,你点击输入1个中心偏移,或者输入用户想要的偏移量。。。我认为现在是更充分的偏移检查-通过点。。。

hanhphuc 发表于 2022-7-5 23:11:35

 
我的尝试只是测试测线(dxf 10 11),可能需要爆炸进行测试
http://www.cadtutor.net/forum/showthread.php?88968-无穷中心线&p=609662&viewfull=1#post609662(setq*sd*0.0);成对线的多个中心偏移(defun c:OFFCL(/*error*ml m sd p1 2p e1 pair l en suml mean l oe dd);hanhphuc 2014年10月13日(defun*error*(msg)(if(not(wcmatch(strcase msg)”*CANCEL*,*EXIT*))(princ(strcat“\n error:”msg));_if结束(if oe(setvar“cmdecho”oe));_if(princ)结束;_defun结束(setq oe(getvar“cmdecho”))(命令“_UNDO”“be”)(setvar“cmdecho”0)(mapcar“set”(suml meanl)((lst/ans l)(setq ans(car lst)l(cdr lst))(而l(setq ans(mapcar)(lambda b)(float(+a b)))ans(car l))l(cdr l))((lst/)(mapcar(lambda(c)(/c(length lst)))(suml lst));_mapcar的末尾);_列表结束);_mapcar结束(grtext-1“命令:OFFCL”)(if(和(setq e(car(entsel“\n点击匹配层实体…))(setq _层(cdr(assoc 8(entget e)));_结束和(setq sd(getdist(strcat“\n短长度,约<0.0到”(rtos*sd*2 3)“>?:”);_getdist m((lambda(lay minx/ss l 2p d ap tmp l lst mp)(setq ss(ssget):l“(list’(0。“LINE”)(cons 8 lay)))(if ss(foreach LINE(vl remove if‘listp(mapcar’cadr(ssnamex ss))(setq l(entget LINE)2p(mapcar’((p)(cdr(assoc p l))))’(10 11))2p(apply’if(vl list*(apply)

suryacad 发表于 2022-7-5 23:15:32

我的天啊!!!这太不可思议了。可悲的是,我无法让它工作。Iam使用Acad 2013。
这是我正在做的。
1、我不想对层次有任何混淆,所以将所有内容都放在了一个层次上。
2.不希望对使用MPEDIT的直线类型产生任何混淆,并将所有直线、圆弧转换为多段线。现在我在绘图中只有多段线。
3、应用LISP
4.OFFCL输入
5.程序要求拾取匹配的层实体。。
在这一点上,我不知道我到底应该做什么。所以我随便选一条线
7、程序询问。忽略短长度,近似值:
现在我不知道该怎么办。我只是沿着随机线的长度选择两个点,如GIF中的演示所示。
9、否光标改变,程序要求选择对象。我试着选择上面所示的GIF。但什么都没有被选中。没有创建中心线。

hanhphuc 发表于 2022-7-5 23:17:49

您好,suryacad,如果连接的LWpolyline有不同的顶点,这将是相当具有挑战性的,这就是为什么目前我只测试直线,我会尝试调整弧偏移很快。
 
[引用]
7、程序询问。忽略短长度,近似值:

这只是可以忽略的近似长度。你可以点击比墙的宽度略宽的屏幕。即:较短的线不会用于偏移
 
附上分解图进行测试。
HTH公司
新block_分解。图纸

suryacad 发表于 2022-7-5 23:21:51

非常感谢韩。我尝试使用多段线是错误的,它可以平滑地处理直线,太棒了。
再次感谢
页: 1 [2]
查看完整版本: 无尽的中心线