- (setq c_doc (vla-get-activedocument (vlax-get-acad-object))
- ms (vla-get-modelspace c_doc)
- obj (vlax-ename->vla-object (car (entsel "\nSelect arc, line, spline or polyline : ")))
- e_pt (vlax-curve-getendpoint obj)
- p_len (vlax-curve-getdistatpoint obj e_pt)
- dist 0
- paramlst '(("block1" . 3)("block2" . 5)("block3" . 8))
- );end_setq
现在,对于用户的选择,我们需要把它放在一个变量中,但是因为我们需要先使用initget,所以我们将在原始setq之后执行。对于initget,我们将使用1作为第一个参数,以防止用户在点击enter时返回“”。对于第二个参数,我们需要给它一个由空格分隔的所有选项组成的字符串(如“block1 block2 block3”)。然后我们将使用getkword,它需要一个字符串作为参数,该字符串包含由/分隔的所有选项,所有选项都用方括号括起来(如“[block1/block2/block3]”)。由于这是由paramlst变量中的选项列表驱动的,并且我们不希望每次在paramlst中添加选项时都需要更新initget和getkword字符串,因此我们将使initget和keywork都是动态和自动的。试着一步一步地遵循我从paramlst得到2个所需字符串的逻辑。
(我不会使用代码标签来加粗部分和添加颜色来逐步评估if。不要咬我绿巨人!)
(initget 1(vl string right trim“”(应用“strcat(mapcar)”(lambda(x)(strcat x“”))(mapcar“car paramlstаа])))
Paramlst包含((“block1.3)(“block2.5”(“block3.8))
(mapcar的car paramlst)将返回(“block1”“block2”“block3”),一个由每个列表元素的car组成的列表。
(initget 1(vl string right trim“”(应用“strcat(mapcar)”(lambda(x)(strcat x“”)'(“block1”“block2”“block3”))))
(mapcar'(lambda(x)(strcat x”“)'(“block1”“block2”“block3”)将返回(“block1”“block2”“block3”),一个由每个字符串和空格串联而成的列表
(initget 1(vl string right trim”“(应用“strcat”(“block1”“block2”“block3”)))
(应用“strcat”(“block1”“block2”“block3”)将返回“block1 block2 block3”,它相当于(strcat“block1”“block2”“block3”)
(initget 1(vl string right trim”““block1 block2 block3”))
(vl string right trim”““block1 block2 block3”)将删除字符串右侧的任何空格,并返回“block1 block2 block3”。
现在我们只剩下(initget 1“block1 block2 block3”)
对于getkword,我采用了相同的方法,但在strcat和vl string right trim中使用“/”而不是空格“”,但必须添加方括号,因此增加了strcat“[“string”]”。由于我们稍后将使用该值,因此getkword的返回值可以存储在变量中。
(setq bname(getkword(strcat“[”(vl string right trim”/“(应用‘strcat(mapcar’(λ(x)(strcat x”/”))(mapcar‘car paramlst)))”]))
现在唯一要做的是使用存储在bname变量中的getkword中的块名,而不是当前在vla insert块中使用的名称“block1”,并本地化新变量paramlst和bname。试着先做,而不是与此比较。。。
- ; original code by Dlanorh July 2018
- ;with some modifs by Jef! made on the following thread
- ;https://www.cadtutor.net/forum/topic/65895-creating-presets/
- (defun c:mes (/ c_doc ms obj e_pt p_len dist i_pt i_param b_ang n_obj o_lst paramlst bname)
- (vl-load-com)
- (setq c_doc (vla-get-activedocument (vlax-get-acad-object))
- ms (vla-get-modelspace c_doc)
- obj (vlax-ename->vla-object (car (entsel "\nSelect arc, line, spline or polyline : ")))
- e_pt (vlax-curve-getendpoint obj)
- p_len (vlax-curve-getdistatpoint obj e_pt)
- paramlst '(("block1" . 3) ("block2" . 5) ("block3" . 8));Jef!
- dist 0
- );end_setq
- (initget 1 (vl-string-right-trim " "(apply 'strcat (mapcar '(lambda (x) (strcat x " ")) (mapcar 'car paramlst)))));Jef!
- (setq bname (getkword (strcat "["(vl-string-right-trim "/"(apply 'strcat (mapcar '(lambda (x) (strcat x "/")) (mapcar 'car paramlst))))"]")));Jef!
- (while (< dist p_len)
- (setq i_pt (vlax-curve-getpointatdist obj dist)
- i_param (vlax-curve-getparamatpoint obj i_pt)
- b_ang (angle '(0 0 0) (vlax-curve-getfirstderiv obj i_param))
- n_obj (vla-insertblock ms (vlax-3d-point i_pt) bname 1.0 1.0 1.0 b_ang); Jef! - we insert bname instead of "block1"
- o_lst (cons n_obj o_lst)
- dist (+ dist (cdr (assoc bname paramlst)));;;now we get dist increment from paramlst using bname
- );end_setq
- );end_while
- (initget "Yes No")
- (if (= (getkword "Flip Block? [Yes / No] : ") "Yes")
- (foreach n_obj o_lst
- (vlax-put-property n_obj 'rotation (+ (vlax-get-property n_obj 'rotation) pi))
- );end_foreach
- );end_if
- );end_defun