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

与我提出的多边形略有不同-现在直接从2个半径的中间距离获取点。。。
 

(defun c:trim_between_2_concentic_circles ( / inner_circle outer_circle c1 c2 c r1 r2 r k p pl )

(setq inner_circle (car (entsel "\nPick inner circle")))
(setq outer_circle (car (entsel "\nPick outer circle")))
(setq c1 (cdr (assoc 10 (entget inner_circle))))
(setq c2 (cdr (assoc 10 (entget outer_circle))))
(setq c (mapcar '* (mapcar '+ c1 c2) '(0.5 0.5 0.5)))
(setq r1 (cdr (assoc 40 (entget inner_circle))))
(setq r2 (cdr (assoc 40 (entget outer_circle))))
(setq r (/ (+ r1 r2) 2.0))
(setq k -1.0)
(repeat 360
   (setq p (polar c (cvunit (setq k (1+ k)) "degrees" "radians") r))
   (setq pl (cons p pl))
)
(setq pl (cons (polar c 0.0 r) pl))
(command "_.trim" inner_circle outer_circle "" "_F")
(foreach p pl
   (command p)
)
(while (> (getvar 'cmdactive) 0) (command ""))
(princ)
)

(defun c:tb2cc nil (c:trim_between_2_concentic_circles))
HTH,M.R。

ReMark 发表于 2022-7-5 23:10:50

谢谢你,马尔科。工作起来很有魅力。

sidhu412 发表于 2022-7-5 23:15:14

 
没关系,没问题。
 
我在OMEGA ThundeR提供的链接上找到了LISP代码,并进行了尝试。但它只能修剪与闭合对象相交的线。仅供参考,我画这个圆只是为了让人们理解我的查询,否则我有一组开放的多段线,包括圆弧和直线(不规则),因此MEXTRIM或多边形方法(由Marko Ribar先生描述)将不起作用。
如果你们还有什么可以做的,我将不胜感激。
 
非常感谢。
 
当做
 
 
Sidhu公司

ReMark 发表于 2022-7-5 23:15:43

sidhu:你没有看到marko上一篇文章中包含的新lisp程序吗?它满足了你的要求。过来看。

sidhu412 发表于 2022-7-5 23:18:53

 
先生
 
它工作正常,但仍然需要指定围栏路径。这是我需要的90%。如果您只能稍微编辑它并删除围栏功能,那么它将修剪圆圈/多段线1和圆圈/多段线2之间的每条线。
 
 
当做
 
 
Sidhu公司

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

sidhu412,如果您的同心圆位于与WCS不同的某些UCS中,我建议您使用此修订版(还添加了OSMODE检查-您可以在前面的代码中添加这两行,在前面的代码中添加最后一行(princ))
 
顺便说一句,OMEGA ThundeR的这段代码更通用,我强烈建议您在许多不同的情况下使用它,因为EXTRIM无法提供所需的结果。。。
 
尊敬的M.R。

marko_ribar 发表于 2022-7-5 23:27:33

这是另一种方法。。。试试看,看看你是否得到了想要的结果。。。
 
装载过帐代码:
 

(defun colect_entdata ( / ss i ent entdata )
(setq ss (ssget "_X"))
(setq i -1)
(while (setq ent (ssname ss (setq i (1+ i))))
   (setq entdata (cons (entget ent) entdata))
)
entdata
)

(defun c:store_entdata nil
(setq entdata (colect_entdata))
(princ)
)

;;; Modify entities ;;;

(defun colect_modified_entdata ( / ss i ent entdatachk entdatamod )
(setq ss (ssget "_X"))
(setq i -1)
(while (setq ent (ssname ss (setq i (1+ i))))
   (setq entdatachk (cons (entget ent) entdatachk))
)
(foreach data entdatachk
   (if (not (vl-some '(lambda ( x ) (equal x data 1e-6)) entdata))
   (setq entdatamod (cons data entdatamod))
   )
)
entdatamod
)

(defun c:sel_mod_ents ( / ss )
(setq ss (ssadd))
(foreach data (colect_modified_entdata)
   (ssadd (cdr (assoc -1 data)) ss)
)
(sssetfirst nil ss)
(princ)
)

(alert "\nFirstly type : store_entdata \nThen modify entities \nFinally type : sel_mod_ents \nAt the end type : (setq entdata nil)")
(princ)
1。第一种类型:store_entdata
2.使用“EXTRIM”命令-拾取第一条曲线并拾取要拉伸的区域内的点。。。
3.类型:sel\u mod\u ents
4.按ctrl+shift+c(copybase)并输入点:0,0,0
5.类型:(setq entdata nil)
6.类型:U(撤消)-绘图应与启动完全相同-在2之前。过程
7.使用“EXTRIM”命令-拾取第二条曲线并拾取要拉伸的区域内的点。。。
8.按ctrl+v(粘贴)并输入点:0,0,0
 
就是这样。。。试试看,告诉我它是怎么工作的。。。
HTH,M.R。

marko_ribar 发表于 2022-7-5 23:30:54

我想,为什么我不把这些步骤自动化到一个lisp中,我做到了。。。所以试试这个版本。。。
 
5HTH,M.R。
当做

BIGAL 发表于 2022-7-5 23:31:30

哎呀,忘记读第二页了
 
一个方面。lsp无论如何,对于这个问题,在两个圆之间做一些额外的线和修剪。如上所述,新rad只是(rad1+rad2)/2,选择两个圆,然后使用Fence进行修剪,避免使用vlax曲线老式lisp。
 
6

sidhu412 发表于 2022-7-5 23:35:46

 
宾果,宾果
 
太棒了
这就是我所需要的你是天才Marko_Ribar先生。
 
超过XXXXXX很多
 
当做
 
 
Sidhu公司
页: 1 [2]
查看完整版本: 两行之间的外向