(ssget"w" pt1 pt2)莫名失效问题
(prompt "选择基点:")(setq a2 (getpoint))
(setq osm (getvar "osmode"))
(setvar "osmode" 0)
(command "COPY" (ssget) "" a2 (LIST 00) "")
(command "MOVE" (ssget "w" '(0 0) '(300 -1000)) "" '(0 0) (LIST L1 0))
(prin1)
(command "MOVE" (ssget "w" '(0 0) '(5000 -1000)) "" '(300 0) '(00));;ssget函数获取一个框选范围的集,不能单独用
(setvar "osmode" osm)
(prin1)
上面的一段程序中两个COMMAN调用MOVE 命令 时而可以将选择集内的选项移动, 时而又移动不了, 毫无规律。但是如果将(ssget "w" '(0 0) '(300 -1000))改成(ssget) 每次手动去框选目标 又可以实现。 而且单独将代码一条一条考到cad命令栏里单步执行又是可以实现移动。只要在AUTOLISP中连起来执行就出现各种图形不按指定的坐标移动的问题。 大部分都是 (command "COPY" (ssget) "" a2 (LIST 00) "")执行完后就不动了。不知道问题出在什么地方
gaics 发表于 2021-11-20 14:08
L1是什么?是局部变量还是全局变量?
最好发完整代码才好发现问题
(defun C:XUU (/ &kw X1 X2 Y1 Y2 L1 W1 ss1 sx a2 n ss ff &k1 %k1 %k2 b1 b2)
(setvar "cmdecho" 0);;关闭变量
(setvar "blipmode" 0) ;;关闭控制点
(setvar "dimzin" 0)
(vl-load-com) ;;加载vlax扩展函数
(command "_ERASE" (ssget "w"'(-500 500) '(10000 -1000)) "");;删除矩形坐标区域内的所有图元
(command "_ERASE" (ssget '((0 . "dimension,MTEXT,LEADER"))) "");;删除尺寸标注和引线以及多行文字
(princ "\n请选择对象");;选择要判断最大外框的所有图元
(if (/= (setq &kw (ssget)) nil)
(progn
(setq ss1 '())
(while
(setq ent (ssname &kw 0))
(setq &kw (ssdel ent &kw) ss1 (cons ent ss1))
)
(setq ss1 (mapcar 'vlax-ename->vla-object ss1))
(setq ss1 (apply 'append (mapcar 'x1903211 ss1)))
(setq sx (vl-sort (mapcar 'car ss1) '<))
(setq x1 (car sx) x2 (last sx))
(setq sx (vl-sort (mapcar 'cadr ss1) '<))
(setq y1 (car sx) y2 (last sx))
(entmake (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") '(90 . 4) '(70 . 1) '(38 . 0) (cons 10 (list x1 y1)) (cons 10 (list x2
y1)) (cons 10 (list x2 y2)) (cons 10 (list x1 y2))))
)
)
(setq L1(- X2 X1))
(setq W1(- y2 y1))
(princ L1)
(princ "\n")
(princ W1)
(prin1)
(prompt "选择基点:")
(setq a2 (getpoint))
(setq osm (getvar "osmode"))
(setvar "osmode" 0)
(command "_COPY" (ssget) "" a2 (LIST 00) "")
(setq b1(ssget "w" '(0 0) '(300 -1000)))
(sssetfirst nil b1)
(command "_MOVE" b1 "" '(0 0) (LIST L1 0))
(prin1)
(setq b2(ssget "w" '(0 0) '(5000 -1000)))
(sssetfirst nil b2)
(command "_MOVE" (ssget "w" '(0 0) '(5000 -1000)) "" '(300 0) '(00));;ssget函数获取一个框选范围的集,不能单独用
(prin1)
(setvar "osmode" osm)
(setq n 0 ss '()) ;;取得一个空表
(setq &kw (ssget"P" '((0 . "CIRCLE"))));选择圆
(if (/= &kw nil);;如果有选择了圆
(progn
(setq L (sslength &kw)
ff (open "d://旭爷V5.XLS" "w");在D盘建立文本<圆心到EXCEL>
);;
(princ L1 ff) ;;然后输入R半径
(princ " \t" ff) ;;一个空格分开
(princ W1 ff) ;;然后输入R半径
(princ " \t" ff) ;;一个空格分开
(repeat L
(setq &k1 (entget (ssname &kw n))
%k1 (cdr (assoc 10 &k1));;取得圆心坐标
r (cdr (assoc 40 &k1));;取得圆心半径
%k1 (cons r %k1);;将半径值加入选择集
ss (cons %k1 ss) ;;加入选择集
n (+ n 1)
)
)
(setq ss (vl-sort ss (function (lambda (x y)(> (fix (caddr x)) (fix (caddr y)))))));;X排序从左到右
(setq ss (vl-sort ss (function (lambda (x y)(< (fix (cadr x)) (fix (cadr y)))))));;X排序从左到右
(setq n 0)
(repeat L
(setq &k1 (nth n ss)
%k1 (rtos (car &k1) 2 3) ;;取得R坐标,小数点后三位
%k1 (if (= (atof %k1) 1.25) (* 1 1) (if (= (atof %k1) 3) (* 1 2) (if (= (atof %k1) 3.5) (* 1 4) (if (= (atof %k1) 0) "" (* 1 3)))));;
%k2 (rtos (cadr &k1) 2 3);;取得X坐标,小数点后三位
%k3 (rtos (caddr &k1) 2 3);;取得Y坐标,小数点后三位
%k3 (if (=%k1 1) (- (atof %k3) 55) (if (=%k1 2) (* (atof %k3) 1) (if (=%k1 4) (+ (atof %k3) 110) (if (= %k1 3) "" (+ (atof %k3) 55)))));;
n (+ n 1)
)
(princ %k1 ff) ;;然后输入R半径
(princ " \t" ff) ;;一个空格分开
(princ %k2 ff) ;;然后输入X坐标
(princ " \t" ff) ;;一个空格分开
(princ %k3 ff) ;;然后输入Y半径
(princ "\t" ff);;换一行计算
)
(close ff);;关闭文本
)
)
)
(defun x1903211 (obj / obj x y)
(vla-getboundingbox obj 'x 'y)
(mapcar 'vlax-safearray->list (list x y));点表
)
(prin1);;结束;;(记事本里面的数据可以导入表格)
(prompt "\n《C:XUU》坐标写入记事本")
(prin1)
上面是完整的代买 还没没有人回复!这个问题困扰我好几天了。 简单的讲就是 (ssget "w" 点坐标1点坐标2) 框选里面的选择集 时常不能被COMMAND 调用的MOVE命令移动。如果我把(command "MOVE" (ssget "w" '(0 0) '(5000 -1000)) "" '(300 0) '(00))整段单独拷如CAD命令栏里又是可以执行的,但是几个语句用=用快捷键 连起来执行就会出各种幺蛾子 不是捕捉造成的,捕捉关闭后此现象依然存在。 fangmin723 发表于 2021-11-20 13:29
单独使用,你是怎么单独使用的???
几种方式一种是写一个只含 一条(COMMAND"MOVE") 的lisp 然后反复执行测试 没有问题。另一种是在CAD里面像输入命令一样把这个语句输入进去执行也是没有问题的 。但是只要 放进整段里面一起执行就各种问题。一会有用 一会没用 。 单独使用,你是怎么单独使用的??? 去掉第一个prin1试试 L1是什么?是局部变量还是全局变量?
最好发完整代码才好发现问题 可能是点的位置超出的屏幕以外吧。 tigcat 发表于 2021-11-20 13:39
去掉第一个prin1试试
试过没有用,代码都是网上临时凑的,然后自己看着函数根据自己需求各种嫁接,修补,然后达到自己想要的目的 本帖最后由 gaics 于 2021-11-20 15:58 编辑
墨水撑破缸 发表于 2021-11-20 15:11
(defun C:XUU (/ &kw X1 X2 Y1 Y2 L1 W1 ss1 sx a2 n ss ff &k1 %k1 %k2 b1 b2)
(setvar "cmdecho" 0)...
你这。。。一段代码要做的事情也太多了。
问题不一定出在哪呢。
ssget用法我觉得没什么毛病。
页:
[1]
2