沿路径编号
cad有很多很棒的编号程序(即Lee的增量编号或Gile的增量编号)。但我没有找到任何编号套件,允许我选择路径(即lwpolyline)并根据此路径编号。
下图显示了我想要实现的目标。
我只有一个问题,如何识别,在我的路径的哪一边是圆到数字(上/下/左/右等)?
对于沿曲线(lwpolyline)排序,我将使用函数vlax curve getClosestPointTo和vlax curve getParamAtPoint。
现在我们可以假设路径是由line对象生成的。
你的数字是方块还是圆圈中的文字? 张贴你用来生成它的代码。 @RonJonpt没有代码来生成这个,我手动做了这个来展示我想要实现的
@马拉托维奇在我的画里有圆圈和文字。假设我将使用圆。
通常我只需要知道如何根据所选路径对“行”排序。 我会这样开始。
它不会告诉你左,右。。。但它告诉你沿着这条路的距离。绘制路径的人,多段线的起点是距离0。这就是低数字应该出现的地方。
如果需要,可以反转。
该脚本仅在屏幕上打印该距离(以及其他数据)。你真正的问题是得到这个,对吗?
我假设这些圆是具有属性的块。
附件中的dwg
(defun c:test ( / ss path i pt1 pt2 dist blk)
(princ "\nSelect blocks: ")
(setq ss (ssget '((0 . "INSERT") ) ))
(setq path (entsel "\nSelect Path: "))
(setq i 0)
(repeat (sslength ss)
(princ "\nBlock number: ")
(princ i)
(setq blk (ssname ss i))
(setq pt1 (cdr (assoc 10 (entget blk))) )
(princ "\nInsert point of block: ")
(princ pt1)
(setq pt2 (vlax-curve-getClosestPointTo (car path) pt1))
(princ "\nClosest point to on path: ")
(princ pt2)
(setq dist (vlax-curve-getDistAtPoint (car path) pt2) )
(princ "\nClosest distance to path: ")
(princ (distance pt1 pt2))
(princ "\nDistance along path: ")
(princ dist)
(princ "\n")
(setq i (+ i 1))
)
(princ)
)
不是很漂亮,但这可能会给你一个开始。它当前插入文本。
(defun c:foo (/ a aa b c d e l ll n p pa)
;; RJP » 2018-10-12
;; Divides a polyline into segments then divides another distance at each of those
;; points while incrementing a number by 1. Polyline direction will dictate what
;; side the numbering starts on. Happy Friday!
(cond
((and (setq e (car (entsel "\nPick your centerline: ")))
(= "LWPOLYLINE" (cdr (assoc 0 (entget e))))
;;; (setq a (getint "\nEnter number of segments to place on centerline: "))
;;; (setq b (getdist "\nEnter length for each segment: "))
;;; (setq c (getint "\nEnter quantity of numbers to place on each segment: "))
;; Testing numbers
(setq a 50
b 25.
c 5
)
)
(setq d (vlax-curve-getdistatparam e (vlax-curve-getendparam e)))
(setq n 0)
(repeat a
(cond
((setq p (vlax-curve-getpointatdist e n))
(setq aa (angle '(0 0 0) (vlax-curve-getfirstderiv e (vlax-curve-getparamatpoint e p))))
(setq n (+ n (/ d (1- a))))
(setq p (polar p (setq pa (+ aa (/ pi 2.))) (/ b 2.)))
(entmakex (list '(0 . "line") (cons 10 p) (cons 11 (polar p (+ pi pa) b)) '(8 . "line")))
(setq l nil)
(repeat c (setq l (cons p l)) (setq p (polar p (+ pi pa) (/ b (1- c)))))
(setq ll (cons (reverse l) ll))
)
)
)
(setq n 0)
(setq ll (reverse ll))
(while (car ll)
(foreach p (mapcar 'car ll)
(entmakex (list '(0 . "TEXT")
'(100 . "AcDbEntity")
'(67 . 0)
'(8 . "text")
'(100 . "AcDbText")
(cons 10 p)
(cons 40 (/ (/ b (1- c)) 2.))
(cons 1 (itoa (setq n (1+ n))))
'(50 . 0.0)
'(41 . 1.0)
'(51 . 0.0)
'(71 . 0)
'(72 . 1)
(cons 11 p)
'(100 . "AcDbText")
'(73 . 2)
)
)
)
(setq ll (mapcar 'cdr ll))
)
)
)
(princ)
)
谢谢@ronjonp的小费。
(从此帖子排序)
例如:
乍一看-
(defun vector (p1 p2)
(mapcar '(lambda (%1 %2) (- %2 %1) ) p1 p2 )
)可以写入-
但是在这一点上,您也可以直接内联编写mapcar函数。
还有这个-
(if lst
(setq lst (cons c lst))
(setq lst (list c))
)可以替换为-
6因为当lst为零时(cons c lst)==(list c)。
@李-新手失误
一些改进:
7
页:
[1]