感谢回复BIGAL!
我还发现了这条有用的线索:
http://www.cadtutor.net/forum/showthread.php?30556-在每个交点处创建垂直线
下面是我的编码开始。
我的第一个问题解决了-我有一个插入点距离小于或等于给定距离的块实体名称列表。
是时候问第二个问题了。。。如何获取最终列表?
我将在星期一回到这个话题。
同时,如果有人能给我关于第一部分的意见,我将不胜感激!
另外,请向我解释GetPerpendictionalPoint函数是如何工作的,因为我在这篇文章中将GetClosestPoint修改为函数,它可以工作,但我并不完全理解。
- (vl-load-com)
- ;;v2016-05-13
- ;;ziele_o2k
- ;;Main function
- (defun c:teee ( / EntPline BlocksSS DistForFilterSS BlkEntLst)
- (if
- (and
- (setq
- EntPline (car (entsel "\nSelect Main Pline > "));select main pline
- BlocksSS (ssget '((0 . "INSERT") (2 . "BLOCK") (66 . 1)));ssget blocks
- DistForFilterSS (getreal "\nType offset distance to filter blocks > ");get distance for
- )
- (member (cdr (assoc 0 (entget EntPline))) '("POLYLINE" "LWPOLYLINE"))
- (setq BlkEntLst (PZ:FilterSS EntPline BlocksSS DistForFilterSS))
- )
- (print BlkEntLst)
- (print "No blocks")
- )
- (princ)
- )
- ;;Function to filter ssget. Returns list of entity names that are perpendicular
- ;;to selected center, main pline, else nil
- (defun PZ:FilterSS (MainPline BlkSS dist / TmpEnts in BlkPt PerpBlkLst)
- (setq
- TmpEnts
- (mapcar
- 'vlax-vla-object->ename
- (vlax-invoke (vlax-ename->vla-object MainPline) 'Explode)
- )
- )
- (repeat (setq in (sslength BlkSS))
- (setq BlkPt (cdr (assoc 10 (entget (ssname BlkSS (setq in (1- in)))))))
- (if
- (and
- (getPerpendicularPoint TmpEnts BlkPt)
- (<= (distance (getPerpendicularPoint TmpEnts BlkPt) BlkPt) dist)
- )
- (setq PerpBlkLst (cons (ssname BlkSS in) PerpBlkLst))
- nil
- )
- )
- (mapcar '(lambda (x) (vla-delete (vlax-ename->vla-object x))) TmpEnts) ; remove the segments
- PerpBlkLst
- )
- ;; modified function from this CAB post
- ;;http://www.cadtutor.net/forum/showthread.php?30556-Create-Perpendicular-Line-at-every-intersection-point&p=204357&viewfull=1#post204357
- (defun getPerpendicularPoint (Ents pt / ent clspt endpts perpts result dist)
- (foreach ent Ents
- (if
- (or
- (< (distance (setq clspt (vlax-curve-getclosestpointto ent pt)) (vlax-curve-getstartpoint ent)) 0.0001)
- (< (distance clspt (vlax-curve-getendpoint ent)) 0.0001)
- )
- nil
- (setq perpts (cons clspt perpts)) ; else got a perpendicular point
- )
- )
- (setq
- perpts
- (mapcar
- '(lambda(x / tmp)
- (cond
- ((null dist)(setq dist (distance pt x) result x))
- ((< (setq tmp (distance pt x)) dist)
- (setq dist tmp result x))
- )
- )
- perpts
- )
- )
- result
- )
|