使用ssget标记圆
你好我有一个lisp,用保存在文本文件中的坐标一次性标记所有圆。lisp和dwg如下所示。我的问题是如何将带前缀的圆圈放在不同的组中。在查找了选择圆的ssget函数后,我还没有找到一个很好的选择方法。在web中找到了四种方法,并将其放入代码中。第一种方法是使用选择方法“w”工作,但窗口没有那么灵活,无法选择我想要的。第二种方法在选择圆后停止。第三种方法是“错误:错误参数类型:lselsetp nil”。第四种方法的结果与第三种方法相同。我考虑使用WPolygon选择方法,但不知道如何编写。
顺便问一下,如何将实体名称导出到文本文件?包含实体名称的变量不是字符串,因此我不知道如何将其放入文本文件中。
图纸2.dwg
(defun c:labelcircle()
(command "CMDECHO" "0")
(command "layer" "m" "hk" "c" "1" "" "")
(setq yy (entsel"\nselect the circle :"))
(setq sews (getstring "\ninput the prefix:"))
(setq f (open (getfiled "text file save as" "c:" "txt" 1) "w"))
(setq y (entget (car yy)))
(setq tc (assoc 8 y))
(setq dx (assoc 40 y))
(setq zg (cdr dx))
;-----1st method
;(setq p1 (getpoint "\nFirst Corner: "))
;(setq p2 (getcorner p1 "\nSecond Corner: "))
;(setq s (ssget "w" p1 p2 (list '(0 . "CIRCLE") tc dx)))
;-----2nd method
;(command "select" "WP")
;(setq s (ssget "_P"))
;-----3rd method
;(setq ptlst '())
;(setq pts 1)
;(while pts
;(setq pts(getpoint "\nSelect Point: "))
;(if pts (setq ptlst (cons pts ptlst)))
;_while
;(if pts
;(setq s(ssget "_WP" ptlst))
;-----4th method
;(while (setq pt (getpoint pt "\nSpecify a point:"))
;(setq ptlst (cons pt ptlst))
;while
;(if ptlst
;(setq s (ssget "_WP" ptlst))
;if
;-----
(setq n 0)
(setq m (- (sslength s) 1))
(while
(setq a (ssname s m))
(setq xy (cdr (assoc 10 (entget a))))
(setq xy1 (polar xy (/ pi 4) )
(setq dh (rtos (+ 1 n) 2 0))
(command "layer" "s" "hk" "")
(command "text" "j" "m" xy1 3 "0" (strcat sews dh))
(setq ss (strcat sews dh "," (rtos (nth 0 xy) 2 3) "," (rtos (nth 1 xy) 2 3) ","))
(write-line ss f)
(setq n (1+ n))
(setq m (1- m))
);while
);defun
第三种方法移除;(setq pts 1)
建议
(repeat (setq m (sslength s))
(setq a (ssname s (setq m (- m 1))))
(setq xy (cdr (assoc 10 (entget a))))
(setq xy1 (polar xy (/ pi 4) )
(setq dh (rtos (+ 1 n) 2 0))
(command "layer" "s" "hk" "")
(command "text" "j" "m" xy1 3 "0" (strcat sews dh))
(setq ss (strcat sews dh "," (rtos (nth 0 xy) 2 3) "," (rtos (nth 1 xy) 2 3) ","))
(write-line ss f)
); repeat
我尝试了第三种方法并删除了“;(setq pts 1)”,但结果是“错误:错误的参数类型:lselsetp nil”。代码有什么问题吗?与我的AutoCAD 2010版本有关吗? 也许你想得太多了,试试:
(setq s(ssget '((0 . "CIRCLE")))) 我不确定我是否完全理解你的要求,但我今天做了一些练习:
(defun C:test(/osm*error*p ptL#FilePath SS pref#File i e enx a);李·麦克帮忙,;Tharwat帮助,;Roy_043帮助,;作者:Grrr(setq osm(getvar'osmode)(defun*错误*(msg)(redraw b])[如果osm(setvar'osmode osm(if#File(close#File(如果(或(不是b](成员消息'(“函数取消”“退出/退出中止”(strcase msg)“*中断,*取消*,*退出*”颜色(princ(strcat“\n错误:msg]](princ)];defun(重画)(setvar'errno 0)(/=52(getvar'errno))[颜色=#8b4513];收集点列表(initget 128“D DONE”)(setq p(getpoint“\n指定点或一个:“))(cond(; 将p存储在lst中,和GRVEC(listp p(setq ptL(cons p ptL)(redraw)(如果>=(长度ptL2(grvecs(cons-3(apply'append(mapcar'list ptL(cons(last ptL)ptL; 谢谢大家!
@汤布:
最初的lisp是使用ssget来选择您编写的所有圆,但我进一步要求在不同的圆组之前放置不同的前缀,而不是所有的圆都具有相同的前缀。
@Grrr:
选择圆的方法很棒,文本文件可以选择是否打开。我只需要添加函数来标记它。
页:
[1]