单点打断,断开后肯定要生成一个实体,可以用(entlast)得到,判断下和原来的实体是否同名,就可以得到哪个是前一个,哪个是后一个。
如果要同时从一个线打断多个点,那么一个方法是,打断前把这些点按照这个线排序好,然后依次通过(entlast)就可以得到。
XDRX_API提供了现成的函数:
- <normalfont>
- 257. xdrx_curve_intersectbreak
- 功能:将选择集中的曲线在所有交点处break
- 调用格式:(xdrx_curve_intersectbreak < 选择集> [误差距离] [自身打断标记] [进度条间隔])
- 返回值:NIL
- 说明:参数
- [误差距离]:整数或者实数,两个曲线顶点到另个曲线距离在误差内,算作相交
- [自身打断标记]:T,对于复杂实体如POLYLINE,SPLINE等自身相交也打断,NIL不处理自身相交
- [进度条间隔]:大于等于0的整数,为0,不显示进度条,大于0的值作为每处理这些实体后,进度条显示一次进度。
-
- 不给这些参数,默认值是:误差100,自身打断T,无进度条0
- </normalfont>
复制代码
- </normalfont>
- 256. xdrx_curve_getSplitCurves
- 功能:给一些点或者参数值,break曲线
- 调用格式:(xdrx_curve_getSplitCurves < 曲线实体名 > < p1>...< pn>)
- (xdrx_curve_getSplitCurves <曲线实体名> < 参数1>...< 参数n>)
- </normalfont>
复制代码
点表按照已知线或者(P1 P2)组成的线排序的函数是:
 - <normalfont>
- 153. xdrx_SortPointOnCurve
- 功能:基于实体的点的排序函数,就是有一系列点是在曲线实体上,基于这个曲线实体,从开始点
- 到结束点排序这些实体上的点。结果是这些点依据实体的开始点开始排升序。
-
- 调用格式:(xdrx_SortPointOnCurve <曲线实体名> (<p1>....<pn>))
- (xdrx_SortPointOnCurve (p1 p2) (<p1>....<pn>))
-
- 返回值:以曲线实体的开始参数为基点,排升序后的表。
- 例子: 该函数在求一个曲线和其他所有曲线的交点的时候,很常用。
- 如:求一个已经的ARC和一些曲线实体的交点,然后为了下面的操作需要讲这些得到的交点
- 排序,以前的做法是得到交点后,还需要根据某个特征,如求这些点到一个图形最小点
- 的距离等等作为依据,排序。(这种方法的缺点就是若第一个曲线参数不是LINE,而是ARC
- 等曲线,那么就非常不容易排序。现在有这个函数,问题就很好解决了。
-
- (setq e (car (xdrx_entsel "\n请选取一个曲线实体:" '((0 . "*line,arc,ellipse")))));;得到一个曲线
- (setq ptl (xdrx_getsamplept e)) ;;得到这个曲线的模拟顶点表
- (setq ss (ssget "f" ptl '((0 . "*line,arc,ellipse")))) ;;得到所有和这个曲线相交的曲线实体到选择集ss
- (setq ptl (xdrx_getinters e ss)) ;;得到曲线E和选择集中所有曲线的实际交点,不延伸。
- (setq p (cons e ptl)) ;;构造基于实体排序的函数xdrx_SortPointOnCurve的参数表
- (setq ptl (apply 'xdrx_sortpointoncurve p)) ;;得到了排序后的点。
-
- 这些功能若不用XDRX_API,只用LISP,要用几十倍的代码量才能完成。
-
- 这些代码在求如建筑上轴网交点等等操作,极大的简化了代码量,速度还很快。
-
- 可以求任意实体的交点和排序。
- </normalfont>
所以,你的到了所有的交点后(setq pts (p1 p2 ...pn)) 用下面的方法:
 - <normalfont>
- 下面的代码把你选的LINE和相交的圆,在交点处打断LINE
- (if (and
- (setq e1 (car (xdrx_entsel "\n拾取LINE<退出>:" '((0 . "line")))))
- (setq e2 (car (xdrx_entsel "\n拾取CIRCLE<退出>:" '((0 . "circle")))))
- (setq intl (xdrx_getInters e1 e2)) ;;获得LINE和CIRCLE的交点表
- )
- (progn
- (setq intl (xdrx_sortPointOnCurve e1 intl)) ;;按照LINE排序点表
- (xdrx_curve_getSplitCurves (cons e1 intl)) ;;从所有点打断LINE
- )
- )
- </normalfont>
就完成你要的在所有点打断这个操作了。
如果你连CIRCLE也想一起打断,就更方便了,选择两个实体后:
 - <normalfont>
- (setq ss (ssadd))
- (ssadd e1 ss)
- (ssadd e2 ss)
- (xdrx_curve_intersectbreak ss)
- </normalfont>
使用XDRX_API,复杂的LISP编程,仅仅用几个XDRX_API函数就可以解决。 |