xinxirong 发表于 2016-7-14 12:18:27

为什么这个图的多段线和直线之间无法计算交点?

本帖最后由 xinxirong 于 2016-7-14 12:20 编辑


(vl-load-com)

(setq util (vla-get-utility
                   (vla-get-activedocument
                        (vlax-get-acad-object))))

(vla-getentity util 'obj1 'ip "\nSelect First Object: ")

(vla-getentity util 'obj2 'ip "\nSelect Second Object: ")

(setq int (vla-IntersectWith obj1 obj2 acExtendNone))

计算得出来的结果是int变体的值为nil

自贡黄明儒 发表于 2016-7-14 12:43:33

看看是否在同一面上

xinxirong 发表于 2016-7-14 13:22:58

本来我是想判断它们之间有没有交点,再决定用trim还是extend命令的。
像本例可以把多段线z轴归零后再求交点,再裁剪。
如果情况更糟糕,两条线都不在z=0的平面,裁剪之后要重新移回原来的高程就很复杂了。

xinxirong 发表于 2016-7-18 17:29:52

原来trim命令比自已编的命令复杂得多。trim可能根据系统变量PROJMODE来确定是否对对象投影到无、UCS、视图等再修剪,修剪会用到getSplitCurves,自己计算打断点,生成的新的对象自行判断是否需要加入到database中。感觉用lisp来做trim很难,没有太多底层的API。用arx又太复杂。

llsheng_73 发表于 2016-8-3 01:45:07

本帖最后由 llsheng_73 于 2016-8-3 01:50 编辑

如果求直线或者多段线与别的图元的交点,可以通过(ssnamex(ssget"F" pts))来得到交点处的平面坐标
(setq e(car(entsel"选择多段线")))
(if(setq s(ssget"F"(mapcar'cdr(vl-remove-if'(lambda(x)(/=(car x)10))(entget e)))))
   (mapcar'(lambda(x)(mapcar'last(cdddr x)))(ssnamex s)))

llsheng_73 发表于 2016-8-3 01:56:55

xinxirong 发表于 2016-7-18 17:29 static/image/common/back.gif
原来trim命令比自已编的命令复杂得多。trim可能根据系统变量PROJMODE来确定是否对对象投影到无、UCS、视图等 ...

如果需要对同一条线进行多次打断或者trim,因为有可能会生成新的图元而无法进行简单的循环,
但是如果先对这些点按它在线上的距起点的距离的排序,然后从最远点开始处理,那么不管会不会生成新的图元,都能循环下去

xinxirong 发表于 2016-8-5 12:56:21

对于曲线,ssget "F"也没有办法啊。
页: [1]
查看完整版本: 为什么这个图的多段线和直线之间无法计算交点?