乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 98|回复: 14

[编程交流] 用户在LIS内移动对象

[复制链接]

13

主题

126

帖子

114

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-6 11:59:51 | 显示全部楼层 |阅读模式
我正在修改Lee写的LISP,我想做的是遍历一个对象列表,让用户根据美学来移动每个对象。
 
具体来说,我有100个门标识图标,希望放大每个图标,决定是否需要移动图标,如果需要,请移动,然后转到下一个图标。
 
  1. (defun c:zmblk (/ file nl lst Minp Maxp pts elst BPNT DPNT)
  2. (vl-load-com)
  3. (if (setq file
  4.        (getfiled "Select Text File"
  5.          (if *load *load "") "txt" )
  6.     (progn
  7.      (setq *load file file (open file "r"))
  8.      
  9.      (while (setq nl (read-line file))
  10.        (princ nl)
  11.        (setq lst (cons (car (StrBrk nl 9)) lst)))
  12.      (close file)
  13.      (princ "\n<< Closed file >>")
  14.      (if (setq elst (vl-remove-if 'null
  15.                       (mapcar 'handent
  16.                         (mapcar
  17.                           (function
  18.                             (lambda (x)
  19.                               (substr x 2))) (reverse lst)))))
  20.        (foreach Obj (mapcar 'vlax-ename->vla-object elst)                     
  21.          (vla-getBoundingBox Obj 'Minp 'Maxp)
  22.          (setq pts (mapcar 'vlax-safearray->list (list Minp Maxp)))
  23.          (vla-ZoomCenter
  24.            (vlax-get-acad-object)
  25.              (vlax-3D-point
  26.                (polar (car pts)
  27.                       (apply 'angle pts)
  28.                       (/ (apply 'distance pts) 2.)))
  29.            400.)
  30. [color=Red]         (command "_MOVE"  Obj (SETQ BPNT (GETPOINT "\nPick base point: ")) (SETQ DPNT (GETPOINT "\nPick destination point: ")))
  31. [/color]            )))
  32.     (princ "\n<< No File Selected >>"))
  33.   (princ))
  34. (defun StrBrk (str chrc / pos lst)
  35. (while (setq pos (vl-string-position chrc str))
  36.    (setq lst (cons (substr str 1 pos) lst)
  37.          str (substr str (+ pos 2))))
  38. (reverse (cons str lst)))

 
我需要有关对象实际移动的帮助,李的代码已经放大了对象,所以我认为我应该能够使用该对象和move命令,选择基点和目标点,然后转到下一个对象。但很明显我做错了什么。
 
提前感谢,
格伦
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:06:52 | 显示全部楼层
完全未经测试,但应该给你的想法。
 
我还改进了代码的其他部分。。。不知道我第一次写这篇文章的时候在想什么。。。
 
  1. (defun c:zmblk (/ file nl lst Minp Maxp pts elst BPNT DPNT)
  2. (vl-load-com)
  3. (setq *acad (vlax-get-acad-object))
  4. (if (setq file (getfiled "Select Text File" (if *load *load "") "txt" )
  5.     (progn
  6.      (setq *load file file (open file "r"))
  7.      
  8.      (while (setq nl (read-line file))
  9.        (princ nl)
  10.        (setq lst (cons (car (StrBrk nl 9)) lst)))
  11.      (close file)      
  12.      (princ "\n<< Closed file >>")
  13.      
  14.      (if (setq elst (vl-remove-if 'null
  15.                       (mapcar 'handent
  16.                         (mapcar (function (lambda (x) (substr x 2))) (reverse lst)))))
  17.       
  18.        (foreach Obj (mapcar 'vlax-ename->vla-object elst)                     
  19.          (vla-getBoundingBox Obj 'Minp 'Maxp)
  20.          
  21.          (setq pts (mapcar 'vlax-safearray->list (list Minp Maxp)))
  22.          (vla-ZoomCenter *acad
  23.            (vlax-3D-point (polar (car pts) (apply 'angle pts) (/ (apply 'distance pts) 2.))) 400.)
  24.          (initget "Yes No")
  25.          (if (/= "No" (getkword "Move Object? <Yes> : "))
  26.            (if (and (setq bPnt (getpoint "\nPick Base point: "))
  27.                     (setq dPnt (getpoint bPnt "\nPick Destination: ")))
  28.              (vl-cmdf "_.move" (vlax-vla-object->ename obj) "" bPnt dPnt))))))
  29.          
  30.     (princ "\n<< No File Selected >>"))
  31.   (princ))
  32. (defun StrBrk (str chrc / pos lst)
  33. (while (setq pos (vl-string-position chrc str))
  34.    (setq lst (cons (substr str 1 pos) lst)
  35.          str (substr str (+ pos 2))))
  36. (reverse (cons str lst)))
回复

使用道具 举报

13

主题

126

帖子

114

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-6 12:09:03 | 显示全部楼层
当我因为LISP编辑器被锁定而关闭并重新启动AutoCAD时,Lee发布了一个解决我问题的方法。非常感谢。
 
我冒昧地注释掉了“你想移动它吗”的问题,发现如果你不想移动当前对象,只需点击回车键,就可以进入下一个对象。我还添加了撤销作为组码,这样我可以一次撤销所有动作。
 
更新代码:
  1. (defun c:zmblk (/ file nl lst Minp Maxp pts elst BPNT DPNT)
  2. (vl-load-com)
  3. (setq *acad (vlax-get-acad-object))
  4. (if (setq file (getfiled "Select Text File" (if *load *load "") "txt" )
  5.     (progn
  6.      (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  7.      (vla-startUndoMark doc)
  8.      (setq *load file file (open file "r"))
  9.      
  10.      (while (setq nl (read-line file))
  11.        (princ nl)
  12.        (setq lst (cons (car (StrBrk nl 9)) lst)))
  13.      (close file)      
  14.      (princ "\n<< Closed file >>")
  15.      
  16.      (if (setq elst (vl-remove-if 'null
  17.                       (mapcar 'handent
  18.                         (mapcar (function (lambda (x) (substr x 2))) (reverse lst)))))
  19.       
  20.        (foreach Obj (mapcar 'vlax-ename->vla-object elst)                     
  21.          (vla-getBoundingBox Obj 'Minp 'Maxp)
  22.          
  23.          (setq pts (mapcar 'vlax-safearray->list (list Minp Maxp)))
  24.          (vla-ZoomCenter *acad
  25.            (vlax-3D-point (polar (car pts) (apply 'angle pts) (/ (apply 'distance pts) 2.))) 400.)
  26. ;          (initget "Yes No")
  27. ;          (if (/= "No" (getkword "Move Object? <Yes> : "))
  28.            (if (and (setq bPnt (getpoint "\nPick Base point: "))
  29.                     (setq dPnt (getpoint bPnt "\nPick Destination: ")))
  30.              (vl-cmdf "_.move" (vlax-vla-object->ename obj) "" bPnt dPnt)))))    <- extra paren had to go due to removing the 'prompt to move' if function
  31.          
  32.     (princ "\n<< No File Selected >>"))
  33.   (vla-EndUndoMark doc)
  34.   (princ))
  35. (defun StrBrk (str chrc / pos lst)
  36. (while (setq pos (vl-string-position chrc str))
  37.    (setq lst (cons (substr str 1 pos) lst)
  38.          str (substr str (+ pos 2))))
  39. (reverse (cons str lst)))

 
 
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:14:29 | 显示全部楼层
我没有办法测试这个,但你不能用vla move吗?
 
 
  1. (defun c:zmblk (/ *error* StrBrk *ACAD BPNT DOC DPNT ELST FILE
  2.                                 LST MAXP MINP NL OFILE PTS UFLAG)
  3. (vl-load-com)
  4. [color=Red][b]  (defun *error* (msg)
  5.    (and uFlag (vla-EndUndoMark doc))
  6.    (and oFile (close oFile))
  7.    (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  8.        (princ (strcat "\n** Error: " msg " **")))
  9.    (princ))[/b][/color]
  10. (defun StrBrk (str chrc / pos lst)
  11.    (while (setq pos (vl-string-position chrc str))
  12.      (setq lst (cons (substr str 1 pos) lst)
  13.            str (substr str (+ pos 2))))
  14.    (reverse (cons str lst)))
  15. (if (setq file (getfiled "Select Text File" (if *load *load "") "txt" )
  16.    (progn
  17.      (setq doc   (vla-get-ActiveDocument (setq *acad (vlax-get-acad-object)))
  18.            [color=Red][b]uflag[/b][/color] (not (vla-startUndoMark doc)))
  19.      (setq *load file ofile (open file "r"))
  20.      
  21.      (while (setq nl (read-line ofile))
  22.        (princ nl)
  23.        (setq lst (cons (car (StrBrk nl 9)) lst)))
  24.      [color=Red][b](setq ofile[/b][/color] (close ofile))
  25.      
  26.      (if (setq elst (vl-remove-if 'null
  27.                       (mapcar 'handent
  28.                         (mapcar (function (lambda (x) (substr x 2))) (reverse lst)))))
  29.       
  30.        (foreach Obj (mapcar 'vlax-ename->vla-object elst)                     
  31.          (vla-getBoundingBox Obj 'Minp 'Maxp)
  32.          
  33.          (setq pts (mapcar 'vlax-safearray->list (list Minp Maxp)))
  34.          (vla-ZoomCenter *acad
  35.            (vlax-3D-point (polar (car pts) (apply 'angle pts) (/ (apply 'distance pts) 2.))) 400.)
  36.            (if (and (setq bPnt (getpoint "\nPick Base point: "))
  37.                     (setq dPnt (getpoint bPnt "\nPick Destination: ")))
  38.              (vl-cmdf "_.move" (vlax-vla-object->ename obj) "" bPnt dPnt))))
  39.      [b][color=Red](setq uflag[/color][/b] (vla-EndUndoMark doc)))
  40.    
  41. (princ "\n<< No File Selected >>"))
  42. (princ))
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:17:34 | 显示全部楼层
 
是的,我在那里有点像隧道视觉。。。。
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 12:23:45 | 显示全部楼层
我总是这样做。
前几天我写了一些类似于20-30行代码的东西。我一写完,就看了看,按CTRL+a和Backspace键,把它改写成3行。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:28:39 | 显示全部楼层
不过我喜欢你的方法。。厚脸皮的lambda函数
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 12:31:17 | 显示全部楼层
谢谢,只是尽量减少打字。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:36:26 | 显示全部楼层
 
幸运的是我们在Lisp程序。。。我看到了Arx公司生产的一系列产品。。。。
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 12:41:42 | 显示全部楼层
别开玩笑了。对于一些试图从Lisp跳到C的人来说,这有点令人畏惧。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-5 10:04 , Processed in 0.538806 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表