明经CAD社区

 找回密码
 注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 207|回复: 17

[基础] (ssget"w" pt1 pt2)莫名失效问题

[复制链接]
发表于 2021-11-20 10:56 | 显示全部楼层 |阅读模式
(prompt "选择基点:")
(setq a2 (getpoint))
(setq osm (getvar "osmode"))
(setvar "osmode" 0)
(command "COPY" (ssget) "" a2 (LIST 0  0) "")
(command "MOVE" (ssget "w" '(0 0) '(300 -1000)) "" '(0 0) (LIST L1 0))
(prin1)
(command "MOVE" (ssget "w" '(0 0) '(5000 -1000)) "" '(300 0) '(0  0));;ssget函数获取一个框选范围的集,不能单独用
(setvar "osmode" osm)
(prin1)
上面的一段程序中两个COMMAN调用MOVE 命令 时而可以将选择集内的选项移动, 时而又移动不了, 毫无规律。  但是如果将(ssget "w" '(0 0) '(300 -1000))  改成(ssget) 每次手动去框选目标 又可以实现。 而且单独将代码一条一条考到cad命令栏里单步执行又是可以实现移动。  只要在AUTOLISP中连起来执行就出现各种图形不按指定的坐标移动的问题。 大部分都是 (command "COPY" (ssget) "" a2 (LIST 0  0) "")执行完后就不动了。不知道问题出在什么地方

 楼主| 发表于 2021-11-20 12:50 | 显示全部楼层
还没没有人回复!  这个问题困扰我好几天了。 简单的讲就是 (ssget "w" 点坐标1  点坐标2) 框选里面的选择集 时常不能被COMMAND 调用的MOVE命令移动。如果我把(command "MOVE" (ssget "w" '(0 0) '(5000 -1000)) "" '(300 0) '(0  0))整段单独拷如CAD命令栏里又是可以执行的,但是几个语句用=用快捷键 连起来执行就会出各种幺蛾子   不是捕捉造成的,捕捉关闭后此现象依然存在。
发表于 2021-11-20 13:29 | 显示全部楼层
单独使用,你是怎么单独使用的???
发表于 2021-11-20 13:39 来自手机 | 显示全部楼层
去掉第一个prin1试试
发表于 2021-11-20 14:08 | 显示全部楼层
L1是什么?是局部变量还是全局变量?
最好发完整代码才好发现问题
发表于 2021-11-20 14:26 | 显示全部楼层
可能是点的位置超出的屏幕以外吧。
 楼主| 发表于 2021-11-20 15:11 | 显示全部楼层
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 0  0) "")
(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) '(0  0));;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)
上面是完整的代买
 楼主| 发表于 2021-11-20 15:12 | 显示全部楼层
tigcat 发表于 2021-11-20 13:39
去掉第一个prin1试试

试过没有用,  代码都是网上临时凑的,然后自己看着函数  根据自己需求各种嫁接,修补,然后达到自己想要的目的
 楼主| 发表于 2021-11-20 15:15 | 显示全部楼层
fangmin723 发表于 2021-11-20 13:29
单独使用,你是怎么单独使用的???

几种方式  一种是写一个只含 一条(COMMAND  "MOVE") 的lisp 然后反复执行测试   没有问题。  另一种是在CAD里面像输入命令一样把这个语句输入进去执行  也是没有问题的    。  但是只要 放进整段里面一起执行就各种问题。  一会有用   一会没用 。
发表于 2021-11-20 15:35 | 显示全部楼层
本帖最后由 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用法我觉得没什么毛病。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号  
©2000-2020 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2021-12-2 09:05 , Processed in 0.491585 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表